Skip to content

Commit 6b16cfb

Browse files
committed
Prepare TransferData for GTK4 support
The fields in TransferData are platform specific - but GTK3 and GTK4 share the same class. The fields needed for GTK4 are quite different than for GTK3. Therefore this change refactors TransferData's internals to make it ready for GTK4 better. This is achieved by splitting out all existing fields in a new GTK3 specific subtype, and including a starting point for GTK4 fields. Some type checking is done to make sure that the correct object is used on GTK3 vs GTK4 respectively and this is done via the newly introduced gtk3() and gtk4() methods. For now the GTK4 has no fields, but it will eventually have the internal fields needed for GTK4 serializing and deserializing of objects from the native side. Part of #2126 Split out of #2538
1 parent 43f54cc commit 6b16cfb

File tree

14 files changed

+231
-179
lines changed

14 files changed

+231
-179
lines changed

bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/common/org/eclipse/swt/dnd/DragSourceEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ public String toString() {
138138
String string = super.toString ();
139139
return string.substring (0, string.length() - 1) // remove trailing '}'
140140
+ " operation=" + detail
141-
+ " type=" + (dataType != null ? dataType.type : 0)
141+
+ " type=" + (dataType != null ? dataType.gtk3().type : 0)
142142
+ " doit=" + doit
143143
+ "}";
144144
}

bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/common/org/eclipse/swt/dnd/DropTargetEvent.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,11 @@ public String toString() {
139139
sb.append(" dataTypes={ ");
140140
if (dataTypes != null) {
141141
for (TransferData dataType : dataTypes) {
142-
sb.append(dataType.type); sb.append(' ');
142+
sb.append(dataType.gtk3().type); sb.append(' ');
143143
}
144144
}
145145
sb.append('}');
146-
sb.append(" currentDataType="); sb.append(currentDataType != null ? currentDataType.type : '0');
146+
sb.append(" currentDataType="); sb.append(currentDataType != null ? currentDataType.gtk3().type : '0');
147147
sb.append('}');
148148
return sb.toString();
149149
}

bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/ByteArrayTransfer.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ public TransferData[] getSupportedTypes() {
129129
TransferData[] data = new TransferData[types.length];
130130
for (int i = 0; i < types.length; i++) {
131131
data[i] = new TransferData();
132-
data[i].type = types[i];
132+
data[i].gtk3().type = types[i];
133133
}
134134
return data;
135135
}
@@ -139,7 +139,7 @@ public boolean isSupportedType(TransferData transferData){
139139
if (transferData == null) return false;
140140
int[] types = getTypeIds();
141141
for (int i = 0; i < types.length; i++) {
142-
if (transferData.type == types[i]) return true;
142+
if (transferData.gtk3().type == types[i]) return true;
143143
}
144144
return false;
145145
}
@@ -156,7 +156,7 @@ public boolean isSupportedType(TransferData transferData){
156156
*/
157157
@Override
158158
protected void javaToNative (Object object, TransferData transferData) {
159-
transferData.result = 0;
159+
transferData.gtk3().result = 0;
160160
if (!checkByteArray(object) || !isSupportedType(transferData)) {
161161
DND.error(DND.ERROR_INVALID_DATA);
162162
}
@@ -165,10 +165,10 @@ protected void javaToNative (Object object, TransferData transferData) {
165165
long pValue = OS.g_malloc(buffer.length);
166166
if (pValue == 0) return;
167167
C.memmove(pValue, buffer, buffer.length);
168-
transferData.length = buffer.length;
169-
transferData.format = 8;
170-
transferData.pValue = pValue;
171-
transferData.result = 1;
168+
transferData.gtk3().length = buffer.length;
169+
transferData.gtk3().format = 8;
170+
transferData.gtk3().pValue = pValue;
171+
transferData.gtk3().result = 1;
172172
}
173173

174174
/**
@@ -183,11 +183,11 @@ protected void javaToNative (Object object, TransferData transferData) {
183183
*/
184184
@Override
185185
protected Object nativeToJava(TransferData transferData) {
186-
if ( !isSupportedType(transferData) || transferData.pValue == 0) return null;
187-
int size = transferData.format * transferData.length / 8;
186+
if ( !isSupportedType(transferData) || transferData.gtk3().pValue == 0) return null;
187+
int size = transferData.gtk3().format * transferData.gtk3().length / 8;
188188
if (size == 0) return null;
189189
byte[] buffer = new byte[size];
190-
C.memmove(buffer, transferData.pValue, size);
190+
C.memmove(buffer, transferData.gtk3().pValue, size);
191191
return buffer;
192192
}
193193

bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/Clipboard.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -311,10 +311,10 @@ public Object getContents(Transfer transfer, int clipboards) {
311311
}
312312
if (selection_data != 0) {
313313
TransferData tdata = new TransferData();
314-
tdata.type = GTK3.gtk_selection_data_get_data_type(selection_data);
315-
tdata.pValue = GTK3.gtk_selection_data_get_data(selection_data);
316-
tdata.length = GTK3.gtk_selection_data_get_length(selection_data);
317-
tdata.format = GTK3.gtk_selection_data_get_format(selection_data);
314+
tdata.gtk3().type = GTK3.gtk_selection_data_get_data_type(selection_data);
315+
tdata.gtk3().pValue = GTK3.gtk_selection_data_get_data(selection_data);
316+
tdata.gtk3().length = GTK3.gtk_selection_data_get_length(selection_data);
317+
tdata.gtk3().format = GTK3.gtk_selection_data_get_format(selection_data);
318318
result = transfer.nativeToJava(tdata);
319319
GTK3.gtk_selection_data_free(selection_data);
320320
selection_data = 0;
@@ -582,7 +582,7 @@ public TransferData[] getAvailableTypes(int clipboards) {
582582
result = new TransferData[types.length];
583583
for (int i = 0; i < types.length; i++) {
584584
result[i] = new TransferData();
585-
result[i].type = types[i];
585+
result[i].gtk3().type = types[i];
586586
}
587587
}
588588
if ((clipboards & DND.SELECTION_CLIPBOARD) != 0) {
@@ -598,7 +598,7 @@ public TransferData[] getAvailableTypes(int clipboards) {
598598
}
599599
for (int i = 0; i < types.length; i++) {
600600
result[offset+i] = new TransferData();
601-
result[offset+i].type = types[i];
601+
result[offset+i].gtk3().type = types[i];
602602
}
603603
}
604604
return result == null ? new TransferData[0] : result;

bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/ClipboardProxy.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ long getFunc(long clipboard, long selection_data, long info, long user_data_or_o
127127
if (selection_data == 0) return 0;
128128
long target = GTK3.gtk_selection_data_get_target(selection_data);
129129
TransferData tdata = new TransferData();
130-
tdata.type = target;
130+
tdata.gtk3().type = target;
131131
Transfer[] types = (clipboard == Clipboard.GTKCLIPBOARD) ? clipboardDataTypes : primaryClipboardDataTypes;
132132
int index = -1;
133133
for (int i = 0; i < types.length; i++) {
@@ -139,11 +139,11 @@ long getFunc(long clipboard, long selection_data, long info, long user_data_or_o
139139
if (index == -1) return 0;
140140
Object[] data = (clipboard == Clipboard.GTKCLIPBOARD) ? clipboardData : primaryClipboardData;
141141
types[index].javaToNative(data[index], tdata);
142-
if (tdata.format < 8 || tdata.format % 8 != 0) {
142+
if (tdata.gtk3().format < 8 || tdata.gtk3().format % 8 != 0) {
143143
return 0;
144144
}
145-
GTK3.gtk_selection_data_set(selection_data, tdata.type, tdata.format, tdata.pValue, tdata.length);
146-
OS.g_free(tdata.pValue);
145+
GTK3.gtk_selection_data_set(selection_data, tdata.gtk3().type, tdata.gtk3().format, tdata.gtk3().pValue, tdata.gtk3().length);
146+
OS.g_free(tdata.gtk3().pValue);
147147
return 1;
148148
}
149149

bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/DragSource.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -515,10 +515,10 @@ void dragGetData(long widget, long context, long selection_data, int info, int
515515
if (target == 0) return;
516516

517517
TransferData transferData = new TransferData();
518-
transferData.type = target;
519-
transferData.pValue = data;
520-
transferData.length = length;
521-
transferData.format = format;
518+
transferData.gtk3().type = target;
519+
transferData.gtk3().pValue = data;
520+
transferData.gtk3().length = length;
521+
transferData.gtk3().format = format;
522522

523523
DNDEvent event = new DNDEvent();
524524
event.widget = this;
@@ -536,9 +536,9 @@ void dragGetData(long widget, long context, long selection_data, int info, int
536536
}
537537
if (transfer == null) return;
538538
transfer.javaToNative(event.data, transferData);
539-
if (transferData.result != 1) return;
540-
GTK3.gtk_selection_data_set(selection_data, transferData.type, transferData.format, transferData.pValue, transferData.length);
541-
OS.g_free(transferData.pValue);
539+
if (transferData.gtk3().result != 1) return;
540+
GTK3.gtk_selection_data_set(selection_data, transferData.gtk3().type, transferData.gtk3().format, transferData.gtk3().pValue, transferData.gtk3().length);
541+
OS.g_free(transferData.gtk3().pValue);
542542
return;
543543
}
544544

bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/DropTarget.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ public DropTarget(Control control, int style) {
229229
notifyListeners(DND.DragOver, event);
230230
if (event.dataType != null) {
231231
for (int i = 0; i < allowedTypes.length; i++) {
232-
if (allowedTypes[i].type == event.dataType.type) {
232+
if (allowedTypes[i].gtk3().type == event.dataType.gtk3().type) {
233233
selectedDataType = event.dataType;
234234
break;
235235
}
@@ -357,10 +357,10 @@ void drag_data_received ( long widget, long context, int x, int y, long selectio
357357
long data = GTK3.gtk_selection_data_get_data(selection_data);
358358
long type = GTK3.gtk_selection_data_get_data_type(selection_data);
359359
if (data != 0) {
360-
transferData.type = type;
361-
transferData.length = length;
362-
transferData.pValue = data;
363-
transferData.format = format;
360+
transferData.gtk3().type = type;
361+
transferData.gtk3().length = length;
362+
transferData.gtk3().pValue = data;
363+
transferData.gtk3().format = format;
364364
for (int i = 0; i < transferAgents.length; i++) {
365365
Transfer transfer = transferAgents[i];
366366
if (transfer != null && transfer.isSupportedType(transferData)) {
@@ -408,7 +408,7 @@ boolean drag_drop(long widget, long context, int x, int y, int time) {
408408
notifyListeners(DND.DropAccept,event);
409409
if (event.dataType != null) {
410410
for (int i = 0; i < allowedDataTypes.length; i++) {
411-
if (allowedDataTypes[i].type == event.dataType.type) {
411+
if (allowedDataTypes[i].gtk3().type == event.dataType.gtk3().type) {
412412
selectedDataType = allowedDataTypes[i];
413413
break;
414414
}
@@ -422,7 +422,7 @@ boolean drag_drop(long widget, long context, int x, int y, int time) {
422422
return false;
423423
}
424424
// ask drag source for dropped data
425-
GTK3.gtk_drag_get_data(widget, context, selectedDataType.type, time);
425+
GTK3.gtk_drag_get_data(widget, context, selectedDataType.gtk3().type, time);
426426
return true;
427427
}
428428

@@ -484,7 +484,7 @@ boolean drag_motion ( long widget, long context, int x, int y, int time){
484484
}
485485
if (event.dataType != null) {
486486
for (int i = 0; i < allowedDataTypes.length; i++) {
487-
if (allowedDataTypes[i].type == event.dataType.type) {
487+
if (allowedDataTypes[i].gtk3().type == event.dataType.gtk3().type) {
488488
selectedDataType = allowedDataTypes[i];
489489
break;
490490
}
@@ -771,7 +771,7 @@ boolean setEventData(long context, int x, int y, int time, DNDEvent event) {
771771
while (targets != 0) {
772772
long pData = OS.g_list_data(targets);
773773
TransferData data = new TransferData();
774-
data.type = pData;
774+
data.gtk3().type = pData;
775775
for (int j = 0; j < transferAgents.length; j++) {
776776
Transfer transfer = transferAgents[j];
777777
if (transfer != null && transfer.isSupportedType(data)) {

bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/FileTransfer.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,11 @@ public static FileTransfer getInstance () {
6969
*/
7070
@Override
7171
public void javaToNative(Object object, TransferData transferData) {
72-
transferData.result = 0;
72+
transferData.gtk3().result = 0;
7373
if (!checkFile(object) || !isSupportedType(transferData)) {
7474
DND.error(DND.ERROR_INVALID_DATA);
7575
}
76-
boolean gnomeList = transferData.type == GNOME_LIST_ID;
76+
boolean gnomeList = transferData.gtk3().type == GNOME_LIST_ID;
7777
byte[] buffer, separator;
7878
if (gnomeList) {
7979
buffer = new byte[] {'c','o','p','y'};
@@ -119,10 +119,10 @@ public void javaToNative(Object object, TransferData transferData) {
119119
long ptr = OS.g_malloc(buffer.length+1);
120120
C.memset(ptr, '\0', buffer.length+1);
121121
C.memmove(ptr, buffer, buffer.length);
122-
transferData.pValue = ptr;
123-
transferData.length = buffer.length;
124-
transferData.format = 8;
125-
transferData.result = 1;
122+
transferData.gtk3().pValue = ptr;
123+
transferData.gtk3().length = buffer.length;
124+
transferData.gtk3().format = 8;
125+
transferData.gtk3().result = 1;
126126
}
127127
/**
128128
* This implementation of <code>nativeToJava</code> converts a platform specific
@@ -137,11 +137,11 @@ public void javaToNative(Object object, TransferData transferData) {
137137
*/
138138
@Override
139139
public Object nativeToJava(TransferData transferData) {
140-
if ( !isSupportedType(transferData) || transferData.pValue == 0 || transferData.length <= 0 ) return null;
141-
int length = transferData.length;
140+
if ( !isSupportedType(transferData) || transferData.gtk3().pValue == 0 || transferData.gtk3().length <= 0 ) return null;
141+
int length = transferData.gtk3().length;
142142
byte[] temp = new byte[length];
143-
C.memmove(temp, transferData.pValue, length);
144-
boolean gnomeList = transferData.type == GNOME_LIST_ID;
143+
C.memmove(temp, transferData.gtk3().pValue, length);
144+
boolean gnomeList = transferData.gtk3().type == GNOME_LIST_ID;
145145
int sepLength = gnomeList ? 1 : 2;
146146
long [] files = new long [0];
147147
int offset = 0;

bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/HTMLTransfer.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public static HTMLTransfer getInstance () {
6161
*/
6262
@Override
6363
public void javaToNative (Object object, TransferData transferData){
64-
transferData.result = 0;
64+
transferData.gtk3().result = 0;
6565
if (!checkHTML(object) || !isSupportedType(transferData)) {
6666
DND.error(DND.ERROR_INVALID_DATA);
6767
}
@@ -71,10 +71,10 @@ public void javaToNative (Object object, TransferData transferData){
7171
long pValue = OS.g_malloc(byteCount);
7272
if (pValue == 0) return;
7373
C.memmove(pValue, utf8, byteCount);
74-
transferData.length = byteCount;
75-
transferData.format = 8;
76-
transferData.pValue = pValue;
77-
transferData.result = 1;
74+
transferData.gtk3().length = byteCount;
75+
transferData.gtk3().format = 8;
76+
transferData.gtk3().pValue = pValue;
77+
transferData.gtk3().result = 1;
7878
}
7979

8080
/**
@@ -89,21 +89,21 @@ public void javaToNative (Object object, TransferData transferData){
8989
*/
9090
@Override
9191
public Object nativeToJava(TransferData transferData){
92-
if ( !isSupportedType(transferData) || transferData.pValue == 0 ) return null;
92+
if ( !isSupportedType(transferData) || transferData.gtk3().pValue == 0 ) return null;
9393
/* Ensure byteCount is a multiple of 2 bytes */
94-
int size = (transferData.format * transferData.length / 8) / 2 * 2;
94+
int size = (transferData.gtk3().format * transferData.gtk3().length / 8) / 2 * 2;
9595
if (size <= 0) return null;
9696
char[] bom = new char[1]; // look for a Byte Order Mark
97-
if (size > 1) C.memmove (bom, transferData.pValue, 2);
97+
if (size > 1) C.memmove (bom, transferData.gtk3().pValue, 2);
9898
String string;
9999
if (bom[0] == '\ufeff' || bom[0] == '\ufffe') {
100100
// utf16
101101
char[] chars = new char [size/2];
102-
C.memmove (chars, transferData.pValue, size);
102+
C.memmove (chars, transferData.gtk3().pValue, size);
103103
string = new String (chars);
104104
} else {
105105
byte[] utf8 = new byte[size];
106-
C.memmove(utf8, transferData.pValue, size);
106+
C.memmove(utf8, transferData.gtk3().pValue, size);
107107
// convert utf8 byte array to a unicode string
108108
char [] unicode = org.eclipse.swt.internal.Converter.mbcsToWcs (utf8);
109109
string = new String (unicode);

bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/ImageTransfer.java

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -94,31 +94,31 @@ public void javaToNative(Object object, TransferData transferData) {
9494
long pixbuf = ImageList.createPixbuf(image);
9595
if (pixbuf != 0) {
9696
String typeStr = "";
97-
if (transferData.type == JPEG_ID) typeStr = "jpeg";
98-
else if (transferData.type == PNG_ID) typeStr = "png";
99-
else if (transferData.type == BMP_ID) typeStr = "bmp";
100-
else if (transferData.type == EPS_ID) typeStr = "eps";
101-
else if (transferData.type == PCX_ID) typeStr = "pcx";
102-
else if (transferData.type == PPM_ID) typeStr = "ppm";
103-
else if (transferData.type == RGB_ID) typeStr = "rgb";
104-
else if (transferData.type == TGA_ID) typeStr = "tga";
105-
else if (transferData.type == XBM_ID) typeStr = "xbm";
106-
else if (transferData.type == XPM_ID) typeStr = "xpm";
107-
else if (transferData.type == XV_ID) typeStr = "xv";
97+
if (transferData.gtk3().type == JPEG_ID) typeStr = "jpeg";
98+
else if (transferData.gtk3().type == PNG_ID) typeStr = "png";
99+
else if (transferData.gtk3().type == BMP_ID) typeStr = "bmp";
100+
else if (transferData.gtk3().type == EPS_ID) typeStr = "eps";
101+
else if (transferData.gtk3().type == PCX_ID) typeStr = "pcx";
102+
else if (transferData.gtk3().type == PPM_ID) typeStr = "ppm";
103+
else if (transferData.gtk3().type == RGB_ID) typeStr = "rgb";
104+
else if (transferData.gtk3().type == TGA_ID) typeStr = "tga";
105+
else if (transferData.gtk3().type == XBM_ID) typeStr = "xbm";
106+
else if (transferData.gtk3().type == XPM_ID) typeStr = "xpm";
107+
else if (transferData.gtk3().type == XV_ID) typeStr = "xv";
108108
byte[] type = Converter.wcsToMbcs(typeStr, true);
109109
long [] buffer = new long [1];
110110
long [] len = new long [1];
111111
if (type == null) return;
112112
GDK.gdk_pixbuf_save_to_bufferv(pixbuf, buffer, len, type, null, null, null);
113113
OS.g_object_unref(pixbuf);
114-
transferData.pValue = buffer[0];
115-
transferData.length = (int)(len[0] + 3) / 4 * 4;
116-
transferData.result = 1;
114+
transferData.gtk3().pValue = buffer[0];
115+
transferData.gtk3().length = (int)(len[0] + 3) / 4 * 4;
116+
transferData.gtk3().result = 1;
117117
// The following value has been changed from 32 to 8 as a simple fix for #146
118118
// See https://www.cc.gatech.edu/data_files/public/doc/gtk/tutorial/gtk_tut-16.html where it states:
119119
// "The format field is actually important here - the X server uses it to figure out whether the data
120120
// needs to be byte-swapped or not. Usually it will be 8 - i.e. a character - or 32 - i.e. a. integer."
121-
transferData.format = 8;
121+
transferData.gtk3().format = 8;
122122
}
123123
image.dispose();
124124
}
@@ -136,10 +136,10 @@ public void javaToNative(Object object, TransferData transferData) {
136136
@Override
137137
public Object nativeToJava(TransferData transferData) {
138138
ImageData imgData = null;
139-
if (transferData.length > 0) {
139+
if (transferData.gtk3().length > 0) {
140140
long loader = GDK.gdk_pixbuf_loader_new();
141141
try {
142-
GDK.gdk_pixbuf_loader_write(loader, transferData.pValue, transferData.length, null);
142+
GDK.gdk_pixbuf_loader_write(loader, transferData.gtk3().pValue, transferData.gtk3().length, null);
143143
GDK.gdk_pixbuf_loader_close(loader, null);
144144
long pixbuf = GDK.gdk_pixbuf_loader_get_pixbuf(loader);
145145
if (pixbuf != 0) {

0 commit comments

Comments
 (0)