From 277ddb139d8a83611d1959491cdd46c30eaeeb60 Mon Sep 17 00:00:00 2001
From: Cedric Roux <cedric.roux@eurecom.fr>
Date: Wed, 4 May 2016 17:54:00 +0200
Subject: [PATCH] middle button to toggle event reception in event selector
 window

---
 common/utils/T/tracer/event_selector.c | 65 +++++++++++++++++++++++++-
 1 file changed, 64 insertions(+), 1 deletion(-)

diff --git a/common/utils/T/tracer/event_selector.c b/common/utils/T/tracer/event_selector.c
index 833939ff5d..bc1f25f4b7 100644
--- a/common/utils/T/tracer/event_selector.c
+++ b/common/utils/T/tracer/event_selector.c
@@ -16,6 +16,11 @@ struct event_selector {
   int nevents;
   int ngroups;
   int socket;
+  int paused;
+  /* those three widgets used to pause/unpause reception of events */
+  widget *parent_widget;
+  widget *normal_widget;
+  widget *pause_widget;
 };
 
 static void scroll(void *private, gui *g,
@@ -54,6 +59,46 @@ static void click(void *private, gui *g,
   int i;
   char t;
 
+  /* notification_data depends on the kind of widget */
+  if (w == this->pause_widget) {
+    line = 0;
+    button = d[0];
+  } else {
+    line = d[0];
+    button = d[1];
+  }
+
+  /* middle-button toggles - redo with SPACE when keyboard is processed */
+  if (button == 2) {
+    if (this->paused == 0) {
+      widget_del_child(g, this->parent_widget, this->normal_widget);
+      widget_add_child(g, this->parent_widget, this->pause_widget, 0);
+      container_set_child_growable(g, this->parent_widget,
+          this->pause_widget, 1);
+      /* pause */
+      t = 1;
+      socket_send(this->socket, &t, 1);
+      socket_send(this->socket, &this->nevents, sizeof(int));
+      set_on = 0;
+      for (i = 0; i < this->nevents; i++)
+        socket_send(this->socket, &set_on, sizeof(int));
+    } else {
+      widget_del_child(g, this->parent_widget, this->pause_widget);
+      widget_add_child(g, this->parent_widget, this->normal_widget, 0);
+      container_set_child_growable(g, this->parent_widget,
+          this->normal_widget, 1);
+      /* un-pause */
+      t = 1;
+      socket_send(this->socket, &t, 1);
+      socket_send(this->socket, &this->nevents, sizeof(int));
+      socket_send(this->socket, this->is_on, this->nevents * sizeof(int));
+    }
+    this->paused = 1 - this->paused;
+    return;
+  }
+
+  if (w == this->pause_widget) return;
+
   if (button != 1 && button != 3) return;
 
   if (button == 1) set_on = 1; else set_on = 0;
@@ -87,10 +132,12 @@ event_selector *setup_event_selector(gui *g, void *database, int socket,
 {
   struct event_selector *ret;
   widget *win;
+  widget *win_container;
   widget *main_container;
   widget *container;
   widget *left, *right;
   widget *events, *groups;
+  widget *pause_container;
   char **ids;
   char **gps;
   int n;
@@ -103,8 +150,12 @@ event_selector *setup_event_selector(gui *g, void *database, int socket,
   green = new_color(g, "#2f9e2a");
 
   win = new_toplevel_window(g, 470, 300, "event selector");
+  win_container = new_container(g, VERTICAL);
+  widget_add_child(g, win, win_container, -1);
+
   main_container = new_container(g, VERTICAL);
-  widget_add_child(g, win, main_container, -1);
+  widget_add_child(g, win_container, main_container, -1);
+  container_set_child_growable(g, win_container, main_container, 1);
 
   container = new_container(g, HORIZONTAL);
   widget_add_child(g, main_container, container, -1);
@@ -132,6 +183,12 @@ event_selector *setup_event_selector(gui *g, void *database, int socket,
   container_set_child_growable(g, left, events, 1);
   container_set_child_growable(g, right, groups, 1);
 
+  pause_container = new_positioner(g);
+  widget_add_child(g, pause_container,
+      new_label(g,
+          "events' reception paused - click middle button to resume"), -1);
+  label_set_clickable(g, pause_container, 1);
+
   n = database_get_ids(database, &ids);
   for (i = 0; i < n; i++) {
     textlist_add(g, events, ids[i], -1,
@@ -158,6 +215,10 @@ event_selector *setup_event_selector(gui *g, void *database, int socket,
   ret->database = database;
   ret->socket = socket;
 
+  ret->parent_widget = win_container;
+  ret->normal_widget = main_container;
+  ret->pause_widget = pause_container;
+
   register_notifier(g, "scrollup", events, scroll, ret);
   register_notifier(g, "scrolldown", events, scroll, ret);
   register_notifier(g, "click", events, click, ret);
@@ -166,5 +227,7 @@ event_selector *setup_event_selector(gui *g, void *database, int socket,
   register_notifier(g, "scrolldown", groups, scroll, ret);
   register_notifier(g, "click", groups, click, ret);
 
+  register_notifier(g, "click", pause_container, click, ret);
+
   return ret;
 }
-- 
2.26.2