From afdfc197c91adb0d71a2b07f8f71457dc157eaf3 Mon Sep 17 00:00:00 2001 From: fitzsim Date: Thu, 9 Oct 2003 00:26:29 +0000 Subject: 2003-10-08 Thomas Fitzsimmons * 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 --- libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java | 3 +- libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java | 12 ++++--- libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java | 8 ++++- libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java | 42 ++++++++++++++++++------ 4 files changed, 47 insertions(+), 18 deletions(-) (limited to 'libjava/gnu/java/awt') diff --git a/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java index 1b057507b02..0801f9c6ec0 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java @@ -66,8 +66,7 @@ public class GtkButtonPeer extends GtkComponentPeer public void handleEvent (AWTEvent e) { - if (e.getID () == MouseEvent.MOUSE_CLICKED && isEnabled () - && !modalHasGrab ()) + if (e.getID () == MouseEvent.MOUSE_CLICKED && isEnabled ()) { MouseEvent me = (MouseEvent) e; if (!me.isConsumed () diff --git a/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java index e7b047ea2e2..551d05ded8f 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java @@ -54,11 +54,13 @@ public class GtkDialogPeer extends GtkWindowPeer void initializeInsets () { - // Unfortunately, X does not provide a clean way to calculate the - // dimensions of a dialog's borders before it has been displayed. - // So we guess and then fix the dimensions upon receipt of the - // first configure event. - insets = new Insets (20, 6, 6, 6); + synchronized (latestInsets) + { + insets = new Insets (latestInsets.top, + latestInsets.left, + latestInsets.bottom, + latestInsets.right); + } } void create () diff --git a/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java b/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java index b44a02d13db..ce5aa71e573 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java @@ -76,7 +76,13 @@ public class GtkFramePeer extends GtkWindowPeer // dimensions of a frame's borders before it has been displayed. // So we guess and then fix the dimensions upon receipt of the // first configure event. - insets = new Insets (20, 6, 6, 6); + synchronized (latestInsets) + { + insets = new Insets (latestInsets.top, + latestInsets.left, + latestInsets.bottom, + latestInsets.right); + } } void create () diff --git a/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java index be615042524..8875913d4fc 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java @@ -56,6 +56,15 @@ public class GtkWindowPeer extends GtkContainerPeer static protected final int GDK_WINDOW_TYPE_HINT_DOCK = 6; static protected final int GDK_WINDOW_TYPE_HINT_DESKTOP = 7; + // Unfortunately, X does not provide a clean way to calculate the + // dimensions of a window's borders before it has been displayed. + // So when creating the application's first window we guess the + // border dimensions. Then if need be for that window, we fix the + // dimensions upon receipt of the first configure event. Windows + // created after the first one will use the latest inset values + // received in postConfigureEvent. + static Insets latestInsets = new Insets (20, 6, 6, 6); + native void create (int type, boolean decorated, int width, int height, GtkWindowPeer parent); @@ -109,18 +118,19 @@ public class GtkWindowPeer extends GtkContainerPeer set ("title", title); } + native void setSize (int width, int height); + public void setResizable (boolean resizable) { // Call setSize; otherwise when resizable is changed from true to // false the window will shrink to the dimensions it had before it // was resizable. setSize (awtComponent.getWidth() - insets.left - insets.right, - awtComponent.getHeight() - insets.top - insets.bottom); + awtComponent.getHeight() - insets.top - insets.bottom); set ("allow_shrink", resizable); set ("allow_grow", resizable); } - native void setSize (int width, int height); native void setBoundsCallback (Window window, int x, int y, int width, int height); @@ -159,7 +169,13 @@ public class GtkWindowPeer extends GtkContainerPeer insets.bottom = bottom; insets.right = right; - awtComponent.validate(); + synchronized (latestInsets) + { + latestInsets.top = top; + latestInsets.left = left; + latestInsets.bottom = bottom; + latestInsets.right = right; + } } else { @@ -178,15 +194,21 @@ public class GtkWindowPeer extends GtkContainerPeer frame_y, frame_width, frame_height); - - if (frame_width != awtComponent.getWidth() - || frame_height != awtComponent.getHeight()) - setSize (width, height); - - awtComponent.validate(); } } + awtComponent.validate(); } - native public void setVisible (boolean b); + native void nativeSetVisible (boolean b); + public void setVisible (boolean b) + { + // Prevent the window manager from automatically placing this + // window when it is shown. + if (b) + setBounds (awtComponent.getX(), + awtComponent.getY(), + awtComponent.getWidth(), + awtComponent.getHeight()); + nativeSetVisible (b); + } } -- cgit v1.2.3