1 /* gtkcomponentpeer.c -- Native implementation of GtkComponentPeer
2 Copyright (C) 1998, 1999, 2002, 2004 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
40 #include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
41 #include <gtk/gtkprivate.h>
42 #include <gdk/gdkkeysyms.h>
44 static GtkWidget
*find_fg_color_widget (GtkWidget
*widget
);
45 static GtkWidget
*find_bg_color_widget (GtkWidget
*widget
);
46 static gboolean
focus_in_cb (GtkWidget
*widget
,
49 static gboolean
focus_out_cb (GtkWidget
*widget
,
54 * 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
56 * determine the keyval's corresponding hardware keycode, and doesn't
57 * reflect an accurate translation of a Java virtual key value to a
64 awt_keycode_to_keysym (jint keyCode
, jint keyLocation
)
66 /* GDK_A through GDK_Z */
67 if (keyCode
>= VK_A
&& keyCode
<= VK_Z
)
68 return gdk_keyval_to_lower (keyCode
);
70 /* GDK_0 through GDK_9 */
71 if (keyCode
>= VK_0
&& keyCode
<= VK_9
)
77 return keyLocation
== AWT_KEY_LOCATION_NUMPAD
? GDK_KP_Enter
: GDK_Return
;
87 return keyLocation
== AWT_KEY_LOCATION_LEFT
? GDK_Shift_L
: GDK_Shift_R
;
89 return keyLocation
== AWT_KEY_LOCATION_LEFT
? GDK_Control_L
: GDK_Control_R
;
91 return keyLocation
== AWT_KEY_LOCATION_LEFT
? GDK_Alt_L
: GDK_Alt_R
;
101 return keyLocation
== AWT_KEY_LOCATION_NUMPAD
? GDK_KP_Page_Up
: GDK_Page_Up
;
103 return keyLocation
== AWT_KEY_LOCATION_NUMPAD
? GDK_KP_Page_Down
: GDK_Page_Down
;
105 return keyLocation
== AWT_KEY_LOCATION_NUMPAD
? GDK_KP_End
: GDK_End
;
107 return keyLocation
== AWT_KEY_LOCATION_NUMPAD
? GDK_KP_Home
: GDK_Home
;
137 return GDK_semicolon
;
168 case VK_OPEN_BRACKET
:
169 return GDK_bracketleft
;
171 return GDK_backslash
;
172 case VK_CLOSE_BRACKET
:
173 return GDK_bracketright
;
195 return GDK_KP_Multiply
;
202 return GDK_KP_Separator
;
204 return GDK_KP_Subtract
;
206 return GDK_KP_Decimal
;
208 return GDK_KP_Divide
;
210 return keyLocation
== AWT_KEY_LOCATION_NUMPAD
? GDK_KP_Delete
: GDK_Delete
;
214 return GDK_Scroll_Lock
;
266 return keyLocation
== AWT_KEY_LOCATION_NUMPAD
? GDK_KP_Insert
: GDK_Insert
;
270 return keyLocation
== AWT_KEY_LOCATION_LEFT
? GDK_Meta_L
: GDK_Meta_R
;
274 return GDK_apostrophe
;
284 return GDK_dead_grave
;
286 return GDK_dead_acute
;
287 case VK_DEAD_CIRCUMFLEX
:
288 return GDK_dead_circumflex
;
290 return GDK_dead_tilde
;
292 return GDK_dead_macron
;
294 return GDK_dead_breve
;
295 case VK_DEAD_ABOVEDOT
:
296 return GDK_dead_abovedot
;
297 case VK_DEAD_DIAERESIS
:
298 return GDK_dead_diaeresis
;
299 case VK_DEAD_ABOVERING
:
300 return GDK_dead_abovering
;
301 case VK_DEAD_DOUBLEACUTE
:
302 return GDK_dead_doubleacute
;
304 return GDK_dead_caron
;
305 case VK_DEAD_CEDILLA
:
306 return GDK_dead_cedilla
;
308 return GDK_dead_ogonek
;
310 return GDK_dead_iota
;
311 case VK_DEAD_VOICED_SOUND
:
312 return GDK_dead_voiced_sound
;
313 case VK_DEAD_SEMIVOICED_SOUND
:
314 return GDK_dead_semivoiced_sound
;
316 return GDK_ampersand
;
326 return GDK_braceleft
;
328 return GDK_braceright
;
334 return GDK_asciicircum
;
339 case VK_EXCLAMATION_MARK
:
341 case VK_INVERTED_EXCLAMATION_MARK
:
342 return GDK_exclamdown
;
343 case VK_LEFT_PARENTHESIS
:
344 return GDK_parenleft
;
346 return GDK_numbersign
;
349 case VK_RIGHT_PARENTHESIS
:
350 return GDK_parenright
;
352 return GDK_underscore
;
360 return GDK_Mode_switch
;
367 case VK_ALPHANUMERIC:
376 case VK_ROMAN_CHARACTERS:
377 case VK_ALL_CANDIDATES:
379 case VK_PREVIOUS_CANDIDATE
:
380 return GDK_PreviousCandidate
;
382 return GDK_Codeinput
;
384 case VK_JAPANESE_KATAKANA:
385 case VK_JAPANESE_HIRAGANA:
386 case VK_JAPANESE_ROMAN:
389 return GDK_Kana_Lock
;
391 case VK_INPUT_METHOD_ON_OFF:
404 return GDK_VoidSymbol
;
409 JNIEXPORT
void JNICALL
410 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursor
411 (JNIEnv
*env
, jobject obj
, jint type
)
415 GdkCursorType gdk_cursor_type
;
416 GdkCursor
*gdk_cursor
;
418 ptr
= NSA_GET_PTR (env
, obj
);
422 case AWT_CROSSHAIR_CURSOR
:
423 gdk_cursor_type
= GDK_CROSSHAIR
;
425 case AWT_TEXT_CURSOR
:
426 gdk_cursor_type
= GDK_XTERM
;
428 case AWT_WAIT_CURSOR
:
429 gdk_cursor_type
= GDK_WATCH
;
431 case AWT_SW_RESIZE_CURSOR
:
432 gdk_cursor_type
= GDK_BOTTOM_LEFT_CORNER
;
434 case AWT_SE_RESIZE_CURSOR
:
435 gdk_cursor_type
= GDK_BOTTOM_RIGHT_CORNER
;
437 case AWT_NW_RESIZE_CURSOR
:
438 gdk_cursor_type
= GDK_TOP_LEFT_CORNER
;
440 case AWT_NE_RESIZE_CURSOR
:
441 gdk_cursor_type
= GDK_TOP_RIGHT_CORNER
;
443 case AWT_N_RESIZE_CURSOR
:
444 gdk_cursor_type
= GDK_TOP_SIDE
;
446 case AWT_S_RESIZE_CURSOR
:
447 gdk_cursor_type
= GDK_BOTTOM_SIDE
;
449 case AWT_W_RESIZE_CURSOR
:
450 gdk_cursor_type
= GDK_LEFT_SIDE
;
452 case AWT_E_RESIZE_CURSOR
:
453 gdk_cursor_type
= GDK_RIGHT_SIDE
;
455 case AWT_HAND_CURSOR
:
456 gdk_cursor_type
= GDK_HAND2
;
458 case AWT_MOVE_CURSOR
:
459 gdk_cursor_type
= GDK_FLEUR
;
462 gdk_cursor_type
= GDK_LEFT_PTR
;
465 gdk_threads_enter ();
467 widget
= GTK_WIDGET(ptr
);
469 gdk_cursor
= gdk_cursor_new (gdk_cursor_type
);
470 gdk_window_set_cursor (widget
->window
, gdk_cursor
);
471 gdk_cursor_destroy (gdk_cursor
);
473 gdk_threads_leave ();
476 JNIEXPORT
void JNICALL
477 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetParent
478 (JNIEnv
*env
, jobject obj
, jobject parent
)
483 GtkWidget
*parent_widget
;
485 ptr
= NSA_GET_PTR (env
, obj
);
486 parent_ptr
= NSA_GET_PTR (env
, parent
);
488 gdk_threads_enter ();
490 widget
= GTK_WIDGET (ptr
);
491 parent_widget
= GTK_WIDGET (parent_ptr
);
493 if (widget
->parent
== NULL
)
495 if (GTK_IS_WINDOW (parent_widget
))
497 GList
*children
= gtk_container_children
498 (GTK_CONTAINER (parent_widget
));
500 if (GTK_IS_MENU_BAR (children
->data
))
501 gtk_fixed_put (GTK_FIXED (children
->next
->data
), widget
, 0, 0);
503 gtk_fixed_put (GTK_FIXED (children
->data
), widget
, 0, 0);
506 if (GTK_IS_SCROLLED_WINDOW (parent_widget
))
508 gtk_scrolled_window_add_with_viewport
509 (GTK_SCROLLED_WINDOW (parent_widget
), widget
);
510 gtk_viewport_set_shadow_type (GTK_VIEWPORT (widget
->parent
),
516 if (widget
->parent
== NULL
)
517 gtk_fixed_put (GTK_FIXED (parent_widget
), widget
, 0, 0);
521 gdk_threads_leave ();
524 JNIEXPORT
void JNICALL
525 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetSensitive
526 (JNIEnv
*env
, jobject obj
, jboolean sensitive
)
530 ptr
= NSA_GET_PTR (env
, obj
);
532 gdk_threads_enter ();
534 gtk_widget_set_sensitive (GTK_WIDGET (ptr
), sensitive
);
536 gdk_threads_leave ();
539 JNIEXPORT
void JNICALL
540 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetRequestFocus
541 (JNIEnv
*env
, jobject obj
)
545 ptr
= NSA_GET_PTR (env
, obj
);
547 gdk_threads_enter ();
548 gtk_widget_grab_focus (GTK_WIDGET (ptr
));
549 gdk_threads_leave ();
553 * Translate a Java KeyEvent object into a GdkEventKey event, then
554 * pass it to the GTK main loop for processing.
556 JNIEXPORT
void JNICALL
557 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetDispatchKeyEvent
558 (JNIEnv
*env
, jobject obj
, jint id
, jlong when
, jint mods
,
559 jint keyCode
, jint keyLocation
)
562 GdkEvent
*event
= NULL
;
563 GdkKeymapKey
*keymap_keys
= NULL
;
565 guint lookup_keyval
= 0;
567 ptr
= NSA_GET_PTR (env
, obj
);
569 gdk_threads_enter ();
571 if (id
== AWT_KEY_PRESSED
)
572 event
= gdk_event_new (GDK_KEY_PRESS
);
573 else if (id
== AWT_KEY_RELEASED
)
574 event
= gdk_event_new (GDK_KEY_RELEASE
);
577 gdk_threads_leave ();
578 /* Don't send AWT KEY_TYPED events to GTK. */
582 if (GTK_IS_BUTTON (ptr
))
583 event
->key
.window
= GTK_BUTTON (ptr
)->event_window
;
584 else if (GTK_IS_SCROLLED_WINDOW (ptr
))
585 event
->key
.window
= GTK_WIDGET (GTK_SCROLLED_WINDOW (ptr
)->container
.child
)->window
;
587 event
->key
.window
= GTK_WIDGET (ptr
)->window
;
589 event
->key
.send_event
= 0;
590 event
->key
.time
= (guint32
) when
;
592 if (mods
& AWT_SHIFT_DOWN_MASK
)
593 event
->key
.state
|= GDK_SHIFT_MASK
;
594 if (mods
& AWT_CTRL_DOWN_MASK
)
595 event
->key
.state
|= GDK_CONTROL_MASK
;
596 if (mods
& AWT_ALT_DOWN_MASK
)
597 event
->key
.state
|= GDK_MOD1_MASK
;
599 /* This hack is needed because the AWT has no notion of num lock.
600 It infers numlock state from the only Java virtual keys that are
602 if (keyCode
== VK_NUMPAD9
603 || keyCode
== VK_NUMPAD8
604 || keyCode
== VK_NUMPAD7
605 || keyCode
== VK_NUMPAD6
606 || keyCode
== VK_NUMPAD5
607 || keyCode
== VK_NUMPAD4
608 || keyCode
== VK_NUMPAD3
609 || keyCode
== VK_NUMPAD2
610 || keyCode
== VK_NUMPAD1
611 || keyCode
== VK_NUMPAD0
612 || keyCode
== VK_DECIMAL
)
613 event
->key
.state
|= GDK_MOD2_MASK
;
615 /* These values don't need to be filled in since GTK doesn't use
617 event
->key
.length
= 0;
618 event
->key
.string
= NULL
;
620 lookup_keyval
= awt_keycode_to_keysym (keyCode
, keyLocation
);
622 if (!gdk_keymap_get_entries_for_keyval (gdk_keymap_get_default (),
627 /* No matching keymap entry was found. */
628 g_printerr ("No matching keymap entries were found\n");
629 gdk_threads_leave ();
633 /* Note: if n_keys > 1 then there are multiple hardware keycodes
634 that translate to lookup_keyval. We arbitrarily choose the first
635 hardware keycode from the list returned by
636 gdk_keymap_get_entries_for_keyval. */
638 event
->key
.hardware_keycode
= keymap_keys
[0].keycode
;
639 event
->key
.group
= keymap_keys
[0].group
;
641 g_free (keymap_keys
);
643 if (!gdk_keymap_translate_keyboard_state (gdk_keymap_get_default (),
644 event
->key
.hardware_keycode
,
650 /* No matching keyval was found. */
651 g_printerr ("No matching keyval was found\n");
652 gdk_threads_leave ();
656 /* keyevent = (GdkEventKey *) event; */
657 /* g_printerr ("generated event: sent: %d time: %d state: %d keyval: %d length: %d string: %s hardware_keycode: %d group: %d\n", keyevent->send_event, keyevent->time, keyevent->state, keyevent->keyval, keyevent->length, keyevent->string, keyevent->hardware_keycode, keyevent->group); */
659 /* We already received the original key event on the window itself,
660 so we don't want to resend it. */
661 if (!GTK_IS_WINDOW (ptr
))
663 if (GTK_IS_SCROLLED_WINDOW (ptr
))
664 gtk_widget_event (GTK_WIDGET (GTK_SCROLLED_WINDOW (ptr
)->container
.child
), event
);
666 gtk_widget_event (GTK_WIDGET (ptr
), event
);
669 gdk_threads_leave ();
673 * Find the origin of a widget's window.
675 JNIEXPORT
void JNICALL
676 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetLocationOnScreen
677 (JNIEnv
* env
, jobject obj
, jintArray jpoint
)
682 ptr
= NSA_GET_PTR (env
, obj
);
683 point
= (*env
)->GetIntArrayElements (env
, jpoint
, 0);
685 gdk_threads_enter ();
687 gdk_window_get_origin (GTK_WIDGET (ptr
)->window
, point
, point
+1);
689 if (!GTK_IS_CONTAINER (ptr
))
691 *point
+= GTK_WIDGET(ptr
)->allocation
.x
;
692 *(point
+1) += GTK_WIDGET(ptr
)->allocation
.y
;
695 gdk_threads_leave ();
697 (*env
)->ReleaseIntArrayElements(env
, jpoint
, point
, 0);
701 * Find this widget's current size.
703 JNIEXPORT
void JNICALL
704 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetDimensions
705 (JNIEnv
*env
, jobject obj
, jintArray jdims
)
709 GtkRequisition requisition
;
711 ptr
= NSA_GET_PTR (env
, obj
);
713 dims
= (*env
)->GetIntArrayElements (env
, jdims
, 0);
714 dims
[0] = dims
[1] = 0;
716 gdk_threads_enter ();
718 gtk_widget_size_request (GTK_WIDGET (ptr
), &requisition
);
720 dims
[0] = requisition
.width
;
721 dims
[1] = requisition
.height
;
723 gdk_threads_leave ();
725 (*env
)->ReleaseIntArrayElements (env
, jdims
, dims
, 0);
729 * Find this widget's preferred size.
731 JNIEXPORT
void JNICALL
732 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetPreferredDimensions
733 (JNIEnv
*env
, jobject obj
, jintArray jdims
)
737 GtkRequisition current_req
;
738 GtkRequisition natural_req
;
740 ptr
= NSA_GET_PTR (env
, obj
);
742 dims
= (*env
)->GetIntArrayElements (env
, jdims
, 0);
743 dims
[0] = dims
[1] = 0;
745 gdk_threads_enter ();
747 /* Widgets that extend GtkWindow such as GtkFileChooserDialog may have
748 a default size. These values seem more useful then the natural
749 requisition values, particularly for GtkFileChooserDialog. */
750 if (GTK_IS_WINDOW (ptr
))
753 gtk_window_get_default_size (GTK_WINDOW (ptr
), &width
, &height
);
760 /* Save the widget's current size request. */
761 gtk_widget_size_request (GTK_WIDGET (ptr
), ¤t_req
);
763 /* Get the widget's "natural" size request. */
764 gtk_widget_set_size_request (GTK_WIDGET (ptr
), -1, -1);
765 gtk_widget_size_request (GTK_WIDGET (ptr
), &natural_req
);
767 /* Reset the widget's size request. */
768 gtk_widget_set_size_request (GTK_WIDGET (ptr
),
769 current_req
.width
, current_req
.height
);
771 dims
[0] = natural_req
.width
;
772 dims
[1] = natural_req
.height
;
775 gdk_threads_leave ();
777 (*env
)->ReleaseIntArrayElements (env
, jdims
, dims
, 0);
780 JNIEXPORT
void JNICALL
781 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_setNativeBounds
782 (JNIEnv
*env
, jobject obj
, jint x
, jint y
, jint width
, jint height
)
787 ptr
= NSA_GET_PTR (env
, obj
);
789 gdk_threads_enter ();
791 widget
= GTK_WIDGET (ptr
);
793 /* We assume that -1 is a width or height and not a request for the
794 widget's natural size. */
795 width
= width
< 0 ? 0 : width
;
796 height
= height
< 0 ? 0 : height
;
798 if (GTK_IS_VIEWPORT (widget
->parent
))
799 gtk_widget_set_size_request (widget
, width
, height
);
802 if (!(width
== 0 && height
== 0))
804 gtk_widget_set_size_request (widget
, width
, height
);
805 if (widget
->parent
!= NULL
)
806 gtk_fixed_move (GTK_FIXED (widget
->parent
), widget
, x
, y
);
810 gdk_threads_leave ();
813 JNIEXPORT jintArray JNICALL
814 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetBackground
815 (JNIEnv
*env
, jobject obj
)
822 ptr
= NSA_GET_PTR (env
, obj
);
824 gdk_threads_enter ();
825 bg
= GTK_WIDGET (ptr
)->style
->bg
[GTK_STATE_NORMAL
];
826 gdk_threads_leave ();
828 array
= (*env
)->NewIntArray (env
, 3);
829 rgb
= (*env
)->GetIntArrayElements (env
, array
, NULL
);
830 /* convert color data from 16 bit values down to 8 bit values */
831 rgb
[0] = bg
.red
>> 8;
832 rgb
[1] = bg
.green
>> 8;
833 rgb
[2] = bg
.blue
>> 8;
834 (*env
)->ReleaseIntArrayElements (env
, array
, rgb
, 0);
839 JNIEXPORT jintArray JNICALL
840 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetForeground
841 (JNIEnv
*env
, jobject obj
)
848 ptr
= NSA_GET_PTR (env
, obj
);
850 gdk_threads_enter ();
851 fg
= GTK_WIDGET (ptr
)->style
->fg
[GTK_STATE_NORMAL
];
852 gdk_threads_leave ();
854 array
= (*env
)->NewIntArray (env
, 3);
855 rgb
= (*env
)->GetIntArrayElements (env
, array
, NULL
);
856 /* convert color data from 16 bit values down to 8 bit values */
857 rgb
[0] = fg
.red
>> 8;
858 rgb
[1] = fg
.green
>> 8;
859 rgb
[2] = fg
.blue
>> 8;
860 (*env
)->ReleaseIntArrayElements (env
, array
, rgb
, 0);
865 JNIEXPORT
void JNICALL
866 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetBackground
867 (JNIEnv
*env
, jobject obj
, jint red
, jint green
, jint blue
)
869 GdkColor normal_color
;
870 GdkColor active_color
;
874 ptr
= NSA_GET_PTR (env
, obj
);
876 normal_color
.red
= (red
/ 255.0) * 65535;
877 normal_color
.green
= (green
/ 255.0) * 65535;
878 normal_color
.blue
= (blue
/ 255.0) * 65535;
880 /* This calculation only approximates the active colors produced by
882 active_color
.red
= 0.85 * (red
/ 255.0) * 65535;
883 active_color
.green
= 0.85 * (green
/ 255.0) * 65535;
884 active_color
.blue
= 0.85 * (blue
/ 255.0) * 65535;
886 gdk_threads_enter ();
888 widget
= find_bg_color_widget (GTK_WIDGET (ptr
));
890 gtk_widget_modify_bg (widget
, GTK_STATE_NORMAL
, &normal_color
);
891 gtk_widget_modify_bg (widget
, GTK_STATE_ACTIVE
, &active_color
);
892 gtk_widget_modify_bg (widget
, GTK_STATE_PRELIGHT
, &normal_color
);
894 gdk_threads_leave ();
897 JNIEXPORT
void JNICALL
898 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetForeground
899 (JNIEnv
*env
, jobject obj
, jint red
, jint green
, jint blue
)
905 ptr
= NSA_GET_PTR (env
, obj
);
907 color
.red
= (red
/ 255.0) * 65535;
908 color
.green
= (green
/ 255.0) * 65535;
909 color
.blue
= (blue
/ 255.0) * 65535;
911 gdk_threads_enter ();
913 widget
= find_fg_color_widget (GTK_WIDGET (ptr
));
915 gtk_widget_modify_fg (widget
, GTK_STATE_NORMAL
, &color
);
916 gtk_widget_modify_fg (widget
, GTK_STATE_ACTIVE
, &color
);
917 gtk_widget_modify_fg (widget
, GTK_STATE_PRELIGHT
, &color
);
919 gdk_threads_leave ();
922 JNIEXPORT
void JNICALL
923 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_show
924 (JNIEnv
*env
, jobject obj
)
928 ptr
= NSA_GET_PTR (env
, obj
);
931 gtk_widget_show (GTK_WIDGET (ptr
));
935 JNIEXPORT
void JNICALL
936 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_hide
937 (JNIEnv
*env
, jobject obj
)
941 ptr
= NSA_GET_PTR (env
, obj
);
944 gtk_widget_hide (GTK_WIDGET (ptr
));
948 JNIEXPORT jboolean JNICALL
949 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_isEnabled
950 (JNIEnv
*env
, jobject obj
)
955 ptr
= NSA_GET_PTR (env
, obj
);
957 gdk_threads_enter ();
958 ret_val
= GTK_WIDGET_IS_SENSITIVE (GTK_WIDGET (ptr
));
959 gdk_threads_leave ();
964 JNIEXPORT jboolean JNICALL
965 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_isRealized
966 (JNIEnv
*env
, jobject obj
)
971 ptr
= NSA_GET_PTR (env
, obj
);
976 gdk_threads_enter ();
977 ret_val
= GTK_WIDGET_REALIZED (GTK_WIDGET (ptr
));
978 gdk_threads_leave ();
983 JNIEXPORT jboolean JNICALL
984 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_modalHasGrab
985 (JNIEnv
*env
__attribute__((unused
)), jclass clazz
__attribute__((unused
)))
990 gdk_threads_enter ();
991 widget
= gtk_grab_get_current ();
992 retval
= (widget
&& GTK_IS_WINDOW (widget
) && GTK_WINDOW (widget
)->modal
);
993 gdk_threads_leave ();
998 JNIEXPORT
void JNICALL
999 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals
1000 (JNIEnv
*env
, jobject obj
)
1005 ptr
= NSA_GET_PTR (env
, obj
);
1006 gref
= NSA_GET_GLOBAL_REF (env
, obj
);
1008 gdk_threads_enter ();
1010 /* Connect EVENT signal, which happens _before_ any specific signal. */
1012 g_signal_connect (GTK_OBJECT (ptr
), "event",
1013 G_CALLBACK (pre_event_handler
), *gref
);
1015 g_signal_connect (G_OBJECT (ptr
), "focus-in-event",
1016 G_CALLBACK (focus_in_cb
), *gref
);
1018 g_signal_connect (G_OBJECT (ptr
), "focus-out-event",
1019 G_CALLBACK (focus_out_cb
), *gref
);
1021 g_signal_connect_after (G_OBJECT (ptr
), "realize",
1022 G_CALLBACK (connect_awt_hook_cb
), *gref
);
1024 gdk_threads_leave ();
1028 find_fg_color_widget (GtkWidget
*widget
)
1030 GtkWidget
*fg_color_widget
;
1032 if (GTK_IS_EVENT_BOX (widget
)
1033 || (GTK_IS_BUTTON (widget
)
1034 && !GTK_IS_OPTION_MENU (widget
)))
1035 fg_color_widget
= gtk_bin_get_child (GTK_BIN(widget
));
1037 fg_color_widget
= widget
;
1039 return fg_color_widget
;
1043 find_bg_color_widget (GtkWidget
*widget
)
1045 GtkWidget
*bg_color_widget
;
1047 bg_color_widget
= widget
;
1049 return bg_color_widget
;
1053 focus_in_cb (GtkWidget
*widget
__attribute((unused
)),
1054 GdkEventFocus
*event
__attribute((unused
)),
1057 gdk_threads_leave ();
1058 (*gdk_env())->CallVoidMethod (gdk_env(), peer
,
1062 gdk_threads_enter ();
1067 focus_out_cb (GtkWidget
*widget
__attribute((unused
)),
1068 GdkEventFocus
*event
__attribute((unused
)),
1071 gdk_threads_leave ();
1072 (*gdk_env())->CallVoidMethod (gdk_env(), peer
,
1076 gdk_threads_enter ();