aboutsummaryrefslogtreecommitdiff
path: root/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c')
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c185
1 files changed, 100 insertions, 85 deletions
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 a8e745ec0f4..b0177c90a47 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
@@ -65,8 +65,8 @@ static void window_active_state_change_cb (GtkWidget *widget,
GParamSpec *pspec,
jobject peer);
static void window_focus_state_change_cb (GtkWidget *widget,
- GParamSpec *pspec,
- jobject peer);
+ GParamSpec *pspec,
+ jobject peer);
static gboolean window_focus_in_cb (GtkWidget * widget,
GdkEventFocus *event,
jobject peer);
@@ -80,6 +80,7 @@ static jint window_get_new_state (GtkWidget *widget);
static gboolean window_property_changed_cb (GtkWidget *widget,
GdkEventProperty *event,
jobject peer);
+static void realize_cb (GtkWidget *widget, jobject peer);
/* Union used for type punning. */
union extents_union
@@ -94,23 +95,14 @@ union atom_list_union
Atom **atom_list;
};
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create
- (JNIEnv *env, jobject obj, jint type, jboolean decorated,
- jint width, jint height, jobject parent, jintArray jinsets)
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create
+ (JNIEnv *env, jobject obj, jint type, jboolean decorated, jobject parent)
{
GtkWidget *window_widget;
GtkWindow *window;
void *window_parent;
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);
@@ -137,31 +129,8 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create
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 ();
- (*env)->ReleaseIntArrayElements (env, jinsets, insets, 0);
-
NSA_SET_PTR (env, obj, window_widget);
}
@@ -278,6 +247,9 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals
G_CALLBACK (window_property_changed_cb), *gref);
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);
gdk_threads_leave ();
@@ -320,7 +292,7 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setBoundsCallback
{
/* Circumvent package-private access to call Window's
setBoundsCallback method. */
- (*gdk_env)->CallVoidMethod (gdk_env, window, setBoundsCallbackID,
+ (*gdk_env())->CallVoidMethod (gdk_env(), window, setBoundsCallbackID,
x, y, width, height);
}
@@ -428,9 +400,7 @@ request_frame_extents (GtkWidget *window)
/* Check if the current window manager supports
_NET_REQUEST_FRAME_EXTENTS. */
- /* FIXME: The window->window != NULL check is a workaround for bug
- http://bugzilla.gnome.org/show_bug.cgi?id=17952. */
- if (gdk_net_wm_supports (request_extents) && window->window != NULL)
+ if (gdk_net_wm_supports (request_extents))
{
GdkDisplay *display = gtk_widget_get_display (window);
Display *xdisplay = GDK_DISPLAY_XDISPLAY (display);
@@ -483,9 +453,9 @@ property_notify_predicate (Display *xdisplay __attribute__((unused)),
if (event->xany.type == PropertyNotify
&& event->xany.window == *window
&& event->xproperty.atom == extents_atom)
- return True;
+ return True;
else
- return False;
+ return False;
}
static void
@@ -493,10 +463,12 @@ window_delete_cb (GtkWidget *widget __attribute__((unused)),
GdkEvent *event __attribute__((unused)),
jobject peer)
{
- (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ gdk_threads_leave ();
+ (*gdk_env())->CallVoidMethod (gdk_env(), peer,
postWindowEventID,
(jint) AWT_WINDOW_CLOSING,
(jobject) NULL, (jint) 0);
+ gdk_threads_enter ();
}
static void
@@ -504,20 +476,24 @@ window_destroy_cb (GtkWidget *widget __attribute__((unused)),
GdkEvent *event __attribute__((unused)),
jobject peer)
{
- (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ gdk_threads_leave ();
+ (*gdk_env())->CallVoidMethod (gdk_env(), peer,
postWindowEventID,
(jint) AWT_WINDOW_CLOSED,
(jobject) NULL, (jint) 0);
+ gdk_threads_enter ();
}
static void
window_show_cb (GtkWidget *widget __attribute__((unused)),
jobject peer)
{
- (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ gdk_threads_leave ();
+ (*gdk_env())->CallVoidMethod (gdk_env(), peer,
postWindowEventID,
(jint) AWT_WINDOW_OPENED,
(jobject) NULL, (jint) 0);
+ gdk_threads_enter ();
}
static void
@@ -528,47 +504,53 @@ window_active_state_change_cb (GtkWidget *widget __attribute__((unused)),
/* FIXME: not sure if this is needed or not. */
/* Remove the unused attributes if you fix the below. */
#if 0
- if (GTK_WINDOW (widget)->is_active)
- (*gdk_env)->CallVoidMethod (gdk_env, peer,
- postWindowEventID,
- (jint) AWT_WINDOW_GAINED_FOCUS,
- (jobject) NULL, (jint) 0);
- else
- (*gdk_env)->CallVoidMethod (gdk_env, peer,
- postWindowEventID,
- (jint) AWT_WINDOW_DEACTIVATED,
- (jobject) NULL, (jint) 0);
+ gdk_threads_leave ();
+ if (GTK_WINDOW (widget)->is_active)
+ (*gdk_env())->CallVoidMethod (gdk_env(), peer,
+ postWindowEventID,
+ (jint) AWT_WINDOW_GAINED_FOCUS,
+ (jobject) NULL, (jint) 0);
+ else
+ (*gdk_env())->CallVoidMethod (gdk_env(), peer,
+ postWindowEventID,
+ (jint) AWT_WINDOW_DEACTIVATED,
+ (jobject) NULL, (jint) 0);
+ gdk_threads_enter ();
#endif
- }
+}
static void
window_focus_state_change_cb (GtkWidget *widget,
GParamSpec *pspec __attribute__((unused)),
jobject peer)
{
+ gdk_threads_leave ();
if (GTK_WINDOW (widget)->has_toplevel_focus)
- (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ (*gdk_env())->CallVoidMethod (gdk_env(), peer,
postWindowEventID,
(jint) AWT_WINDOW_ACTIVATED,
(jobject) NULL, (jint) 0);
else
- (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ (*gdk_env())->CallVoidMethod (gdk_env(), peer,
postWindowEventID,
(jint) AWT_WINDOW_DEACTIVATED,
- (jobject) NULL, (jint) 0);
- }
+ (jobject) NULL, (jint) 0);
+ gdk_threads_enter ();
+}
static gboolean
window_focus_in_cb (GtkWidget * widget __attribute__((unused)),
GdkEventFocus *event __attribute__((unused)),
jobject peer)
{
- (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ gdk_threads_leave ();
+ (*gdk_env())->CallVoidMethod (gdk_env(), peer,
postWindowEventID,
(jint) AWT_WINDOW_GAINED_FOCUS,
(jobject) NULL, (jint) 0);
/* FIXME: somewhere after this is handled, the child window is
getting an expose event. */
+ gdk_threads_enter ();
return FALSE;
}
@@ -577,12 +559,14 @@ window_focus_out_cb (GtkWidget * widget __attribute__((unused)),
GdkEventFocus *event __attribute__((unused)),
jobject peer)
{
- (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ gdk_threads_leave ();
+ (*gdk_env())->CallVoidMethod (gdk_env(), peer,
postWindowEventID,
(jint) AWT_WINDOW_LOST_FOCUS,
(jobject) NULL, (jint) 0);
/* FIXME: somewhere after this is handled, the child window is
getting an expose event. */
+ gdk_threads_enter ();
return FALSE;
}
@@ -600,18 +584,22 @@ window_window_state_cb (GtkWidget *widget,
if (event->window_state.new_window_state & GDK_WINDOW_STATE_ICONIFIED)
{
/* We've been iconified. */
- (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ gdk_threads_leave ();
+ (*gdk_env())->CallVoidMethod (gdk_env(), peer,
postWindowEventID,
(jint) AWT_WINDOW_ICONIFIED,
(jobject) NULL, (jint) 0);
+ gdk_threads_enter ();
}
else
{
/* We've been deiconified. */
- (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ gdk_threads_leave ();
+ (*gdk_env())->CallVoidMethod (gdk_env(), peer,
postWindowEventID,
(jint) AWT_WINDOW_DEICONIFIED,
(jobject) NULL, (jint) 0);
+ gdk_threads_enter ();
}
}
@@ -624,10 +612,12 @@ window_window_state_cb (GtkWidget *widget,
new_state |= window_get_new_state (widget);
- (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ gdk_threads_leave ();
+ (*gdk_env())->CallVoidMethod (gdk_env(), peer,
postWindowEventID,
(jint) AWT_WINDOW_STATE_CHANGED,
(jobject) NULL, new_state);
+ gdk_threads_enter ();
return TRUE;
}
@@ -680,19 +670,6 @@ window_property_changed_cb (GtkWidget *widget __attribute__((unused)),
unsigned long *extents;
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;
if (gdk_atom_intern ("_NET_FRAME_EXTENTS", FALSE) == event->atom
&& gdk_property_get (event->window,
@@ -705,12 +682,50 @@ window_property_changed_cb (GtkWidget *widget __attribute__((unused)),
NULL,
NULL,
gu_ex.gu_extents))
- (*gdk_env)->CallVoidMethod (gdk_env, peer,
- postInsetsChangedEventID,
- (jint) extents[2], /* top */
- (jint) extents[0], /* left */
- (jint) extents[3], /* bottom */
- (jint) extents[1]); /* right */
+ {
+ gdk_threads_leave ();
+ (*gdk_env())->CallVoidMethod (gdk_env(), peer,
+ postInsetsChangedEventID,
+ (jint) extents[2], /* top */
+ (jint) extents[0], /* left */
+ (jint) extents[3], /* bottom */
+ (jint) extents[1]); /* right */
+ gdk_threads_enter ();
+ }
+
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));
+}