raster pushed a commit to branch master.

http://git.enlightenment.org/core/elementary.git/commit/?id=b1040a688b9b8cc028f6f2bebf65a6bb51486901

commit b1040a688b9b8cc028f6f2bebf65a6bb51486901
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Wed Apr 2 20:48:32 2014 +0900

    add hand1 cursor theme element and ensure elm cursor code actually works
    
    this adds a hand1 sample cursor theme/image so the theme can find
    cursors, (more should be added later), and now actually makes the elm
    cursor handling properly set the cursor and update the hotx/y as
    needed by tracking the hot swallow object. this relies on a fix in efl
    as well.
---
 data/themes/Makefile.am           |   2 +
 data/themes/default.edc           |   1 +
 data/themes/edc/elm/cursor.edc    | 101 ++++++++++++++++++++++++++++++++++++++
 data/themes/img/pointer_hand1.png | Bin 0 -> 1382 bytes
 src/bin/test_cursor.c             |   2 +-
 src/lib/els_cursor.c              |  61 ++++++++++++++++-------
 6 files changed, 148 insertions(+), 19 deletions(-)

diff --git a/data/themes/Makefile.am b/data/themes/Makefile.am
index 2139b9b..444ea83 100644
--- a/data/themes/Makefile.am
+++ b/data/themes/Makefile.am
@@ -103,6 +103,7 @@ edc/elm/clock.edc \
 edc/elm/colorsel.edc \
 edc/elm/conform.edc \
 edc/elm/ctxpopup.edc \
+edc/elm/cursor.edc \
 edc/elm/datetime.edc \
 edc/elm/dayselector.edc \
 edc/elm/diskselector.edc \
@@ -508,6 +509,7 @@ img/pointer_entry_bar.png \
 img/pointer_glow.png \
 img/pointer_mono.png \
 img/pointer.png \
+img/pointer_hand1.png \
 img/ring_shadow.png \
 img/ring_white_blue_glow.png \
 img/ring_white_middle.png \
diff --git a/data/themes/default.edc b/data/themes/default.edc
index 09a26c5..953de8b 100644
--- a/data/themes/default.edc
+++ b/data/themes/default.edc
@@ -68,6 +68,7 @@ collections {
 #include "edc/elm/clock.edc"
 #include "edc/elm/gengrid.edc"
 #include "edc/elm/hover.edc"
+#include "edc/elm/cursor.edc"
 
 // desktop in general
 #include "edc/wallpaper.edc"
diff --git a/data/themes/edc/elm/cursor.edc b/data/themes/edc/elm/cursor.edc
new file mode 100644
index 0000000..ea7bc11
--- /dev/null
+++ b/data/themes/edc/elm/cursor.edc
@@ -0,0 +1,101 @@
+// cursors available:
+//
+// "x"
+// "arrow"
+// "based_arrow_down"
+// "based_arrow_up"
+// "boat"
+// "bogosity"
+// "bottom_left_corner"
+// "bottom_right_corner"
+// "bottom_side"
+// "bottom_tee"
+// "box_spiral"
+// "center_ptr"
+// "circle"
+// "clock"
+// "coffee_mug"
+// "cross"
+// "cross_reverse"
+// "crosshair"
+// "diamond_cross"
+// "dot"
+// "dot_box_mask"
+// "double_arrow"
+// "draft_large"
+// "draft_small"
+// "draped_box"
+// "exchange"
+// "fleur"
+// "gobbler"
+// "gumby"
+// "hand1" *DONE*
+// "hand2"
+// "heart"
+// "icon"
+// "iron_cross"
+// "left_ptr"
+// "left_side"
+// "left_tee"
+// "leftbutton"
+// "ll_angle"
+// "lr_angle"
+// "man"
+// "middlebutton"
+// "mouse"
+// "pencil"
+// "pirate"
+// "plus"
+// "question_arrow"
+// "right_ptr"
+// "right_side"
+// "right_tee"
+// "rightbutton"
+// "rtl_logo"
+// "sailboat"
+// "sb_down_arrow"
+// "sb_h_double_arrow"
+// "sb_left_arrow"
+// "sb_right_arrow"
+// "sb_up_arrow"
+// "sb_v_double_arrow"
+// "shuttle"
+// "sizing"
+// "spider"
+// "spraycan"
+// "star"
+// "target"
+// "tcross"
+// "top_left_arrow"
+// "top_left_corner"
+// "top_right_corner"
+// "top_side"
+// "top_tee"
+// "trek"
+// "ul_angle"
+// "umbrella"
+// "ur_angle"
+// "watch"
+// "xterm"
+
+group { name: "elm/cursor/hand1/default";
+   images.image: "pointer_hand1.png" COMP;
+   parts {
+      part { name: "base"; mouse_events: 0; scale: 1;
+         description { state: "default" 0.0;
+            FIXED_SIZE(32, 32)
+            image.normal: "pointer_hand1.png";
+         }
+      }
+      part { name: "elm.content.hotspot"; type: SWALLOW;
+         description { state: "default" 0.0;
+            visible: 0;
+            rel1.relative: (26/32) (9/32);
+            rel1.to: "base";
+            rel2.to: "base";
+            rel2.relative: (26/32) (9/32);
+            rel2.offset: 0 0;
+         }
+      }
+   }
+}
diff --git a/data/themes/img/pointer_hand1.png 
b/data/themes/img/pointer_hand1.png
new file mode 100644
index 0000000..68f356d
Binary files /dev/null and b/data/themes/img/pointer_hand1.png differ
diff --git a/src/bin/test_cursor.c b/src/bin/test_cursor.c
index afd8659..499e9d5 100644
--- a/src/bin/test_cursor.c
+++ b/src/bin/test_cursor.c
@@ -299,7 +299,7 @@ test_cursor3(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_i
 
    o = elm_button_add(win);
    elm_object_cursor_set(o, ELM_CURSOR_HAND1);
-//   elm_object_cursor_theme_search_enabled_set(o, EINA_TRUE);
+   elm_object_cursor_theme_search_enabled_set(o, EINA_TRUE);
    elm_object_text_set(o, "hand1");
    elm_box_pack_end(bx, o);
    evas_object_show(o);
diff --git a/src/lib/els_cursor.c b/src/lib/els_cursor.c
index ab77853..da74f10 100644
--- a/src/lib/els_cursor.c
+++ b/src/lib/els_cursor.c
@@ -133,7 +133,7 @@ static const int _cursors_count = 
sizeof(_cursors)/sizeof(struct _Cursor_Id);
 
 struct _Elm_Cursor
 {
-   Evas_Object *obj;
+   Evas_Object *obj, *hotobj;
    Evas_Object *eventarea, *owner;
    const char *style, *cursor_name;
    int hot_x, hot_y;
@@ -166,9 +166,41 @@ _elm_cursor_obj_del(void *data, Evas *evas EINA_UNUSED, 
Evas_Object *obj EINA_UN
         evas_object_event_callback_del_full(cur->obj, EVAS_CALLBACK_DEL,
                                             _elm_cursor_obj_del, cur);
         cur->obj = NULL;
+        ELM_SAFE_FREE(cur->hotobj, evas_object_del);
      }
 }
 
+static void
+_elm_cursor_set_hot_spots(Elm_Cursor *cur)
+{
+   const char *str;
+   Evas_Coord cx, cy, x, y, w, h;
+   int prev_hot_x, prev_hot_y;
+
+   prev_hot_x = cur->hot_x;
+   prev_hot_y = cur->hot_y;
+   
+   evas_object_geometry_get(cur->obj, &cx, &cy, NULL, NULL);
+   evas_object_geometry_get(cur->hotobj, &x, &y, &w, &h);
+   cur->hot_x = (x + (w / 2)) - cx;
+   cur->hot_y = (y + (h / 2)) - cy;
+
+   str = edje_object_data_get(cur->obj, "hot_x");
+   if (str) cur->hot_x = atoi(str);
+   str = edje_object_data_get(cur->obj, "hot_y");
+   if (str) cur->hot_y = atoi(str);
+   
+   if ((prev_hot_x != cur->hot_x) || (prev_hot_y != cur->hot_y))
+     ecore_evas_object_cursor_set(cur->ee, cur->obj, ELM_OBJECT_LAYER_CURSOR,
+                                  cur->hot_x, cur->hot_y);
+}
+
+static void
+_elm_cursor_hot_change(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   _elm_cursor_set_hot_spots(data);
+}
+
 static Eina_Bool
 _elm_cursor_obj_add(Evas_Object *obj, Elm_Cursor *cur)
 {
@@ -176,8 +208,7 @@ _elm_cursor_obj_add(Evas_Object *obj, Elm_Cursor *cur)
 
    cur->obj = edje_object_add(cur->evas);
 
-   if (!cur->obj)
-     return EINA_FALSE;
+   if (!cur->obj) return EINA_FALSE;
 
    if (!_elm_theme_object_set(obj, cur->obj, "cursor", cur->cursor_name,
                              cur->style ? cur->style : "default"))
@@ -185,30 +216,23 @@ _elm_cursor_obj_add(Evas_Object *obj, Elm_Cursor *cur)
         ELM_SAFE_FREE(cur->obj, evas_object_del);
         return EINA_FALSE;
      }
+   cur->hotobj = evas_object_rectangle_add(cur->evas);
+   evas_object_color_set(cur->hotobj, 0, 0, 0, 0);
+   edje_object_part_swallow(cur->obj, "elm.content.hotspot", cur->hotobj);
+   evas_object_event_callback_add(cur->obj, EVAS_CALLBACK_MOVE,
+                                  _elm_cursor_hot_change, cur);
+   evas_object_event_callback_add(cur->obj, EVAS_CALLBACK_RESIZE,
+                                  _elm_cursor_hot_change, cur);
 
    evas_object_event_callback_add(cur->obj, EVAS_CALLBACK_DEL,
                                   _elm_cursor_obj_del, cur);
-
    edje_object_size_min_get(cur->obj, &x, &y);
+   edje_object_size_min_restricted_calc(cur->obj, &x, &y, x, y);
    evas_object_resize(cur->obj, x, y);
    return EINA_TRUE;
 }
 
 static void
-_elm_cursor_set_hot_spots(Elm_Cursor *cur)
-{
-   const char *str;
-
-   str = edje_object_data_get(cur->obj, "hot_x");
-   if (str) cur->hot_x = atoi(str);
-   else cur->hot_x = 0;
-
-   str = edje_object_data_get(cur->obj, "hot_y");
-   if (str) cur->hot_y = atoi(str);
-   else cur->hot_y = 0;
-}
-
-static void
 _elm_cursor_set(Elm_Cursor *cur)
 {
    if (cur->visible) return;
@@ -229,6 +253,7 @@ _elm_cursor_set(Elm_Cursor *cur)
           {
              evas_object_del(cur->obj);
              cur->obj = NULL;
+             ELM_SAFE_FREE(cur->hotobj, evas_object_del);
           }
         ecore_evas_object_cursor_set(cur->ee, NULL,
                                      ELM_OBJECT_LAYER_CURSOR, cur->hot_x,

-- 


Reply via email to