From b7305bfc597978ea159f422b9c95bacb266233c0 Mon Sep 17 00:00:00 2001 From: Boris Faure Date: Mon, 18 Feb 2019 20:57:38 +0100 Subject: [PATCH] tyfuzz: better mock termio_take_selection() + fix leak + make the code more readable to me --- src/bin/termiointernals.c | 41 +++++++++++++++++++++++++++++---------- src/bin/termptyext.c | 15 +++++++++----- src/bin/tyfuzz.c | 13 ++++++++++++- 3 files changed, 53 insertions(+), 16 deletions(-) diff --git a/src/bin/termiointernals.c b/src/bin/termiointernals.c index 594300ca..22f7253b 100644 --- a/src/bin/termiointernals.c +++ b/src/bin/termiointernals.c @@ -322,7 +322,7 @@ termio_internal_get_selection(Termio *sd, size_t *lenp) const char *s = NULL; size_t len = 0; - EINA_SAFETY_ON_NULL_RETURN_VAL(sd, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(sd, NULL); if (sd->pty->selection.is_active) { start_x = sd->pty->selection.start.x; @@ -376,6 +376,7 @@ termio_internal_get_selection(Termio *sd, size_t *lenp) termio_selection_get(sd, start_x, start_y, end_x, end_y, &sb, EINA_TRUE); len = sb.len; + s = eina_stringshare_add_length(ty_sb_steal_buf(&sb), len); ty_sb_free(&sb); } @@ -858,8 +859,12 @@ _sel_word(Termio *sd, int cx, int cy) goto end; } cells = termpty_cellrow_get(sd->pty, y, &w); - if (!cells) goto end; - if (x >= w) x = w - 1; + if (!cells) + { + goto end; + } + if (x >= w) + x = w - 1; do { @@ -901,7 +906,10 @@ _sel_word(Termio *sd, int cx, int cy) { y = cy; cells = termpty_cellrow_get(sd->pty, y, &w); - if (!cells) goto end; + if (!cells) + { + goto end; + } } x = cx; @@ -925,11 +933,15 @@ _sel_word(Termio *sd, int cx, int cy) } if (!done) { - if (!cells[w - 1].att.autowrapped) goto end; + if (!cells[w - 1].att.autowrapped) + goto end; y++; x = 0; cells = termpty_cellrow_get(sd->pty, y, &w); - if (!cells) goto end; + if (!cells) + { + goto end; + } } } while (!done); @@ -938,6 +950,7 @@ _sel_word(Termio *sd, int cx, int cy) sd->pty->selection.by_word = EINA_TRUE; sd->pty->selection.is_top_to_bottom = EINA_TRUE; + _trim_sel_word(sd); termpty_backlog_unlock(); @@ -1639,15 +1652,23 @@ termio_internal_mouse_down(Termio *sd, else if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK) { if (!sd->pty->selection.is_active && sd->didclick) - sd->pty->selection.is_active = EINA_TRUE; + { + sd->pty->selection.is_active = EINA_TRUE; + } if (modifiers.shift && sd->pty->selection.is_active) - _sel_word_to(sd, cx, cy - sd->scroll, EINA_TRUE); + { + _sel_word_to(sd, cx, cy - sd->scroll, EINA_TRUE); + } else - _sel_word(sd, cx, cy - sd->scroll); + { + _sel_word(sd, cx, cy - sd->scroll); + } if (sd->pty->selection.is_active) { if (!termio_take_selection(sd->self, ELM_SEL_TYPE_PRIMARY)) - termio_sel_set(sd, EINA_FALSE); + { + termio_sel_set(sd, EINA_FALSE); + } } sd->didclick = EINA_TRUE; _sel_fill_in_codepoints_array(sd); diff --git a/src/bin/termptyext.c b/src/bin/termptyext.c index ae08f249..5d70fa2c 100644 --- a/src/bin/termptyext.c +++ b/src/bin/termptyext.c @@ -116,9 +116,8 @@ _tytest_modifiers_get(const Eina_Unicode *buf, Termio_Modifiers *m) /** * FLAGS can be: * - 0 - * - 1: SINGLE_CLICK - * - 2: DOUBLE_CLICK - * - 3: TRIPLE_CLICK + * - 1: DOUBLE_CLICK + * - 2: TRIPLE_CLICK */ /* @@ -220,8 +219,13 @@ _handle_selection_is(Termpty *ty, const Eina_Unicode *buf) { size_t len = 0; - Termio *sd = termio_get_from_obj(ty->obj); - const char *s = termio_internal_get_selection(sd, &len); + Termio *sd; + const char *s; + + assert(ty->selection.is_active); + + sd = termio_get_from_obj(ty->obj); + s = termio_internal_get_selection(sd, &len); assert(s != NULL && "no selection"); @@ -238,6 +242,7 @@ _handle_selection_is(Termpty *ty, } buf++; } + eina_stringshare_del(s); } static void diff --git a/src/bin/tyfuzz.c b/src/bin/tyfuzz.c index 9785df1d..999b0474 100644 --- a/src/bin/tyfuzz.c +++ b/src/bin/tyfuzz.c @@ -200,9 +200,20 @@ termio_block_activate(Evas_Object *obj EINA_UNUSED, } Eina_Bool -termio_take_selection(Evas_Object *obj EINA_UNUSED, +termio_take_selection(Evas_Object *obj, Elm_Sel_Type type EINA_UNUSED) { + Termio *sd; + const char *s; + size_t len; + + sd = termio_get_from_obj(obj); + s = termio_internal_get_selection(sd, &len); + if (s) + { + eina_stringshare_del(s); + return EINA_TRUE; + } return EINA_FALSE; }