summaryrefslogtreecommitdiff
path: root/libjava/jni/gtk-peer
diff options
context:
space:
mode:
authorfitzsim <fitzsim@138bc75d-0d04-0410-961f-82ee72b054a4>2003-10-09 00:26:29 +0000
committerfitzsim <fitzsim@138bc75d-0d04-0410-961f-82ee72b054a4>2003-10-09 00:26:29 +0000
commitafdfc197c91adb0d71a2b07f8f71457dc157eaf3 (patch)
treee8c4b26ac43e59bc2b91154944ca054acfa5b1ae /libjava/jni/gtk-peer
parent945d9f0e95b5519f87de0221eed0061dd7be321b (diff)
downloadgcc-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.c79
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c3
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c82
-rw-r--r--libjava/jni/gtk-peer/gtkpeer.h11
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);