1 #include "ecore_xcb_private.h"
3 /* local function prototypes */
4 /* static void _ecore_xcb_netwm_startup_info_free(void *data); */
5 static Ecore_X_Atom _ecore_xcb_netwm_window_type_atom_get(Ecore_X_Window_Type type);
6 static Ecore_X_Window_Type _ecore_xcb_netwm_window_type_type_get(Ecore_X_Atom atom);
7 static Ecore_X_Atom _ecore_xcb_netwm_window_state_atom_get(Ecore_X_Window_State state);
8 static Ecore_X_Atom _ecore_xcb_netwm_action_atom_get(Ecore_X_Action action);
11 //static Eina_Hash *_startup_info = NULL;
13 /* local structures */
14 typedef struct _Ecore_Xcb_Startup_Info Ecore_Xcb_Startup_Info;
15 struct _Ecore_Xcb_Startup_Info
22 /* sequence info fields */
26 int desktop, timestamp;
27 char *description, *wmclass;
32 ecore_x_netwm_init(void)
34 LOGFN(__FILE__, __LINE__, __FUNCTION__);
37 // eina_hash_string_superfast_new(_ecore_xcb_netwm_startup_info_free);
41 ecore_x_netwm_shutdown(void)
43 LOGFN(__FILE__, __LINE__, __FUNCTION__);
45 // if (_startup_info) eina_hash_free(_startup_info);
46 // _startup_info = NULL;
50 ecore_x_netwm_pid_get(Ecore_X_Window win,
55 LOGFN(__FILE__, __LINE__, __FUNCTION__);
57 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_PID, &tmp, 1))
66 ecore_x_netwm_pid_set(Ecore_X_Window win,
71 LOGFN(__FILE__, __LINE__, __FUNCTION__);
74 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_PID, &tmp, 1);
78 ecore_x_netwm_window_type_get(Ecore_X_Window win,
79 Ecore_X_Window_Type *type)
84 LOGFN(__FILE__, __LINE__, __FUNCTION__);
86 if (type) *type = ECORE_X_WINDOW_TYPE_NORMAL;
89 ecore_x_window_prop_atom_list_get(win,
90 ECORE_X_ATOM_NET_WM_WINDOW_TYPE, &atoms);
91 if ((type) && (num >= 1) && (atoms))
92 *type = _ecore_xcb_netwm_window_type_type_get(atoms[0]);
94 if (atoms) free(atoms);
96 if (num >= 1) return EINA_TRUE;
101 ecore_x_netwm_window_type_set(Ecore_X_Window win,
102 Ecore_X_Window_Type type)
106 LOGFN(__FILE__, __LINE__, __FUNCTION__);
108 atom = _ecore_xcb_netwm_window_type_atom_get(type);
109 ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE, &atom, 1);
113 ecore_x_netwm_window_types_get(Ecore_X_Window win,
114 Ecore_X_Window_Type **types)
117 Ecore_X_Atom *atoms = NULL;
118 Ecore_X_Window_Type *atoms2 = NULL;
120 LOGFN(__FILE__, __LINE__, __FUNCTION__);
122 if (types) *types = NULL;
124 ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
126 if ((num <= 0) || (!atoms))
128 if (atoms) free(atoms);
132 atoms2 = malloc(num * sizeof(Ecore_X_Window_Type));
135 if (atoms) free(atoms);
139 for (i = 0; i < num; i++)
140 atoms2[i] = _ecore_xcb_netwm_window_type_type_get(atoms[i]);
141 if (atoms) free(atoms);
152 ecore_x_netwm_name_get(Ecore_X_Window win,
155 LOGFN(__FILE__, __LINE__, __FUNCTION__);
158 *name = ecore_x_window_prop_string_get(win, ECORE_X_ATOM_NET_WM_NAME);
163 ecore_x_netwm_name_set(Ecore_X_Window win,
166 LOGFN(__FILE__, __LINE__, __FUNCTION__);
168 ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_WM_NAME, name);
172 ecore_x_netwm_opacity_set(Ecore_X_Window win,
173 unsigned int opacity)
175 LOGFN(__FILE__, __LINE__, __FUNCTION__);
177 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
182 ecore_x_netwm_opacity_get(Ecore_X_Window win,
183 unsigned int *opacity)
185 unsigned int tmp = 0;
187 LOGFN(__FILE__, __LINE__, __FUNCTION__);
189 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
193 if (opacity) *opacity = tmp;
199 ecore_x_netwm_wm_identify(Ecore_X_Window root,
200 Ecore_X_Window check,
203 LOGFN(__FILE__, __LINE__, __FUNCTION__);
205 ecore_x_window_prop_window_set(check, ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK,
207 ecore_x_window_prop_string_set(check, ECORE_X_ATOM_NET_WM_NAME, wm_name);
208 ecore_x_window_prop_string_set(root, ECORE_X_ATOM_NET_WM_NAME, wm_name);
209 ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK,
214 ecore_x_netwm_supported_set(Ecore_X_Window root,
215 Ecore_X_Atom *supported,
218 LOGFN(__FILE__, __LINE__, __FUNCTION__);
220 ecore_x_window_prop_atom_set(root, ECORE_X_ATOM_NET_SUPPORTED,
225 ecore_x_netwm_supported_get(Ecore_X_Window root,
226 Ecore_X_Atom **supported,
231 LOGFN(__FILE__, __LINE__, __FUNCTION__);
234 if (supported) *supported = NULL;
237 ecore_x_window_prop_atom_list_get(root, ECORE_X_ATOM_NET_SUPPORTED,
239 if (num_ret <= 0) return EINA_FALSE;
240 if (num) *num = num_ret;
246 ecore_x_netwm_desk_count_set(Ecore_X_Window root,
247 unsigned int n_desks)
249 LOGFN(__FILE__, __LINE__, __FUNCTION__);
251 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS,
256 ecore_x_netwm_desk_roots_set(Ecore_X_Window root,
257 Ecore_X_Window *vroots,
258 unsigned int n_desks)
260 LOGFN(__FILE__, __LINE__, __FUNCTION__);
262 ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_VIRTUAL_ROOTS,
267 ecore_x_netwm_desk_names_set(Ecore_X_Window root,
269 unsigned int n_desks)
271 char ss[32], *buf = NULL, *t = NULL;
273 uint32_t len = 0, i, l;
275 LOGFN(__FILE__, __LINE__, __FUNCTION__);
278 for (i = 0; i < n_desks; i++)
280 s = ((names) ? names[i] : NULL);
283 /* Default to "Desk-<number>" */
284 sprintf(ss, "Desk-%d", i);
289 t = realloc(buf, len + 1);
293 memcpy(buf + len, s, l);
298 xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, root,
299 ECORE_X_ATOM_NET_DESKTOP_NAMES,
300 ECORE_X_ATOM_UTF8_STRING, 8, len, (const void *)buf);
306 ecore_x_netwm_desk_size_set(Ecore_X_Window root,
312 LOGFN(__FILE__, __LINE__, __FUNCTION__);
316 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_GEOMETRY,
321 ecore_x_netwm_desk_viewports_set(Ecore_X_Window root,
322 unsigned int *origins,
323 unsigned int n_desks)
325 LOGFN(__FILE__, __LINE__, __FUNCTION__);
327 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_VIEWPORT,
328 origins, (2 * n_desks));
332 ecore_x_netwm_desk_layout_set(Ecore_X_Window root,
338 unsigned int layout[4];
340 LOGFN(__FILE__, __LINE__, __FUNCTION__);
342 layout[0] = orientation;
345 layout[3] = starting_corner;
346 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_LAYOUT,
351 ecore_x_netwm_desk_workareas_set(Ecore_X_Window root,
353 unsigned int n_desks)
355 LOGFN(__FILE__, __LINE__, __FUNCTION__);
357 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_WORKAREA, areas,
362 ecore_x_netwm_desk_workareas_get(Ecore_X_Window root, unsigned int *n_desks)
365 unsigned int *areas = NULL;
367 if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
369 ret = ecore_x_window_prop_card32_list_get(root, ECORE_X_ATOM_NET_WORKAREA,
373 if (n_desks) *n_desks = 0;
376 if (n_desks) *n_desks = ret / 4;
381 ecore_x_netwm_desk_current_set(Ecore_X_Window root,
384 LOGFN(__FILE__, __LINE__, __FUNCTION__);
386 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_CURRENT_DESKTOP,
391 ecore_x_netwm_showing_desktop_set(Ecore_X_Window root,
394 unsigned int val = 0;
396 LOGFN(__FILE__, __LINE__, __FUNCTION__);
398 val = ((on) ? 1 : 0);
399 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_SHOWING_DESKTOP,
404 ecore_x_netwm_startup_id_get(Ecore_X_Window win,
407 LOGFN(__FILE__, __LINE__, __FUNCTION__);
412 ecore_x_window_prop_string_get(win, ECORE_X_ATOM_NET_STARTUP_ID);
419 ecore_x_netwm_startup_id_set(Ecore_X_Window win,
422 LOGFN(__FILE__, __LINE__, __FUNCTION__);
424 ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_STARTUP_ID, id);
428 ecore_x_netwm_state_request_send(Ecore_X_Window win,
430 Ecore_X_Window_State s1,
431 Ecore_X_Window_State s2,
434 xcb_client_message_event_t ev;
436 LOGFN(__FILE__, __LINE__, __FUNCTION__);
440 if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
442 ev.response_type = XCB_CLIENT_MESSAGE;
445 ev.type = ECORE_X_ATOM_NET_WM_STATE;
446 ev.data.data32[0] = !!set;
447 ev.data.data32[1] = _ecore_xcb_netwm_window_state_atom_get(s1);
448 ev.data.data32[2] = _ecore_xcb_netwm_window_state_atom_get(s2);
449 /* 1 == normal client, if used in a pager this should be 2 */
450 ev.data.data32[3] = 1;
451 ev.data.data32[4] = 0;
453 xcb_send_event(_ecore_xcb_conn, 0, root,
454 (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
455 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
460 ecore_x_netwm_window_state_set(Ecore_X_Window win,
461 Ecore_X_Window_State *state,
467 LOGFN(__FILE__, __LINE__, __FUNCTION__);
471 ecore_x_window_prop_property_del(win, ECORE_X_ATOM_NET_WM_STATE);
475 set = malloc(num * sizeof(Ecore_X_Atom));
478 for (i = 0; i < num; i++)
479 set[i] = _ecore_xcb_netwm_window_state_atom_get(state[i]);
481 ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_STATE, set, num);
486 ecore_x_netwm_window_state_get(Ecore_X_Window win,
487 Ecore_X_Window_State **state,
493 LOGFN(__FILE__, __LINE__, __FUNCTION__);
496 if (state) *state = NULL;
499 ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_STATE, &atoms);
501 if (ret <= 0) return EINA_FALSE;
505 *state = malloc(ret * sizeof(Ecore_X_Window_State));
510 for (i = 0; i < ret; i++)
511 (*state)[i] = _ecore_xcb_netwm_window_state_get(atoms[i]);
522 ecore_x_netwm_client_active_set(Ecore_X_Window root,
525 LOGFN(__FILE__, __LINE__, __FUNCTION__);
527 ecore_x_window_prop_window_set(root,
528 ECORE_X_ATOM_NET_ACTIVE_WINDOW, &win, 1);
532 ecore_x_netwm_client_active_request(Ecore_X_Window root,
535 Ecore_X_Window current_win)
537 xcb_client_message_event_t ev;
539 LOGFN(__FILE__, __LINE__, __FUNCTION__);
542 if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
544 ev.response_type = XCB_CLIENT_MESSAGE;
547 ev.type = ECORE_X_ATOM_NET_ACTIVE_WINDOW;
548 ev.data.data32[0] = type;
549 ev.data.data32[1] = XCB_CURRENT_TIME;
550 ev.data.data32[2] = current_win;
551 ev.data.data32[3] = 0;
552 ev.data.data32[4] = 0;
554 xcb_send_event(_ecore_xcb_conn, 0, root,
555 (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
556 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
561 ecore_x_netwm_client_list_set(Ecore_X_Window root,
562 Ecore_X_Window *p_clients,
563 unsigned int n_clients)
565 LOGFN(__FILE__, __LINE__, __FUNCTION__);
567 ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_CLIENT_LIST,
568 p_clients, n_clients);
572 ecore_x_netwm_client_list_stacking_set(Ecore_X_Window root,
573 Ecore_X_Window *p_clients,
574 unsigned int n_clients)
576 LOGFN(__FILE__, __LINE__, __FUNCTION__);
578 ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_CLIENT_LIST_STACKING,
579 p_clients, n_clients);
583 ecore_x_screen_is_composited(int screen)
586 xcb_get_selection_owner_cookie_t ocookie;
587 xcb_get_selection_owner_reply_t *oreply;
589 static Ecore_X_Atom atom = XCB_NONE;
591 LOGFN(__FILE__, __LINE__, __FUNCTION__);
594 snprintf(buff, sizeof(buff), "_NET_WM_CM_S%i", screen);
596 if (atom == XCB_NONE)
598 xcb_intern_atom_cookie_t acookie;
599 xcb_intern_atom_reply_t *areply;
602 xcb_intern_atom_unchecked(_ecore_xcb_conn, 0, strlen(buff), buff);
603 areply = xcb_intern_atom_reply(_ecore_xcb_conn, acookie, NULL);
604 if (!areply) return EINA_FALSE;
608 if (atom == XCB_NONE) return EINA_FALSE;
610 ocookie = xcb_get_selection_owner_unchecked(_ecore_xcb_conn, atom);
611 oreply = xcb_get_selection_owner_reply(_ecore_xcb_conn, ocookie, NULL);
612 if (!oreply) return EINA_FALSE;
616 return (win != XCB_NONE) ? EINA_TRUE : EINA_FALSE;
620 ecore_x_screen_is_composited_set(int screen,
623 static Ecore_X_Atom atom = XCB_NONE;
626 LOGFN(__FILE__, __LINE__, __FUNCTION__);
629 snprintf(buff, sizeof(buff), "_NET_WM_CM_S%i", screen);
630 if (atom == XCB_NONE)
632 xcb_intern_atom_cookie_t acookie;
633 xcb_intern_atom_reply_t *areply;
636 xcb_intern_atom_unchecked(_ecore_xcb_conn, 0, strlen(buff), buff);
637 areply = xcb_intern_atom_reply(_ecore_xcb_conn, acookie, NULL);
642 if (atom == XCB_NONE) return;
643 xcb_set_selection_owner(_ecore_xcb_conn, win, atom,
644 _ecore_xcb_events_last_time_get());
648 ecore_x_netwm_ping_send(Ecore_X_Window win)
650 xcb_client_message_event_t ev;
652 LOGFN(__FILE__, __LINE__, __FUNCTION__);
657 ev.response_type = XCB_CLIENT_MESSAGE;
660 ev.type = ECORE_X_ATOM_WM_PROTOCOLS;
661 ev.data.data32[0] = ECORE_X_ATOM_NET_WM_PING;
662 ev.data.data32[1] = ecore_x_current_time_get();
663 ev.data.data32[2] = win;
664 ev.data.data32[3] = 0;
665 ev.data.data32[4] = 0;
667 xcb_send_event(_ecore_xcb_conn, 0, win,
668 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
673 ecore_x_netwm_frame_size_set(Ecore_X_Window win,
681 LOGFN(__FILE__, __LINE__, __FUNCTION__);
687 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_FRAME_EXTENTS,
692 ecore_x_netwm_frame_size_get(Ecore_X_Window win,
699 unsigned int frames[4];
701 LOGFN(__FILE__, __LINE__, __FUNCTION__);
703 ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_FRAME_EXTENTS,
705 if (ret != 4) return EINA_FALSE;
707 if (fl) *fl = frames[0];
708 if (fr) *fr = frames[1];
709 if (ft) *ft = frames[2];
710 if (fb) *fb = frames[3];
716 ecore_x_netwm_sync_request_send(Ecore_X_Window win,
719 xcb_client_message_event_t ev;
721 LOGFN(__FILE__, __LINE__, __FUNCTION__);
726 /* FIXME: Maybe need XSyncIntToValue ?? */
727 memset(&ev, 0, sizeof(xcb_client_message_event_t));
729 ev.response_type = XCB_CLIENT_MESSAGE;
732 ev.type = ECORE_X_ATOM_WM_PROTOCOLS;
733 ev.data.data32[0] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
734 ev.data.data32[1] = _ecore_xcb_events_last_time_get();
735 ev.data.data32[2] = serial;
736 ev.data.data32[3] = 0;
737 ev.data.data32[4] = 0;
739 xcb_send_event(_ecore_xcb_conn, 0, win,
740 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
745 ecore_x_netwm_desktop_set(Ecore_X_Window win,
748 LOGFN(__FILE__, __LINE__, __FUNCTION__);
750 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_DESKTOP, &desk, 1);
754 ecore_x_netwm_desktop_get(Ecore_X_Window win,
757 unsigned int tmp = 0;
759 LOGFN(__FILE__, __LINE__, __FUNCTION__);
761 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_DESKTOP,
765 if (desk) *desk = tmp;
771 ecore_x_netwm_desktop_request_send(Ecore_X_Window win,
773 unsigned int desktop)
775 xcb_client_message_event_t ev;
777 LOGFN(__FILE__, __LINE__, __FUNCTION__);
780 if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
782 memset(&ev, 0, sizeof(xcb_client_message_event_t));
784 ev.response_type = XCB_CLIENT_MESSAGE;
787 ev.type = ECORE_X_ATOM_NET_WM_DESKTOP;
788 ev.data.data32[0] = desktop;
790 xcb_send_event(_ecore_xcb_conn, 0, root,
791 (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
792 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
797 ecore_x_netwm_moveresize_request_send(Ecore_X_Window win,
800 Ecore_X_Netwm_Direction direction,
803 xcb_client_message_event_t ev;
805 LOGFN(__FILE__, __LINE__, __FUNCTION__);
808 memset(&ev, 0, sizeof(xcb_client_message_event_t));
810 ev.response_type = XCB_CLIENT_MESSAGE;
813 ev.type = ECORE_X_ATOM_NET_WM_MOVERESIZE;
814 ev.data.data32[0] = x;
815 ev.data.data32[1] = y;
816 ev.data.data32[2] = direction;
817 ev.data.data32[3] = button;
818 ev.data.data32[4] = 1;
820 xcb_send_event(_ecore_xcb_conn, 0, win,
821 (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
822 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
826 ecore_x_netwm_handled_icons_set(Ecore_X_Window win)
828 LOGFN(__FILE__, __LINE__, __FUNCTION__);
830 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
835 ecore_x_netwm_handled_icons_get(Ecore_X_Window win)
837 LOGFN(__FILE__, __LINE__, __FUNCTION__);
839 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
847 ecore_x_netwm_icon_name_get(Ecore_X_Window win,
850 LOGFN(__FILE__, __LINE__, __FUNCTION__);
855 ecore_x_window_prop_string_get(win, ECORE_X_ATOM_NET_WM_ICON_NAME);
862 ecore_x_netwm_icon_name_set(Ecore_X_Window win,
865 LOGFN(__FILE__, __LINE__, __FUNCTION__);
867 ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_WM_ICON_NAME, name);
871 ecore_x_netwm_icons_set(Ecore_X_Window win,
875 unsigned int *data, *p, *p2;
876 unsigned int i, size, x, y;
878 LOGFN(__FILE__, __LINE__, __FUNCTION__);
880 for (i = 0; i < (unsigned int)num; i++)
882 size += 2 + (icon[i].width * icon[i].height);
884 data = malloc(size * sizeof(unsigned int));
887 for (i = 0; i < (unsigned int)num; i++)
889 p[0] = icon[i].width;
890 p[1] = icon[i].height;
893 for (y = 0; y < icon[i].height; y++)
895 for (x = 0; x < icon[i].width; x++)
897 unsigned int r, g, b, a;
899 a = (*p2 >> 24) & 0xff;
900 r = (*p2 >> 16) & 0xff;
901 g = (*p2 >> 8 ) & 0xff;
903 if ((a > 0) && (a < 255))
909 *p = (a << 24) | (r << 16) | (g << 8) | b;
915 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_ICON,
921 ecore_x_netwm_icons_get(Ecore_X_Window win,
926 unsigned int i = 0, len = 0, icons = 0;
927 unsigned int *data, *p, *src;
929 LOGFN(__FILE__, __LINE__, __FUNCTION__);
932 if (icon) *icon = NULL;
935 ecore_x_window_prop_card32_list_get(win, ECORE_X_ATOM_NET_WM_ICON, &data);
937 if ((num_ret <= 0) || (!data))
939 if (data) free(data);
944 if (data) free(data);
954 if ((p - data) > num_ret)
956 if (data) free(data);
960 if ((p - data) == num_ret) p = NULL;
962 if (num) *num = icons;
965 if (data) free(data);
969 *icon = malloc(icons * sizeof(Ecore_X_Icon));
972 if (data) free(data);
976 /* Fetch the icons */
978 for (i = 0; i < icons; i++)
980 unsigned int *ps, *pd, *pe;
983 ((*icon)[i]).width = p[0];
984 ((*icon)[i]).height = p[1];
986 ((*icon)[i]).data = malloc(len * sizeof(unsigned int));
987 if (!((*icon)[i]).data)
990 free(((*icon)[--i]).data);
996 pd = ((*icon)[i]).data;
999 for (; ps < pe; ps++)
1001 unsigned int r, g, b, a;
1003 a = (*ps >> 24) & 0xff;
1004 r = (((*ps >> 16) & 0xff) * a) / 255;
1005 g = (((*ps >> 8) & 0xff) * a) / 255;
1006 b = (((*ps) & 0xff) * a) / 255;
1007 *pd = (a << 24) | (r << 16) | (g << 8) | (b);
1013 if (data) free(data);
1018 ecore_x_netwm_icon_geometry_set(Ecore_X_Window win,
1024 unsigned int geom[4];
1026 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1032 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_ICON_GEOMETRY,
1037 ecore_x_netwm_icon_geometry_get(Ecore_X_Window win,
1044 unsigned int geom[4];
1046 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1049 ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_ICON_GEOMETRY,
1051 if (ret != 4) return EINA_FALSE;
1052 if (x) *x = geom[0];
1053 if (y) *y = geom[1];
1054 if (w) *w = geom[2];
1055 if (h) *h = geom[3];
1061 ecore_x_netwm_strut_set(Ecore_X_Window win,
1067 unsigned int strut[4];
1069 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1075 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_STRUT, strut, 4);
1079 ecore_x_netwm_strut_get(Ecore_X_Window win,
1085 unsigned int strut[4];
1088 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1091 ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_STRUT, strut, 4);
1092 if (ret != 4) return EINA_FALSE;
1094 if (l) *l = strut[0];
1095 if (r) *r = strut[1];
1096 if (t) *t = strut[2];
1097 if (b) *b = strut[3];
1103 ecore_x_netwm_strut_partial_set(Ecore_X_Window win,
1117 unsigned int strut[12];
1119 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1125 strut[4] = left_start_y;
1126 strut[5] = left_end_y;
1127 strut[6] = right_start_y;
1128 strut[7] = right_end_y;
1129 strut[8] = top_start_x;
1130 strut[9] = top_end_x;
1131 strut[10] = bottom_start_x;
1132 strut[11] = bottom_end_x;
1133 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_STRUT_PARTIAL,
1138 ecore_x_netwm_strut_partial_get(Ecore_X_Window win,
1149 int *bottom_start_x,
1152 unsigned int strut[12];
1155 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1158 ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_STRUT_PARTIAL,
1160 if (ret != 12) return EINA_FALSE;
1162 if (left) *left = strut[0];
1163 if (right) *right = strut[1];
1164 if (top) *top = strut[2];
1165 if (bottom) *bottom = strut[3];
1166 if (left_start_y) *left_start_y = strut[4];
1167 if (left_end_y) *left_end_y = strut[5];
1168 if (right_start_y) *right_start_y = strut[6];
1169 if (right_end_y) *right_end_y = strut[7];
1170 if (top_start_x) *top_start_x = strut[8];
1171 if (top_end_x) *top_end_x = strut[9];
1172 if (bottom_start_x) *bottom_start_x = strut[10];
1173 if (bottom_end_x) *bottom_end_x = strut[11];
1179 ecore_x_netwm_user_time_set(Ecore_X_Window win,
1182 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1184 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_USER_TIME, &t, 1);
1188 ecore_x_netwm_user_time_get(Ecore_X_Window win,
1193 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1195 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_USER_TIME,
1205 ecore_x_netwm_visible_name_set(Ecore_X_Window win,
1208 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1210 ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_WM_VISIBLE_NAME,
1215 ecore_x_netwm_visible_name_get(Ecore_X_Window win,
1218 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1221 *name = ecore_x_window_prop_string_get(win,
1222 ECORE_X_ATOM_NET_WM_VISIBLE_NAME);
1227 ecore_x_netwm_visible_icon_name_set(Ecore_X_Window win,
1230 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1232 ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME,
1237 ecore_x_netwm_visible_icon_name_get(Ecore_X_Window win,
1240 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1245 ecore_x_window_prop_string_get(win,
1246 ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME);
1253 ecore_x_netwm_sync_counter_get(Ecore_X_Window win,
1254 Ecore_X_Sync_Counter *counter)
1258 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1260 if (!ecore_x_window_prop_card32_get(win,
1261 ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER,
1265 if (counter) *counter = tmp;
1271 ecore_x_netwm_allowed_action_isset(Ecore_X_Window win,
1272 Ecore_X_Action action)
1275 Ecore_X_Atom *atoms, atom;
1276 Eina_Bool ret = EINA_FALSE;
1278 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1281 ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
1283 if (num <= 0) return EINA_FALSE;
1285 atom = _ecore_xcb_netwm_action_atom_get(action);
1286 for (i = 0; i < num; i++)
1288 if (atoms[i] == atom)
1295 if (atoms) free(atoms);
1300 ecore_x_netwm_allowed_action_get(Ecore_X_Window win,
1301 Ecore_X_Action **action,
1304 Ecore_X_Atom *atoms;
1307 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1310 if (action) *action = NULL;
1313 ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
1315 if (num_ret <= 0) return EINA_FALSE;
1318 *action = malloc(num_ret * sizeof(Ecore_X_Action));
1323 for (i = 0; i < num_ret; i++)
1324 (*action)[i] = _ecore_xcb_netwm_action_atom_get(atoms[i]);
1326 if (num) *num = num_ret;
1333 ecore_x_netwm_allowed_action_set(Ecore_X_Window win,
1334 Ecore_X_Action *action,
1340 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1344 ecore_x_window_prop_property_del(win,
1345 ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS);
1349 set = malloc(num * sizeof(Ecore_X_Atom));
1352 for (i = 0; i < num; i++)
1353 set[i] = _ecore_xcb_netwm_action_atom_get(action[i]);
1355 ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
1360 /* local functions */
1362 _ecore_xcb_netwm_startup_info_begin(Ecore_X_Window win __UNUSED__,
1363 uint8_t data __UNUSED__)
1370 _ecore_xcb_netwm_startup_info(Ecore_X_Window win __UNUSED__,
1371 uint8_t data __UNUSED__)
1378 /* _ecore_xcb_netwm_startup_info_free(void *data) */
1380 /* Ecore_Xcb_Startup_Info *info; */
1382 /* LOGFN(__FILE__, __LINE__, __FUNCTION__); */
1384 /* if (!(info = data)) return; */
1385 /* if (info->buffer) free(info->buffer); */
1386 /* if (info->id) free(info->id); */
1387 /* if (info->name) free(info->name); */
1388 /* if (info->bin) free(info->bin); */
1389 /* if (info->icon) free(info->icon); */
1390 /* if (info->description) free(info->description); */
1391 /* if (info->wmclass) free(info->wmclass); */
1396 _ecore_xcb_netwm_window_type_atom_get(Ecore_X_Window_Type type)
1400 case ECORE_X_WINDOW_TYPE_DESKTOP:
1401 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP;
1403 case ECORE_X_WINDOW_TYPE_DOCK:
1404 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK;
1406 case ECORE_X_WINDOW_TYPE_TOOLBAR:
1407 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR;
1409 case ECORE_X_WINDOW_TYPE_MENU:
1410 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU;
1412 case ECORE_X_WINDOW_TYPE_UTILITY:
1413 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY;
1415 case ECORE_X_WINDOW_TYPE_SPLASH:
1416 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH;
1418 case ECORE_X_WINDOW_TYPE_DIALOG:
1419 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG;
1421 case ECORE_X_WINDOW_TYPE_NORMAL:
1422 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL;
1424 case ECORE_X_WINDOW_TYPE_DROPDOWN_MENU:
1425 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU;
1427 case ECORE_X_WINDOW_TYPE_POPUP_MENU:
1428 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU;
1430 case ECORE_X_WINDOW_TYPE_TOOLTIP:
1431 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP;
1433 case ECORE_X_WINDOW_TYPE_NOTIFICATION:
1434 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION;
1436 case ECORE_X_WINDOW_TYPE_COMBO:
1437 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO;
1439 case ECORE_X_WINDOW_TYPE_DND:
1440 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND;
1447 static Ecore_X_Window_Type
1448 _ecore_xcb_netwm_window_type_type_get(Ecore_X_Atom atom)
1450 if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP)
1451 return ECORE_X_WINDOW_TYPE_DESKTOP;
1452 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK)
1453 return ECORE_X_WINDOW_TYPE_DOCK;
1454 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR)
1455 return ECORE_X_WINDOW_TYPE_TOOLBAR;
1456 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU)
1457 return ECORE_X_WINDOW_TYPE_MENU;
1458 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY)
1459 return ECORE_X_WINDOW_TYPE_UTILITY;
1460 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH)
1461 return ECORE_X_WINDOW_TYPE_SPLASH;
1462 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG)
1463 return ECORE_X_WINDOW_TYPE_DIALOG;
1464 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL)
1465 return ECORE_X_WINDOW_TYPE_NORMAL;
1466 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU)
1467 return ECORE_X_WINDOW_TYPE_DROPDOWN_MENU;
1468 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU)
1469 return ECORE_X_WINDOW_TYPE_POPUP_MENU;
1470 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP)
1471 return ECORE_X_WINDOW_TYPE_TOOLTIP;
1472 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION)
1473 return ECORE_X_WINDOW_TYPE_NOTIFICATION;
1474 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO)
1475 return ECORE_X_WINDOW_TYPE_COMBO;
1476 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND)
1477 return ECORE_X_WINDOW_TYPE_DND;
1479 return ECORE_X_WINDOW_TYPE_UNKNOWN;
1483 _ecore_xcb_netwm_window_state_atom_get(Ecore_X_Window_State state)
1487 case ECORE_X_WINDOW_STATE_MODAL:
1488 return ECORE_X_ATOM_NET_WM_STATE_MODAL;
1490 case ECORE_X_WINDOW_STATE_STICKY:
1491 return ECORE_X_ATOM_NET_WM_STATE_STICKY;
1493 case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
1494 return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT;
1496 case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
1497 return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ;
1499 case ECORE_X_WINDOW_STATE_SHADED:
1500 return ECORE_X_ATOM_NET_WM_STATE_SHADED;
1502 case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
1503 return ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR;
1505 case ECORE_X_WINDOW_STATE_SKIP_PAGER:
1506 return ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER;
1508 case ECORE_X_WINDOW_STATE_HIDDEN:
1509 return ECORE_X_ATOM_NET_WM_STATE_HIDDEN;
1511 case ECORE_X_WINDOW_STATE_FULLSCREEN:
1512 return ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN;
1514 case ECORE_X_WINDOW_STATE_ABOVE:
1515 return ECORE_X_ATOM_NET_WM_STATE_ABOVE;
1517 case ECORE_X_WINDOW_STATE_BELOW:
1518 return ECORE_X_ATOM_NET_WM_STATE_BELOW;
1520 case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
1521 return ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION;
1528 Ecore_X_Window_State
1529 _ecore_xcb_netwm_window_state_get(Ecore_X_Atom atom)
1531 if (atom == ECORE_X_ATOM_NET_WM_STATE_MODAL)
1532 return ECORE_X_WINDOW_STATE_MODAL;
1533 else if (atom == ECORE_X_ATOM_NET_WM_STATE_STICKY)
1534 return ECORE_X_WINDOW_STATE_STICKY;
1535 else if (atom == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT)
1536 return ECORE_X_WINDOW_STATE_MAXIMIZED_VERT;
1537 else if (atom == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ)
1538 return ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ;
1539 else if (atom == ECORE_X_ATOM_NET_WM_STATE_SHADED)
1540 return ECORE_X_WINDOW_STATE_SHADED;
1541 else if (atom == ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR)
1542 return ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
1543 else if (atom == ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER)
1544 return ECORE_X_WINDOW_STATE_SKIP_PAGER;
1545 else if (atom == ECORE_X_ATOM_NET_WM_STATE_HIDDEN)
1546 return ECORE_X_WINDOW_STATE_HIDDEN;
1547 else if (atom == ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN)
1548 return ECORE_X_WINDOW_STATE_FULLSCREEN;
1549 else if (atom == ECORE_X_ATOM_NET_WM_STATE_ABOVE)
1550 return ECORE_X_WINDOW_STATE_ABOVE;
1551 else if (atom == ECORE_X_ATOM_NET_WM_STATE_BELOW)
1552 return ECORE_X_WINDOW_STATE_BELOW;
1553 else if (atom == ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION)
1554 return ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION;
1556 return ECORE_X_WINDOW_STATE_UNKNOWN;
1560 _ecore_xcb_netwm_action_atom_get(Ecore_X_Action action)
1564 case ECORE_X_ACTION_MOVE:
1565 return ECORE_X_ATOM_NET_WM_ACTION_MOVE;
1567 case ECORE_X_ACTION_RESIZE:
1568 return ECORE_X_ATOM_NET_WM_ACTION_RESIZE;
1570 case ECORE_X_ACTION_MINIMIZE:
1571 return ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE;
1573 case ECORE_X_ACTION_SHADE:
1574 return ECORE_X_ATOM_NET_WM_ACTION_SHADE;
1576 case ECORE_X_ACTION_STICK:
1577 return ECORE_X_ATOM_NET_WM_ACTION_STICK;
1579 case ECORE_X_ACTION_MAXIMIZE_HORZ:
1580 return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ;
1582 case ECORE_X_ACTION_MAXIMIZE_VERT:
1583 return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT;
1585 case ECORE_X_ACTION_FULLSCREEN:
1586 return ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN;
1588 case ECORE_X_ACTION_CHANGE_DESKTOP:
1589 return ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP;
1591 case ECORE_X_ACTION_CLOSE:
1592 return ECORE_X_ATOM_NET_WM_ACTION_CLOSE;
1594 case ECORE_X_ACTION_ABOVE:
1595 return ECORE_X_ATOM_NET_WM_ACTION_ABOVE;
1597 case ECORE_X_ACTION_BELOW:
1598 return ECORE_X_ATOM_NET_WM_ACTION_BELOW;