classpath-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cp-patches] [patch] fix GTK scrollbar peer


From: Thomas Fitzsimmons
Subject: [cp-patches] [patch] fix GTK scrollbar peer
Date: Tue, 24 May 2005 21:18:38 -0400

Hi,

This patch fixes a long-standing bug in the GTK scrollbar peer.  The
proper fix required some GTK work:

http://bugzilla.gnome.org/show_bug.cgi?id=133263

The patch there landed in GTK 2.6.  The attached patch, which I
committed to GNU Classpath HEAD, changes the configure check to require
GTK 2.6 and takes advantage of the new "change-value" signal.  This
fixes two aspects of scrolling:

- adjustment types are now supported properly (UNIT_INCREMENT/DECREMENT,
BLOCK_INCREMENT/DECREMENT and TRACK type adjustments).

- setting a scrollbar's value works, without causing a callback loop
(callback loops cause strange behaviour, where e.g. two scrollbars
linked together will start oscillating crazily forever as soon as one is
adjusted)

Tom

2005-05-24  Thomas Fitzsimmons  <address@hidden>

        * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c
        (connectSignals): Connect to new change-value signal.
        (post_change_event): Remove signal handler.
        (slider_moved_cb): New signal handler.
        * configure.ac: Require gtk+-2.0 >= 2.6.

Index: configure.ac
===================================================================
RCS file: /cvsroot/classpath/classpath/configure.ac,v
retrieving revision 1.86
diff -u -r1.86 configure.ac
--- configure.ac        10 May 2005 15:20:04 -0000      1.86
+++ configure.ac        25 May 2005 01:10:46 -0000
@@ -264,7 +264,7 @@
      AC_CHECK_LIB([Xtst], [XTestQueryExtension], [true],
                  [AC_MSG_ERROR([libXtst NOT found, required for GdkRobot])],
                  [${X_LIBS}])
-     PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.4 gthread-2.0 >= 2.2 libart-2.0 
gdk-pixbuf-2.0)
+     PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.6 gthread-2.0 >= 2.2 libart-2.0 
gdk-pixbuf-2.0)
      AC_SUBST(GTK_CFLAGS)
      AC_SUBST(GTK_LIBS)
   fi
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c,v
retrieving revision 1.12
diff -u -r1.12 gnu_java_awt_peer_gtk_GtkScrollBarPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c        19 Jan 
2005 08:10:27 -0000      1.12
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c        25 May 
2005 01:10:48 -0000
@@ -36,16 +36,20 @@
 exception statement from your version. */
 
 
+#include <math.h>
 #include "gtkpeer.h"
 #include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
 #include "gnu_java_awt_peer_gtk_GtkScrollbarPeer.h"
 
-static void post_change_event (GtkRange *range, jobject peer);
+static gboolean slider_moved_cb (GtkRange *range,
+                                 GtkScrollType scroll,
+                                 gdouble value,
+                                 jobject obj);
 
-JNIEXPORT void JNICALL 
+JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_create
-(JNIEnv *env, jobject obj, jint orientation, jint value, 
- jint min, jint max, jint step_incr, jint page_incr, jint visible_amount)
+  (JNIEnv *env, jobject obj, jint orientation, jint value,
+   jint min, jint max, jint step_incr, jint page_incr, jint visible_amount)
 {
   GtkWidget *scrollbar;
   GtkObject *adj;
@@ -54,7 +58,7 @@
   NSA_SET_GLOBAL_REF (env, obj);
 
   gdk_threads_enter ();
-  
+
   adj = gtk_adjustment_new ((gdouble) value,
                             (gdouble) min,
                             (gdouble) max,
@@ -62,8 +66,9 @@
                             (gdouble) page_incr,
                            (gdouble) visible_amount);
 
-  scrollbar = (orientation) ? gtk_vscrollbar_new (GTK_ADJUSTMENT (adj)) :
-                       gtk_hscrollbar_new (GTK_ADJUSTMENT (adj));
+  scrollbar = orientation
+    ? gtk_vscrollbar_new (GTK_ADJUSTMENT (adj))
+    : gtk_hscrollbar_new (GTK_ADJUSTMENT (adj));
 
   GTK_RANGE (scrollbar)->round_digits = 0;
   /* These calls seem redundant but they are not.  They clamp values
@@ -78,6 +83,21 @@
 }
 
 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 ();
+
+  connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
+
+  gdk_threads_leave ();
+}
+
+JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectSignals
   (JNIEnv *env, jobject obj)
 {
@@ -87,8 +107,8 @@
 
   gdk_threads_enter ();
 
-  g_signal_connect (G_OBJECT (ptr), "value-changed",
-                    G_CALLBACK (post_change_event), *gref);
+  g_signal_connect (G_OBJECT (ptr), "change-value",
+                    GTK_SIGNAL_FUNC (slider_moved_cb), *gref);
 
   gdk_threads_leave ();
 
@@ -96,10 +116,9 @@
   Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
 }
 
-
-JNIEXPORT void JNICALL 
+JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_setLineIncrement
-    (JNIEnv *env, jobject obj, jint amount)
+  (JNIEnv *env, jobject obj, jint amount)
 {
   void *ptr;
   GtkAdjustment *adj;
@@ -115,9 +134,9 @@
   gdk_threads_leave ();
 }
 
-JNIEXPORT void JNICALL 
+JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_setPageIncrement
-    (JNIEnv *env, jobject obj, jint amount)
+  (JNIEnv *env, jobject obj, jint amount)
 {
   void *ptr;
   GtkAdjustment *adj;
@@ -133,9 +152,9 @@
   gdk_threads_leave ();
 }
 
-JNIEXPORT void JNICALL 
+JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_setValues
-    (JNIEnv *env, jobject obj, jint value, jint visible, jint min, jint max)
+  (JNIEnv *env, jobject obj, jint value, jint visible, jint min, jint max)
 {
   void *ptr;
   GtkAdjustment *adj;
@@ -150,16 +169,61 @@
   gtk_range_set_range (GTK_RANGE (ptr), (gdouble) min, (gdouble) max);
   gtk_range_set_value (GTK_RANGE (ptr), (gdouble) value);
 
-  gtk_adjustment_changed (adj);
-
   gdk_threads_leave ();
 }
 
-static void
-post_change_event (GtkRange *range, jobject peer)
-{
-  GtkAdjustment *adj;
-  adj = gtk_range_get_adjustment (range);
-  (*gdk_env())->CallVoidMethod (gdk_env(), peer, postAdjustmentEventID,
-                              AWT_ADJUSTMENT_TRACK, (jint) adj->value);
+static gboolean
+slider_moved_cb (GtkRange *range,
+                 GtkScrollType scroll,
+                 gdouble value,
+                 jobject obj)
+{
+  GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (range));
+
+  value = CLAMP (value, adj->lower,
+                 (adj->upper - adj->page_size));
+
+  if (range->round_digits >= 0)
+    {
+      gdouble power;
+      gint i;
+
+      i = range->round_digits;
+      power = 1;
+      while (i--)
+        power *= 10;
+      
+      value = floor ((value * power) + 0.5) / power;
+    }
+  
+  switch (scroll)
+    {
+    case GTK_SCROLL_STEP_BACKWARD:
+      (*gdk_env())->CallVoidMethod (gdk_env(), obj, postAdjustmentEventID,
+                                    AWT_ADJUSTMENT_UNIT_DECREMENT,
+                                    (jint) value);
+      break;
+    case GTK_SCROLL_STEP_FORWARD:
+      (*gdk_env())->CallVoidMethod (gdk_env(), obj, postAdjustmentEventID,
+                                    AWT_ADJUSTMENT_UNIT_INCREMENT,
+                                    (jint) value);
+      break;
+    case GTK_SCROLL_PAGE_BACKWARD:
+      (*gdk_env())->CallVoidMethod (gdk_env(), obj, postAdjustmentEventID,
+                                    AWT_ADJUSTMENT_BLOCK_DECREMENT,
+                                    (jint) value);
+      break;
+    case GTK_SCROLL_PAGE_FORWARD:
+      (*gdk_env())->CallVoidMethod (gdk_env(), obj, postAdjustmentEventID,
+                                    AWT_ADJUSTMENT_BLOCK_INCREMENT,
+                                    (jint) value);
+      break;
+    default:
+      /* GTK_SCROLL_JUMP: */
+      (*gdk_env())->CallVoidMethod (gdk_env(), obj, postAdjustmentEventID,
+                                    AWT_ADJUSTMENT_TRACK,
+                                    (jint) value);
+      break;
+    }
+  return FALSE;
 }

reply via email to

[Prev in Thread] Current Thread [Next in Thread]