2 #include "e_mod_split_screen_manager_log.h"
3 #include "e_mod_split_screen_manager.h"
4 #include "e_mod_split_screen_region.h"
5 #include "e_mod_appinfo_ext.h"
7 typedef Eina_Bool (*E_Mod_Split_Screen_Manager_Hint_Func)(E_Client *ec, const char *name, const char *value);
8 struct _E_Mod_Split_Screen_Manager_Hint_Handler
12 E_Mod_Split_Screen_Manager_Hint_Func func;
15 typedef struct _E_Mod_Split_Screen_Manager_Hint_Handler E_Mod_Split_Screen_Manager_Hint_Handler;
17 enum _E_Mod_Split_Screen_Manager_Hint_Type
19 E_MOD_SPLIT_SCREEN_MANAGER_HINT_ASSIGN_REGION = 0,
20 E_MOD_SPLIT_SCREEN_MANAGER_HINT_LAUNCHER_ROLE_SET,
21 E_MOD_SPLIT_SCREEN_MANAGER_HINT_ASSIGN_REGION_SUB1,
22 E_MOD_SPLIT_SCREEN_MANAGER_HINT_ASSIGN_REGION_SUB2,
23 E_MOD_SPLIT_SCREEN_MANAGER_HINT_ACTIVATE,
24 E_MOD_SPLIT_SCREEN_MANAGER_HINT_DEACTIVATE,
25 E_MOD_SPLIT_SCREEN_MANAGER_HINT_MAX,
28 static Eina_List *_e_mod_split_screen_manager_ec_hook_handlers = NULL;
29 static Eina_List *_e_mod_split_screen_manager_ec_event_handlers = NULL;
30 static Eina_List *_e_mod_split_screen_manager_desk_area_hook_handlers = NULL;
31 static Eina_List *_e_mod_split_screen_manager_zone_hook_handlers = NULL;
33 static Eina_List *_e_mod_split_screen_region_list = NULL;
34 static E_Client *_e_mod_split_screen_launcher_ec = NULL;
37 static void _e_mod_split_screen_manager_cb_hook_aux_hint_change(void *data, E_Client *ec);
40 static Eina_Bool _e_mod_split_screen_manager_cb_ec_add(void *data EINA_UNUSED, int type EINA_UNUSED, void *event);
41 static Eina_Bool _e_mod_split_screen_manager_cb_ec_remove(void *data EINA_UNUSED, int type EINA_UNUSED, void *event);
43 /* Aux hint handlers */
44 static Eina_Bool _e_mod_split_screen_manager_hint_launcher_role_set(E_Client *ec, const char *name, const char *value);
45 static Eina_Bool _e_mod_split_screen_manager_hint_assign_region(E_Client *ec, const char *name, const char *value);
46 static Eina_Bool _e_mod_split_screen_manager_hint_assign_region_sub1(E_Client *ec, const char *name, const char *value);
47 static Eina_Bool _e_mod_split_screen_manager_hint_assign_region_sub2(E_Client *ec, const char *name, const char *value);
48 static Eina_Bool _e_mod_split_screen_manager_hint_activate(E_Client *ec, const char *name, const char *value);
49 static Eina_Bool _e_mod_split_screen_manager_hint_deactivate(E_Client *ec, const char *name, const char *value);
51 /* e_mod_split_screen_manager internal functions */
52 static void _e_mod_split_screen_manager_client_manager_role_set(E_Client *ec, Eina_Bool set);
53 static Eina_Bool _e_mod_split_screen_activate(E_Zone *zone);
54 static Eina_Bool _e_mod_split_screen_deactivate(E_Zone *zone);
55 static void _e_mod_split_screen_launcher_ec_set(E_Client *ec);
56 static E_Client * _e_mod_split_screen_launcher_ec_get(void);
57 static E_Mod_Split_Screen_Region *_e_mod_split_screen_manager_find_region_by_name(const char *name);
58 static E_Mod_Split_Screen_Region *_e_mod_split_screen_manager_find_region_by_desk_area(E_Desk_Area *eda);
59 static void _e_mod_split_screen_manager_appid_assign(E_Mod_Split_Screen_Region *emssr, const char *appid);
60 static Eina_Bool _e_mod_split_screen_manager_ec_assign_to_region_name(E_Client *ec, const char *region_name);
61 static Eina_Bool _e_mod_split_screen_manager_ec_relocate(E_Client *ec);
62 static Eina_Bool _e_mod_split_screen_manager_ec_relocate_to_region(E_Client *ec, E_Mod_Split_Screen_Region *emssr);
65 static Eina_Bool _e_mod_split_screen_manager_handler_init(void);
66 static Eina_Bool _e_mod_split_screen_manager_aux_hint_handler_init(void);
67 static void _e_mod_split_screen_manager_handler_shutdown(void);
68 static void _e_mod_split_screen_manager_aux_hint_handler_shutdown(void);
69 static Eina_Bool _e_mod_split_screen_manager_region_init(void);
70 static void _e_mod_split_screen_manager_region_shutdown(void);
72 static const E_Mod_Split_Screen_Manager_Hint_Handler _e_mod_split_screen_manager_hint_handler[] =
74 {E_MOD_SPLIT_SCREEN_MANAGER_HINT_ASSIGN_REGION, "wm.splitscreen.win.assign_region", _e_mod_split_screen_manager_hint_assign_region},
75 {E_MOD_SPLIT_SCREEN_MANAGER_HINT_LAUNCHER_ROLE_SET, "wm.splitscreen.win.launcher.role_set", _e_mod_split_screen_manager_hint_launcher_role_set},
76 {E_MOD_SPLIT_SCREEN_MANAGER_HINT_ASSIGN_REGION_SUB1, "wm.splitscreen.win.split_screen_manager.assign_region.sub1", _e_mod_split_screen_manager_hint_assign_region_sub1},
77 {E_MOD_SPLIT_SCREEN_MANAGER_HINT_ASSIGN_REGION_SUB2, "wm.splitscreen.win.split_screen_manager.assign_region.sub2", _e_mod_split_screen_manager_hint_assign_region_sub2},
78 {E_MOD_SPLIT_SCREEN_MANAGER_HINT_ACTIVATE, "wm.splitscreen.win.split_screen_manager.activate", _e_mod_split_screen_manager_hint_activate},
79 {E_MOD_SPLIT_SCREEN_MANAGER_HINT_DEACTIVATE, "wm.splitscreen.win.split_screen_manager.deactivate", _e_mod_split_screen_manager_hint_deactivate},
80 {E_MOD_SPLIT_SCREEN_MANAGER_HINT_MAX, NULL, NULL},
85 _e_mod_split_screen_manager_cb_hook_aux_hint_change(void *data, E_Client *ec)
87 const char *hint, *val;
91 SSMINF("ec is NULL", NULL);
95 for (int i=0 ; i<E_MOD_SPLIT_SCREEN_MANAGER_HINT_MAX ; i++)
97 hint = _e_mod_split_screen_manager_hint_handler[i].name;
98 val = e_hints_aux_hint_value_get(ec, hint);
101 _e_mod_split_screen_manager_hint_handler[i].func(ec, hint, val);
108 _e_mod_split_screen_manager_cb_hook_eval_fetch(void *data, E_Client *ec)
112 SSMINF("ec is NULL", NULL);
115 // TODO: FIX blinking issue while launching child window
116 _e_mod_split_screen_manager_ec_relocate(ec);
122 _e_mod_split_screen_manager_cb_hook_assign_appid(void *data EINA_UNUSED, E_Desk_Area *eda, void *appid_ptr)
124 E_Mod_Split_Screen_Region *emssr;
125 Eina_Stringshare *appid;
127 EINA_SAFETY_ON_NULL_RETURN(eda);
128 EINA_SAFETY_ON_NULL_RETURN(appid_ptr);
130 appid = eina_stringshare_add(appid_ptr);
131 emssr = _e_mod_split_screen_manager_find_region_by_desk_area(eda);
134 SSMERR("Failed to find region for desk area %p", NULL, eda);
138 _e_mod_split_screen_manager_appid_assign(emssr, appid);
144 _e_mod_split_screen_manager_cb_hook_activate(void *data, E_Zone *zone)
147 _e_mod_split_screen_activate(zone);
151 _e_mod_split_screen_manager_cb_hook_deactivate(void *data, E_Zone *zone)
154 _e_mod_split_screen_deactivate(zone);
158 /* e_client events */
160 _e_mod_split_screen_manager_cb_ec_add(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
165 if (!ev) return ECORE_CALLBACK_PASS_ON;
167 _e_mod_split_screen_manager_ec_relocate(ev->ec);
169 return ECORE_CALLBACK_PASS_ON;
173 _e_mod_split_screen_manager_cb_ec_remove(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
178 if (!ev) return ECORE_CALLBACK_PASS_ON;
180 e_mod_split_screen_region_ec_dismiss(ev->ec);
182 return ECORE_CALLBACK_PASS_ON;
185 /* Aux hint handlers */
187 _e_mod_split_screen_manager_hint_launcher_role_set(E_Client *ec, const char *name, const char *value)
189 if (!strncmp(value, "1", 1))
191 _e_mod_split_screen_manager_client_manager_role_set(ec, EINA_TRUE);
195 _e_mod_split_screen_manager_client_manager_role_set(ec, EINA_FALSE);
202 _e_mod_split_screen_manager_hint_assign_region(E_Client *ec, const char *name, const char *value)
204 E_Mod_Split_Screen_Region *emssr;
205 Eina_Stringshare *appid;
207 char _region_name[10] = {0,};
208 char _appid[255] = {0,};
210 EINA_SAFETY_ON_NULL_RETURN_VAL(value, EINA_FALSE);
212 // hint value format: region_name/appid
213 sscanf(value, "%[^/]/%s", _region_name, _appid);
214 SSMINF("client appid(%s) -> assign to region:%s", ec, _appid, _region_name);
216 if ((strlen(_region_name) <= 0) || strlen(_region_name) > 10)
218 SSMERR("invalid region name:%s", ec, _region_name);
222 if ((strlen(_appid) <= 0) || (strlen(_appid) > 255))
224 SSMERR("invalid app id:%s", ec, _appid);
228 emssr = _e_mod_split_screen_manager_find_region_by_name(_region_name);
231 SSMERR("invalid region name:%s", ec, _region_name);
235 appid = eina_stringshare_add(_appid);
237 _e_mod_split_screen_manager_appid_assign(emssr, appid);
243 _e_mod_split_screen_manager_hint_assign_region_sub1(E_Client *ec, const char *name, const char *value)
245 E_Mod_Split_Screen_Region *emssr;
246 Eina_Stringshare *appid;
248 EINA_SAFETY_ON_NULL_RETURN_VAL(value, EINA_FALSE);
250 if ((strlen(value) <= 0) || strlen(value) > 255)
252 SSMERR("invalid app id:%s", ec, value);
256 appid = eina_stringshare_add(value);
258 emssr = _e_mod_split_screen_manager_find_region_by_name("sub1");
261 SSMERR("invalid region name:%s", ec, "sub1");
265 _e_mod_split_screen_manager_appid_assign(emssr, appid);
271 _e_mod_split_screen_manager_hint_assign_region_sub2(E_Client *ec, const char *name, const char *value)
273 E_Mod_Split_Screen_Region *emssr;
274 Eina_Stringshare *appid;
276 EINA_SAFETY_ON_NULL_RETURN_VAL(value, EINA_FALSE);
278 if ((strlen(value) <= 0) || strlen(value) > 255)
280 SSMERR("invalid app id:%s", ec, value);
284 appid = eina_stringshare_add(value);
286 emssr = _e_mod_split_screen_manager_find_region_by_name("sub2");
289 SSMERR("invalid region name:%s", ec, "sub2");
293 _e_mod_split_screen_manager_appid_assign(emssr, appid);
299 _e_mod_split_screen_manager_hint_activate(E_Client *ec, const char *name, const char *value)
301 return _e_mod_split_screen_activate(e_zone_current_get());
305 _e_mod_split_screen_manager_hint_deactivate(E_Client *ec, const char *name, const char *value)
307 return _e_mod_split_screen_deactivate(e_zone_current_get());
310 /* internal functions */
313 _e_mod_split_screen_manager_client_manager_role_set(E_Client *ec, Eina_Bool set)
316 if (ec->floating == set) return;
324 _e_mod_split_screen_launcher_ec_set(ec);
325 ec->floating_saved_layer = ec->layer;
326 e_client_layer_set(ec, E_LAYER_CLIENT_ABOVE);
327 ec->netwm.type = E_WINDOW_TYPE_UTILITY;
328 _e_mod_split_screen_manager_ec_assign_to_region_name(ec, "above");
332 e_client_layer_set(ec, ec->floating_saved_layer);
333 ec->netwm.type = E_WINDOW_TYPE_NORMAL;
334 e_mod_split_screen_region_ec_dismiss(ec);
338 e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h);
339 e_comp_object_dirty(ec->frame);
340 e_comp_object_render(ec->frame);
346 _e_mod_split_screen_activate(E_Zone *zone)
349 E_Client *ec, *launcher;
350 Eina_Bool ret = EINA_FALSE;
352 SSMINF("ACTIVATE split screen", NULL);
354 desk = e_desk_current_get(zone);
355 ret = e_desk_desk_area_enable(desk);
357 // relocate all e clients
360 _e_mod_split_screen_manager_ec_relocate(ec);
363 // launcher window must be above desk group to unobscured by other windows
364 launcher = _e_mod_split_screen_launcher_ec_get();
366 _e_mod_split_screen_manager_ec_assign_to_region_name(launcher, "above");
372 _e_mod_split_screen_deactivate(E_Zone *zone)
375 Eina_Bool ret = EINA_FALSE;
377 SSMINF("DEACTIVATE split screen", NULL);
379 desk = e_desk_current_get(zone);
380 ret = e_desk_desk_area_disable(desk);
386 _e_mod_split_screen_launcher_ec_set(E_Client *ec)
388 _e_mod_split_screen_launcher_ec = ec;
392 _e_mod_split_screen_launcher_ec_get(void)
394 return _e_mod_split_screen_launcher_ec;
397 static E_Mod_Split_Screen_Region *
398 _e_mod_split_screen_manager_find_region_by_name(const char *name)
400 E_Mod_Split_Screen_Region *emssr = NULL;
402 const char *region_name;
404 EINA_LIST_FOREACH(_e_mod_split_screen_region_list, l, emssr)
406 region_name = e_mod_split_screen_region_name_get(emssr);
407 if (region_name && !strncmp(region_name, name, strlen(region_name))) break;
413 static E_Mod_Split_Screen_Region *
414 _e_mod_split_screen_manager_find_region_by_desk_area(E_Desk_Area *eda)
416 E_Mod_Split_Screen_Region *emssr = NULL;
419 EINA_LIST_FOREACH(_e_mod_split_screen_region_list, l, emssr)
421 if (e_mod_split_screen_region_desk_area_get(emssr) == eda) break;
428 _e_mod_split_screen_manager_appid_assign(E_Mod_Split_Screen_Region *emssr, const char *appid)
430 E_Mod_Split_Screen_Region *emssr_iter;
432 Eina_Stringshare *region_name;
435 // reassign AppID to Split screen region
436 EINA_LIST_FOREACH(_e_mod_split_screen_region_list, l, emssr_iter)
438 e_mod_split_screen_region_appid_dismiss(emssr_iter, appid);
440 e_mod_split_screen_region_appid_assign(emssr, appid);
442 // assign clients of appID to Split screen region
443 l = e_mod_appinfo_ext_find_clients_by_appid(appid);
444 EINA_LIST_FREE(l, ec)
446 e_mod_split_screen_region_ec_assign(emssr, ec);
449 region_name = e_mod_split_screen_region_name_get(emssr);
450 SSMINF("from now on, appid %s will be assign to region:%s", NULL, appid, region_name);
454 _e_mod_split_screen_manager_util_client_special_check(E_Client *ec)
456 if (!ec) return EINA_FALSE;
458 if (_e_mod_split_screen_launcher_ec_get() == ec) return EINA_TRUE;
460 if ((e_policy_client_is_lockscreen(ec)) ||
461 (e_policy_client_is_keyboard(ec)) ||
462 (e_policy_client_is_keyboard_sub(ec)) ||
463 (e_policy_client_is_noti(ec)) ||
464 (e_policy_client_is_quickpanel(ec)) ||
465 (e_policy_client_is_volume(ec)) ||
466 (e_policy_client_is_cursor(ec)) ||
467 (!e_util_strcmp("wl_pointer-cursor", ec->icccm.window_role)))
474 _e_mod_split_screen_manager_ec_assign_to_region_name(E_Client *ec, const char *region_name)
476 E_Mod_Split_Screen_Region *emssr = NULL;
478 if (!ec) return ECORE_CALLBACK_PASS_ON;
479 if (!region_name) return ECORE_CALLBACK_PASS_ON;
481 emssr = _e_mod_split_screen_manager_find_region_by_name(region_name);
484 SSMERR("invalid region name:%s", ec, region_name);
487 return e_mod_split_screen_region_ec_assign(emssr, ec);
491 _e_mod_split_screen_manager_ec_relocate(E_Client *ec)
493 E_Mod_Split_Screen_Region *emssr = NULL;
494 E_Client *parent_ec = NULL;
495 Eina_Bool res = EINA_FALSE;
498 if (!ec) return ECORE_CALLBACK_PASS_ON;
500 if (_e_mod_split_screen_manager_util_client_special_check(ec))
502 // special prupose windows.
503 _e_mod_split_screen_manager_ec_assign_to_region_name(ec, "above");
507 EINA_LIST_FOREACH(_e_mod_split_screen_region_list, l, emssr)
509 res |= _e_mod_split_screen_manager_ec_relocate_to_region(ec, emssr);
514 // find the parent ec that is in the region
515 for (parent_ec = ec->parent;
517 parent_ec = parent_ec->parent)
519 EINA_LIST_FOREACH(_e_mod_split_screen_region_list, l, emssr)
521 res |= _e_mod_split_screen_manager_ec_relocate_to_region(parent_ec, emssr);
530 _e_mod_split_screen_manager_ec_relocate_to_region(E_Client *ec, E_Mod_Split_Screen_Region *emssr)
532 Eina_Stringshare *appid;
533 Eina_List *appid_list, *l;
534 Eina_Bool res = EINA_FALSE;
536 if (!ec || !emssr) return EINA_FALSE;
538 appid_list = e_mod_split_screen_region_appid_list_get(emssr);
540 EINA_LIST_FOREACH(appid_list, l, appid)
541 if (ec->netwm.pid == e_mod_appinfo_ext_find_pid_by_appid(appid))
543 Eina_Stringshare *region_name = e_mod_split_screen_region_name_get(emssr);
544 SSMINF("client(%p):%s rearrange to region:%s",
545 ec, ec, ec ? ec->icccm.name : "NULL", region_name);
546 res |= e_mod_split_screen_region_ec_assign(emssr, ec);
552 /* split screen initializer */
555 _e_mod_split_screen_manager_handler_init(void)
557 E_Desk_Area_Hook *eda_hook;
558 E_Zone_Hook *ez_hook;
560 E_LIST_HANDLER_APPEND(_e_mod_split_screen_manager_ec_event_handlers, E_EVENT_CLIENT_ADD, _e_mod_split_screen_manager_cb_ec_add, NULL);
561 E_LIST_HANDLER_APPEND(_e_mod_split_screen_manager_ec_event_handlers, E_EVENT_CLIENT_REMOVE, _e_mod_split_screen_manager_cb_ec_remove, NULL);
563 E_LIST_HOOK_APPEND(_e_mod_split_screen_manager_ec_hook_handlers, E_CLIENT_HOOK_EVAL_FETCH, _e_mod_split_screen_manager_cb_hook_eval_fetch, NULL);
565 eda_hook = e_desk_area_hook_add(E_DESK_AREA_HOOK_SET_APPID, _e_mod_split_screen_manager_cb_hook_assign_appid, NULL);
566 if (eda_hook) _e_mod_split_screen_manager_desk_area_hook_handlers = eina_list_append(_e_mod_split_screen_manager_desk_area_hook_handlers, eda_hook);
568 ez_hook = e_zone_hook_add(E_ZONE_HOOK_SPLISCREEN_ACTIVATE, _e_mod_split_screen_manager_cb_hook_activate, NULL);
569 if (ez_hook) _e_mod_split_screen_manager_zone_hook_handlers = eina_list_append(_e_mod_split_screen_manager_zone_hook_handlers, ez_hook);
571 ez_hook = e_zone_hook_add(E_ZONE_HOOK_SPLISCREEN_DEACTIVATE, _e_mod_split_screen_manager_cb_hook_deactivate, NULL);
572 if (ez_hook) _e_mod_split_screen_manager_zone_hook_handlers = eina_list_append(_e_mod_split_screen_manager_zone_hook_handlers, ez_hook);
574 if (!_e_mod_split_screen_manager_ec_event_handlers ||
575 !_e_mod_split_screen_manager_ec_hook_handlers ||
576 !_e_mod_split_screen_manager_desk_area_hook_handlers)
583 _e_mod_split_screen_manager_aux_hint_handler_init(void)
585 E_LIST_HOOK_APPEND(_e_mod_split_screen_manager_ec_hook_handlers, E_CLIENT_HOOK_AUX_HINT_CHANGE, _e_mod_split_screen_manager_cb_hook_aux_hint_change, NULL);
587 if (!_e_mod_split_screen_manager_ec_hook_handlers)
590 for (int i=0 ; i<E_MOD_SPLIT_SCREEN_MANAGER_HINT_MAX ; i++)
592 e_hints_aux_hint_supported_add(_e_mod_split_screen_manager_hint_handler[i].name);
599 _e_mod_split_screen_manager_handler_shutdown(void)
601 E_FREE_LIST(_e_mod_split_screen_manager_ec_event_handlers, ecore_event_handler_del);
602 E_FREE_LIST(_e_mod_split_screen_manager_desk_area_hook_handlers, e_desk_area_hook_del);
606 _e_mod_split_screen_manager_aux_hint_handler_shutdown(void)
608 E_FREE_LIST(_e_mod_split_screen_manager_ec_hook_handlers, e_client_hook_del);
610 for (int i=0 ; i<E_MOD_SPLIT_SCREEN_MANAGER_HINT_MAX ; i++)
612 e_hints_aux_hint_supported_del(_e_mod_split_screen_manager_hint_handler[i].name);
617 _e_mod_split_screen_manager_region_init(void)
620 E_Mod_Split_Screen_Region *emssr_sub1, *emssr_sub2, *emssr_above;
621 int desk_x, desk_y, desk_w, desk_h;
623 desk = e_desk_current_get(e_zone_current_get());
624 EINA_SAFETY_ON_NULL_RETURN_VAL(desk, EINA_FALSE);
626 desk_x = desk->geom.x;
627 desk_y = desk->geom.y;
628 desk_w = desk->geom.w;
629 desk_h = desk->geom.h;
631 emssr_sub1 = e_mod_split_screen_region_new("sub1", desk_x, desk_y, desk_w, desk_h / 2);
632 if (!emssr_sub1) return EINA_FALSE;
634 _e_mod_split_screen_region_list = eina_list_append(_e_mod_split_screen_region_list, emssr_sub1);
636 emssr_sub2 = e_mod_split_screen_region_new("sub2", desk_x, desk_y + desk_h / 2, desk_w, desk_h / 2);
637 if (!emssr_sub2) return EINA_FALSE;
639 _e_mod_split_screen_region_list = eina_list_append(_e_mod_split_screen_region_list, emssr_sub2);
641 emssr_above = e_mod_split_screen_region_new("above", desk_x, desk_y, desk_w, desk_h);
642 if (!emssr_above) return EINA_FALSE;
644 _e_mod_split_screen_region_list = eina_list_append(_e_mod_split_screen_region_list, emssr_above);
650 _e_mod_split_screen_manager_region_shutdown(void)
652 E_Mod_Split_Screen_Region *emssr;
654 if (!_e_mod_split_screen_region_list) return;
656 EINA_LIST_FREE(_e_mod_split_screen_region_list, emssr)
658 e_mod_split_screen_region_del(emssr);
663 e_mod_split_screen_manager_init(void)
667 SSMDBG("SPLIT_SCREEN_MANAGER module init", NULL);
669 e_zone_screen_splitscreen_enable(e_zone_current_get());
671 res = _e_mod_split_screen_manager_region_init();
672 EINA_SAFETY_ON_FALSE_GOTO(res, err);
674 res = _e_mod_split_screen_manager_handler_init();
675 EINA_SAFETY_ON_FALSE_GOTO(res, err);
677 res = _e_mod_split_screen_manager_aux_hint_handler_init();
678 EINA_SAFETY_ON_FALSE_GOTO(res, err);
683 SSMINF("FAILED TO module init!!!", NULL);
684 e_mod_split_screen_manager_shutdown();
690 e_mod_split_screen_manager_shutdown(void)
692 SSMDBG("SPLIT_SCREEN_MANAGER module shutdown", NULL);
693 _e_mod_split_screen_manager_aux_hint_handler_shutdown();
694 _e_mod_split_screen_manager_handler_shutdown();
695 _e_mod_split_screen_manager_region_shutdown();