[WM_ROT] support for rotating prediction window without virtual keyboard
[platform/core/uifw/e17.git] / src / bin / e_int_border_prop.c
1 #include "e.h"
2
3 #define MODE_NOTHING        0
4 #define MODE_GEOMETRY       1
5 #define MODE_LOCKS          2
6 #define MODE_GEOMETRY_LOCKS 3
7 #define MODE_ALL            4
8
9 static void         _bd_cb_dialog_del(void *obj);
10 static void         _bd_cb_dialog_close(void *data, E_Dialog *dia);
11 static Evas_Object *_bd_icccm_create(E_Dialog *dia, void *data);
12 static Evas_Object *_bd_netwm_create(E_Dialog *dia, void *data);
13 static void         _bd_go(void *data, void *data2);
14 static void         _create_data(E_Dialog *cfd, E_Border *bd);
15 static void         _free_data(E_Dialog *cfd, E_Config_Dialog_Data *cfdata);
16
17 struct _E_Config_Dialog_Data
18 {
19    E_Border *border;
20    /*- BASIC -*/
21    struct
22    {
23       char *title;
24       char *name;
25       char *class;
26       char *icon_name;
27       char *machine;
28       char *role;
29
30       char *min;
31       char *max;
32       char *base;
33       char *step;
34
35       char *aspect;
36       char *initial_state;
37       char *state;
38       char *window_id;
39       char *window_group;
40       char *transient_for;
41       char *client_leader;
42       char *gravity;
43       char *command;
44
45       int   take_focus;
46       int   accepts_focus;
47       int   urgent;
48       int   delete_request;
49       int   request_pos;
50    } icccm;
51
52    struct
53    {
54       char *name;
55       char *icon_name;
56       int   modal;
57       int   sticky;
58       int   shaded;
59       int   skip_taskbar;
60       int   skip_pager;
61       int   hidden;
62       int   fullscreen;
63       char *stacking;
64    } netwm;
65 };
66
67 EAPI void
68 e_int_border_prop(E_Border *bd)
69 {
70    E_Dialog *dia;
71
72    if (bd->border_prop_dialog) return;
73
74    dia = e_dialog_new(bd->zone->container, "E", "_window_props");
75    e_object_del_attach_func_set(E_OBJECT(dia), _bd_cb_dialog_del);
76
77    _create_data(dia, bd);
78
79    _bd_go(dia, (void *)0);
80
81    e_dialog_button_add(dia, _("Close"), NULL, _bd_cb_dialog_close, dia);
82    e_win_centered_set(dia->win, 1);
83    e_dialog_show(dia);
84    e_dialog_border_icon_set(dia, "preferences-system-windows");
85    e_dialog_resizable_set(dia, 1);
86 }
87
88 static void
89 _create_data(E_Dialog *cfd, E_Border *bd)
90 {
91    E_Config_Dialog_Data *cfdata;
92    char buf[4096];
93
94    cfdata = E_NEW(E_Config_Dialog_Data, 1);
95    cfdata->border = bd;
96    bd->border_prop_dialog = cfd;
97
98 #define IFDUP(prop, dest)   \
99   if (cfdata->border->prop) \
100     cfdata->dest = strdup(cfdata->border->prop)
101
102    IFDUP(client.icccm.title, icccm.title);
103    IFDUP(client.icccm.name, icccm.name);
104    IFDUP(client.icccm.class, icccm.class);
105    IFDUP(client.icccm.icon_name, icccm.icon_name);
106    IFDUP(client.icccm.machine, icccm.machine);
107    IFDUP(client.icccm.window_role, icccm.role);
108
109    if (cfdata->border->client.icccm.min_w >= 0)
110      {
111         snprintf(buf, sizeof(buf), _("%i×%i"),
112                  cfdata->border->client.icccm.min_w,
113                  cfdata->border->client.icccm.min_h);
114         cfdata->icccm.min = strdup(buf);
115      }
116    if (cfdata->border->client.icccm.max_w >= 0)
117      {
118         snprintf(buf, sizeof(buf), _("%i×%i"),
119                  cfdata->border->client.icccm.max_w,
120                  cfdata->border->client.icccm.max_h);
121         cfdata->icccm.max = strdup(buf);
122      }
123    if (cfdata->border->client.icccm.base_w >= 0)
124      {
125         snprintf(buf, sizeof(buf), _("%i×%i"),
126                  cfdata->border->client.icccm.base_w,
127                  cfdata->border->client.icccm.base_h);
128         cfdata->icccm.base = strdup(buf);
129      }
130    if (cfdata->border->client.icccm.step_w >= 0)
131      {
132         snprintf(buf, sizeof(buf), _("%i,%i"),
133                  cfdata->border->client.icccm.step_w,
134                  cfdata->border->client.icccm.step_h);
135         cfdata->icccm.step = strdup(buf);
136      }
137    if ((cfdata->border->client.icccm.min_aspect > 0.0) &&
138        (cfdata->border->client.icccm.max_aspect > 0.0))
139      {
140         if (cfdata->border->client.icccm.min_aspect == cfdata->border->client.icccm.max_aspect)
141           snprintf(buf, sizeof(buf), _("%1.3f"),
142                    cfdata->border->client.icccm.min_aspect);
143         else
144           snprintf(buf, sizeof(buf), _("%1.3f–%1.3f"),
145                    cfdata->border->client.icccm.min_aspect,
146                    cfdata->border->client.icccm.max_aspect);
147         cfdata->icccm.aspect = strdup(buf);
148      }
149    if (cfdata->border->client.icccm.initial_state != ECORE_X_WINDOW_STATE_HINT_NONE)
150      {
151         switch (cfdata->border->client.icccm.initial_state)
152           {
153            case ECORE_X_WINDOW_STATE_HINT_WITHDRAWN:
154              snprintf(buf, sizeof(buf), _("Withdrawn"));
155              break;
156
157            case ECORE_X_WINDOW_STATE_HINT_NORMAL:
158              snprintf(buf, sizeof(buf), _("Normal"));
159              break;
160
161            case ECORE_X_WINDOW_STATE_HINT_ICONIC:
162              snprintf(buf, sizeof(buf), _("Iconic"));
163              break;
164
165            default:
166              buf[0] = 0;
167              break;
168           }
169         cfdata->icccm.initial_state = strdup(buf);
170      }
171    if (cfdata->border->client.icccm.state != ECORE_X_WINDOW_STATE_HINT_NONE)
172      {
173         switch (cfdata->border->client.icccm.state)
174           {
175            case ECORE_X_WINDOW_STATE_HINT_WITHDRAWN:
176              snprintf(buf, sizeof(buf), _("Withdrawn"));
177              break;
178
179            case ECORE_X_WINDOW_STATE_HINT_NORMAL:
180              snprintf(buf, sizeof(buf), _("Normal"));
181              break;
182
183            case ECORE_X_WINDOW_STATE_HINT_ICONIC:
184              snprintf(buf, sizeof(buf), _("Iconic"));
185              break;
186
187            default:
188              buf[0] = 0;
189              break;
190           }
191         cfdata->icccm.state = strdup(buf);
192      }
193    snprintf(buf, sizeof(buf), "0x%08x",
194             cfdata->border->client.win);
195    cfdata->icccm.window_id = strdup(buf);
196    if (cfdata->border->client.icccm.window_group != 0)
197      {
198         snprintf(buf, sizeof(buf), "0x%08x",
199                  cfdata->border->client.icccm.window_group);
200         cfdata->icccm.window_group = strdup(buf);
201      }
202    if (cfdata->border->client.icccm.transient_for != 0)
203      {
204         snprintf(buf, sizeof(buf), "0x%08x",
205                  cfdata->border->client.icccm.transient_for);
206         cfdata->icccm.transient_for = strdup(buf);
207      }
208    if (cfdata->border->client.icccm.client_leader != 0)
209      {
210         snprintf(buf, sizeof(buf), "0x%08x",
211                  cfdata->border->client.icccm.client_leader);
212         cfdata->icccm.client_leader = strdup(buf);
213      }
214    switch (cfdata->border->client.icccm.gravity)
215      {
216       case ECORE_X_GRAVITY_FORGET:
217         snprintf(buf, sizeof(buf), _("Forget/Unmap"));
218         break;
219
220       case ECORE_X_GRAVITY_NW:
221         snprintf(buf, sizeof(buf), _("Northwest"));
222         break;
223
224       case ECORE_X_GRAVITY_N:
225         snprintf(buf, sizeof(buf), _("North"));
226         break;
227
228       case ECORE_X_GRAVITY_NE:
229         snprintf(buf, sizeof(buf), _("Northeast"));
230         break;
231
232       case ECORE_X_GRAVITY_W:
233         snprintf(buf, sizeof(buf), _("West"));
234         break;
235
236       case ECORE_X_GRAVITY_CENTER:
237         snprintf(buf, sizeof(buf), _("Center"));
238         break;
239
240       case ECORE_X_GRAVITY_E:
241         snprintf(buf, sizeof(buf), _("East"));
242         break;
243
244       case ECORE_X_GRAVITY_SW:
245         snprintf(buf, sizeof(buf), _("Southwest"));
246         break;
247
248       case ECORE_X_GRAVITY_S:
249         snprintf(buf, sizeof(buf), _("South"));
250         break;
251
252       case ECORE_X_GRAVITY_SE:
253         snprintf(buf, sizeof(buf), _("Southeast"));
254         break;
255
256       case ECORE_X_GRAVITY_STATIC:
257         snprintf(buf, sizeof(buf), _("Static"));
258         break;
259
260       default:
261         buf[0] = 0;
262         break;
263      }
264    cfdata->icccm.gravity = strdup(buf);
265    if (cfdata->border->client.icccm.command.argv)
266      {
267         int i;
268
269         buf[0] = 0;
270         for (i = 0; i < cfdata->border->client.icccm.command.argc; i++)
271           {
272              if ((sizeof(buf) - strlen(buf)) <
273                  (strlen(cfdata->border->client.icccm.command.argv[i]) - 2))
274                break;
275              strcat(buf, cfdata->border->client.icccm.command.argv[i]);
276              strcat(buf, " ");
277           }
278         cfdata->icccm.command = strdup(buf);
279      }
280
281    cfdata->icccm.take_focus = cfdata->border->client.icccm.take_focus;
282    cfdata->icccm.accepts_focus = cfdata->border->client.icccm.accepts_focus;
283    cfdata->icccm.urgent = cfdata->border->client.icccm.urgent;
284    cfdata->icccm.delete_request = cfdata->border->client.icccm.delete_request;
285    cfdata->icccm.request_pos = cfdata->border->client.icccm.request_pos;
286
287    IFDUP(client.netwm.name, netwm.name);
288    IFDUP(client.netwm.icon_name, netwm.icon_name);
289    cfdata->netwm.modal = cfdata->border->client.netwm.state.modal;
290    cfdata->netwm.sticky = cfdata->border->client.netwm.state.sticky;
291    cfdata->netwm.shaded = cfdata->border->client.netwm.state.shaded;
292    cfdata->netwm.skip_taskbar = cfdata->border->client.netwm.state.skip_taskbar;
293    cfdata->netwm.skip_pager = cfdata->border->client.netwm.state.skip_pager;
294    cfdata->netwm.hidden = cfdata->border->client.netwm.state.hidden;
295    cfdata->netwm.fullscreen = cfdata->border->client.netwm.state.fullscreen;
296    switch (cfdata->border->client.netwm.state.stacking)
297      {
298       case 0:
299         cfdata->netwm.stacking = strdup(_("None"));
300         break;
301
302       case 1:
303         cfdata->netwm.stacking = strdup(_("Above"));
304         break;
305
306       case 2:
307         cfdata->netwm.stacking = strdup(_("Below"));
308         break;
309      }
310
311    cfd->data = cfdata;
312 }
313
314 static void
315 _free_data(E_Dialog *cfd, E_Config_Dialog_Data *cfdata)
316 {
317    if (cfdata->border)
318      cfdata->border->border_prop_dialog = NULL;
319
320    /* Free the cfdata */
321 #define IFREE(x) E_FREE(cfdata->x)
322    IFREE(icccm.title);
323    IFREE(icccm.name);
324    IFREE(icccm.class);
325    IFREE(icccm.icon_name);
326    IFREE(icccm.machine);
327    IFREE(icccm.role);
328    IFREE(icccm.min);
329    IFREE(icccm.max);
330    IFREE(icccm.base);
331    IFREE(icccm.step);
332    IFREE(icccm.aspect);
333    IFREE(icccm.initial_state);
334    IFREE(icccm.state);
335    IFREE(icccm.window_id);
336    IFREE(icccm.window_group);
337    IFREE(icccm.transient_for);
338    IFREE(icccm.client_leader);
339    IFREE(icccm.gravity);
340    IFREE(icccm.command);
341
342    IFREE(netwm.name);
343    IFREE(netwm.icon_name);
344    IFREE(netwm.stacking);
345
346    free(cfdata);
347    cfd->data = NULL;
348 }
349
350 static void
351 _bd_cb_dialog_del(void *obj)
352 {
353    E_Dialog *dia;
354
355    dia = obj;
356    if (dia->data)
357      _free_data(dia, dia->data);
358 }
359
360 static void
361 _bd_cb_dialog_close(void *data __UNUSED__, E_Dialog *dia)
362 {
363    if (dia->data)
364      _free_data(dia, dia->data);
365    e_object_del(E_OBJECT(dia));
366 }
367
368 static void
369 _bd_go(void *data, void *data2)
370 {
371    E_Dialog *dia;
372    Evas_Object *c, *o, *ob;
373    Evas_Coord w, h;
374
375    dia = data;
376    if (!dia) return;
377
378    if (dia->content_object)
379      evas_object_del(dia->content_object);
380
381    c = e_widget_list_add(e_win_evas_get(dia->win), 0, 0);
382
383    if (!data2)
384      {
385         o = _bd_icccm_create(dia, NULL);
386         e_dialog_title_set(dia, _("ICCCM Properties"));
387         e_widget_list_object_append(c, o, 1, 1, 0.0);
388         ob = e_widget_button_add(e_win_evas_get(dia->win), _("NetWM"), "go-next",
389                                  _bd_go, dia, (void *)1);
390      }
391    else
392      {
393         o = _bd_netwm_create(dia, NULL);
394         e_dialog_title_set(dia, _("NetWM Properties"));
395         e_widget_list_object_append(c, o, 1, 1, 0.0);
396         ob = e_widget_button_add(e_win_evas_get(dia->win), _("ICCCM"), "go-next",
397                                  _bd_go, dia, (void *)0);
398      }
399
400    e_widget_list_object_append(c, ob, 0, 0, 1.0);
401
402    e_widget_size_min_get(c, &w, &h);
403    e_dialog_content_set(dia, c, w, h);
404    e_dialog_show(dia);
405 }
406
407 #define STR_ENTRY(label, x, y, val)                                         \
408   {                                                                         \
409      Evas_Coord mw, mh;                                                     \
410      ob = e_widget_label_add(evas, label);                                  \
411      if (!cfdata->val) e_widget_disabled_set(ob, 1);                        \
412      e_widget_table_object_append(o, ob, x, y, 1, 1, 1, 1, 0, 1);     \
413      ob = e_widget_entry_add(evas, & (cfdata->val), NULL, NULL, NULL);      \
414      if (!cfdata->val) e_widget_disabled_set(ob, 1);                        \
415      e_widget_entry_readonly_set(ob, 1);                                    \
416      e_widget_disabled_set(ob, 1);                                          \
417      e_widget_size_min_get(ob, &mw, &mh);                                   \
418      e_widget_size_min_set(ob, 160, mh);                                    \
419      e_widget_table_object_append(o, ob, x + 1, y, 1, 1, 1, 1, 1, 1); \
420   }
421 #define CHK_ENTRY(label, x, y, val)                                         \
422   {                                                                         \
423      ob = e_widget_label_add(evas, label);                                  \
424      e_widget_table_object_append(o, ob, x, y, 1, 1, 1, 1, 0, 1);     \
425      ob = e_widget_check_add(evas, "", & (cfdata->val));                    \
426      e_widget_disabled_set(ob, 1);                                          \
427      e_widget_table_object_append(o, ob, x + 1, y, 1, 1, 1, 1, 1, 1); \
428   }
429
430 static Evas_Object *
431 _bd_icccm_create(E_Dialog *dia, void *data __UNUSED__)
432 {
433    Evas *evas;
434    Evas_Object *o, *ob, *otb;
435    E_Config_Dialog_Data *cfdata;
436
437    if (!dia) return NULL;
438    cfdata = dia->data;
439
440    if (dia->content_object)
441      evas_object_del(dia->content_object);
442
443    evas = e_win_evas_get(dia->win);
444    otb = e_widget_toolbook_add(evas, 48 * e_scale, 48 * e_scale);
445
446    o = e_widget_table_add(evas, 0);
447    STR_ENTRY(_("Title"), 0, 0, icccm.title);
448    STR_ENTRY(_("Name"), 0, 1, icccm.name);
449    STR_ENTRY(_("Class"), 0, 2, icccm.class);
450    STR_ENTRY(_("Icon Name"), 0, 3, icccm.icon_name);
451    STR_ENTRY(_("Machine"), 0, 4, icccm.machine);
452    STR_ENTRY(_("Role"), 0, 5, icccm.role);
453    e_widget_toolbook_page_append(otb, NULL, _("General"), o, 1, 1, 1, 1, 0.5, 0.0);
454
455    o = e_widget_table_add(evas, 0);
456    STR_ENTRY(_("Minimum Size"), 0, 6, icccm.min);
457    STR_ENTRY(_("Maximum Size"), 0, 7, icccm.max);
458    STR_ENTRY(_("Base Size"), 0, 8, icccm.base);
459    STR_ENTRY(_("Resize Steps"), 0, 9, icccm.step);
460    e_widget_toolbook_page_append(otb, NULL, _("Sizing"), o, 1, 1, 1, 1, 0.5, 0.0);
461
462    o = e_widget_table_add(evas, 0);
463    STR_ENTRY(_("Aspect Ratio"), 2, 0, icccm.aspect);
464    STR_ENTRY(_("Initial State"), 2, 1, icccm.initial_state);
465    STR_ENTRY(_("State"), 2, 2, icccm.state);
466    STR_ENTRY(_("Window ID"), 2, 3, icccm.window_id);
467    STR_ENTRY(_("Window Group"), 2, 4, icccm.window_group);
468    STR_ENTRY(_("Transient For"), 2, 5, icccm.transient_for);
469    STR_ENTRY(_("Client Leader"), 2, 6, icccm.client_leader);
470    STR_ENTRY(_("Gravity"), 2, 7, icccm.gravity);
471    STR_ENTRY(_("Command"), 2, 8, icccm.command);
472    e_widget_toolbook_page_append(otb, NULL, _("States"), o, 1, 1, 1, 1, 0.5, 0.0);
473
474    o = e_widget_table_add(evas, 0);
475    CHK_ENTRY(_("Take Focus"), 0, 11, icccm.take_focus);
476    CHK_ENTRY(_("Accepts Focus"), 0, 12, icccm.accepts_focus);
477    CHK_ENTRY(_("Urgent"), 0, 13, icccm.urgent);
478    CHK_ENTRY(_("Request Delete"), 2, 11, icccm.delete_request);
479    CHK_ENTRY(_("Request Position"), 2, 12, icccm.request_pos);
480    e_widget_toolbook_page_append(otb, NULL, _("Settings"), o, 1, 1, 1, 1, 0.5, 0.0);
481    e_widget_toolbook_page_show(otb, 0);
482
483    return otb;
484 }
485
486 static Evas_Object *
487 _bd_netwm_create(E_Dialog *dia, void *data __UNUSED__)
488 {
489    Evas *evas;
490    Evas_Object *o, *ob, *otb;
491    E_Config_Dialog_Data *cfdata;
492
493    if (!dia) return NULL;
494    cfdata = dia->data;
495
496    if (dia->content_object)
497      evas_object_del(dia->content_object);
498
499    evas = e_win_evas_get(dia->win);
500    otb = e_widget_toolbook_add(evas, 48 * e_scale, 48 * e_scale);
501    o = e_widget_table_add(evas, 0);
502    STR_ENTRY(_("Name"), 0, 1, netwm.name);
503    STR_ENTRY(_("Icon Name"), 0, 2, netwm.icon_name);
504    STR_ENTRY(_("Stacking"), 0, 3, netwm.stacking);
505    e_widget_toolbook_page_append(otb, NULL, _("General"), o, 1, 1, 1, 1, 0.5, 0.0);
506
507    o = e_widget_table_add(evas, 0);
508    CHK_ENTRY(_("Modal"), 0, 4, netwm.modal);
509    CHK_ENTRY(_("Sticky"), 0, 5, netwm.sticky);
510    CHK_ENTRY(_("Shaded"), 0, 6, netwm.shaded);
511    CHK_ENTRY(_("Skip Taskbar"), 0, 7, netwm.skip_taskbar);
512    CHK_ENTRY(_("Skip Pager"), 0, 8, netwm.skip_pager);
513    CHK_ENTRY(_("Hidden"), 0, 9, netwm.hidden);
514    CHK_ENTRY(_("Fullscreen"), 0, 10, netwm.fullscreen);
515    e_widget_toolbook_page_append(otb, NULL, _("Settings"), o, 1, 1, 1, 1, 0.5, 0.0);
516    e_widget_toolbook_page_show(otb, 0);
517
518    return otb;
519 }
520