Implemented support for mouse scrolling in weston-terminal
authorMagnus Hoff <maghoff@gmail.com>
Tue, 5 Aug 2014 13:05:59 +0000 (15:05 +0200)
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>
Fri, 15 Aug 2014 13:06:05 +0000 (16:06 +0300)
[Pekka Paalanen: fixed some code style issues]

clients/terminal.c

index eb133cd..0bacbe0 100644 (file)
@@ -447,6 +447,7 @@ struct terminal {
        int width, height, row, column, max_width;
        uint32_t buffer_height;
        uint32_t start, end, saved_start, log_size;
+       wl_fixed_t smooth_scroll;
        int saved_row, saved_column;
        int scrolling;
        int send_cursor_position;
@@ -2785,6 +2786,55 @@ motion_handler(struct widget *widget,
        return CURSOR_IBEAM;
 }
 
+/* This magnitude is chosen rather arbitrarily. Really, the scrolling
+ * should happen on a (fractional) pixel basis, not a line basis. */
+#define AXIS_UNITS_PER_LINE 256
+
+static void
+axis_handler(struct widget *widget,
+            struct input *input, uint32_t time,
+            uint32_t axis,
+            wl_fixed_t value,
+            void *data)
+{
+       struct terminal *terminal = data;
+       int lines;
+
+       if (axis != WL_POINTER_AXIS_VERTICAL_SCROLL)
+               return;
+
+       terminal->smooth_scroll += value;
+       lines = terminal->smooth_scroll / AXIS_UNITS_PER_LINE;
+       terminal->smooth_scroll -= lines * AXIS_UNITS_PER_LINE;
+
+       if (lines > 0) {
+               if (terminal->scrolling) {
+                       if ((uint32_t)lines > terminal->saved_start - terminal->start)
+                               lines = terminal->saved_start - terminal->start;
+               } else {
+                       lines = 0;
+               }
+       } else if (lines < 0) {
+               uint32_t neg_lines = -lines;
+
+               if (neg_lines > terminal->log_size + terminal->start - terminal->end)
+                       lines = terminal->end - terminal->log_size - terminal->start;
+       }
+
+       if (lines) {
+               if (!terminal->scrolling)
+                       terminal->saved_start = terminal->start;
+               terminal->scrolling = 1;
+
+               terminal->start += lines;
+               terminal->row -= lines;
+               terminal->selection_start_row -= lines;
+               terminal->selection_end_row -= lines;
+
+               widget_schedule_redraw(widget);
+       }
+}
+
 static void
 output_handler(struct window *window, struct output *output, int enter,
               void *data)
@@ -2880,6 +2930,7 @@ terminal_create(struct display *display)
        widget_set_button_handler(terminal->widget, button_handler);
        widget_set_enter_handler(terminal->widget, enter_handler);
        widget_set_motion_handler(terminal->widget, motion_handler);
+       widget_set_axis_handler(terminal->widget, axis_handler);
        widget_set_touch_up_handler(terminal->widget, touch_up_handler);
        widget_set_touch_down_handler(terminal->widget, touch_down_handler);
        widget_set_touch_motion_handler(terminal->widget, touch_motion_handler);