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;
588 xcb_intern_atom_cookie_t acookie;
589 xcb_intern_atom_reply_t *areply;
593 LOGFN(__FILE__, __LINE__, __FUNCTION__);
596 snprintf(buff, sizeof(buff), "_NET_WM_CM_S%i", screen);
597 acookie = xcb_intern_atom_unchecked(_ecore_xcb_conn, 1, strlen(buff), buff);
598 areply = xcb_intern_atom_reply(_ecore_xcb_conn, acookie, NULL);
599 if (!areply) return EINA_FALSE;
602 if (atom == XCB_NONE) return EINA_FALSE;
603 ocookie = xcb_get_selection_owner_unchecked(_ecore_xcb_conn, atom);
604 oreply = xcb_get_selection_owner_reply(_ecore_xcb_conn, ocookie, NULL);
605 if (!oreply) return EINA_FALSE;
608 return (win != XCB_NONE) ? EINA_TRUE : EINA_FALSE;
612 ecore_x_screen_is_composited_set(int screen,
616 xcb_intern_atom_cookie_t acookie;
617 xcb_intern_atom_reply_t *areply;
620 LOGFN(__FILE__, __LINE__, __FUNCTION__);
623 snprintf(buff, sizeof(buff), "_NET_WM_CM_S%i", screen);
624 acookie = xcb_intern_atom_unchecked(_ecore_xcb_conn, 0, strlen(buff), buff);
625 areply = xcb_intern_atom_reply(_ecore_xcb_conn, acookie, NULL);
629 xcb_set_selection_owner(_ecore_xcb_conn, win, atom,
630 _ecore_xcb_events_last_time_get());
634 ecore_x_netwm_ping_send(Ecore_X_Window win)
636 xcb_client_message_event_t ev;
638 LOGFN(__FILE__, __LINE__, __FUNCTION__);
643 ev.response_type = XCB_CLIENT_MESSAGE;
646 ev.type = ECORE_X_ATOM_WM_PROTOCOLS;
647 ev.data.data32[0] = ECORE_X_ATOM_NET_WM_PING;
648 ev.data.data32[1] = ecore_x_current_time_get();
649 ev.data.data32[2] = win;
650 ev.data.data32[3] = 0;
651 ev.data.data32[4] = 0;
653 xcb_send_event(_ecore_xcb_conn, 0, win,
654 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
659 ecore_x_netwm_frame_size_set(Ecore_X_Window win,
667 LOGFN(__FILE__, __LINE__, __FUNCTION__);
673 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_FRAME_EXTENTS,
678 ecore_x_netwm_frame_size_get(Ecore_X_Window win,
685 unsigned int frames[4];
687 LOGFN(__FILE__, __LINE__, __FUNCTION__);
689 ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_FRAME_EXTENTS,
691 if (ret != 4) return EINA_FALSE;
693 if (fl) *fl = frames[0];
694 if (fr) *fr = frames[1];
695 if (ft) *ft = frames[2];
696 if (fb) *fb = frames[3];
702 ecore_x_netwm_sync_request_send(Ecore_X_Window win,
705 xcb_client_message_event_t ev;
707 LOGFN(__FILE__, __LINE__, __FUNCTION__);
712 /* FIXME: Maybe need XSyncIntToValue ?? */
713 memset(&ev, 0, sizeof(xcb_client_message_event_t));
715 ev.response_type = XCB_CLIENT_MESSAGE;
718 ev.type = ECORE_X_ATOM_WM_PROTOCOLS;
719 ev.data.data32[0] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
720 ev.data.data32[1] = _ecore_xcb_events_last_time_get();
721 ev.data.data32[2] = serial;
722 ev.data.data32[3] = 0;
723 ev.data.data32[4] = 0;
725 xcb_send_event(_ecore_xcb_conn, 0, win,
726 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
731 ecore_x_netwm_desktop_set(Ecore_X_Window win,
734 LOGFN(__FILE__, __LINE__, __FUNCTION__);
736 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_DESKTOP, &desk, 1);
740 ecore_x_netwm_desktop_get(Ecore_X_Window win,
743 unsigned int tmp = 0;
745 LOGFN(__FILE__, __LINE__, __FUNCTION__);
747 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_DESKTOP,
751 if (desk) *desk = tmp;
757 ecore_x_netwm_desktop_request_send(Ecore_X_Window win,
759 unsigned int desktop)
761 xcb_client_message_event_t ev;
763 LOGFN(__FILE__, __LINE__, __FUNCTION__);
766 if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
768 memset(&ev, 0, sizeof(xcb_client_message_event_t));
770 ev.response_type = XCB_CLIENT_MESSAGE;
773 ev.type = ECORE_X_ATOM_NET_WM_DESKTOP;
774 ev.data.data32[0] = desktop;
776 xcb_send_event(_ecore_xcb_conn, 0, root,
777 (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
778 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
783 ecore_x_netwm_moveresize_request_send(Ecore_X_Window win,
786 Ecore_X_Netwm_Direction direction,
789 xcb_client_message_event_t ev;
791 LOGFN(__FILE__, __LINE__, __FUNCTION__);
794 memset(&ev, 0, sizeof(xcb_client_message_event_t));
796 ev.response_type = XCB_CLIENT_MESSAGE;
799 ev.type = ECORE_X_ATOM_NET_WM_MOVERESIZE;
800 ev.data.data32[0] = x;
801 ev.data.data32[1] = y;
802 ev.data.data32[2] = direction;
803 ev.data.data32[3] = button;
804 ev.data.data32[4] = 1;
806 xcb_send_event(_ecore_xcb_conn, 0, win,
807 (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
808 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
812 ecore_x_netwm_handled_icons_set(Ecore_X_Window win)
814 LOGFN(__FILE__, __LINE__, __FUNCTION__);
816 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
821 ecore_x_netwm_handled_icons_get(Ecore_X_Window win)
823 LOGFN(__FILE__, __LINE__, __FUNCTION__);
825 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
833 ecore_x_netwm_icon_name_get(Ecore_X_Window win,
836 LOGFN(__FILE__, __LINE__, __FUNCTION__);
841 ecore_x_window_prop_string_get(win, ECORE_X_ATOM_NET_WM_ICON_NAME);
848 ecore_x_netwm_icon_name_set(Ecore_X_Window win,
851 LOGFN(__FILE__, __LINE__, __FUNCTION__);
853 ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_WM_ICON_NAME, name);
857 ecore_x_netwm_icons_set(Ecore_X_Window win,
861 unsigned int *data, *p, *p2;
862 unsigned int i, size, x, y;
864 LOGFN(__FILE__, __LINE__, __FUNCTION__);
866 for (i = 0; i < (unsigned int)num; i++)
868 size += 2 + (icon[i].width * icon[i].height);
870 data = malloc(size * sizeof(unsigned int));
873 for (i = 0; i < (unsigned int)num; i++)
875 p[0] = icon[i].width;
876 p[1] = icon[i].height;
879 for (y = 0; y < icon[i].height; y++)
881 for (x = 0; x < icon[i].width; x++)
883 unsigned int r, g, b, a;
885 a = (*p2 >> 24) & 0xff;
886 r = (*p2 >> 16) & 0xff;
887 g = (*p2 >> 8 ) & 0xff;
889 if ((a > 0) && (a < 255))
895 *p = (a << 24) | (r << 16) | (g << 8) | b;
901 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_ICON,
907 ecore_x_netwm_icons_get(Ecore_X_Window win,
912 unsigned int i = 0, len = 0, icons = 0;
913 unsigned int *data, *p, *src;
915 LOGFN(__FILE__, __LINE__, __FUNCTION__);
918 if (icon) *icon = NULL;
921 ecore_x_window_prop_card32_list_get(win, ECORE_X_ATOM_NET_WM_ICON, &data);
923 if ((num_ret <= 0) || (!data))
925 if (data) free(data);
930 if (data) free(data);
940 if ((p - data) > num_ret)
942 if (data) free(data);
946 if ((p - data) == num_ret) p = NULL;
948 if (num) *num = icons;
951 if (data) free(data);
955 *icon = malloc(icons * sizeof(Ecore_X_Icon));
958 if (data) free(data);
962 /* Fetch the icons */
964 for (i = 0; i < icons; i++)
966 unsigned int *ps, *pd, *pe;
969 ((*icon)[i]).width = p[0];
970 ((*icon)[i]).height = p[1];
972 ((*icon)[i]).data = malloc(len * sizeof(unsigned int));
973 if (!((*icon)[i]).data)
976 free(((*icon)[--i]).data);
982 pd = ((*icon)[i]).data;
985 for (; ps < pe; ps++)
987 unsigned int r, g, b, a;
989 a = (*ps >> 24) & 0xff;
990 r = (((*ps >> 16) & 0xff) * a) / 255;
991 g = (((*ps >> 8) & 0xff) * a) / 255;
992 b = (((*ps) & 0xff) * a) / 255;
993 *pd = (a << 24) | (r << 16) | (g << 8) | (b);
999 if (data) free(data);
1004 ecore_x_netwm_icon_geometry_set(Ecore_X_Window win,
1010 unsigned int geom[4];
1012 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1018 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_ICON_GEOMETRY,
1023 ecore_x_netwm_icon_geometry_get(Ecore_X_Window win,
1030 unsigned int geom[4];
1032 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1035 ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_ICON_GEOMETRY,
1037 if (ret != 4) return EINA_FALSE;
1038 if (x) *x = geom[0];
1039 if (y) *y = geom[1];
1040 if (w) *w = geom[2];
1041 if (h) *h = geom[3];
1047 ecore_x_netwm_strut_set(Ecore_X_Window win,
1053 unsigned int strut[4];
1055 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1061 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_STRUT, strut, 4);
1065 ecore_x_netwm_strut_get(Ecore_X_Window win,
1071 unsigned int strut[4];
1074 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1077 ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_STRUT, strut, 4);
1078 if (ret != 4) return EINA_FALSE;
1080 if (l) *l = strut[0];
1081 if (r) *r = strut[1];
1082 if (t) *t = strut[2];
1083 if (b) *b = strut[3];
1089 ecore_x_netwm_strut_partial_set(Ecore_X_Window win,
1103 unsigned int strut[12];
1105 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1111 strut[4] = left_start_y;
1112 strut[5] = left_end_y;
1113 strut[6] = right_start_y;
1114 strut[7] = right_end_y;
1115 strut[8] = top_start_x;
1116 strut[9] = top_end_x;
1117 strut[10] = bottom_start_x;
1118 strut[11] = bottom_end_x;
1119 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_STRUT_PARTIAL,
1124 ecore_x_netwm_strut_partial_get(Ecore_X_Window win,
1135 int *bottom_start_x,
1138 unsigned int strut[12];
1141 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1144 ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_STRUT_PARTIAL,
1146 if (ret != 12) return EINA_FALSE;
1148 if (left) *left = strut[0];
1149 if (right) *right = strut[1];
1150 if (top) *top = strut[2];
1151 if (bottom) *bottom = strut[3];
1152 if (left_start_y) *left_start_y = strut[4];
1153 if (left_end_y) *left_end_y = strut[5];
1154 if (right_start_y) *right_start_y = strut[6];
1155 if (right_end_y) *right_end_y = strut[7];
1156 if (top_start_x) *top_start_x = strut[8];
1157 if (top_end_x) *top_end_x = strut[9];
1158 if (bottom_start_x) *bottom_start_x = strut[10];
1159 if (bottom_end_x) *bottom_end_x = strut[11];
1165 ecore_x_netwm_user_time_set(Ecore_X_Window win,
1168 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1170 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_USER_TIME, &t, 1);
1174 ecore_x_netwm_user_time_get(Ecore_X_Window win,
1179 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1181 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_USER_TIME,
1191 ecore_x_netwm_visible_name_set(Ecore_X_Window win,
1194 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1196 ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_WM_VISIBLE_NAME,
1201 ecore_x_netwm_visible_name_get(Ecore_X_Window win,
1204 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1207 *name = ecore_x_window_prop_string_get(win,
1208 ECORE_X_ATOM_NET_WM_VISIBLE_NAME);
1213 ecore_x_netwm_visible_icon_name_set(Ecore_X_Window win,
1216 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1218 ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME,
1223 ecore_x_netwm_visible_icon_name_get(Ecore_X_Window win,
1226 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1231 ecore_x_window_prop_string_get(win,
1232 ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME);
1239 ecore_x_netwm_sync_counter_get(Ecore_X_Window win,
1240 Ecore_X_Sync_Counter *counter)
1244 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1246 if (!ecore_x_window_prop_card32_get(win,
1247 ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER,
1251 if (counter) *counter = tmp;
1257 ecore_x_netwm_allowed_action_isset(Ecore_X_Window win,
1258 Ecore_X_Action action)
1261 Ecore_X_Atom *atoms, atom;
1262 Eina_Bool ret = EINA_FALSE;
1264 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1267 ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
1269 if (num <= 0) return EINA_FALSE;
1271 atom = _ecore_xcb_netwm_action_atom_get(action);
1272 for (i = 0; i < num; i++)
1274 if (atoms[i] == atom)
1281 if (atoms) free(atoms);
1286 ecore_x_netwm_allowed_action_get(Ecore_X_Window win,
1287 Ecore_X_Action **action,
1290 Ecore_X_Atom *atoms;
1293 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1296 if (action) *action = NULL;
1299 ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
1301 if (num_ret <= 0) return EINA_FALSE;
1304 *action = malloc(num_ret * sizeof(Ecore_X_Action));
1309 for (i = 0; i < num_ret; i++)
1310 (*action)[i] = _ecore_xcb_netwm_action_atom_get(atoms[i]);
1312 if (num) *num = num_ret;
1319 ecore_x_netwm_allowed_action_set(Ecore_X_Window win,
1320 Ecore_X_Action *action,
1326 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1330 ecore_x_window_prop_property_del(win,
1331 ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS);
1335 set = malloc(num * sizeof(Ecore_X_Atom));
1338 for (i = 0; i < num; i++)
1339 set[i] = _ecore_xcb_netwm_action_atom_get(action[i]);
1341 ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
1346 /* local functions */
1348 _ecore_xcb_netwm_startup_info_begin(Ecore_X_Window win EINA_UNUSED,
1349 uint8_t data EINA_UNUSED)
1356 _ecore_xcb_netwm_startup_info(Ecore_X_Window win EINA_UNUSED,
1357 uint8_t data EINA_UNUSED)
1364 /* _ecore_xcb_netwm_startup_info_free(void *data) */
1366 /* Ecore_Xcb_Startup_Info *info; */
1368 /* LOGFN(__FILE__, __LINE__, __FUNCTION__); */
1370 /* if (!(info = data)) return; */
1371 /* if (info->buffer) free(info->buffer); */
1372 /* if (info->id) free(info->id); */
1373 /* if (info->name) free(info->name); */
1374 /* if (info->bin) free(info->bin); */
1375 /* if (info->icon) free(info->icon); */
1376 /* if (info->description) free(info->description); */
1377 /* if (info->wmclass) free(info->wmclass); */
1382 _ecore_xcb_netwm_window_type_atom_get(Ecore_X_Window_Type type)
1386 case ECORE_X_WINDOW_TYPE_DESKTOP:
1387 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP;
1389 case ECORE_X_WINDOW_TYPE_DOCK:
1390 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK;
1392 case ECORE_X_WINDOW_TYPE_TOOLBAR:
1393 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR;
1395 case ECORE_X_WINDOW_TYPE_MENU:
1396 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU;
1398 case ECORE_X_WINDOW_TYPE_UTILITY:
1399 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY;
1401 case ECORE_X_WINDOW_TYPE_SPLASH:
1402 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH;
1404 case ECORE_X_WINDOW_TYPE_DIALOG:
1405 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG;
1407 case ECORE_X_WINDOW_TYPE_NORMAL:
1408 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL;
1410 case ECORE_X_WINDOW_TYPE_DROPDOWN_MENU:
1411 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU;
1413 case ECORE_X_WINDOW_TYPE_POPUP_MENU:
1414 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU;
1416 case ECORE_X_WINDOW_TYPE_TOOLTIP:
1417 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP;
1419 case ECORE_X_WINDOW_TYPE_NOTIFICATION:
1420 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION;
1422 case ECORE_X_WINDOW_TYPE_COMBO:
1423 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO;
1425 case ECORE_X_WINDOW_TYPE_DND:
1426 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND;
1433 static Ecore_X_Window_Type
1434 _ecore_xcb_netwm_window_type_type_get(Ecore_X_Atom atom)
1436 if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP)
1437 return ECORE_X_WINDOW_TYPE_DESKTOP;
1438 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK)
1439 return ECORE_X_WINDOW_TYPE_DOCK;
1440 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR)
1441 return ECORE_X_WINDOW_TYPE_TOOLBAR;
1442 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU)
1443 return ECORE_X_WINDOW_TYPE_MENU;
1444 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY)
1445 return ECORE_X_WINDOW_TYPE_UTILITY;
1446 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH)
1447 return ECORE_X_WINDOW_TYPE_SPLASH;
1448 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG)
1449 return ECORE_X_WINDOW_TYPE_DIALOG;
1450 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL)
1451 return ECORE_X_WINDOW_TYPE_NORMAL;
1452 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU)
1453 return ECORE_X_WINDOW_TYPE_DROPDOWN_MENU;
1454 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU)
1455 return ECORE_X_WINDOW_TYPE_POPUP_MENU;
1456 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP)
1457 return ECORE_X_WINDOW_TYPE_TOOLTIP;
1458 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION)
1459 return ECORE_X_WINDOW_TYPE_NOTIFICATION;
1460 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO)
1461 return ECORE_X_WINDOW_TYPE_COMBO;
1462 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND)
1463 return ECORE_X_WINDOW_TYPE_DND;
1465 return ECORE_X_WINDOW_TYPE_UNKNOWN;
1469 _ecore_xcb_netwm_window_state_atom_get(Ecore_X_Window_State state)
1473 case ECORE_X_WINDOW_STATE_MODAL:
1474 return ECORE_X_ATOM_NET_WM_STATE_MODAL;
1476 case ECORE_X_WINDOW_STATE_STICKY:
1477 return ECORE_X_ATOM_NET_WM_STATE_STICKY;
1479 case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
1480 return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT;
1482 case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
1483 return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ;
1485 case ECORE_X_WINDOW_STATE_SHADED:
1486 return ECORE_X_ATOM_NET_WM_STATE_SHADED;
1488 case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
1489 return ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR;
1491 case ECORE_X_WINDOW_STATE_SKIP_PAGER:
1492 return ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER;
1494 case ECORE_X_WINDOW_STATE_HIDDEN:
1495 return ECORE_X_ATOM_NET_WM_STATE_HIDDEN;
1497 case ECORE_X_WINDOW_STATE_FULLSCREEN:
1498 return ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN;
1500 case ECORE_X_WINDOW_STATE_ABOVE:
1501 return ECORE_X_ATOM_NET_WM_STATE_ABOVE;
1503 case ECORE_X_WINDOW_STATE_BELOW:
1504 return ECORE_X_ATOM_NET_WM_STATE_BELOW;
1506 case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
1507 return ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION;
1514 Ecore_X_Window_State
1515 _ecore_xcb_netwm_window_state_get(Ecore_X_Atom atom)
1517 if (atom == ECORE_X_ATOM_NET_WM_STATE_MODAL)
1518 return ECORE_X_WINDOW_STATE_MODAL;
1519 else if (atom == ECORE_X_ATOM_NET_WM_STATE_STICKY)
1520 return ECORE_X_WINDOW_STATE_STICKY;
1521 else if (atom == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT)
1522 return ECORE_X_WINDOW_STATE_MAXIMIZED_VERT;
1523 else if (atom == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ)
1524 return ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ;
1525 else if (atom == ECORE_X_ATOM_NET_WM_STATE_SHADED)
1526 return ECORE_X_WINDOW_STATE_SHADED;
1527 else if (atom == ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR)
1528 return ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
1529 else if (atom == ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER)
1530 return ECORE_X_WINDOW_STATE_SKIP_PAGER;
1531 else if (atom == ECORE_X_ATOM_NET_WM_STATE_HIDDEN)
1532 return ECORE_X_WINDOW_STATE_HIDDEN;
1533 else if (atom == ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN)
1534 return ECORE_X_WINDOW_STATE_FULLSCREEN;
1535 else if (atom == ECORE_X_ATOM_NET_WM_STATE_ABOVE)
1536 return ECORE_X_WINDOW_STATE_ABOVE;
1537 else if (atom == ECORE_X_ATOM_NET_WM_STATE_BELOW)
1538 return ECORE_X_WINDOW_STATE_BELOW;
1539 else if (atom == ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION)
1540 return ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION;
1542 return ECORE_X_WINDOW_STATE_UNKNOWN;
1546 _ecore_xcb_netwm_action_atom_get(Ecore_X_Action action)
1550 case ECORE_X_ACTION_MOVE:
1551 return ECORE_X_ATOM_NET_WM_ACTION_MOVE;
1553 case ECORE_X_ACTION_RESIZE:
1554 return ECORE_X_ATOM_NET_WM_ACTION_RESIZE;
1556 case ECORE_X_ACTION_MINIMIZE:
1557 return ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE;
1559 case ECORE_X_ACTION_SHADE:
1560 return ECORE_X_ATOM_NET_WM_ACTION_SHADE;
1562 case ECORE_X_ACTION_STICK:
1563 return ECORE_X_ATOM_NET_WM_ACTION_STICK;
1565 case ECORE_X_ACTION_MAXIMIZE_HORZ:
1566 return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ;
1568 case ECORE_X_ACTION_MAXIMIZE_VERT:
1569 return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT;
1571 case ECORE_X_ACTION_FULLSCREEN:
1572 return ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN;
1574 case ECORE_X_ACTION_CHANGE_DESKTOP:
1575 return ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP;
1577 case ECORE_X_ACTION_CLOSE:
1578 return ECORE_X_ATOM_NET_WM_ACTION_CLOSE;
1580 case ECORE_X_ACTION_ABOVE:
1581 return ECORE_X_ATOM_NET_WM_ACTION_ABOVE;
1583 case ECORE_X_ACTION_BELOW:
1584 return ECORE_X_ATOM_NET_WM_ACTION_BELOW;