This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] AWT List Mouse Events Fix


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);

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]