diff options
author | Jan Djärv <[email protected]> | 2009-12-13 13:31:35 +0000 |
---|---|---|
committer | Jan Djärv <[email protected]> | 2009-12-13 13:31:35 +0000 |
commit | e5f0bc9ada3729749b83cfa246b39dd0d6fceca0 (patch) | |
tree | 4b64bb983b115353fb9b5be07c06cbfa361e3204 /src/xterm.c | |
parent | 223e5fc656a6c8a95e5aac334e8c7b82cc9d2a4b (diff) |
Bug 5177: Scroll bar thumb did not move when scrolling with mouse wheel.
* xterm.c (xg_scroll_callback): Parameter list changed,
use parameter GtkScrollType to determine scroll/line/page.
Only allow dragging if a button < 4 is grabbed (bug #5177).
(xg_end_scroll_callback): New function.
(x_create_toolkit_scroll_bar): Pass xg_end_scroll_callback to
xg_create_scroll_bar.
* gtkutil.c (xg_gtk_scroll_destroy): Remove XG_LAST_SB_DATA handling.
(scroll_end_callback): Remove.
(xg_create_scroll_bar): Add parameter end_callback, bind it to
button-release-event. Replace value-changed event with change-value,
bug #5177,
(xg_event_is_for_scrollbar): Only return true if button is less than 4,
bug #5177.
* gtkutil.h (XG_LAST_SB_DATA): Remove.
(xg_create_scroll_bar): Add GCallback end_callback.
Diffstat (limited to 'src/xterm.c')
-rw-r--r-- | src/xterm.c | 99 |
1 files changed, 55 insertions, 44 deletions
diff --git a/src/xterm.c b/src/xterm.c index 9feb6c8966..231275ea20 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -4374,63 +4374,51 @@ xm_scroll_callback (widget, client_data, call_data) /* Scroll bar callback for GTK scroll bars. WIDGET is the scroll bar widget. DATA is a pointer to the scroll_bar structure. */ -static void -xg_scroll_callback (widget, data) - GtkRange *widget; - gpointer data; +static gboolean +xg_scroll_callback (GtkRange *range, + GtkScrollType scroll, + gdouble value, + gpointer user_data) { - struct scroll_bar *bar = (struct scroll_bar *) data; - gdouble previous; + struct scroll_bar *bar = (struct scroll_bar *) user_data; gdouble position; - gdouble *p; - int diff; - int part = -1, whole = 0, portion = 0; - GtkAdjustment *adj = GTK_ADJUSTMENT (gtk_range_get_adjustment (widget)); + GtkAdjustment *adj = GTK_ADJUSTMENT (gtk_range_get_adjustment (range)); + FRAME_PTR f = (FRAME_PTR) g_object_get_data (G_OBJECT (range), XG_FRAME_DATA); + if (xg_ignore_gtk_scrollbar) return FALSE; position = gtk_adjustment_get_value (adj); - p = g_object_get_data (G_OBJECT (widget), XG_LAST_SB_DATA); - if (! p) - { - p = (gdouble*) xmalloc (sizeof (gdouble)); - *p = XG_SB_MIN; - g_object_set_data (G_OBJECT (widget), XG_LAST_SB_DATA, p); - } - - previous = *p; - *p = position; - if (xg_ignore_gtk_scrollbar) return; - - diff = (int) (position - previous); - - if (diff == (int) adj->step_increment) - { - part = scroll_bar_down_arrow; - bar->dragging = Qnil; - } - else if (-diff == (int) adj->step_increment) + switch (scroll) { + case GTK_SCROLL_JUMP: + /* Buttons 1 2 or 3 must be grabbed. */ + if (FRAME_X_DISPLAY_INFO (f)->grabbed != 0 + && FRAME_X_DISPLAY_INFO (f)->grabbed < (1 << 4)) + { + part = scroll_bar_handle; + whole = adj->upper - adj->page_size; + portion = min ((int)position, whole); + bar->dragging = make_number ((int)portion); + } + break; + case GTK_SCROLL_STEP_BACKWARD: part = scroll_bar_up_arrow; bar->dragging = Qnil; - } - else if (diff == (int) adj->page_increment) - { - part = scroll_bar_below_handle; + break; + case GTK_SCROLL_STEP_FORWARD: + part = scroll_bar_down_arrow; bar->dragging = Qnil; - } - else if (-diff == (int) adj->page_increment) - { + break; + case GTK_SCROLL_PAGE_BACKWARD: part = scroll_bar_above_handle; bar->dragging = Qnil; - } - else - { - part = scroll_bar_handle; - whole = adj->upper - adj->page_size; - portion = min ((int)position, whole); - bar->dragging = make_number ((int)portion); + break; + case GTK_SCROLL_PAGE_FORWARD: + part = scroll_bar_below_handle; + bar->dragging = Qnil; + break; } if (part >= 0) @@ -4439,8 +4427,30 @@ xg_scroll_callback (widget, data) last_scroll_bar_part = part; x_send_scroll_bar_event (bar->window, part, portion, whole); } + + return FALSE; } +/* Callback for button release. Sets dragging to Qnil when dragging is done. */ + +static gboolean +xg_end_scroll_callback (GtkWidget *widget, + GdkEventButton *event, + gpointer user_data) +{ + struct scroll_bar *bar = (struct scroll_bar *) user_data; + bar->dragging = Qnil; + if (WINDOWP (window_being_scrolled)) + { + x_send_scroll_bar_event (window_being_scrolled, + scroll_bar_end_scroll, 0, 0); + window_being_scrolled = Qnil; + } + + return FALSE; +} + + #else /* not USE_GTK and not USE_MOTIF */ /* Xaw scroll bar callback. Invoked when the thumb is dragged. @@ -4541,6 +4551,7 @@ x_create_toolkit_scroll_bar (f, bar) BLOCK_INPUT; xg_create_scroll_bar (f, bar, G_CALLBACK (xg_scroll_callback), + G_CALLBACK (xg_end_scroll_callback), scroll_bar_name); UNBLOCK_INPUT; } |