54 |
|
|
55 |
static void request_frame_extents (GtkWidget *window); |
static void request_frame_extents (GtkWidget *window); |
56 |
|
|
57 |
static int property_notify_predicate (Display *xdisplay, |
static Bool property_notify_predicate (Display *display, |
58 |
XEvent *event, |
XEvent *xevent, |
59 |
XPointer window_id); |
XPointer arg); |
60 |
|
|
61 |
|
static GtkLayout *find_layout (GtkWindow *window); |
62 |
|
|
63 |
static void window_delete_cb (GtkWidget *widget, GdkEvent *event, |
static void window_delete_cb (GtkWidget *widget, GdkEvent *event, |
64 |
jobject peer); |
jobject peer); |
65 |
static void window_destroy_cb (GtkWidget *widget, GdkEvent *event, |
static void window_destroy_cb (GtkWidget *widget, GdkEvent *event, |
66 |
jobject peer); |
jobject peer); |
67 |
static void window_show_cb (GtkWidget *widget, jobject peer); |
static void window_show_cb (GtkWidget *widget, jobject peer); |
68 |
static void window_focus_or_active_state_change_cb (GtkWidget *widget, |
static void window_active_state_change_cb (GtkWidget *widget, |
69 |
|
GParamSpec *pspec, |
70 |
|
jobject peer); |
71 |
|
static void window_focus_state_change_cb (GtkWidget *widget, |
72 |
GParamSpec *pspec, |
GParamSpec *pspec, |
73 |
jobject peer); |
jobject peer); |
74 |
|
static gboolean window_focus_in_cb (GtkWidget * widget, |
75 |
|
GdkEventFocus *event, |
76 |
|
jobject peer); |
77 |
|
static gboolean window_focus_out_cb (GtkWidget * widget, |
78 |
|
GdkEventFocus *event, |
79 |
|
jobject peer); |
80 |
static gboolean window_window_state_cb (GtkWidget *widget, |
static gboolean window_window_state_cb (GtkWidget *widget, |
81 |
GdkEvent *event, |
GdkEvent *event, |
82 |
jobject peer); |
jobject peer); |
85 |
GdkEventProperty *event, |
GdkEventProperty *event, |
86 |
jobject peer); |
jobject peer); |
87 |
|
|
|
/* |
|
|
* Make a new window. |
|
|
*/ |
|
|
|
|
88 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
89 |
Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create |
Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create |
90 |
(JNIEnv *env, jobject obj, jint type, jboolean decorated, |
(JNIEnv *env, jobject obj, jint type, jboolean decorated, |
187 |
(JNIEnv *env, jobject obj) |
(JNIEnv *env, jobject obj) |
188 |
{ |
{ |
189 |
void *ptr; |
void *ptr; |
190 |
GtkWidget* vbox, *layout; |
GtkLayout *layout; |
|
GList* children; |
|
191 |
|
|
192 |
ptr = NSA_GET_PTR (env, obj); |
ptr = NSA_GET_PTR (env, obj); |
193 |
|
|
194 |
gdk_threads_enter (); |
gdk_threads_enter (); |
195 |
|
|
196 |
children = gtk_container_get_children(GTK_CONTAINER(ptr)); |
layout = find_layout (GTK_WINDOW (ptr)); |
|
vbox = children->data; |
|
|
g_assert (GTK_IS_VBOX(vbox)); |
|
197 |
|
|
198 |
children = gtk_container_get_children(GTK_CONTAINER(vbox)); |
gtk_widget_realize (GTK_WIDGET (layout)); |
|
do |
|
|
{ |
|
|
layout = children->data; |
|
|
children = children->next; |
|
|
} |
|
|
while (!GTK_IS_LAYOUT (layout) && children != NULL); |
|
|
g_assert (GTK_IS_LAYOUT(layout)); |
|
199 |
|
|
200 |
gtk_widget_realize (layout); |
connect_awt_hook (env, obj, 1, layout->bin_window); |
|
|
|
|
connect_awt_hook (env, obj, 1, GTK_LAYOUT (layout)->bin_window); |
|
201 |
|
|
202 |
gtk_widget_realize (ptr); |
gtk_widget_realize (ptr); |
203 |
|
|
210 |
Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals |
Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals |
211 |
(JNIEnv *env, jobject obj) |
(JNIEnv *env, jobject obj) |
212 |
{ |
{ |
213 |
void *ptr = NSA_GET_PTR (env, obj); |
void *ptr; |
214 |
jobject *gref = NSA_GET_GLOBAL_REF (env, obj); |
jobject *gref; |
215 |
GtkWidget* vbox, *layout; |
GtkLayout *layout; |
216 |
GList* children; |
|
217 |
g_assert (gref); |
ptr = NSA_GET_PTR (env, obj); |
218 |
|
|
219 |
|
gref = NSA_GET_GLOBAL_REF (env, obj); |
220 |
|
|
221 |
gdk_threads_enter (); |
gdk_threads_enter (); |
222 |
|
|
223 |
gtk_widget_realize (ptr); |
gtk_widget_realize (ptr); |
224 |
|
|
225 |
/* Receive events from the GtkLayout too */ |
/* Receive events from the GtkLayout too */ |
226 |
children = gtk_container_get_children(GTK_CONTAINER(ptr)); |
layout = find_layout (GTK_WINDOW (ptr)); |
|
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)); |
|
227 |
|
|
228 |
g_signal_connect (GTK_OBJECT (layout), "event", |
g_signal_connect (G_OBJECT (layout), "event", |
229 |
G_CALLBACK (pre_event_handler), *gref); |
G_CALLBACK (pre_event_handler), *gref); |
230 |
|
|
231 |
/* Connect signals for window event support. */ |
/* Connect signals for window event support. */ |
238 |
g_signal_connect (G_OBJECT (ptr), "show", |
g_signal_connect (G_OBJECT (ptr), "show", |
239 |
G_CALLBACK (window_show_cb), *gref); |
G_CALLBACK (window_show_cb), *gref); |
240 |
|
|
241 |
g_signal_connect (G_OBJECT (ptr), "notify", |
g_signal_connect (G_OBJECT (ptr), "notify::is-active", |
242 |
G_CALLBACK (window_focus_or_active_state_change_cb), *gref); |
G_CALLBACK (window_active_state_change_cb), *gref); |
243 |
|
|
244 |
|
g_signal_connect (G_OBJECT (ptr), "notify::has-toplevel-focus", |
245 |
|
G_CALLBACK (window_focus_state_change_cb), *gref); |
246 |
|
|
247 |
|
g_signal_connect (G_OBJECT (ptr), "focus-in-event", |
248 |
|
G_CALLBACK (window_focus_in_cb), *gref); |
249 |
|
|
250 |
|
g_signal_connect (G_OBJECT (ptr), "focus-out-event", |
251 |
|
G_CALLBACK (window_focus_out_cb), *gref); |
252 |
|
|
253 |
g_signal_connect (G_OBJECT (ptr), "window-state-event", |
g_signal_connect (G_OBJECT (ptr), "window-state-event", |
254 |
G_CALLBACK (window_window_state_cb), *gref); |
G_CALLBACK (window_window_state_cb), *gref); |
443 |
{ |
{ |
444 |
void* ptr; |
void* ptr; |
445 |
GList* children; |
GList* children; |
|
GtkBox* vbox; |
|
446 |
GtkLayout* layout; |
GtkLayout* layout; |
447 |
GtkWidget* widget; |
GtkWidget* widget; |
448 |
|
|
450 |
|
|
451 |
gdk_threads_enter (); |
gdk_threads_enter (); |
452 |
|
|
453 |
children = gtk_container_get_children (GTK_CONTAINER (ptr)); |
layout = find_layout (GTK_WINDOW (ptr)); |
|
vbox = children->data; |
|
|
g_assert (GTK_IS_VBOX (vbox)); |
|
454 |
|
|
|
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)); |
|
455 |
children = gtk_container_get_children (GTK_CONTAINER (layout)); |
children = gtk_container_get_children (GTK_CONTAINER (layout)); |
456 |
|
|
457 |
while (children != NULL) |
while (children != NULL) |
467 |
|
|
468 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
469 |
Java_gnu_java_awt_peer_gtk_GtkFramePeer_gtkLayoutSetVisible |
Java_gnu_java_awt_peer_gtk_GtkFramePeer_gtkLayoutSetVisible |
470 |
(JNIEnv *env, jobject obj, jboolean vis) |
(JNIEnv *env, jobject obj, jboolean visible) |
471 |
{ |
{ |
472 |
void* ptr; |
void* ptr; |
|
GList* children; |
|
|
GtkBox* vbox; |
|
473 |
GtkLayout* layout; |
GtkLayout* layout; |
474 |
|
|
475 |
ptr = NSA_GET_PTR (env, obj); |
ptr = NSA_GET_PTR (env, obj); |
476 |
|
|
477 |
gdk_threads_enter (); |
gdk_threads_enter (); |
478 |
|
|
479 |
children = gtk_container_get_children (GTK_CONTAINER (ptr)); |
layout = find_layout (GTK_WINDOW (ptr)); |
|
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)); |
|
480 |
|
|
481 |
if (vis) |
if (visible) |
482 |
gtk_widget_show (GTK_WIDGET (layout)); |
gtk_widget_show (GTK_WIDGET (layout)); |
483 |
else |
else |
484 |
gtk_widget_hide (GTK_WIDGET (layout)); |
gtk_widget_hide (GTK_WIDGET (layout)); |
485 |
|
|
486 |
gdk_threads_leave (); |
gdk_threads_leave (); |
487 |
} |
} |
488 |
|
|
489 |
static void |
static void |
490 |
window_get_frame_extents (GtkWidget *window, |
window_get_frame_extents (GtkWidget *window, |
491 |
int *top, int *left, int *bottom, int *right) |
int *top, int *left, int *bottom, int *right) |
577 |
} |
} |
578 |
} |
} |
579 |
|
|
580 |
static int |
static Bool |
581 |
property_notify_predicate (Display *xdisplay __attribute__((unused)), |
property_notify_predicate (Display *xdisplay __attribute__((unused)), |
582 |
XEvent *event, |
XEvent *event, |
583 |
XPointer window_id) |
XPointer window_id) |
588 |
&& event->xany.window == *window |
&& event->xany.window == *window |
589 |
&& event->xproperty.atom == extents_atom) |
&& event->xproperty.atom == extents_atom) |
590 |
return True; |
return True; |
591 |
|
else |
592 |
return False; |
return False; |
593 |
} |
} |
594 |
|
|
625 |
} |
} |
626 |
|
|
627 |
static void |
static void |
628 |
window_focus_or_active_state_change_cb (GtkWidget *widget, |
window_active_state_change_cb (GtkWidget *widget, |
629 |
GParamSpec *pspec, |
GParamSpec *pspec, |
630 |
jobject peer) |
jobject peer) |
631 |
{ |
{ |
632 |
if (!strcmp (g_param_spec_get_name (pspec), "is-active")) |
/* FIXME: not sure if this is needed or not. */ |
633 |
{ |
#if 0 |
634 |
if (GTK_WINDOW (widget)->is_active) |
if (GTK_WINDOW (widget)->is_active) |
635 |
(*gdk_env)->CallVoidMethod (gdk_env, peer, |
(*gdk_env)->CallVoidMethod (gdk_env, peer, |
636 |
postWindowEventID, |
postWindowEventID, |
641 |
postWindowEventID, |
postWindowEventID, |
642 |
(jint) AWT_WINDOW_DEACTIVATED, |
(jint) AWT_WINDOW_DEACTIVATED, |
643 |
(jobject) NULL, (jint) 0); |
(jobject) NULL, (jint) 0); |
644 |
|
#endif |
645 |
} |
} |
646 |
else if (!strcmp (g_param_spec_get_name (pspec), "has-toplevel-focus")) |
|
647 |
|
static void |
648 |
|
window_focus_state_change_cb (GtkWidget *widget, |
649 |
|
GParamSpec *pspec, |
650 |
|
jobject peer) |
651 |
{ |
{ |
652 |
if (GTK_WINDOW (widget)->has_toplevel_focus) |
if (GTK_WINDOW (widget)->has_toplevel_focus) |
653 |
(*gdk_env)->CallVoidMethod (gdk_env, peer, |
(*gdk_env)->CallVoidMethod (gdk_env, peer, |
657 |
else |
else |
658 |
(*gdk_env)->CallVoidMethod (gdk_env, peer, |
(*gdk_env)->CallVoidMethod (gdk_env, peer, |
659 |
postWindowEventID, |
postWindowEventID, |
660 |
(jint) AWT_WINDOW_LOST_FOCUS, |
(jint) AWT_WINDOW_DEACTIVATED, |
661 |
(jobject) NULL, (jint) 0); |
(jobject) NULL, (jint) 0); |
662 |
} |
} |
663 |
|
|
664 |
|
static gboolean |
665 |
|
window_focus_in_cb (GtkWidget * widget, |
666 |
|
GdkEventFocus *event, |
667 |
|
jobject peer) |
668 |
|
{ |
669 |
|
(*gdk_env)->CallVoidMethod (gdk_env, peer, |
670 |
|
postWindowEventID, |
671 |
|
(jint) AWT_WINDOW_GAINED_FOCUS, |
672 |
|
(jobject) NULL, (jint) 0); |
673 |
|
return FALSE; |
674 |
|
} |
675 |
|
|
676 |
|
static gboolean |
677 |
|
window_focus_out_cb (GtkWidget * widget, |
678 |
|
GdkEventFocus *event, |
679 |
|
jobject peer) |
680 |
|
{ |
681 |
|
(*gdk_env)->CallVoidMethod (gdk_env, peer, |
682 |
|
postWindowEventID, |
683 |
|
(jint) AWT_WINDOW_LOST_FOCUS, |
684 |
|
(jobject) NULL, (jint) 0); |
685 |
|
return FALSE; |
686 |
} |
} |
687 |
|
|
688 |
static gboolean |
static gboolean |
809 |
|
|
810 |
return FALSE; |
return FALSE; |
811 |
} |
} |
812 |
|
|
813 |
|
static GtkLayout * |
814 |
|
find_layout (GtkWindow *window) |
815 |
|
{ |
816 |
|
GList* children; |
817 |
|
GtkBox* vbox; |
818 |
|
GtkLayout* layout; |
819 |
|
|
820 |
|
children = gtk_container_get_children (GTK_CONTAINER (window)); |
821 |
|
vbox = children->data; |
822 |
|
g_assert (GTK_IS_VBOX (vbox)); |
823 |
|
|
824 |
|
children = gtk_container_get_children (GTK_CONTAINER (vbox)); |
825 |
|
do |
826 |
|
{ |
827 |
|
layout = children->data; |
828 |
|
children = children->next; |
829 |
|
} |
830 |
|
while (!GTK_IS_LAYOUT (layout) && children != NULL); |
831 |
|
g_assert (GTK_IS_LAYOUT (layout)); |
832 |
|
|
833 |
|
return layout; |
834 |
|
} |