15
15
16
16
17
17
import org .eclipse .swt .*;
18
- import org .eclipse .swt .graphics .*;
19
18
import org .eclipse .swt .internal .*;
20
19
import org .eclipse .swt .internal .gtk .*;
21
20
import org .eclipse .swt .internal .gtk3 .*;
@@ -39,15 +38,24 @@ public class Clipboard {
39
38
40
39
static long GTKCLIPBOARD ;
41
40
static long GTKPRIMARYCLIPBOARD ;
41
+ /**
42
+ * GTK3 only
43
+ */
42
44
private static long TARGET ;
43
45
44
46
static {
45
- GTKCLIPBOARD = GTK .GTK4 ? GDK .gdk_display_get_clipboard (GDK .gdk_display_get_default ()) : GTK3 .gtk_clipboard_get (GDK .GDK_NONE );
46
- byte [] buffer = Converter .wcsToMbcs ("PRIMARY" , true );
47
- long primary = GTK .GTK4 ? 0 : GDK .gdk_atom_intern (buffer , false );
48
- GTKPRIMARYCLIPBOARD = GTK .GTK4 ? GDK .gdk_display_get_primary_clipboard (GDK .gdk_display_get_default ()) : GTK3 .gtk_clipboard_get (primary );
49
- buffer = Converter .wcsToMbcs ("TARGETS" , true );
50
- TARGET = GTK .GTK4 ? 0 : GDK .gdk_atom_intern (buffer , false );
47
+ if (GTK .GTK4 ) {
48
+ GTKCLIPBOARD = GDK .gdk_display_get_clipboard (GDK .gdk_display_get_default ());
49
+ GTKPRIMARYCLIPBOARD = GDK .gdk_display_get_primary_clipboard (GDK .gdk_display_get_default ());
50
+ TARGET = 0 ;
51
+ } else {
52
+ GTKCLIPBOARD = GTK3 .gtk_clipboard_get (GDK .GDK_NONE );
53
+ byte [] buffer = Converter .wcsToMbcs ("PRIMARY" , true );
54
+ long primary = GDK .gdk_atom_intern (buffer , false );
55
+ GTKPRIMARYCLIPBOARD = GTK3 .gtk_clipboard_get (primary );
56
+ buffer = Converter .wcsToMbcs ("TARGETS" , true );
57
+ TARGET = GDK .gdk_atom_intern (buffer , false );
58
+ }
51
59
}
52
60
53
61
/**
@@ -188,8 +196,13 @@ public void clearContents() {
188
196
*/
189
197
public void clearContents (int clipboards ) {
190
198
checkWidget ();
191
- ClipboardProxy proxy = ClipboardProxy ._getInstance (display );
192
- proxy .clear (this , clipboards );
199
+ if (GTK .GTK4 ) {
200
+ ClipboardProxyGTK4 proxy = ClipboardProxyGTK4 ._getInstance (display );
201
+ proxy .clear (this , clipboards );
202
+ } else {
203
+ ClipboardProxy proxy = ClipboardProxy ._getInstance (display );
204
+ proxy .clear (this , clipboards );
205
+ }
193
206
}
194
207
195
208
/**
@@ -290,14 +303,12 @@ public Object getContents(Transfer transfer) {
290
303
* @since 3.1
291
304
*/
292
305
public Object getContents (Transfer transfer , int clipboards ) {
293
- checkWidget ();
294
- if (transfer == null ) DND .error (SWT .ERROR_NULL_ARGUMENT );
295
-
296
- if (GTK .GTK4 ) {
297
- Object result = getContents_gtk4 (transfer , clipboards );
298
- return result ;
306
+ if (GTK .GTK4 ) {
307
+ return getContents_gtk4 (transfer , clipboards );
299
308
}
300
309
310
+ checkWidget ();
311
+ if (transfer == null ) DND .error (SWT .ERROR_NULL_ARGUMENT );
301
312
long selection_data = 0 ;
302
313
int [] typeIds = transfer .getTypeIds ();
303
314
boolean textTransfer = transfer .getTypeNames ()[0 ].equals ("UTF8_STRING" );
@@ -327,65 +338,11 @@ public Object getContents(Transfer transfer, int clipboards) {
327
338
}
328
339
329
340
private Object getContents_gtk4 (Transfer transfer , int clipboards ) {
341
+ checkWidget ();
342
+ if (transfer == null ) DND .error (SWT .ERROR_NULL_ARGUMENT );
330
343
331
- long contents = GTK4 .gdk_clipboard_get_content (Clipboard .GTKCLIPBOARD );
332
- if (contents == 0 ) return null ;
333
- long value = OS .g_malloc (OS .GValue_sizeof ());
334
- C .memset (value , 0 , OS .GValue_sizeof ());
335
-
336
- //Pasting of text (TextTransfer/RTFTransfer)
337
- if (transfer .getTypeNames ()[0 ].equals ("text/plain" ) || transfer .getTypeNames ()[0 ].equals ("text/rtf" )) {
338
- OS .g_value_init (value , OS .G_TYPE_STRING ());
339
- if (!GTK4 .gdk_content_provider_get_value (contents , value , null )) return null ;
340
- long cStr = OS .g_value_get_string (value );
341
- long [] items_written = new long [1 ];
342
- long utf16Ptr = OS .g_utf8_to_utf16 (cStr , -1 , null , items_written , null );
343
- OS .g_free (cStr );
344
- if (utf16Ptr == 0 ) return null ;
345
- int length = (int )items_written [0 ];
346
- char [] buffer = new char [length ];
347
- C .memmove (buffer , utf16Ptr , length * 2 );
348
- OS .g_free (utf16Ptr );
349
- String str = new String (buffer );
350
- if (transfer .getTypeNames ()[0 ].equals ("text/rtf" ) && !str .contains ("{\\ rtf1" )) {
351
- return null ;
352
- }
353
- if (transfer .getTypeNames ()[0 ].equals ("text/plain" ) && str .contains ("{\\ rtf1" )){
354
- return null ;
355
- }
356
- return str ;
357
- }
358
- //Pasting of Image
359
- if (transfer .getTypeIds ()[0 ] == (int )GDK .GDK_TYPE_PIXBUF ()) {
360
- ImageData imgData = null ;
361
- OS .g_value_init (value , GDK .GDK_TYPE_PIXBUF ());
362
- if (!GTK4 .gdk_content_provider_get_value (contents , value , null )) return null ;
363
- long pixbufObj = OS .g_value_get_object (value );
364
- if (pixbufObj != 0 ) {
365
- Image img = Image .gtk_new_from_pixbuf (Display .getCurrent (), SWT .BITMAP , pixbufObj );
366
- imgData = img .getImageData ();
367
- img .dispose ();
368
- }
369
- return imgData ;
370
- }
371
- //Pasting of HTML
372
- if (transfer .getTypeNames ()[0 ].equals ("text/html" )) {
373
- OS .g_value_init (value , OS .G_TYPE_STRING ());
374
- if (!GTK4 .gdk_content_provider_get_value (contents , value , null )) return null ;
375
- long cStr = OS .g_value_get_string (value );
376
- long [] items_written = new long [1 ];
377
- long utf16Ptr = OS .g_utf8_to_utf16 (cStr , -1 , null , items_written , null );
378
- OS .g_free (cStr );
379
- if (utf16Ptr == 0 ) return null ;
380
- int length = (int )items_written [0 ];
381
- char [] buffer = new char [length ];
382
- C .memmove (buffer , utf16Ptr , length * 2 );
383
- OS .g_free (utf16Ptr );
384
- String str = new String (buffer );
385
- return str ;
386
- }
387
- //TODO: [GTK4] Other cases
388
- return null ;
344
+ ClipboardProxyGTK4 proxy = ClipboardProxyGTK4 ._getInstance (display );
345
+ return proxy .getData (this , transfer , clipboards );
389
346
}
390
347
391
348
/**
@@ -525,9 +482,16 @@ public void setContents(Object[] data, Transfer[] dataTypes, int clipboards) {
525
482
DND .error (SWT .ERROR_INVALID_ARGUMENT );
526
483
}
527
484
}
528
- ClipboardProxy proxy = ClipboardProxy ._getInstance (display );
529
- if (!proxy .setData (this , data , dataTypes , clipboards )) {
530
- DND .error (DND .ERROR_CANNOT_SET_CLIPBOARD );
485
+ if (GTK .GTK4 ) {
486
+ ClipboardProxyGTK4 proxy = ClipboardProxyGTK4 ._getInstance (display );
487
+ if (!proxy .setData (this , data , dataTypes , clipboards )) {
488
+ DND .error (DND .ERROR_CANNOT_SET_CLIPBOARD );
489
+ }
490
+ } else {
491
+ ClipboardProxy proxy = ClipboardProxy ._getInstance (display );
492
+ if (!proxy .setData (this , data , dataTypes , clipboards )) {
493
+ DND .error (DND .ERROR_CANNOT_SET_CLIPBOARD );
494
+ }
531
495
}
532
496
}
533
497
@@ -623,8 +587,10 @@ public TransferData[] getAvailableTypes(int clipboards) {
623
587
public String [] getAvailableTypeNames () {
624
588
checkWidget ();
625
589
if (GTK .GTK4 ) {
590
+ // TODO make sure this code works with new GTK4 impl
626
591
long formatsCStr = GTK4 .gdk_content_formats_to_string (GTK4 .gdk_clipboard_get_formats (Clipboard .GTKCLIPBOARD ));
627
592
String formatsStr = Converter .cCharPtrToJavaString (formatsCStr , true );
593
+ System .out .println (formatsStr );
628
594
String [] types = formatsStr .split (" " );
629
595
return types ;
630
596
}
@@ -673,6 +639,7 @@ private int[] getAvailableClipboardTypes () {
673
639
return gtk3_getAvailableTypes (GTKCLIPBOARD );
674
640
}
675
641
642
+ // TODO make sure this code works with new GTK4 impl
676
643
private int [] gtk4_getAvailableTypes (long clipboard ) {
677
644
long formats = GTK4 .gdk_clipboard_get_formats (clipboard );
678
645
long [] n_gtypes = new long [1 ];
@@ -723,4 +690,6 @@ long gtk_clipboard_wait_for_contents(long clipboard, long target) {
723
690
}
724
691
return selection_data ;
725
692
}
693
+
694
+
726
695
}
0 commit comments