diff options
author | fitzsim <fitzsim@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-10-09 00:26:29 +0000 |
---|---|---|
committer | fitzsim <fitzsim@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-10-09 00:26:29 +0000 |
commit | afdfc197c91adb0d71a2b07f8f71457dc157eaf3 (patch) | |
tree | e8c4b26ac43e59bc2b91154944ca054acfa5b1ae /libjava/jni/gtk-peer | |
parent | 945d9f0e95b5519f87de0221eed0061dd7be321b (diff) | |
download | gcc-afdfc197c91adb0d71a2b07f8f71457dc157eaf3.tar.gz |
2003-10-08 Thomas Fitzsimmons <fitzsim@redhat.com>
* gnu/java/awt/peer/gtk/GtkButtonPeer.java (handleEvent): Remove
modality check.
* gnu/java/awt/peer/gtk/GtkDialogPeer.java (initializeInsets):
Initialize insets to use latest insets.
* gnu/java/awt/peer/gtk/GtkFramePeer.java: Likewise.
* gnu/java/awt/peer/gtk/GtkWindowPeer.java (latestInsets): New
field.
(postConfigureEvent): Update latestInsets field when insets
change. Remove call to setSize. Move validate call outside of
if blocks.
(setVisible): Call setBounds before showing window.
(nativeSetVisible): New native method.
* java/awt/Window.java (show): Show visible owned windows.
(hide): Hide visible owned windows.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
(awt_event_handler): Implement modality using GTK grabs.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
(global_gtk_window_group): New global variable.
(gtkInit): Initialize global_gtk_window_group.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c (create):
Clamp width and height values to at least 1. Add this window to
the global GTK window group.
(setVisible): Rename to nativeSetVisible.
(setup_window): Remove function.
(setSize): Clamp width and height values to at least 1.
(nativeSetBounds): Likewise.
(gdk_window_get_root_geometry): Remove function.
* jni/gtk-peer/gtkpeer.h: Remove gdk_window_get_root_geometry
and setup_window declarations. Declare global_gtk_window_group.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@72252 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/jni/gtk-peer')
-rw-r--r-- | libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c | 79 | ||||
-rw-r--r-- | libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c | 3 | ||||
-rw-r--r-- | libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c | 82 | ||||
-rw-r--r-- | libjava/jni/gtk-peer/gtkpeer.h | 11 |
4 files changed, 79 insertions, 96 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 b6a172d7ab8..563492a3627 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 @@ -813,7 +813,7 @@ generates_key_typed_event (GdkEvent *event, GtkWidget *source) void awt_event_handler (GdkEvent *event) { - jobject *obj_ptr; + jobject *event_obj_ptr; static guint32 button_click_time = 0; static GdkWindow *button_window = NULL; static guint button_number = -1; @@ -865,12 +865,49 @@ awt_event_handler (GdkEvent *event) NULL, NULL, NULL, - (guchar **)&obj_ptr)) + (guchar **)&event_obj_ptr)) { + GtkWidget *event_widget; + GtkWidget *grab_widget; + jobject *grab_obj_ptr = NULL; + void *ptr; + + /* Implement modality using GTK grabs. */ + g_assert (global_gtk_window_group); + if (global_gtk_window_group->grabs) + { + grab_widget = global_gtk_window_group->grabs->data; + g_assert (grab_widget); + + gdk_property_get (grab_widget->window, + gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE), + gdk_atom_intern ("CARDINAL", FALSE), + 0, + sizeof (jobject), + FALSE, + NULL, + NULL, + NULL, + (guchar **)&grab_obj_ptr); + + ptr = NSA_GET_PTR (gdk_env, *event_obj_ptr); + event_widget = GTK_WIDGET(ptr); + + if (GTK_WIDGET_IS_SENSITIVE (event_widget) && + gtk_widget_is_ancestor (event_widget, grab_widget)) + { + g_free (grab_obj_ptr); + + grab_obj_ptr = event_obj_ptr; + } + } + else + grab_obj_ptr = event_obj_ptr; + switch (event->type) { case GDK_BUTTON_PRESS: - (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, postMouseEventID, + (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, postMouseEventID, AWT_MOUSE_PRESSED, (jlong)event->button.time, state_to_awt_mods (event->button.state) | @@ -902,7 +939,8 @@ awt_event_handler (GdkEvent *event) /* if (--grab_counter == 0) gdk_pointer_ungrab (event->button.time); */ - (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, postMouseEventID, + (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, + postMouseEventID, AWT_MOUSE_RELEASED, (jlong)event->button.time, state_to_awt_mods (event->button.state) | @@ -918,7 +956,8 @@ awt_event_handler (GdkEvent *event) && event->button.y >= 0 && event->button.x <= width && event->button.y <= height) - (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, postMouseEventID, + (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, + postMouseEventID, AWT_MOUSE_CLICKED, (jlong)event->button.time, state_to_awt_mods (event->button.state) | @@ -930,7 +969,7 @@ awt_event_handler (GdkEvent *event) } break; case GDK_MOTION_NOTIFY: - (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, postMouseEventID, + (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, postMouseEventID, AWT_MOUSE_MOVED, (jlong)event->motion.time, state_to_awt_mods (event->motion.state), @@ -944,7 +983,8 @@ awt_event_handler (GdkEvent *event) | GDK_BUTTON4_MASK | GDK_BUTTON5_MASK)) { - (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, postMouseEventID, + (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, + postMouseEventID, AWT_MOUSE_DRAGGED, (jlong)event->motion.time, state_to_awt_mods (event->motion.state), @@ -954,7 +994,7 @@ awt_event_handler (GdkEvent *event) } break; case GDK_ENTER_NOTIFY: - (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, postMouseEventID, + (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, postMouseEventID, AWT_MOUSE_ENTERED, (jlong)event->crossing.time, state_to_awt_mods (event->crossing.state), @@ -964,7 +1004,8 @@ awt_event_handler (GdkEvent *event) break; case GDK_LEAVE_NOTIFY: if (event->crossing.mode == GDK_CROSSING_NORMAL) - (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, postMouseEventID, + (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, + postMouseEventID, AWT_MOUSE_EXITED, (jlong)event->crossing.time, state_to_awt_mods (event->crossing.state), @@ -1005,7 +1046,7 @@ awt_event_handler (GdkEvent *event) bottom = r.height - h - y; right = r.width - w - x; - (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, + (*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr, postConfigureEventID, (jint) event->configure.x, (jint) event->configure.y, @@ -1021,7 +1062,7 @@ awt_event_handler (GdkEvent *event) break; case GDK_EXPOSE: { - (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, + (*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr, postExposeEventID, (jint)event->expose.area.x, (jint)event->expose.area.y, @@ -1066,9 +1107,9 @@ awt_event_handler (GdkEvent *event) NULL, NULL, NULL, - (guchar **)&obj_ptr); + (guchar **)&grab_obj_ptr); - (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, + (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, postKeyEventID, (jint) AWT_KEY_PRESSED, (jlong) event->key.time, @@ -1078,11 +1119,11 @@ awt_event_handler (GdkEvent *event) keysym_to_awt_keylocation (event)); if (generates_key_typed_event (event, window->focus_widget)) - (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, + (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, postKeyEventID, (jint) AWT_KEY_TYPED, (jlong) event->key.time, - state_to_awt_mods (event->key.state), + state_to_awt_mods (event->key.state), VK_UNDEFINED, keyevent_to_awt_keychar (event), AWT_KEY_LOCATION_UNKNOWN); @@ -1121,9 +1162,9 @@ awt_event_handler (GdkEvent *event) NULL, NULL, NULL, - (guchar **)&obj_ptr); + (guchar **)&grab_obj_ptr); - (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, + (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, postKeyEventID, (jint) AWT_KEY_RELEASED, (jlong) event->key.time, @@ -1135,7 +1176,7 @@ awt_event_handler (GdkEvent *event) } break; case GDK_FOCUS_CHANGE: - (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, + (*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr, postFocusEventID, (jint) (event->focus_change.in) ? AWT_FOCUS_GAINED : AWT_FOCUS_LOST, @@ -1144,7 +1185,7 @@ awt_event_handler (GdkEvent *event) default: break; } - g_free (obj_ptr); + g_free (event_obj_ptr); } gtk_main_do_event (event); diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c index d936a598734..79d7f7d55b2 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c @@ -63,6 +63,8 @@ JNIEnv *gdk_env; JavaVM *gdk_vm; #endif +GtkWindowGroup *global_gtk_window_group; + /* * Call gtk_init. It is very important that this happen before any other * gtk calls. @@ -179,6 +181,7 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz) postTextEventID = (*env)->GetMethodID (env, gtktextcomponentpeer, "postTextEvent", "()V"); + global_gtk_window_group = gtk_window_group_new (); } /* diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c index 0674b3ac36c..3cac71835b7 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c @@ -60,6 +60,10 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create window_widget = gtk_window_new (GTK_WINDOW_TOPLEVEL); window = GTK_WINDOW (window_widget); + // Avoid GTK runtime assertion failures. + width = (width < 1) ? 1 : width; + height = (height < 1) ? 1 : height; + gtk_window_set_default_size (window, width, height); /* We must set this window's size requisition. Otherwise when a @@ -80,6 +84,8 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create gtk_window_set_type_hint (window, type); + gtk_window_group_add_window (global_gtk_window_group, window); + vbox = gtk_vbox_new (0, 0); layout = gtk_layout_new (NULL, NULL); gtk_box_pack_end (GTK_BOX (vbox), layout, 1, 1, 0); @@ -93,7 +99,7 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create NSA_SET_PTR (env, obj, window_widget); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setVisible +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetVisible (JNIEnv *env, jobject obj, jboolean visible) { void *ptr; @@ -149,32 +155,6 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectHooks gdk_threads_leave (); } -void -setup_window (JNIEnv *env, jobject obj, GtkWidget *window, jint width, - jint height, jboolean visible) -{ - GtkWidget *layout, *vbox; - - gdk_threads_enter(); - gtk_window_set_policy (GTK_WINDOW (window), 1, 1, 0); - gtk_widget_set_usize (window, width, height); - - vbox = gtk_vbox_new (0, 0); - layout = gtk_layout_new (NULL, NULL); - gtk_box_pack_end (GTK_BOX (vbox), layout, 1, 1, 0); - gtk_container_add (GTK_CONTAINER (window), vbox); - gtk_widget_realize (layout); - connect_awt_hook (env, obj, 1, GTK_LAYOUT(layout)->bin_window); - gtk_widget_show (layout); - gtk_widget_show (vbox); - - gtk_widget_realize (window); - - connect_awt_hook (env, obj, 1, window->window); - set_visible (window, visible); - gdk_threads_leave (); -} - /* * Set a frame's title */ @@ -250,6 +230,10 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setSize { void *ptr = NSA_GET_PTR (env, obj); + // Avoid GTK runtime assertion failures. + width = (width < 1) ? 1 : width; + height = (height < 1) ? 1 : height; + gdk_threads_enter (); gtk_widget_set_size_request (GTK_WIDGET(ptr), width, height); gdk_threads_leave (); @@ -261,6 +245,10 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetBounds { void *ptr = NSA_GET_PTR (env, obj); + // Avoid GTK runtime assertion failures. + width = (width < 1) ? 1 : width; + height = (height < 1) ? 1 : height; + gdk_threads_enter (); gtk_window_move (GTK_WINDOW(ptr), x, y); /* Need to change the widget's request size. */ @@ -314,43 +302,3 @@ Java_gnu_java_awt_peer_gtk_GtkFramePeer_getMenuBarHeight return height; } - - -void -gdk_window_get_root_geometry (GdkWindow *window, - gint *x, - gint *y, - gint *width, - gint *height, - gint *border, - gint *depth) -{ - GdkWindow *private; - - g_return_if_fail (window != NULL); - - private = (GdkWindow*) window; - if (x) - *x = 0; - if (y) - *y = 0; - if (width) - *width = 0; - if (height) - *height = 0; - if (border) - *border = 0; - if (depth) - *depth = 0; - - if (GDK_WINDOW_DESTROYED (private)) - return; - - private = gdk_window_get_toplevel (private); - if (GDK_WINDOW_DESTROYED(private)) - return; - - gdk_window_get_geometry (private, x, y, width, height, depth); - -} - diff --git a/libjava/jni/gtk-peer/gtkpeer.h b/libjava/jni/gtk-peer/gtkpeer.h index b76de30a441..879f0b0b457 100644 --- a/libjava/jni/gtk-peer/gtkpeer.h +++ b/libjava/jni/gtk-peer/gtkpeer.h @@ -369,14 +369,7 @@ extern jclass gdkColor; extern jmethodID gdkColorID; extern JNIEnv *gdk_env; -void -gdk_window_get_root_geometry (GdkWindow *window, - gint *x, - gint *y, - gint *width, - gint *height, - gint *border, - gint *depth); +extern GtkWindowGroup *global_gtk_window_group; void awt_event_handler (GdkEvent *event); @@ -385,8 +378,6 @@ void connect_awt_hook (JNIEnv *env, jobject peer_obj, int nwindows, ...); void set_visible (GtkWidget *widget, jboolean visible); void set_parent (GtkWidget *widget, GtkContainer *parent); GtkLayout *find_gtk_layout (GtkWidget *parent); -void setup_window (JNIEnv *env, jobject obj, GtkWidget *window, jint width, - jint height, jboolean visible); jint keyevent_state_to_awt_mods (GdkEvent *event); |