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]

[gui] [PATCH] Fixes to TextComponent and TextArea


Hi,

I committed the following patch to the java-gui-branch.  It fixes a
couple bugs related to TextComponent and TextArea.  First, it makes sure
that the text cursor is set to the beginning of the text, to match Sun
AWT's behaviour.

It also eliminates an infinite feedback loop problem, where a call to
TextArea.repaint() will cause a GTK expose event, which results in a
call to TextArea.repaint() again.  A mechanism to stop this type of
problem was already in place; TextArea just needed to be handled
separately.

-David Jee

2004-06-09  David Jee  <djee@redhat.com>

        * gnu/java/awt/peer/gtk/GtkTextComponentPeer.java
        (GtkTextComponentPeer): Set caret position to 0.
        * java/awt/TextComponent.java
        (setText): Set caret position to 0.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
        (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_addExposeFilter):
        Handle GtkScrolledWindow separately. Fix signal handler blocking.
        (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_removeExposeFilter):
        Likewise.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
        (Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_create): Make cursor
        visible.


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.7
diff -u -r1.7 GtkTextComponentPeer.java
--- gnu/java/awt/peer/gtk/GtkTextComponentPeer.java	11 Dec 2003 13:50:50 -0000	1.7
+++ gnu/java/awt/peer/gtk/GtkTextComponentPeer.java	9 Jun 2004 20:51:44 -0000
@@ -54,6 +54,7 @@
     super (tc);
 
     setText (tc.getText ());
+    setCaretPosition(0);
   }
 
   public native void connectSignals ();
Index: java/awt/TextComponent.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/TextComponent.java,v
retrieving revision 1.11
diff -u -r1.11 TextComponent.java
--- java/awt/TextComponent.java	4 Dec 2003 19:31:01 -0000	1.11
+++ java/awt/TextComponent.java	9 Jun 2004 20:51:46 -0000
@@ -142,6 +142,7 @@
   TextComponentPeer tcp = (TextComponentPeer)getPeer();
   if (tcp != null)
     tcp.setText(text);
+  setCaretPosition(0);
 }
 
 /*************************************************************************/
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.15.2.12
diff -u -r1.15.2.12 gnu_java_awt_peer_gtk_GtkComponentPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c	27 May 2004 18:40:20 -0000	1.15.2.12
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c	9 Jun 2004 20:51:46 -0000
@@ -1131,12 +1131,23 @@
 
       filterobj = GTK_OBJECT(layout);
     }
+  else if (GTK_IS_SCROLLED_WINDOW(ptr))
+    {
+      // The event will go to the parent GtkLayout.
+      filterobj = GTK_OBJECT(GTK_WIDGET(ptr)->parent);
+    }
   else
     {
       filterobj = GTK_OBJECT(ptr);
     }
 
-  g_signal_handlers_block_by_func (filterobj, *pre_event_handler, *gref);
+  gulong hid = g_signal_handler_find(filterobj,
+                                     G_SIGNAL_MATCH_FUNC,
+                                     0, 0, NULL, *pre_event_handler, NULL);
+  if (hid > 0)
+  {
+    g_signal_handler_block(filterobj, hid);
+  }
   g_signal_connect( filterobj, "event",
                     G_CALLBACK(filter_expose_event_handler), *gref);
 
@@ -1175,6 +1186,11 @@
 
       filterobj = GTK_OBJECT(layout);
     }
+  else if (GTK_IS_SCROLLED_WINDOW(ptr))
+    {
+      // The event will go to the parent GtkLayout.
+      filterobj = GTK_OBJECT(GTK_WIDGET(ptr)->parent);
+    }
   else
     {
       filterobj = GTK_OBJECT(ptr);
@@ -1182,7 +1198,13 @@
 
   g_signal_handlers_disconnect_by_func (filterobj,
                                         *filter_expose_event_handler, *gref);
-  g_signal_handlers_unblock_by_func (filterobj, *pre_event_handler, *gref);
+  gulong hid = g_signal_handler_find(filterobj,
+                                     G_SIGNAL_MATCH_FUNC,
+                                     0, 0, NULL, *pre_event_handler, NULL);
+  if (hid > 0)
+  {
+    g_signal_handler_unblock(filterobj, hid);
+  }
 
   gdk_threads_leave ();
 }
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c,v
retrieving revision 1.11.8.3
diff -u -r1.11.8.3 gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c	27 May 2004 18:40:20 -0000	1.11.8.3
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c	9 Jun 2004 20:51:46 -0000
@@ -54,6 +54,8 @@
 
   text = gtk_text_view_new ();
   gtk_widget_set_size_request (text, textview_width, textview_height);
+  gtk_text_view_set_cursor_visible(text, TRUE);
+
   gtk_widget_show (text);
 
   sw = gtk_scrolled_window_new (NULL, NULL);

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