This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[PATCH] AWT List Mouse Events Fix
- From: Fernando Nasser <fnasser at redhat dot com>
- To: java-patches at gcc dot gnu dot org
- Date: Fri, 28 Nov 2003 16:30:50 -0500
- Subject: [PATCH] AWT List Mouse Events Fix
- Organization: Red Hat , Inc. - Toronto
This patch allow AWT List widgets to get mouse events.
(For List to work reliably another patch for
libjava/gnu/java/awt/peer/gtk/GtkListPeer.java, which is on the works is needed.)
Index: libjava/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.9
diff -c -p -r1.9 gnu_java_awt_peer_gtk_GtkEvents.c
*** libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c 9 Oct 2003 00:26:29 -0000 1.9
--- libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c 28 Nov 2003 21:10:07 -0000
*************** generates_key_typed_event (GdkEvent *eve
*** 813,819 ****
void
awt_event_handler (GdkEvent *event)
{
! jobject *event_obj_ptr;
static guint32 button_click_time = 0;
static GdkWindow *button_window = NULL;
static guint button_number = -1;
--- 813,819 ----
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;
*************** awt_event_handler (GdkEvent *event)
*** 827,832 ****
--- 827,850 ----
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
+ || event->type == GDK_LEAVE_NOTIFY
+ || event->type == GDK_CONFIGURE
+ || event->type == GDK_EXPOSE
+ || event->type == GDK_KEY_PRESS
+ || event->type == GDK_KEY_RELEASE
+ || 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)
*************** awt_event_handler (GdkEvent *event)
*** 845,862 ****
/* 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 */
! if ((event->type == GDK_BUTTON_PRESS
! || event->type == GDK_BUTTON_RELEASE
! || event->type == GDK_ENTER_NOTIFY
! || event->type == GDK_LEAVE_NOTIFY
! || event->type == GDK_CONFIGURE
! || event->type == GDK_EXPOSE
! || event->type == GDK_KEY_PRESS
! || event->type == GDK_KEY_RELEASE
! || event->type == GDK_FOCUS_CHANGE
! || event->type == GDK_MOTION_NOTIFY)
! && gdk_property_get (event->any.window,
gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE),
gdk_atom_intern ("CARDINAL", FALSE),
0,
--- 863,871 ----
/* 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,
*************** awt_event_handler (GdkEvent *event)
*** 867,872 ****
--- 876,906 ----
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;
*************** awt_event_handler (GdkEvent *event)
*** 879,908 ****
grab_widget = global_gtk_window_group->grabs->data;
g_assert (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);
-
ptr = NSA_GET_PTR (gdk_env, *event_obj_ptr);
event_widget = GTK_WIDGET(ptr);
! if (GTK_WIDGET_IS_SENSITIVE (event_widget) &&
! gtk_widget_is_ancestor (event_widget, grab_widget))
{
! g_free (grab_obj_ptr);
! grab_obj_ptr = event_obj_ptr;
}
}
! else
grab_obj_ptr = event_obj_ptr;
switch (event->type)
{
--- 913,959 ----
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 is
! * 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)
{
*************** awt_event_handler (GdkEvent *event)
*** 1185,1191 ****
default:
break;
}
! g_free (event_obj_ptr);
}
gtk_main_do_event (event);
--- 1236,1242 ----
default:
break;
}
! g_free (grab_obj_ptr);
}
gtk_main_do_event (event);