[WM_ROT] support for rotating prediction window without virtual keyboard
[platform/core/uifw/e17.git] / src / bin / e_moveresize.c
1 #include "e.h"
2
3 static void _e_resize_begin(void *data, void *bd);
4 static void _e_resize_update(void *data, void *bd);
5 static void _e_resize_end(void *data, void *bd);
6 static void _e_resize_border_extents(E_Border *bd, int *w, int *h);
7 static void _e_move_begin(void *data, void *bd);
8 static void _e_move_update(void *data, void *bd);
9 static void _e_move_end(void *data, void *bd);
10 static void _e_move_resize_object_coords_set(int x, int y, int w, int h);
11
12 static E_Popup *_disp_pop = NULL;
13 static Evas_Object *_obj = NULL;
14 static Eina_List *hooks = NULL;
15 static int visible = 0;
16 static int obj_x = 0;
17 static int obj_y = 0;
18 static int obj_w = 0;
19 static int obj_h = 0;
20
21 EINTERN int
22 e_moveresize_init(void)
23 {
24    E_Border_Hook *h;
25
26    h = e_border_hook_add(E_BORDER_HOOK_RESIZE_BEGIN, _e_resize_begin, NULL);
27    if (h) hooks = eina_list_append(hooks, h);
28    h = e_border_hook_add(E_BORDER_HOOK_RESIZE_UPDATE, _e_resize_update, NULL);
29    if (h) hooks = eina_list_append(hooks, h);
30    h = e_border_hook_add(E_BORDER_HOOK_RESIZE_END, _e_resize_end, NULL);
31    if (h) hooks = eina_list_append(hooks, h);
32    h = e_border_hook_add(E_BORDER_HOOK_MOVE_BEGIN, _e_move_begin, NULL);
33    if (h) hooks = eina_list_append(hooks, h);
34    h = e_border_hook_add(E_BORDER_HOOK_MOVE_UPDATE, _e_move_update, NULL);
35    if (h) hooks = eina_list_append(hooks, h);
36    h = e_border_hook_add(E_BORDER_HOOK_MOVE_END, _e_move_end, NULL);
37    if (h) hooks = eina_list_append(hooks, h);
38
39    return 1;
40 }
41
42 EINTERN int
43 e_moveresize_shutdown(void)
44 {
45    E_Border_Hook *h;
46
47    EINA_LIST_FREE(hooks, h)
48      e_border_hook_del(h);
49
50    return 1;
51 }
52
53 static void
54 _e_resize_begin(void *data __UNUSED__, void *border)
55 {
56    E_Border *bd = border;
57    Evas_Coord ew, eh;
58    char buf[40];
59    int w, h;
60
61    if (_disp_pop) e_object_del(E_OBJECT(_disp_pop));
62    _disp_pop = NULL;
63    _obj = NULL;
64
65    if (!e_config->resize_info_visible)
66      return;
67
68    if (e_config->resize_info_follows)
69      _e_move_resize_object_coords_set(bd->x + bd->fx.x, bd->y + bd->fx.y, bd->w, bd->h);
70    else
71      _e_move_resize_object_coords_set(bd->zone->x, bd->zone->y, bd->zone->w, bd->zone->h);
72
73    _e_resize_border_extents(bd, &w, &h);
74
75    _disp_pop = e_popup_new(bd->zone, 0, 0, 1, 1);
76    if (!_disp_pop) return;
77    e_popup_layer_set(_disp_pop, 255);
78    _obj = edje_object_add(_disp_pop->evas);
79    e_theme_edje_object_set(_obj, "base/theme/borders",
80                            "e/widgets/border/default/resize");
81    snprintf(buf, sizeof(buf), "9999x9999");
82    edje_object_part_text_set(_obj, "e.text.label", buf);
83
84    edje_object_size_min_calc(_obj, &ew, &eh);
85    evas_object_move(_obj, 0, 0);
86    evas_object_resize(_obj, ew, eh);
87    evas_object_show(_obj);
88    e_popup_edje_bg_object_set(_disp_pop, _obj);
89
90    if (!visible)
91      {
92         evas_object_show(_obj);
93         e_popup_show(_disp_pop);
94         visible = 1;
95      }
96    snprintf(buf, sizeof(buf), _("%i×%i"), w, h);
97    edje_object_part_text_set(_obj, "e.text.label", buf);
98
99    e_popup_move_resize(_disp_pop,
100                        (obj_x - _disp_pop->zone->x) +
101                        ((obj_w - ew) / 2),
102                        (obj_y - _disp_pop->zone->y) +
103                        ((obj_h - eh) / 2),
104                        ew, eh);
105
106    e_popup_show(_disp_pop);
107
108    visible = 1;
109 }
110
111 static void
112 _e_resize_end(void *data __UNUSED__, void *border __UNUSED__)
113 {
114    if (e_config->resize_info_visible)
115      {
116         if (_obj)
117           {
118              evas_object_del(_obj);
119              _obj = NULL;
120           }
121         if (_disp_pop)
122           {
123              e_object_del(E_OBJECT(_disp_pop));
124              _disp_pop = NULL;
125           }
126      }
127
128    visible = 0;
129 }
130
131 static void
132 _e_resize_update(void *data __UNUSED__, void *border)
133 {
134    E_Border *bd = border;
135    char buf[40];
136    int w, h;
137
138    if (!_disp_pop) return;
139
140    if (e_config->resize_info_follows)
141      _e_move_resize_object_coords_set(bd->x + bd->fx.x, bd->y + bd->fx.y, bd->w, bd->h);
142    else
143      _e_move_resize_object_coords_set(bd->zone->x, bd->zone->y, bd->zone->w, bd->zone->h);
144
145    _e_resize_border_extents(bd, &w, &h);
146
147    if (!visible)
148      {
149         evas_object_show(_obj);
150         e_popup_show(_disp_pop);
151         visible = 1;
152      }
153    snprintf(buf, sizeof(buf), _("%i×%i"), w, h);
154    edje_object_part_text_set(_obj, "e.text.label", buf);
155 }
156
157 static void
158 _e_resize_border_extents(E_Border *bd, int *w, int *h)
159 {
160    if ((bd->client.icccm.base_w >= 0) &&
161        (bd->client.icccm.base_h >= 0))
162      {
163         if (bd->client.icccm.step_w > 0)
164           *w = (bd->client.w - bd->client.icccm.base_w) / bd->client.icccm.step_w;
165         else
166           *w = bd->client.w;
167         if (bd->client.icccm.step_h > 0)
168           *h = (bd->client.h - bd->client.icccm.base_h) / bd->client.icccm.step_h;
169         else
170           *h = bd->client.h;
171      }
172    else
173      {
174         if (bd->client.icccm.step_w > 0)
175           *w = (bd->client.w - bd->client.icccm.min_w) / bd->client.icccm.step_w;
176         else
177           *w = bd->client.w;
178         if (bd->client.icccm.step_h > 0)
179           *h = (bd->client.h - bd->client.icccm.min_h) / bd->client.icccm.step_h;
180         else
181           *h = bd->client.h;
182      }
183 }
184
185 static void
186 _e_move_begin(void *data __UNUSED__, void *border)
187 {
188    E_Border *bd = border;
189    Evas_Coord ew, eh;
190    char buf[40];
191
192    if (_disp_pop) e_object_del(E_OBJECT(_disp_pop));
193    _disp_pop = NULL;
194    _obj = NULL;
195
196    if (!e_config->move_info_visible)
197      return;
198
199    if (e_config->move_info_follows)
200      _e_move_resize_object_coords_set(bd->x + bd->fx.x, bd->y + bd->fx.y, bd->w, bd->h);
201    else
202      _e_move_resize_object_coords_set(bd->zone->x, bd->zone->y, bd->zone->w, bd->zone->h);
203
204    _disp_pop = e_popup_new(bd->zone, 0, 0, 1, 1);
205    _obj = edje_object_add(_disp_pop->evas);
206    e_theme_edje_object_set(_obj, "base/theme/borders",
207                            "e/widgets/border/default/move");
208    snprintf(buf, sizeof(buf), "9999 9999");
209    edje_object_part_text_set(_obj, "e.text.label", buf);
210
211    edje_object_size_min_calc(_obj, &ew, &eh);
212    evas_object_move(_obj, 0, 0);
213    evas_object_resize(_obj, ew, eh);
214    evas_object_show(_obj);
215    e_popup_edje_bg_object_set(_disp_pop, _obj);
216
217    e_popup_move_resize(_disp_pop,
218                        (obj_x - _disp_pop->zone->x) +
219                        ((obj_w - ew) / 2),
220                        (obj_y - _disp_pop->zone->y) +
221                        ((obj_h - eh) / 2),
222                        ew, eh);
223 }
224
225 static void
226 _e_move_end(void *data __UNUSED__, void *border __UNUSED__)
227 {
228    if (e_config->move_info_visible)
229      {
230         if (_obj)
231           {
232              evas_object_del(_obj);
233              _obj = NULL;
234           }
235         if (_disp_pop)
236           {
237              e_object_del(E_OBJECT(_disp_pop));
238              _disp_pop = NULL;
239           }
240      }
241
242    visible = 0;
243 }
244
245 static void
246 _e_move_update(void *data __UNUSED__, void *border)
247 {
248    E_Border *bd = border;
249    char buf[40];
250
251    if (!_disp_pop) return;
252
253    if (e_config->move_info_follows)
254      _e_move_resize_object_coords_set(bd->x + bd->fx.x, bd->y + bd->fx.y, bd->w, bd->h);
255    else
256      _e_move_resize_object_coords_set(bd->zone->x, bd->zone->y, bd->zone->w, bd->zone->h);
257
258    if (!visible)
259      {
260         evas_object_show(_obj);
261         e_popup_show(_disp_pop);
262         visible = 1;
263      }
264    snprintf(buf, sizeof(buf), "%i %i", bd->x, bd->y);
265    edje_object_part_text_set(_obj, "e.text.label", buf);
266 }
267
268 static void
269 _e_move_resize_object_coords_set(int x, int y, int w, int h)
270 {
271    obj_x = x;
272    obj_y = y;
273    obj_w = w;
274    obj_h = h;
275    if ((_disp_pop) && (e_config->move_info_visible) && (visible))
276      {
277         e_popup_move(_disp_pop,
278                      (obj_x - _disp_pop->zone->x) +
279                      ((obj_w - _disp_pop->w) / 2),
280                      (obj_y - _disp_pop->zone->y) +
281                      ((obj_h - _disp_pop->h) / 2)
282                      );
283      }
284 }
285