hermet pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=62a09f69a111892e9b5534c0c78c96c6db807622

commit 62a09f69a111892e9b5534c0c78c96c6db807622
Author: Woochan Lee <wc0917....@samsung.com>
Date:   Mon Jul 23 15:49:10 2018 +0900

    Efl.Ui.Calendar, elm_calendar: Code fixed to support auto repeat feature.
    
    Summary:
    1.  Why there is a edje signal callback in elm_calendar? and do we need to 
maintain?
    
     We used edje part like a button before (3 years ago?), So there is a 
callbacks to get edje signal.
    
     Im pretty sure it is not use anymore. but we need to maintain backward 
compatibility.
    
    2. elm_calendar using using repeat feature in efl_ui_button for it. why did 
i change it to manual timer?
    
     We opend elm_calendar_interval_set() APIs. Support this API the manual 
timer is proper then using button's feature.
    
    3. why scroll freeze? and why only elm_calendar does it?
    
     When the user long press calendar button area and then move the scroll 
will be activated. it can prevent that weird action.
    
     efl_ui_calendar using button's feature. i not sure scroll freeze is 
deserve to attached in button side as a feature or not.
    
     So i will consider more for this case.
    
    4. Why efl_ui_calendar doesn't have year buttons (double spinner case)
    
     After interface work, we don't accept style change in the runtime. so that 
featrue will be supported as API.
    
     The year_button_set/get() property should be added. but i dont know is it 
really needed...
    
     If the app developer want use year inc/dec button for efl_ui_calendar. 
they can inherit the class and make it easily.
    
    Test Plan:
    View, Action, API test in the elementary-test sample App.
    
    Ps. The issue of the calendar2 crash when it closed. It's not relative with 
this commit. its focus. i will look around.
    
    Reviewers: Hermet, zmike, ManMower, segfaultxavi, devilhorns
    
    Reviewed By: Hermet
    
    Subscribers: cedric, #committers, zmike
    
    Tags: #efl
    
    Differential Revision: https://phab.enlightenment.org/D6626
---
 src/lib/elementary/efl_ui_calendar.c         | 138 ++++-----------
 src/lib/elementary/efl_ui_calendar_private.h |   8 +-
 src/lib/elementary/elm_calendar.c            | 246 +++++++--------------------
 src/lib/elementary/elm_widget_calendar.h     |   5 +-
 4 files changed, 103 insertions(+), 294 deletions(-)

diff --git a/src/lib/elementary/efl_ui_calendar.c 
b/src/lib/elementary/efl_ui_calendar.c
index 7eedec1f1f..ae1e648c94 100644
--- a/src/lib/elementary/efl_ui_calendar.c
+++ b/src/lib/elementary/efl_ui_calendar.c
@@ -21,6 +21,9 @@
 #define EFL_UI_CALENDAR_BUTTON_YEAR_LEFT "efl.calendar.button_year.left"
 #define EFL_UI_CALENDAR_BUTTON_YEAR_RIGHT "efl.calendar.button_year.right"
 
+#define FIRST_INTERVAL 0.85
+#define INTERVAL 0.2
+
 static const char PART_NAME_DEC_BUTTON[] = "dec_button";
 static const char PART_NAME_INC_BUTTON[] = "inc_button";
 
@@ -36,20 +39,12 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = 
{
 };
 
 static void
-_button_widget_month_dec_start(void *data,
-                               const Efl_Event *ev EINA_UNUSED);
-
-static void
-_button_widget_month_dec_start_click(void *data,
-                                     const Efl_Event *ev EINA_UNUSED);
-
-static void
-_button_widget_month_inc_start(void *data,
-                               const Efl_Event *ev EINA_UNUSED);
+_inc_dec_btn_clicked_cb(void *data,
+                        const Efl_Event *ev);
 
 static void
-_button_widget_month_inc_start_click(void *data,
-                                     const Efl_Event *ev EINA_UNUSED);
+_inc_dec_btn_repeated_cb(void *data,
+                         const Efl_Event *ev);
 
 static Eina_Bool _key_action_activate(Evas_Object *obj, const char *params);
 
@@ -253,7 +248,7 @@ _access_calendar_item_register(Evas_Object *obj)
           {
              snprintf(pname, sizeof(pname), "efl.cit_%d.access", i);
              _elm_access_edje_object_part_object_unregister
-                     (obj, elm_layout_edje_get(obj), pname);
+               (obj, elm_layout_edje_get(obj), pname);
           }
      }
 }
@@ -282,9 +277,6 @@ _access_calendar_spinner_register(Evas_Object *obj)
    ai = _elm_access_info_get(sd->month_access);
    _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("calendar month"));
 
-   ai = _elm_access_info_get(sd->year_access);
-   _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("calendar year"));
-
    o = elm_layout_edje_get(obj);
    edje_object_freeze(o);
    po = (Evas_Object *)edje_object_part_object_get(o, "month_text");
@@ -311,7 +303,6 @@ _flush_calendar_composite_elements(Evas_Object *obj, 
Efl_Ui_Calendar_Data *sd)
     EXTEND(sd->month_access);
     EXTEND(sd->dec_btn_month);
     EXTEND(sd->inc_btn_month);
-    EXTEND(sd->year_access);
 
 #undef EXTEND
 
@@ -461,6 +452,21 @@ _set_headers(Evas_Object *obj)
    elm_layout_thaw(obj);
 }
 
+static Eo *
+_btn_create(Eo *obj, const char *style, char *part)
+{
+   return efl_add(EFL_UI_BUTTON_CLASS, obj,
+                  elm_widget_element_update(obj, efl_added, style),
+                  efl_ui_autorepeat_enabled_set(efl_added, EINA_TRUE),
+                  efl_ui_autorepeat_initial_timeout_set(efl_added, 
FIRST_INTERVAL),
+                  efl_ui_autorepeat_gap_timeout_set(efl_added, INTERVAL),
+                  efl_event_callback_add(efl_added, EFL_UI_EVENT_CLICKED,
+                                         _inc_dec_btn_clicked_cb, obj),
+                  efl_event_callback_add(efl_added, EFL_UI_EVENT_REPEATED,
+                                         _inc_dec_btn_repeated_cb, obj),
+                  efl_content_set(efl_part(obj, part), efl_added));
+}
+
 static void
 _spinner_buttons_add(Evas_Object *obj, Efl_Ui_Calendar_Data *sd)
 {
@@ -476,21 +482,9 @@ _spinner_buttons_add(Evas_Object *obj, 
Efl_Ui_Calendar_Data *sd)
           }
 
         if (!sd->dec_btn_month)
-          {
-             sd->dec_btn_month =
-                efl_add(EFL_UI_BUTTON_CLASS, obj,
-                        elm_widget_element_update(obj, efl_added, 
PART_NAME_DEC_BUTTON),
-                        efl_ui_autorepeat_enabled_set(efl_added, EINA_TRUE),
-                        efl_ui_autorepeat_initial_timeout_set(efl_added, 0.5),
-                        efl_ui_autorepeat_gap_timeout_set(efl_added, 0.2));
-
-             efl_event_callback_add(sd->dec_btn_month, EFL_UI_EVENT_CLICKED,
-                                    _button_widget_month_dec_start_click, obj);
-             efl_event_callback_add(sd->dec_btn_month, EFL_UI_EVENT_REPEATED,
-                                    _button_widget_month_dec_start, obj);
-          }
-        elm_layout_content_set(obj, EFL_UI_CALENDAR_BUTTON_LEFT, 
sd->dec_btn_month);
+          sd->dec_btn_month = _btn_create(obj, PART_NAME_DEC_BUTTON, 
EFL_UI_CALENDAR_BUTTON_LEFT);
      }
+
    else if (sd->dec_btn_month && !efl_isa(sd->dec_btn_month, ELM_ACCESS_CLASS))
      {
         evas_object_del(sd->dec_btn_month);
@@ -507,20 +501,7 @@ _spinner_buttons_add(Evas_Object *obj, 
Efl_Ui_Calendar_Data *sd)
           }
 
         if (!sd->inc_btn_month)
-          {
-             sd->inc_btn_month =
-                efl_add(EFL_UI_BUTTON_CLASS, obj,
-                        elm_widget_element_update(obj, efl_added, 
PART_NAME_INC_BUTTON),
-                        efl_ui_autorepeat_enabled_set(efl_added, EINA_TRUE),
-                        efl_ui_autorepeat_initial_timeout_set(efl_added, 0.5),
-                        efl_ui_autorepeat_gap_timeout_set(efl_added, 0.2));
-
-             efl_event_callback_add(sd->inc_btn_month, EFL_UI_EVENT_CLICKED,
-                                    _button_widget_month_inc_start_click, obj);
-             efl_event_callback_add(sd->inc_btn_month, EFL_UI_EVENT_REPEATED,
-                                    _button_widget_month_inc_start, obj);
-          }
-        elm_layout_content_set(obj, EFL_UI_CALENDAR_BUTTON_RIGHT, 
sd->inc_btn_month);
+             sd->inc_btn_month = _btn_create(obj, PART_NAME_INC_BUTTON, 
EFL_UI_CALENDAR_BUTTON_RIGHT);
      }
    else if (sd->inc_btn_month && !efl_isa(sd->inc_btn_month, ELM_ACCESS_CLASS))
      {
@@ -645,77 +626,35 @@ _update_data(Evas_Object *obj, int delta)
    return EINA_TRUE;
 }
 
-static Eina_Bool
-_spin_month_value(void *data)
+static void
+_spin_value(void *data)
 {
    EFL_UI_CALENDAR_DATA_GET(data, sd);
 
    if (_update_data(data, sd->spin_speed))
      evas_object_smart_changed(data);
-
-   sd->interval = sd->interval / 1.05;
-   ecore_timer_interval_set(sd->spin_month, sd->interval);
-
-   return ECORE_CALLBACK_RENEW;
-}
-
-static void
-_button_widget_month_inc_start_click(void *data,
-                                     const Efl_Event *ev EINA_UNUSED)
-{
-   EFL_UI_CALENDAR_DATA_GET(data, sd);
-   if (sd->month_repeated)
-     {
-        sd->month_repeated = EINA_FALSE;
-        return;
-     }
-
-   sd->interval = sd->first_interval;
-   sd->spin_speed = 1;
-   _spin_month_value(data);
 }
 
 static void
-_button_widget_month_inc_start(void *data,
-                               const Efl_Event *ev EINA_UNUSED)
+_inc_dec_btn_clicked_cb(void *data,
+                        const Efl_Event *ev)
 {
    EFL_UI_CALENDAR_DATA_GET(data, sd);
 
-   sd->spin_speed = 1;
-   if (!sd->month_repeated)
-     sd->interval = sd->first_interval;
-   sd->month_repeated = EINA_TRUE;
-   _spin_month_value(data);
+   sd->spin_speed = (ev->object == sd->inc_btn_month) ? 1 : -1;
 
+   _spin_value(data);
 }
 
 static void
-_button_widget_month_dec_start_click(void *data,
-                                     const Efl_Event *ev EINA_UNUSED)
+_inc_dec_btn_repeated_cb(void *data,
+                         const Efl_Event *ev)
 {
    EFL_UI_CALENDAR_DATA_GET(data, sd);
-   if (sd->month_repeated)
-     {
-        sd->month_repeated = EINA_FALSE;
-        return;
-     }
 
-   sd->interval = sd->first_interval;
-   sd->spin_speed = -1;
-   _spin_month_value(data);
-}
-
-static void
-_button_widget_month_dec_start(void *data,
-                               const Efl_Event *ev EINA_UNUSED)
-{
-   EFL_UI_CALENDAR_DATA_GET(data, sd);
+   sd->spin_speed = (ev->object == sd->inc_btn_month) ? 1 : -1;
 
-   sd->spin_speed = -1;
-   if (!sd->month_repeated)
-     sd->interval = sd->first_interval;
-   sd->month_repeated = EINA_TRUE;
-   _spin_month_value(data);
+   _spin_value(data);
 }
 
 static int
@@ -900,8 +839,6 @@ _efl_ui_calendar_efl_object_destructor(Eo *obj, 
Efl_Ui_Calendar_Data *sd)
 {
    int i;
 
-   ecore_timer_del(sd->spin_month);
-   ecore_timer_del(sd->spin_year);
    ecore_timer_del(sd->update_timer);
 
    efl_ui_format_cb_set(obj, NULL, NULL, NULL);
@@ -936,7 +873,7 @@ _access_obj_process(Evas_Object *obj, Eina_Bool is_access)
                   snprintf(pname, sizeof(pname), "efl.cit_%d.access", i);
 
                   _elm_access_edje_object_part_object_unregister
-                          (obj, elm_layout_edje_get(obj), pname);
+                    (obj, elm_layout_edje_get(obj), pname);
                }
           }
 
@@ -975,7 +912,6 @@ _efl_ui_calendar_constructor_internal(Eo *obj, 
Efl_Ui_Calendar_Data *priv)
 
    elm_widget_sub_object_parent_add(obj);
 
-   priv->first_interval = 0.85;
    priv->date_min.tm_year = 2;
    priv->date_min.tm_mon = 0;
    priv->date_min.tm_mday = 1;
diff --git a/src/lib/elementary/efl_ui_calendar_private.h 
b/src/lib/elementary/efl_ui_calendar_private.h
index 1341dd565e..6cce25d130 100644
--- a/src/lib/elementary/efl_ui_calendar_private.h
+++ b/src/lib/elementary/efl_ui_calendar_private.h
@@ -31,15 +31,12 @@ struct _Efl_Ui_Calendar_Data
    double                   interval, first_interval;
    int                      spin_speed;
    int                      today_it, selected_it, focused_it;
-   Ecore_Timer             *spin_month, *spin_year, *update_timer;
+   Ecore_Timer             *update_timer;
    const char              *weekdays[ELM_DAY_LAST];
    struct tm                current_date, shown_date, date, date_min, date_max;
    Evas_Object             *inc_btn_month;
    Evas_Object             *dec_btn_month;
    Evas_Object             *month_access;
-   Evas_Object             *inc_btn_year;
-   Evas_Object             *dec_btn_year;
-   Evas_Object             *year_access;
    Eo                      *items[42];
 
    Efl_Ui_Calendar_Weekday     first_week_day;
@@ -51,11 +48,8 @@ struct _Efl_Ui_Calendar_Data
    Eina_Strbuf             *format_strbuf;
 
    Eina_Bool                selected : 1;
-   Eina_Bool                double_spinners : 1;
    Eina_Bool                filling : 1;
    Eina_Bool                weekdays_set : 1;
-   Eina_Bool                month_repeated : 1;
-   Eina_Bool                year_repeated : 1;
 };
 
 /**
diff --git a/src/lib/elementary/elm_calendar.c 
b/src/lib/elementary/elm_calendar.c
index e8bf210c0f..5c3398a1f9 100644
--- a/src/lib/elementary/elm_calendar.c
+++ b/src/lib/elementary/elm_calendar.c
@@ -65,38 +65,19 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = 
{
  * But, it is replaced by elm_button widget objects. The following
  * callback functions are also newly added for button objects.
  * We still keep the old signal callback functions for backward compatibility. 
*/
+
 static void
-_button_widget_month_inc_start_click(void *data,
-                                     Evas_Object *obj EINA_UNUSED,
-                                     void *event_info EINA_UNUSED);
-static void
-_button_widget_month_inc_start(void *data,
-                              Evas_Object *obj EINA_UNUSED,
-                              void *event_info EINA_UNUSED);
-static void
-_button_widget_month_dec_start_click(void *data,
-                                    Evas_Object *obj EINA_UNUSED,
-                                    void *event_info EINA_UNUSED);
-static void
-_button_widget_month_dec_start(void *data,
-                              Evas_Object *obj EINA_UNUSED,
-                              void *event_info EINA_UNUSED);
-static void
-_button_widget_year_inc_start_click(void *data,
-                                    Evas_Object *obj EINA_UNUSED,
-                                    void *event_info EINA_UNUSED);
-static void
-_button_widget_year_inc_start(void *data,
-                              Evas_Object *obj EINA_UNUSED,
-                              void *event_info EINA_UNUSED);
+_inc_dec_button_clicked_cb(void *data, const Efl_Event *event EINA_UNUSED);
 static void
-_button_widget_year_dec_start_click(void *data,
-                                    Evas_Object *obj EINA_UNUSED,
-                                    void *event_info EINA_UNUSED);
+_inc_dec_button_pressed_cb(void *data, const Efl_Event *event);
 static void
-_button_widget_year_dec_start(void *data,
-                              Evas_Object *obj EINA_UNUSED,
-                              void *event_info EINA_UNUSED);
+_inc_dec_button_unpressed_cb(void *data, const Efl_Event *event EINA_UNUSED);
+
+EFL_CALLBACKS_ARRAY_DEFINE( _inc_dec_button_cb,
+   { EFL_UI_EVENT_CLICKED, _inc_dec_button_clicked_cb},
+   { EFL_UI_EVENT_PRESSED, _inc_dec_button_pressed_cb},
+   { EFL_UI_EVENT_UNPRESSED, _inc_dec_button_unpressed_cb}
+);
 
 static Eina_Bool _key_action_activate(Evas_Object *obj, const char *params);
 
@@ -776,11 +757,7 @@ _spinner_buttons_add(Evas_Object *obj, Elm_Calendar_Data 
*sd)
         if (!sd->dec_btn_month)
           {
              sd->dec_btn_month = elm_button_add(obj);
-             elm_button_autorepeat_set(sd->dec_btn_month, EINA_TRUE);
-             elm_button_autorepeat_initial_timeout_set(sd->dec_btn_month, 0.5);
-             elm_button_autorepeat_gap_timeout_set(sd->dec_btn_month, 0.2);
-             evas_object_smart_callback_add(sd->dec_btn_month, "clicked", 
_button_widget_month_dec_start_click, obj);
-             evas_object_smart_callback_add(sd->dec_btn_month, "repeated", 
_button_widget_month_dec_start, obj);
+             efl_event_callback_array_add(sd->dec_btn_month, 
_inc_dec_button_cb(), obj);
           }
 
         elm_object_style_set(sd->dec_btn_month, left_buf);
@@ -804,11 +781,7 @@ _spinner_buttons_add(Evas_Object *obj, Elm_Calendar_Data 
*sd)
         if (!sd->inc_btn_month)
           {
              sd->inc_btn_month = elm_button_add(obj);
-             elm_button_autorepeat_set(sd->inc_btn_month, EINA_TRUE);
-             elm_button_autorepeat_initial_timeout_set(sd->inc_btn_month, 0.5);
-             elm_button_autorepeat_gap_timeout_set(sd->inc_btn_month, 0.2);
-             evas_object_smart_callback_add(sd->inc_btn_month, "clicked", 
_button_widget_month_inc_start_click, obj);
-             evas_object_smart_callback_add(sd->inc_btn_month, "repeated", 
_button_widget_month_inc_start, obj);
+             efl_event_callback_array_add(sd->inc_btn_month, 
_inc_dec_button_cb(), obj);
           }
 
         elm_object_style_set(sd->inc_btn_month, right_buf);
@@ -832,12 +805,8 @@ _spinner_buttons_add(Evas_Object *obj, Elm_Calendar_Data 
*sd)
         if (!sd->dec_btn_year)
           {
              sd->dec_btn_year = elm_button_add(obj);
-             elm_button_autorepeat_set(sd->dec_btn_year, EINA_TRUE);
-             elm_button_autorepeat_initial_timeout_set(sd->dec_btn_year, 0.5);
-             elm_button_autorepeat_gap_timeout_set(sd->dec_btn_year, 0.2);
-             evas_object_smart_callback_add(sd->dec_btn_year, "clicked", 
_button_widget_year_dec_start_click, obj);
-             evas_object_smart_callback_add(sd->dec_btn_year, "repeated", 
_button_widget_year_dec_start, obj);
-         }
+             efl_event_callback_array_add(sd->dec_btn_year, 
_inc_dec_button_cb(), obj);
+          }
 
         elm_object_style_set(sd->dec_btn_year, left_buf);
         elm_layout_content_set(obj, ELM_CALENDAR_BUTTON_YEAR_LEFT, 
sd->dec_btn_year);
@@ -860,11 +829,7 @@ _spinner_buttons_add(Evas_Object *obj, Elm_Calendar_Data 
*sd)
         if (!sd->inc_btn_year)
           {
              sd->inc_btn_year = elm_button_add(obj);
-             elm_button_autorepeat_set(sd->inc_btn_year, EINA_TRUE);
-             elm_button_autorepeat_initial_timeout_set(sd->inc_btn_year, 0.5);
-             elm_button_autorepeat_gap_timeout_set(sd->inc_btn_year, 0.2);
-             evas_object_smart_callback_add(sd->inc_btn_year, "clicked", 
_button_widget_year_inc_start_click, obj);
-             evas_object_smart_callback_add(sd->inc_btn_year, "repeated", 
_button_widget_year_inc_start, obj);
+             efl_event_callback_array_add(sd->inc_btn_year, 
_inc_dec_button_cb(), obj);
           }
 
         elm_object_style_set(sd->inc_btn_year, right_buf);
@@ -1004,29 +969,15 @@ _update_data(Evas_Object *obj, Eina_Bool month,
 }
 
 static Eina_Bool
-_spin_month_value(void *data)
-{
-   ELM_CALENDAR_DATA_GET(data, sd);
-
-   if (_update_data(data, EINA_TRUE, sd->spin_speed))
-     evas_object_smart_changed(data);
-
-   sd->interval = sd->interval / 1.05;
-   ecore_timer_interval_set(sd->spin_month, sd->interval);
-
-   return ECORE_CALLBACK_RENEW;
-}
-
-static Eina_Bool
-_spin_year_value(void *data)
+_spin_value(void *data)
 {
    ELM_CALENDAR_DATA_GET(data, sd);
 
-   if (_update_data(data, EINA_FALSE, sd->spin_speed))
+   if (_update_data(data, sd->month_btn_clicked, sd->spin_speed))
      evas_object_smart_changed(data);
 
    sd->interval = sd->interval / 1.05;
-   ecore_timer_interval_set(sd->spin_year, sd->interval);
+   ecore_timer_interval_set(sd->spin_timer, sd->interval);
 
    return ECORE_CALLBACK_RENEW;
 }
@@ -1042,10 +993,13 @@ _button_month_inc_start(void *data,
 
    sd->interval = sd->first_interval;
    sd->spin_speed = 1;
-   ecore_timer_del(sd->spin_month);
-   sd->spin_month = ecore_timer_add(sd->interval, _spin_month_value, data);
+   sd->month_btn_clicked = EINA_TRUE;
+   ecore_timer_del(sd->spin_timer);
+   sd->spin_timer = ecore_timer_add(sd->interval, _spin_value, data);
 
-   _spin_month_value(data);
+   elm_widget_scroll_freeze_push(data);
+
+   _spin_value(data);
 }
 
 /* Legacy callbacks for signals from edje */
@@ -1059,10 +1013,13 @@ _button_month_dec_start(void *data,
 
    sd->interval = sd->first_interval;
    sd->spin_speed = -1;
-   ecore_timer_del(sd->spin_month);
-   sd->spin_month = ecore_timer_add(sd->interval, _spin_month_value, data);
+   sd->month_btn_clicked = EINA_TRUE;
+   ecore_timer_del(sd->spin_timer);
+   sd->spin_timer = ecore_timer_add(sd->interval, _spin_value, data);
+
+   elm_widget_scroll_freeze_push(data);
 
-   _spin_month_value(data);
+   _spin_value(data);
 }
 
 /* Legacy callbacks for signals from edje */
@@ -1075,7 +1032,9 @@ _button_month_stop(void *data,
    ELM_CALENDAR_DATA_GET(data, sd);
 
    sd->interval = sd->first_interval;
-   ELM_SAFE_FREE(sd->spin_month, ecore_timer_del);
+   ELM_SAFE_FREE(sd->spin_timer, ecore_timer_del);
+
+   elm_widget_scroll_freeze_pop(obj);
 }
 
 /* Legacy callbacks for signals from edje */
@@ -1089,10 +1048,13 @@ _button_year_inc_start(void *data,
 
    sd->interval = sd->first_interval;
    sd->spin_speed = 1;
-   ecore_timer_del(sd->spin_year);
-   sd->spin_year = ecore_timer_add(sd->interval, _spin_year_value, data);
+   sd->month_btn_clicked = EINA_FALSE;
+   ecore_timer_del(sd->spin_timer);
+   sd->spin_timer = ecore_timer_add(sd->interval, _spin_value, data);
 
-   _spin_year_value(data);
+   elm_widget_scroll_freeze_push(data);
+
+   _spin_value(data);
 }
 
 /* Legacy callbacks for signals from edje */
@@ -1106,10 +1068,13 @@ _button_year_dec_start(void *data,
 
    sd->interval = sd->first_interval;
    sd->spin_speed = -1;
-   ecore_timer_del(sd->spin_year);
-   sd->spin_year = ecore_timer_add(sd->interval, _spin_year_value, data);
+   sd->month_btn_clicked = EINA_FALSE;
+   ecore_timer_del(sd->spin_timer);
+   sd->spin_timer = ecore_timer_add(sd->interval, _spin_value, data);
+
+   elm_widget_scroll_freeze_push(data);
 
-   _spin_year_value(data);
+   _spin_value(data);
 }
 
 /* Legacy callbacks for signals from edje */
@@ -1122,132 +1087,48 @@ _button_year_stop(void *data,
    ELM_CALENDAR_DATA_GET(data, sd);
 
    sd->interval = sd->first_interval;
-   ELM_SAFE_FREE(sd->spin_year, ecore_timer_del);
-}
-
-static void
-_button_widget_month_inc_start_click(void *data,
-                                    Evas_Object *obj EINA_UNUSED,
-                                    void *event_info EINA_UNUSED)
-{
-   ELM_CALENDAR_DATA_GET(data, sd);
-   if (sd->month_repeated)
-     {
-        sd->month_repeated = EINA_FALSE;
-        return;
-     }
+   ELM_SAFE_FREE(sd->spin_timer, ecore_timer_del);
 
-   sd->interval = sd->first_interval;
-   sd->spin_speed = 1;
-   _spin_month_value(data);
+   elm_widget_scroll_freeze_pop(obj);
 }
 
 static void
-_button_widget_month_inc_start(void *data,
-                              Evas_Object *obj EINA_UNUSED,
-                              void *event_info EINA_UNUSED)
+_inc_dec_button_clicked_cb(void *data, const Efl_Event *event EINA_UNUSED)
 {
    ELM_CALENDAR_DATA_GET(data, sd);
 
-   sd->spin_speed = 1;
-   if (!sd->month_repeated)
-     sd->interval = sd->first_interval;
-   sd->month_repeated = EINA_TRUE;
-   _spin_month_value(data);
-
-}
-
-static void
-_button_widget_month_dec_start_click(void *data,
-                                    Evas_Object *obj EINA_UNUSED,
-                                    void *event_info EINA_UNUSED)
-{
-   ELM_CALENDAR_DATA_GET(data, sd);
-   if (sd->month_repeated)
-     {
-        sd->month_repeated = EINA_FALSE;
-        return;
-     }
-
    sd->interval = sd->first_interval;
-   sd->spin_speed = -1;
-   _spin_month_value(data);
-}
-
-static void
-_button_widget_month_dec_start(void *data,
-                              Evas_Object *obj EINA_UNUSED,
-                              void *event_info EINA_UNUSED)
-{
-   ELM_CALENDAR_DATA_GET(data, sd);
+   ELM_SAFE_FREE(sd->spin_timer, ecore_timer_del);
 
-   sd->spin_speed = -1;
-   if (!sd->month_repeated)
-     sd->interval = sd->first_interval;
-   sd->month_repeated = EINA_TRUE;
-   _spin_month_value(data);
+   _spin_value(data);
 }
-
 static void
-_button_widget_year_inc_start_click(void *data,
-                                    Evas_Object *obj EINA_UNUSED,
-                                    void *event_info EINA_UNUSED)
+_inc_dec_button_pressed_cb(void *data, const Efl_Event *event)
 {
    ELM_CALENDAR_DATA_GET(data, sd);
-   if (sd->year_repeated)
-     {
-        sd->year_repeated = EINA_FALSE;
-        return;
-     }
 
    sd->interval = sd->first_interval;
-   sd->spin_speed = 1;
-   _spin_year_value(data);
-}
+   sd->spin_speed = ((sd->inc_btn_month == event->object) ||
+                     (sd->inc_btn_year == event->object)) ? 1 : -1;
 
-static void
-_button_widget_year_inc_start(void *data,
-                              Evas_Object *obj EINA_UNUSED,
-                              void *event_info EINA_UNUSED)
-{
-   ELM_CALENDAR_DATA_GET(data, sd);
+   sd->month_btn_clicked = ((sd->inc_btn_month == event->object) ||
+                            (sd->dec_btn_month == event->object)) ? EINA_TRUE 
: EINA_FALSE;
 
-   sd->spin_speed = 1;
-   if (!sd->year_repeated)
-     sd->interval = sd->first_interval;
-   sd->year_repeated = EINA_TRUE;
-   _spin_year_value(data);
+   ELM_SAFE_FREE(sd->spin_timer, ecore_timer_del);
+   sd->spin_timer = ecore_timer_add(sd->interval, _spin_value, data);
+
+   elm_widget_scroll_freeze_push(data);
 }
 
 static void
-_button_widget_year_dec_start_click(void *data,
-                                    Evas_Object *obj EINA_UNUSED,
-                                    void *event_info EINA_UNUSED)
+_inc_dec_button_unpressed_cb(void *data, const Efl_Event *event EINA_UNUSED)
 {
    ELM_CALENDAR_DATA_GET(data, sd);
-   if (sd->year_repeated)
-     {
-        sd->year_repeated = EINA_FALSE;
-        return;
-     }
 
    sd->interval = sd->first_interval;
-   sd->spin_speed = -1;
-   _spin_year_value(data);
-}
+   ELM_SAFE_FREE(sd->spin_timer, ecore_timer_del);
 
-static void
-_button_widget_year_dec_start(void *data,
-                              Evas_Object *obj EINA_UNUSED,
-                              void *event_info EINA_UNUSED)
-{
-   ELM_CALENDAR_DATA_GET(data, sd);
-
-   sd->spin_speed = -1;
-   if (!sd->year_repeated)
-     sd->interval = sd->first_interval;
-   sd->year_repeated = EINA_TRUE;
-   _spin_year_value(data);
+   elm_widget_scroll_freeze_pop(data);
 }
 
 static int
@@ -1530,8 +1411,7 @@ _elm_calendar_efl_canvas_group_group_del(Eo *obj, 
Elm_Calendar_Data *sd)
    int i;
    Elm_Calendar_Mark *mark;
 
-   ecore_timer_del(sd->spin_month);
-   ecore_timer_del(sd->spin_year);
+   ecore_timer_del(sd->spin_timer);
    ecore_timer_del(sd->update_timer);
 
    if (sd->marks)
diff --git a/src/lib/elementary/elm_widget_calendar.h 
b/src/lib/elementary/elm_widget_calendar.h
index e68c490f9d..e3d82480cc 100644
--- a/src/lib/elementary/elm_widget_calendar.h
+++ b/src/lib/elementary/elm_widget_calendar.h
@@ -39,7 +39,7 @@ struct _Elm_Calendar_Data
    double                   interval, first_interval;
    int                      spin_speed;
    int                      today_it, selected_it, focused_it;
-   Ecore_Timer             *spin_month, *spin_year, *update_timer;
+   Ecore_Timer             *update_timer, *spin_timer;
    Elm_Calendar_Format_Cb   format_func;
    const char              *weekdays[ELM_DAY_LAST];
    struct tm                current_time, selected_time, shown_time, date_min, 
date_max;
@@ -62,8 +62,7 @@ struct _Elm_Calendar_Data
    Eina_Bool                double_spinners : 1;
    Eina_Bool                filling : 1;
    Eina_Bool                weekdays_set : 1;
-   Eina_Bool                month_repeated : 1;
-   Eina_Bool                year_repeated : 1;
+   Eina_Bool                month_btn_clicked : 1;
 };
 
 struct _Elm_Calendar_Mark

-- 


Reply via email to