Commit d5c9fbd9 by Thomas Fitzsimmons Committed by Thomas Fitzsimmons

re PR awt/17952 (Windows don't show with window manager that supports _NET_REQUEST_FRAME_EXTENTS)

2005-02-22  Thomas Fitzsimmons  <fitzsim@redhat.com>

	PR libgcj/17952:
	* gnu/java/awt/peer/gtk/GtkWindowPeer.java,
	jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
	(getWidth): New method.
	(getHeight): Likewise.
	(create): Remove width, height and insets parameters.  Move size
	setup ...
	(realize_cb): ... here.  New function.
	(connectSignals): Connect realize_cb.
	(request_frame_extents): Remove FIXME.  Move
	postInsetsChangedEvent lookup ...
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c (gtkInit):
	... here.  Look up GtkWindowPeer getWidth and getHeight methods.
	* jni/gtk-peer/gtkpeer.h (postInsetsChangedEventID): Declare
	jmethodID.
	(windowGetWidthID): Likewise.
	(windowGetHeightID): Likewise.

From-SVN: r95383
parent cb635293
2005-02-22 Thomas Fitzsimmons <fitzsim@redhat.com>
PR libgcj/17952:
* gnu/java/awt/peer/gtk/GtkWindowPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
(getWidth): New method.
(getHeight): Likewise.
(create): Remove width, height and insets parameters. Move size
setup ...
(realize_cb): ... here. New function.
(connectSignals): Connect realize_cb.
(request_frame_extents): Remove FIXME. Move
postInsetsChangedEvent lookup ...
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c (gtkInit):
... here. Look up GtkWindowPeer getWidth and getHeight methods.
* jni/gtk-peer/gtkpeer.h (postInsetsChangedEventID): Declare
jmethodID.
(windowGetWidthID): Likewise.
(windowGetHeightID): Likewise.
2005-02-21 Thomas Fitzsimmons <fitzsim@redhat.com> 2005-02-21 Thomas Fitzsimmons <fitzsim@redhat.com>
PR libgcj/19842 PR libgcj/19842
......
...@@ -63,30 +63,27 @@ public class GtkWindowPeer extends GtkContainerPeer ...@@ -63,30 +63,27 @@ public class GtkWindowPeer extends GtkContainerPeer
native void gtkWindowSetResizable (boolean resizable); native void gtkWindowSetResizable (boolean resizable);
native void gtkWindowSetModal (boolean modal); native void gtkWindowSetModal (boolean modal);
native void create (int type, boolean decorated, int getWidth ()
int width, int height, {
GtkWindowPeer parent, return awtComponent.getWidth();
int[] insets); }
int getHeight ()
{
return awtComponent.getHeight();
}
native void create (int type, boolean decorated, GtkWindowPeer parent);
void create (int type, boolean decorated) void create (int type, boolean decorated)
{ {
GtkWindowPeer parent_peer = null; GtkWindowPeer parent_peer = null;
Component parent = awtComponent.getParent(); Component parent = awtComponent.getParent();
int[] insets = new int [] { 0, 0, 0, 0 };
if (parent != null) if (parent != null)
parent_peer = (GtkWindowPeer) awtComponent.getParent().getPeer(); parent_peer = (GtkWindowPeer) awtComponent.getParent().getPeer();
create (type, decorated, create (type, decorated, parent_peer);
awtComponent.getWidth(),
awtComponent.getHeight(),
parent_peer,
insets);
this.insets.top = insets [0];
this.insets.left = insets [1];
this.insets.bottom = insets [2];
this.insets.right = insets [3];
} }
void create () void create ()
......
...@@ -62,6 +62,9 @@ jmethodID choicePostItemEventID; ...@@ -62,6 +62,9 @@ jmethodID choicePostItemEventID;
jmethodID postListItemEventID; jmethodID postListItemEventID;
jmethodID postTextEventID; jmethodID postTextEventID;
jmethodID postWindowEventID; jmethodID postWindowEventID;
jmethodID postInsetsChangedEventID;
jmethodID windowGetWidthID;
jmethodID windowGetHeightID;
jmethodID beginNativeRepaintID; jmethodID beginNativeRepaintID;
jmethodID endNativeRepaintID; jmethodID endNativeRepaintID;
...@@ -212,6 +215,14 @@ Java_gnu_java_awt_peer_gtk_GtkToolkit_gtkInit (JNIEnv *env, ...@@ -212,6 +215,14 @@ Java_gnu_java_awt_peer_gtk_GtkToolkit_gtkInit (JNIEnv *env,
postWindowEventID = (*env)->GetMethodID (env, gtkwindowpeer, postWindowEventID = (*env)->GetMethodID (env, gtkwindowpeer,
"postWindowEvent", "postWindowEvent",
"(ILjava/awt/Window;I)V"); "(ILjava/awt/Window;I)V");
postInsetsChangedEventID = (*env)->GetMethodID (env, gtkwindowpeer,
"postInsetsChangedEvent",
"(IIII)V");
windowGetWidthID = (*env)->GetMethodID (env, gtkwindowpeer,
"getWidth", "()I");
windowGetHeightID = (*env)->GetMethodID (env, gtkwindowpeer,
"getHeight", "()I");
postExposeEventID = (*env)->GetMethodID (env, gtkcomponentpeer, postExposeEventID = (*env)->GetMethodID (env, gtkcomponentpeer,
"postExposeEvent", "(IIII)V"); "postExposeEvent", "(IIII)V");
postKeyEventID = (*env)->GetMethodID (env, gtkcomponentpeer, postKeyEventID = (*env)->GetMethodID (env, gtkcomponentpeer,
......
...@@ -80,6 +80,7 @@ static jint window_get_new_state (GtkWidget *widget); ...@@ -80,6 +80,7 @@ static jint window_get_new_state (GtkWidget *widget);
static gboolean window_property_changed_cb (GtkWidget *widget, static gboolean window_property_changed_cb (GtkWidget *widget,
GdkEventProperty *event, GdkEventProperty *event,
jobject peer); jobject peer);
static void realize_cb (GtkWidget *widget, jobject peer);
/* Union used for type punning. */ /* Union used for type punning. */
union extents_union union extents_union
...@@ -96,21 +97,12 @@ union atom_list_union ...@@ -96,21 +97,12 @@ union atom_list_union
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create
(JNIEnv *env, jobject obj, jint type, jboolean decorated, (JNIEnv *env, jobject obj, jint type, jboolean decorated, jobject parent)
jint width, jint height, jobject parent, jintArray jinsets)
{ {
GtkWidget *window_widget; GtkWidget *window_widget;
GtkWindow *window; GtkWindow *window;
void *window_parent; void *window_parent;
GtkWidget *fixed; GtkWidget *fixed;
int top = 0;
int left = 0;
int bottom = 0;
int right = 0;
jint *insets;
insets = (*env)->GetIntArrayElements (env, jinsets, 0);
insets[0] = insets[1] = insets[2] = insets[3] = 0;
NSA_SET_GLOBAL_REF (env, obj); NSA_SET_GLOBAL_REF (env, obj);
...@@ -137,31 +129,8 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create ...@@ -137,31 +129,8 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create
gtk_widget_show (fixed); gtk_widget_show (fixed);
if (decorated)
window_get_frame_extents (window_widget, &top, &left, &bottom, &right);
gtk_window_set_default_size (window,
MAX (1, width - left - right),
MAX (1, height - top - bottom));
/* We must set this window's size requisition. Otherwise when a
resize is queued (when gtk_widget_queue_resize is called) the
window will snap to its default requisition of 0x0. If we omit
this call, Frames and Dialogs shrink to degenerate 1x1 windows
when their resizable property changes. */
gtk_widget_set_size_request (window_widget,
MAX (1, width - left - right),
MAX (1, height - top - bottom));
insets[0] = top;
insets[1] = left;
insets[2] = bottom;
insets[3] = right;
gdk_threads_leave (); gdk_threads_leave ();
(*env)->ReleaseIntArrayElements (env, jinsets, insets, 0);
NSA_SET_PTR (env, obj, window_widget); NSA_SET_PTR (env, obj, window_widget);
} }
...@@ -278,6 +247,9 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals ...@@ -278,6 +247,9 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals
G_CALLBACK (window_property_changed_cb), *gref); G_CALLBACK (window_property_changed_cb), *gref);
g_signal_connect_after (G_OBJECT (ptr), "realize", g_signal_connect_after (G_OBJECT (ptr), "realize",
G_CALLBACK (realize_cb), *gref);
g_signal_connect_after (G_OBJECT (ptr), "realize",
G_CALLBACK (connect_awt_hook_cb), *gref); G_CALLBACK (connect_awt_hook_cb), *gref);
gdk_threads_leave (); gdk_threads_leave ();
...@@ -428,9 +400,7 @@ request_frame_extents (GtkWidget *window) ...@@ -428,9 +400,7 @@ request_frame_extents (GtkWidget *window)
/* Check if the current window manager supports /* Check if the current window manager supports
_NET_REQUEST_FRAME_EXTENTS. */ _NET_REQUEST_FRAME_EXTENTS. */
/* FIXME: The window->window != NULL check is a workaround for bug if (gdk_net_wm_supports (request_extents))
http://bugzilla.gnome.org/show_bug.cgi?id=17952. */
if (gdk_net_wm_supports (request_extents) && window->window != NULL)
{ {
GdkDisplay *display = gtk_widget_get_display (window); GdkDisplay *display = gtk_widget_get_display (window);
Display *xdisplay = GDK_DISPLAY_XDISPLAY (display); Display *xdisplay = GDK_DISPLAY_XDISPLAY (display);
...@@ -700,19 +670,6 @@ window_property_changed_cb (GtkWidget *widget __attribute__((unused)), ...@@ -700,19 +670,6 @@ window_property_changed_cb (GtkWidget *widget __attribute__((unused)),
unsigned long *extents; unsigned long *extents;
union extents_union gu_ex; union extents_union gu_ex;
static int id_set = 0;
static jmethodID postInsetsChangedEventID;
if (!id_set)
{
jclass gtkwindowpeer = (*gdk_env())->FindClass (gdk_env(),
"gnu/java/awt/peer/gtk/GtkWindowPeer");
postInsetsChangedEventID = (*gdk_env())->GetMethodID (gdk_env(),
gtkwindowpeer,
"postInsetsChangedEvent",
"(IIII)V");
id_set = 1;
}
gu_ex.extents = &extents; gu_ex.extents = &extents;
if (gdk_atom_intern ("_NET_FRAME_EXTENTS", FALSE) == event->atom if (gdk_atom_intern ("_NET_FRAME_EXTENTS", FALSE) == event->atom
&& gdk_property_get (event->window, && gdk_property_get (event->window,
...@@ -739,3 +696,36 @@ window_property_changed_cb (GtkWidget *widget __attribute__((unused)), ...@@ -739,3 +696,36 @@ window_property_changed_cb (GtkWidget *widget __attribute__((unused)),
return FALSE; return FALSE;
} }
static void
realize_cb (GtkWidget *widget, jobject peer)
{
jint top = 0;
jint left = 0;
jint bottom = 0;
jint right = 0;
jint width = 0;
jint height = 0;
width = (*gdk_env())->CallIntMethod (gdk_env(), peer, windowGetWidthID);
height = (*gdk_env())->CallIntMethod (gdk_env(), peer, windowGetHeightID);
window_get_frame_extents (widget, &top, &left, &bottom, &right);
(*gdk_env())->CallVoidMethod (gdk_env(), peer,
postInsetsChangedEventID,
top, left, bottom, right);
gtk_window_set_default_size (GTK_WINDOW (widget),
MAX (1, width - left - right),
MAX (1, height - top - bottom));
/* set the size like we do in nativeSetBounds */
gtk_widget_set_size_request (widget,
MAX (1, width - left - right),
MAX (1, height - top - bottom));
gtk_window_resize (GTK_WINDOW (widget),
MAX (1, width - left - right),
MAX (1, height - top - bottom));
}
...@@ -465,6 +465,10 @@ extern jmethodID syncAttrsID; ...@@ -465,6 +465,10 @@ extern jmethodID syncAttrsID;
extern jclass gdkColor; extern jclass gdkColor;
extern jmethodID gdkColorID; extern jmethodID gdkColorID;
extern jmethodID postInsetsChangedEventID;
extern jmethodID windowGetWidthID;
extern jmethodID windowGetHeightID;
JNIEnv *gdk_env(void); JNIEnv *gdk_env(void);
extern double dpi_conversion_factor; extern double dpi_conversion_factor;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment