summaryrefslogtreecommitdiffstats
path: root/libjava/jni
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/jni')
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c14
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c51
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c11
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c67
-rw-r--r--libjava/jni/gtk-peer/gtkpeer.h2
5 files changed, 103 insertions, 42 deletions
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
index ed94b7d7539..455af68f2bc 100644
--- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
+++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
@@ -172,7 +172,15 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetLocationOnScreen
point = (*env)->GetIntArrayElements (env, jpoint, 0);
gdk_threads_enter ();
+
gdk_window_get_origin (GTK_WIDGET (ptr)->window, point, point+1);
+
+ if (!GTK_IS_CONTAINER (ptr))
+ {
+ *point += GTK_WIDGET(ptr)->allocation.x;
+ *(point+1) += GTK_WIDGET(ptr)->allocation.y;
+ }
+
gdk_threads_leave ();
(*env)->ReleaseIntArrayElements(env, jpoint, point, 0);
@@ -508,18 +516,14 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_lang_String_2Ljava_lang_S
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_lang_String_2Z
- (JNIEnv *env, jobject obj, jstring jname, jboolean jvalue)
+ (JNIEnv *env, jobject obj, jstring jname, jboolean value)
{
const char *name;
- gboolean value;
void *ptr;
ptr = NSA_GET_PTR (env, obj);
name = (*env)->GetStringUTFChars (env, jname, NULL);
- /* Apparently a jboolean can have a value greater than 1. gboolean
- variables may only contain the value TRUE or FALSE. */
- value = jvalue ? TRUE : FALSE;
gdk_threads_enter();
g_object_set(ptr, name, value, NULL);
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 cdcd72e187c..481fadf9d73 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
@@ -981,31 +981,40 @@ awt_event_handler (GdkEvent *event)
if (widget && GTK_WIDGET_TOPLEVEL (widget))
{
gint top, left, right, bottom;
- gint x, y, w, h, wb, d;
+ gint x, y, w, h, d;
+ GdkRectangle r;
- /* calculate our insets */
- gdk_window_get_root_geometry (event->any.window,
- &x, &y, &w, &h, &wb, &d);
+ /* Configure events are not posted to the AWT event
+ queue, and as such, the gdk/gtk peer functions will
+ be called back before postConfigureEvent
+ returns. */
+ gdk_threads_leave ();
- /* We used to compute these based on the configure
- event's fields. However, that gives strange and
- apparently incorrect results. */
- top = left = bottom = right = 0;
+ /* Calculate our insets. */
- /* configure events are not posted to the AWT event queue,
- and as such, gdk/gtk will be called back before
- postConfigureEvent returns */
- gdk_threads_leave ();
- (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr,
+ /* When called from within the gdk_threads critical
+ section these functions seem to return strange
+ results, so we call them after
+ gdk_threads_leave. */
+ gdk_window_get_geometry (event->any.window,
+ &x, &y, &w, &h, &d);
+ gdk_window_get_frame_extents (event->any.window, &r);
+
+ top = y;
+ left = x;
+ bottom = r.height - h - y;
+ right = r.width - w - x;
+
+ (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr,
postConfigureEventID,
- (jint)event->configure.x,
- (jint)event->configure.y,
- (jint)event->configure.width,
- (jint)event->configure.height,
- (jint)top,
- (jint)left,
- (jint)bottom,
- (jint)right);
+ (jint) event->configure.x,
+ (jint) event->configure.y,
+ (jint) event->configure.width,
+ (jint) event->configure.height,
+ (jint) top,
+ (jint) left,
+ (jint) bottom,
+ (jint) right);
gdk_threads_enter ();
}
}
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 f67845a794f..03566f228e4 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
@@ -44,6 +44,8 @@ exception statement from your version. */
struct state_table *native_state_table;
#endif
+jmethodID setBoundsCallbackID;
+
jmethodID postActionEventID;
jmethodID postMenuActionEventID;
jmethodID postMouseEventID;
@@ -74,7 +76,7 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz)
char *homedir, *rcpath = NULL;
/* jclass gtkgenericpeer; */
jclass gtkcomponentpeer, gtkwindowpeer, gtkscrollbarpeer, gtklistpeer,
- gtkmenuitempeer, gtktextcomponentpeer;
+ gtkmenuitempeer, gtktextcomponentpeer, window;
NSA_INIT (env, clazz);
@@ -127,6 +129,9 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz)
/* setup cached IDs for posting GTK events to Java */
/* gtkgenericpeer = (*env)->FindClass (env, */
/* "gnu/java/awt/peer/gtk/GtkGenericPeer"); */
+
+ window = (*env)->FindClass (env, "java/awt/Window");
+
gtkcomponentpeer = (*env)->FindClass (env,
"gnu/java/awt/peer/gtk/GtkComponentPeer");
gtkwindowpeer = (*env)->FindClass (env,
@@ -145,6 +150,10 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz)
/* "postActionEvent", */
/* "(Ljava/lang/String;I)V"); */
+ setBoundsCallbackID = (*env)->GetMethodID (env, window,
+ "setBoundsCallback",
+ "(IIII)V");
+
postMenuActionEventID = (*env)->GetMethodID (env, gtkmenuitempeer,
"postMenuActionEvent",
"()V");
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 982a5cb6052..692c50ecc18 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
@@ -43,20 +43,24 @@ exception statement from your version. */
#include <gdk/gdkx.h>
/*
- * Make a new window (any type)
+ * Make a new window.
*/
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create
- (JNIEnv *env, jobject obj, jint type, jint width, jint height)
+ (JNIEnv *env, jobject obj, jint type, jboolean decorated,
+ jint width, jint height, jobject parent)
{
- GtkWidget *window;
+ GtkWidget *window_widget;
+ GtkWindow *window;
+ void *window_parent;
GtkWidget *vbox, *layout;
gdk_threads_enter ();
- window = gtk_window_new (type);
+ window_widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ window = GTK_WINDOW (window_widget);
- gtk_window_set_default_size (GTK_WINDOW(window), width, height);
+ gtk_window_set_default_size (window, width, height);
/* We must set this window's size requisition. Otherwise when a
resize is queued (when gtk_widget_queue_resize is called) the
@@ -65,17 +69,28 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create
when their resizable property changes. */
gtk_widget_set_size_request (window, width, height);
+ /* Keep this window in front of its parent, if it has one. */
+ if (parent)
+ {
+ window_parent = NSA_GET_PTR (env, parent);
+ gtk_window_set_transient_for (window, GTK_WINDOW(window_parent));
+ }
+
+ gtk_window_set_decorated (window, decorated);
+
+ gtk_window_set_type_hint (window, type);
+
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_container_add (GTK_CONTAINER (window_widget), vbox);
gtk_widget_show (layout);
gtk_widget_show (vbox);
gdk_threads_leave ();
- NSA_SET_PTR (env, obj, window);
+ NSA_SET_PTR (env, obj, window_widget);
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setVisible
@@ -218,20 +233,42 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toFront (JNIEnv *env,
gdk_threads_leave ();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setBounds
- (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height)
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setBoundsCallback
+ (JNIEnv *env, jobject obj, jobject window,
+ jint x, jint y, jint width, jint height)
{
- void *ptr;
- GtkWidget *widget;
+ /* Circumvent package-private access to call Window's
+ setBoundsCallback method. */
+ (*gdk_env)->CallVoidMethod (gdk_env, window, setBoundsCallbackID,
+ x, y, width, height);
+}
- ptr = NSA_GET_PTR (env, obj);
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setSize
+ (JNIEnv *env, jobject obj, jint width, jint height)
+{
+ void *ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
+ gtk_widget_set_size_request (GTK_WIDGET(ptr), width, height);
+ gdk_threads_leave ();
+}
- widget = GTK_WIDGET (ptr);
- gtk_widget_set_size_request (widget, width, height);
- gtk_window_resize (GTK_WINDOW(widget), width, height);
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetBounds
+ (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height)
+{
+ void *ptr = NSA_GET_PTR (env, obj);
+ gdk_threads_enter ();
+ gtk_window_move (GTK_WINDOW(ptr), x, y);
+ /* Need to change the widget's request size. */
+ gtk_widget_set_size_request (GTK_WIDGET(ptr), width, height);
+ /* Also need to call gtk_window_resize. If the resize is requested
+ by the program and the window's "resizable" property is true then
+ the size request will not be honoured. */
+ gtk_window_resize (GTK_WINDOW (ptr), width, height);
gdk_threads_leave ();
}
diff --git a/libjava/jni/gtk-peer/gtkpeer.h b/libjava/jni/gtk-peer/gtkpeer.h
index 2aa7109725a..8f389536227 100644
--- a/libjava/jni/gtk-peer/gtkpeer.h
+++ b/libjava/jni/gtk-peer/gtkpeer.h
@@ -343,6 +343,8 @@ struct graphics
#define AWT_FOCUS_LOST 1004
#define AWT_FOCUS_GAINED 1005
+extern jmethodID setBoundsCallbackID;
+
extern jmethodID postActionEventID;
extern jmethodID postMenuActionEventID;
extern jmethodID postMouseEventID;
OpenPOWER on IntegriCloud