49 |
static gboolean focus_out_cb (GtkWidget *widget, |
static gboolean focus_out_cb (GtkWidget *widget, |
50 |
GdkEventFocus *event, |
GdkEventFocus *event, |
51 |
jobject peer); |
jobject peer); |
52 |
|
|
53 |
/* |
/* |
54 |
* This method returns a GDK keyval that corresponds to one of the |
* This method returns a GDK keyval that corresponds to one of the |
55 |
* keysyms in the X keymap table. The return value is only used to |
* keysyms in the X keymap table. The return value is only used to |
493 |
if (GTK_IS_WINDOW (parent_widget)) |
if (GTK_IS_WINDOW (parent_widget)) |
494 |
{ |
{ |
495 |
GList *children = gtk_container_children |
GList *children = gtk_container_children |
496 |
(GTK_CONTAINER (GTK_BIN (parent_widget)->child)); |
(GTK_CONTAINER (parent_widget)); |
497 |
|
|
498 |
if (GTK_IS_MENU_BAR (children->data)) |
if (GTK_IS_MENU_BAR (children->data)) |
499 |
gtk_layout_put (GTK_LAYOUT (children->next->data), widget, 0, 0); |
gtk_fixed_put (GTK_FIXED (children->next->data), widget, 0, 0); |
500 |
else |
else |
501 |
gtk_layout_put (GTK_LAYOUT (children->data), widget, 0, 0); |
gtk_fixed_put (GTK_FIXED (children->data), widget, 0, 0); |
502 |
} |
} |
503 |
else |
else |
504 |
if (GTK_IS_SCROLLED_WINDOW (parent_widget)) |
if (GTK_IS_SCROLLED_WINDOW (parent_widget)) |
510 |
|
|
511 |
} |
} |
512 |
else |
else |
513 |
gtk_layout_put (GTK_LAYOUT (parent_widget), widget, 0, 0); |
gtk_fixed_put (GTK_FIXED (parent_widget), widget, 0, 0); |
514 |
|
|
515 |
gdk_threads_leave (); |
gdk_threads_leave (); |
516 |
} |
} |
793 |
else |
else |
794 |
{ |
{ |
795 |
gtk_widget_set_size_request (widget, width, height); |
gtk_widget_set_size_request (widget, width, height); |
796 |
gtk_layout_move (GTK_LAYOUT (widget->parent), widget, x, y); |
gtk_fixed_move (GTK_FIXED (widget->parent), widget, x, y); |
797 |
} |
} |
798 |
|
|
799 |
gdk_threads_leave (); |
gdk_threads_leave (); |
909 |
} |
} |
910 |
|
|
911 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
|
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkSetFont |
|
|
(JNIEnv *env, jobject obj, jstring name, jint style, jint size) |
|
|
{ |
|
|
const char *font_name; |
|
|
void *ptr; |
|
|
PangoFontDescription *font_desc; |
|
|
|
|
|
ptr = NSA_GET_PTR (env, obj); |
|
|
|
|
|
font_name = (*env)->GetStringUTFChars (env, name, NULL); |
|
|
|
|
|
gdk_threads_enter(); |
|
|
|
|
|
font_desc = pango_font_description_from_string (font_name); |
|
|
pango_font_description_set_size (font_desc, size * dpi_conversion_factor); |
|
|
|
|
|
if (style & AWT_STYLE_BOLD) |
|
|
pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); |
|
|
|
|
|
if (style & AWT_STYLE_ITALIC) |
|
|
pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE); |
|
|
|
|
|
gtk_widget_modify_font (GTK_WIDGET(ptr), font_desc); |
|
|
|
|
|
pango_font_description_free (font_desc); |
|
|
|
|
|
gdk_threads_leave(); |
|
|
|
|
|
(*env)->ReleaseStringUTFChars (env, name, font_name); |
|
|
} |
|
|
|
|
|
JNIEXPORT void JNICALL |
|
912 |
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_show |
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_show |
913 |
(JNIEnv *env, jobject obj) |
(JNIEnv *env, jobject obj) |
914 |
{ |
{ |
934 |
gdk_threads_leave(); |
gdk_threads_leave(); |
935 |
} |
} |
936 |
|
|
|
GtkLayout * |
|
|
find_gtk_layout (GtkWidget *parent) |
|
|
{ |
|
|
if (GTK_IS_WINDOW (parent)) |
|
|
{ |
|
|
GList *children = gtk_container_children |
|
|
(GTK_CONTAINER (GTK_BIN (parent)->child)); |
|
|
|
|
|
if (GTK_IS_MENU_BAR (children->data)) |
|
|
return GTK_LAYOUT (children->next->data); |
|
|
else /* GTK_IS_LAYOUT (children->data) */ |
|
|
return GTK_LAYOUT (children->data); |
|
|
} |
|
|
|
|
|
return NULL; |
|
|
} |
|
|
|
|
937 |
JNIEXPORT jboolean JNICALL |
JNIEXPORT jboolean JNICALL |
938 |
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_isEnabled |
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_isEnabled |
939 |
(JNIEnv *env, jobject obj) |
(JNIEnv *env, jobject obj) |
965 |
return retval; |
return retval; |
966 |
} |
} |
967 |
|
|
968 |
static gboolean |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetRepaintArea |
|
filter_expose_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) |
|
|
{ |
|
|
/* |
|
|
* Prevent the default event handler from getting this signal if applicable |
|
|
* FIXME: I came up with these filters by looking for patterns in the unwanted |
|
|
* expose events that are fed back to us from gtk/X. Perhaps there is |
|
|
* a way to prevent them from occuring in the first place. |
|
|
*/ |
|
|
if (event->type == GDK_EXPOSE && (!GTK_IS_LAYOUT(widget) |
|
|
|| event->any.window != widget->window)) |
|
|
{ |
|
|
g_signal_stop_emission_by_name(GTK_OBJECT(widget), "event"); |
|
|
return FALSE; |
|
|
} |
|
|
else |
|
|
{ |
|
|
/* There may be non-expose events that are triggered while we're |
|
|
painting a heavyweight peer. */ |
|
|
return pre_event_handler(widget, event, peer); |
|
|
} |
|
|
} |
|
|
|
|
|
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_addExposeFilter |
|
|
(JNIEnv *env, jobject obj) |
|
|
{ |
|
|
GtkObject *filterobj; |
|
|
GtkWidget *vbox, *layout; |
|
|
GList *children; |
|
|
void *ptr = NSA_GET_PTR (env, obj); |
|
|
jobject *gref = NSA_GET_GLOBAL_REF (env, obj); |
|
|
gulong hid; |
|
|
|
|
|
g_assert (gref); |
|
|
|
|
|
gdk_threads_enter (); |
|
|
|
|
|
/* GtkFramePeer is built as a GtkLayout inside a GtkVBox inside a GtkWindow. |
|
|
Events go to the GtkLayout layer, so we filter them there. */ |
|
|
if (GTK_IS_WINDOW(ptr)) |
|
|
{ |
|
|
children = gtk_container_get_children(GTK_CONTAINER(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)); |
|
|
|
|
|
filterobj = GTK_OBJECT(layout); |
|
|
} |
|
|
else if (GTK_IS_SCROLLED_WINDOW(ptr)) |
|
|
{ |
|
|
/* The event will go to the parent GtkLayout. */ |
|
|
filterobj = GTK_OBJECT(GTK_WIDGET(ptr)->parent); |
|
|
} |
|
|
else |
|
|
{ |
|
|
filterobj = GTK_OBJECT(ptr); |
|
|
} |
|
|
hid = g_signal_handler_find(filterobj, |
|
|
G_SIGNAL_MATCH_FUNC, |
|
|
0, 0, NULL, *pre_event_handler, NULL); |
|
|
if (hid > 0) |
|
|
{ |
|
|
g_signal_handler_block(filterobj, hid); |
|
|
} |
|
|
g_signal_connect( filterobj, "event", |
|
|
G_CALLBACK(filter_expose_event_handler), *gref); |
|
|
|
|
|
gdk_threads_leave (); |
|
|
} |
|
|
|
|
|
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_removeExposeFilter |
|
|
(JNIEnv *env, jobject obj) |
|
|
{ |
|
|
GtkObject *filterobj; |
|
|
GtkWidget *vbox, *layout; |
|
|
GList *children; |
|
|
void *ptr = NSA_GET_PTR (env, obj); |
|
|
jobject *gref = NSA_GET_GLOBAL_REF (env, obj); |
|
|
gulong hid; |
|
|
|
|
|
g_assert (gref); |
|
|
|
|
|
gdk_threads_enter (); |
|
|
|
|
|
/* GtkFramePeer is built as a GtkLayout inside a GtkVBox inside a GtkWindow. |
|
|
Events go to the GtkLayout layer, so we filter them there. */ |
|
|
if (GTK_IS_WINDOW(ptr)) |
|
|
{ |
|
|
children = gtk_container_get_children(GTK_CONTAINER(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)); |
|
|
|
|
|
filterobj = GTK_OBJECT(layout); |
|
|
} |
|
|
else if (GTK_IS_SCROLLED_WINDOW(ptr)) |
|
|
{ |
|
|
/* The event will go to the parent GtkLayout. */ |
|
|
filterobj = GTK_OBJECT(GTK_WIDGET(ptr)->parent); |
|
|
} |
|
|
else |
|
|
{ |
|
|
filterobj = GTK_OBJECT(ptr); |
|
|
} |
|
|
|
|
|
g_signal_handlers_disconnect_by_func (filterobj, |
|
|
*filter_expose_event_handler, *gref); |
|
|
hid = g_signal_handler_find(filterobj, |
|
|
G_SIGNAL_MATCH_FUNC, |
|
|
0, 0, NULL, *pre_event_handler, NULL); |
|
|
if (hid > 0) |
|
|
{ |
|
|
g_signal_handler_unblock(filterobj, hid); |
|
|
} |
|
|
|
|
|
gdk_threads_leave (); |
|
|
} |
|
|
|
|
|
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetQueueDrawArea |
|
969 |
(JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height) |
(JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height) |
970 |
{ |
{ |
971 |
GdkRectangle rect; |
GdkRectangle rect; |
973 |
|
|
974 |
ptr = NSA_GET_PTR (env, obj); |
ptr = NSA_GET_PTR (env, obj); |
975 |
|
|
976 |
rect.x = x + GTK_WIDGET(ptr)->allocation.x; |
gdk_threads_enter (); |
977 |
rect.y = y + GTK_WIDGET(ptr)->allocation.y; |
|
978 |
|
rect.x = x; |
979 |
|
rect.y = y; |
980 |
rect.width = width; |
rect.width = width; |
981 |
rect.height = height; |
rect.height = height; |
982 |
|
|
|
gdk_threads_enter (); |
|
|
|
|
983 |
gdk_window_invalidate_rect (GTK_WIDGET (ptr)->window, &rect, 0); |
gdk_window_invalidate_rect (GTK_WIDGET (ptr)->window, &rect, 0); |
984 |
gdk_window_process_all_updates(); |
gdk_window_process_updates (GTK_WIDGET (ptr)->window, TRUE); |
985 |
|
|
986 |
gdk_threads_leave (); |
gdk_threads_leave (); |
987 |
} |
} |
1005 |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals |
1006 |
(JNIEnv *env, jobject obj) |
(JNIEnv *env, jobject obj) |
1007 |
{ |
{ |
1008 |
void *ptr = NSA_GET_PTR (env, obj); |
void *ptr; |
1009 |
jobject *gref = NSA_GET_GLOBAL_REF (env, obj); |
jobject *gref; |
1010 |
g_assert (gref); |
|
1011 |
|
ptr = NSA_GET_PTR (env, obj); |
1012 |
|
gref = NSA_GET_GLOBAL_REF (env, obj); |
1013 |
|
|
1014 |
gdk_threads_enter (); |
gdk_threads_enter (); |
1015 |
|
|
1016 |
gtk_widget_realize (GTK_WIDGET (ptr)); |
gtk_widget_realize (GTK_WIDGET (ptr)); |
|
|
|
|
/* FIXME: We could check here if this is a scrolled window with a |
|
|
single child that does not have an associated jobject. This |
|
|
means that it is one of our wrapped widgets like List or TextArea |
|
|
and thus we could connect the signal to the child without having |
|
|
to specialize this method. */ |
|
1017 |
|
|
1018 |
/* Connect EVENT signal, which happens _before_ any specific signal. */ |
/* Connect EVENT signal, which happens _before_ any specific signal. */ |
1019 |
|
|
1020 |
g_signal_connect (GTK_OBJECT (ptr), "event", |
g_signal_connect (GTK_OBJECT (ptr), "event", |
1021 |
G_CALLBACK (pre_event_handler), *gref); |
G_CALLBACK (pre_event_handler), *gref); |
1022 |
|
|
1023 |
g_signal_connect (G_OBJECT (ptr), "focus-in-event", |
g_signal_connect (G_OBJECT (ptr), "focus-in-event", |
1049 |
{ |
{ |
1050 |
GtkWidget *bg_color_widget; |
GtkWidget *bg_color_widget; |
1051 |
|
|
1052 |
if (GTK_IS_WINDOW (widget)) |
bg_color_widget = widget; |
|
{ |
|
|
GtkWidget *vbox; |
|
|
GList* children; |
|
|
|
|
|
children = gtk_container_get_children(GTK_CONTAINER(widget)); |
|
|
vbox = children->data; |
|
|
|
|
|
children = gtk_container_get_children(GTK_CONTAINER(vbox)); |
|
|
bg_color_widget = children->data; |
|
|
} |
|
|
else |
|
|
bg_color_widget = widget; |
|
1053 |
|
|
1054 |
return bg_color_widget; |
return bg_color_widget; |
1055 |
} |
} |