diff options
Diffstat (limited to 'libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c')
-rw-r--r-- | libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c | 109 |
1 files changed, 69 insertions, 40 deletions
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c index 65f64e04eea..8d3dda93ad8 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c @@ -58,11 +58,11 @@ button_to_awt_mods (int button) switch (button) { case 1: - return AWT_BUTTON1_DOWN_MASK; + return AWT_BUTTON1_MASK; case 2: - return AWT_BUTTON2_DOWN_MASK; + return AWT_BUTTON2_MASK; case 3: - return AWT_BUTTON3_DOWN_MASK; + return AWT_BUTTON3_MASK; } return 0; @@ -883,7 +883,8 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) switch (event->type) { case GDK_BUTTON_PRESS: - (*gdk_env)->CallVoidMethod (gdk_env, peer, + gdk_threads_leave (); + (*gdk_env())->CallVoidMethod (gdk_env(), peer, postMouseEventID, AWT_MOUSE_PRESSED, (jlong)event->button.time, @@ -894,13 +895,15 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) click_count, (event->button.button == 3) ? JNI_TRUE : JNI_FALSE); + gdk_threads_enter (); hasBeenDragged = FALSE; break; case GDK_BUTTON_RELEASE: { int width, height; - (*gdk_env)->CallVoidMethod (gdk_env, peer, + gdk_threads_leave (); + (*gdk_env())->CallVoidMethod (gdk_env(), peer, postMouseEventID, AWT_MOUSE_RELEASED, (jlong)event->button.time, @@ -910,6 +913,7 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) (jint)event->button.y, click_count, JNI_FALSE); + gdk_threads_enter (); /* Generate an AWT click event only if the release occured in the window it was pressed in, and the mouse has not been dragged since @@ -921,7 +925,8 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) && event->button.x <= width && event->button.y <= height) { - (*gdk_env)->CallVoidMethod (gdk_env, peer, + gdk_threads_leave (); + (*gdk_env())->CallVoidMethod (gdk_env(), peer, postMouseEventID, AWT_MOUSE_CLICKED, (jlong)event->button.time, @@ -931,6 +936,7 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) (jint)event->button.y, click_count, JNI_FALSE); + gdk_threads_enter (); } } break; @@ -941,7 +947,8 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) | GDK_BUTTON4_MASK | GDK_BUTTON5_MASK)) { - (*gdk_env)->CallVoidMethod (gdk_env, peer, + gdk_threads_leave (); + (*gdk_env())->CallVoidMethod (gdk_env(), peer, postMouseEventID, AWT_MOUSE_DRAGGED, (jlong)event->motion.time, @@ -950,44 +957,58 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) (jint)event->motion.y, 0, JNI_FALSE); + gdk_threads_enter (); hasBeenDragged = TRUE; } else - (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID, - AWT_MOUSE_MOVED, - (jlong)event->motion.time, - state_to_awt_mods (event->motion.state), - (jint)event->motion.x, - (jint)event->motion.y, - 0, - JNI_FALSE); + { + gdk_threads_leave (); + (*gdk_env())->CallVoidMethod (gdk_env(), peer, postMouseEventID, + AWT_MOUSE_MOVED, + (jlong)event->motion.time, + state_to_awt_mods (event->motion.state), + (jint)event->motion.x, + (jint)event->motion.y, + 0, + JNI_FALSE); + gdk_threads_enter (); + } + break; case GDK_ENTER_NOTIFY: /* We are not interested in enter events that are due to grab/ungrab and not to actually crossing boundaries */ if (event->crossing.mode == GDK_CROSSING_NORMAL) - (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID, - AWT_MOUSE_ENTERED, - (jlong)event->crossing.time, - state_to_awt_mods_with_button_states (event->crossing.state), - (jint)event->crossing.x, - (jint)event->crossing.y, - 0, - JNI_FALSE); + { + gdk_threads_leave (); + (*gdk_env())->CallVoidMethod (gdk_env(), peer, postMouseEventID, + AWT_MOUSE_ENTERED, + (jlong)event->crossing.time, + state_to_awt_mods_with_button_states (event->crossing.state), + (jint)event->crossing.x, + (jint)event->crossing.y, + 0, + JNI_FALSE); + gdk_threads_enter (); + } break; case GDK_LEAVE_NOTIFY: /* We are not interested in leave events that are due to grab/ungrab and not to actually crossing boundaries */ if (event->crossing.mode == GDK_CROSSING_NORMAL) - (*gdk_env)->CallVoidMethod (gdk_env, peer, - postMouseEventID, - AWT_MOUSE_EXITED, - (jlong)event->crossing.time, - state_to_awt_mods_with_button_states (event->crossing.state), - (jint)event->crossing.x, - (jint)event->crossing.y, - 0, - JNI_FALSE); + { + gdk_threads_leave (); + (*gdk_env())->CallVoidMethod (gdk_env(), peer, + postMouseEventID, + AWT_MOUSE_EXITED, + (jlong)event->crossing.time, + state_to_awt_mods_with_button_states (event->crossing.state), + (jint)event->crossing.x, + (jint)event->crossing.y, + 0, + JNI_FALSE); + gdk_threads_enter (); + } break; case GDK_CONFIGURE: { @@ -1001,7 +1022,7 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) returns. */ gdk_threads_leave (); - (*gdk_env)->CallVoidMethod (gdk_env, peer, + (*gdk_env())->CallVoidMethod (gdk_env(), peer, postConfigureEventID, (jint) event->configure.x, (jint) event->configure.y, @@ -1012,20 +1033,24 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) } break; case GDK_EXPOSE: - (*gdk_env)->CallVoidMethod (gdk_env, peer, + gdk_threads_leave (); + (*gdk_env())->CallVoidMethod (gdk_env(), peer, postExposeEventID, (jint)event->expose.area.x, (jint)event->expose.area.y, (jint)event->expose.area.width, (jint)event->expose.area.height); + gdk_threads_enter (); break; case GDK_FOCUS_CHANGE: - (*gdk_env)->CallVoidMethod (gdk_env, peer, + gdk_threads_leave (); + (*gdk_env())->CallVoidMethod (gdk_env(), peer, postFocusEventID, (jint) (event->focus_change.in) ? AWT_FOCUS_GAINED : AWT_FOCUS_LOST, JNI_FALSE); + gdk_threads_enter (); break; case GDK_KEY_PRESS: if (GTK_IS_WINDOW (widget)) @@ -1033,7 +1058,8 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) /* GdkEventKey *keyevent = (GdkEventKey *) event; */ /* g_printerr ("key press event: sent: %d time: %d state: %d keyval: %d length: %d string: %s hardware_keycode: %d group: %d\n", keyevent->send_event, keyevent->time, keyevent->state, keyevent->keyval, keyevent->length, keyevent->string, keyevent->hardware_keycode, keyevent->group); */ - (*gdk_env)->CallVoidMethod (gdk_env, peer, + gdk_threads_leave (); + (*gdk_env())->CallVoidMethod (gdk_env(), peer, postKeyEventID, (jint) AWT_KEY_PRESSED, (jlong) event->key.time, @@ -1041,6 +1067,7 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) keysym_to_awt_keycode (event), keyevent_to_awt_keychar (event), keysym_to_awt_keylocation (event)); + gdk_threads_enter (); /* FIXME: generation of key typed events needs to be moved to GtkComponentPeer.postKeyEvent. If the key in a key press event is not an "action" key @@ -1054,7 +1081,8 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) case GDK_KEY_RELEASE: if (GTK_IS_WINDOW (widget)) { - (*gdk_env)->CallVoidMethod (gdk_env, peer, + gdk_threads_leave (); + (*gdk_env())->CallVoidMethod (gdk_env(), peer, postKeyEventID, (jint) AWT_KEY_RELEASED, (jlong) event->key.time, @@ -1062,6 +1090,7 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) keysym_to_awt_keycode (event), keyevent_to_awt_keychar (event), keysym_to_awt_keylocation (event)); + gdk_threads_enter (); return TRUE; } else @@ -1135,13 +1164,13 @@ void connect_awt_hook_cb (GtkWidget *widget __attribute__((unused)), { void *ptr; - ptr = NSA_GET_PTR (gdk_env, peer); + ptr = NSA_GET_PTR (gdk_env(), peer); - connect_awt_hook (gdk_env, peer, 1, GTK_WIDGET (ptr)->window); + connect_awt_hook (gdk_env(), peer, 1, GTK_WIDGET (ptr)->window); gdk_threads_leave (); - (*gdk_env)->CallVoidMethod (gdk_env, peer, setCursorID); + (*gdk_env())->CallVoidMethod (gdk_env(), peer, setCursorID); gdk_threads_enter (); } |