1dd151d4ebf55aba903f5358ab1de72ce893045c
[platform/core/uifw/e-mod-tizen-wm-policy.git] / src / splitscreen / e_mod_split_screen_region.c
1 #include "e.h"
2 #include "e_mod_split_screen_manager_log.h"
3 #include "e_mod_split_screen_region.h"
4 #include "e_mod_appinfo_ext.h"
5
6 struct _E_Mod_Split_Screen_Region
7 {
8    E_Zone *zone;
9    E_Desk *desk;
10    E_Desk_Area *eda;
11    Eina_Stringshare *name;
12    Eina_Bool is_del;
13    Eina_List *appid_list;
14    Eina_List *client_list;
15 };
16
17 /* e_mod_split_screen_region internal functions */
18 static E_Mod_Split_Screen_Region * _e_mod_split_screen_region_new(const char *name, int x, int y, int w, int h);
19 static void          _e_mod_split_screen_region_del(E_Mod_Split_Screen_Region *emssr);
20 static void          _e_mod_split_screen_region_appid_assign(E_Mod_Split_Screen_Region *emssr, const char *appid);
21 static void          _e_mod_split_screen_region_appid_dismiss(E_Mod_Split_Screen_Region *emssr, const char *appid);
22 static Eina_Bool     _e_mod_split_screen_region_ec_assign(E_Mod_Split_Screen_Region *emssr, E_Client *ec);
23 static Eina_Bool     _e_mod_split_screen_region_ec_dismiss(E_Client *ec);
24
25
26 /* internal functions */
27 static E_Mod_Split_Screen_Region *
28 _e_mod_split_screen_region_new(const char *name, int x, int y, int w, int h)
29 {
30    E_Desk *desk;
31    E_Mod_Split_Screen_Region *emssr = NULL;
32    E_Desk_Area *eda = NULL;
33
34    emssr = E_NEW(E_Mod_Split_Screen_Region, 1);
35    if (!emssr) return NULL;
36
37    emssr->zone = e_zone_current_get();
38
39    desk = e_desk_current_get(emssr->zone);
40    EINA_SAFETY_ON_NULL_GOTO(desk, err);
41
42    emssr->desk = desk;
43    emssr->name = eina_stringshare_add(name);
44
45    eda = e_desk_desk_area_add(desk, x, y, w, h, E_DESK_AREA_LAYER_NORMAL);
46    EINA_SAFETY_ON_NULL_GOTO(eda, err);
47
48    e_desk_area_transform_enable_set(eda, EINA_FALSE);
49    eda->name = eina_stringshare_add(name);
50    emssr->eda = eda;
51
52    SSMINF("region added, desk_area:%p, name:%s, id:%d", NULL, emssr->eda, emssr->name, emssr->eda->id);
53
54    return emssr;
55
56 err:
57    if (emssr) E_FREE(emssr);
58    if (eda) E_FREE(eda);
59    return NULL;
60 }
61
62 static void
63 _e_mod_split_screen_region_del(E_Mod_Split_Screen_Region *emssr)
64 {
65    emssr->is_del = EINA_TRUE;
66    e_desk_desk_area_disable(emssr->desk);
67    E_FREE(emssr);
68 }
69
70 static void
71 _e_mod_split_screen_region_appid_assign(E_Mod_Split_Screen_Region *emssr, const char *appid)
72 {
73    emssr->appid_list = eina_list_append(emssr->appid_list, appid);
74 }
75
76 static void
77 _e_mod_split_screen_region_appid_dismiss(E_Mod_Split_Screen_Region *emssr, const char *appid)
78 {
79    Eina_Stringshare *appid2;
80    Eina_List *l, *ll;
81
82    EINA_LIST_FOREACH_SAFE(emssr->appid_list, l, ll, appid2)
83      {
84         if (!e_util_strcmp(appid, appid2))
85           {
86              emssr->appid_list = eina_list_remove_list(emssr->appid_list, ll);
87           }
88      }
89 }
90
91 static Eina_Bool
92 _e_mod_split_screen_region_ec_assign(E_Mod_Split_Screen_Region *emssr, E_Client *ec)
93 {
94    E_Client *child_ec;
95    Eina_List *l;
96
97    SSMDBG("set to region: %s", ec, emssr->name);
98
99    if (ec->lock_client_size)
100      {
101         ec->maximized = E_MAXIMIZE_NONE;
102         e_client_maximize(ec, E_MAXIMIZE_EXPAND | E_MAXIMIZE_BOTH);
103      }
104
105    e_client_desk_area_set(ec, emssr->eda);
106
107    // control transient for childs
108    EINA_LIST_FOREACH(ec->transients, l, child_ec)
109      {
110         _e_mod_split_screen_region_ec_assign(emssr, child_ec);
111      }
112    return EINA_TRUE;
113 }
114
115 static Eina_Bool
116 _e_mod_split_screen_region_ec_dismiss(E_Client *ec)
117 {
118    E_Client *child_ec;
119    Eina_List *l;
120
121    SSMINF("unset ec from regions", ec);
122
123    if (ec->lock_client_size)
124      {
125         ec->maximized = E_MAXIMIZE_NONE;
126         e_client_maximize(ec, E_MAXIMIZE_EXPAND | E_MAXIMIZE_BOTH);
127      }
128
129    e_client_desk_area_set(ec, NULL);
130
131    // control transient for childs
132    EINA_LIST_FOREACH(ec->transients, l, child_ec)
133      {
134         _e_mod_split_screen_region_ec_dismiss(child_ec);
135      }
136
137    return EINA_TRUE;
138 }
139
140 /* Internal APIs */
141 EINTERN E_Mod_Split_Screen_Region *
142 e_mod_split_screen_region_new(const char *name, int x, int y, int w, int h)
143 {
144    EINA_SAFETY_ON_NULL_RETURN_VAL(name, NULL);
145
146    return _e_mod_split_screen_region_new(name, x, y, w, h);
147 }
148
149 EINTERN void
150 e_mod_split_screen_region_del(E_Mod_Split_Screen_Region *emssr)
151 {
152    EINA_SAFETY_ON_NULL_RETURN(emssr);
153    _e_mod_split_screen_region_del(emssr);
154 }
155
156 EINTERN const char *
157 e_mod_split_screen_region_name_get(E_Mod_Split_Screen_Region *emssr)
158 {
159    EINA_SAFETY_ON_NULL_RETURN_VAL(emssr, NULL);
160    return emssr->name;
161 }
162
163 EINTERN E_Desk *
164 e_mod_split_screen_region_desk_get(E_Mod_Split_Screen_Region *emssr)
165 {
166    EINA_SAFETY_ON_NULL_RETURN_VAL(emssr, NULL);
167    return emssr->desk;
168 }
169
170 EINTERN E_Desk_Area *
171 e_mod_split_screen_region_desk_area_get(E_Mod_Split_Screen_Region *emssr)
172 {
173    EINA_SAFETY_ON_NULL_RETURN_VAL(emssr, NULL);
174    return emssr->eda;
175 }
176
177 EINTERN void
178 e_mod_split_screen_region_appid_assign(E_Mod_Split_Screen_Region *emssr, const char *appid)
179 {
180    EINA_SAFETY_ON_NULL_RETURN(emssr);
181    EINA_SAFETY_ON_NULL_RETURN(appid);
182
183    _e_mod_split_screen_region_appid_dismiss(emssr, appid);
184    _e_mod_split_screen_region_appid_assign(emssr, appid);
185 }
186
187 EINTERN void
188 e_mod_split_screen_region_appid_dismiss(E_Mod_Split_Screen_Region *emssr, const char *appid)
189 {
190    EINA_SAFETY_ON_NULL_RETURN(emssr);
191    EINA_SAFETY_ON_NULL_RETURN(appid);
192
193    _e_mod_split_screen_region_appid_dismiss(emssr, appid);
194 }
195
196 EINTERN Eina_List *
197 e_mod_split_screen_region_appid_list_get(E_Mod_Split_Screen_Region *emssr)
198 {
199    EINA_SAFETY_ON_NULL_RETURN_VAL(emssr, NULL);
200    return emssr->appid_list;
201 }
202
203 EINTERN Eina_Bool
204 e_mod_split_screen_region_ec_assign(E_Mod_Split_Screen_Region *emssr, E_Client *ec)
205 {
206    EINA_SAFETY_ON_NULL_RETURN_VAL(emssr, EINA_FALSE);
207    EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
208
209    return _e_mod_split_screen_region_ec_assign(emssr, ec);
210 }
211
212 EINTERN Eina_Bool
213 e_mod_split_screen_region_ec_dismiss(E_Client *ec)
214 {
215    EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
216
217    return _e_mod_split_screen_region_ec_dismiss(ec);
218 }