[Top][All Lists]
[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;
}
- [cp-patches] [patch] fix GTK scrollbar peer,
Thomas Fitzsimmons <=