billiob pushed a commit to branch master.

http://git.enlightenment.org/apps/terminology.git/commit/?id=1dc0d30b60648d3d87aa410104433eca05e48646

commit 1dc0d30b60648d3d87aa410104433eca05e48646
Author: Boris Faure <bill...@gmail.com>
Date:   Sun Sep 29 17:55:24 2013 +0200

    reorganize structures about selection
---
 src/bin/termio.c  | 411 +++++++++++++++++++++++++++---------------------------
 src/bin/termpty.h |   8 ++
 2 files changed, 214 insertions(+), 205 deletions(-)

diff --git a/src/bin/termio.c b/src/bin/termio.c
index f6c399d..5a0067f 100644
--- a/src/bin/termio.c
+++ b/src/bin/termio.c
@@ -30,14 +30,12 @@ struct _Termio
       Evas_Object *obj;
    } grid;
    struct {
-      Evas_Object *obj, *selo_top, *selo_bottom, *selo_theme;
+        Evas_Object *top, *bottom, *theme;
+   } sel;
+   struct {
+      Evas_Object *obj;
       int x, y;
-      struct {
-         int x, y;
-      } sel1, sel2;
-      Eina_Bool sel : 1;
-      Eina_Bool makesel : 1;
-   } cur;
+   } cursor;
    struct {
       int cx, cy;
       int button;
@@ -45,9 +43,9 @@ struct _Termio
    struct {
       struct {
          int x, y;
-      } sel1, sel2;
-      Eina_Bool sel : 1;
-   } backup;
+      } start, end;
+      Eina_Bool available : 1;
+   } backup_sel;
    struct {
       char *string;
       int x1, y1, x2, y2;
@@ -91,7 +89,6 @@ struct _Termio
    Eina_Bool didclick : 1;
    Eina_Bool bottom_right : 1;
    Eina_Bool top_left : 1;
-   Eina_Bool boxsel : 1;
    Eina_Bool reset_sel : 1;
    Eina_Bool debugwhite : 1;
 };
@@ -110,8 +107,8 @@ static void
 _sel_set(Evas_Object *obj, Eina_Bool enable)
 {
    Termio *sd = evas_object_smart_data_get(obj);
-   if (sd->cur.sel == enable) return;
-   sd->cur.sel = enable;
+   if (sd->pty->selection.is_active == enable) return;
+   sd->pty->selection.is_active = enable;
    if (enable)
      evas_object_smart_callback_call(obj, "selection,on", NULL);
    else
@@ -1529,25 +1526,25 @@ _smart_apply(Evas_Object *obj)
      }
    
    if ((sd->scroll != 0) || (sd->pty->state.hidecursor))
-     evas_object_hide(sd->cur.obj);
+     evas_object_hide(sd->cursor.obj);
    else
-     evas_object_show(sd->cur.obj);
-   sd->cur.x = sd->pty->state.cx;
-   sd->cur.y = sd->pty->state.cy;
-   evas_object_move(sd->cur.obj,
-                    ox + (sd->cur.x * sd->font.chw),
-                    oy + (sd->cur.y * sd->font.chh));
-   if (sd->cur.sel)
+     evas_object_show(sd->cursor.obj);
+   sd->cursor.x = sd->pty->state.cx;
+   sd->cursor.y = sd->pty->state.cy;
+   evas_object_move(sd->cursor.obj,
+                    ox + (sd->cursor.x * sd->font.chw),
+                    oy + (sd->cursor.y * sd->font.chh));
+   if (sd->pty->selection.is_active)
      {
         int start_x, start_y, end_x, end_y;
         int size_top, size_bottom;
 
-        start_x = sd->cur.sel1.x;
-        start_y = sd->cur.sel1.y;
-        end_x = sd->cur.sel2.x;
-        end_y = sd->cur.sel2.y;
+        start_x = sd->pty->selection.start.x;
+        start_y = sd->pty->selection.start.y;
+        end_x = sd->pty->selection.end.x;
+        end_y = sd->pty->selection.end.y;
 
-        if (sd->boxsel)
+        if (sd->pty->selection.is_box)
           {
              if (start_y > end_y)
                INT_SWAP(start_y, end_y);
@@ -1566,10 +1563,10 @@ _smart_apply(Evas_Object *obj)
                      {
                         sd->top_left = EINA_FALSE;
                         sd->bottom_right = EINA_TRUE;
-                        edje_object_signal_emit(sd->cur.selo_theme,
+                        edje_object_signal_emit(sd->sel.theme,
                                                 "mouse,out",
                                                 "zone.top_left");
-                        edje_object_signal_emit(sd->cur.selo_theme,
+                        edje_object_signal_emit(sd->sel.theme,
                                                 "mouse,in",
                                                 "zone.bottom_right");
                      }
@@ -1577,10 +1574,10 @@ _smart_apply(Evas_Object *obj)
                      {
                         sd->top_left = EINA_TRUE;
                         sd->bottom_right = EINA_FALSE;
-                        edje_object_signal_emit(sd->cur.selo_theme,
+                        edje_object_signal_emit(sd->sel.theme,
                                                 "mouse,out",
                                                 "zone.bottom_right");
-                        edje_object_signal_emit(sd->cur.selo_theme,
+                        edje_object_signal_emit(sd->sel.theme,
                                                 "mouse,in",
                                                 "zone.top_left");
                      }
@@ -1590,28 +1587,28 @@ _smart_apply(Evas_Object *obj)
 
         size_bottom = (sd->grid.w - end_x - 1) * sd->font.chw;
 
-        evas_object_size_hint_min_set(sd->cur.selo_top,
+        evas_object_size_hint_min_set(sd->sel.top,
                                       size_top,
                                       sd->font.chh);
-        evas_object_size_hint_max_set(sd->cur.selo_top,
+        evas_object_size_hint_max_set(sd->sel.top,
                                       size_top,
                                       sd->font.chh);
-        evas_object_size_hint_min_set(sd->cur.selo_bottom,
+        evas_object_size_hint_min_set(sd->sel.bottom,
                                       size_bottom,
                                       sd->font.chh);
-        evas_object_size_hint_max_set(sd->cur.selo_bottom,
+        evas_object_size_hint_max_set(sd->sel.bottom,
                                       size_bottom,
                                       sd->font.chh);
-        evas_object_move(sd->cur.selo_theme,
+        evas_object_move(sd->sel.theme,
                          ox,
                          oy + ((start_y + sd->scroll) * sd->font.chh));
-        evas_object_resize(sd->cur.selo_theme,
+        evas_object_resize(sd->sel.theme,
                            sd->grid.w * sd->font.chw,
                            (end_y + 1 - start_y) * sd->font.chh);
 
-        if (sd->boxsel)
+        if (sd->pty->selection.is_box)
           {
-             edje_object_signal_emit(sd->cur.selo_theme,
+             edje_object_signal_emit(sd->sel.theme,
                                   "mode,oneline", "terminology");
           }
         else
@@ -1619,35 +1616,35 @@ _smart_apply(Evas_Object *obj)
              if ((start_y == end_y) ||
                  ((start_x == 0) && (end_x == (sd->grid.w - 1))))
                {
-                  edje_object_signal_emit(sd->cur.selo_theme,
+                  edje_object_signal_emit(sd->sel.theme,
                                           "mode,oneline", "terminology");
                }
              else if ((start_y == (end_y - 1)) &&
                       (start_x > end_x))
                {
-                  edje_object_signal_emit(sd->cur.selo_theme,
+                  edje_object_signal_emit(sd->sel.theme,
                                           "mode,disjoint", "terminology");
                }
              else if (start_x == 0)
                {
-                  edje_object_signal_emit(sd->cur.selo_theme,
+                  edje_object_signal_emit(sd->sel.theme,
                                           "mode,topfull", "terminology");
                }
              else if (end_x == (sd->grid.w - 1))
                {
-                  edje_object_signal_emit(sd->cur.selo_theme,
+                  edje_object_signal_emit(sd->sel.theme,
                                           "mode,bottomfull", "terminology");
                }
              else
                {
-                  edje_object_signal_emit(sd->cur.selo_theme,
+                  edje_object_signal_emit(sd->sel.theme,
                                           "mode,multiline", "terminology");
                }
           }
-        evas_object_show(sd->cur.selo_theme);
+        evas_object_show(sd->sel.theme);
      }
    else
-     evas_object_hide(sd->cur.selo_theme);
+     evas_object_hide(sd->sel.theme);
    if (sd->mouseover_delay) ecore_timer_del(sd->mouseover_delay);
    sd->mouseover_delay = ecore_timer_add(0.05, _smart_mouseover_delay, obj);
 }
@@ -1669,7 +1666,7 @@ _smart_size(Evas_Object *obj, int w, int h, Eina_Bool 
force)
    evas_object_textgrid_size_set(sd->grid.obj, w, h);
    sd->grid.w = w;
    sd->grid.h = h;
-   evas_object_resize(sd->cur.obj, sd->font.chw, sd->font.chh);
+   evas_object_resize(sd->cursor.obj, sd->font.chw, sd->font.chh);
    evas_object_size_hint_min_set(obj, sd->font.chw, sd->font.chh);
    if (!sd->noreqsize)
      evas_object_size_hint_request_set(obj,
@@ -1800,15 +1797,15 @@ _take_selection(Evas_Object *obj, Elm_Sel_Type type)
    size_t len = 0;
 
    if (!sd) return;
-   if (sd->cur.sel)
+   if (sd->pty->selection.is_active)
      {
-        start_x = sd->cur.sel1.x;
-        start_y = sd->cur.sel1.y;
-        end_x = sd->cur.sel2.x;
-        end_y = sd->cur.sel2.y;
+        start_x = sd->pty->selection.start.x;
+        start_y = sd->pty->selection.start.y;
+        end_x = sd->pty->selection.end.x;
+        end_y = sd->pty->selection.end.y;
      }
 
-   if (sd->boxsel)
+   if (sd->pty->selection.is_box)
      {
         int i;
         Eina_Strbuf *sb;
@@ -2288,7 +2285,7 @@ _smart_cb_key_down(void *data, Evas *e EINA_UNUSED,
    keyin_handle(sd->pty, ev);
 end:
    if (sd->config->flicker_on_key)
-     edje_object_signal_emit(sd->cur.obj, "key,down", "terminology");
+     edje_object_signal_emit(sd->cursor.obj, "key,down", "terminology");
 }
 
 static void
@@ -2296,7 +2293,7 @@ _imf_cursor_set(Termio *sd)
 {
    /* TODO */
    Evas_Coord cx, cy, cw, ch;
-   evas_object_geometry_get(sd->cur.obj, &cx, &cy, &cw, &ch);
+   evas_object_geometry_get(sd->cursor.obj, &cx, &cy, &cw, &ch);
    if (sd->imf)
      ecore_imf_context_cursor_location_set(sd->imf, cx, cy, cw, ch);
    /*
@@ -2313,9 +2310,9 @@ _smart_cb_focus_in(void *data, Evas *e EINA_UNUSED,
    sd = evas_object_smart_data_get(data);
    if (!sd) return;
    if (sd->config->disable_cursor_blink)
-     edje_object_signal_emit(sd->cur.obj, "focus,in,noblink", "terminology");
+     edje_object_signal_emit(sd->cursor.obj, "focus,in,noblink", 
"terminology");
    else
-     edje_object_signal_emit(sd->cur.obj, "focus,in", "terminology");
+     edje_object_signal_emit(sd->cursor.obj, "focus,in", "terminology");
    if (!sd->win) return;
    elm_win_keyboard_mode_set(sd->win, ELM_WIN_KEYBOARD_TERMINAL);
    if (sd->imf)
@@ -2338,7 +2335,7 @@ _smart_cb_focus_out(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj,
 
    if (sd->link.ctxpopup) return; /* ctxp triggers focus out we should ignore 
*/
 
-   edje_object_signal_emit(sd->cur.obj, "focus,out", "terminology");
+   edje_object_signal_emit(sd->cursor.obj, "focus,out", "terminology");
    if (!sd->win) return;
    elm_win_keyboard_mode_set(sd->win, ELM_WIN_KEYBOARD_OFF);
    if (sd->imf)
@@ -2385,11 +2382,11 @@ _sel_line(Evas_Object *obj, int cx EINA_UNUSED, int cy)
    termpty_cellcomp_freeze(sd->pty);
 
    _sel_set(obj, EINA_TRUE);
-   sd->cur.makesel = 0;
-   sd->cur.sel1.x = 0;
-   sd->cur.sel1.y = cy;
-   sd->cur.sel2.x = sd->grid.w - 1;
-   sd->cur.sel2.y = cy;
+   sd->pty->selection.makesel = EINA_FALSE;
+   sd->pty->selection.start.x = 0;
+   sd->pty->selection.start.y = cy;
+   sd->pty->selection.end.x = sd->grid.w - 1;
+   sd->pty->selection.end.y = cy;
 
    y = cy;
    for (;;)
@@ -2399,7 +2396,7 @@ _sel_line(Evas_Object *obj, int cx EINA_UNUSED, int cy)
 
         y--;
      }
-   sd->cur.sel1.y = y;
+   sd->pty->selection.start.y = y;
    y = cy;
 
    for (;;)
@@ -2407,10 +2404,10 @@ _sel_line(Evas_Object *obj, int cx EINA_UNUSED, int cy)
         cells = termpty_cellrow_get(sd->pty, y, &w);
         if (!cells || !cells[w-1].att.autowrapped) break;
 
-        sd->cur.sel2.x = w - 1;
+        sd->pty->selection.end.x = w - 1;
         y++;
      }
-   sd->cur.sel2.y = y;
+   sd->pty->selection.end.y = y;
 
    termpty_cellcomp_thaw(sd->pty);
 }
@@ -2447,12 +2444,12 @@ _sel_word(Evas_Object *obj, int cx, int cy)
    termpty_cellcomp_freeze(sd->pty);
 
    _sel_set(obj, EINA_TRUE);
-   sd->cur.makesel = 0;
-   sd->cur.sel1.x = cx;
-   sd->cur.sel1.y = cy;
-   sd->cur.sel2.x = cx;
-   sd->cur.sel2.y = cy;
-   x = sd->cur.sel1.x;
+   sd->pty->selection.makesel = EINA_FALSE;
+   sd->pty->selection.start.x = cx;
+   sd->pty->selection.start.y = cy;
+   sd->pty->selection.end.x = cx;
+   sd->pty->selection.end.y = cy;
+   x = cx;
    y = cy;
    cells = termpty_cellrow_get(sd->pty, y, &w);
    if (!cells) goto end;
@@ -2472,8 +2469,8 @@ _sel_word(Evas_Object *obj, int cx, int cy)
                   done = EINA_TRUE;
                   break;
                }
-             sd->cur.sel1.x = x;
-             sd->cur.sel1.y = y;
+             sd->pty->selection.start.x = x;
+             sd->pty->selection.start.y = y;
           }
         if (!done)
           {
@@ -2502,7 +2499,7 @@ _sel_word(Evas_Object *obj, int cx, int cy)
         cells = termpty_cellrow_get(sd->pty, y, &w);
         if (!cells) goto end;
      }
-   x = sd->cur.sel2.x;
+   x = sd->pty->selection.end.x;
 
    do
      {
@@ -2512,7 +2509,7 @@ _sel_word(Evas_Object *obj, int cx, int cy)
              if ((cells[x].codepoint == 0) && (cells[x].att.dblwidth) &&
                  (x < (w - 1)))
                {
-                  sd->cur.sel2.x = x;
+                  sd->pty->selection.end.x = x;
                   x++;
                }
 #endif
@@ -2521,8 +2518,8 @@ _sel_word(Evas_Object *obj, int cx, int cy)
                   done = EINA_TRUE;
                   break;
                }
-             sd->cur.sel2.x = x;
-             sd->cur.sel2.y = y;
+             sd->pty->selection.end.x = x;
+             sd->pty->selection.end.y = y;
           }
         if (!done)
           {
@@ -2554,11 +2551,11 @@ _sel_word_to(Evas_Object *obj, int cx, int cy)
         termpty_cellcomp_thaw(sd->pty);
         return;
      }
-   if (sd->cur.sel1.x > cx || sd->cur.sel1.y > cy)
+   if (sd->pty->selection.start.x > cx || sd->pty->selection.start.y > cy)
      {
-        sd->cur.sel1.x = cx;
-        sd->cur.sel1.y = cy;
-        for (x = sd->cur.sel1.x; x >= 0; x--)
+        sd->pty->selection.start.x = cx;
+        sd->pty->selection.start.y = cy;
+        for (x = sd->pty->selection.start.x; x >= 0; x--)
           {
 #if defined(SUPPORT_DBLWIDTH)
              if ((cells[x].codepoint == 0) && (cells[x].att.dblwidth) &&
@@ -2567,26 +2564,26 @@ _sel_word_to(Evas_Object *obj, int cx, int cy)
 #endif
              if (x >= w) break;
              if (_codepoint_is_wordsep(sd->config, cells[x].codepoint)) break;
-             sd->cur.sel1.x = x;
+             sd->pty->selection.start.x = x;
           }
      }
-   else if (sd->cur.sel2.x < cx || sd->cur.sel2.y < cy)
+   else if (sd->pty->selection.end.x < cx || sd->pty->selection.end.y < cy)
      {
-        sd->cur.sel2.x = cx;
-        sd->cur.sel2.y = cy;
-        for (x = sd->cur.sel2.x; x < sd->grid.w; x++)
+        sd->pty->selection.end.x = cx;
+        sd->pty->selection.end.y = cy;
+        for (x = sd->pty->selection.end.x; x < sd->grid.w; x++)
           {
 #if defined(SUPPORT_DBLWIDTH)
              if ((cells[x].codepoint == 0) && (cells[x].att.dblwidth) &&
                  (x < (sd->grid.w - 1)))
                {
-                  sd->cur.sel2.x = x;
+                  sd->pty->selection.end.x = x;
                   x++;
                }
 #endif
              if (x >= w) break;
              if (_codepoint_is_wordsep(sd->config, cells[x].codepoint)) break;
-             sd->cur.sel2.x = x;
+             sd->pty->selection.end.x = x;
           }
      }
    termpty_cellcomp_thaw(sd->pty);
@@ -2895,55 +2892,55 @@ _selection_dbl_fix(Evas_Object *obj)
    sd = evas_object_smart_data_get(obj);
    if (!sd) return;
    termpty_cellcomp_freeze(sd->pty);
-   cells = termpty_cellrow_get(sd->pty, sd->cur.sel2.y - sd->scroll, &w);
+   cells = termpty_cellrow_get(sd->pty, sd->pty->selection.end.y - sd->scroll, 
&w);
    if (cells)
      {
         // if sel2 after sel1
-        if ((sd->cur.sel2.y > sd->cur.sel1.y) ||
-            ((sd->cur.sel2.y == sd->cur.sel1.y) &&
-                (sd->cur.sel2.x >= sd->cur.sel1.x)))
+        if ((sd->pty->selection.end.y > sd->pty->selection.start.y) ||
+            ((sd->pty->selection.end.y == sd->pty->selection.start.y) &&
+                (sd->pty->selection.end.x >= sd->pty->selection.start.x)))
           {
-             if (sd->cur.sel2.x < (w - 1))
+             if (sd->pty->selection.end.x < (w - 1))
                {
-                  if ((cells[sd->cur.sel2.x].codepoint != 0) &&
-                      (cells[sd->cur.sel2.x].att.dblwidth))
-                    sd->cur.sel2.x++;
+                  if ((cells[sd->pty->selection.end.x].codepoint != 0) &&
+                      (cells[sd->pty->selection.end.x].att.dblwidth))
+                    sd->pty->selection.end.x++;
                }
           }
         // else sel1 after sel 2
         else
           {
-             if (sd->cur.sel2.x > 0)
+             if (sd->pty->selection.end.x > 0)
                {
-                  if ((cells[sd->cur.sel2.x].codepoint == 0) &&
-                      (cells[sd->cur.sel2.x].att.dblwidth))
-                    sd->cur.sel2.x--;
+                  if ((cells[sd->pty->selection.end.x].codepoint == 0) &&
+                      (cells[sd->pty->selection.end.x].att.dblwidth))
+                    sd->pty->selection.end.x--;
                }
           }
      }
-   cells = termpty_cellrow_get(sd->pty, sd->cur.sel1.y - sd->scroll, &w);
+   cells = termpty_cellrow_get(sd->pty, sd->pty->selection.start.y - 
sd->scroll, &w);
    if (cells)
      {
         // if sel2 after sel1
-        if ((sd->cur.sel2.y > sd->cur.sel1.y) ||
-            ((sd->cur.sel2.y == sd->cur.sel1.y) &&
-                (sd->cur.sel2.x >= sd->cur.sel1.x)))
+        if ((sd->pty->selection.end.y > sd->pty->selection.start.y) ||
+            ((sd->pty->selection.end.y == sd->pty->selection.start.y) &&
+                (sd->pty->selection.end.x >= sd->pty->selection.start.x)))
           {
-             if (sd->cur.sel1.x > 0)
+             if (sd->pty->selection.start.x > 0)
                {
-                  if ((cells[sd->cur.sel1.x].codepoint == 0) &&
-                      (cells[sd->cur.sel1.x].att.dblwidth))
-                    sd->cur.sel1.x--;
+                  if ((cells[sd->pty->selection.start.x].codepoint == 0) &&
+                      (cells[sd->pty->selection.start.x].att.dblwidth))
+                    sd->pty->selection.start.x--;
                }
           }
         // else sel1 after sel 2
         else
           {
-             if (sd->cur.sel1.x < (w - 1))
+             if (sd->pty->selection.start.x < (w - 1))
                {
-                  if ((cells[sd->cur.sel1.x].codepoint != 0) &&
-                      (cells[sd->cur.sel1.x].att.dblwidth))
-                    sd->cur.sel1.x++;
+                  if ((cells[sd->pty->selection.start.x].codepoint != 0) &&
+                      (cells[sd->pty->selection.start.x].att.dblwidth))
+                    sd->pty->selection.start.x++;
                }
           }
      }
@@ -2957,26 +2954,26 @@ _selection_newline_extend_fix(Evas_Object *obj)
    Termio *sd;
    
    sd = evas_object_smart_data_get(obj);
-   if ((!sd->top_left) && (sd->cur.sel2.y >= sd->cur.sel1.y))
+   if ((!sd->top_left) && (sd->pty->selection.end.y >= 
sd->pty->selection.start.y))
      {
-        if (((sd->cur.sel1.y == sd->cur.sel2.y) && 
-             (sd->cur.sel1.x <= sd->cur.sel2.x)) ||
-            (sd->cur.sel1.y < sd->cur.sel2.y))
+        if (((sd->pty->selection.start.y == sd->pty->selection.end.y) &&
+             (sd->pty->selection.start.x <= sd->pty->selection.end.x)) ||
+            (sd->pty->selection.start.y < sd->pty->selection.end.y))
           {
              char *lastline;
              int x1, y1, x2, y2;
              size_t len;
 
-             if (sd->cur.sel1.y == sd->cur.sel2.y) x1 = sd->cur.sel1.x;
+             if (sd->pty->selection.start.y == sd->pty->selection.end.y) x1 = 
sd->pty->selection.start.x;
              else x1 = 0;
-             x2 = sd->cur.sel2.x;
-             y1 = y2 = sd->cur.sel2.y;
+             x2 = sd->pty->selection.end.x;
+             y1 = y2 = sd->pty->selection.end.y;
              lastline = termio_selection_get(obj, x1, y1, x2, y2, &len);
              if (lastline)
                {
                   if ((len > 0) && (lastline[len - 1] == '\n'))
                     {
-                       sd->cur.sel2.x = sd->grid.w - 1;
+                       sd->pty->selection.end.x = sd->grid.w - 1;
 #if defined(SUPPORT_DBLWIDTH)
                        _selection_dbl_fix(obj);
 #endif
@@ -3060,22 +3057,25 @@ _smart_cb_mouse_down(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUS
    if (_rep_mouse_down(sd, ev, cx, cy)) return;
    if (ev->button == 1)
      {
-        sd->boxsel = EINA_FALSE;
+        sd->pty->selection.is_box = EINA_FALSE;
         if (ev->flags & EVAS_BUTTON_TRIPLE_CLICK)
           {
              _sel_line(data, cx, cy - sd->scroll);
-             if (sd->cur.sel) _take_selection(data, ELM_SEL_TYPE_PRIMARY);
+             if (sd->pty->selection.is_active)
+               _take_selection(data, ELM_SEL_TYPE_PRIMARY);
              sd->didclick = EINA_TRUE;
           }
         else if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
           {
-             if (evas_key_modifier_is_set(ev->modifiers, "Shift") && 
sd->backup.sel)
+             if (evas_key_modifier_is_set(ev->modifiers, "Shift") &&
+                 sd->backup_sel.available)
                {
                   _sel_set(data, EINA_TRUE);
-                  sd->cur.sel1.x = sd->backup.sel1.x;
-                  sd->cur.sel1.y = sd->backup.sel1.y;
-                  sd->cur.sel2.x = sd->backup.sel2.x;
-                  sd->cur.sel2.y = sd->backup.sel2.y;
+                  sd->pty->selection.is_active = EINA_TRUE;
+                  sd->pty->selection.start.x = sd->backup_sel.start.x;
+                  sd->pty->selection.start.y = sd->backup_sel.start.y;
+                  sd->pty->selection.end.x   = sd->backup_sel.end.x;
+                  sd->pty->selection.end.y   = sd->backup_sel.end.y;
 #if defined(SUPPORT_DBLWIDTH)
                   _selection_dbl_fix(data);
 #endif
@@ -3085,7 +3085,8 @@ _smart_cb_mouse_down(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUS
                {
                   _sel_word(data, cx, cy - sd->scroll);
                }
-             if (sd->cur.sel) _take_selection(data, ELM_SEL_TYPE_PRIMARY);
+             if (sd->pty->selection.is_active)
+               _take_selection(data, ELM_SEL_TYPE_PRIMARY);
              sd->didclick = EINA_TRUE;
           }
         else
@@ -3095,30 +3096,30 @@ _smart_cb_mouse_down(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUS
                  evas_key_modifier_is_set(ev->modifiers, "Control") ||
                  evas_key_modifier_is_set(ev->modifiers, "Alt"))
                {
-                  sd->cur.sel1.x = cx;
-                  sd->cur.sel1.y = cy - sd->scroll;
-                  sd->cur.sel2.x = cx;
-                  sd->cur.sel2.y = cy - sd->scroll;
+                  sd->pty->selection.start.x = cx;
+                  sd->pty->selection.start.y = cy - sd->scroll;
+                  sd->pty->selection.end.x = cx;
+                  sd->pty->selection.end.y = cy - sd->scroll;
                   _sel_set(data, EINA_TRUE);
-                  sd->cur.makesel = EINA_TRUE;
-                  sd->boxsel = EINA_TRUE;
+                  sd->pty->selection.makesel = EINA_TRUE;
+                  sd->pty->selection.is_box = EINA_TRUE;
 #if defined(SUPPORT_DBLWIDTH)
                   _selection_dbl_fix(data);
 #endif
                }
              if (sd->top_left || sd->bottom_right)
                {
-                  sd->cur.makesel = 1;
                   _sel_set(data, EINA_TRUE);
+                  sd->pty->selection.makesel = EINA_TRUE;
                   if (sd->top_left)
                     {
-                       sd->cur.sel1.x = cx;
-                       sd->cur.sel1.y = cy - sd->scroll;
+                       sd->pty->selection.start.x = cx;
+                       sd->pty->selection.start.y = cy - sd->scroll;
                     }
                   else
                     {
-                       sd->cur.sel2.x = cx;
-                       sd->cur.sel2.y = cy - sd->scroll;
+                       sd->pty->selection.end.x = cx;
+                       sd->pty->selection.end.y = cy - sd->scroll;
                     }
 #if defined(SUPPORT_DBLWIDTH)
                   _selection_dbl_fix(data);
@@ -3126,16 +3127,16 @@ _smart_cb_mouse_down(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUS
                }
              else
                {
-                  if (sd->cur.sel)
+                  if (sd->pty->selection.is_active)
                     {
                        _sel_set(data, EINA_FALSE);
                        sd->didclick = EINA_TRUE;
                     }
-                  sd->cur.makesel = 1;
-                  sd->cur.sel1.x = cx;
-                  sd->cur.sel1.y = cy - sd->scroll;
-                  sd->cur.sel2.x = cx;
-                  sd->cur.sel2.y = cy - sd->scroll;
+                  sd->pty->selection.makesel = EINA_TRUE;
+                  sd->pty->selection.start.x = cx;
+                  sd->pty->selection.start.y = cy - sd->scroll;
+                  sd->pty->selection.end.x = cx;
+                  sd->pty->selection.end.y = cy - sd->scroll;
 #if defined(SUPPORT_DBLWIDTH)
                   _selection_dbl_fix(data);
 #endif
@@ -3167,37 +3168,37 @@ _smart_cb_mouse_up(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED
    _smart_xy_to_cursor(data, ev->canvas.x, ev->canvas.y, &cx, &cy);
    if (_rep_mouse_up(sd, ev, cx, cy)) return;
    if (sd->link.down.dnd) return;
-   if (sd->cur.makesel)
+   if (sd->pty->selection.makesel)
      {
-        sd->cur.makesel = 0;
 
-        if ((sd->cur.sel1.x == sd->cur.sel2.x) &&
-            (sd->cur.sel1.y == sd->cur.sel2.y))
+        if ((sd->pty->selection.start.x == sd->pty->selection.end.x) &&
+            (sd->pty->selection.start.y == sd->pty->selection.end.y))
           {
              _sel_set(data, EINA_FALSE);
              sd->didclick = EINA_FALSE;
           }
 
-        if (sd->cur.sel)
+        sd->pty->selection.makesel = EINA_FALSE;
+        if (sd->pty->selection.is_active)
           {
              sd->didclick = EINA_TRUE;
              if (sd->top_left)
                {
-                  sd->cur.sel1.x = cx;
-                  sd->cur.sel1.y = cy - sd->scroll;
+                  sd->pty->selection.start.x = cx;
+                  sd->pty->selection.start.y = cy - sd->scroll;
                }
              else
                {
-                  sd->cur.sel2.x = cx;
-                  sd->cur.sel2.y = cy - sd->scroll;
+                  sd->pty->selection.end.x = cx;
+                  sd->pty->selection.end.y = cy - sd->scroll;
                }
 #if defined(SUPPORT_DBLWIDTH)
              _selection_dbl_fix(data);
 #endif
-             if (sd->boxsel)
+             if (sd->pty->selection.is_box)
               {
-                 sd->cur.sel2.x = cx;
-                 sd->cur.sel2.y = cy - sd->scroll;
+                 sd->pty->selection.end.x = cx;
+                 sd->pty->selection.end.y = cy - sd->scroll;
                  _smart_update_queue(data, sd);
                  _take_selection(data, ELM_SEL_TYPE_PRIMARY);
               }
@@ -3207,11 +3208,11 @@ _smart_cb_mouse_up(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED
                  _smart_update_queue(data, sd);
                  _take_selection(data, ELM_SEL_TYPE_PRIMARY);
               }
-            sd->backup.sel = sd->cur.sel;
-            sd->backup.sel1.x = sd->cur.sel1.x;
-            sd->backup.sel1.y = sd->cur.sel1.y;
-            sd->backup.sel2.x = sd->cur.sel2.x;
-            sd->backup.sel2.y = sd->cur.sel2.y;
+            sd->backup_sel.available = sd->pty->selection.is_active;
+            sd->backup_sel.start.x = sd->pty->selection.start.x;
+            sd->backup_sel.start.y = sd->pty->selection.start.y;
+            sd->backup_sel.end.x = sd->pty->selection.end.x;
+            sd->backup_sel.end.y = sd->pty->selection.end.y;
           }
      }
 }
@@ -3235,33 +3236,33 @@ _smart_cb_mouse_move(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUS
    if (_rep_mouse_move(sd, ev, cx, cy)) return;
    if (sd->link.down.dnd)
      {
-        sd->cur.makesel = 0;
+        sd->pty->selection.makesel = EINA_FALSE;
         _sel_set(data, EINA_FALSE);
         _smart_update_queue(data, sd);
         return;
      }
-   if (sd->cur.makesel)
+   if (sd->pty->selection.makesel)
      {
-        if (!sd->cur.sel)
+        if (!sd->pty->selection.is_active)
           {
-             if ((cx != sd->cur.sel1.x) ||
-                 ((cy - sd->scroll) != sd->cur.sel1.y))
+             if ((cx != sd->pty->selection.start.x) ||
+                 ((cy - sd->scroll) != sd->pty->selection.start.y))
                _sel_set(data, EINA_TRUE);
           }
         if (sd->top_left)
           {
-             sd->cur.sel1.x = cx;
-             sd->cur.sel1.y = cy - sd->scroll;
+             sd->pty->selection.start.x = cx;
+             sd->pty->selection.start.y = cy - sd->scroll;
           }
         else
           {
-             sd->cur.sel2.x = cx;
-             sd->cur.sel2.y = cy - sd->scroll;
+             sd->pty->selection.end.x = cx;
+             sd->pty->selection.end.y = cy - sd->scroll;
           }
 #if defined(SUPPORT_DBLWIDTH)
         _selection_dbl_fix(data);
 #endif
-        if (!sd->boxsel)
+        if (!sd->pty->selection.is_box)
           _selection_newline_extend_fix(data);
         _smart_update_queue(data, sd);
      }
@@ -3464,15 +3465,15 @@ termio_config_set(Evas_Object *obj, Config *config)
    sd->font.chw = w;
    sd->font.chh = h;
 
-   theme_apply(sd->cur.obj, config, "terminology/cursor");
-   theme_auto_reload_enable(sd->cur.obj);
-   evas_object_resize(sd->cur.obj, sd->font.chw, sd->font.chh);
-   evas_object_show(sd->cur.obj);
+   theme_apply(sd->cursor.obj, config, "terminology/cursor");
+   theme_auto_reload_enable(sd->cursor.obj);
+   evas_object_resize(sd->cursor.obj, sd->font.chw, sd->font.chh);
+   evas_object_show(sd->cursor.obj);
 
-   theme_apply(sd->cur.selo_theme, config, "terminology/selection");
-   theme_auto_reload_enable(sd->cur.selo_theme);
-   edje_object_part_swallow(sd->cur.selo_theme, "terminology.top_left", 
sd->cur.selo_top);
-   edje_object_part_swallow(sd->cur.selo_theme, "terminology.bottom_right", 
sd->cur.selo_bottom);
+   theme_apply(sd->sel.theme, config, "terminology/selection");
+   theme_auto_reload_enable(sd->sel.theme);
+   edje_object_part_swallow(sd->sel.theme, "terminology.top_left", 
sd->sel.top);
+   edje_object_part_swallow(sd->sel.theme, "terminology.bottom_right", 
sd->sel.bottom);
 }
 
 static void
@@ -3606,7 +3607,7 @@ _smart_add(Evas_Object *obj)
    evas_object_pass_events_set(o, EINA_TRUE);
    evas_object_propagate_events_set(o, EINA_FALSE);
    evas_object_smart_member_add(o, obj);
-   sd->cur.obj = o;
+   sd->cursor.obj = o;
 
    evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _cursor_cb_move, obj);
 
@@ -3614,14 +3615,14 @@ _smart_add(Evas_Object *obj)
    o = evas_object_rectangle_add(evas_object_evas_get(obj));
    evas_object_pass_events_set(o, EINA_TRUE);
    evas_object_propagate_events_set(o, EINA_FALSE);
-   sd->cur.selo_top = o;
+   sd->sel.top = o;
    o = evas_object_rectangle_add(evas_object_evas_get(obj));
    evas_object_pass_events_set(o, EINA_TRUE);
    evas_object_propagate_events_set(o, EINA_FALSE);
-   sd->cur.selo_bottom = o;
+   sd->sel.bottom = o;
    o = edje_object_add(evas_object_evas_get(obj));
    evas_object_smart_member_add(o, obj);
-   sd->cur.selo_theme = o;
+   sd->sel.theme = o;
    edje_object_signal_callback_add(o, "mouse,in", "zone.bottom_right", 
_edje_cb_bottom_right_in, sd);
    edje_object_signal_callback_add(o, "mouse,in", "zone.top_left", 
_edje_cb_top_left_in, sd);
    edje_object_signal_callback_add(o, "mouse,out", "zone.bottom_right", 
_edje_cb_bottom_right_out, sd);
@@ -3733,11 +3734,11 @@ _smart_del(Evas_Object *obj)
           (sd->imf, ECORE_IMF_CALLBACK_COMMIT, _imf_event_commit_cb);
         ecore_imf_context_del(sd->imf);
      }
-   if (sd->cur.obj) evas_object_del(sd->cur.obj);
+   if (sd->cursor.obj) evas_object_del(sd->cursor.obj);
    if (sd->event) evas_object_del(sd->event);
-   if (sd->cur.selo_top) evas_object_del(sd->cur.selo_top);
-   if (sd->cur.selo_bottom) evas_object_del(sd->cur.selo_bottom);
-   if (sd->cur.selo_theme) evas_object_del(sd->cur.selo_theme);
+   if (sd->sel.top) evas_object_del(sd->sel.top);
+   if (sd->sel.bottom) evas_object_del(sd->sel.bottom);
+   if (sd->sel.theme) evas_object_del(sd->sel.theme);
    if (sd->anim) ecore_animator_del(sd->anim);
    if (sd->delayed_size_timer) ecore_timer_del(sd->delayed_size_timer);
    if (sd->link_do_timer) ecore_timer_del(sd->link_do_timer);
@@ -3763,11 +3764,11 @@ _smart_del(Evas_Object *obj)
    sd->sel_str = NULL;
    sd->sel_reset_job = NULL;
    sd->link.down.dndobj = NULL;
-   sd->cur.obj = NULL;
+   sd->cursor.obj = NULL;
    sd->event = NULL;
-   sd->cur.selo_top = NULL;
-   sd->cur.selo_bottom = NULL;
-   sd->cur.selo_theme = NULL;
+   sd->sel.top = NULL;
+   sd->sel.bottom = NULL;
+   sd->sel.theme = NULL;
    sd->anim = NULL;
    sd->delayed_size_timer = NULL;
    sd->font.name = NULL;
@@ -3808,9 +3809,9 @@ _smart_calculate(Evas_Object *obj)
    evas_object_resize(sd->grid.obj,
                       sd->grid.w * sd->font.chw,
                       sd->grid.h * sd->font.chh);
-   evas_object_move(sd->cur.obj,
-                    ox + (sd->cur.x * sd->font.chw),
-                    oy + (sd->cur.y * sd->font.chh));
+   evas_object_move(sd->cursor.obj,
+                    ox + (sd->cursor.x * sd->font.chw),
+                    oy + (sd->cursor.y * sd->font.chh));
    evas_object_move(sd->event, ox, oy);
    evas_object_resize(sd->event, ow, oh);
 }
@@ -3871,10 +3872,10 @@ _smart_pty_scroll(void *data)
           sd->scroll = sd->pty->backscroll_num;
         changed = 1;
      }
-   if (sd->cur.sel)
+   if (sd->pty->selection.is_active)
      {
-        sd->cur.sel1.y--;
-        sd->cur.sel2.y--;
+        sd->pty->selection.start.y--;
+        sd->pty->selection.end.y--;
         changed = 1;
      }
    if (changed) _smart_update_queue(data, sd);
@@ -3911,10 +3912,10 @@ _smart_pty_cancel_sel(void *data)
    Termio *sd;
    sd = evas_object_smart_data_get(obj);
    if (!sd) return;
-   if (sd->cur.sel)
+   if (sd->pty->selection.is_active)
      {
         _sel_set(obj, EINA_FALSE);
-        sd->cur.makesel = 0;
+        sd->pty->selection.makesel = EINA_FALSE;
         _smart_update_queue(data, sd);
      }
 }
@@ -3931,7 +3932,7 @@ _smart_pty_bell(void *data)
    Termio *sd = evas_object_smart_data_get(data);
    if (!sd) return;
    evas_object_smart_callback_call(data, "bell", NULL);
-   edje_object_signal_emit(sd->cur.obj, "bell", "terminology");
+   edje_object_signal_emit(sd->cursor.obj, "bell", "terminology");
 }
 
 static void
@@ -4549,11 +4550,11 @@ termio_config_update(Evas_Object *obj)
 
    if (evas_object_focus_get(obj))
      {
-        edje_object_signal_emit(sd->cur.obj, "focus,out", "terminology");
+        edje_object_signal_emit(sd->cursor.obj, "focus,out", "terminology");
         if (sd->config->disable_cursor_blink)
-          edje_object_signal_emit(sd->cur.obj, "focus,in,noblink", 
"terminology");
+          edje_object_signal_emit(sd->cursor.obj, "focus,in,noblink", 
"terminology");
         else
-          edje_object_signal_emit(sd->cur.obj, "focus,in", "terminology");
+          edje_object_signal_emit(sd->cursor.obj, "focus,in", "terminology");
      }
    
    evas_object_scale_set(sd->grid.obj, elm_config_scale_get());
@@ -4751,5 +4752,5 @@ termio_selection_exists(const Evas_Object *obj)
 {
    Termio *sd = evas_object_smart_data_get(obj);
    EINA_SAFETY_ON_NULL_RETURN_VAL(sd, EINA_FALSE);
-   return sd->cur.sel;
+   return sd->pty->selection.is_active;
 }
diff --git a/src/bin/termpty.h b/src/bin/termpty.h
index c5e4672..517e517 100644
--- a/src/bin/termpty.h
+++ b/src/bin/termpty.h
@@ -133,6 +133,14 @@ struct _Termpty
       Eina_List *expecting;
       Eina_Bool on : 1;
    } block;
+   struct {
+      struct {
+         int x, y;
+      } start, end, start_backup, end_backup;
+      Eina_Bool is_active : 1;
+      Eina_Bool is_box    : 1;
+      Eina_Bool makesel   : 1;
+   } selection;
    Termstate state, save, swap;
    int exit_code;
    pid_t pid;

-- 


Reply via email to