aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>2014-04-02 20:48:32 +0900
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2014-04-02 20:48:32 +0900
commitb1040a688b9b8cc028f6f2bebf65a6bb51486901 (patch)
tree9b6acdac1be180a532986eaca033c02e52feb647
parentoops - printfs snuck in. remove (diff)
downloadelementary-b1040a688b9b8cc028f6f2bebf65a6bb51486901.tar.gz
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.
-rw-r--r--data/themes/Makefile.am2
-rw-r--r--data/themes/default.edc1
-rw-r--r--data/themes/edc/elm/cursor.edc101
-rw-r--r--data/themes/img/pointer_hand1.pngbin0 -> 1382 bytes
-rw-r--r--src/bin/test_cursor.c2
-rw-r--r--src/lib/els_cursor.c61
6 files changed, 148 insertions, 19 deletions
diff --git a/data/themes/Makefile.am b/data/themes/Makefile.am
index 2139b9b84..444ea8320 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 09a26c5e9..953de8b40 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 000000000..ea7bc111a
--- /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 000000000..68f356d06
--- /dev/null
+++ b/data/themes/img/pointer_hand1.png
Binary files differ
diff --git a/src/bin/test_cursor.c b/src/bin/test_cursor.c
index afd86594a..499e9d525 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 ab778538d..da74f1054 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,