Skip to content

Commit 0a5f620

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 34becc0 commit 0a5f620

File tree

12 files changed

+185
-132
lines changed

12 files changed

+185
-132
lines changed

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -312,9 +312,9 @@ public Object getContents(Transfer transfer, int clipboards) {
312312
if (selection_data != 0) {
313313
TransferData tdata = new TransferData();
314314
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);
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;

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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.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: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -516,9 +516,9 @@ void dragGetData(long widget, long context, long selection_data, int info, int
516516

517517
TransferData transferData = new TransferData();
518518
transferData.type = target;
519-
transferData.pValue = data;
520-
transferData.length = length;
521-
transferData.format = format;
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.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: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -358,9 +358,9 @@ void drag_data_received ( long widget, long context, int x, int y, long selectio
358358
long type = GTK3.gtk_selection_data_get_data_type(selection_data);
359359
if (data != 0) {
360360
transferData.type = type;
361-
transferData.length = length;
362-
transferData.pValue = data;
363-
transferData.format = format;
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)) {

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ 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
}
@@ -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,10 +137,10 @@ 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);
143+
C.memmove(temp, transferData.gtk3().pValue, length);
144144
boolean gnomeList = transferData.type == GNOME_LIST_ID;
145145
int sepLength = gnomeList ? 1 : 2;
146146
long [] files = new long [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: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,14 +111,14 @@ public void javaToNative(Object object, TransferData transferData) {
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) {

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
*******************************************************************************/
1414
package org.eclipse.swt.dnd;
1515

16+
import org.eclipse.swt.dnd.TransferData.*;
1617
import org.eclipse.swt.internal.*;
1718
import org.eclipse.swt.internal.gtk.*;
1819

@@ -63,7 +64,7 @@ public static RTFTransfer getInstance () {
6364
*/
6465
@Override
6566
public void javaToNative (Object object, TransferData transferData){
66-
transferData.result = 0;
67+
transferData.gtk3().result = 0;
6768
if (!checkRTF(object) || !isSupportedType(transferData)) {
6869
DND.error(DND.ERROR_INVALID_DATA);
6970
}
@@ -72,10 +73,10 @@ public void javaToNative (Object object, TransferData transferData){
7273
long pValue = OS.g_malloc(buffer.length);
7374
if (pValue == 0) return;
7475
C.memmove(pValue, buffer, buffer.length);
75-
transferData.length = buffer.length - 1;
76-
transferData.format = 8;
77-
transferData.pValue = pValue;
78-
transferData.result = 1;
76+
transferData.gtk3().length = buffer.length - 1;
77+
transferData.gtk3().format = 8;
78+
transferData.gtk3().pValue = pValue;
79+
transferData.gtk3().result = 1;
7980
}
8081

8182
/**
@@ -90,11 +91,11 @@ public void javaToNative (Object object, TransferData transferData){
9091
*/
9192
@Override
9293
public Object nativeToJava(TransferData transferData){
93-
if ( !isSupportedType(transferData) || transferData.pValue == 0 ) return null;
94-
int size = transferData.format * transferData.length / 8;
94+
if ( !isSupportedType(transferData) || transferData.gtk3().pValue == 0 ) return null;
95+
int size = transferData.gtk3().format * transferData.gtk3().length / 8;
9596
if (size == 0) return null;
9697
byte[] buffer = new byte[size];
97-
C.memmove(buffer, transferData.pValue, size);
98+
C.memmove(buffer, transferData.gtk3().pValue, size);
9899
char [] chars = Converter.mbcsToWcs (buffer);
99100
String string = new String (chars);
100101
int end = string.indexOf('\0');

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

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
*******************************************************************************/
1414
package org.eclipse.swt.dnd;
1515

16+
import org.eclipse.swt.dnd.TransferData.*;
1617
import org.eclipse.swt.internal.*;
1718
import org.eclipse.swt.internal.gtk.*;
1819

@@ -71,7 +72,7 @@ public static TextTransfer getInstance () {
7172
*/
7273
@Override
7374
public void javaToNative (Object object, TransferData transferData) {
74-
transferData.result = 0;
75+
transferData.gtk3().result = 0;
7576
if (!checkText(object) || !isSupportedType(transferData)) {
7677
DND.error(DND.ERROR_INVALID_DATA);
7778
}
@@ -85,28 +86,28 @@ public void javaToNative (Object object, TransferData transferData) {
8586
boolean result = GDK.gdk_x11_display_utf8_to_compound_text (GDK.gdk_display_get_default(), utf8, encoding, format, ctext, length);
8687
if (!result) return;
8788
transferData.type = encoding[0];
88-
transferData.format = format[0];
89-
transferData.length = length[0];
90-
transferData.pValue = ctext[0];
91-
transferData.result = 1;
89+
transferData.gtk3().format = format[0];
90+
transferData.gtk3().length = length[0];
91+
transferData.gtk3().pValue = ctext[0];
92+
transferData.gtk3().result = 1;
9293
}
9394
if (transferData.type == UTF8_STRING_ID || transferData.type == TEXT_PLAIN_UTF8_ID) {
9495
long pValue = OS.g_malloc(utf8.length);
9596
if (pValue == 0) return;
9697
C.memmove(pValue, utf8, utf8.length);
97-
transferData.format = 8;
98-
transferData.length = utf8.length - 1;
99-
transferData.pValue = pValue;
100-
transferData.result = 1;
98+
transferData.gtk3().format = 8;
99+
transferData.gtk3().length = utf8.length - 1;
100+
transferData.gtk3().pValue = pValue;
101+
transferData.gtk3().result = 1;
101102
}
102103
if (transferData.type == STRING_ID) {
103104
long string_target = GDK.gdk_utf8_to_string_target(utf8);
104105
if (string_target == 0) return;
105106
transferData.type = STRING_ID;
106-
transferData.format = 8;
107-
transferData.length = C.strlen(string_target);
108-
transferData.pValue = string_target;
109-
transferData.result = 1;
107+
transferData.gtk3().format = 8;
108+
transferData.gtk3().length = C.strlen(string_target);
109+
transferData.gtk3().pValue = string_target;
110+
transferData.gtk3().result = 1;
110111
}
111112
}
112113

@@ -122,9 +123,10 @@ public void javaToNative (Object object, TransferData transferData) {
122123
*/
123124
@Override
124125
public Object nativeToJava(TransferData transferData){
125-
if (!isSupportedType(transferData) || transferData.pValue == 0) return null;
126+
127+
if (!isSupportedType(transferData) || transferData.gtk3().pValue == 0) return null;
126128
long [] list = new long [1];
127-
int count = GDK.gdk_text_property_to_utf8_list_for_display(GDK.gdk_display_get_default(), transferData.type, transferData.format, transferData.pValue, transferData.length, list);
129+
int count = GDK.gdk_text_property_to_utf8_list_for_display(GDK.gdk_display_get_default(), transferData.type, transferData.gtk3().format, transferData.gtk3().pValue, transferData.gtk3().length, list);
128130
if (count == 0) return null;
129131
long [] ptr = new long [1];
130132
C.memmove(ptr, list[0], C.PTR_SIZEOF);

0 commit comments

Comments
 (0)