2 * _NET_WM... aka Extended Window Manager Hint (EWMH) functions.
14 #include "ecore_x_private.h"
17 typedef struct _Ecore_X_Startup_Info Ecore_X_Startup_Info;
19 struct _Ecore_X_Startup_Info
30 /* These are the sequence info fields */
43 static void _ecore_x_window_prop_string_utf8_set(Ecore_X_Window win,
46 static char *_ecore_x_window_prop_string_utf8_get(Ecore_X_Window win,
49 static int _ecore_x_netwm_startup_info_process(Ecore_X_Startup_Info *info);
50 static int _ecore_x_netwm_startup_info_parse(Ecore_X_Startup_Info *info,
53 static void _ecore_x_netwm_startup_info_free(void *data);
58 #define _ATOM_SET_UTF8_STRING_LIST(win, atom, string, cnt) \
59 XChangeProperty(_ecore_x_disp, \
62 ECORE_X_ATOM_UTF8_STRING, \
65 (unsigned char *)string, \
72 static Eina_Hash *startup_info = NULL;
75 ecore_x_netwm_init(void)
77 LOGFN(__FILE__, __LINE__, __FUNCTION__);
78 startup_info = eina_hash_string_superfast_new(
79 _ecore_x_netwm_startup_info_free);
83 ecore_x_netwm_shutdown(void)
85 LOGFN(__FILE__, __LINE__, __FUNCTION__);
87 eina_hash_free(startup_info);
96 ecore_x_netwm_wm_identify(Ecore_X_Window root,
100 LOGFN(__FILE__, __LINE__, __FUNCTION__);
101 ecore_x_window_prop_window_set(check,
102 ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK,
105 _ecore_x_window_prop_string_utf8_set(check,
106 ECORE_X_ATOM_NET_WM_NAME,
108 /* This one isn't mandatory */
109 _ecore_x_window_prop_string_utf8_set(root,
110 ECORE_X_ATOM_NET_WM_NAME,
112 ecore_x_window_prop_window_set(root,
113 ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK,
119 * Set supported atoms
122 ecore_x_netwm_supported_set(Ecore_X_Window root,
123 Ecore_X_Atom *supported,
126 LOGFN(__FILE__, __LINE__, __FUNCTION__);
127 ecore_x_window_prop_atom_set(root,
128 ECORE_X_ATOM_NET_SUPPORTED,
134 ecore_x_netwm_supported_get(Ecore_X_Window root,
135 Ecore_X_Atom **supported,
140 EINA_SAFETY_ON_NULL_RETURN_VAL(supported, EINA_FALSE);
145 LOGFN(__FILE__, __LINE__, __FUNCTION__);
146 num_ret = ecore_x_window_prop_atom_list_get(root, ECORE_X_ATOM_NET_SUPPORTED,
158 * Desktop configuration and status
161 ecore_x_netwm_desk_count_set(Ecore_X_Window root,
162 unsigned int n_desks)
164 LOGFN(__FILE__, __LINE__, __FUNCTION__);
165 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS,
170 ecore_x_netwm_desk_roots_set(Ecore_X_Window root,
171 Ecore_X_Window *vroots,
172 unsigned int n_desks)
174 LOGFN(__FILE__, __LINE__, __FUNCTION__);
175 ecore_x_window_prop_window_set(root,
176 ECORE_X_ATOM_NET_VIRTUAL_ROOTS,
182 ecore_x_netwm_desk_names_set(Ecore_X_Window root,
184 unsigned int n_desks)
186 char ss[32], *buf, *t;
191 LOGFN(__FILE__, __LINE__, __FUNCTION__);
195 for (i = 0; i < n_desks; i++)
197 s = (names) ? names[i] : NULL;
200 /* Default to "Desk-<number>" */
201 sprintf(ss, "Desk-%u", i);
206 t = realloc(buf, len + l);
210 memcpy(buf + len, s, l);
215 _ATOM_SET_UTF8_STRING_LIST(root, ECORE_X_ATOM_NET_DESKTOP_NAMES, buf, len);
216 if (_ecore_xlib_sync) ecore_x_sync();
222 ecore_x_netwm_desk_size_set(Ecore_X_Window root,
226 unsigned int size[2];
228 LOGFN(__FILE__, __LINE__, __FUNCTION__);
231 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_GEOMETRY, size,
236 ecore_x_netwm_desk_viewports_set(Ecore_X_Window root,
237 unsigned int *origins,
238 unsigned int n_desks)
240 LOGFN(__FILE__, __LINE__, __FUNCTION__);
241 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_VIEWPORT,
242 origins, 2 * n_desks);
246 ecore_x_netwm_desk_layout_set(Ecore_X_Window root,
252 unsigned int layout[4];
254 LOGFN(__FILE__, __LINE__, __FUNCTION__);
255 layout[0] = orientation;
258 layout[3] = starting_corner;
259 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_LAYOUT,
264 ecore_x_netwm_desk_workareas_set(Ecore_X_Window root,
266 unsigned int n_desks)
268 LOGFN(__FILE__, __LINE__, __FUNCTION__);
269 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_WORKAREA, areas,
274 ecore_x_netwm_desk_workareas_get(Ecore_X_Window root, unsigned int *n_desks)
277 unsigned int *areas = NULL;
279 if (!root) root = DefaultRootWindow(_ecore_x_disp);
281 ret = ecore_x_window_prop_card32_list_get(root, ECORE_X_ATOM_NET_WORKAREA,
285 if (n_desks) *n_desks = 0;
288 if (n_desks) *n_desks = ret / 4;
293 ecore_x_netwm_desk_current_set(Ecore_X_Window root,
296 LOGFN(__FILE__, __LINE__, __FUNCTION__);
297 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_CURRENT_DESKTOP, &desk,
302 ecore_x_netwm_showing_desktop_set(Ecore_X_Window root,
307 LOGFN(__FILE__, __LINE__, __FUNCTION__);
309 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_SHOWING_DESKTOP, &val,
319 ecore_x_netwm_client_list_set(Ecore_X_Window root,
320 Ecore_X_Window *p_clients,
321 unsigned int n_clients)
323 LOGFN(__FILE__, __LINE__, __FUNCTION__);
324 ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_CLIENT_LIST,
325 p_clients, n_clients);
330 ecore_x_netwm_client_list_stacking_set(Ecore_X_Window root,
331 Ecore_X_Window *p_clients,
332 unsigned int n_clients)
334 LOGFN(__FILE__, __LINE__, __FUNCTION__);
335 ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_CLIENT_LIST_STACKING,
336 p_clients, n_clients);
340 ecore_x_netwm_client_active_set(Ecore_X_Window root,
343 LOGFN(__FILE__, __LINE__, __FUNCTION__);
344 ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_ACTIVE_WINDOW,
349 ecore_x_netwm_client_active_request(Ecore_X_Window root,
352 Ecore_X_Window current_win)
356 LOGFN(__FILE__, __LINE__, __FUNCTION__);
358 root = DefaultRootWindow(_ecore_x_disp);
360 xev.xclient.type = ClientMessage;
361 xev.xclient.display = _ecore_x_disp;
362 xev.xclient.window = win;
363 xev.xclient.message_type = ECORE_X_ATOM_NET_ACTIVE_WINDOW;
364 xev.xclient.format = 32;
365 xev.xclient.data.l[0] = type;
366 xev.xclient.data.l[1] = CurrentTime;
367 xev.xclient.data.l[2] = current_win;
368 xev.xclient.data.l[3] = 0;
369 xev.xclient.data.l[4] = 0;
371 XSendEvent(_ecore_x_disp, root, False,
372 SubstructureRedirectMask | SubstructureNotifyMask, &xev);
373 if (_ecore_xlib_sync) ecore_x_sync();
377 ecore_x_netwm_name_set(Ecore_X_Window win,
380 LOGFN(__FILE__, __LINE__, __FUNCTION__);
381 _ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_WM_NAME, name);
385 ecore_x_netwm_name_get(Ecore_X_Window win,
388 LOGFN(__FILE__, __LINE__, __FUNCTION__);
390 *name = _ecore_x_window_prop_string_utf8_get(win,
391 ECORE_X_ATOM_NET_WM_NAME);
397 ecore_x_netwm_startup_id_set(Ecore_X_Window win,
400 LOGFN(__FILE__, __LINE__, __FUNCTION__);
401 _ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_STARTUP_ID, id);
405 ecore_x_netwm_startup_id_get(Ecore_X_Window win,
408 LOGFN(__FILE__, __LINE__, __FUNCTION__);
410 *id = _ecore_x_window_prop_string_utf8_get(win,
411 ECORE_X_ATOM_NET_STARTUP_ID);
417 ecore_x_netwm_visible_name_set(Ecore_X_Window win,
420 LOGFN(__FILE__, __LINE__, __FUNCTION__);
421 _ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_WM_VISIBLE_NAME,
426 ecore_x_netwm_visible_name_get(Ecore_X_Window win,
429 LOGFN(__FILE__, __LINE__, __FUNCTION__);
431 *name = _ecore_x_window_prop_string_utf8_get(
433 ECORE_X_ATOM_NET_WM_VISIBLE_NAME);
439 ecore_x_netwm_icon_name_set(Ecore_X_Window win,
442 LOGFN(__FILE__, __LINE__, __FUNCTION__);
443 _ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_WM_ICON_NAME,
448 ecore_x_netwm_icon_name_get(Ecore_X_Window win,
451 LOGFN(__FILE__, __LINE__, __FUNCTION__);
453 *name = _ecore_x_window_prop_string_utf8_get(
455 ECORE_X_ATOM_NET_WM_ICON_NAME);
461 ecore_x_netwm_visible_icon_name_set(Ecore_X_Window win,
464 LOGFN(__FILE__, __LINE__, __FUNCTION__);
465 _ecore_x_window_prop_string_utf8_set(win,
466 ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME,
471 ecore_x_netwm_visible_icon_name_get(Ecore_X_Window win,
474 LOGFN(__FILE__, __LINE__, __FUNCTION__);
476 *name = _ecore_x_window_prop_string_utf8_get(
478 ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME);
484 ecore_x_netwm_desktop_set(Ecore_X_Window win,
487 LOGFN(__FILE__, __LINE__, __FUNCTION__);
488 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_DESKTOP, &desk, 1);
492 ecore_x_netwm_desktop_get(Ecore_X_Window win,
498 LOGFN(__FILE__, __LINE__, __FUNCTION__);
499 ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_DESKTOP,
505 return ret == 1 ? EINA_TRUE : EINA_FALSE;
509 * _NET_WM_STRUT is deprecated
512 ecore_x_netwm_strut_set(Ecore_X_Window win,
518 unsigned int strut[4];
520 LOGFN(__FILE__, __LINE__, __FUNCTION__);
525 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_STRUT, strut, 4);
529 * _NET_WM_STRUT is deprecated
532 ecore_x_netwm_strut_get(Ecore_X_Window win,
539 unsigned int strut[4];
541 LOGFN(__FILE__, __LINE__, __FUNCTION__);
542 ret = ecore_x_window_prop_card32_get(win,
543 ECORE_X_ATOM_NET_WM_STRUT,
565 ecore_x_netwm_strut_partial_set(Ecore_X_Window win,
579 unsigned int strut[12];
581 LOGFN(__FILE__, __LINE__, __FUNCTION__);
586 strut[4] = left_start_y;
587 strut[5] = left_end_y;
588 strut[6] = right_start_y;
589 strut[7] = right_end_y;
590 strut[8] = top_start_x;
591 strut[9] = top_end_x;
592 strut[10] = bottom_start_x;
593 strut[11] = bottom_end_x;
594 ecore_x_window_prop_card32_set(win,
595 ECORE_X_ATOM_NET_WM_STRUT_PARTIAL,
601 ecore_x_netwm_strut_partial_get(Ecore_X_Window win,
616 unsigned int strut[12];
618 LOGFN(__FILE__, __LINE__, __FUNCTION__);
619 ret = ecore_x_window_prop_card32_get(win,
620 ECORE_X_ATOM_NET_WM_STRUT_PARTIAL,
639 *left_start_y = strut[4];
642 *left_end_y = strut[5];
645 *right_start_y = strut[6];
648 *right_end_y = strut[7];
651 *top_start_x = strut[8];
654 *top_end_x = strut[9];
657 *bottom_start_x = strut[10];
660 *bottom_end_x = strut[11];
666 ecore_x_netwm_icons_set(Ecore_X_Window win,
670 unsigned int *data, *p, *p2;
671 unsigned int i, size, x, y;
673 LOGFN(__FILE__, __LINE__, __FUNCTION__);
675 for (i = 0; i < (unsigned int)num; i++)
677 size += 2 + (icon[i].width * icon[i].height);
679 data = malloc(size * sizeof(unsigned int));
682 for (i = 0; i < (unsigned int)num; i++)
684 p[0] = icon[i].width;
685 p[1] = icon[i].height;
688 for (y = 0; y < icon[i].height; y++)
690 for (x = 0; x < icon[i].width; x++)
692 unsigned int r, g, b, a;
694 a = (*p2 >> 24) & 0xff;
695 r = (*p2 >> 16) & 0xff;
696 g = (*p2 >> 8 ) & 0xff;
698 if ((a > 0) && (a < 255))
705 *p = (a << 24) | (r << 16) | (g << 8) | b;
711 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_ICON,
717 ecore_x_netwm_icons_get(Ecore_X_Window win,
721 unsigned int *data, *p;
723 unsigned int len, icons, i;
726 LOGFN(__FILE__, __LINE__, __FUNCTION__);
733 num_ret = ecore_x_window_prop_card32_list_get(win, ECORE_X_ATOM_NET_WM_ICON,
747 /* Check how many icons there are */
754 if ((p - data) > num_ret)
762 if ((p - data) == num_ret)
768 /* If the user doesn't want the icons, return */
775 /* Allocate memory */
776 *icon = malloc(icons * sizeof(Ecore_X_Icon));
783 /* Fetch the icons */
785 for (i = 0; i < icons; i++)
787 unsigned int *ps, *pd, *pe;
790 ((*icon)[i]).width = p[0];
791 ((*icon)[i]).height = p[1];
793 ((*icon)[i]).data = malloc(len * sizeof(unsigned int));
794 if (!((*icon)[i]).data)
797 free(((*icon)[--i]).data);
803 pd = ((*icon)[i]).data;
806 for (; ps < pe; ps++)
808 unsigned int r, g, b, a;
810 a = (*ps >> 24) & 0xff;
811 r = (((*ps >> 16) & 0xff) * a) / 255;
812 g = (((*ps >> 8) & 0xff) * a) / 255;
813 b = (((*ps) & 0xff) * a) / 255;
814 *pd = (a << 24) | (r << 16) | (g << 8) | (b);
826 ecore_x_netwm_icon_geometry_set(Ecore_X_Window win,
832 unsigned int geometry[4];
834 LOGFN(__FILE__, __LINE__, __FUNCTION__);
838 geometry[3] = height;
839 ecore_x_window_prop_card32_set(win,
840 ECORE_X_ATOM_NET_WM_ICON_GEOMETRY,
846 ecore_x_netwm_icon_geometry_get(Ecore_X_Window win,
853 unsigned int geometry[4];
855 LOGFN(__FILE__, __LINE__, __FUNCTION__);
856 ret = ecore_x_window_prop_card32_get(win,
857 ECORE_X_ATOM_NET_WM_ICON_GEOMETRY,
870 *width = geometry[2];
873 *height = geometry[3];
879 ecore_x_netwm_pid_set(Ecore_X_Window win,
884 LOGFN(__FILE__, __LINE__, __FUNCTION__);
886 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_PID,
891 ecore_x_netwm_pid_get(Ecore_X_Window win,
897 LOGFN(__FILE__, __LINE__, __FUNCTION__);
898 ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_PID,
903 return ret == 1 ? EINA_TRUE : EINA_FALSE;
907 ecore_x_netwm_handled_icons_set(Ecore_X_Window win)
909 LOGFN(__FILE__, __LINE__, __FUNCTION__);
910 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
915 ecore_x_netwm_handled_icons_get(Ecore_X_Window win)
918 LOGFN(__FILE__, __LINE__, __FUNCTION__);
919 ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
921 return ret == 0 ? EINA_TRUE : EINA_FALSE;
925 ecore_x_netwm_user_time_set(Ecore_X_Window win,
928 LOGFN(__FILE__, __LINE__, __FUNCTION__);
929 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_USER_TIME,
934 ecore_x_netwm_user_time_get(Ecore_X_Window win,
940 LOGFN(__FILE__, __LINE__, __FUNCTION__);
941 ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_USER_TIME,
946 return ret == 1 ? EINA_TRUE : EINA_FALSE;
950 _ecore_x_netwm_state_get(Ecore_X_Atom a)
952 if (a == ECORE_X_ATOM_NET_WM_STATE_MODAL)
953 return ECORE_X_WINDOW_STATE_MODAL;
954 else if (a == ECORE_X_ATOM_NET_WM_STATE_STICKY)
955 return ECORE_X_WINDOW_STATE_STICKY;
956 else if (a == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT)
957 return ECORE_X_WINDOW_STATE_MAXIMIZED_VERT;
958 else if (a == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ)
959 return ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ;
960 else if (a == ECORE_X_ATOM_NET_WM_STATE_SHADED)
961 return ECORE_X_WINDOW_STATE_SHADED;
962 else if (a == ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR)
963 return ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
964 else if (a == ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER)
965 return ECORE_X_WINDOW_STATE_SKIP_PAGER;
966 else if (a == ECORE_X_ATOM_NET_WM_STATE_HIDDEN)
967 return ECORE_X_WINDOW_STATE_HIDDEN;
968 else if (a == ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN)
969 return ECORE_X_WINDOW_STATE_FULLSCREEN;
970 else if (a == ECORE_X_ATOM_NET_WM_STATE_ABOVE)
971 return ECORE_X_WINDOW_STATE_ABOVE;
972 else if (a == ECORE_X_ATOM_NET_WM_STATE_BELOW)
973 return ECORE_X_WINDOW_STATE_BELOW;
974 else if (a == ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION)
975 return ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION;
977 return ECORE_X_WINDOW_STATE_UNKNOWN;
981 _ecore_x_netwm_state_atom_get(Ecore_X_Window_State s)
985 case ECORE_X_WINDOW_STATE_MODAL:
986 return ECORE_X_ATOM_NET_WM_STATE_MODAL;
988 case ECORE_X_WINDOW_STATE_STICKY:
989 return ECORE_X_ATOM_NET_WM_STATE_STICKY;
991 case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
992 return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT;
994 case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
995 return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ;
997 case ECORE_X_WINDOW_STATE_SHADED:
998 return ECORE_X_ATOM_NET_WM_STATE_SHADED;
1000 case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
1001 return ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR;
1003 case ECORE_X_WINDOW_STATE_SKIP_PAGER:
1004 return ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER;
1006 case ECORE_X_WINDOW_STATE_HIDDEN:
1007 return ECORE_X_ATOM_NET_WM_STATE_HIDDEN;
1009 case ECORE_X_WINDOW_STATE_FULLSCREEN:
1010 return ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN;
1012 case ECORE_X_WINDOW_STATE_ABOVE:
1013 return ECORE_X_ATOM_NET_WM_STATE_ABOVE;
1015 case ECORE_X_WINDOW_STATE_BELOW:
1016 return ECORE_X_ATOM_NET_WM_STATE_BELOW;
1018 case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
1019 return ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION;
1027 ecore_x_netwm_window_state_set(Ecore_X_Window win,
1028 Ecore_X_Window_State *state,
1034 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1037 ecore_x_window_prop_property_del(win, ECORE_X_ATOM_NET_WM_STATE);
1041 set = malloc(num * sizeof(Ecore_X_Atom));
1045 for (i = 0; i < num; i++)
1046 set[i] = _ecore_x_netwm_state_atom_get(state[i]);
1048 ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_STATE, set, num);
1054 ecore_x_netwm_window_state_get(Ecore_X_Window win,
1055 Ecore_X_Window_State **state,
1059 Ecore_X_Atom *atoms;
1061 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1068 num_ret = ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_STATE,
1075 *state = malloc(num_ret * sizeof(Ecore_X_Window_State));
1077 for (i = 0; i < num_ret; ++i)
1078 (*state)[i] = _ecore_x_netwm_state_get(atoms[i]);
1088 static Ecore_X_Window_Type
1089 _ecore_x_netwm_window_type_type_get(Ecore_X_Atom atom)
1091 if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP)
1092 return ECORE_X_WINDOW_TYPE_DESKTOP;
1093 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK)
1094 return ECORE_X_WINDOW_TYPE_DOCK;
1095 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR)
1096 return ECORE_X_WINDOW_TYPE_TOOLBAR;
1097 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU)
1098 return ECORE_X_WINDOW_TYPE_MENU;
1099 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY)
1100 return ECORE_X_WINDOW_TYPE_UTILITY;
1101 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH)
1102 return ECORE_X_WINDOW_TYPE_SPLASH;
1103 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG)
1104 return ECORE_X_WINDOW_TYPE_DIALOG;
1105 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL)
1106 return ECORE_X_WINDOW_TYPE_NORMAL;
1107 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU)
1108 return ECORE_X_WINDOW_TYPE_DROPDOWN_MENU;
1109 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU)
1110 return ECORE_X_WINDOW_TYPE_POPUP_MENU;
1111 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP)
1112 return ECORE_X_WINDOW_TYPE_TOOLTIP;
1113 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION)
1114 return ECORE_X_WINDOW_TYPE_NOTIFICATION;
1115 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO)
1116 return ECORE_X_WINDOW_TYPE_COMBO;
1117 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND)
1118 return ECORE_X_WINDOW_TYPE_DND;
1120 return ECORE_X_WINDOW_TYPE_UNKNOWN;
1124 _ecore_x_netwm_window_type_atom_get(Ecore_X_Window_Type type)
1128 case ECORE_X_WINDOW_TYPE_DESKTOP:
1129 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP;
1131 case ECORE_X_WINDOW_TYPE_DOCK:
1132 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK;
1134 case ECORE_X_WINDOW_TYPE_TOOLBAR:
1135 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR;
1137 case ECORE_X_WINDOW_TYPE_MENU:
1138 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU;
1140 case ECORE_X_WINDOW_TYPE_UTILITY:
1141 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY;
1143 case ECORE_X_WINDOW_TYPE_SPLASH:
1144 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH;
1146 case ECORE_X_WINDOW_TYPE_DIALOG:
1147 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG;
1149 case ECORE_X_WINDOW_TYPE_NORMAL:
1150 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL;
1152 case ECORE_X_WINDOW_TYPE_DROPDOWN_MENU:
1153 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU;
1155 case ECORE_X_WINDOW_TYPE_POPUP_MENU:
1156 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU;
1158 case ECORE_X_WINDOW_TYPE_TOOLTIP:
1159 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP;
1161 case ECORE_X_WINDOW_TYPE_NOTIFICATION:
1162 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION;
1164 case ECORE_X_WINDOW_TYPE_COMBO:
1165 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO;
1167 case ECORE_X_WINDOW_TYPE_DND:
1168 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND;
1176 * FIXME: We should set WM_TRANSIENT_FOR if type is ECORE_X_WINDOW_TYPE_TOOLBAR
1177 * , ECORE_X_WINDOW_TYPE_MENU or ECORE_X_WINDOW_TYPE_DIALOG
1180 ecore_x_netwm_window_type_set(Ecore_X_Window win,
1181 Ecore_X_Window_Type type)
1185 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1186 atom = _ecore_x_netwm_window_type_atom_get(type);
1187 ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
1191 /* FIXME: Maybe return 0 on some conditions? */
1193 ecore_x_netwm_window_type_get(Ecore_X_Window win,
1194 Ecore_X_Window_Type *type)
1197 Ecore_X_Atom *atoms = NULL;
1199 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1201 *type = ECORE_X_WINDOW_TYPE_NORMAL;
1203 num = ecore_x_window_prop_atom_list_get(win,
1204 ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
1206 if ((type) && (num >= 1) && (atoms))
1207 *type = _ecore_x_netwm_window_type_type_get(atoms[0]);
1217 ecore_x_netwm_window_types_get(Ecore_X_Window win,
1218 Ecore_X_Window_Type **types)
1221 Ecore_X_Atom *atoms = NULL;
1222 Ecore_X_Window_Type *atoms2 = NULL;
1224 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1228 num = ecore_x_window_prop_atom_list_get(win,
1229 ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
1231 if ((num <= 0) || (!atoms))
1239 atoms2 = malloc(num * sizeof(Ecore_X_Window_Type));
1242 if (atoms) free(atoms);
1246 for (i = 0; i < num; i++)
1247 atoms2[i] = _ecore_x_netwm_window_type_type_get(atoms[i]);
1258 _ecore_x_netwm_action_atom_get(Ecore_X_Action action)
1262 case ECORE_X_ACTION_MOVE:
1263 return ECORE_X_ATOM_NET_WM_ACTION_MOVE;
1265 case ECORE_X_ACTION_RESIZE:
1266 return ECORE_X_ATOM_NET_WM_ACTION_RESIZE;
1268 case ECORE_X_ACTION_MINIMIZE:
1269 return ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE;
1271 case ECORE_X_ACTION_SHADE:
1272 return ECORE_X_ATOM_NET_WM_ACTION_SHADE;
1274 case ECORE_X_ACTION_STICK:
1275 return ECORE_X_ATOM_NET_WM_ACTION_STICK;
1277 case ECORE_X_ACTION_MAXIMIZE_HORZ:
1278 return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ;
1280 case ECORE_X_ACTION_MAXIMIZE_VERT:
1281 return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT;
1283 case ECORE_X_ACTION_FULLSCREEN:
1284 return ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN;
1286 case ECORE_X_ACTION_CHANGE_DESKTOP:
1287 return ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP;
1289 case ECORE_X_ACTION_CLOSE:
1290 return ECORE_X_ATOM_NET_WM_ACTION_CLOSE;
1292 case ECORE_X_ACTION_ABOVE:
1293 return ECORE_X_ATOM_NET_WM_ACTION_ABOVE;
1295 case ECORE_X_ACTION_BELOW:
1296 return ECORE_X_ATOM_NET_WM_ACTION_BELOW;
1303 /* FIXME: Get complete list */
1305 ecore_x_netwm_allowed_action_isset(Ecore_X_Window win,
1306 Ecore_X_Action action)
1309 Ecore_X_Atom *atoms, atom;
1310 Eina_Bool ret = EINA_FALSE;
1312 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1313 num = ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
1318 atom = _ecore_x_netwm_action_atom_get(action);
1320 for (i = 0; i < num; ++i)
1322 if (atom == atoms[i])
1333 /* FIXME: Set complete list */
1335 ecore_x_netwm_allowed_action_set(Ecore_X_Window win,
1336 Ecore_X_Action *action,
1342 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1345 ecore_x_window_prop_property_del(win,
1346 ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS);
1350 set = malloc(num * sizeof(Ecore_X_Atom));
1354 for (i = 0; i < num; i++)
1355 set[i] = _ecore_x_netwm_action_atom_get(action[i]);
1357 ecore_x_window_prop_atom_set(win,
1358 ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
1366 ecore_x_netwm_allowed_action_get(Ecore_X_Window win,
1367 Ecore_X_Action **action,
1371 Ecore_X_Atom *atoms;
1373 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1380 num_ret = ecore_x_window_prop_atom_list_get(
1382 ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
1389 *action = malloc(num_ret * sizeof(Ecore_X_Action));
1391 for (i = 0; i < num_ret; ++i)
1392 (*action)[i] = _ecore_x_netwm_action_atom_get(atoms[i]);
1403 ecore_x_netwm_opacity_set(Ecore_X_Window win,
1404 unsigned int opacity)
1406 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1407 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
1412 ecore_x_netwm_opacity_get(Ecore_X_Window win,
1413 unsigned int *opacity)
1418 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1419 ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
1424 return ret == 1 ? EINA_TRUE : EINA_FALSE;
1428 ecore_x_netwm_frame_size_set(Ecore_X_Window win,
1434 unsigned int frames[4];
1436 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1441 ecore_x_window_prop_card32_set(win,
1442 ECORE_X_ATOM_NET_FRAME_EXTENTS,
1448 ecore_x_netwm_frame_size_get(Ecore_X_Window win,
1455 unsigned int frames[4];
1457 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1458 ret = ecore_x_window_prop_card32_get(win,
1459 ECORE_X_ATOM_NET_FRAME_EXTENTS,
1481 ecore_x_netwm_sync_counter_get(Ecore_X_Window win,
1482 Ecore_X_Sync_Counter *counter)
1487 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1488 ret = ecore_x_window_prop_card32_get(
1490 ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER,
1497 return ret == 1 ? EINA_TRUE : EINA_FALSE;
1501 ecore_x_netwm_ping_send(Ecore_X_Window win)
1508 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1509 xev.xclient.type = ClientMessage;
1510 xev.xclient.display = _ecore_x_disp;
1511 xev.xclient.window = win;
1512 xev.xclient.message_type = ECORE_X_ATOM_WM_PROTOCOLS;
1513 xev.xclient.format = 32;
1514 xev.xclient.data.l[0] = ECORE_X_ATOM_NET_WM_PING;
1515 xev.xclient.data.l[1] = _ecore_x_event_last_time;
1516 xev.xclient.data.l[2] = win;
1517 xev.xclient.data.l[3] = 0;
1518 xev.xclient.data.l[4] = 0;
1520 XSendEvent(_ecore_x_disp, win, False, NoEventMask, &xev);
1521 if (_ecore_xlib_sync) ecore_x_sync();
1525 ecore_x_netwm_sync_request_send(Ecore_X_Window win,
1526 unsigned int serial)
1534 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1535 XSyncIntToValue(&value, (int)serial);
1537 xev.xclient.type = ClientMessage;
1538 xev.xclient.display = _ecore_x_disp;
1539 xev.xclient.window = win;
1540 xev.xclient.message_type = ECORE_X_ATOM_WM_PROTOCOLS;
1541 xev.xclient.format = 32;
1542 xev.xclient.data.l[0] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
1543 xev.xclient.data.l[1] = _ecore_x_event_last_time;
1544 xev.xclient.data.l[2] = XSyncValueLow32(value);
1545 xev.xclient.data.l[3] = XSyncValueHigh32(value);
1546 xev.xclient.data.l[4] = 0;
1548 XSendEvent(_ecore_x_disp, win, False, NoEventMask, &xev);
1549 if (_ecore_xlib_sync) ecore_x_sync();
1553 ecore_x_netwm_state_request_send(Ecore_X_Window win,
1554 Ecore_X_Window root,
1555 Ecore_X_Window_State s1,
1556 Ecore_X_Window_State s2,
1564 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1566 root = DefaultRootWindow(_ecore_x_disp);
1568 xev.xclient.type = ClientMessage;
1569 xev.xclient.serial = 0;
1570 xev.xclient.send_event = True;
1571 xev.xclient.display = _ecore_x_disp;
1572 xev.xclient.window = win;
1573 xev.xclient.format = 32;
1574 xev.xclient.message_type = ECORE_X_ATOM_NET_WM_STATE;
1575 xev.xclient.data.l[0] = !!set;
1576 xev.xclient.data.l[1] = _ecore_x_netwm_state_atom_get(s1);
1577 xev.xclient.data.l[2] = _ecore_x_netwm_state_atom_get(s2);
1578 /* 1 == normal client, if someone wants to use this
1579 * function in a pager, this should be 2 */
1580 xev.xclient.data.l[3] = 1;
1581 xev.xclient.data.l[4] = 0;
1583 XSendEvent(_ecore_x_disp, root, False,
1584 SubstructureNotifyMask | SubstructureRedirectMask, &xev);
1585 if (_ecore_xlib_sync) ecore_x_sync();
1589 ecore_x_netwm_desktop_request_send(Ecore_X_Window win,
1590 Ecore_X_Window root,
1591 unsigned int desktop)
1598 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1600 root = DefaultRootWindow(_ecore_x_disp);
1602 xev.xclient.type = ClientMessage;
1603 xev.xclient.serial = 0;
1604 xev.xclient.send_event = True;
1605 xev.xclient.display = _ecore_x_disp;
1606 xev.xclient.window = win;
1607 xev.xclient.format = 32;
1608 xev.xclient.message_type = ECORE_X_ATOM_NET_WM_DESKTOP;
1609 xev.xclient.data.l[0] = desktop;
1611 XSendEvent(_ecore_x_disp, root, False,
1612 SubstructureNotifyMask | SubstructureRedirectMask, &xev);
1613 if (_ecore_xlib_sync) ecore_x_sync();
1617 ecore_x_netwm_moveresize_request_send(Ecore_X_Window win,
1620 Ecore_X_Netwm_Direction direction,
1621 unsigned int button)
1628 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1629 xev.xclient.window = win;
1630 xev.xclient.type = ClientMessage;
1631 xev.xclient.message_type = ECORE_X_ATOM_NET_WM_MOVERESIZE;
1632 xev.xclient.format = 32;
1633 xev.xclient.data.l[0] = x;
1634 xev.xclient.data.l[1] = y;
1635 xev.xclient.data.l[2] = direction;
1636 xev.xclient.data.l[3] = button;
1637 xev.xclient.data.l[4] = 1;
1639 XSendEvent(_ecore_x_disp, win, False,
1640 SubstructureNotifyMask | SubstructureRedirectMask, &xev);
1641 if (_ecore_xlib_sync) ecore_x_sync();
1645 _ecore_x_netwm_startup_info_begin(Ecore_X_Window win EINA_UNUSED,
1646 char *data EINA_UNUSED)
1649 Ecore_X_Startup_Info *info;
1650 unsigned char *exists = 0;
1655 info = eina_hash_find(startup_info, (void *)win);
1659 WRN("Already got info for win: 0x%x", win);
1660 _ecore_x_netwm_startup_info_free(info);
1663 info = calloc(1, sizeof(Ecore_X_Startup_Info));
1669 info->buffer_size = 161;
1670 info->buffer = calloc(info->buffer_size, sizeof(char));
1673 _ecore_x_netwm_startup_info_free(info);
1677 memcpy(info->buffer, data, 20);
1679 info->buffer[info->length] = 0;
1681 eina_hash_modify(startup_info, (void *)info->win, info);
1683 eina_hash_add(startup_info, (void *)info->win, info);
1685 if (strlen(info->buffer) != 20)
1686 /* We have a '\0' in there, the message is done */
1687 _ecore_x_netwm_startup_info_process(info);
1694 _ecore_x_netwm_startup_info(Ecore_X_Window win EINA_UNUSED,
1695 char *data EINA_UNUSED)
1698 Ecore_X_Startup_Info *info;
1704 info = eina_hash_find(startup_info, (void *)win);
1708 if ((info->length + 20) > info->buffer_size)
1710 info->buffer_size += 160;
1711 info->buffer = realloc(info->buffer, info->buffer_size * sizeof(char));
1714 eina_hash_del(startup_info, (void *)info->win);
1715 _ecore_x_netwm_startup_info_free(info);
1720 memcpy(info->buffer + info->length, data, 20);
1721 p = info->buffer + info->length;
1723 info->buffer[info->length] = 0;
1724 if (strlen(p) != 20)
1725 /* We have a '\0' in there, the message is done */
1726 _ecore_x_netwm_startup_info_process(info);
1733 * Set UTF-8 string property
1736 _ecore_x_window_prop_string_utf8_set(Ecore_X_Window win,
1740 XChangeProperty(_ecore_x_disp, win, atom, ECORE_X_ATOM_UTF8_STRING, 8,
1741 PropModeReplace, (unsigned char *)str, strlen(str));
1742 if (_ecore_xlib_sync) ecore_x_sync();
1746 * Get UTF-8 string property
1749 _ecore_x_window_prop_string_utf8_get(Ecore_X_Window win,
1753 unsigned char *prop_ret;
1755 unsigned long bytes_after, num_ret;
1760 XGetWindowProperty(_ecore_x_disp, win, atom, 0, 0x7fffffff, False,
1761 ECORE_X_ATOM_UTF8_STRING, &type_ret,
1762 &format_ret, &num_ret, &bytes_after, &prop_ret);
1763 if (_ecore_xlib_sync) ecore_x_sync();
1764 if (prop_ret && num_ret > 0 && format_ret == 8)
1766 str = malloc(num_ret + 1);
1769 memcpy(str, prop_ret, num_ret);
1770 str[num_ret] = '\0';
1782 * Process startup info
1785 _ecore_x_netwm_startup_info_process(Ecore_X_Startup_Info *info)
1787 Ecore_X_Event_Startup_Sequence *e;
1791 p = strchr(info->buffer, ':');
1794 eina_hash_del(startup_info, (void *)info->win);
1795 _ecore_x_netwm_startup_info_free(info);
1800 if (!strcmp(info->buffer, "new"))
1803 event = ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE;
1805 event = ECORE_X_EVENT_STARTUP_SEQUENCE_NEW;
1809 else if (!strcmp(info->buffer, "change"))
1810 event = ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE;
1811 else if (!strcmp(info->buffer, "remove"))
1812 event = ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE;
1815 eina_hash_del(startup_info, (void *)info->win);
1816 _ecore_x_netwm_startup_info_free(info);
1822 if (!_ecore_x_netwm_startup_info_parse(info, p))
1824 eina_hash_del(startup_info, (void *)info->win);
1825 _ecore_x_netwm_startup_info_free(info);
1831 e = calloc(1, sizeof(Ecore_X_Event_Startup_Sequence));
1834 eina_hash_del(startup_info, (void *)info->win);
1835 _ecore_x_netwm_startup_info_free(info);
1840 ecore_event_add(event, e, NULL, NULL);
1843 if (event == ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE)
1845 eina_hash_del(startup_info, (void *)info->win);
1846 _ecore_x_netwm_startup_info_free(info);
1850 /* Discard buffer */
1852 info->buffer[0] = 0;
1859 * Parse startup info
1862 _ecore_x_netwm_startup_info_parse(Ecore_X_Startup_Info *info,
1867 int in_quot_sing, in_quot_dbl, escaped;
1873 while (*data == ' ')
1877 data = strchr(key, '=');
1892 if ((pp - value) >= 1024)
1901 else if (in_quot_sing)
1905 else if (*p == '\'')
1913 else if (in_quot_dbl)
1917 else if (*p == '\"')
1929 else if (*p == '\'')
1931 else if (*p == '\"')
1944 if ((in_quot_dbl) || (in_quot_sing))
1951 if (!strcmp(key, "ID"))
1953 if ((info->id) && (strcmp(info->id, value)))
1956 info->id = strdup(value);
1957 p = strstr(value, "_TIME");
1959 info->timestamp = atoi(p + 5);
1961 else if (!strcmp(key, "NAME"))
1966 info->name = strdup(value);
1968 else if (!strcmp(key, "SCREEN"))
1969 info->screen = atoi(value);
1970 else if (!strcmp(key, "BIN"))
1975 info->bin = strdup(value);
1977 else if (!strcmp(key, "ICON"))
1982 info->icon = strdup(value);
1984 else if (!strcmp(key, "DESKTOP"))
1985 info->desktop = atoi(value);
1986 else if (!strcmp(key, "TIMESTAMP"))
1988 if (!info->timestamp)
1989 info->timestamp = atoi(value);
1991 else if (!strcmp(key, "DESCRIPTION"))
1993 if (info->description)
1994 free(info->description);
1996 info->description = strdup(value);
1998 else if (!strcmp(key, "WMCLASS"))
2001 free(info->wmclass);
2003 info->wmclass = strdup(value);
2005 else if (!strcmp(key, "SILENT"))
2006 info->silent = atoi(value);
2008 ERR("Ecore X Sequence, Unknown: %s=%s", key, value);
2019 * Free startup info struct
2022 _ecore_x_netwm_startup_info_free(void *data)
2024 Ecore_X_Startup_Info *info;
2045 if (info->description)
2046 free(info->description);
2049 free(info->wmclass);
2055 * Is screen composited?
2058 ecore_x_screen_is_composited(int screen)
2064 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2065 snprintf(buf, sizeof(buf), "_NET_WM_CM_S%i", screen);
2066 atom = XInternAtom(_ecore_x_disp, buf, True);
2067 if (atom == None) return EINA_FALSE;
2068 win = XGetSelectionOwner(_ecore_x_disp, atom);
2069 if (_ecore_xlib_sync) ecore_x_sync();
2070 return (win != None) ? EINA_TRUE : EINA_FALSE;
2074 ecore_x_screen_is_composited_set(int screen,
2080 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2081 snprintf(buf, sizeof(buf), "_NET_WM_CM_S%i", screen);
2082 atom = XInternAtom(_ecore_x_disp, buf, False);
2083 if (atom == None) return;
2084 XSetSelectionOwner(_ecore_x_disp, atom, win, _ecore_x_event_last_time);
2085 if (_ecore_xlib_sync) ecore_x_sync();