Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[GTK4] Initial clipboard port fixes + TextTransfer fix #35

Merged
merged 2 commits into from
Apr 20, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.eclipse.swt.internal.*;
import org.eclipse.swt.internal.gtk.*;
import org.eclipse.swt.internal.gtk3.*;
import org.eclipse.swt.internal.gtk4.*;
import org.eclipse.swt.widgets.*;

/**
Expand All @@ -42,10 +43,10 @@ public class Clipboard {
static {
GTKCLIPBOARD = GTK.GTK4 ? GDK.gdk_display_get_clipboard(GDK.gdk_display_get_default()) : GTK3.gtk_clipboard_get (GDK.GDK_NONE);
byte[] buffer = Converter.wcsToMbcs("PRIMARY", true);
long primary = GDK.gdk_atom_intern(buffer, false);
long primary = GTK.GTK4 ? 0 : GDK.gdk_atom_intern(buffer, false);
GTKPRIMARYCLIPBOARD = GTK.GTK4 ? GDK.gdk_display_get_primary_clipboard(GDK.gdk_display_get_default()) : GTK3.gtk_clipboard_get(primary);
buffer = Converter.wcsToMbcs("TARGETS", true);
TARGET = GDK.gdk_atom_intern(buffer, false);
TARGET = GTK.GTK4 ? 0 : GDK.gdk_atom_intern(buffer, false);
}

/**
Expand Down Expand Up @@ -290,6 +291,12 @@ public Object getContents(Transfer transfer) {
public Object getContents(Transfer transfer, int clipboards) {
checkWidget();
if (transfer == null) DND.error(SWT.ERROR_NULL_ARGUMENT);

if(GTK.GTK4) {
Object result = getContents_gtk4(transfer, clipboards);
return result;
}

long selection_data = 0;
int[] typeIds = transfer.getTypeIds();
for (int i = 0; i < typeIds.length; i++) {
Expand All @@ -312,6 +319,33 @@ public Object getContents(Transfer transfer, int clipboards) {
return result;
}

private Object getContents_gtk4(Transfer transfer, int clipboards) {

long contents = GTK4.gdk_clipboard_get_content(Clipboard.GTKCLIPBOARD);
long value = OS.g_malloc (OS.GValue_sizeof ());
C.memset (value, 0, OS.GValue_sizeof ());

//Pasting of text (TextTransfer)
if(transfer.getTypeNames()[0] == "STRING") {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

String comparison should happen with .equals not with ==

OS.g_value_init(value, OS.G_TYPE_STRING());
if (!GTK4.gdk_content_provider_get_value (contents, value, null))
return null;
long cStr = OS.g_value_get_string(value);
long [] items_written = new long [1];
long utf16Ptr = OS.g_utf8_to_utf16(cStr, -1, null, items_written, null);
OS.g_free(cStr);
if (utf16Ptr == 0) return null;
int length = (int)items_written[0];
char[] buffer = new char[length];
C.memmove(buffer, utf16Ptr, length * 2);
OS.g_free(utf16Ptr);
String str = new String(buffer);
return str;
}
//TODO: [GTK4] Other cases
return null;
}

/**
* Returns <code>true</code> if the clipboard has been disposed,
* and <code>false</code> otherwise.
Expand Down Expand Up @@ -596,6 +630,13 @@ private int[] getAvailablePrimaryTypes() {
return types;
}
private int[] getAvailableClipboardTypes () {

if(GTK.GTK4) {
/*TODO: can use gdk_clipboard_get_formats and gdk_content_formats_to_string
*Then from the comma separated list of formats find their respective IDs
*/
}

int[] types = new int[0];
long selection_data = gtk_clipboard_wait_for_contents(GTKCLIPBOARD, TARGET);
if (selection_data != 0) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,10 +93,10 @@ long clearFunc(long clipboard,long user_data_or_owner){
void dispose () {
if (display == null) return;
if (activeClipboard != null) {
GTK3.gtk_clipboard_store(Clipboard.GTKCLIPBOARD);
if(!GTK.GTK4) GTK3.gtk_clipboard_store(Clipboard.GTKCLIPBOARD);
}
if (activePrimaryClipboard != null) {
GTK3.gtk_clipboard_store(Clipboard.GTKPRIMARYCLIPBOARD);
if(!GTK.GTK4) GTK3.gtk_clipboard_store(Clipboard.GTKPRIMARYCLIPBOARD);
}
display = null;
if (getFunc != null ) getFunc.dispose();
Expand Down Expand Up @@ -146,6 +146,9 @@ long getFunc(long clipboard, long selection_data, long info, long user_data_or_o
}

boolean setData(Clipboard owner, Object[] data, Transfer[] dataTypes, int clipboards) {

if(GTK.GTK4) return setData_gtk4(owner, data, dataTypes, clipboards);

GtkTargetEntry[] entries = new GtkTargetEntry [0];
long pTargetsList = 0;
try {
Expand Down Expand Up @@ -214,4 +217,34 @@ boolean setData(Clipboard owner, Object[] data, Transfer[] dataTypes, int clipbo
if (pTargetsList != 0) OS.g_free(pTargetsList);
}
}

private boolean setData_gtk4(Clipboard owner, Object[] data, Transfer[] dataTypes, int clipboards) {
boolean result = false;

//Handle the text transfer case first
for (int i = 0; i < dataTypes.length; i++) {
Transfer transfer = dataTypes[i];
String[] typeNames = transfer.getTypeNames();
if ((clipboards & DND.CLIPBOARD) != 0){
clipboardData = data;
clipboardDataTypes = dataTypes;
result = setContentFromType(Clipboard.GTKCLIPBOARD, typeNames[0], data[i]);
activeClipboard = owner;
}
}
//TODO: [GTK4] Other cases for setting data
return result;
}

private boolean setContentFromType(long clipboard, String string, Object data) {

//TextTransfer
if(data.getClass() == String.class) {
GTK4.gdk_clipboard_set_text(clipboard, Converter.javaStringToCString((String)data));
return true;
}


return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,9 @@ protected int[] getTypeIds() {
if (OS.isX11()) {
return new int[] {UTF8_STRING_ID, COMPOUND_TEXT_ID, STRING_ID};
}
if(GTK.GTK4) {
return new int[] {(int) OS.G_TYPE_STRING()};
}
return new int[] {UTF8_STRING_ID, STRING_ID};
}

Expand All @@ -150,6 +153,10 @@ protected String[] getTypeNames() {
if (OS.isX11()) {
return new String[] {UTF8_STRING, COMPOUND_TEXT, STRING};
}
if(GTK.GTK4) {
return new String[] {STRING};
}

return new String[] {UTF8_STRING, STRING};
}

Expand Down
52 changes: 52 additions & 0 deletions bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk4.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,42 @@
#define GTK4_NATIVE(func) Java_org_eclipse_swt_internal_gtk4_GTK4_##func
#endif

#ifndef NO_gdk_1clipboard_1get_1content
JNIEXPORT jlong JNICALL GTK4_NATIVE(gdk_1clipboard_1get_1content)
(JNIEnv *env, jclass that, jlong arg0)
{
jlong rc = 0;
GTK4_NATIVE_ENTER(env, that, gdk_1clipboard_1get_1content_FUNC);
rc = (jlong)gdk_clipboard_get_content((GdkClipboard*)arg0);
GTK4_NATIVE_EXIT(env, that, gdk_1clipboard_1get_1content_FUNC);
return rc;
}
#endif

#ifndef NO_gdk_1clipboard_1get_1formats
JNIEXPORT void JNICALL GTK4_NATIVE(gdk_1clipboard_1get_1formats)
(JNIEnv *env, jclass that, jlong arg0)
{
GTK4_NATIVE_ENTER(env, that, gdk_1clipboard_1get_1formats_FUNC);
gdk_clipboard_get_formats((GdkClipboard*)arg0);
GTK4_NATIVE_EXIT(env, that, gdk_1clipboard_1get_1formats_FUNC);
}
#endif

#ifndef NO_gdk_1clipboard_1set_1text
JNIEXPORT void JNICALL GTK4_NATIVE(gdk_1clipboard_1set_1text)
(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
jbyte *lparg1=NULL;
GTK4_NATIVE_ENTER(env, that, gdk_1clipboard_1set_1text_FUNC);
if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
gdk_clipboard_set_text((GdkClipboard*)arg0, (const char *)lparg1);
fail:
if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
GTK4_NATIVE_EXIT(env, that, gdk_1clipboard_1set_1text_FUNC);
}
#endif

#ifndef NO_gdk_1content_1formats_1builder_1add_1mime_1type
JNIEXPORT void JNICALL GTK4_NATIVE(gdk_1content_1formats_1builder_1add_1mime_1type)
(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
Expand Down Expand Up @@ -62,6 +98,22 @@ JNIEXPORT jlong JNICALL GTK4_NATIVE(gdk_1content_1formats_1builder_1new)
}
#endif

#ifndef NO_gdk_1content_1provider_1get_1value
JNIEXPORT jboolean JNICALL GTK4_NATIVE(gdk_1content_1provider_1get_1value)
(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlongArray arg2)
{
jlong *lparg2=NULL;
jboolean rc = 0;
GTK4_NATIVE_ENTER(env, that, gdk_1content_1provider_1get_1value_FUNC);
if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
rc = (jboolean)gdk_content_provider_get_value((GdkContentProvider *)arg0, (GValue *)arg1, (GError **)lparg2);
fail:
if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
GTK4_NATIVE_EXIT(env, that, gdk_1content_1provider_1get_1value_FUNC);
return rc;
}
#endif

#ifndef NO_gdk_1toplevel_1focus
JNIEXPORT void JNICALL GTK4_NATIVE(gdk_1toplevel_1focus)
(JNIEnv *env, jclass that, jlong arg0, jint arg1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,13 @@
#ifdef NATIVE_STATS

char * GTK4_nativeFunctionNames[] = {
"gdk_1clipboard_1get_1content",
"gdk_1clipboard_1get_1formats",
"gdk_1clipboard_1set_1text",
"gdk_1content_1formats_1builder_1add_1mime_1type",
"gdk_1content_1formats_1builder_1free_1to_1formats",
"gdk_1content_1formats_1builder_1new",
"gdk_1content_1provider_1get_1value",
"gdk_1toplevel_1focus",
"gdk_1toplevel_1get_1state",
"gdk_1toplevel_1lower",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,13 @@ extern char* GTK4_nativeFunctionNames[];
#endif

typedef enum {
gdk_1clipboard_1get_1content_FUNC,
gdk_1clipboard_1get_1formats_FUNC,
gdk_1clipboard_1set_1text_FUNC,
gdk_1content_1formats_1builder_1add_1mime_1type_FUNC,
gdk_1content_1formats_1builder_1free_1to_1formats_FUNC,
gdk_1content_1formats_1builder_1new_FUNC,
gdk_1content_1provider_1get_1value_FUNC,
gdk_1toplevel_1focus_FUNC,
gdk_1toplevel_1get_1state_FUNC,
gdk_1toplevel_1lower_FUNC,
Expand Down
22 changes: 22 additions & 0 deletions bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c
Original file line number Diff line number Diff line change
Expand Up @@ -13088,6 +13088,18 @@ JNIEXPORT jlong JNICALL OS_NATIVE(g_1value_1get_1int64)
}
#endif

#ifndef NO_g_1value_1get_1string
JNIEXPORT jlong JNICALL OS_NATIVE(g_1value_1get_1string)
(JNIEnv *env, jclass that, jlong arg0)
{
jlong rc = 0;
OS_NATIVE_ENTER(env, that, g_1value_1get_1string_FUNC);
rc = (jlong)g_value_get_string((GValue *)arg0);
OS_NATIVE_EXIT(env, that, g_1value_1get_1string_FUNC);
return rc;
}
#endif

#ifndef NO_g_1value_1init
JNIEXPORT jlong JNICALL OS_NATIVE(g_1value_1init)
(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
Expand Down Expand Up @@ -13152,6 +13164,16 @@ JNIEXPORT void JNICALL OS_NATIVE(g_1value_1set_1int64)
}
#endif

#ifndef NO_g_1value_1set_1string
JNIEXPORT void JNICALL OS_NATIVE(g_1value_1set_1string)
(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
OS_NATIVE_ENTER(env, that, g_1value_1set_1string_FUNC);
g_value_set_string((GValue *)arg0, (const gchar *)arg1);
OS_NATIVE_EXIT(env, that, g_1value_1set_1string_FUNC);
}
#endif

#ifndef NO_g_1value_1unset
JNIEXPORT void JNICALL OS_NATIVE(g_1value_1unset)
(JNIEnv *env, jclass that, jlong arg0)
Expand Down
2 changes: 2 additions & 0 deletions bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c
Original file line number Diff line number Diff line change
Expand Up @@ -1101,12 +1101,14 @@ char * OS_nativeFunctionNames[] = {
"g_1value_1get_1float",
"g_1value_1get_1int",
"g_1value_1get_1int64",
"g_1value_1get_1string",
"g_1value_1init",
"g_1value_1peek_1pointer",
"g_1value_1set_1double",
"g_1value_1set_1float",
"g_1value_1set_1int",
"g_1value_1set_1int64",
"g_1value_1set_1string",
"g_1value_1unset",
"g_1variant_1builder_1add_1value",
"g_1variant_1builder_1end",
Expand Down
2 changes: 2 additions & 0 deletions bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h
Original file line number Diff line number Diff line change
Expand Up @@ -1075,12 +1075,14 @@ typedef enum {
g_1value_1get_1float_FUNC,
g_1value_1get_1int_FUNC,
g_1value_1get_1int64_FUNC,
g_1value_1get_1string_FUNC,
g_1value_1init_FUNC,
g_1value_1peek_1pointer_FUNC,
g_1value_1set_1double_FUNC,
g_1value_1set_1float_FUNC,
g_1value_1set_1int_FUNC,
g_1value_1set_1int64_FUNC,
g_1value_1set_1string_FUNC,
g_1value_1unset_FUNC,
g_1variant_1builder_1add_1value_FUNC,
g_1variant_1builder_1end_FUNC,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1374,6 +1374,12 @@ public static boolean isX11 () {
public static final native long g_value_get_int64 (long value);
/** @param value cast=(GValue *) */
public static final native void g_value_set_int64 (long value, long v);
/** @param value cast=(GValue *)
* @param v_string cast =(const gchar *)
* */
public static final native void g_value_set_string (long value, long v_string);
/** @param value cast=(GValue *) */
public static final native long g_value_get_string (long value);
/** @param value cast=(GValue *) */
public static final native void g_value_unset (long value);
/** @param value cast=(const GValue *) */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -559,5 +559,26 @@ public class GTK4 {
*/
public static final native void gdk_toplevel_size_set_size(long size, int width, int height);

/* GdkClipboard */
/**
* @param clipboard cast=(GdkClipboard*)
* @param text cast=(const char *)
*/
public static final native void gdk_clipboard_set_text(long clipboard, byte[] text);
/**
* @param clipboard cast=(GdkClipboard*)
*/
public static final native void gdk_clipboard_get_formats(long clipboard);
/**
* @param clipboard cast=(GdkClipboard*)
*/
public static final native long gdk_clipboard_get_content(long clipboard);
/**
* @param provider cast=(GdkContentProvider *)
* @param value cast=(GValue *)
* @param error cast=(GError **)
*/
public static final native boolean gdk_content_provider_get_value(long provider, long value, long[] error);


}