From d62de525eb7615983d55bf657e0b28d7136d0749 Mon Sep 17 00:00:00 2001
From: Cedric Roux <cedric.roux@eurecom.fr>
Date: Wed, 27 Jul 2016 13:05:46 +0200
Subject: [PATCH] scroll by one line in textlist

to scroll by only one line, hold CONTROL key and scroll with
mouse wheel
---
 common/utils/T/tracer/event_selector.c | 3 +++
 common/utils/T/tracer/gui/gui.h        | 4 ++--
 common/utils/T/tracer/gui/textlist.c   | 4 ++--
 common/utils/T/tracer/view/textlist.c  | 3 +++
 4 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/common/utils/T/tracer/event_selector.c b/common/utils/T/tracer/event_selector.c
index a03846c056..2b6cfd878d 100644
--- a/common/utils/T/tracer/event_selector.c
+++ b/common/utils/T/tracer/event_selector.c
@@ -34,11 +34,14 @@ static void scroll(void *private, gui *g,
   int number_of_lines;
   int new_line;
   int inc;
+  int *d = notification_data;
+  int key_modifiers = *d;
 
   textlist_state(g, w, &visible_lines, &start_line, &number_of_lines);
   inc = 10;
   if (inc > visible_lines - 2) inc = visible_lines - 2;
   if (inc < 1) inc = 1;
+  if (key_modifiers & KEY_CONTROL) inc = 1;
   if (!strcmp(notification, "scrollup")) inc = -inc;
 
   new_line = start_line + inc;
diff --git a/common/utils/T/tracer/gui/gui.h b/common/utils/T/tracer/gui/gui.h
index 673514f138..27e6603042 100644
--- a/common/utils/T/tracer/gui/gui.h
+++ b/common/utils/T/tracer/gui/gui.h
@@ -83,8 +83,8 @@ int new_color(gui *gui, char *color);
 /* notifications */
 /* known notifications:
  * - textlist:
- *      - scrollup   { void *: NULL }
- *      - scrolldown { void *: NULL }
+ *      - scrollup   { int: key_modifiers }
+ *      - scrolldown { int: key_modifiers }
  *      - click      { int [2]: line, button }
  * - label:
  *      - click      { int: button } (if enabled)
diff --git a/common/utils/T/tracer/gui/textlist.c b/common/utils/T/tracer/gui/textlist.c
index 896cba5b9e..e919b7c0a5 100644
--- a/common/utils/T/tracer/gui/textlist.c
+++ b/common/utils/T/tracer/gui/textlist.c
@@ -54,11 +54,11 @@ static void button(gui *_g, widget *_this, int x, int y,
   x -= this->common.x;
   /* scroll up */
   if (button == 4 && up == 0) {
-    gui_notify(g, "scrollup", _this, NULL);
+    gui_notify(g, "scrollup", _this, &key_modifiers);
   }
   /* scroll down */
   if (button == 5 && up == 0) {
-    gui_notify(g, "scrolldown", _this, NULL);
+    gui_notify(g, "scrolldown", _this, &key_modifiers);
   }
   /* button 1/2/3 click */
   if (button >= 1 && button <= 3 && up == 0) {
diff --git a/common/utils/T/tracer/view/textlist.c b/common/utils/T/tracer/view/textlist.c
index 5227900e4e..ffa8cbf718 100644
--- a/common/utils/T/tracer/view/textlist.c
+++ b/common/utils/T/tracer/view/textlist.c
@@ -89,6 +89,8 @@ static void scroll(void *private, gui *g,
   int number_of_lines;
   int new_line;
   int inc;
+  int *d = notification_data;
+  int key_modifiers = *d;
 
   if (pthread_mutex_lock(&this->lock)) abort();
 
@@ -96,6 +98,7 @@ static void scroll(void *private, gui *g,
   inc = 10;
   if (inc > visible_lines - 2) inc = visible_lines - 2;
   if (inc < 1) inc = 1;
+  if (key_modifiers & KEY_CONTROL) inc = 1;
   if (!strcmp(notification, "scrollup")) inc = -inc;
 
   new_line = start_line + inc;
-- 
GitLab