This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[PATCH] Handle GTK+ events in a signal handler [LARGE]
- From: Fernando Nasser <fnasser at redhat dot com>
- To: GCJ Patches <java-patches at gcc dot gnu dot org>
- Date: Mon, 08 Dec 2003 20:17:59 -0500
- Subject: [PATCH] Handle GTK+ events in a signal handler [LARGE]
- Organization: Red Hat , Inc. - Toronto
This patch implements Tom Fitzsimmons idea of handling the GTK+ events out of a
signal handler. The way we were doing it before forced us to keep copying bits
of code from the Gtk+ main event look -- it is difficult to get every detail and
we would have to keep an eye on changes there. By hooking this code to the
handling of the "event" signal we simplify the code as GTK+ already found out
several things for us and removes any code-copying needs.
Some small annoyances should be removed with this patch like the toggling of
checkboxes with any keypress and similar misbehaviors.
This patch was developed with Tom Fitzsimmons help.
Regards to all,
Fernando
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.
Index: ChangeLog
===================================================================
RCS file: /cvs/gcc/gcc/libjava/ChangeLog,v
retrieving revision 1.2417
diff -c -p -r1.2417 ChangeLog
*** ChangeLog 4 Dec 2003 13:07:07 -0000 1.2417
--- ChangeLog 8 Dec 2003 23:41:59 -0000
***************
*** 1,3 ****
--- 1,9 ----
+ 2003-12-02 Fernando Nasser <fnasser@redhat.com>
+
+ * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c (awt_event_handler):
+ Do not meddle with the activation state of peer widgets on each
+ key press or release.
+
2003-12-04 Michael Koch <konqueror@gmx.de>
* boehm.cc (_Jv_MarkObj): Access hack_signers field.
Index: gnu/java/awt/peer/gtk/GtkButtonPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java,v
retrieving revision 1.6
diff -c -p -r1.6 GtkButtonPeer.java
*** gnu/java/awt/peer/gtk/GtkButtonPeer.java 9 Oct 2003 00:26:29 -0000 1.6
--- gnu/java/awt/peer/gtk/GtkButtonPeer.java 8 Dec 2003 23:42:03 -0000
*************** public class GtkButtonPeer extends GtkCo
*** 50,55 ****
--- 50,57 ----
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);
Index: gnu/java/awt/peer/gtk/GtkCheckboxPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java,v
retrieving revision 1.2
diff -c -p -r1.2 GtkCheckboxPeer.java
*** gnu/java/awt/peer/gtk/GtkCheckboxPeer.java 13 Jul 2003 15:09:20 -0000 1.2
--- gnu/java/awt/peer/gtk/GtkCheckboxPeer.java 8 Dec 2003 23:42:03 -0000
*************** public class GtkCheckboxPeer extends Gtk
*** 51,57 ****
public native void nativeCreate (GtkCheckboxGroupPeer group);
public native void nativeSetCheckboxGroup (GtkCheckboxGroupPeer group);
! public native void connectHooks ();
public GtkCheckboxPeer (Checkbox c)
{
--- 51,57 ----
public native void nativeCreate (GtkCheckboxGroupPeer group);
public native void nativeSetCheckboxGroup (GtkCheckboxGroupPeer group);
! public native void connectSignals ();
public GtkCheckboxPeer (Checkbox c)
{
Index: gnu/java/awt/peer/gtk/GtkComponentPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java,v
retrieving revision 1.9
diff -c -p -r1.9 GtkComponentPeer.java
*** gnu/java/awt/peer/gtk/GtkComponentPeer.java 12 Nov 2003 22:03:49 -0000 1.9
--- gnu/java/awt/peer/gtk/GtkComponentPeer.java 8 Dec 2003 23:42:03 -0000
*************** public class GtkComponentPeer extends Gt
*** 99,105 ****
insets = new Insets (0, 0, 0, 0);
}
! native void connectHooks ();
protected GtkComponentPeer (Component awtComponent)
{
--- 99,106 ----
insets = new Insets (0, 0, 0, 0);
}
! native void connectJObject ();
! native void connectSignals ();
protected GtkComponentPeer (Component awtComponent)
{
*************** public class GtkComponentPeer extends Gt
*** 114,120 ****
getArgs (awtComponent, args);
args.setArgs (this);
! connectHooks ();
if (awtComponent.getForeground () != null)
setForeground (awtComponent.getForeground ());
--- 115,122 ----
getArgs (awtComponent, args);
args.setArgs (this);
! connectJObject ();
! connectSignals ();
if (awtComponent.getForeground () != null)
setForeground (awtComponent.getForeground ());
Index: gnu/java/awt/peer/gtk/GtkFileDialogPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java,v
retrieving revision 1.2
diff -c -p -r1.2 GtkFileDialogPeer.java
*** gnu/java/awt/peer/gtk/GtkFileDialogPeer.java 13 Jul 2003 15:09:20 -0000 1.2
--- gnu/java/awt/peer/gtk/GtkFileDialogPeer.java 8 Dec 2003 23:42:03 -0000
*************** public class GtkFileDialogPeer extends G
*** 58,64 ****
}
public native void setFile (String file);
! public native void connectHooks ();
public void setFilenameFilter (FilenameFilter filter)
{
--- 58,64 ----
}
public native void setFile (String file);
! public native void connectJObject ();
public void setFilenameFilter (FilenameFilter filter)
{
Index: gnu/java/awt/peer/gtk/GtkListPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkListPeer.java,v
retrieving revision 1.4
diff -c -p -r1.4 GtkListPeer.java
*** gnu/java/awt/peer/gtk/GtkListPeer.java 3 Dec 2003 22:29:31 -0000 1.4
--- gnu/java/awt/peer/gtk/GtkListPeer.java 8 Dec 2003 23:42:03 -0000
*************** public class GtkListPeer extends GtkComp
*** 51,57 ****
// native void create (ComponentPeer parent, String [] items, boolean mode);
native void create ();
! native void connectHooks ();
native void getSize (int rows, int dims[]);
--- 51,58 ----
// native void create (ComponentPeer parent, String [] items, boolean mode);
native void create ();
! native void connectJObject ();
! native void connectSignals ();
native void getSize (int rows, int dims[]);
Index: gnu/java/awt/peer/gtk/GtkPanelPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkPanelPeer.java,v
retrieving revision 1.2
diff -c -p -r1.2 GtkPanelPeer.java
*** gnu/java/awt/peer/gtk/GtkPanelPeer.java 13 Jul 2003 15:09:20 -0000 1.2
--- gnu/java/awt/peer/gtk/GtkPanelPeer.java 8 Dec 2003 23:42:03 -0000
*************** public class GtkPanelPeer extends GtkCon
*** 45,51 ****
implements PanelPeer
{
native void create ();
! native void connectHooks ();
public GtkPanelPeer (Panel p)
{
--- 45,52 ----
implements PanelPeer
{
native void create ();
! native void connectJObject ();
! native void connectSignals ();
public GtkPanelPeer (Panel p)
{
Index: gnu/java/awt/peer/gtk/GtkScrollbarPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java,v
retrieving revision 1.2
diff -c -p -r1.2 GtkScrollbarPeer.java
*** gnu/java/awt/peer/gtk/GtkScrollbarPeer.java 13 Jul 2003 15:09:20 -0000 1.2
--- gnu/java/awt/peer/gtk/GtkScrollbarPeer.java 8 Dec 2003 23:42:03 -0000
*************** public class GtkScrollbarPeer extends Gt
*** 60,66 ****
int min, int max, int stepIncr, int pageIncr,
int visibleAmount);
! native void connectHooks ();
public GtkScrollbarPeer (Scrollbar s)
{
--- 60,67 ----
int min, int max, int stepIncr, int pageIncr,
int visibleAmount);
! native void connectJObject ();
! native void connectSignals ();
public GtkScrollbarPeer (Scrollbar s)
{
Index: gnu/java/awt/peer/gtk/GtkTextComponentPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java,v
retrieving revision 1.6
diff -c -p -r1.6 GtkTextComponentPeer.java
*** gnu/java/awt/peer/gtk/GtkTextComponentPeer.java 5 Aug 2003 18:04:09 -0000 1.6
--- gnu/java/awt/peer/gtk/GtkTextComponentPeer.java 8 Dec 2003 23:42:03 -0000
*************** public class GtkTextComponentPeer extend
*** 56,62 ****
setText (tc.getText ());
}
! public native void connectHooks ();
public native int getCaretPosition ();
public native void setCaretPosition (int pos);
--- 56,62 ----
setText (tc.getText ());
}
! public native void connectSignals ();
public native int getCaretPosition ();
public native void setCaretPosition (int pos);
Index: gnu/java/awt/peer/gtk/GtkWindowPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java,v
retrieving revision 1.8
diff -c -p -r1.8 GtkWindowPeer.java
*** gnu/java/awt/peer/gtk/GtkWindowPeer.java 24 Oct 2003 19:40:29 -0000 1.8
--- gnu/java/awt/peer/gtk/GtkWindowPeer.java 8 Dec 2003 23:42:03 -0000
*************** public class GtkWindowPeer extends GtkCo
*** 93,99 ****
create (GDK_WINDOW_TYPE_HINT_NORMAL, false);
}
! native void connectHooks ();
public GtkWindowPeer (Window window)
{
--- 93,100 ----
create (GDK_WINDOW_TYPE_HINT_NORMAL, false);
}
! native void connectJObject ();
! native void connectSignals ();
public GtkWindowPeer (Window window)
{
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c,v
retrieving revision 1.5
diff -c -p -r1.5 gnu_java_awt_peer_gtk_GtkButtonPeer.c
*** jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c 8 Oct 2003 23:38:45 -0000 1.5
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c 8 Dec 2003 23:42:04 -0000
*************** exception statement from your version. *
*** 37,45 ****
#include "gtkpeer.h"
#include "gnu_java_awt_peer_gtk_GtkButtonPeer.h"
! JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create
(JNIEnv *env, jobject obj)
{
GtkWidget *button;
--- 37,47 ----
#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
(JNIEnv *env, jobject obj)
{
GtkWidget *button;
*************** JNIEXPORT void JNICALL Java_gnu_java_awt
*** 49,54 ****
--- 51,83 ----
gtk_widget_show (button);
gdk_threads_leave ();
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
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c,v
retrieving revision 1.1
diff -c -p -r1.1 gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
*** jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c 31 Jan 2003 17:54:14 -0000 1.1
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c 8 Dec 2003 23:42:04 -0000
*************** Java_gnu_java_awt_peer_gtk_GtkCheckboxPe
*** 104,128 ****
}
JNIEXPORT void JNICALL
! Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectHooks
(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);
gdk_threads_leave ();
! /* Connect the superclass hooks. */
! Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks (env, obj);
}
JNIEXPORT void JNICALL
--- 104,123 ----
}
JNIEXPORT void JNICALL
! Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectSignals
(JNIEnv *env, jobject obj)
{
void *ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
! g_signal_connect (G_OBJECT (ptr), "toggled",
! GTK_SIGNAL_FUNC (item_toggled), obj);
gdk_threads_leave ();
! /* Connect the superclass signals. */
! Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
}
JNIEXPORT void JNICALL
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c,v
retrieving revision 1.2
diff -c -p -r1.2 gnu_java_awt_peer_gtk_GtkChoicePeer.c
*** jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c 8 Oct 2003 15:49:33 -0000 1.2
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c 8 Dec 2003 23:42:04 -0000
*************** connect_choice_item_selectable_hook (JNI
*** 200,205 ****
ie->peer_obj = (*env)->NewGlobalRef (env, peer_obj);
ie->item_obj = (*env)->NewGlobalRef (env, item_obj);
! gtk_signal_connect (GTK_OBJECT (item), "activate",
GTK_SIGNAL_FUNC (item_activate), ie);
}
--- 200,205 ----
ie->peer_obj = (*env)->NewGlobalRef (env, peer_obj);
ie->item_obj = (*env)->NewGlobalRef (env, item_obj);
! g_signal_connect (G_OBJECT (item), "activate",
GTK_SIGNAL_FUNC (item_activate), ie);
}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c,v
retrieving revision 1.2
diff -c -p -r1.2 gnu_java_awt_peer_gtk_GtkClipboard.c
*** jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c 8 Oct 2003 15:49:33 -0000 1.2
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c 8 Dec 2003 23:42:04 -0000
*************** Java_gnu_java_awt_peer_gtk_GtkClipboard_
*** 75,90 ****
gdk_threads_enter ();
clipboard = gtk_window_new (GTK_WINDOW_TOPLEVEL);
! gtk_signal_connect (GTK_OBJECT(clipboard), "selection_received",
GTK_SIGNAL_FUNC (selection_received), NULL);
! gtk_signal_connect (GTK_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",
GTK_SIGNAL_FUNC (selection_get), NULL);
gdk_threads_leave ();
--- 75,90 ----
gdk_threads_enter ();
clipboard = gtk_window_new (GTK_WINDOW_TOPLEVEL);
! g_signal_connect (G_OBJECT(clipboard), "selection_received",
GTK_SIGNAL_FUNC (selection_received), NULL);
! 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);
! g_signal_connect (G_OBJECT(clipboard), "selection_get",
GTK_SIGNAL_FUNC (selection_get), NULL);
gdk_threads_leave ();
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c,v
retrieving revision 1.9
diff -c -p -r1.9 gnu_java_awt_peer_gtk_GtkComponentPeer.c
*** jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 11 Nov 2003 17:04:47 -0000 1.9
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 8 Dec 2003 23:42:04 -0000
*************** Java_gnu_java_awt_peer_gtk_GtkComponentP
*** 531,537 ****
(*env)->ReleaseStringUTFChars (env, jname, name);
}
! JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks
(JNIEnv *env, jobject obj)
{
void *ptr;
--- 531,537 ----
(*env)->ReleaseStringUTFChars (env, jname, name);
}
! JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject
(JNIEnv *env, jobject obj)
{
void *ptr;
*************** JNIEXPORT void JNICALL Java_gnu_java_awt
*** 539,550 ****
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);
gdk_threads_leave ();
}
--- 539,574 ----
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
+
gtk_widget_realize (GTK_WIDGET (ptr));
! 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 ();
}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c,v
retrieving revision 1.11
diff -c -p -r1.11 gnu_java_awt_peer_gtk_GtkEvents.c
*** jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c 2 Dec 2003 16:19:28 -0000 1.11
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c 8 Dec 2003 23:42:05 -0000
*************** generates_key_typed_event (GdkEvent *eve
*** 813,833 ****
void
awt_event_handler (GdkEvent *event)
{
! jobject *event_obj_ptr = NULL;
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 an input event, let the main loop handle it */
if (!(event->type == GDK_BUTTON_PRESS
|| event->type == GDK_BUTTON_RELEASE
|| event->type == GDK_ENTER_NOTIFY
--- 813,855 ----
void
awt_event_handler (GdkEvent *event)
{
! /* 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;
+ /* 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;
! /* We only care about input events */
if (!(event->type == GDK_BUTTON_PRESS
|| event->type == GDK_BUTTON_RELEASE
|| event->type == GDK_ENTER_NOTIFY
*************** awt_event_handler (GdkEvent *event)
*** 839,850 ****
|| event->type == GDK_FOCUS_CHANGE
|| event->type == GDK_MOTION_NOTIFY))
{
! gtk_main_do_event (event);
! return;
}
- /* 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,878 ----
|| event->type == GDK_FOCUS_CHANGE
|| event->type == GDK_MOTION_NOTIFY))
{
! 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 */
/* keep track of clickCount ourselves, since the AWT allows more
than a triple click to occur */
if (event->type == GDK_BUTTON_PRESS)
*************** awt_event_handler (GdkEvent *event)
*** 861,1236 ****
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))
! {
! /* 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) |
! 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,
(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,
state_to_awt_mods (event->crossing.state),
! (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);
! 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:
{
! (*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);
! }
! break;
! case GDK_KEY_PRESS:
! {
! GtkWidget *widget;
! GtkWindow *window;
! /* The window to which the Java peer is attached. */
! GdkWindow *obj_window;
!
! 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);
!
! /* 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:
{
! GtkWidget *widget;
! GtkWindow *window;
! GdkWindow *obj_window;
!
! 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));
}
}
! 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);
}
!
! gtk_main_do_event (event);
}
static void
--- 889,1135 ----
button_number = event->button.button;
}
! switch (event->type)
{
! 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,
! (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);
! }
! 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;
! 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, 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;
! 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;
!
! /* A widget with a grab will get key events */
! if (!GTK_IS_WINDOW (widget))
! *focus_obj_ptr = peer;
! else
{
! /* 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_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);
!
! /* If the window has no jobject attached we can't send anything */
! if (!focus_obj_ptr)
! return FALSE;
! }
!
! if (event->type == GDK_KEY_PRESS)
! {
! (*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));
!
! 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);
}
}
! 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;
}
!
! return FALSE;
}
static void
*************** connect_awt_hook (JNIEnv *env, jobject p
*** 1285,1287 ****
--- 1184,1187 ----
}
va_end (ap);
}
+
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c,v
retrieving revision 1.1
diff -c -p -r1.1 gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
*** jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c 31 Jan 2003 17:54:14 -0000 1.1
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c 8 Dec 2003 23:42:05 -0000
*************** Java_gnu_java_awt_peer_gtk_GtkFileDialog
*** 57,71 ****
}
JNIEXPORT void JNICALL
! Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_connectHooks
(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 ();
--- 57,71 ----
}
JNIEXPORT void JNICALL
! Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_connectJObject
(JNIEnv *env, jobject obj)
{
void *ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
gtk_widget_realize (GTK_WIDGET (ptr));
+
connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
gdk_threads_leave ();
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c,v
retrieving revision 1.5
diff -c -p -r1.5 gnu_java_awt_peer_gtk_GtkListPeer.c
*** jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c 2 Dec 2003 16:19:28 -0000 1.5
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c 8 Dec 2003 23:42:05 -0000
*************** exception statement from your version. *
*** 37,46 ****
#include "gtkpeer.h"
#include "gnu_java_awt_peer_gtk_GtkListPeer.h"
! static void
! connect_selectable_hook (JNIEnv *env, jobject peer_obj, GtkCList *list);
#define CLIST_FROM_SW(obj) (GTK_CLIST(GTK_SCROLLED_WINDOW (obj)->container.child))
--- 37,54 ----
#include "gtkpeer.h"
+ #include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
#include "gnu_java_awt_peer_gtk_GtkListPeer.h"
! 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))
*************** Java_gnu_java_awt_peer_gtk_GtkListPeer_c
*** 64,70 ****
}
JNIEXPORT void JNICALL
! Java_gnu_java_awt_peer_gtk_GtkListPeer_connectHooks
(JNIEnv *env, jobject obj)
{
void *ptr;
--- 72,78 ----
}
JNIEXPORT void JNICALL
! Java_gnu_java_awt_peer_gtk_GtkListPeer_connectJObject
(JNIEnv *env, jobject obj)
{
void *ptr;
*************** Java_gnu_java_awt_peer_gtk_GtkListPeer_c
*** 72,147 ****
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_append
! (JNIEnv *env, jobject obj, jobjectArray items)
{
- void *ptr;
GtkCList *list;
! jint count, i;
!
! ptr = NSA_GET_PTR (env, obj);
! count = (*env)->GetArrayLength (env, items);
gdk_threads_enter ();
list = CLIST_FROM_SW (ptr);
- 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 (list, (char **)&text);
! (*env)->ReleaseStringUTFChars (env, item, text);
! }
- gtk_clist_columns_autosize (list);
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;
--- 80,140 ----
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
+
gtk_widget_realize (GTK_WIDGET (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 ();
}
JNIEXPORT void JNICALL
! Java_gnu_java_awt_peer_gtk_GtkListPeer_append
! (JNIEnv *env, jobject obj, jobjectArray items)
{
! void *ptr;
! GtkCList *list;
! jint count, i;
! ptr = NSA_GET_PTR (env, obj);
count = (*env)->GetArrayLength (env, items);
gdk_threads_enter ();
! list = CLIST_FROM_SW (ptr);
for (i = 0; i < count; i++)
{
const char *text;
*************** Java_gnu_java_awt_peer_gtk_GtkListPeer_o
*** 150,163 ****
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
--- 143,154 ----
item = (*env)->GetObjectArrayElement (env, items, i);
text = (*env)->GetStringUTFChars (env, item, NULL);
! gtk_clist_append (list, (char **)&text);
(*env)->ReleaseStringUTFChars (env, item, text);
}
! gtk_clist_columns_autosize (list);
gdk_threads_leave ();
}
JNIEXPORT void JNICALL
*************** static void
*** 326,334 ****
item_select (GtkCList *list __attribute__((unused)),
int row, int col __attribute__((unused)),
GdkEventButton *event __attribute__((unused)),
! jobject *peer_obj)
{
! (*gdk_env)->CallVoidMethod (gdk_env, *peer_obj,
postListItemEventID,
row,
(jint) AWT_ITEM_SELECTED);
--- 317,325 ----
item_select (GtkCList *list __attribute__((unused)),
int row, int col __attribute__((unused)),
GdkEventButton *event __attribute__((unused)),
! jobject peer_obj)
{
! (*gdk_env)->CallVoidMethod (gdk_env, peer_obj,
postListItemEventID,
row,
(jint) AWT_ITEM_SELECTED);
*************** item_unselect (GtkCList *list __attribut
*** 339,363 ****
int row,
int col __attribute__((unused)),
GdkEventButton *event __attribute__((unused)),
! jobject *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);
- }
--- 331,341 ----
int row,
int col __attribute__((unused)),
GdkEventButton *event __attribute__((unused)),
! jobject peer_obj)
{
! (*gdk_env)->CallVoidMethod (gdk_env, peer_obj,
postListItemEventID,
row,
(jint) AWT_ITEM_DESELECTED);
}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c,v
retrieving revision 1.2
diff -c -p -r1.2 gnu_java_awt_peer_gtk_GtkMenuItemPeer.c
*** jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c 8 Oct 2003 15:49:33 -0000 1.2
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c 8 Dec 2003 23:42:05 -0000
*************** connect_activate_hook (JNIEnv *env, jobj
*** 109,114 ****
obj = (jobject *) malloc (sizeof (jobject));
*obj = (*env)->NewGlobalRef (env, peer_obj);
! gtk_signal_connect (GTK_OBJECT (item), "activate",
GTK_SIGNAL_FUNC (item_activate), obj);
}
--- 109,114 ----
obj = (jobject *) malloc (sizeof (jobject));
*obj = (*env)->NewGlobalRef (env, peer_obj);
! g_signal_connect (G_OBJECT (item), "activate",
GTK_SIGNAL_FUNC (item_activate), obj);
}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c,v
retrieving revision 1.2
diff -c -p -r1.2 gnu_java_awt_peer_gtk_GtkMenuPeer.c
*** jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c 8 Oct 2003 15:49:33 -0000 1.2
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c 8 Dec 2003 23:42:05 -0000
*************** JNIEXPORT void JNICALL Java_gnu_java_awt
*** 66,72 ****
if (GTK_WIDGET_REALIZED (GTK_WIDGET (ptr1)))
accel_attach (GTK_MENU_ITEM (ptr1), NULL);
else
! gtk_signal_connect (GTK_OBJECT (ptr1),
"realize",
GTK_SIGNAL_FUNC (accel_attach),
NULL);
--- 66,72 ----
if (GTK_WIDGET_REALIZED (GTK_WIDGET (ptr1)))
accel_attach (GTK_MENU_ITEM (ptr1), NULL);
else
! g_signal_connect (G_OBJECT (ptr1),
"realize",
GTK_SIGNAL_FUNC (accel_attach),
NULL);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c,v
retrieving revision 1.2
diff -c -p -r1.2 gnu_java_awt_peer_gtk_GtkPanelPeer.c
*** jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c 8 Oct 2003 15:49:33 -0000 1.2
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c 8 Dec 2003 23:42:05 -0000
*************** exception statement from your version. *
*** 37,42 ****
--- 37,43 ----
#include "gtkpeer.h"
+ #include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
#include "gnu_java_awt_peer_gtk_GtkPanelPeer.h"
JNIEXPORT void JNICALL
*************** struct _GtkLayoutChild {
*** 61,67 ****
};
JNIEXPORT void JNICALL
! Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectHooks
(JNIEnv *env, jobject obj)
{
void *ptr;
--- 62,68 ----
};
JNIEXPORT void JNICALL
! Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectJObject
(JNIEnv *env, jobject obj)
{
void *ptr;
*************** Java_gnu_java_awt_peer_gtk_GtkPanelPeer_
*** 72,80 ****
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), */
/* NULL); */
gdk_threads_leave ();
}
/*
--- 73,98 ----
gtk_widget_realize (GTK_WIDGET (ptr));
connect_awt_hook (env, obj, 1, GTK_LAYOUT (ptr)->bin_window);
! 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);
}
/*
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c,v
retrieving revision 1.4
diff -c -p -r1.4 gnu_java_awt_peer_gtk_GtkScrollBarPeer.c
*** jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c 18 Jul 2003 19:27:42 -0000 1.4
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c 8 Dec 2003 23:42:05 -0000
*************** exception statement from your version. *
*** 37,42 ****
--- 37,43 ----
#include "gtkpeer.h"
+ #include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
#include "gnu_java_awt_peer_gtk_GtkScrollbarPeer.h"
struct range_scrollbar
*************** Java_gnu_java_awt_peer_gtk_GtkScrollbarP
*** 120,126 ****
}
JNIEXPORT void JNICALL
! Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectHooks
(JNIEnv *env, jobject obj)
{
void *ptr;
--- 121,144 ----
}
JNIEXPORT void JNICALL
! 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;
*************** Java_gnu_java_awt_peer_gtk_GtkScrollbarP
*** 136,152 ****
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)),
"move-slider",
GTK_SIGNAL_FUNC (post_adjustment_event), rs);
! gtk_signal_connect (GTK_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 ();
}
--- 154,172 ----
rs->range = GTK_RANGE (ptr);
rs->scrollbar = (jobject *) malloc (sizeof (jobject));
*(rs->scrollbar) = (*env)->NewGlobalRef (env, obj);
!
! g_signal_connect (G_OBJECT (GTK_RANGE (ptr)),
"move-slider",
GTK_SIGNAL_FUNC (post_adjustment_event), rs);
! g_signal_connect (G_OBJECT (GTK_RANGE (ptr)),
"value-changed",
GTK_SIGNAL_FUNC (post_change_event), rs);
gdk_threads_leave ();
+
+ /* Connect the superclass signals. */
+ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c,v
retrieving revision 1.8
diff -c -p -r1.8 gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
*** jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c 1 Dec 2003 20:23:50 -0000 1.8
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c 8 Dec 2003 23:42:05 -0000
*************** static void textcomponent_changed_cb (Gt
*** 48,54 ****
jobject peer);
JNIEXPORT void JNICALL
! Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectHooks
(JNIEnv *env, jobject obj)
{
void *ptr;
--- 48,54 ----
jobject peer);
JNIEXPORT void JNICALL
! Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectSignals
(JNIEnv *env, jobject obj)
{
void *ptr;
*************** Java_gnu_java_awt_peer_gtk_GtkTextCompon
*** 66,71 ****
--- 66,76 ----
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
{
*************** Java_gnu_java_awt_peer_gtk_GtkTextCompon
*** 87,99 ****
if (buf)
g_signal_connect (buf, "changed",
G_CALLBACK (textcomponent_changed_cb), obj);
- }
- }
! gdk_threads_leave ();
! /* Connect the superclass hooks. */
! Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks (env, obj);
}
JNIEXPORT jint JNICALL
--- 92,109 ----
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 ();
! }
! }
}
JNIEXPORT jint JNICALL
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c,v
retrieving revision 1.9
diff -c -p -r1.9 gnu_java_awt_peer_gtk_GtkWindowPeer.c
*** jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c 24 Oct 2003 19:40:30 -0000 1.9
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c 8 Dec 2003 23:42:05 -0000
*************** exception statement from your version. *
*** 37,42 ****
--- 37,43 ----
#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>
*************** Java_gnu_java_awt_peer_gtk_GtkWindowPeer
*** 116,122 ****
NSA_SET_PTR (env, obj, window_widget);
}
! JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetVisible
(JNIEnv *env, jobject obj, jboolean visible)
{
void *ptr;
--- 117,124 ----
NSA_SET_PTR (env, obj, window_widget);
}
! JNIEXPORT void JNICALL
! Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetVisible
(JNIEnv *env, jobject obj, jboolean visible)
{
void *ptr;
*************** JNIEXPORT void JNICALL Java_gnu_java_awt
*** 135,141 ****
gdk_threads_leave ();
}
! JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectHooks
(JNIEnv *env, jobject obj)
{
void *ptr;
--- 137,144 ----
gdk_threads_leave ();
}
! JNIEXPORT void JNICALL
! Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectJObject
(JNIEnv *env, jobject obj)
{
void *ptr;
*************** JNIEXPORT void JNICALL Java_gnu_java_awt
*** 169,174 ****
--- 172,192 ----
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);
*************** JNIEXPORT void JNICALL Java_gnu_java_awt
*** 189,194 ****
--- 207,215 ----
G_CALLBACK (window_window_state_cb), obj);
gdk_threads_leave ();
+
+ /* Connect the superclass signals. */
+ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
}
/*
Index: jni/gtk-peer/gtkpeer.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gtkpeer.h,v
retrieving revision 1.9
diff -c -p -r1.9 gtkpeer.h
*** jni/gtk-peer/gtkpeer.h 24 Oct 2003 19:40:30 -0000 1.9
--- jni/gtk-peer/gtkpeer.h 8 Dec 2003 23:42:05 -0000
*************** extern GtkWindowGroup *global_gtk_window
*** 392,397 ****
--- 392,401 ----
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);