37 |
|
|
38 |
|
|
39 |
#include "gtkpeer.h" |
#include "gtkpeer.h" |
|
#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" |
|
40 |
#include "gnu_java_awt_peer_gtk_GtkWindowPeer.h" |
#include "gnu_java_awt_peer_gtk_GtkWindowPeer.h" |
|
#include "gnu_java_awt_peer_gtk_GtkFramePeer.h" |
|
41 |
#include <gdk/gdkprivate.h> |
#include <gdk/gdkprivate.h> |
42 |
#include <gdk/gdkx.h> |
#include <gdk/gdkx.h> |
43 |
#include <X11/Xatom.h> |
#include <X11/Xatom.h> |
56 |
XEvent *xevent, |
XEvent *xevent, |
57 |
XPointer arg); |
XPointer arg); |
58 |
|
|
|
static GtkLayout *find_layout (GtkWindow *window); |
|
|
|
|
59 |
static void window_delete_cb (GtkWidget *widget, GdkEvent *event, |
static void window_delete_cb (GtkWidget *widget, GdkEvent *event, |
60 |
jobject peer); |
jobject peer); |
61 |
static void window_destroy_cb (GtkWidget *widget, GdkEvent *event, |
static void window_destroy_cb (GtkWidget *widget, GdkEvent *event, |
89 |
GtkWidget *window_widget; |
GtkWidget *window_widget; |
90 |
GtkWindow *window; |
GtkWindow *window; |
91 |
void *window_parent; |
void *window_parent; |
92 |
GtkWidget *vbox; |
GtkWidget *fixed; |
|
GtkWidget *layout; |
|
93 |
int top = 0; |
int top = 0; |
94 |
int left = 0; |
int left = 0; |
95 |
int bottom = 0; |
int bottom = 0; |
119 |
|
|
120 |
gtk_window_group_add_window (global_gtk_window_group, window); |
gtk_window_group_add_window (global_gtk_window_group, window); |
121 |
|
|
122 |
vbox = gtk_vbox_new (0, 0); |
fixed = gtk_fixed_new (); |
123 |
layout = gtk_layout_new (NULL, NULL); |
gtk_container_add (GTK_CONTAINER (window_widget), fixed); |
|
gtk_box_pack_end (GTK_BOX (vbox), layout, 1, 1, 0); |
|
|
gtk_container_add (GTK_CONTAINER (window_widget), vbox); |
|
124 |
|
|
125 |
gtk_widget_show (layout); |
gtk_widget_show (fixed); |
|
gtk_widget_show (vbox); |
|
126 |
gtk_widget_realize (window_widget); |
gtk_widget_realize (window_widget); |
127 |
|
|
128 |
if (decorated) |
if (decorated) |
228 |
(JNIEnv *env, jobject obj) |
(JNIEnv *env, jobject obj) |
229 |
{ |
{ |
230 |
void *ptr; |
void *ptr; |
|
GtkLayout *layout; |
|
231 |
|
|
232 |
ptr = NSA_GET_PTR (env, obj); |
ptr = NSA_GET_PTR (env, obj); |
233 |
|
|
234 |
gdk_threads_enter (); |
gdk_threads_enter (); |
235 |
|
|
236 |
layout = find_layout (GTK_WINDOW (ptr)); |
gtk_widget_realize (GTK_WIDGET (ptr)); |
|
|
|
|
gtk_widget_realize (GTK_WIDGET (layout)); |
|
|
|
|
|
connect_awt_hook (env, obj, 1, layout->bin_window); |
|
|
|
|
|
gtk_widget_realize (ptr); |
|
237 |
|
|
238 |
connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window); |
connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window); |
239 |
|
|
246 |
{ |
{ |
247 |
void *ptr; |
void *ptr; |
248 |
jobject *gref; |
jobject *gref; |
|
GtkLayout *layout; |
|
249 |
|
|
250 |
ptr = NSA_GET_PTR (env, obj); |
ptr = NSA_GET_PTR (env, obj); |
|
|
|
251 |
gref = NSA_GET_GLOBAL_REF (env, obj); |
gref = NSA_GET_GLOBAL_REF (env, obj); |
252 |
|
|
253 |
gdk_threads_enter (); |
gdk_threads_enter (); |
254 |
|
|
255 |
gtk_widget_realize (ptr); |
gtk_widget_realize (GTK_WIDGET (ptr)); |
|
|
|
|
/* Receive events from the GtkLayout too */ |
|
|
layout = find_layout (GTK_WINDOW (ptr)); |
|
256 |
|
|
257 |
g_signal_connect (G_OBJECT (layout), "event", |
g_signal_connect (G_OBJECT (ptr), "event", |
258 |
G_CALLBACK (pre_event_handler), *gref); |
G_CALLBACK (pre_event_handler), *gref); |
259 |
|
|
|
/* Connect signals for window event support. */ |
|
260 |
g_signal_connect (G_OBJECT (ptr), "delete-event", |
g_signal_connect (G_OBJECT (ptr), "delete-event", |
261 |
G_CALLBACK (window_delete_cb), *gref); |
G_CALLBACK (window_delete_cb), *gref); |
262 |
|
|
285 |
G_CALLBACK (window_property_changed_cb), *gref); |
G_CALLBACK (window_property_changed_cb), *gref); |
286 |
|
|
287 |
gdk_threads_leave (); |
gdk_threads_leave (); |
|
|
|
|
/* Connect the superclass signals. */ |
|
|
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj); |
|
288 |
} |
} |
289 |
|
|
|
/* |
|
|
* Lower the z-level of a window. |
|
|
*/ |
|
|
|
|
290 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
291 |
Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toBack (JNIEnv *env, |
Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toBack (JNIEnv *env, |
292 |
jobject obj) |
jobject obj) |
295 |
ptr = NSA_GET_PTR (env, obj); |
ptr = NSA_GET_PTR (env, obj); |
296 |
|
|
297 |
gdk_threads_enter (); |
gdk_threads_enter (); |
298 |
|
|
299 |
gdk_window_lower (GTK_WIDGET (ptr)->window); |
gdk_window_lower (GTK_WIDGET (ptr)->window); |
300 |
|
gdk_flush (); |
301 |
|
|
|
XFlush (GDK_DISPLAY ()); |
|
302 |
gdk_threads_leave (); |
gdk_threads_leave (); |
303 |
} |
} |
304 |
|
|
|
/* |
|
|
* Raise the z-level of a window. |
|
|
*/ |
|
|
|
|
305 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
306 |
Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toFront (JNIEnv *env, |
Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toFront (JNIEnv *env, |
307 |
jobject obj) |
jobject obj) |
310 |
ptr = NSA_GET_PTR (env, obj); |
ptr = NSA_GET_PTR (env, obj); |
311 |
|
|
312 |
gdk_threads_enter (); |
gdk_threads_enter (); |
313 |
|
|
314 |
gdk_window_raise (GTK_WIDGET (ptr)->window); |
gdk_window_raise (GTK_WIDGET (ptr)->window); |
315 |
|
gdk_flush (); |
316 |
|
|
|
XFlush (GDK_DISPLAY ()); |
|
317 |
gdk_threads_leave (); |
gdk_threads_leave (); |
318 |
} |
} |
319 |
|
|
339 |
height = (height < 1) ? 1 : height; |
height = (height < 1) ? 1 : height; |
340 |
|
|
341 |
gdk_threads_enter (); |
gdk_threads_enter (); |
342 |
|
|
343 |
gtk_widget_set_size_request (GTK_WIDGET(ptr), width, height); |
gtk_widget_set_size_request (GTK_WIDGET(ptr), width, height); |
344 |
|
|
345 |
gdk_threads_leave (); |
gdk_threads_leave (); |
346 |
} |
} |
347 |
|
|
380 |
gdk_threads_leave (); |
gdk_threads_leave (); |
381 |
} |
} |
382 |
|
|
|
JNIEXPORT void JNICALL |
|
|
Java_gnu_java_awt_peer_gtk_GtkFramePeer_removeMenuBarPeer |
|
|
(JNIEnv *env, jobject obj) |
|
|
{ |
|
|
void *wptr; |
|
|
GtkWidget *box; |
|
|
GtkWidget *mptr; |
|
|
GList* children; |
|
|
|
|
|
wptr = NSA_GET_PTR (env, obj); |
|
|
|
|
|
gdk_threads_enter (); |
|
|
|
|
|
box = GTK_BIN (wptr)->child; |
|
|
|
|
|
children = gtk_container_get_children (GTK_CONTAINER (box)); |
|
|
|
|
|
while (children != NULL && !GTK_IS_MENU_SHELL (children->data)) |
|
|
{ |
|
|
children = children->next; |
|
|
} |
|
|
|
|
|
/* If there isn't a MenuBar in this Frame's list of children |
|
|
then we can just return. */ |
|
|
if (!GTK_IS_MENU_SHELL (children->data)) |
|
|
return; |
|
|
else |
|
|
mptr = children->data; |
|
|
|
|
|
/* This will actually destroy the MenuBar. By removing it from |
|
|
its parent, the reference count for the MenuBar widget will |
|
|
decrement to 0. The widget will be automatically destroyed |
|
|
by Gtk. */ |
|
|
gtk_container_remove (GTK_CONTAINER (box), GTK_WIDGET (mptr)); |
|
|
|
|
|
gdk_threads_leave(); |
|
|
} |
|
|
|
|
|
JNIEXPORT void JNICALL |
|
|
Java_gnu_java_awt_peer_gtk_GtkFramePeer_setMenuBarPeer |
|
|
(JNIEnv *env, jobject obj, jobject menubar) |
|
|
{ |
|
|
void *wptr; |
|
|
GtkWidget *mptr; |
|
|
GtkWidget *box; |
|
|
|
|
|
wptr = NSA_GET_PTR (env, obj); |
|
|
mptr = NSA_GET_PTR (env, menubar); |
|
|
|
|
|
gdk_threads_enter (); |
|
|
|
|
|
box = GTK_BIN (wptr)->child; |
|
|
gtk_box_pack_start (GTK_BOX (box), mptr, 0, 0, 0); |
|
|
|
|
|
gtk_widget_show (mptr); |
|
|
|
|
|
|
|
|
gdk_threads_leave (); |
|
|
} |
|
|
|
|
|
JNIEXPORT jint JNICALL |
|
|
Java_gnu_java_awt_peer_gtk_GtkFramePeer_getMenuBarHeight |
|
|
(JNIEnv *env, jobject obj __attribute__((unused)), jobject menubar) |
|
|
{ |
|
|
GtkWidget *ptr; |
|
|
jint height; |
|
|
GtkRequisition gtkreq; |
|
|
|
|
|
ptr = NSA_GET_PTR (env, menubar); |
|
|
|
|
|
gdk_threads_enter (); |
|
|
gtk_widget_size_request (ptr, >kreq); |
|
|
|
|
|
height = gtkreq.height; |
|
|
gdk_threads_leave (); |
|
|
return height; |
|
|
} |
|
|
|
|
|
JNIEXPORT void JNICALL |
|
|
Java_gnu_java_awt_peer_gtk_GtkFramePeer_moveLayout |
|
|
(JNIEnv *env, jobject obj, jint offset) |
|
|
{ |
|
|
void* ptr; |
|
|
GList* children; |
|
|
GtkLayout* layout; |
|
|
GtkWidget* widget; |
|
|
|
|
|
ptr = NSA_GET_PTR (env, obj); |
|
|
|
|
|
gdk_threads_enter (); |
|
|
|
|
|
layout = find_layout (GTK_WINDOW (ptr)); |
|
|
|
|
|
children = gtk_container_get_children (GTK_CONTAINER (layout)); |
|
|
|
|
|
while (children != NULL) |
|
|
{ |
|
|
widget = children->data; |
|
|
gtk_layout_move (layout, widget, widget->allocation.x, |
|
|
widget->allocation.y+offset); |
|
|
children = children->next; |
|
|
} |
|
|
|
|
|
gdk_threads_leave (); |
|
|
} |
|
|
|
|
|
JNIEXPORT void JNICALL |
|
|
Java_gnu_java_awt_peer_gtk_GtkFramePeer_gtkLayoutSetVisible |
|
|
(JNIEnv *env, jobject obj, jboolean visible) |
|
|
{ |
|
|
void *ptr; |
|
|
GtkLayout *layout; |
|
|
|
|
|
ptr = NSA_GET_PTR (env, obj); |
|
|
|
|
|
gdk_threads_enter (); |
|
|
|
|
|
layout = find_layout (GTK_WINDOW (ptr)); |
|
|
|
|
|
if (visible) |
|
|
gtk_widget_show (GTK_WIDGET (layout)); |
|
|
else |
|
|
gtk_widget_hide (GTK_WIDGET (layout)); |
|
|
|
|
|
gdk_threads_leave (); |
|
|
} |
|
|
|
|
|
JNIEXPORT void JNICALL |
|
|
Java_gnu_java_awt_peer_gtk_GtkFramePeer_nativeSetIconImageFromDecoder |
|
|
(JNIEnv *env, jobject obj, jobject decoder) |
|
|
{ |
|
|
void *ptr; |
|
|
GdkPixbufLoader *loader = NULL; |
|
|
GdkPixbuf *pixbuf = NULL; |
|
|
|
|
|
ptr = NSA_GET_PTR (env, obj); |
|
|
|
|
|
loader = NSA_GET_PB_PTR (env, decoder); |
|
|
g_assert (loader != NULL); |
|
|
|
|
|
gdk_threads_enter (); |
|
|
|
|
|
pixbuf = gdk_pixbuf_loader_get_pixbuf (loader); |
|
|
g_assert (pixbuf != NULL); |
|
|
|
|
|
gtk_window_set_icon (GTK_WINDOW (ptr), pixbuf); |
|
|
|
|
|
gdk_threads_leave (); |
|
|
} |
|
|
|
|
|
void free_pixbuf_data (guchar *pixels, gpointer data __attribute__((unused))) |
|
|
{ |
|
|
free(pixels); |
|
|
} |
|
|
|
|
|
JNIEXPORT void JNICALL |
|
|
Java_gnu_java_awt_peer_gtk_GtkFramePeer_nativeSetIconImageFromData |
|
|
(JNIEnv *env, jobject obj, jintArray pixelArray, jint width, jint height) |
|
|
{ |
|
|
void *ptr; |
|
|
GdkPixbuf *pixbuf; |
|
|
jint *pixels; |
|
|
int pixels_length, i; |
|
|
guchar *data; |
|
|
|
|
|
ptr = NSA_GET_PTR (env, obj); |
|
|
|
|
|
pixels = (*env)->GetIntArrayElements (env, pixelArray, 0); |
|
|
pixels_length = (*env)->GetArrayLength (env, pixelArray); |
|
|
|
|
|
data = malloc (sizeof (guchar) * pixels_length); |
|
|
for (i = 0; i < pixels_length; i++) |
|
|
data[i] = (guchar) pixels[i]; |
|
|
|
|
|
gdk_threads_enter (); |
|
|
|
|
|
pixbuf = gdk_pixbuf_new_from_data (data, |
|
|
GDK_COLORSPACE_RGB, |
|
|
TRUE, |
|
|
8, |
|
|
width, |
|
|
height, |
|
|
width*4, |
|
|
free_pixbuf_data, |
|
|
NULL); |
|
|
|
|
|
gtk_window_set_icon (GTK_WINDOW (ptr), pixbuf); |
|
|
|
|
|
gdk_threads_leave (); |
|
|
|
|
|
(*env)->ReleaseIntArrayElements(env, pixelArray, pixels, 0); |
|
|
} |
|
|
|
|
383 |
static void |
static void |
384 |
window_get_frame_extents (GtkWidget *window, |
window_get_frame_extents (GtkWidget *window, |
385 |
int *top, int *left, int *bottom, int *right) |
int *top, int *left, int *bottom, int *right) |
564 |
postWindowEventID, |
postWindowEventID, |
565 |
(jint) AWT_WINDOW_GAINED_FOCUS, |
(jint) AWT_WINDOW_GAINED_FOCUS, |
566 |
(jobject) NULL, (jint) 0); |
(jobject) NULL, (jint) 0); |
567 |
|
/* FIXME: somewhere after this is handled, the child window is |
568 |
|
getting an expose event. */ |
569 |
return FALSE; |
return FALSE; |
570 |
} |
} |
571 |
|
|
578 |
postWindowEventID, |
postWindowEventID, |
579 |
(jint) AWT_WINDOW_LOST_FOCUS, |
(jint) AWT_WINDOW_LOST_FOCUS, |
580 |
(jobject) NULL, (jint) 0); |
(jobject) NULL, (jint) 0); |
581 |
|
/* FIXME: somewhere after this is handled, the child window is |
582 |
|
getting an expose event. */ |
583 |
return FALSE; |
return FALSE; |
584 |
} |
} |
585 |
|
|
707 |
|
|
708 |
return FALSE; |
return FALSE; |
709 |
} |
} |
|
|
|
|
static GtkLayout * |
|
|
find_layout (GtkWindow *window) |
|
|
{ |
|
|
GList* children; |
|
|
GtkBox* vbox; |
|
|
GtkLayout* layout; |
|
|
|
|
|
children = gtk_container_get_children (GTK_CONTAINER (window)); |
|
|
vbox = children->data; |
|
|
g_assert (GTK_IS_VBOX (vbox)); |
|
|
|
|
|
children = gtk_container_get_children (GTK_CONTAINER (vbox)); |
|
|
do |
|
|
{ |
|
|
layout = children->data; |
|
|
children = children->next; |
|
|
} |
|
|
while (!GTK_IS_LAYOUT (layout) && children != NULL); |
|
|
g_assert (GTK_IS_LAYOUT (layout)); |
|
|
|
|
|
return layout; |
|
|
} |
|