Elementary: When an elm_entry is setted to be scrolled its stops of propagate events.
[framework/uifw/elementary.git] / src / lib / elm_entry.c
index 111bab9..a83bd10 100644 (file)
@@ -123,6 +123,7 @@ static const char SIG_PRESS[] = "press";
 static const char SIG_LONGPRESSED[] = "longpressed";
 static const char SIG_CLICKED[] = "clicked";
 static const char SIG_CLICKED_DOUBLE[] = "clicked,double";
+static const char SIG_CLICKED_TRIPLE[] = "clicked,triple";
 static const char SIG_FOCUSED[] = "focused";
 static const char SIG_UNFOCUSED[] = "unfocused";
 static const char SIG_SELECTION_PASTE[] = "selection,paste";
@@ -145,6 +146,7 @@ static const Evas_Smart_Cb_Description _signals[] = {
        {SIG_LONGPRESSED, ""},
        {SIG_CLICKED, ""},
        {SIG_CLICKED_DOUBLE, ""},
+       {SIG_CLICKED_TRIPLE, ""},
        {SIG_FOCUSED, ""},
        {SIG_UNFOCUSED, ""},
        {SIG_SELECTION_PASTE, ""},
@@ -546,6 +548,7 @@ _recalc_cursor_geometry(Evas_Object *obj)
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
    evas_object_smart_callback_call(obj, SIG_CURSOR_CHANGED, NULL);
+   if (!elm_object_focus_get(obj)) return;
    if (!wd->deferred_recalc_job)
      {
         Evas_Coord cx, cy, cw, ch;
@@ -617,7 +620,7 @@ _elm_win_recalc_job(void *data)
           }
      }
 
-   if (wd->deferred_cur)
+   if ((wd->deferred_cur) && (elm_object_focus_get(data)))
      {
         Evas_Coord cx, cy, cw, ch;
         edje_object_part_text_cursor_geometry_get(wd->ent, "elm.text",
@@ -1575,6 +1578,14 @@ _signal_mouse_double(void *data, Evas_Object *obj __UNUSED__, const char *emissi
    evas_object_smart_callback_call(data, SIG_CLICKED_DOUBLE, NULL);
 }
 
+static void
+_signal_mouse_triple(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   if (!wd) return;
+   evas_object_smart_callback_call(data, SIG_CLICKED_TRIPLE, NULL);
+}
+
 #ifdef HAVE_ELEMENTARY_X
 static Eina_Bool
 _event_selection_notify(void *data, int type __UNUSED__, void *event)
@@ -1902,7 +1913,28 @@ _elm_entry_text_get(const Evas_Object *obj, const char *item)
         ERR("text=NULL for edje %p, part 'elm.text'", wd->ent);
         return NULL;
      }
-   eina_stringshare_replace(&wd->text, text);
+
+   if (wd->append_text_len > 0)
+     {
+        char *tmpbuf;
+        size_t tlen;
+        tlen = strlen(text);
+        tmpbuf = malloc(tlen + wd->append_text_len + 1);
+        if (!tmpbuf)
+          {
+             ERR("Failed to allocate memory for entry's text %p", obj);
+             return NULL;
+          }
+        memcpy(tmpbuf, text, tlen);
+        memcpy(tmpbuf + tlen, wd->append_text_left, wd->append_text_len);
+        tmpbuf[tlen + wd->append_text_len] = '\0';
+        eina_stringshare_replace(&wd->text, tmpbuf);
+        free(tmpbuf);
+     }
+   else
+     {
+        eina_stringshare_replace(&wd->text, text);
+     }
    return wd->text;
 }
 
@@ -1944,6 +1976,8 @@ elm_entry_add(Evas_Object *parent)
    evas_object_size_hint_align_set(wd->scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
    elm_smart_scroller_bounce_allow_set(wd->scroller, EINA_FALSE, EINA_FALSE);
    evas_object_propagate_events_set(wd->scroller, EINA_TRUE);
+   evas_object_propagate_events_set(elm_smart_scroller_edje_object_get(
+                                    wd->scroller), EINA_TRUE);
 
    wd->linewrap     = ELM_WRAP_WORD;
    wd->editable     = EINA_TRUE;
@@ -2008,6 +2042,8 @@ elm_entry_add(Evas_Object *parent)
                                    _signal_mouse_clicked, obj);
    edje_object_signal_callback_add(wd->ent, "mouse,down,1,double", "elm.text",
                                    _signal_mouse_double, obj);
+   edje_object_signal_callback_add(wd->ent, "mouse,down,1,triple", "elm.text",
+                                   _signal_mouse_triple, obj);
    edje_object_part_text_set(wd->ent, "elm.text", "");
    if (_elm_config->desktop_entry)
      edje_object_part_text_select_allow_set(wd->ent, "elm.text", EINA_TRUE);