billiob pushed a commit to branch master.

http://git.enlightenment.org/apps/terminology.git/commit/?id=4bc04c5421612cd00cda79bcabdfde29d73c2570

commit 4bc04c5421612cd00cda79bcabdfde29d73c2570
Author: Boris Faure <[email protected]>
Date:   Tue Feb 19 20:03:14 2019 +0100

    termiointernals: be able to mock mouse wheel
---
 src/bin/termio.c          | 112 ++++----------------------------------------
 src/bin/termiointernals.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++
 src/bin/termiointernals.h |   4 ++
 src/bin/termptyext.c      |  38 +++++++++++++++
 4 files changed, 168 insertions(+), 102 deletions(-)

diff --git a/src/bin/termio.c b/src/bin/termio.c
index 9ebe5e0..251a7e4 100644
--- a/src/bin/termio.c
+++ b/src/bin/termio.c
@@ -2688,112 +2688,20 @@ _smart_cb_mouse_wheel(void *data,
 {
    Evas_Event_Mouse_Wheel *ev = event;
    Termio *sd = evas_object_smart_data_get(data);
-   char buf[64];
+   Termio_Modifiers modifiers = {};
 
    EINA_SAFETY_ON_NULL_RETURN(sd);
 
-   /* do not handle horizontal scrolling */
-   if (ev->direction) return;
-
-   if (evas_key_modifier_is_set(ev->modifiers, "Control")) return;
-   if (evas_key_modifier_is_set(ev->modifiers, "Alt")) return;
-   if (evas_key_modifier_is_set(ev->modifiers, "Shift")) return;
-
-   if (sd->pty->mouse_mode == MOUSE_OFF)
-     {
-        if (sd->pty->altbuf)
-          {
-             /* Emulate cursors */
-             buf[0] = 0x1b;
-             buf[1] = 'O';
-             buf[2] = (ev->z < 0) ? 'A' : 'B';
-             buf[3] = 0;
-             termpty_write(sd->pty, buf, strlen(buf));
-          }
-        else
-          {
-             sd->scroll -= (ev->z * 4);
-             if (sd->scroll < 0)
-               sd->scroll = 0;
-             termio_smart_update_queue(sd);
-             miniview_position_offset(term_miniview_get(sd->term),
-                                      ev->z * 4, EINA_TRUE);
+   modifiers.alt = evas_key_modifier_is_set(ev->modifiers, "Alt");
+   modifiers.shift = evas_key_modifier_is_set(ev->modifiers, "Shift");
+   modifiers.ctrl = evas_key_modifier_is_set(ev->modifiers, "Control");
+   modifiers.super = evas_key_modifier_is_set(ev->modifiers, "Super");
+   modifiers.meta = evas_key_modifier_is_set(ev->modifiers, "Meta");
+   modifiers.hyper = evas_key_modifier_is_set(ev->modifiers, "Hyper");
+   modifiers.iso_level3_shift = evas_key_modifier_is_set(ev->modifiers, 
"ISO_Level3_Shift");
+   modifiers.altgr= evas_key_modifier_is_set(ev->modifiers, "AltGr");
 
-             termio_smart_cb_mouse_move_job(sd);
-          }
-     }
-   else
-     {
-       int cx = 0, cy = 0;
-
-       termio_cursor_to_xy(sd, ev->canvas.x, ev->canvas.y, &cx, &cy);
-
-       switch (sd->pty->mouse_ext)
-         {
-          case MOUSE_EXT_NONE:
-            if ((cx < (0xff - ' ')) && (cy < (0xff - ' ')))
-              {
-                 int btn = (ev->z >= 0) ? 1 + 64 : 64;
-
-                 buf[0] = 0x1b;
-                 buf[1] = '[';
-                 buf[2] = 'M';
-                 buf[3] = btn + ' ';
-                 buf[4] = cx + 1 + ' ';
-                 buf[5] = cy + 1 + ' ';
-                 buf[6] = 0;
-                 termpty_write(sd->pty, buf, strlen(buf));
-              }
-            break;
-          case MOUSE_EXT_UTF8: // ESC.[.M.BTN/FLGS.XUTF8.YUTF8
-              {
-                 int v, i;
-                 int btn = (ev->z >= 0) ? 'a' : '`';
-
-                 buf[0] = 0x1b;
-                 buf[1] = '[';
-                 buf[2] = 'M';
-                 buf[3] = btn;
-                 i = 4;
-                 v = cx + 1 + ' ';
-                 if (v <= 127) buf[i++] = v;
-                 else
-                   { // 14 bits for cx/cy - enough i think
-                       buf[i++] = 0xc0 + (v >> 6);
-                       buf[i++] = 0x80 + (v & 0x3f);
-                   }
-                 v = cy + 1 + ' ';
-                 if (v <= 127) buf[i++] = v;
-                 else
-                   { // 14 bits for cx/cy - enough i think
-                       buf[i++] = 0xc0 + (v >> 6);
-                       buf[i++] = 0x80 + (v & 0x3f);
-                   }
-                 buf[i] = 0;
-                 termpty_write(sd->pty, buf, strlen(buf));
-              }
-            break;
-          case MOUSE_EXT_SGR: // ESC.[.<.NUM.;.NUM.;.NUM.M
-              {
-                 int btn = (ev->z >= 0) ? 1 + 64 : 64;
-                 snprintf(buf, sizeof(buf), "%c[<%i;%i;%iM", 0x1b,
-                          btn, cx + 1, cy + 1);
-                 termpty_write(sd->pty, buf, strlen(buf));
-              }
-            break;
-          case MOUSE_EXT_URXVT: // ESC.[.NUM.;.NUM.;.NUM.M
-              {
-                 int btn = (ev->z >= 0) ? 1 + 64 : 64;
-                 snprintf(buf, sizeof(buf), "%c[%i;%i;%iM", 0x1b,
-                          btn + ' ',
-                          cx + 1, cy + 1);
-                 termpty_write(sd->pty, buf, strlen(buf));
-              }
-            break;
-          default:
-            break;
-         }
-     }
+   termio_internal_mouse_wheel(sd, ev, modifiers);
 }
 
 /* }}} */
diff --git a/src/bin/termiointernals.c b/src/bin/termiointernals.c
index 6c3aef5..52da0b4 100644
--- a/src/bin/termiointernals.c
+++ b/src/bin/termiointernals.c
@@ -2113,6 +2113,122 @@ termio_internal_mouse_move(Termio *sd,
 #endif
 }
 
+void
+termio_internal_mouse_wheel(Termio *sd,
+                           Evas_Event_Mouse_Wheel *ev,
+                           Termio_Modifiers modifiers)
+{
+   char buf[64];
+
+   /* do not handle horizontal scrolling */
+   if (ev->direction)
+     {
+        return;
+     }
+
+   if (modifiers.ctrl || modifiers.alt || modifiers.shift)
+     {
+        return;
+     }
+
+   if (sd->pty->mouse_mode == MOUSE_OFF)
+     {
+        if (sd->pty->altbuf)
+          {
+             /* Emulate cursors */
+             buf[0] = 0x1b;
+             buf[1] = 'O';
+             buf[2] = (ev->z < 0) ? 'A' : 'B';
+             buf[3] = 0;
+             termpty_write(sd->pty, buf, strlen(buf));
+          }
+        else
+          {
+             sd->scroll -= (ev->z * 4);
+             if (sd->scroll < 0)
+               sd->scroll = 0;
+             termio_smart_update_queue(sd);
+             miniview_position_offset(term_miniview_get(sd->term),
+                                      ev->z * 4, EINA_TRUE);
+
+             termio_smart_cb_mouse_move_job(sd);
+          }
+     }
+   else
+     {
+       int cx = 0, cy = 0;
+
+       termio_cursor_to_xy(sd, ev->canvas.x, ev->canvas.y, &cx, &cy);
+
+       switch (sd->pty->mouse_ext)
+         {
+          case MOUSE_EXT_NONE:
+            if ((cx < (0xff - ' ')) && (cy < (0xff - ' ')))
+              {
+                 int btn = (ev->z >= 0) ? 1 + 64 : 64;
+
+                 buf[0] = 0x1b;
+                 buf[1] = '[';
+                 buf[2] = 'M';
+                 buf[3] = btn + ' ';
+                 buf[4] = cx + 1 + ' ';
+                 buf[5] = cy + 1 + ' ';
+                 buf[6] = 0;
+                 termpty_write(sd->pty, buf, strlen(buf));
+              }
+            break;
+          case MOUSE_EXT_UTF8: // ESC.[.M.BTN/FLGS.XUTF8.YUTF8
+              {
+                 int v, i;
+                 int btn = (ev->z >= 0) ? 'a' : '`';
+
+                 buf[0] = 0x1b;
+                 buf[1] = '[';
+                 buf[2] = 'M';
+                 buf[3] = btn;
+                 i = 4;
+                 v = cx + 1 + ' ';
+                 if (v <= 127) buf[i++] = v;
+                 else
+                   { // 14 bits for cx/cy - enough i think
+                       buf[i++] = 0xc0 + (v >> 6);
+                       buf[i++] = 0x80 + (v & 0x3f);
+                   }
+                 v = cy + 1 + ' ';
+                 if (v <= 127) buf[i++] = v;
+                 else
+                   { // 14 bits for cx/cy - enough i think
+                       buf[i++] = 0xc0 + (v >> 6);
+                       buf[i++] = 0x80 + (v & 0x3f);
+                   }
+                 buf[i] = 0;
+                 termpty_write(sd->pty, buf, strlen(buf));
+              }
+            break;
+          case MOUSE_EXT_SGR: // ESC.[.<.NUM.;.NUM.;.NUM.M
+              {
+                 int btn = (ev->z >= 0) ? 1 + 64 : 64;
+                 snprintf(buf, sizeof(buf), "%c[<%i;%i;%iM", 0x1b,
+                          btn, cx + 1, cy + 1);
+                 termpty_write(sd->pty, buf, strlen(buf));
+              }
+            break;
+          case MOUSE_EXT_URXVT: // ESC.[.NUM.;.NUM.;.NUM.M
+              {
+                 int btn = (ev->z >= 0) ? 1 + 64 : 64;
+                 snprintf(buf, sizeof(buf), "%c[%i;%i;%iM", 0x1b,
+                          btn + ' ',
+                          cx + 1, cy + 1);
+                 termpty_write(sd->pty, buf, strlen(buf));
+              }
+            break;
+          default:
+            break;
+         }
+     }
+}
+
+
 static void
 _termio_scroll_selection(Termio *sd, Termpty *ty,
                          int direction, int start_y, int end_y)
diff --git a/src/bin/termiointernals.h b/src/bin/termiointernals.h
index 787898b..ecba0b6 100644
--- a/src/bin/termiointernals.h
+++ b/src/bin/termiointernals.h
@@ -119,6 +119,10 @@ void
 termio_internal_mouse_move(Termio *sd,
                            Evas_Event_Mouse_Move *ev,
                            Termio_Modifiers modifiers);
+void
+termio_internal_mouse_wheel(Termio *sd,
+                           Evas_Event_Mouse_Wheel *ev,
+                           Termio_Modifiers modifiers);
 
 void
 termio_selection_dbl_fix(Termio *sd);
diff --git a/src/bin/termptyext.c b/src/bin/termptyext.c
index 5d70fa2..e2f8acf 100644
--- a/src/bin/termptyext.c
+++ b/src/bin/termptyext.c
@@ -214,6 +214,41 @@ _handle_mouse_move(Termpty *ty,
    termio_internal_mouse_move(sd, &ev, modifiers);
 }
 
+/*
+ * Format is tw;X;Y;DIRECTION;VALUE;MODIFIERS
+ * DIRECTION: 1 to go up, 0 to go down
+ */
+static void
+_handle_mouse_wheel(Termpty *ty,
+                    const Eina_Unicode *buf)
+{
+   Evas_Event_Mouse_Wheel ev = {};
+   Termio *sd = termio_get_from_obj(ty->obj);
+   Termio_Modifiers modifiers = {};
+   int value;
+
+   /* X */
+   value = 0;
+   buf += _tytest_arg_get(buf, &value);
+   ev.canvas.x = value;
+   /* Y */
+   value = 0;
+   buf += _tytest_arg_get(buf, &value);
+   ev.canvas.y = value;
+   /* DIRECTION */
+   value = 0;
+   buf += _tytest_arg_get(buf, &value);
+   ev.z = (value == 0)? 1 : -1;
+   /* VALUE */
+   value = 0;
+   buf += _tytest_arg_get(buf, &value);
+   ev.z *= value;
+   /* MODIFIERS */
+   buf += _tytest_modifiers_get(buf, &modifiers);
+
+   termio_internal_mouse_wheel(sd, &ev, modifiers);
+}
+
 static void
 _handle_selection_is(Termpty *ty,
                      const Eina_Unicode *buf)
@@ -321,6 +356,9 @@ tytest_handle_escape_codes(Termpty *ty,
       case 'u':
         _handle_mouse_up(ty, buf + 1);
         break;
+      case 'w':
+        _handle_mouse_wheel(ty, buf + 1);
+        break;
       default:
         break;
      }

-- 


Reply via email to