2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-03-19 15:11:08 +08:00

gnu_java_awt_peer_gtk_GtkEvents.c (awt_event_handler): Most coded moved to pre_event_handler, with the modifications mentioned below.

2003-12-08  Fernando Nasser  <fnasser@redhat.com>

        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c (awt_event_handler):
        Most coded moved to pre_event_handler, with the modifications
        mentioned below.
        (pre_event_handler): New function.  Called on the Gtk "event" signal.
        Do not retrieve the jobject from the window property as it is already
        available as user data in the signal.
        Do not try and find the grab widget as it is already done by Gtk at
        this point.
        Do not search for Window ancestor as Gtk already sends the signal to it.        Do not meddle with the activation state of peer widgets on each
        key press or release.
        Add CList to the special handling when looking for the focused widget.
        * jni/gtk-peer/gtkpeer.h: Add declaration for pre_event_handler.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c (connectJObject):
        New function.
        (connectSignals): New function.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c (connectHooks):
        Rename to...
        (connectSignals): New name.  Get rid of NewGlobalRef call.
        Use g_signal_connect instead of deprecated gtk_signal_connect.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
        (connect_choice_item_selectable_hook): Use g_signal_connect instead of
        deprecated gtk_signal_connect.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c
        (Java_gnu_java_awt_peer_gtk_GtkClipboard_initNativeState): Ditto.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
        (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove
        function.
        (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject): New
        function.
        (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals): New
        function.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
        (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove
        function.
        (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject): New
        function.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
        (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove
        function.
        (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject): New
        function.
        (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals): New
        function.
        (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_old_create): Remove dead
        code.
        (item_select): Remove indirection.
        (item_unselect): Ditto.
        (connect_selectable_hook): Folded into connectSignals.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c
        (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove
        function.
        (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject): New
        function.
        (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals): New
        function.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c: Ditto.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
        (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove
        function.
        (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals): New
        function.
        * gnu/java/awt/peer/gtk/GtkComponentPeer.java: Declare  and call
        connectJObject and connectSignals instead of connectHooks.
        * gnu/java/awt/peer/gtk/GtkButtonPeer.java: Declare connectJObject and
        connectSignals.
        * gnu/java/awt/peer/gtk/GtkCheckboxPeer.java: Declare connectSignals
        and not connectHooks.
        * gnu/java/awt/peer/gtk/GtkTextComponentPeer.java: Ditto.
        * gnu/java/awt/peer/gtk/GtkFileDialogPeer.java: Declare connectJObject
        and not connectHooks.
        * gnu/java/awt/peer/gtk/GtkListPeer.java: Declare connectJObject and
        connectSignals instead of connectHooks.
        * gnu/java/awt/peer/gtk/GtkPanelPeer.java: Ditto.
        * gnu/java/awt/peer/gtk/GtkScrollbarPeer.java: Ditto.
        * gnu/java/awt/peer/gtk/GtkWindowPeer.java: Ditto.

From-SVN: r74536
This commit is contained in:
Fernando Nasser 2003-12-11 13:50:51 +00:00 committed by Fernando Nasser
parent 90ff9ff39c
commit 834b120907
25 changed files with 564 additions and 484 deletions

@ -1,3 +1,85 @@
2003-12-08 Fernando Nasser <fnasser@redhat.com>
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c (awt_event_handler):
Most coded moved to pre_event_handler, with the modifications
mentioned below.
(pre_event_handler): New function. Called on the Gtk "event" signal.
Do not retrieve the jobject from the window property as it is already
available as user data in the signal.
Do not try and find the grab widget as it is already done by Gtk at
this point.
Do not search for Window ancestor as Gtk already sends the signal to it.
Do not meddle with the activation state of peer widgets on each
key press or release.
Add CList to the special handling when looking for the focused widget.
* jni/gtk-peer/gtkpeer.h: Add declaration for pre_event_handler.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c (connectJObject):
New function.
(connectSignals): New function.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c (connectHooks):
Rename to...
(connectSignals): New name. Get rid of NewGlobalRef call.
Use g_signal_connect instead of deprecated gtk_signal_connect.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
(connect_choice_item_selectable_hook): Use g_signal_connect instead of
deprecated gtk_signal_connect.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c
(Java_gnu_java_awt_peer_gtk_GtkClipboard_initNativeState): Ditto.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
(Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove
function.
(Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject): New
function.
(Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals): New
function.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
(Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove
function.
(Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject): New
function.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
(Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove
function.
(Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject): New
function.
(Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals): New
function.
(Java_gnu_java_awt_peer_gtk_GtkComponentPeer_old_create): Remove dead
code.
(item_select): Remove indirection.
(item_unselect): Ditto.
(connect_selectable_hook): Folded into connectSignals.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c
(Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove
function.
(Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject): New
function.
(Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals): New
function.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c: Ditto.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
(Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove
function.
(Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals): New
function.
* gnu/java/awt/peer/gtk/GtkComponentPeer.java: Declare and call
connectJObject and connectSignals instead of connectHooks.
* gnu/java/awt/peer/gtk/GtkButtonPeer.java: Declare connectJObject and
connectSignals.
* gnu/java/awt/peer/gtk/GtkCheckboxPeer.java: Declare connectSignals
and not connectHooks.
* gnu/java/awt/peer/gtk/GtkTextComponentPeer.java: Ditto.
* gnu/java/awt/peer/gtk/GtkFileDialogPeer.java: Declare connectJObject
and not connectHooks.
* gnu/java/awt/peer/gtk/GtkListPeer.java: Declare connectJObject and
connectSignals instead of connectHooks.
* gnu/java/awt/peer/gtk/GtkPanelPeer.java: Ditto.
* gnu/java/awt/peer/gtk/GtkScrollbarPeer.java: Ditto.
* gnu/java/awt/peer/gtk/GtkWindowPeer.java: Ditto.
2003-12-09 Michael Koch <konqueror@gmx.de>
* Makefile.am (nat_headers_install): New variable with header files to

@ -50,6 +50,8 @@ public class GtkButtonPeer extends GtkComponentPeer
implements ButtonPeer
{
native void create ();
public native void connectJObject ();
public native void connectSignals ();
native void gtkSetFont(String name, int style, int size);
native void gtkWidgetSetForeground (int red, int green, int blue);

@ -54,7 +54,7 @@ public class GtkCheckboxPeer extends GtkComponentPeer
public native void nativeCreate (GtkCheckboxGroupPeer group,
boolean state);
public native void nativeSetCheckboxGroup (GtkCheckboxGroupPeer group);
public native void connectHooks ();
public native void connectSignals ();
public GtkCheckboxPeer (Checkbox c)
{

@ -99,7 +99,8 @@ public class GtkComponentPeer extends GtkGenericPeer
insets = new Insets (0, 0, 0, 0);
}
native void connectHooks ();
native void connectJObject ();
native void connectSignals ();
protected GtkComponentPeer (Component awtComponent)
{
@ -114,7 +115,8 @@ public class GtkComponentPeer extends GtkGenericPeer
getArgs (awtComponent, args);
args.setArgs (this);
connectHooks ();
connectJObject ();
connectSignals ();
if (awtComponent.getForeground () != null)
setForeground (awtComponent.getForeground ());

@ -58,7 +58,7 @@ public class GtkFileDialogPeer extends GtkDialogPeer implements FileDialogPeer
}
public native void setFile (String file);
public native void connectHooks ();
public native void connectJObject ();
public void setFilenameFilter (FilenameFilter filter)
{

@ -51,7 +51,8 @@ public class GtkListPeer extends GtkComponentPeer
// native void create (ComponentPeer parent, String [] items, boolean mode);
native void create ();
native void connectHooks ();
native void connectJObject ();
native void connectSignals ();
native void getSize (int rows, int dims[]);

@ -45,7 +45,8 @@ public class GtkPanelPeer extends GtkContainerPeer
implements PanelPeer
{
native void create ();
native void connectHooks ();
native void connectJObject ();
native void connectSignals ();
public GtkPanelPeer (Panel p)
{

@ -60,7 +60,8 @@ public class GtkScrollbarPeer extends GtkComponentPeer
int min, int max, int stepIncr, int pageIncr,
int visibleAmount);
native void connectHooks ();
native void connectJObject ();
native void connectSignals ();
public GtkScrollbarPeer (Scrollbar s)
{

@ -56,7 +56,7 @@ public class GtkTextComponentPeer extends GtkComponentPeer
setText (tc.getText ());
}
public native void connectHooks ();
public native void connectSignals ();
public native int getCaretPosition ();
public native void setCaretPosition (int pos);

@ -93,7 +93,8 @@ public class GtkWindowPeer extends GtkContainerPeer
create (GDK_WINDOW_TYPE_HINT_NORMAL, false);
}
native void connectHooks ();
native void connectJObject ();
native void connectSignals ();
public GtkWindowPeer (Window window)
{

@ -37,9 +37,11 @@ exception statement from your version. */
#include "gtkpeer.h"
#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
#include "gnu_java_awt_peer_gtk_GtkButtonPeer.h"
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create
(JNIEnv *env, jobject obj)
{
GtkWidget *button;
@ -51,6 +53,33 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create
NSA_SET_PTR (env, obj, button);
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkButtonPeer_connectJObject
(JNIEnv *env, jobject obj)
{
void *ptr;
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
gtk_widget_realize (GTK_WIDGET (ptr));
connect_awt_hook (env, obj, 1, GTK_BUTTON(ptr)->event_window);
gdk_threads_leave ();
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkButtonPeer_connectSignals
(JNIEnv *env, jobject obj)
{
void *ptr = NSA_GET_PTR (env, obj);
/* Connect the superclass signals. */
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkSetFont
(JNIEnv *env, jobject obj, jstring name, jint style, jint size)

@ -104,25 +104,20 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_nativeCreate
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectHooks
Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectSignals
(JNIEnv *env, jobject obj)
{
void *ptr = NSA_GET_PTR (env, obj);
jobject peer;
gdk_threads_enter ();
peer = (*env)->NewGlobalRef (env, obj);
/* FIXME: when the widget goes away, we should get rid of the global
reference. */
gtk_signal_connect (GTK_OBJECT (ptr), "toggled",
GTK_SIGNAL_FUNC (item_toggled), peer);
g_signal_connect (G_OBJECT (ptr), "toggled",
GTK_SIGNAL_FUNC (item_toggled), obj);
gdk_threads_leave ();
/* Connect the superclass hooks. */
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks (env, obj);
/* Connect the superclass signals. */
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
}
JNIEXPORT void JNICALL

@ -200,6 +200,6 @@ connect_choice_item_selectable_hook (JNIEnv *env, jobject peer_obj,
ie->peer_obj = (*env)->NewGlobalRef (env, peer_obj);
ie->item_obj = (*env)->NewGlobalRef (env, item_obj);
gtk_signal_connect (GTK_OBJECT (item), "activate",
g_signal_connect (G_OBJECT (item), "activate",
GTK_SIGNAL_FUNC (item_activate), ie);
}

@ -75,16 +75,16 @@ Java_gnu_java_awt_peer_gtk_GtkClipboard_initNativeState (JNIEnv *env,
gdk_threads_enter ();
clipboard = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_signal_connect (GTK_OBJECT(clipboard), "selection_received",
g_signal_connect (G_OBJECT(clipboard), "selection_received",
GTK_SIGNAL_FUNC (selection_received), NULL);
gtk_signal_connect (GTK_OBJECT(clipboard), "selection_clear_event",
g_signal_connect (G_OBJECT(clipboard), "selection_clear_event",
GTK_SIGNAL_FUNC (selection_clear), NULL);
gtk_selection_add_target (clipboard, GDK_SELECTION_PRIMARY,
GDK_TARGET_STRING, 0);
gtk_signal_connect (GTK_OBJECT(clipboard), "selection_get",
g_signal_connect (G_OBJECT(clipboard), "selection_get",
GTK_SIGNAL_FUNC (selection_get), NULL);
gdk_threads_leave ();

@ -531,7 +531,7 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_lang_String_2Ljava_lang_O
(*env)->ReleaseStringUTFChars (env, jname, name);
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject
(JNIEnv *env, jobject obj)
{
void *ptr;
@ -539,12 +539,36 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
gtk_widget_realize (GTK_WIDGET (ptr));
if(GTK_IS_BUTTON(ptr))
connect_awt_hook (env, obj, 1, GTK_BUTTON(ptr)->event_window);
else
connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
gdk_threads_leave ();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals
(JNIEnv *env, jobject peer_obj)
{
void *ptr;
ptr = NSA_GET_PTR (env, peer_obj);
gdk_threads_enter ();
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. */
/* Connect EVENT signal, which happens _before_ any specific signal. */
g_signal_connect (GTK_OBJECT (ptr), "event",
G_CALLBACK (pre_event_handler), peer_obj);
gdk_threads_leave ();
}

@ -813,21 +813,35 @@ generates_key_typed_event (GdkEvent *event, GtkWidget *source)
void
awt_event_handler (GdkEvent *event)
{
jobject *event_obj_ptr = NULL;
/* keep synthetic AWT events from being processed recursively */
if (event->type & SYNTHETIC_EVENT_MASK && event->type != GDK_NOTHING)
{
event->type ^= SYNTHETIC_EVENT_MASK;
}
gtk_main_do_event (event);
}
gboolean
pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer)
{
GtkWidget *event_widget;
static guint32 button_click_time = 0;
static GdkWindow *button_window = NULL;
static guint button_number = -1;
static jint click_count = 1;
/* keep synthetic AWT events from being processed recursively */
if (event->type & SYNTHETIC_EVENT_MASK && event->type != GDK_NOTHING)
{
event->type ^= SYNTHETIC_EVENT_MASK;
gtk_main_do_event (event);
return;
}
/* If it is not a focus change event, the widget must be realized already.
If not, ignore the event (Gtk+ will do the same). */
if (!(event->type == GDK_FOCUS_CHANGE || GTK_WIDGET_REALIZED(widget)))
return FALSE;
/* Do not handle propagated events. AWT has its own propagation rules */
gdk_window_get_user_data (event->any.window, (void **) &event_widget);
if (event_widget != widget)
return FALSE;
/* If it is not an input event, let the main loop handle it */
/* We only care about input events */
if (!(event->type == GDK_BUTTON_PRESS
|| event->type == GDK_BUTTON_RELEASE
|| event->type == GDK_ENTER_NOTIFY
@ -839,12 +853,18 @@ awt_event_handler (GdkEvent *event)
|| event->type == GDK_FOCUS_CHANGE
|| event->type == GDK_MOTION_NOTIFY))
{
gtk_main_do_event (event);
return;
return FALSE;
}
/* g_print("event %u widget %s peer %p\n",
event->type, gtk_widget_get_name (widget), peer); */
/* If it has no jobject associated we can send no AWT event */
if (!peer)
return FALSE;
/* for all input events, which have a window with a jobject attached,
send the AWT input event corresponding to the Gtk event off to Java */
/* Handle input events */
/* keep track of clickCount ourselves, since the AWT allows more
than a triple click to occur */
if (event->type == GDK_BUTTON_PRESS)
@ -861,376 +881,247 @@ awt_event_handler (GdkEvent *event)
button_number = event->button.button;
}
/* for all input events, which have a window with a jobject attached,
send the input event off to Java before GTK has a chance to process
the event. Note that the jobject may be in the parent for widgets
that are always inside a scrolled window, like List */
if (!gdk_property_get (event->any.window,
gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE),
gdk_atom_intern ("CARDINAL", FALSE),
0,
sizeof (jobject),
FALSE,
NULL,
NULL,
NULL,
(guchar **)&event_obj_ptr))
switch (event->type)
{
/* See if is contained in a scrolled pane */
GtkWidget *widget;
gdk_window_get_user_data (event->any.window, (void **) &widget);
if ((gtk_widget_get_parent (widget) != NULL)
&& (gtk_widget_get_parent (widget)->window != NULL))
{
GtkWidget *parent = gtk_widget_get_parent (widget);
if (GTK_IS_SCROLLED_WINDOW (parent))
gdk_property_get (gtk_widget_get_parent (widget)->window,
gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE),
gdk_atom_intern ("CARDINAL", FALSE),
0,
sizeof (jobject),
FALSE,
NULL,
NULL,
NULL,
(guchar **)&event_obj_ptr);
}
}
if (event_obj_ptr)
{
GtkWidget *event_widget;
GtkWidget *grab_widget;
jobject *grab_obj_ptr = NULL;
void *ptr;
/* Implement modality using GTK grabs. */
g_assert (global_gtk_window_group);
if (global_gtk_window_group->grabs)
{
grab_widget = global_gtk_window_group->grabs->data;
g_assert (grab_widget);
ptr = NSA_GET_PTR (gdk_env, *event_obj_ptr);
event_widget = GTK_WIDGET(ptr);
/* Don't need to do this if it is the same widget as we
* already got the jobject above.
* Also, don't do it for the BUTTON_PRESS as the focus may be
* changing and the event widget is the one that must
* receive it (again, we have the jobject already)
*/
if ((event_widget != grab_widget)
&& (event->type != GDK_BUTTON_PRESS))
{
/* If the grab widget is an ancestor of the event widget
* then we send the event to the original event widget.
* This is the key to implementing modality.
* Unless the widget is disabled, in this case the grab
* widget still gets the event.
* XXX: But the grab widget may not be an ancestor!!!
*/
if (!GTK_WIDGET_IS_SENSITIVE (event_widget)
|| !gtk_widget_is_ancestor (event_widget, grab_widget))
{
gdk_property_get (grab_widget->window,
gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE),
gdk_atom_intern ("CARDINAL", FALSE),
0,
sizeof (jobject),
FALSE,
NULL,
NULL,
NULL,
(guchar **)&grab_obj_ptr);
}
}
}
if (!grab_obj_ptr)
grab_obj_ptr = event_obj_ptr;
else
g_free (event_obj_ptr);
switch (event->type)
{
case GDK_BUTTON_PRESS:
(*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, postMouseEventID,
AWT_MOUSE_PRESSED,
(jlong)event->button.time,
state_to_awt_mods (event->button.state) |
button_to_awt_mods (event->button.button),
(jint)event->button.x,
(jint)event->button.y,
click_count,
(event->button.button == 3) ? JNI_TRUE :
JNI_FALSE);
/* grab_counter++;
gdk_pointer_grab (event->any.window,
FALSE,
GDK_POINTER_MOTION_MASK |
GDK_BUTTON_MOTION_MASK |
GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK |
GDK_ENTER_NOTIFY_MASK |
GDK_LEAVE_NOTIFY_MASK,
NULL,
NULL,
event->button.time);*/
break;
case GDK_BUTTON_RELEASE:
{
int width, height;
/* only ungrab if no other buttons are pressed down */
/* if (--grab_counter == 0)
gdk_pointer_ungrab (event->button.time);
*/
(*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
postMouseEventID,
AWT_MOUSE_RELEASED,
(jlong)event->button.time,
state_to_awt_mods (event->button.state) |
button_to_awt_mods (event->button.button),
(jint)event->button.x,
(jint)event->button.y,
click_count, JNI_FALSE);
/* check to see if the release occured in the window it was pressed
in, and if so, generate an AWT click event */
gdk_window_get_size (event->any.window, &width, &height);
if (event->button.x >= 0
&& event->button.y >= 0
&& event->button.x <= width
&& event->button.y <= height)
(*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
postMouseEventID,
AWT_MOUSE_CLICKED,
(jlong)event->button.time,
state_to_awt_mods (event->button.state) |
case GDK_BUTTON_PRESS:
(*gdk_env)->CallVoidMethod (gdk_env, peer,
postMouseEventID,
AWT_MOUSE_PRESSED,
(jlong)event->button.time,
state_to_awt_mods (event->button.state) |
button_to_awt_mods (event->button.button),
(jint)event->button.x,
(jint)event->button.y,
click_count, JNI_FALSE);
}
break;
case GDK_MOTION_NOTIFY:
(*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, postMouseEventID,
AWT_MOUSE_MOVED,
(jint)event->button.x,
(jint)event->button.y,
click_count,
(event->button.button == 3) ? JNI_TRUE :
JNI_FALSE);
break;
case GDK_BUTTON_RELEASE:
{
int width, height;
(*gdk_env)->CallVoidMethod (gdk_env, peer,
postMouseEventID,
AWT_MOUSE_RELEASED,
(jlong)event->button.time,
state_to_awt_mods (event->button.state) |
button_to_awt_mods (event->button.button),
(jint)event->button.x,
(jint)event->button.y,
click_count,
JNI_FALSE);
/* check to see if the release occured in the window it was pressed
in, and if so, generate an AWT click event */
gdk_window_get_size (event->any.window, &width, &height);
if (event->button.x >= 0
&& event->button.y >= 0
&& event->button.x <= width
&& event->button.y <= height)
{
(*gdk_env)->CallVoidMethod (gdk_env, peer,
postMouseEventID,
AWT_MOUSE_CLICKED,
(jlong)event->button.time,
state_to_awt_mods (event->button.state) |
button_to_awt_mods (event->button.button),
(jint)event->button.x,
(jint)event->button.y,
click_count,
JNI_FALSE);
}
}
break;
case GDK_MOTION_NOTIFY:
(*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID,
AWT_MOUSE_MOVED,
(jlong)event->motion.time,
state_to_awt_mods (event->motion.state),
(jint)event->motion.x,
(jint)event->motion.y,
0,
JNI_FALSE);
if (event->motion.state & (GDK_BUTTON1_MASK
| GDK_BUTTON2_MASK
| GDK_BUTTON3_MASK
| GDK_BUTTON4_MASK
| GDK_BUTTON5_MASK))
{
(*gdk_env)->CallVoidMethod (gdk_env, peer,
postMouseEventID,
AWT_MOUSE_DRAGGED,
(jlong)event->motion.time,
state_to_awt_mods (event->motion.state),
(jint)event->motion.x,
(jint)event->motion.y,
0, JNI_FALSE);
if (event->motion.state & (GDK_BUTTON1_MASK
| GDK_BUTTON2_MASK
| GDK_BUTTON3_MASK
| GDK_BUTTON4_MASK
| GDK_BUTTON5_MASK))
{
(*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
postMouseEventID,
AWT_MOUSE_DRAGGED,
(jlong)event->motion.time,
state_to_awt_mods (event->motion.state),
(jint)event->motion.x,
(jint)event->motion.y,
0, JNI_FALSE);
}
break;
case GDK_ENTER_NOTIFY:
(*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, postMouseEventID,
AWT_MOUSE_ENTERED,
(jlong)event->crossing.time,
state_to_awt_mods (event->crossing.state),
(jint)event->crossing.x,
(jint)event->crossing.y,
0, JNI_FALSE);
break;
case GDK_LEAVE_NOTIFY:
if (event->crossing.mode == GDK_CROSSING_NORMAL)
(*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
postMouseEventID,
AWT_MOUSE_EXITED,
(jlong)event->crossing.time,
0,
JNI_FALSE);
}
break;
case GDK_ENTER_NOTIFY:
(*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID,
AWT_MOUSE_ENTERED,
(jlong)event->crossing.time,
state_to_awt_mods (event->crossing.state),
(jint)event->crossing.x,
(jint)event->crossing.y,
0,
JNI_FALSE);
break;
case GDK_LEAVE_NOTIFY:
if (event->crossing.mode == GDK_CROSSING_NORMAL)
(*gdk_env)->CallVoidMethod (gdk_env, peer,
postMouseEventID,
AWT_MOUSE_EXITED,
(jlong)event->crossing.time,
state_to_awt_mods (event->crossing.state),
(jint)event->crossing.x,
(jint)event->crossing.y,
0, JNI_FALSE);
break;
case GDK_CONFIGURE:
{
GtkWidget *widget;
(jint)event->crossing.x,
(jint)event->crossing.y,
0,
JNI_FALSE);
break;
case GDK_CONFIGURE:
{
/* GtkWidget *widget;
gdk_window_get_user_data (event->any.window, (void **) &widget);
gdk_window_get_user_data (event->any.window, (void **) &widget); */
if (widget && GTK_WIDGET_TOPLEVEL (widget))
{
gint top, left, right, bottom;
/* 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 ();
/* FIXME: hard-code these values for now. */
top = 20;
left = 6;
bottom = 6;
right = 6;
(*gdk_env)->CallVoidMethod (gdk_env, *grab_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);
gdk_threads_enter ();
}
}
break;
case GDK_EXPOSE:
if (widget && GTK_WIDGET_TOPLEVEL (widget))
{
(*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
postExposeEventID,
(jint)event->expose.area.x,
(jint)event->expose.area.y,
(jint)event->expose.area.width,
(jint)event->expose.area.height);
gint top, left, right, bottom;
/* 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 ();
/* FIXME: hard-code these values for now. */
top = 20;
left = 6;
bottom = 6;
right = 6;
(*gdk_env)->CallVoidMethod (gdk_env, peer,
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);
gdk_threads_enter ();
}
break;
}
break;
case GDK_EXPOSE:
{
(*gdk_env)->CallVoidMethod (gdk_env, peer,
postExposeEventID,
(jint)event->expose.area.x,
(jint)event->expose.area.y,
(jint)event->expose.area.width,
(jint)event->expose.area.height);
}
break;
case GDK_FOCUS_CHANGE:
(*gdk_env)->CallVoidMethod (gdk_env, peer,
postFocusEventID,
(jint) (event->focus_change.in) ?
AWT_FOCUS_GAINED : AWT_FOCUS_LOST,
JNI_FALSE);
break;
case GDK_KEY_PRESS:
case GDK_KEY_RELEASE:
{
GtkWindow *window;
GdkWindow *obj_window;
jobject *focus_obj_ptr = NULL;
case GDK_KEY_PRESS:
/* A widget with a grab will get key events */
if (!GTK_IS_WINDOW (widget))
*focus_obj_ptr = peer;
else
{
GtkWidget *widget;
GtkWindow *window;
/* The window to which the Java peer is attached. */
GdkWindow *obj_window;
/* Check if we have an enabled focused widget in this window.
If not don't handle the event. */
window = GTK_WINDOW (widget);
if (!window->focus_widget
|| !GTK_WIDGET_IS_SENSITIVE (window->focus_widget)
|| !window->focus_widget->window)
return FALSE;
/* TextArea peers are attached to the scrolled window
that contains the GtkTextView, not to the text view
itself. Same for List. */
if (GTK_IS_TEXT_VIEW (window->focus_widget)
|| GTK_IS_CLIST (window->focus_widget))
{
obj_window = gtk_widget_get_parent (window->focus_widget)->window;
}
else
obj_window = window->focus_widget->window;
gdk_window_get_user_data (event->any.window, (void **) &widget);
gdk_property_get (obj_window,
gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE),
gdk_atom_intern ("CARDINAL", FALSE),
0,
sizeof (jobject),
FALSE,
NULL,
NULL,
NULL,
(guchar **)&focus_obj_ptr);
window = GTK_WINDOW (gtk_widget_get_ancestor (widget,
GTK_TYPE_WINDOW));
if (window
&& GTK_WIDGET_IS_SENSITIVE (window)
&& window->focus_widget
&& GTK_WIDGET_IS_SENSITIVE (window->focus_widget)
&& window->focus_widget->window)
{
gtk_widget_activate (window->focus_widget);
/* If the window has no jobject attached we can't send anything */
if (!focus_obj_ptr)
return FALSE;
}
/* TextArea peers are attached to the scrolled window
that contains the GtkTextView, not to the text view
itself. */
if (GTK_IS_TEXT_VIEW (window->focus_widget)
|| GTK_IS_CLIST (window->focus_widget))
obj_window = gtk_widget_get_parent (window->focus_widget)->window;
else
obj_window = window->focus_widget->window;
gdk_property_get (obj_window,
gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE),
gdk_atom_intern ("CARDINAL", FALSE),
0,
sizeof (jobject),
FALSE,
NULL,
NULL,
NULL,
(guchar **)&grab_obj_ptr);
(*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
postKeyEventID,
(jint) AWT_KEY_PRESSED,
(jlong) event->key.time,
keyevent_state_to_awt_mods (event),
keysym_to_awt_keycode (event),
keyevent_to_awt_keychar (event),
keysym_to_awt_keylocation (event));
if (generates_key_typed_event (event, window->focus_widget))
(*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
postKeyEventID,
(jint) AWT_KEY_TYPED,
(jlong) event->key.time,
state_to_awt_mods (event->key.state),
VK_UNDEFINED,
keyevent_to_awt_keychar (event),
AWT_KEY_LOCATION_UNKNOWN);
}
}
break;
case GDK_KEY_RELEASE:
if (event->type == GDK_KEY_PRESS)
{
GtkWidget *widget;
GtkWindow *window;
GdkWindow *obj_window;
(*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr,
postKeyEventID,
(jint) AWT_KEY_PRESSED,
(jlong) event->key.time,
keyevent_state_to_awt_mods (event),
keysym_to_awt_keycode (event),
keyevent_to_awt_keychar (event),
keysym_to_awt_keylocation (event));
gdk_window_get_user_data (event->any.window, (void **) &widget);
window = GTK_WINDOW (gtk_widget_get_ancestor (widget,
GTK_TYPE_WINDOW));
if (window
&& GTK_WIDGET_IS_SENSITIVE (window)
&& window->focus_widget
&& GTK_WIDGET_IS_SENSITIVE (window->focus_widget)
&& window->focus_widget->window)
{
gtk_widget_activate (window->focus_widget);
if (GTK_IS_TEXT_VIEW (window->focus_widget)
|| GTK_IS_CLIST (window->focus_widget))
obj_window = gtk_widget_get_parent (window->focus_widget)->window;
else
obj_window = window->focus_widget->window;
gdk_property_get (obj_window,
gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE),
gdk_atom_intern ("CARDINAL", FALSE),
0,
sizeof (jobject),
FALSE,
NULL,
NULL,
NULL,
(guchar **)&grab_obj_ptr);
(*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
postKeyEventID,
(jint) AWT_KEY_RELEASED,
(jlong) event->key.time,
keyevent_state_to_awt_mods (event),
keysym_to_awt_keycode (event),
keyevent_to_awt_keychar (event),
keysym_to_awt_keylocation (event));
if (generates_key_typed_event (event, window->focus_widget))
{
(*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr,
postKeyEventID,
(jint) AWT_KEY_TYPED,
(jlong) event->key.time,
state_to_awt_mods (event->key.state),
VK_UNDEFINED,
keyevent_to_awt_keychar (event),
AWT_KEY_LOCATION_UNKNOWN);
}
}
break;
case GDK_FOCUS_CHANGE:
(*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
postFocusEventID,
(jint) (event->focus_change.in) ?
AWT_FOCUS_GAINED : AWT_FOCUS_LOST,
JNI_FALSE);
break;
default:
break;
}
g_free (grab_obj_ptr);
else /* GDK_KEY_RELEASE */
{
(*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr,
postKeyEventID,
(jint) AWT_KEY_RELEASED,
(jlong) event->key.time,
keyevent_state_to_awt_mods (event),
keysym_to_awt_keycode (event),
keyevent_to_awt_keychar (event),
keysym_to_awt_keylocation (event));
}
}
break;
default:
break;
}
gtk_main_do_event (event);
return FALSE;
}
static void
@ -1285,3 +1176,4 @@ connect_awt_hook (JNIEnv *env, jobject peer_obj, int nwindows, ...)
}
va_end (ap);
}

@ -57,15 +57,15 @@ Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_create
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_connectHooks
Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_connectJObject
(JNIEnv *env, jobject obj)
{
void *ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
/* NOTE: we don't call the superclass connect method here. */
gtk_widget_realize (GTK_WIDGET (ptr));
connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
gdk_threads_leave ();

@ -37,10 +37,18 @@ exception statement from your version. */
#include "gtkpeer.h"
#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
#include "gnu_java_awt_peer_gtk_GtkListPeer.h"
static void
connect_selectable_hook (JNIEnv *env, jobject peer_obj, GtkCList *list);
static void item_select (GtkCList *list __attribute__((unused)),
int row, int col __attribute__((unused)),
GdkEventButton *event __attribute__((unused)),
jobject peer_obj);
static void item_unselect (GtkCList *list __attribute__((unused)),
int row,
int col __attribute__((unused)),
GdkEventButton *event __attribute__((unused)),
jobject peer_obj);
#define CLIST_FROM_SW(obj) (GTK_CLIST(GTK_SCROLLED_WINDOW (obj)->container.child))
@ -64,7 +72,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_create
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkListPeer_connectHooks
Java_gnu_java_awt_peer_gtk_GtkListPeer_connectJObject
(JNIEnv *env, jobject obj)
{
void *ptr;
@ -72,9 +80,44 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_connectHooks
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
gtk_widget_realize (GTK_WIDGET (ptr));
connect_selectable_hook (env, obj, CLIST_FROM_SW (ptr));
connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
gdk_threads_leave ();
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkListPeer_connectSignals
(JNIEnv *env, jobject peer_obj)
{
GtkCList *list;
void *ptr;
ptr = NSA_GET_PTR (env, peer_obj);
gdk_threads_enter ();
gtk_widget_realize (GTK_WIDGET (ptr));
/* connect selectable hook */
list = CLIST_FROM_SW (ptr);
g_signal_connect (G_OBJECT (list), "select_row",
GTK_SIGNAL_FUNC (item_select), peer_obj);
g_signal_connect (G_OBJECT (list), "unselect_row",
GTK_SIGNAL_FUNC (item_unselect), peer_obj);
/* Connect the superclass signals. */
/* FIXME: Cannot do that here or it will get the sw and not the list.
We must a generic way of doing this. */
/* Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, peer_obj); */
g_signal_connect (GTK_OBJECT (list), "event",
G_CALLBACK (pre_event_handler), peer_obj);
gdk_threads_leave ();
}
@ -108,58 +151,6 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_append
gdk_threads_leave ();
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkListPeer_old_create
(JNIEnv *env, jobject obj, jobject parent_obj,
jobjectArray items, jboolean mode)
{
GtkWidget *list, *sw, *parent;
jsize count, i;
parent = NSA_GET_PTR (env, parent_obj);
count = (*env)->GetArrayLength (env, items);
gdk_threads_enter ();
list = gtk_clist_new (1);
gtk_widget_show (list);
sw = gtk_scrolled_window_new (NULL, NULL);
set_parent (sw, GTK_CONTAINER (parent));
gtk_widget_realize (sw);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_container_add (GTK_CONTAINER (sw), list);
connect_selectable_hook (env, obj, GTK_CLIST (list));
connect_awt_hook (env, obj, 1, list->window);
gtk_clist_set_selection_mode (GTK_CLIST (list),
mode ? GTK_SELECTION_MULTIPLE :
GTK_SELECTION_SINGLE);
for (i = 0; i < count; i++)
{
const char *text;
jobject item;
item = (*env)->GetObjectArrayElement (env, items, i);
text = (*env)->GetStringUTFChars (env, item, NULL);
gtk_clist_append (GTK_CLIST (list), (char **)&text);
(*env)->ReleaseStringUTFChars (env, item, text);
}
gtk_clist_columns_autosize (GTK_CLIST (list));
gdk_threads_leave ();
NSA_SET_PTR (env, obj, sw);
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkListPeer_add
(JNIEnv *env, jobject obj, jstring text, jint index)
@ -326,9 +317,9 @@ static void
item_select (GtkCList *list __attribute__((unused)),
int row, int col __attribute__((unused)),
GdkEventButton *event __attribute__((unused)),
jobject *peer_obj)
jobject peer_obj)
{
(*gdk_env)->CallVoidMethod (gdk_env, *peer_obj,
(*gdk_env)->CallVoidMethod (gdk_env, peer_obj,
postListItemEventID,
row,
(jint) AWT_ITEM_SELECTED);
@ -339,25 +330,11 @@ item_unselect (GtkCList *list __attribute__((unused)),
int row,
int col __attribute__((unused)),
GdkEventButton *event __attribute__((unused)),
jobject *peer_obj)
jobject peer_obj)
{
(*gdk_env)->CallVoidMethod (gdk_env, *peer_obj,
(*gdk_env)->CallVoidMethod (gdk_env, peer_obj,
postListItemEventID,
row,
(jint) AWT_ITEM_DESELECTED);
}
static void
connect_selectable_hook (JNIEnv *env, jobject peer_obj, GtkCList *list)
{
jobject *obj;
obj = (jobject *) malloc (sizeof (jobject));
*obj = (*env)->NewGlobalRef (env, peer_obj);
gtk_signal_connect (GTK_OBJECT (list), "select_row",
GTK_SIGNAL_FUNC (item_select), obj);
gtk_signal_connect (GTK_OBJECT (list), "unselect_row",
GTK_SIGNAL_FUNC (item_unselect), obj);
}

@ -109,6 +109,6 @@ connect_activate_hook (JNIEnv *env, jobject peer_obj, GtkMenuItem *item)
obj = (jobject *) malloc (sizeof (jobject));
*obj = (*env)->NewGlobalRef (env, peer_obj);
gtk_signal_connect (GTK_OBJECT (item), "activate",
g_signal_connect (G_OBJECT (item), "activate",
GTK_SIGNAL_FUNC (item_activate), obj);
}

@ -66,7 +66,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_setupAccelGroup
if (GTK_WIDGET_REALIZED (GTK_WIDGET (ptr1)))
accel_attach (GTK_MENU_ITEM (ptr1), NULL);
else
gtk_signal_connect (GTK_OBJECT (ptr1),
g_signal_connect (G_OBJECT (ptr1),
"realize",
GTK_SIGNAL_FUNC (accel_attach),
NULL);

@ -37,6 +37,7 @@ exception statement from your version. */
#include "gtkpeer.h"
#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
#include "gnu_java_awt_peer_gtk_GtkPanelPeer.h"
JNIEXPORT void JNICALL
@ -61,7 +62,7 @@ struct _GtkLayoutChild {
};
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectHooks
Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectJObject
(JNIEnv *env, jobject obj)
{
void *ptr;
@ -72,9 +73,26 @@ Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectHooks
gtk_widget_realize (GTK_WIDGET (ptr));
connect_awt_hook (env, obj, 1, GTK_LAYOUT (ptr)->bin_window);
/* gtk_signal_connect (GTK_OBJECT (ptr), "size_request", GTK_SIGNAL_FUNC (sr), */
gdk_threads_leave ();
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectSignals
(JNIEnv *env, jobject obj)
{
void *ptr;
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
gtk_widget_realize (GTK_WIDGET (ptr));
/* g_signal_connect (G_OBJECT (ptr), "size_request", GTK_SIGNAL_FUNC (sr), */
/* NULL); */
gdk_threads_leave ();
/* Connect the superclass signals. */
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
}
/*

@ -37,6 +37,7 @@ exception statement from your version. */
#include "gtkpeer.h"
#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
#include "gnu_java_awt_peer_gtk_GtkScrollbarPeer.h"
struct range_scrollbar
@ -120,7 +121,24 @@ Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_create
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectHooks
Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectJObject
(JNIEnv *env, jobject obj)
{
void *ptr;
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
gtk_widget_realize (GTK_WIDGET (ptr));
connect_awt_hook (env, obj, 1, GTK_SCROLLBAR (ptr)->range);
gdk_threads_leave ();
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectSignals
(JNIEnv *env, jobject obj)
{
void *ptr;
@ -136,17 +154,19 @@ Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectHooks
rs->range = GTK_RANGE (ptr);
rs->scrollbar = (jobject *) malloc (sizeof (jobject));
*(rs->scrollbar) = (*env)->NewGlobalRef (env, obj);
gtk_signal_connect (GTK_OBJECT (GTK_RANGE (ptr)),
g_signal_connect (G_OBJECT (GTK_RANGE (ptr)),
"move-slider",
GTK_SIGNAL_FUNC (post_adjustment_event), rs);
gtk_signal_connect (GTK_OBJECT (GTK_RANGE (ptr)),
g_signal_connect (G_OBJECT (GTK_RANGE (ptr)),
"value-changed",
GTK_SIGNAL_FUNC (post_change_event), rs);
connect_awt_hook (env, obj, 1, GTK_SCROLLBAR (ptr)->range);
gdk_threads_leave ();
/* Connect the superclass signals. */
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
}

@ -48,7 +48,7 @@ static void textcomponent_changed_cb (GtkEditable *editable,
jobject peer);
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectHooks
Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectSignals
(JNIEnv *env, jobject obj)
{
void *ptr;
@ -66,6 +66,11 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectHooks
g_signal_connect (GTK_EDITABLE (ptr), "changed",
G_CALLBACK (textcomponent_changed_cb), obj);
gdk_threads_leave ();
/* Connect the superclass signals. */
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
}
else
{
@ -87,13 +92,18 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectHooks
if (buf)
g_signal_connect (buf, "changed",
G_CALLBACK (textcomponent_changed_cb), obj);
/* Connect the superclass signals. */
/* FIXME: Cannot do that here or it will get the sw and not the list.
We must a generic way of doing this. */
/* Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env,
peer_obj); */
g_signal_connect (GTK_OBJECT (text), "event",
G_CALLBACK (pre_event_handler), obj);
gdk_threads_leave ();
}
}
gdk_threads_leave ();
/* Connect the superclass hooks. */
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks (env, obj);
}
JNIEXPORT jint JNICALL

@ -37,6 +37,7 @@ exception statement from your version. */
#include "gtkpeer.h"
#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
#include "gnu_java_awt_peer_gtk_GtkWindowPeer.h"
#include "gnu_java_awt_peer_gtk_GtkFramePeer.h"
#include <gdk/gdkprivate.h>
@ -116,7 +117,8 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create
NSA_SET_PTR (env, obj, window_widget);
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetVisible
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetVisible
(JNIEnv *env, jobject obj, jboolean visible)
{
void *ptr;
@ -135,7 +137,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetVisible
gdk_threads_leave ();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectHooks
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectJObject
(JNIEnv *env, jobject obj)
{
void *ptr;
@ -169,6 +172,21 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectHooks
connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
gdk_threads_leave ();
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals
(JNIEnv *env, jobject obj)
{
void *ptr;
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
gtk_widget_realize (ptr);
/* Connect signals for window event support. */
g_signal_connect (G_OBJECT (ptr), "delete-event",
G_CALLBACK (window_delete_cb), obj);
@ -189,6 +207,9 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectHooks
G_CALLBACK (window_window_state_cb), obj);
gdk_threads_leave ();
/* Connect the superclass signals. */
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
}
/*

@ -392,6 +392,10 @@ extern GtkWindowGroup *global_gtk_window_group;
void awt_event_handler (GdkEvent *event);
gboolean pre_event_handler (GtkWidget *widget,
GdkEvent *event,
jobject peer);
void connect_awt_hook (JNIEnv *env, jobject peer_obj, int nwindows, ...);
void set_visible (GtkWidget *widget, jboolean visible);