static void set_data(GdkAtom target, GtkSelectionData *selection_data, jobject data) { gchar *name = gdk_atom_name(target); jstring typeString; jobject result; if (gtk_targets_include_text(&target, 1)) { typeString = mainEnv->NewStringUTF("text/plain"); result = mainEnv->CallObjectMethod(data, jMapGet, typeString, NULL); if (!EXCEPTION_OCCURED(mainEnv) && result != NULL) { set_text_data(selection_data, (jstring)result); } } else if (gtk_targets_include_image(&target, 1, TRUE)) { typeString = mainEnv->NewStringUTF("application/x-java-rawimage"); result = mainEnv->CallObjectMethod(data, jMapGet, typeString, NULL); if (!EXCEPTION_OCCURED(mainEnv) && result != NULL) { set_image_data(selection_data, result); } } else if (target == MIME_TEXT_URI_LIST_TARGET) { set_uri_data(selection_data, data); } else { typeString = mainEnv->NewStringUTF(name); result = mainEnv->CallObjectMethod(data, jMapGet, typeString, NULL); if (!EXCEPTION_OCCURED(mainEnv) && result != NULL) { if (mainEnv->IsInstanceOf(result, jStringCls)) { set_jstring_data(selection_data, target, (jstring)result); } else if (mainEnv->IsInstanceOf(result, jByteBufferCls)) { set_bytebuffer_data(selection_data, target, result); } } } g_free(name); }
static gboolean dnd_source_set_raw(GdkWindow *requestor, GdkAtom property, GdkAtom target) { gchar *target_name = gdk_atom_name(target); jobject data = dnd_source_get_data(target_name); gboolean is_data_set = FALSE; if (data) { if (mainEnv->IsInstanceOf(data, jStringCls)) { const char *cstring = mainEnv->GetStringUTFChars((jstring)data, NULL); gdk_property_change(requestor, property, GDK_SELECTION_TYPE_STRING, 8, GDK_PROP_MODE_REPLACE, (guchar *) cstring, strlen(cstring)); mainEnv->ReleaseStringUTFChars((jstring)data, cstring); is_data_set = TRUE; } else if (mainEnv->IsInstanceOf(data, jByteBufferCls)) { jbyteArray byteArray = (jbyteArray)mainEnv->CallObjectMethod(data, jByteBufferArray); if (!EXCEPTION_OCCURED(mainEnv)) { jbyte* raw = mainEnv->GetByteArrayElements(byteArray, NULL); jsize nraw = mainEnv->GetArrayLength(byteArray); gdk_property_change(requestor, property, target, 8, GDK_PROP_MODE_REPLACE, (guchar *) raw, nraw); mainEnv->ReleaseByteArrayElements(byteArray, raw, JNI_ABORT); is_data_set = TRUE; } } } g_free(target_name); return is_data_set; }
static jobject dnd_source_get_data(const char *key) { jobject data = (jobject)g_object_get_data(G_OBJECT(dnd_window), SOURCE_DND_DATA); jstring string = mainEnv->NewStringUTF(key); jobject result = mainEnv->CallObjectMethod(data, jMapGet, string, NULL); return (EXCEPTION_OCCURED(mainEnv)) ? NULL : result; }
bool WindowContextBase::im_filter_keypress(GdkEventKey* event) { static size_t buf_len = 12; static char *buffer = NULL; if (buffer == NULL) { buffer = (char*)malloc(buf_len * sizeof (char)); } KeySym keysym; Status status; XKeyPressedEvent xevent = convert_event(event); if (XFilterEvent((XEvent*) & xevent, GDK_WINDOW_XID(gdk_window))) { return TRUE; } if (event->type == GDK_KEY_RELEASE) { process_key(event); return TRUE; } int len = Xutf8LookupString(xim.ic, &xevent, buffer, buf_len - 1, &keysym, &status); if (status == XBufferOverflow) { buf_len = len + 1; buffer = (char*)realloc(buffer, buf_len * sizeof (char)); len = Xutf8LookupString(xim.ic, &xevent, buffer, buf_len - 1, &keysym, &status); } switch (status) { case XLookupKeySym: case XLookupBoth: if (xevent.keycode) { //process it as a normal key process_key(event); break; } // fall-through case XLookupChars: buffer[len] = 0; jstring str = mainEnv->NewStringUTF(buffer); EXCEPTION_OCCURED(mainEnv); jsize slen = mainEnv->GetStringLength(str); mainEnv->CallVoidMethod(jview, jViewNotifyInputMethod, str, NULL, NULL, NULL, slen, slen, 0); LOG_EXCEPTION(mainEnv) break; } return TRUE; }
static void set_image_data(GtkSelectionData *selection_data, jobject pixels) { GdkPixbuf *pixbuf = NULL; mainEnv->CallVoidMethod(pixels, jPixelsAttachData, PTR_TO_JLONG(&pixbuf)); if (!EXCEPTION_OCCURED(mainEnv)) { gtk_selection_data_set_pixbuf(selection_data, pixbuf); } g_object_unref(pixbuf); }
static jobject get_data_text(JNIEnv *env) { gchar *data = gtk_clipboard_wait_for_text(get_clipboard()); if (data == NULL) { return NULL; } jstring jdata = env->NewStringUTF(data); EXCEPTION_OCCURED(env); g_free(data); return jdata; }
static jobject get_data_image(JNIEnv* env) { GdkPixbuf* pixbuf; guchar *data; jbyteArray data_array; jobject buffer, result; int w,h,stride; pixbuf = gtk_clipboard_wait_for_image(get_clipboard()); if (pixbuf == NULL) { return NULL; } if (!gdk_pixbuf_get_has_alpha(pixbuf)) { GdkPixbuf *tmp_buf = gdk_pixbuf_add_alpha(pixbuf, FALSE, 0, 0, 0); g_object_unref(pixbuf); pixbuf = tmp_buf; } w = gdk_pixbuf_get_width(pixbuf); h = gdk_pixbuf_get_height(pixbuf); stride = gdk_pixbuf_get_rowstride(pixbuf); data = gdk_pixbuf_get_pixels(pixbuf); //Actually, we are converting RGBA to BGRA, but that's the same operation data = (guchar*) convert_BGRA_to_RGBA((int*)data, stride, h); data_array = env->NewByteArray(stride*h); EXCEPTION_OCCURED(env); env->SetByteArrayRegion(data_array, 0, stride*h, (jbyte*)data); EXCEPTION_OCCURED(env); buffer = env->CallStaticObjectMethod(jByteBufferCls, jByteBufferWrap, data_array); result = env->NewObject(jGtkPixelsCls, jGtkPixelsInit, w, h, buffer); EXCEPTION_OCCURED(env); g_free(data); g_object_unref(pixbuf); return result; }
/* * Class: com_sun_glass_ui_gtk_GtkCursor * Method: _createCursor * Signature: (IILcom/sun/glass/ui/Pixels;)J */ JNIEXPORT jlong JNICALL Java_com_sun_glass_ui_gtk_GtkCursor__1createCursor (JNIEnv * env, jobject obj, jint x, jint y, jobject pixels) { GdkPixbuf *pixbuf = NULL; GdkCursor *cursor = NULL; env->CallVoidMethod(pixels, jPixelsAttachData, PTR_TO_JLONG(&pixbuf)); if (!EXCEPTION_OCCURED(env)) { cursor = gdk_cursor_new_from_pixbuf(gdk_display_get_default(), pixbuf, x, y); } g_object_unref(pixbuf); return PTR_TO_JLONG(cursor); }
/* * Class: com_sun_glass_ui_gtk_GtkCursor * Method: _getBestSize * Signature: (II)Lcom.sun.glass.ui.Size */ JNIEXPORT jobject JNICALL Java_com_sun_glass_ui_gtk_GtkCursor__1getBestSize (JNIEnv *env, jclass jCursorClass, jint width, jint height) { int size = gdk_display_get_default_cursor_size(gdk_display_get_default()); jclass jc = env->FindClass("com/sun/glass/ui/Size"); if (env->ExceptionCheck()) return NULL; jobject jo = env->NewObject( jc, jSizeInit, size, size); EXCEPTION_OCCURED(env); return jo; }
static jobject get_data_raw(JNIEnv *env, const char* mime, gboolean string_data) { GtkSelectionData *data; const guchar *raw_data; jsize length; jbyteArray array; jobject result = NULL; data = gtk_clipboard_wait_for_contents(get_clipboard(), gdk_atom_intern(mime, FALSE)); if (data != NULL) { raw_data = glass_gtk_selection_data_get_data_with_length(data, &length); if (string_data) { result = env->NewStringUTF((const char*)raw_data); EXCEPTION_OCCURED(env); } else { array = env->NewByteArray(length); EXCEPTION_OCCURED(env); env->SetByteArrayRegion(array, 0, length, (const jbyte*)raw_data); EXCEPTION_OCCURED(env); result = env->CallStaticObjectMethod(jByteBufferCls, jByteBufferWrap, array); } gtk_selection_data_free(data); } return result; }
static gboolean dnd_source_set_image(GdkWindow *requestor, GdkAtom property, GdkAtom target) { jobject pixels = dnd_source_get_data("application/x-java-rawimage"); if (!pixels) { return FALSE; } gchar *buffer; gsize size; const char * type; GdkPixbuf *pixbuf = NULL; gboolean result = FALSE; if (target == TARGET_MIME_PNG_ATOM) { type = "png"; } else if (target == TARGET_MIME_JPEG_ATOM) { type = "jpeg"; } else if (target == TARGET_MIME_TIFF_ATOM) { type = "tiff"; } else if (target == TARGET_MIME_BMP_ATOM) { type = "bmp"; } else { return FALSE; } mainEnv->CallVoidMethod(pixels, jPixelsAttachData, PTR_TO_JLONG(&pixbuf)); if (!EXCEPTION_OCCURED(mainEnv) && gdk_pixbuf_save_to_buffer(pixbuf, &buffer, &size, type, NULL, NULL)) { gdk_property_change(requestor, property, target, 8, GDK_PROP_MODE_REPLACE, (guchar *)buffer, size); result = TRUE; } g_object_unref(pixbuf); return result; }
/* * Class: com_sun_glass_ui_gtk_GtkSystemClipboard * Method: mimesFromSystem * Signature: ()[Ljava/lang/String; */ JNIEXPORT jobjectArray JNICALL Java_com_sun_glass_ui_gtk_GtkSystemClipboard_mimesFromSystem (JNIEnv * env, jobject obj) { GdkAtom *targets; gint ntargets; gint i; GdkAtom *convertible; GdkAtom *convertible_ptr; gchar *name; jobjectArray result; jstring tmpString; init_atoms(); gtk_clipboard_wait_for_targets(get_clipboard(), &targets, &ntargets); convertible = (GdkAtom*) glass_try_malloc0_n(ntargets * 2, sizeof(GdkAtom)); //theoretically, the number can double if (!convertible) { if (ntargets > 0) { glass_throw_oom(env, "Failed to allocate mimes"); } g_free(targets); return NULL; } convertible_ptr = convertible; bool uri_list_added = false; bool text_added = false; bool image_added = false; for (i = 0; i < ntargets; ++i) { //handle text targets //if (targets[i] == TEXT_TARGET || targets[i] == STRING_TARGET || targets[i] == UTF8_STRING_TARGET) { if (gtk_targets_include_text(targets + i, 1) && !text_added) { *(convertible_ptr++) = MIME_TEXT_PLAIN_TARGET; text_added = true; } else if (gtk_targets_include_image(targets + i, 1, TRUE) && !image_added) { *(convertible_ptr++) = MIME_JAVA_IMAGE; image_added = true; } //TODO text/x-moz-url ? RT-17802 if (targets[i] == MIME_TEXT_URI_LIST_TARGET) { if (uri_list_added) { continue; } gchar** uris = gtk_clipboard_wait_for_uris(get_clipboard()); if (uris) { guint size = g_strv_length(uris); guint files_cnt = get_files_count(uris); if (files_cnt) { *(convertible_ptr++) = MIME_FILES_TARGET; } if (size - files_cnt) { *(convertible_ptr++) = MIME_TEXT_URI_LIST_TARGET; } g_strfreev(uris); } uri_list_added = true; } else { *(convertible_ptr++) = targets[i]; } } result = env->NewObjectArray(convertible_ptr - convertible, jStringCls, NULL); EXCEPTION_OCCURED(env); for (i = 0; convertible + i < convertible_ptr; ++i) { name = gdk_atom_name(convertible[i]); tmpString = env->NewStringUTF(name); EXCEPTION_OCCURED(env); env->SetObjectArrayElement(result, (jsize)i, tmpString); EXCEPTION_OCCURED(env); g_free(name); } g_free(targets); g_free(convertible); return result; }