Changeset View
Changeset View
Standalone View
Standalone View
src/lib/elementary/efl_ui_clickable_util.c
- This file was added.
1 | #ifdef HAVE_CONFIG_H | ||||
---|---|---|---|---|---|
2 | # include <config.h> | ||||
3 | #endif | ||||
4 | | ||||
5 | #define EFL_UI_CLICKABLE_PROTECTED 1 | ||||
6 | | ||||
7 | #include <Efl_Ui.h> | ||||
8 | #include "elm_priv.h" | ||||
9 | | ||||
10 | typedef struct { | ||||
11 | | ||||
12 | } Efl_Ui_Clickable_Util_Data; | ||||
13 | | ||||
14 | static void | ||||
15 | _on_press_cb(void *data, | ||||
16 | Evas_Object *obj EINA_UNUSED, | ||||
17 | const char *emission EINA_UNUSED, | ||||
18 | const char *source EINA_UNUSED) | ||||
19 | { | ||||
20 | efl_ui_clickable_press(data, 1); | ||||
21 | } | ||||
22 | | ||||
23 | static void | ||||
24 | _on_unpress_cb(void *data, | ||||
25 | Evas_Object *obj EINA_UNUSED, | ||||
26 | const char *emission EINA_UNUSED, | ||||
27 | const char *source EINA_UNUSED) | ||||
28 | { | ||||
29 | efl_ui_clickable_unpress(data, 1); | ||||
30 | } | ||||
31 | | ||||
32 | static void | ||||
33 | _on_mouse_out(void *data, | ||||
34 | Evas_Object *obj EINA_UNUSED, | ||||
35 | const char *emission EINA_UNUSED, | ||||
36 | const char *source EINA_UNUSED) | ||||
37 | { | ||||
38 | efl_ui_clickable_button_state_reset(data, 1); | ||||
39 | } | ||||
40 | | ||||
41 | EOLIAN static void | ||||
42 | _efl_ui_clickable_util_bind_to_theme(Efl_Canvas_Layout *object, Efl_Ui_Clickable *clickable) | ||||
43 | { | ||||
44 | efl_layout_signal_callback_add(object, "efl,action,press", "*", clickable, _on_press_cb, NULL); | ||||
45 | efl_layout_signal_callback_add(object, "efl,action,unpress", "*", clickable, _on_unpress_cb, NULL); | ||||
46 | efl_layout_signal_callback_add(object, "efl,action,mouse_out", "*", clickable, _on_mouse_out, NULL); | ||||
47 | } | ||||
48 | | ||||
49 | static void | ||||
50 | _press_cb(void *data, const Efl_Event *ev) | ||||
51 | { | ||||
52 | Efl_Input_Pointer *pointer = ev->info; | ||||
53 | if (!efl_input_processed_get(pointer)) | ||||
54 | { | ||||
55 | efl_ui_clickable_press(data, 1); | ||||
56 | efl_input_processed_set(pointer, EINA_TRUE); | ||||
57 | } | ||||
58 | } | ||||
59 | | ||||
60 | static void | ||||
61 | _unpress_cb(void *data, const Efl_Event *ev EINA_UNUSED) | ||||
62 | { | ||||
63 | Efl_Input_Pointer *pointer = ev->info; | ||||
64 | Eina_Position2D mouse_pos = efl_input_pointer_position_get(pointer); | ||||
65 | Eina_Rect geom = efl_gfx_entity_geometry_get(data); | ||||
66 | if (efl_input_processed_get(pointer)) | ||||
67 | { | ||||
68 | efl_ui_clickable_button_state_reset(data, 1); | ||||
69 | } | ||||
70 | else if (!eina_rectangle_coords_inside(&geom.rect, mouse_pos.x, mouse_pos.y)) | ||||
71 | { | ||||
72 | //we are emulating edje behavior here, do press unpress on the event, but not click | ||||
73 | efl_ui_clickable_button_state_reset(data, 1); | ||||
74 | if (efl_canvas_object_pointer_mode_get(data) == EFL_INPUT_OBJECT_POINTER_MODE_AUTO_GRAB) | ||||
75 | { | ||||
76 | efl_ui_clickable_unpress(data, 1); | ||||
77 | efl_input_processed_set(pointer, EINA_TRUE); | ||||
78 | } | ||||
79 | } | ||||
80 | else | ||||
81 | { | ||||
82 | efl_ui_clickable_unpress(data, 1); | ||||
83 | efl_input_processed_set(pointer, EINA_TRUE); | ||||
84 | } | ||||
85 | } | ||||
86 | | ||||
87 | EFL_CALLBACKS_ARRAY_DEFINE(bind_to_theme_callbacks, | ||||
88 | {EFL_EVENT_POINTER_DOWN, _press_cb}, | ||||
89 | {EFL_EVENT_POINTER_UP, _unpress_cb}, | ||||
90 | ) | ||||
91 | | ||||
92 | EOLIAN static void | ||||
93 | _efl_ui_clickable_util_bind_to_theme(Efl_Input_Interface *object, Efl_Ui_Clickable *clickable) | ||||
94 | { | ||||
95 | efl_event_callback_array_add(object, bind_to_theme_callbacks(), clickable); | ||||
96 | } | ||||
97 | | ||||
98 | | ||||
99 | #include "efl_ui_clickable_util.eo.c" |