1 #include "e_mod_main.h"
2 #include "e_mod_ivi_home.h"
6 IVI_HOME_SIZE_MODE_NONE,
7 IVI_HOME_SIZE_MODE_HALF,
8 IVI_HOME_SIZE_MODE_FULL,
9 IVI_HOME_SIZE_MODE_SMALL,
15 IVI_Home_Size_Mode ivi_policy_mode;
16 Eina_Bool ivi_policy_state;
21 IVI_HOME_HINT_SIZE_MODE,
24 static const char *ivi_home_hint_names[] =
26 "wm.policy.ivi.win.size.mode",
29 static Eina_Hash *hash_clients = NULL;
30 static Eina_List *hooks_ec = NULL;
31 static E_Client *ivi_clients[2] = {NULL, NULL};
34 _ivi_home_policy_pre(IVI_Home_Client *ic, IVI_Home_Size_Mode mode, int slot)
41 if (ec->desk->visible)
42 e_zone_useful_geometry_get(ec->zone, &zx, &zy, &zw, &zh);
51 ic->ivi_policy_mode = mode;
54 case IVI_HOME_SIZE_MODE_FULL:
57 ec->x = ec->client.x = zx;
58 ec->y = ec->client.y = zy;
59 ec->w = ec->client.w = zw;
60 ec->h = ec->client.h = zh;
63 case IVI_HOME_SIZE_MODE_SMALL:
66 ec->x = ec->client.x = zx;
67 ec->y = ec->client.y = zy;
68 ec->w = ec->client.w = zw;
69 ec->h = ec->client.h = zh * 9 / 10;
73 ec->x = ec->client.x = zx;
74 ec->y = ec->client.y = zh - zh / 10;
75 ec->w = ec->client.w = zw;
76 ec->h = ec->client.h = zh / 10;
79 case IVI_HOME_SIZE_MODE_HALF:
80 case IVI_HOME_SIZE_MODE_NONE:
82 ic->ivi_policy_mode = IVI_HOME_SIZE_MODE_HALF;
85 ec->x = ec->client.x = zx;
86 ec->y = ec->client.y = zy;
90 ec->x = ec->client.x = zx;
91 ec->y = ec->client.y = zh / 2;
93 ec->w = ec->client.w = zw;
94 ec->h = ec->client.h = zh / 2;
101 _ivi_home_policy_apply(IVI_Home_Client *ic, int slot)
106 if (ic->ivi_policy_state) return;
108 ic->ivi_policy_state = EINA_TRUE;
111 ivi_clients[slot] = ec;
113 /* skip hooks of e_remeber for eval_pre_post_fetch and eval_post_new_client */
114 ec->internal_no_remember = 1;
119 ec->border.changed = 1;
123 _ivi_home_policy_pre(ic, ic->ivi_policy_mode, slot);
124 evas_object_move(ec->frame, ec->x, ec->y);
125 evas_object_resize(ec->frame, ec->w, ec->h);
126 ec->placed = EINA_TRUE;
127 e_client_visibility_calculate();
129 /* do not allow client to change these properties */
130 ec->lock_user_location = 1;
131 ec->lock_client_location = 1;
132 ec->lock_user_size = 1;
133 ec->lock_client_size = 1;
134 ec->lock_user_shade = 1;
135 ec->lock_client_shade = 1;
136 ec->lock_user_maximize = 1;
137 ec->lock_client_maximize = 1;
138 ec->lock_user_fullscreen = 1;
139 ec->lock_client_fullscreen = 1;
140 ec->skip_fullscreen = 1;
144 _ivi_home_policy_change(IVI_Home_Client *ic, IVI_Home_Size_Mode mode, int slot)
150 if (ic->ivi_policy_mode == mode) return;
153 if (!ic->ivi_policy_state)
155 _ivi_home_policy_apply(ic, slot);
159 _ivi_home_policy_pre(ic, mode, slot);
160 evas_object_move(ec->frame, ec->x, ec->y);
161 evas_object_resize(ec->frame, ec->w, ec->h);
162 ec->placed = EINA_TRUE;
163 e_client_visibility_calculate();
167 _ivi_home_client_is_ivi_home(E_Client *ec)
169 E_OBJECT_CHECK_RETURN(ec, EINA_FALSE);
170 E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, EINA_FALSE);
172 if (!e_util_strcmp("ivi-home", ec->icccm.window_role))
179 _ivi_home_client_is_ivi_navi(E_Client *ec)
181 E_OBJECT_CHECK_RETURN(ec, EINA_FALSE);
182 E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, EINA_FALSE);
184 if (!e_util_strcmp("ivi-navi", ec->icccm.window_role))
191 _ivi_home_size_mode_set(E_Client *ec, IVI_Home_Size_Mode mode)
195 if (!_ivi_home_client_is_ivi_home(ec)) return;
197 ic = eina_hash_find(hash_clients, &ec);
198 _ivi_home_policy_change(ic, mode, 1);
200 if (ivi_clients[0] && _ivi_home_client_is_ivi_navi(ivi_clients[0]))
202 ic = eina_hash_find(hash_clients, &ivi_clients[0]);
203 _ivi_home_policy_change(ic, mode, 0);
208 _ivi_home_cb_hook_client_new(void *d EINA_UNUSED, E_Client *ec)
212 if (e_object_is_del(E_OBJECT(ec))) return;
214 ic = eina_hash_find(hash_clients, &ec);
217 ic = E_NEW(IVI_Home_Client, 1);
221 eina_hash_add(hash_clients, &ec, ic);
225 _ivi_home_cb_hook_client_del(void *d EINA_UNUSED, E_Client *ec)
227 if (ivi_clients[0] == ec)
228 ivi_clients[0] = NULL;
229 else if (ivi_clients[1] == ec)
230 ivi_clients[1] = NULL;
232 eina_hash_del_by_key(hash_clients, &ec);
236 _ivi_home_cb_hook_aux_hint_changed(void *d EINA_UNUSED, E_Client *ec)
238 E_Comp_Wl_Client_Data *cdata;
240 E_Comp_Wl_Aux_Hint *hint;
242 if (EINA_UNLIKELY(!ec))
245 cdata = (E_Comp_Wl_Client_Data*)ec->comp_data;
248 EINA_LIST_FOREACH(cdata->aux_hint.hints, l, hint)
250 if (!strcmp(hint->hint, ivi_home_hint_names[IVI_HOME_HINT_SIZE_MODE]))
253 _ivi_home_size_mode_set(ec, IVI_HOME_SIZE_MODE_NONE);
254 else if (!strcmp(hint->val, "half"))
255 _ivi_home_size_mode_set(ec, IVI_HOME_SIZE_MODE_HALF);
256 else if (!strcmp(hint->val, "full"))
257 _ivi_home_size_mode_set(ec, IVI_HOME_SIZE_MODE_FULL);
258 else if (!strcmp(hint->val, "small"))
259 _ivi_home_size_mode_set(ec, IVI_HOME_SIZE_MODE_SMALL);
266 _ivi_home_cb_hook_role_changed(void *d EINA_UNUSED, E_Client *ec)
268 if (e_object_is_del(E_OBJECT(ec))) return;
270 if (_ivi_home_client_is_ivi_home(ec))
272 e_policy_allow_user_geometry_set(ec, EINA_TRUE);
273 e_client_layer_set(ec, E_LAYER_CLIENT_ABOVE);
275 else if (_ivi_home_client_is_ivi_navi(ec))
277 e_policy_allow_user_geometry_set(ec, EINA_TRUE);
278 e_client_layer_set(ec, E_LAYER_CLIENT_BELOW);
283 _ivi_home_cb_hook_eval_post_fetch(void *d EINA_UNUSED, E_Client *ec)
287 if (e_object_is_del(E_OBJECT(ec))) return;
288 if ((ec->new_client) && (!e_pixmap_usable_get(ec->pixmap))) return;
290 ic = eina_hash_find(hash_clients, &ec);
293 if (_ivi_home_client_is_ivi_home(ec))
295 _ivi_home_policy_apply(ic, 1);
297 else if (_ivi_home_client_is_ivi_navi(ec))
299 _ivi_home_policy_apply(ic, 0);
304 e_mod_ivi_home_aux_hint_init(void)
307 n = (sizeof(ivi_home_hint_names) / sizeof(char *));
309 for (i = 0; i < n; i++)
311 e_hints_aux_hint_supported_add(ivi_home_hint_names[i]);
316 _ivi_home_cb_client_data_free(void *data)
322 e_mod_ivi_home_init(void)
324 hash_clients = eina_hash_pointer_new(_ivi_home_cb_client_data_free);
326 E_CLIENT_HOOK_APPEND(hooks_ec, E_CLIENT_HOOK_NEW_CLIENT, _ivi_home_cb_hook_client_new, NULL);
327 E_CLIENT_HOOK_APPEND(hooks_ec, E_CLIENT_HOOK_DEL, _ivi_home_cb_hook_client_del, NULL);
328 E_CLIENT_HOOK_APPEND(hooks_ec, E_CLIENT_HOOK_AUX_HINT_CHANGE, _ivi_home_cb_hook_aux_hint_changed, NULL);
329 E_CLIENT_HOOK_APPEND(hooks_ec, E_CLIENT_HOOK_WINDOW_ROLE_CHANGE, _ivi_home_cb_hook_role_changed, NULL);
330 E_CLIENT_HOOK_APPEND(hooks_ec, E_CLIENT_HOOK_EVAL_POST_FETCH, _ivi_home_cb_hook_eval_post_fetch, NULL);
332 e_mod_ivi_home_aux_hint_init();
336 e_mod_ivi_home_shutdown(void)
338 E_FREE_LIST(hooks_ec, e_client_hook_del);
339 E_FREE_FUNC(hash_clients, eina_hash_free);