d1b88b9ef6a6a4f8b137d55d4de4cb62f6715f14
[framework/uifw/e17.git] / src / modules / illume-kbd-toggle / e_mod_main.c
1 #include "e.h"
2 #include "e_mod_main.h"
3
4 /* local structures */
5 typedef struct _Instance Instance;
6 struct _Instance 
7 {
8    E_Gadcon_Client *gcc;
9    Evas_Object *o_toggle;
10    Eina_List *handlers;
11 };
12
13 /* local function prototypes */
14 static E_Gadcon_Client *_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style);
15 static void _gc_shutdown(E_Gadcon_Client *gcc);
16 static void _gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient);
17 static char *_gc_label(E_Gadcon_Client_Class *cc);
18 static Evas_Object *_gc_icon(E_Gadcon_Client_Class *cc, Evas *evas);
19 static const char *_gc_id_new(E_Gadcon_Client_Class *cc);
20 static void _cb_action_vkbd_enable(void *data, Evas_Object *obj, const char *emission, const char *source);
21 static void _cb_action_vkbd_disable(void *data, Evas_Object *obj, const char *emission, const char *source);
22 static Eina_Bool _cb_border_focus_in(void *data, int type __UNUSED__, void *event);
23 static Eina_Bool _cb_border_remove(void *data, int type __UNUSED__, void *event);
24 static Eina_Bool _cb_border_property(void *data, int type __UNUSED__, void *event);
25 static void _set_btn_icon(Evas_Object *obj, Ecore_X_Virtual_Keyboard_State state);
26
27 /* local variables */
28 static Eina_List *instances = NULL;
29 static const char *mod_dir = NULL;
30
31 static const E_Gadcon_Client_Class _gc_class = 
32 {
33    GADCON_CLIENT_CLASS_VERSION, "illume-kbd-toggle", 
34      { _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, 
35           e_gadcon_site_is_not_toolbar
36      }, E_GADCON_CLIENT_STYLE_PLAIN
37 };
38
39 /* public functions */
40 EAPI E_Module_Api e_modapi = { E_MODULE_API_VERSION, "Illume Keyboard Toggle" };
41
42 EAPI void *
43 e_modapi_init(E_Module *m) 
44 {
45    mod_dir = eina_stringshare_add(m->dir);
46    e_gadcon_provider_register(&_gc_class);
47    return m;
48 }
49
50 EAPI int 
51 e_modapi_shutdown(E_Module *m __UNUSED__) 
52 {
53    e_gadcon_provider_unregister(&_gc_class);
54    if (mod_dir) eina_stringshare_del(mod_dir);
55    mod_dir = NULL;
56    return 1;
57 }
58
59 EAPI int 
60 e_modapi_save(E_Module *m __UNUSED__) 
61 {
62    return 1;
63 }
64
65 /* local function prototypes */
66 static E_Gadcon_Client *
67 _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) 
68 {
69    Instance *inst;
70
71    inst = E_NEW(Instance, 1);
72    inst->o_toggle = edje_object_add(gc->evas);
73    e_theme_edje_object_set(inst->o_toggle, 
74                            "base/theme/modules/illume_kbd_toggle",
75                            "e/modules/illume_kbd_toggle/main");
76
77    inst->gcc = e_gadcon_client_new(gc, name, id, style, inst->o_toggle);
78    inst->gcc->data = inst;
79
80    edje_object_signal_callback_add(inst->o_toggle, "e,action,vkbd,enable", "",
81                                    _cb_action_vkbd_enable, inst);
82    edje_object_signal_callback_add(inst->o_toggle, "e,action,vkbd,disable", "",
83                                    _cb_action_vkbd_disable, inst);
84
85    inst->handlers = 
86      eina_list_append(inst->handlers, 
87                       ecore_event_handler_add(E_EVENT_BORDER_FOCUS_IN, 
88                                               _cb_border_focus_in, inst));
89    inst->handlers = 
90      eina_list_append(inst->handlers, 
91                       ecore_event_handler_add(E_EVENT_BORDER_REMOVE, 
92                                               _cb_border_remove, inst));
93    inst->handlers = 
94      eina_list_append(inst->handlers, 
95                       ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, 
96                                               _cb_border_property, inst));
97
98    instances = eina_list_append(instances, inst);
99    return inst->gcc;
100 }
101
102 static void 
103 _gc_shutdown(E_Gadcon_Client *gcc) 
104 {
105    Instance *inst;
106    Ecore_Event_Handler *handler;
107
108    if (!(inst = gcc->data)) return;
109    instances = eina_list_remove(instances, inst);
110    if (inst->o_toggle) evas_object_del(inst->o_toggle);
111    EINA_LIST_FREE(inst->handlers, handler)
112      ecore_event_handler_del(handler);
113    E_FREE(inst);
114 }
115
116 static void 
117 _gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient __UNUSED__) 
118 {
119    e_gadcon_client_aspect_set(gcc, 16, 16);
120    e_gadcon_client_min_size_set(gcc, 16, 16);
121 }
122
123 static char *
124 _gc_label(E_Gadcon_Client_Class *cc __UNUSED__) 
125 {
126    return _("Illume-Keyboard-Toggle");
127 }
128
129 static Evas_Object *
130 _gc_icon(E_Gadcon_Client_Class *cc __UNUSED__, Evas *evas) 
131 {
132    Evas_Object *o;
133    char buff[PATH_MAX];
134
135    snprintf(buff, sizeof(buff), "%s/e-module-illume-kbd-toggle.edj", mod_dir);
136    o = edje_object_add(evas);
137    edje_object_file_set(o, buff, "icon");
138    return o;
139 }
140
141 static const char *
142 _gc_id_new(E_Gadcon_Client_Class *cc __UNUSED__) 
143 {
144    static char buff[32];
145
146    snprintf(buff, sizeof(buff), "%s.%d", _gc_class.name, 
147             eina_list_count(instances));
148    return buff;
149 }
150
151 static void
152 _cb_action_vkbd_enable(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
153 {
154    Instance *inst;
155    E_Border *bd;
156
157    if (!(inst = data)) return;
158    if (!(bd = e_border_focused_get())) return;
159    if (bd->zone != inst->gcc->gadcon->zone) return;
160    if (bd->client.vkbd.state == ECORE_X_VIRTUAL_KEYBOARD_STATE_ON) return;
161
162    ecore_x_e_virtual_keyboard_state_set(bd->client.win,
163                                         ECORE_X_VIRTUAL_KEYBOARD_STATE_ON);
164 }
165
166 static void
167 _cb_action_vkbd_disable(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
168 {
169    Instance *inst;
170    E_Border *bd;
171
172    if (!(inst = data)) return;
173    if (!(bd = e_border_focused_get())) return;
174    if (bd->zone != inst->gcc->gadcon->zone) return;
175    if (bd->client.vkbd.state == ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF) return;
176
177    ecore_x_e_virtual_keyboard_state_set(bd->client.win,
178                                         ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF);
179 }
180
181 static Eina_Bool
182 _cb_border_focus_in(void *data, int type __UNUSED__, void *event) 
183 {
184    Instance *inst;
185    E_Event_Border_Focus_In *ev;
186    E_Border *bd;
187
188    if (!(inst = data)) return ECORE_CALLBACK_PASS_ON;
189    ev = event;
190    if (ev->border->stolen) return ECORE_CALLBACK_PASS_ON;
191    if (!(bd = ev->border)) return ECORE_CALLBACK_PASS_ON;
192    if (bd->zone != inst->gcc->gadcon->zone) return ECORE_CALLBACK_PASS_ON;
193    _set_btn_icon(inst->o_toggle, bd->client.vkbd.state);
194    return ECORE_CALLBACK_PASS_ON;
195 }
196
197 static Eina_Bool
198 _cb_border_remove(void *data, int type __UNUSED__, void *event __UNUSED__) 
199 {
200    Instance *inst;
201
202    if (!(inst = data)) return ECORE_CALLBACK_PASS_ON;
203    _set_btn_icon(inst->o_toggle, ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF);
204    return ECORE_CALLBACK_PASS_ON;
205 }
206
207 static Eina_Bool
208 _cb_border_property(void *data, int type __UNUSED__, void *event) 
209 {
210    Instance *inst;
211    Ecore_X_Event_Window_Property *ev;
212    E_Border *bd;
213
214    ev = event;
215    if (ev->atom != ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE) 
216      return ECORE_CALLBACK_PASS_ON;
217    if (!(bd = e_border_find_by_client_window(ev->win))) 
218      return ECORE_CALLBACK_PASS_ON;
219    if (!bd->focused) return ECORE_CALLBACK_PASS_ON;
220    if (!(inst = data)) return ECORE_CALLBACK_PASS_ON;
221    if (bd->zone != inst->gcc->gadcon->zone) return ECORE_CALLBACK_PASS_ON;
222    _set_btn_icon(inst->o_toggle, bd->client.vkbd.state);
223    return ECORE_CALLBACK_PASS_ON;
224 }
225
226 static void
227 _set_btn_icon(Evas_Object *obj, Ecore_X_Virtual_Keyboard_State state)
228 {
229    if (state == ECORE_X_VIRTUAL_KEYBOARD_STATE_ON)
230      edje_object_signal_emit(obj, "e,state,vkbd,on", "e");
231    else
232      edje_object_signal_emit(obj, "e,state,vkbd,off", "e");
233 }