3 EAPI Ecore_X_Atom ATM__QTOPIA_SOFT_MENU = 0;
4 EAPI Ecore_X_Atom ATM__QTOPIA_SOFT_MENUS = 0;
5 EAPI Ecore_X_Atom ATM_GNOME_SM_PROXY = 0;
6 EAPI Ecore_X_Atom ATM_ENLIGHTENMENT_COMMS = 0;
7 EAPI Ecore_X_Atom ATM_ENLIGHTENMENT_VERSION = 0;
8 EAPI Ecore_X_Atom ATM_ENLIGHTENMENT_SCALE = 0;
13 Ecore_X_Window *roots = NULL;
15 const char *atom_names[] = {
19 "ENLIGHTENMENT_COMMS",
20 "ENLIGHTENMENT_VERSION",
23 Ecore_X_Atom atoms[6];
25 ecore_x_atoms_get(atom_names, 6, atoms);
26 ATM__QTOPIA_SOFT_MENU = atoms[0];
27 ATM__QTOPIA_SOFT_MENUS = atoms[1];
28 ATM_GNOME_SM_PROXY = atoms[2];
29 ATM_ENLIGHTENMENT_COMMS = atoms[3];
30 ATM_ENLIGHTENMENT_VERSION = atoms[4];
31 ATM_ENLIGHTENMENT_SCALE = atoms[5];
33 roots = ecore_x_window_root_list(&num);
36 Ecore_X_Atom supported[43];
40 /* Set what hints we support */
41 /* Root Window Properties (and Related Messages) */
42 supported[supported_num++] = ECORE_X_ATOM_NET_CLIENT_LIST;
43 supported[supported_num++] = ECORE_X_ATOM_NET_CLIENT_LIST_STACKING;
44 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS, 1);*/
45 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_DESKTOP_GEOMETRY, 1);*/
46 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_DESKTOP_VIEWPORT, 1);*/
47 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_CURRENT_DESKTOP, 1);*/
48 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_DESKTOP_NAMES, 1);*/
49 supported[supported_num++] = ECORE_X_ATOM_NET_ACTIVE_WINDOW;
50 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_WORKAREA, 1);*/
51 supported[supported_num++] = ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK;
52 supported[supported_num++] = ECORE_X_ATOM_NET_VIRTUAL_ROOTS;
53 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_DESKTOP_LAYOUT, 1);*/
54 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_SHOWING_DESKTOP, 1);*/
56 /* Other Root Window Messages */
57 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_CLOSE_WINDOW, 1);*/
58 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_MOVERESIZE_WINDOW, 1);*/
59 supported[supported_num++] = ECORE_X_ATOM_NET_WM_MOVERESIZE;
60 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_RESTACK_WINDOW, 1);*/
61 supported[supported_num++] = ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS;
63 /* Application Window Properties */
64 supported[supported_num++] = ECORE_X_ATOM_NET_WM_NAME;
65 supported[supported_num++] = ECORE_X_ATOM_NET_WM_VISIBLE_NAME;
66 supported[supported_num++] = ECORE_X_ATOM_NET_WM_ICON_NAME;
67 supported[supported_num++] = ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME;
68 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_WM_DESKTOP, 1);*/
69 supported[supported_num++] = ECORE_X_ATOM_NET_WM_WINDOW_TYPE;
70 supported[supported_num++] = ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP;
71 supported[supported_num++] = ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK;
72 supported[supported_num++] = ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR;
73 supported[supported_num++] = ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU;
74 supported[supported_num++] = ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY;
75 supported[supported_num++] = ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH;
76 supported[supported_num++] = ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG;
77 supported[supported_num++] = ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL;
78 supported[supported_num++] = ECORE_X_ATOM_NET_WM_STATE;
79 supported[supported_num++] = ECORE_X_ATOM_NET_WM_STATE_MODAL;
80 supported[supported_num++] = ECORE_X_ATOM_NET_WM_STATE_STICKY;
81 supported[supported_num++] = ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT;
82 supported[supported_num++] = ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ;
83 supported[supported_num++] = ECORE_X_ATOM_NET_WM_STATE_SHADED;
84 supported[supported_num++] = ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR;
85 supported[supported_num++] = ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER;
86 supported[supported_num++] = ECORE_X_ATOM_NET_WM_STATE_HIDDEN;
87 supported[supported_num++] = ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN;
88 supported[supported_num++] = ECORE_X_ATOM_NET_WM_STATE_ABOVE;
89 supported[supported_num++] = ECORE_X_ATOM_NET_WM_STATE_BELOW;
90 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION, 1);*/
91 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS, 1);*/
92 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_WM_ACTION_MOVE, 1);*/
93 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_WM_ACTION_RESIZE, 1);*/
94 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE, 1);*/
95 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_WM_ACTION_SHADE, 1);*/
96 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_WM_ACTION_STICK, 1);*/
97 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ, 1);*/
98 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT, 1);*/
99 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN, 1);*/
100 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP, 1);*/
101 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_WM_ACTION_CLOSE, 1);*/
102 supported[supported_num++] = ECORE_X_ATOM_NET_WM_STRUT;
103 supported[supported_num++] = ECORE_X_ATOM_NET_WM_STRUT_PARTIAL;
104 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_WM_ICON_GEOMETRY, 1);*/
105 supported[supported_num++] = ECORE_X_ATOM_NET_WM_ICON;
106 supported[supported_num++] = ECORE_X_ATOM_NET_WM_PID;
107 /*ecore_x_netwm_supported(roots[supported_num], ECORE_X_ATOM_NET_WM_HANDLED_ICONS, 1);*/
108 supported[supported_num++] = ECORE_X_ATOM_NET_WM_USER_TIME;
109 supported[supported_num++] = ECORE_X_ATOM_NET_FRAME_EXTENTS;
110 supported[supported_num++] = ECORE_X_ATOM_NET_WM_PING;
111 supported[supported_num++] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
112 supported[supported_num++] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER;
113 supported[supported_num++] = ECORE_X_ATOM_E_VIDEO_PARENT;
114 supported[supported_num++] = ECORE_X_ATOM_E_VIDEO_POSITION;
116 for (i = 0; i < num; i++)
118 Ecore_X_Window win, twin;
123 /* check for previous netwm wm and wait for it to die */
124 ts = ecore_time_get();
125 nwins = ecore_x_window_prop_window_get(roots[i],
126 ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK,
132 nwins = ecore_x_window_prop_window_get(win,
133 ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK,
135 if (nwins < 1) break;
136 if (twin != win) break;
137 if (ecore_x_netwm_name_get(win, &name))
141 if (strcmp(name, "Enlightenment"))
150 if ((ecore_time_get() - ts) > 2.0)
152 e_error_message_show(_("A previous instance of Enlightenment is still active\n"
153 "on this screen. Aborting startup.\n"));
159 /* TODO: Remember this window and close it on shutdown */
160 win = ecore_x_window_new(roots[i], -200, -200, 5, 5);
162 * I don't FUCKING believe it. if we PRETEND we are Kwin - java is happy.
163 * why? it expects a double reparenting wm then. java insists on finding this
164 * out when it should be irrelevant! stupid code! I can't believe the time we
165 * just wasted hunting a bug that wasn't and that is due to sheer stupid
166 * coding (in java's awt layer that swing also uses).
168 /* Now for more stupidity... Openoffice.org will change its look and feel
169 * depending on what wm it thinks there is... so if we pretend to be Kwin...
170 * it tries to use kde preferences, if found.
172 /* I have disabled this now by pretending to be E16 with e16 comms. this
173 * means java plays nice and uses our FRAME property.. but we had to do other
174 * evil stuff as java EXPECTS all this at REPARENT time... i've deferred
175 * reparenting... i hate java!
177 /* ecore_x_netwm_wm_identify(roots[i], win, "KWin");*/
178 ecore_x_netwm_wm_identify(roots[i], win, "Enlightenment");
179 /* this makes openoffice.org read gtk settings so it doesn't look like shit */
180 e_hints_openoffice_gnome_fake(roots[i]);
182 ecore_x_netwm_supported_set(roots[i], supported, supported_num);
184 /* fake mwm, this might crash some ol' motif apps, if
185 they still exist, but at least it makes borderless
186 feature of Eterm and urxvt work... */
187 ecore_x_atom_get("_MOTIF_WM_INFO");
194 * This is here so we don't have to pretend to be Kwin anymore - we pretend
195 * to do old e16 style ipc. in fact we just ignore it... but set up the
199 e_hints_e16_comms_pretend(E_Manager *man)
204 win = ecore_x_window_input_new(man->root, -100, -100, 1, 1);
206 /* to help detect this is NOT e16 */
207 snprintf(buf, sizeof(buf), "Enlightenment %s", VERSION);
208 ecore_x_window_prop_property_set(win, ATM_ENLIGHTENMENT_VERSION, ECORE_X_ATOM_STRING, 8, buf, strlen(buf));
209 ecore_x_window_prop_property_set(man->root, ATM_ENLIGHTENMENT_VERSION, ECORE_X_ATOM_STRING, 8, buf, strlen(buf));
211 snprintf(buf, sizeof(buf), "WINID %8x", (int)win);
212 ecore_x_window_prop_property_set(win, ATM_ENLIGHTENMENT_COMMS, ECORE_X_ATOM_STRING, 8, buf, 14);
214 ecore_x_window_prop_property_set(man->root, ATM_ENLIGHTENMENT_COMMS, ECORE_X_ATOM_STRING, 8, buf, 14);
218 e_hints_manager_init(E_Manager *man)
220 /* Set desktop count, desktop names and workarea */
222 unsigned int *areas = NULL;
225 Ecore_X_Window *vroots = NULL;
226 /* FIXME: Desktop names not yet implemented */
229 e_hints_e16_comms_pretend(man);
231 num = eina_list_count(man->containers);
233 vroots = calloc(num, sizeof(Ecore_X_Window));
236 /* names = calloc(num, sizeof(char *));*/
238 areas = calloc(4 * num, sizeof(unsigned int));
245 EINA_LIST_FOREACH(man->containers, cl, c)
248 areas[4 * i + 1] = c->y;
249 areas[4 * i + 2] = c->w;
250 areas[4 * i + 3] = c->h;
251 vroots[i++] = c->win;
255 ecore_x_netwm_desk_count_set(man->root, num);
256 /* No need for workarea without desktops */
257 ecore_x_netwm_desk_workareas_set(man->root, num, areas);
264 /* FIXME, this should set the list in map order, not stack order */
266 e_hints_client_list_set(void)
268 Eina_List *ml = NULL, *cl = NULL;
269 unsigned int i = 0, num = 0;
274 Ecore_X_Window *clients = NULL;
276 /* Get client count by adding client lists on all containers */
277 EINA_LIST_FOREACH(e_manager_list(), ml, m)
279 EINA_LIST_FOREACH(m->containers, cl, c)
281 num += e_container_borders_count(c);
285 clients = calloc(num, sizeof(Ecore_X_Window));
289 /* Fetch window IDs and add to array */
292 EINA_LIST_FOREACH(e_manager_list(), ml, m)
295 EINA_LIST_FOREACH(m->containers, cl, c)
297 bl = e_container_border_list_first(c);
298 while ((b = e_container_border_list_next(bl)))
299 clients[i++] = b->client.win;
300 e_container_border_list_free(bl);
304 ecore_x_netwm_client_list_stacking_set(m->root, clients, i);
305 ecore_x_netwm_client_list_set(m->root, clients, i);
309 ecore_x_netwm_client_list_set(m->root, NULL, 0);
310 ecore_x_netwm_client_list_stacking_set(m->root, NULL, 0);
316 EINA_LIST_FOREACH(e_manager_list(), ml, m)
318 ecore_x_netwm_client_list_set(m->root, NULL, 0);
319 ecore_x_netwm_client_list_stacking_set(m->root, NULL, 0);
325 /* Client list is already in stacking order, so this function is nearly
326 * identical to the previous one */
328 e_hints_client_stacking_set(void)
330 Eina_List *ml = NULL, *cl = NULL;
331 unsigned int i = 0, num = 0;
336 Ecore_X_Window *clients = NULL;
338 /* Get client count */
339 EINA_LIST_FOREACH(e_manager_list(), ml, m)
341 EINA_LIST_FOREACH(m->containers, cl, c)
343 num += e_container_borders_count(c);
349 clients = calloc(num, sizeof(Ecore_X_Window));
350 if (!clients) return;
352 EINA_LIST_FOREACH(e_manager_list(), ml, m)
354 EINA_LIST_FOREACH(m->containers, cl, c)
356 bl = e_container_border_list_first(c);
357 while ((b = e_container_border_list_next(bl)))
361 e_error_message_show("e_hints.c: e_hints_client_stacking_set()\n"
363 "Window list size greater than window count.\n"
364 "This is really bad.\n"
365 "Please report this.\n");
368 clients[i++] = b->client.win;
370 e_container_border_list_free(bl);
375 e_error_message_show("e_hints.c: e_hints_client_stacking_set()\n"
377 "Window list size less than window count.\n"
378 "This is strange, but not harmful.\n"
379 "Please report this.\n");
381 EINA_LIST_FOREACH(e_manager_list(), ml, m)
383 ecore_x_netwm_client_list_stacking_set(m->root, clients, num);
389 EINA_LIST_FOREACH(e_manager_list(), ml, m)
391 ecore_x_netwm_client_list_stacking_set(m->root, NULL, 0);
397 e_hints_active_window_set(E_Manager *man,
402 ecore_x_netwm_client_active_set(man->root, bd->client.win);
404 ecore_x_netwm_client_active_set(man->root, 0);
408 e_hints_window_init(E_Border *bd)
410 E_Remember *rem = NULL;
415 if (bd->client.icccm.state == ECORE_X_WINDOW_STATE_HINT_NONE)
417 if (bd->client.netwm.state.hidden)
418 bd->client.icccm.state = ECORE_X_WINDOW_STATE_HINT_ICONIC;
420 bd->client.icccm.state = ECORE_X_WINDOW_STATE_HINT_NORMAL;
423 #ifdef _F_TRANSIENT_FOR_PATCH_
425 (!e_config->transient.layer))
427 if ((rem) && (rem->prop.layer))
429 bd->layer = rem->prop.layer;
430 e_border_layer_set(bd, bd->layer);
434 if (!bd->lock_client_stacking)
436 if (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_DESKTOP)
437 e_border_layer_set(bd, 0);
438 else if (bd->client.netwm.state.stacking == E_STACKING_BELOW)
439 e_border_layer_set(bd, 50);
440 else if (bd->client.netwm.state.stacking == E_STACKING_ABOVE)
441 e_border_layer_set(bd, 150);
442 else if (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_DOCK)
443 e_border_layer_set(bd, 150);
444 #ifdef _F_NOTIFICATION_LAYER_POLICY_
445 else if (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_NOTIFICATION)
446 e_border_layer_set(bd, 300);
449 e_border_layer_set(bd, 100);
456 if ((rem) && (rem->prop.layer))
458 bd->layer = rem->prop.layer;
459 e_border_layer_set(bd, bd->layer);
463 if (!bd->lock_client_stacking)
465 if (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_DESKTOP)
466 e_border_layer_set(bd, 0);
467 else if (bd->client.netwm.state.stacking == E_STACKING_BELOW)
468 e_border_layer_set(bd, 50);
469 else if (bd->client.netwm.state.stacking == E_STACKING_ABOVE)
470 e_border_layer_set(bd, 150);
471 else if (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_DOCK)
472 e_border_layer_set(bd, 150);
473 #ifdef _F_NOTIFICATION_LAYER_POLICY_
474 else if (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_NOTIFICATION)
475 e_border_layer_set(bd, 300);
478 e_border_layer_set(bd, 100);
484 if ((bd->parent) && (e_config->transient.layer))
485 e_border_layer_set(bd, bd->parent->layer);
489 /* Ignore this, E has incompatible desktop setup */
490 if (ecore_x_netwm_desktop_get(bd->client.win, &bd->client.netwm.desktop))
492 if (bd->client.netwm.desktop == 0xffffffff)
496 else if (bd->client.netwm.desktop < (bd->zone->desk_x_count * bd->zone->desk_y_count))
500 desk = e_desk_at_pos_get(bd->zone, bd->client.netwm.desktop);
502 e_border_desk_set(bd, desk);
506 /* Update netwm desktop with current desktop */
507 e_hints_window_desktop_set(bd);
512 /* Update netwm desktop with current desktop */
513 e_hints_window_desktop_set(bd);
517 if (bd->client.netwm.state.sticky)
519 if (!bd->lock_client_sticky)
522 e_hints_window_sticky_set(bd, 0);
524 if (bd->client.netwm.state.shaded)
526 if (!bd->lock_client_shade)
527 e_border_shade(bd, e_hints_window_shade_direction_get(bd));
529 e_hints_window_shaded_set(bd, 0);
531 if ((bd->client.netwm.state.maximized_v) && (bd->client.netwm.state.maximized_h))
533 if (!bd->lock_client_maximize)
535 e_hints_window_size_get(bd);
536 e_border_maximize(bd, e_config->maximize_policy);
539 e_hints_window_maximized_set(bd, 0, 0);
541 else if (bd->client.netwm.state.maximized_h)
543 if (!bd->lock_client_maximize)
545 e_hints_window_size_get(bd);
546 e_border_maximize(bd, (e_config->maximize_policy & E_MAXIMIZE_TYPE) | E_MAXIMIZE_HORIZONTAL);
549 e_hints_window_maximized_set(bd, 0, 0);
551 else if (bd->client.netwm.state.maximized_v)
553 if (!bd->lock_client_maximize)
555 e_hints_window_size_get(bd);
556 e_border_maximize(bd, (e_config->maximize_policy & E_MAXIMIZE_TYPE) | E_MAXIMIZE_VERTICAL);
559 e_hints_window_maximized_set(bd, 0, 0);
561 if (bd->client.netwm.state.fullscreen)
563 if (!bd->lock_client_fullscreen)
565 e_hints_window_size_get(bd);
566 e_border_fullscreen(bd, e_config->fullscreen_policy);
569 e_hints_window_fullscreen_set(bd, 0);
571 if ((bd->client.icccm.state == ECORE_X_WINDOW_STATE_HINT_ICONIC) &&
572 (bd->client.netwm.state.hidden))
574 if (!bd->lock_client_iconify)
575 e_border_iconify(bd);
577 e_hints_window_visible_set(bd);
579 #ifndef _F_USE_EXTENDED_ICONIFY_
580 else if ((bd->parent) && (e_config->transient.iconify) && (bd->parent->iconic))
581 e_border_iconify(bd);
583 /* If a window isn't iconic, and is one the current desk,
585 else if (bd->desk == e_desk_current_get(bd->zone))
589 if (bd->client.e.state.centered)
594 /* Update stacking */
595 e_hints_client_list_set();
596 e_hints_client_stacking_set();
600 e_hints_window_state_set(E_Border *bd)
602 Ecore_X_Window_State state[10];
605 if (bd->client.netwm.state.modal)
606 state[num++] = ECORE_X_WINDOW_STATE_MODAL;
607 if (bd->client.netwm.state.sticky)
608 state[num++] = ECORE_X_WINDOW_STATE_STICKY;
609 if (bd->client.netwm.state.maximized_v)
610 state[num++] = ECORE_X_WINDOW_STATE_MAXIMIZED_VERT;
611 if (bd->client.netwm.state.maximized_h)
612 state[num++] = ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ;
613 if (bd->client.netwm.state.shaded)
614 state[num++] = ECORE_X_WINDOW_STATE_SHADED;
615 if (bd->client.netwm.state.skip_taskbar)
616 state[num++] = ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
617 if (bd->client.netwm.state.skip_pager)
618 state[num++] = ECORE_X_WINDOW_STATE_SKIP_PAGER;
619 if (bd->client.netwm.state.hidden)
620 state[num++] = ECORE_X_WINDOW_STATE_HIDDEN;
621 if (bd->client.netwm.state.fullscreen)
622 state[num++] = ECORE_X_WINDOW_STATE_FULLSCREEN;
624 switch (bd->client.netwm.state.stacking)
626 case E_STACKING_ABOVE:
627 state[num++] = ECORE_X_WINDOW_STATE_ABOVE;
630 case E_STACKING_BELOW:
631 state[num++] = ECORE_X_WINDOW_STATE_BELOW;
634 case E_STACKING_NONE:
638 ecore_x_netwm_window_state_set(bd->client.win, state, num);
642 e_hints_allowed_action_set(E_Border *bd)
644 Ecore_X_Action action[10];
647 if (bd->client.netwm.action.move)
648 action[num++] = ECORE_X_ACTION_MOVE;
649 if (bd->client.netwm.action.resize)
650 action[num++] = ECORE_X_ACTION_RESIZE;
651 if (bd->client.netwm.action.minimize)
652 action[num++] = ECORE_X_ACTION_MINIMIZE;
653 if (bd->client.netwm.action.shade)
654 action[num++] = ECORE_X_ACTION_SHADE;
655 if (bd->client.netwm.action.stick)
656 action[num++] = ECORE_X_ACTION_STICK;
657 if (bd->client.netwm.action.maximized_h)
658 action[num++] = ECORE_X_ACTION_MAXIMIZE_HORZ;
659 if (bd->client.netwm.action.maximized_v)
660 action[num++] = ECORE_X_ACTION_MAXIMIZE_VERT;
661 if (bd->client.netwm.action.fullscreen)
662 action[num++] = ECORE_X_ACTION_FULLSCREEN;
663 if (bd->client.netwm.action.change_desktop)
664 action[num++] = ECORE_X_ACTION_CHANGE_DESKTOP;
665 if (bd->client.netwm.action.close)
666 action[num++] = ECORE_X_ACTION_CLOSE;
668 ecore_x_netwm_allowed_action_set(bd->client.win, action, num);
672 e_hints_window_type_set(E_Border *bd)
674 ecore_x_netwm_window_type_set(bd->client.win, bd->client.netwm.type);
678 e_hints_window_type_get(E_Border *bd)
680 Ecore_X_Window_Type *types = NULL;
683 num = ecore_x_netwm_window_types_get(bd->client.win, &types);
684 if (bd->client.netwm.extra_types)
686 free(bd->client.netwm.extra_types);
687 bd->client.netwm.extra_types = NULL;
688 bd->client.netwm.extra_types_num = 0;
691 bd->client.netwm.type = ECORE_X_WINDOW_TYPE_UNKNOWN;
695 bd->client.netwm.type = types[j];
698 (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_UNKNOWN))
701 bd->client.netwm.type = types[j];
705 bd->client.netwm.extra_types =
706 malloc((num - j) * sizeof(Ecore_X_Window_Type));
707 if (bd->client.netwm.extra_types)
709 for (i = j + 1; i < num; i++)
710 bd->client.netwm.extra_types[i - (j + 1)] = types[i];
711 bd->client.netwm.extra_types_num = num - j;
719 e_hints_window_state_update(E_Border *bd,
720 Ecore_X_Window_State state,
721 Ecore_X_Window_State_Action action)
725 case ECORE_X_WINDOW_STATE_ICONIFIED:
726 if (action != ECORE_X_WINDOW_STATE_ACTION_ADD) return;
727 if (bd->client.icccm.state == ECORE_X_WINDOW_STATE_HINT_ICONIC) return;
728 if (bd->lock_client_iconify) return;
729 e_border_iconify(bd);
732 case ECORE_X_WINDOW_STATE_MODAL:
735 case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
736 if (bd->client.netwm.state.modal)
738 bd->client.netwm.state.modal = 0;
739 bd->client.netwm.update.state = 1;
744 case ECORE_X_WINDOW_STATE_ACTION_ADD:
745 if (!bd->client.netwm.state.modal)
747 bd->client.netwm.state.modal = 1;
748 bd->client.netwm.update.state = 1;
753 case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
754 bd->client.netwm.state.modal = !bd->client.netwm.state.modal;
755 bd->client.netwm.update.state = 1;
761 case ECORE_X_WINDOW_STATE_STICKY:
762 if (bd->lock_client_sticky) return;
765 case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
766 e_border_unstick(bd);
769 case ECORE_X_WINDOW_STATE_ACTION_ADD:
773 case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
775 e_border_unstick(bd);
782 case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
783 if (bd->lock_client_maximize) return;
786 case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
787 if (bd->maximized & E_MAXIMIZE_VERTICAL)
788 e_border_unmaximize(bd, E_MAXIMIZE_VERTICAL);
791 case ECORE_X_WINDOW_STATE_ACTION_ADD:
792 if (!(bd->maximized & E_MAXIMIZE_VERTICAL))
793 e_border_maximize(bd, (e_config->maximize_policy & E_MAXIMIZE_TYPE) | E_MAXIMIZE_VERTICAL);
796 case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
797 if (bd->maximized & E_MAXIMIZE_VERTICAL)
798 e_border_unmaximize(bd, E_MAXIMIZE_VERTICAL);
800 e_border_maximize(bd, (e_config->maximize_policy & E_MAXIMIZE_TYPE) | E_MAXIMIZE_VERTICAL);
805 case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
806 if (bd->lock_client_maximize) return;
809 case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
810 if (bd->maximized & E_MAXIMIZE_HORIZONTAL)
811 e_border_unmaximize(bd, E_MAXIMIZE_HORIZONTAL);
814 case ECORE_X_WINDOW_STATE_ACTION_ADD:
815 if (!(bd->maximized & E_MAXIMIZE_HORIZONTAL))
816 e_border_maximize(bd, (e_config->maximize_policy & E_MAXIMIZE_TYPE) | E_MAXIMIZE_HORIZONTAL);
819 case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
820 if (bd->maximized & E_MAXIMIZE_HORIZONTAL)
821 e_border_unmaximize(bd, E_MAXIMIZE_HORIZONTAL);
823 e_border_maximize(bd, (e_config->maximize_policy & E_MAXIMIZE_TYPE) | E_MAXIMIZE_HORIZONTAL);
828 case ECORE_X_WINDOW_STATE_SHADED:
829 if (bd->lock_client_shade) return;
832 case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
833 e_border_unshade(bd, e_hints_window_shade_direction_get(bd));
836 case ECORE_X_WINDOW_STATE_ACTION_ADD:
837 e_border_shade(bd, e_hints_window_shade_direction_get(bd));
840 case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
842 e_border_unshade(bd, e_hints_window_shade_direction_get(bd));
844 e_border_shade(bd, e_hints_window_shade_direction_get(bd));
849 case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
852 case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
853 if (bd->client.netwm.state.skip_taskbar)
855 bd->client.netwm.state.skip_taskbar = 0;
856 bd->client.netwm.update.state = 1;
861 case ECORE_X_WINDOW_STATE_ACTION_ADD:
862 if (!bd->client.netwm.state.skip_taskbar)
864 bd->client.netwm.state.skip_taskbar = 1;
865 bd->client.netwm.update.state = 1;
870 case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
871 bd->client.netwm.state.skip_taskbar = !bd->client.netwm.state.skip_taskbar;
872 bd->client.netwm.update.state = 1;
878 case ECORE_X_WINDOW_STATE_SKIP_PAGER:
881 case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
882 if (bd->client.netwm.state.skip_pager)
884 bd->client.netwm.state.skip_pager = 0;
885 bd->client.netwm.update.state = 1;
890 case ECORE_X_WINDOW_STATE_ACTION_ADD:
891 if (!bd->client.netwm.state.skip_pager)
893 bd->client.netwm.state.skip_pager = 1;
894 bd->client.netwm.update.state = 1;
899 case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
900 bd->client.netwm.state.skip_pager = !bd->client.netwm.state.skip_pager;
901 bd->client.netwm.update.state = 1;
907 case ECORE_X_WINDOW_STATE_HIDDEN:
911 case ECORE_X_WINDOW_STATE_FULLSCREEN:
912 if (bd->lock_client_fullscreen) return;
915 case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
916 e_border_unfullscreen(bd);
919 case ECORE_X_WINDOW_STATE_ACTION_ADD:
920 e_border_fullscreen(bd, e_config->fullscreen_policy);
923 case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
925 e_border_unfullscreen(bd);
927 e_border_fullscreen(bd, e_config->fullscreen_policy);
932 case ECORE_X_WINDOW_STATE_ABOVE:
933 if (bd->lock_client_stacking) return;
934 /* FIXME: Should this require that BELOW is set to 0 first, or just
938 case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
939 e_border_layer_set(bd, 100);
940 e_hints_window_stacking_set(bd, E_STACKING_NONE);
943 case ECORE_X_WINDOW_STATE_ACTION_ADD:
944 e_hints_window_stacking_set(bd, E_STACKING_ABOVE);
945 e_border_layer_set(bd, 150);
948 case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
949 if (bd->layer == 150)
951 e_hints_window_stacking_set(bd, E_STACKING_NONE);
952 e_border_layer_set(bd, 100);
956 e_hints_window_stacking_set(bd, E_STACKING_ABOVE);
957 e_border_layer_set(bd, 150);
963 case ECORE_X_WINDOW_STATE_BELOW:
964 if (bd->lock_client_stacking) return;
965 /* FIXME: Should this require that ABOVE is set to 0 first, or just
969 case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
970 e_hints_window_stacking_set(bd, E_STACKING_NONE);
971 e_border_layer_set(bd, 100);
974 case ECORE_X_WINDOW_STATE_ACTION_ADD:
975 e_hints_window_stacking_set(bd, E_STACKING_BELOW);
976 e_border_layer_set(bd, 50);
979 case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
982 e_hints_window_stacking_set(bd, E_STACKING_NONE);
983 e_border_layer_set(bd, 100);
987 e_hints_window_stacking_set(bd, E_STACKING_BELOW);
988 e_border_layer_set(bd, 50);
994 case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
998 case ECORE_X_WINDOW_STATE_UNKNOWN:
1005 e_hints_window_state_get(E_Border *bd)
1007 unsigned int i, num;
1008 Ecore_X_Window_State *state;
1010 bd->client.netwm.state.modal = 0;
1011 bd->client.netwm.state.sticky = 0;
1012 bd->client.netwm.state.maximized_v = 0;
1013 bd->client.netwm.state.maximized_h = 0;
1014 bd->client.netwm.state.shaded = 0;
1015 bd->client.netwm.state.skip_taskbar = 0;
1016 bd->client.netwm.state.skip_pager = 0;
1017 bd->client.netwm.state.hidden = 0;
1018 bd->client.netwm.state.fullscreen = 0;
1019 bd->client.netwm.state.stacking = 0;
1021 ecore_x_netwm_window_state_get(bd->client.win, &state, &num);
1024 for (i = 0; i < num; i++)
1028 case ECORE_X_WINDOW_STATE_ICONIFIED:
1032 case ECORE_X_WINDOW_STATE_MODAL:
1033 bd->client.netwm.state.modal = 1;
1036 case ECORE_X_WINDOW_STATE_STICKY:
1037 bd->client.netwm.state.sticky = 1;
1040 case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
1041 bd->client.netwm.state.maximized_v = 1;
1044 case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
1045 bd->client.netwm.state.maximized_h = 1;
1048 case ECORE_X_WINDOW_STATE_SHADED:
1049 bd->client.netwm.state.shaded = 1;
1052 case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
1053 bd->client.netwm.state.skip_taskbar = 1;
1056 case ECORE_X_WINDOW_STATE_SKIP_PAGER:
1057 bd->client.netwm.state.skip_pager = 1;
1060 case ECORE_X_WINDOW_STATE_HIDDEN:
1061 bd->client.netwm.state.hidden = 1;
1064 case ECORE_X_WINDOW_STATE_FULLSCREEN:
1065 bd->client.netwm.state.fullscreen = 1;
1068 case ECORE_X_WINDOW_STATE_ABOVE:
1069 bd->client.netwm.state.stacking = E_STACKING_ABOVE;
1072 case ECORE_X_WINDOW_STATE_BELOW:
1073 bd->client.netwm.state.stacking = E_STACKING_BELOW;
1076 case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
1080 case ECORE_X_WINDOW_STATE_UNKNOWN:
1090 e_hints_allowed_action_update(E_Border *bd __UNUSED__,
1091 Ecore_X_Action action)
1095 case ECORE_X_ACTION_MOVE:
1098 case ECORE_X_ACTION_RESIZE:
1101 case ECORE_X_ACTION_MINIMIZE:
1104 case ECORE_X_ACTION_SHADE:
1107 case ECORE_X_ACTION_STICK:
1110 case ECORE_X_ACTION_MAXIMIZE_HORZ:
1113 case ECORE_X_ACTION_MAXIMIZE_VERT:
1116 case ECORE_X_ACTION_FULLSCREEN:
1119 case ECORE_X_ACTION_CHANGE_DESKTOP:
1122 case ECORE_X_ACTION_CLOSE:
1125 case ECORE_X_ACTION_ABOVE:
1128 case ECORE_X_ACTION_BELOW:
1134 e_hints_allowed_action_get(E_Border *bd)
1136 Ecore_X_Action *action;
1140 bd->client.netwm.action.move = 0;
1141 bd->client.netwm.action.resize = 0;
1142 bd->client.netwm.action.minimize = 0;
1143 bd->client.netwm.action.shade = 0;
1144 bd->client.netwm.action.stick = 0;
1145 bd->client.netwm.action.maximized_h = 0;
1146 bd->client.netwm.action.maximized_v = 0;
1147 bd->client.netwm.action.fullscreen = 0;
1148 bd->client.netwm.action.change_desktop = 0;
1149 bd->client.netwm.action.close = 0;
1151 ecore_x_netwm_allowed_action_get(bd->client.win, &action, &num);
1154 for (i = 0; i < num; i++)
1158 case ECORE_X_ACTION_MOVE:
1159 bd->client.netwm.action.move = 1;
1162 case ECORE_X_ACTION_RESIZE:
1163 bd->client.netwm.action.resize = 1;
1166 case ECORE_X_ACTION_MINIMIZE:
1167 bd->client.netwm.action.minimize = 1;
1170 case ECORE_X_ACTION_SHADE:
1171 bd->client.netwm.action.shade = 1;
1174 case ECORE_X_ACTION_STICK:
1175 bd->client.netwm.action.stick = 1;
1178 case ECORE_X_ACTION_MAXIMIZE_HORZ:
1179 bd->client.netwm.action.maximized_h = 1;
1182 case ECORE_X_ACTION_MAXIMIZE_VERT:
1183 bd->client.netwm.action.maximized_v = 1;
1186 case ECORE_X_ACTION_FULLSCREEN:
1187 bd->client.netwm.action.fullscreen = 1;
1190 case ECORE_X_ACTION_CHANGE_DESKTOP:
1191 bd->client.netwm.action.change_desktop = 1;
1194 case ECORE_X_ACTION_CLOSE:
1195 bd->client.netwm.action.close = 1;
1198 case ECORE_X_ACTION_ABOVE:
1201 case ECORE_X_ACTION_BELOW:
1210 e_hints_window_visible_set(E_Border *bd)
1212 if (bd->client.icccm.state != ECORE_X_WINDOW_STATE_HINT_NORMAL)
1214 ecore_x_icccm_state_set(bd->client.win, ECORE_X_WINDOW_STATE_HINT_NORMAL);
1215 bd->client.icccm.state = ECORE_X_WINDOW_STATE_HINT_NORMAL;
1217 if (bd->client.netwm.state.hidden)
1219 bd->client.netwm.update.state = 1;
1220 bd->client.netwm.state.hidden = 0;
1226 e_hints_window_iconic_set(E_Border *bd)
1228 if (bd->client.icccm.state != ECORE_X_WINDOW_STATE_HINT_ICONIC)
1230 ecore_x_icccm_state_set(bd->client.win, ECORE_X_WINDOW_STATE_HINT_ICONIC);
1231 bd->client.icccm.state = ECORE_X_WINDOW_STATE_HINT_ICONIC;
1233 if (!bd->client.netwm.state.hidden)
1235 bd->client.netwm.update.state = 1;
1236 bd->client.netwm.state.hidden = 1;
1242 e_hints_window_hidden_set(E_Border *bd)
1244 if (bd->client.icccm.state != ECORE_X_WINDOW_STATE_HINT_WITHDRAWN)
1246 ecore_x_icccm_state_set(bd->client.win, ECORE_X_WINDOW_STATE_HINT_WITHDRAWN);
1247 bd->client.icccm.state = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
1249 if (bd->client.netwm.state.hidden)
1251 bd->client.netwm.update.state = 1;
1252 bd->client.netwm.state.hidden = 0;
1258 e_hints_window_shaded_set(E_Border *bd,
1261 if ((!bd->client.netwm.state.shaded) && (on))
1263 bd->client.netwm.update.state = 1;
1264 bd->client.netwm.state.shaded = 1;
1267 else if ((bd->client.netwm.state.shaded) && (!on))
1269 bd->client.netwm.update.state = 1;
1270 bd->client.netwm.state.shaded = 0;
1276 e_hints_window_shade_direction_set(E_Border *bd,
1279 ecore_x_window_prop_card32_set(bd->client.win, E_ATOM_SHADE_DIRECTION, &dir, 1);
1283 e_hints_window_shade_direction_get(E_Border *bd)
1288 ret = ecore_x_window_prop_card32_get(bd->client.win,
1289 E_ATOM_SHADE_DIRECTION,
1294 return E_DIRECTION_UP;
1298 e_hints_window_size_set(E_Border *bd)
1300 unsigned int sizes[4];
1306 ecore_x_window_prop_card32_set(bd->client.win, E_ATOM_BORDER_SIZE, sizes, 4);
1310 e_hints_window_size_unset(E_Border *bd)
1312 ecore_x_window_prop_property_del(bd->client.win, E_ATOM_BORDER_SIZE);
1316 e_hints_window_size_get(E_Border *bd)
1319 unsigned int sizes[4];
1321 memset(sizes, 0, sizeof(sizes));
1322 ret = ecore_x_window_prop_card32_get(bd->client.win, E_ATOM_BORDER_SIZE,
1336 e_hints_window_maximized_set(E_Border *bd,
1340 if ((horizontal) && (!bd->client.netwm.state.maximized_h))
1342 bd->client.netwm.update.state = 1;
1343 bd->client.netwm.state.maximized_h = 1;
1346 else if ((!horizontal) && (bd->client.netwm.state.maximized_h))
1348 bd->client.netwm.update.state = 1;
1349 bd->client.netwm.state.maximized_h = 0;
1352 if ((vertical) && (!bd->client.netwm.state.maximized_v))
1354 bd->client.netwm.update.state = 1;
1355 bd->client.netwm.state.maximized_v = 1;
1358 else if ((!vertical) && (bd->client.netwm.state.maximized_v))
1360 bd->client.netwm.update.state = 1;
1361 bd->client.netwm.state.maximized_v = 0;
1367 e_hints_window_fullscreen_set(E_Border *bd,
1370 if ((!bd->client.netwm.state.fullscreen) && (on))
1372 bd->client.netwm.update.state = 1;
1373 bd->client.netwm.state.fullscreen = 1;
1376 else if ((bd->client.netwm.state.fullscreen) && (!on))
1378 bd->client.netwm.update.state = 1;
1379 bd->client.netwm.state.fullscreen = 0;
1385 e_hints_window_sticky_set(E_Border *bd,
1388 if ((!bd->client.netwm.state.sticky) && (on))
1390 bd->client.netwm.update.state = 1;
1391 bd->client.netwm.state.sticky = 1;
1394 else if ((bd->client.netwm.state.sticky) && (!on))
1396 bd->client.netwm.update.state = 1;
1397 bd->client.netwm.state.sticky = 0;
1403 e_hints_window_stacking_set(E_Border *bd,
1404 E_Stacking stacking)
1406 if (bd->client.netwm.state.stacking == stacking) return;
1407 bd->client.netwm.update.state = 1;
1408 bd->client.netwm.state.stacking = stacking;
1413 e_hints_window_desktop_set(E_Border *bd)
1415 /* This function is only called when really changing desktop,
1416 * so just set the property and don't care about the roundtrip.
1418 unsigned int deskpos[2];
1420 /* if valgrind complains here it is complaining bd->client.netwm.desktop
1421 * is an uninitialised variable - but it isn't. it can't be. its part of
1422 * a calloc()'d struct and thus has to have been set to 0. hell even
1423 * e_border.c explicitly sets it to 0 on creation of the border object.
1425 deskpos[0] = bd->desk->x;
1426 deskpos[1] = bd->desk->y;
1427 ecore_x_window_prop_card32_set(bd->client.win, E_ATOM_DESK, deskpos, 2);
1429 #ifdef _F_USE_DESK_WINDOW_PROFILE_
1430 if (strcmp(bd->desk->window_profile,
1431 e_config->desktop_default_window_profile) != 0)
1433 ecore_x_e_window_profile_set(bd->client.win,
1434 bd->desk->window_profile);
1439 ecore_x_netwm_desktop_set(bd->client.win, current);
1441 bd->client.netwm.desktop = (bd->desk->y * bd->zone->desk_x_count) + bd->desk->x;
1445 e_hints_window_e_state_get(E_Border *bd)
1447 /* Remember to update the count if we add more states! */
1448 Ecore_X_Atom state[1];
1452 memset(state, 0, sizeof(state));
1454 /* ugly, but avoids possible future overflow if more states are added */
1455 size = (sizeof(state) / sizeof(state[0]));
1458 ecore_x_window_prop_card32_get(bd->client.win, E_ATOM_WINDOW_STATE,
1462 for (i = 0; (i < num) && (i < size); i++)
1464 if (state[i] == E_ATOM_WINDOW_STATE_CENTERED)
1465 bd->client.e.state.centered = 1;
1470 e_hints_window_e_state_set(E_Border *bd __UNUSED__)
1476 e_hints_window_qtopia_soft_menu_get(E_Border *bd)
1480 if (ecore_x_window_prop_card32_get(bd->client.win, ATM__QTOPIA_SOFT_MENU, &val, 1))
1481 bd->client.qtopia.soft_menu = val;
1483 bd->client.qtopia.soft_menu = 0;
1487 e_hints_window_qtopia_soft_menus_get(E_Border *bd)
1491 if (ecore_x_window_prop_card32_get(bd->client.win, ATM__QTOPIA_SOFT_MENUS, &val, 1))
1492 bd->client.qtopia.soft_menus = val;
1494 bd->client.qtopia.soft_menus = 0;
1498 e_hints_window_virtual_keyboard_state_get(E_Border *bd)
1500 bd->client.vkbd.state = ecore_x_e_virtual_keyboard_state_get(bd->client.win);
1504 e_hints_window_virtual_keyboard_get(E_Border *bd)
1506 bd->client.vkbd.vkbd = ecore_x_e_virtual_keyboard_get(bd->client.win);
1510 e_hints_openoffice_gnome_fake(Ecore_X_Window root)
1512 const char *string = "ATM_GNOME_SM_PROXY";
1514 ecore_x_window_prop_property_set(root, ATM_GNOME_SM_PROXY, ECORE_X_ATOM_STRING,
1515 8, (void *)string, strlen(string));
1519 e_hints_openoffice_kde_fake(Ecore_X_Window root)
1521 Ecore_X_Window win2;
1523 win2 = ecore_x_window_new(root, -20, -20, 1, 1);
1524 ecore_x_netwm_wm_identify(root, win2, "KWin");
1528 e_hints_scale_update(void)
1530 Ecore_X_Window *roots = NULL;
1534 roots = ecore_x_window_root_list(&num);
1537 scale = e_scale * 1000;
1538 for (i = 0; i < num; i++)
1539 ecore_x_window_prop_card32_set(roots[i], ATM_ENLIGHTENMENT_SCALE, &scale, 1);