e8f2344e2a0dc46d83d2a68343389e6913bec3b4
[framework/uifw/e17.git] / src / modules / illume-mode-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    Ecore_Event_Handler *hdl;
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_mode_single(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__);
21 static void _cb_action_mode_dual_top(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__);
22 static void _cb_action_mode_dual_left(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__);
23 static Eina_Bool _cb_event_client_message(void *data, int type __UNUSED__, void *event);
24 static void _set_icon(Instance *inst);
25 static void _mode_set(Instance *inst, Ecore_X_Illume_Mode mode);
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-mode-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 Mode 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 functions */
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_mode_toggle",
75                            "e/modules/illume_mode_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,mode,single", "",
81                                    _cb_action_mode_single, inst);
82    edje_object_signal_callback_add(inst->o_toggle, "e,action,mode,dual,top", "",
83                                    _cb_action_mode_dual_top, inst);
84    edje_object_signal_callback_add(inst->o_toggle, "e,action,mode,dual,left", "",
85                                    _cb_action_mode_dual_left, inst);
86
87    _set_icon(inst);
88
89    inst->hdl = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE,
90                                        _cb_event_client_message, inst);
91
92    instances = eina_list_append(instances, inst);
93    return inst->gcc;
94 }
95
96 static void 
97 _gc_shutdown(E_Gadcon_Client *gcc) 
98 {
99    Instance *inst;
100
101    if (!(inst = gcc->data)) return;
102    instances = eina_list_remove(instances, inst);
103    if (inst->o_toggle) evas_object_del(inst->o_toggle);
104    if (inst->hdl) ecore_event_handler_del(inst->hdl);
105    inst->hdl = NULL;
106    E_FREE(inst);
107 }
108
109 static void 
110 _gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient __UNUSED__) 
111 {
112    e_gadcon_client_aspect_set(gcc, 16, 16);
113    e_gadcon_client_min_size_set(gcc, 16, 16);
114 }
115
116 static char *
117 _gc_label(E_Gadcon_Client_Class *cc __UNUSED__) 
118 {
119    return _("Illume-Mode-Toggle");
120 }
121
122 static Evas_Object *
123 _gc_icon(E_Gadcon_Client_Class *cc __UNUSED__, Evas *evas) 
124 {
125    Evas_Object *o;
126    char buff[PATH_MAX];
127
128    snprintf(buff, sizeof(buff), "%s/e-module-illume-mode-toggle.edj", mod_dir);
129    o = edje_object_add(evas);
130    edje_object_file_set(o, buff, "icon");
131    return o;
132 }
133
134 static const char *
135 _gc_id_new(E_Gadcon_Client_Class *cc __UNUSED__) 
136 {
137    static char buff[32];
138
139    snprintf(buff, sizeof(buff), "%s.%d", _gc_class.name, 
140             eina_list_count(instances));
141    return buff;
142 }
143
144 static void
145 _cb_action_mode_single(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
146 {
147    _mode_set(data, ECORE_X_ILLUME_MODE_SINGLE);
148 }
149
150 static void
151 _cb_action_mode_dual_top(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
152 {
153    _mode_set(data, ECORE_X_ILLUME_MODE_DUAL_TOP);
154 }
155
156 static void
157 _cb_action_mode_dual_left(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
158 {
159    _mode_set(data, ECORE_X_ILLUME_MODE_DUAL_LEFT);
160 }
161
162 static Eina_Bool
163 _cb_event_client_message(void *data, int type __UNUSED__, void *event)
164 {
165    Ecore_X_Event_Client_Message *ev;
166    Instance *inst;
167
168    ev = event;
169    if (ev->message_type != ECORE_X_ATOM_E_ILLUME_MODE) 
170      return ECORE_CALLBACK_PASS_ON;
171    if (!(inst = data)) return ECORE_CALLBACK_PASS_ON;
172    _set_icon(inst);
173    return ECORE_CALLBACK_PASS_ON;
174 }
175
176 static void
177 _set_icon(Instance *inst)
178 {
179    Ecore_X_Window xwin;
180    Ecore_X_Illume_Mode mode;
181
182    xwin = inst->gcc->gadcon->zone->black_win;
183    mode = ecore_x_e_illume_mode_get(xwin);
184
185    if (mode == ECORE_X_ILLUME_MODE_DUAL_TOP)
186      edje_object_signal_emit(inst->o_toggle, "e,mode,dual,top", "e");
187    else if (mode == ECORE_X_ILLUME_MODE_DUAL_LEFT)
188      edje_object_signal_emit(inst->o_toggle, "e,mode,dual,left", "e");
189    else
190      edje_object_signal_emit(inst->o_toggle, "e,mode,single", "e");
191 }
192
193 static void
194 _mode_set(Instance *inst, Ecore_X_Illume_Mode mode)
195 {
196    Ecore_X_Window xwin;
197
198    if (!inst) return;
199
200    xwin = inst->gcc->gadcon->zone->black_win;
201    ecore_x_e_illume_mode_set(xwin, mode);
202    ecore_x_e_illume_mode_send(xwin, mode);
203 }