17 # define alloca __builtin_alloca
19 # define alloca __alloca
20 # elif defined _MSC_VER
22 # define alloca _alloca
23 # elif !defined HAVE_ALLOCA
27 void *alloca (size_t);
31 #include "ecore_xcb_private.h"
32 #ifdef ECORE_XCB_RENDER
33 # include <xcb/render.h>
35 #ifdef ECORE_XCB_SHAPE
36 # include <xcb/shape.h>
38 #ifdef ECORE_XCB_XPRINT
39 #include <xcb/xprint.h>
42 /* local function prototypes */
43 static Ecore_X_Window _ecore_xcb_window_argb_internal_new(Ecore_X_Window parent,
48 uint8_t override_redirect,
50 static Ecore_X_Window _ecore_xcb_window_at_xy_get(Ecore_X_Window base,
57 static int _ecore_xcb_window_modifiers_get(unsigned int state);
58 static xcb_visualtype_t *_ecore_xcb_window_find_visual_by_id(xcb_visualid_t id);
59 #ifdef ECORE_XCB_XPRINT
60 static xcb_screen_t *_ecore_xcb_window_screen_of_display(int screen);
64 static int ignore_num = 0;
65 static Ecore_X_Window *ignore_list = NULL;
67 /* external variables */
68 int _ecore_xcb_button_grabs_num = 0;
69 int _ecore_xcb_key_grabs_num = 0;
70 Ecore_X_Window *_ecore_xcb_button_grabs = NULL;
71 Ecore_X_Window *_ecore_xcb_key_grabs = NULL;
72 Eina_Bool (*_ecore_xcb_window_grab_replay_func)(void *data,
75 void *_ecore_xcb_window_grab_replay_data;
78 * @defgroup Ecore_X_Window_Create_Group X Window Creation Functions
80 * Functions that can be used to create an X window.
84 * Creates a new window.
85 * @param parent The parent window to use. If @p parent is @c 0, the root
86 * window of the default display is used.
87 * @param x X position.
88 * @param y Y position.
91 * @return The new window handle.
92 * @ingroup Ecore_X_Window_Create_Group
95 ecore_x_window_new(Ecore_X_Window parent,
102 uint32_t mask, mask_list[9];
104 LOGFN(__FILE__, __LINE__, __FUNCTION__);
108 parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
110 /* NB: Order here is very important due to xcb_cw_t enum */
111 mask = (XCB_CW_BACK_PIXMAP | XCB_CW_BORDER_PIXEL | XCB_CW_BIT_GRAVITY |
112 XCB_CW_WIN_GRAVITY | XCB_CW_BACKING_STORE |
113 XCB_CW_OVERRIDE_REDIRECT | XCB_CW_SAVE_UNDER | XCB_CW_EVENT_MASK |
114 XCB_CW_DONT_PROPAGATE);
116 mask_list[0] = XCB_BACK_PIXMAP_NONE;
118 mask_list[2] = XCB_GRAVITY_NORTH_WEST;
119 mask_list[3] = XCB_GRAVITY_NORTH_WEST;
120 mask_list[4] = XCB_BACKING_STORE_NOT_USEFUL;
123 mask_list[7] = (XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE |
124 XCB_EVENT_MASK_BUTTON_PRESS |
125 XCB_EVENT_MASK_BUTTON_RELEASE |
126 XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
127 XCB_EVENT_MASK_POINTER_MOTION | XCB_EVENT_MASK_EXPOSURE |
128 XCB_EVENT_MASK_VISIBILITY_CHANGE |
129 XCB_EVENT_MASK_STRUCTURE_NOTIFY |
130 XCB_EVENT_MASK_FOCUS_CHANGE |
131 XCB_EVENT_MASK_PROPERTY_CHANGE |
132 XCB_EVENT_MASK_COLOR_MAP_CHANGE);
133 mask_list[8] = XCB_EVENT_MASK_NO_EVENT;
135 win = xcb_generate_id(_ecore_xcb_conn);
136 xcb_create_window(_ecore_xcb_conn, XCB_COPY_FROM_PARENT,
137 win, parent, x, y, w, h, 0,
138 XCB_WINDOW_CLASS_INPUT_OUTPUT,
139 XCB_COPY_FROM_PARENT, mask, mask_list);
141 if (parent == ((xcb_screen_t *)_ecore_xcb_screen)->root)
142 ecore_x_window_defaults_set(win);
148 * Creates a window with the override redirect attribute set to @c True.
149 * @param parent The parent window to use. If @p parent is @c 0, the root
150 * window of the default display is used.
151 * @param x X position.
152 * @param y Y position.
155 * @return The new window handle.
156 * @ingroup Ecore_X_Window_Create_Group
159 ecore_x_window_override_new(Ecore_X_Window parent,
166 uint32_t mask, mask_list[9];
168 LOGFN(__FILE__, __LINE__, __FUNCTION__);
172 parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
174 /* NB: Order here is very important due to xcb_cw_t enum */
175 mask = (XCB_CW_BACK_PIXMAP | XCB_CW_BORDER_PIXEL | XCB_CW_BIT_GRAVITY |
176 XCB_CW_WIN_GRAVITY | XCB_CW_BACKING_STORE |
177 XCB_CW_OVERRIDE_REDIRECT | XCB_CW_SAVE_UNDER | XCB_CW_EVENT_MASK |
178 XCB_CW_DONT_PROPAGATE);
180 mask_list[0] = XCB_BACK_PIXMAP_NONE;
182 mask_list[2] = XCB_GRAVITY_NORTH_WEST;
183 mask_list[3] = XCB_GRAVITY_NORTH_WEST;
184 mask_list[4] = XCB_BACKING_STORE_NOT_USEFUL;
187 mask_list[7] = (XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE |
188 XCB_EVENT_MASK_BUTTON_PRESS |
189 XCB_EVENT_MASK_BUTTON_RELEASE |
190 XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
191 XCB_EVENT_MASK_POINTER_MOTION | XCB_EVENT_MASK_EXPOSURE |
192 XCB_EVENT_MASK_VISIBILITY_CHANGE |
193 XCB_EVENT_MASK_STRUCTURE_NOTIFY |
194 XCB_EVENT_MASK_FOCUS_CHANGE |
195 XCB_EVENT_MASK_PROPERTY_CHANGE |
196 XCB_EVENT_MASK_COLOR_MAP_CHANGE);
197 mask_list[8] = XCB_EVENT_MASK_NO_EVENT;
199 win = xcb_generate_id(_ecore_xcb_conn);
200 xcb_create_window(_ecore_xcb_conn, XCB_COPY_FROM_PARENT,
201 win, parent, x, y, w, h, 0,
202 XCB_WINDOW_CLASS_INPUT_OUTPUT,
203 XCB_COPY_FROM_PARENT, mask, mask_list);
209 * Creates a new input window.
210 * @param parent The parent window to use. If @p parent is @c 0, the root
211 * window of the default display is used.
212 * @param x X position.
213 * @param y Y position.
216 * @return The new window.
217 * @ingroup Ecore_X_Window_Create_Group
220 ecore_x_window_input_new(Ecore_X_Window parent,
227 uint32_t mask, mask_list[3];
229 LOGFN(__FILE__, __LINE__, __FUNCTION__)
233 parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
235 /* NB: Order here is very important due to xcb_cw_t enum */
236 mask = (XCB_CW_OVERRIDE_REDIRECT | XCB_CW_EVENT_MASK |
237 XCB_CW_DONT_PROPAGATE);
240 mask_list[1] = (XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE |
241 XCB_EVENT_MASK_BUTTON_PRESS |
242 XCB_EVENT_MASK_BUTTON_RELEASE |
243 XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
244 XCB_EVENT_MASK_POINTER_MOTION | XCB_EVENT_MASK_EXPOSURE |
245 XCB_EVENT_MASK_VISIBILITY_CHANGE |
246 XCB_EVENT_MASK_STRUCTURE_NOTIFY |
247 XCB_EVENT_MASK_FOCUS_CHANGE |
248 XCB_EVENT_MASK_PROPERTY_CHANGE |
249 XCB_EVENT_MASK_COLOR_MAP_CHANGE);
250 mask_list[2] = XCB_EVENT_MASK_NO_EVENT;
252 win = xcb_generate_id(_ecore_xcb_conn);
253 xcb_create_window(_ecore_xcb_conn, XCB_COPY_FROM_PARENT,
254 win, parent, x, y, w, h, 0,
255 XCB_WINDOW_CLASS_INPUT_ONLY,
256 XCB_COPY_FROM_PARENT, mask, mask_list);
262 * Creates a new window.
263 * @param parent The parent window to use. If @p parent is @c 0, the root
264 * window of the default display is used.
265 * @param x X position.
266 * @param y Y position.
269 * @return The new window handle.
270 * @ingroup Ecore_X_Window_Create_Group
273 ecore_x_window_manager_argb_new(Ecore_X_Window parent,
279 Ecore_X_Window win = 0;
281 LOGFN(__FILE__, __LINE__, __FUNCTION__);
283 win = _ecore_xcb_window_argb_internal_new(parent, x, y, w, h, 1, 0);
289 * Creates a new window.
290 * @param parent The parent window to use. If @p parent is @c 0, the root
291 * window of the default display is used.
292 * @param x X position.
293 * @param y Y position.
296 * @return The new window handle.
297 * @ingroup Ecore_X_Window_Create_Group
300 ecore_x_window_argb_new(Ecore_X_Window parent,
306 Ecore_X_Window win = 0;
308 LOGFN(__FILE__, __LINE__, __FUNCTION__);
310 win = _ecore_xcb_window_argb_internal_new(parent, x, y, w, h, 0, 0);
316 * Creates a window with the override redirect attribute set to @c True.
317 * @param parent The parent window to use. If @p parent is @c 0, the root
318 * window of the default display is used.
319 * @param x X position.
320 * @param y Y position.
323 * @return The new window handle.
324 * @ingroup Ecore_X_Window_Create_Group
327 ecore_x_window_override_argb_new(Ecore_X_Window parent,
333 Ecore_X_Window win = 0;
335 LOGFN(__FILE__, __LINE__, __FUNCTION__);
337 win = _ecore_xcb_window_argb_internal_new(parent, x, y, w, h, 1, 0);
343 * @defgroup Ecore_X_Window_Destroy_Group X Window Destroy Functions
345 * Functions to destroy X windows.
349 * Deletes the given window.
350 * @param win The given window.
351 * @ingroup Ecore_X_Window_Destroy_Group
354 ecore_x_window_free(Ecore_X_Window win)
356 LOGFN(__FILE__, __LINE__, __FUNCTION__);
361 /* xcb_destroy_notify_event_t ev; */
362 /* Ecore_X_Window root; */
364 /* if (xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn)).rem == 1) */
365 /* root = ((xcb_screen_t *)_ecore_xcb_screen)->root; */
368 /* xcb_get_geometry_cookie_t cookie; */
369 /* xcb_get_geometry_reply_t *reply; */
371 /* cookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, win); */
372 /* reply = xcb_get_geometry_reply(_ecore_xcb_conn, cookie, NULL); */
373 /* if (!reply) return; */
374 /* root = reply->root; */
378 /* memset(&ev, 0, sizeof(xcb_destroy_notify_event_t)); */
380 /* ev.response_type = XCB_DESTROY_NOTIFY; */
381 /* ev.window = win; */
382 /* ev.event = root; */
384 /* xcb_send_event(_ecore_xcb_conn, 0, root, */
385 /* XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | */
386 /* XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, */
387 /* (const char *)&ev); */
389 xcb_destroy_window(_ecore_xcb_conn, win);
395 * Sends a delete request to the given window.
396 * @param win The given window.
397 * @ingroup Ecore_X_Window_Destroy_Group
400 ecore_x_window_delete_request_send(Ecore_X_Window win)
402 LOGFN(__FILE__, __LINE__, __FUNCTION__);
405 ecore_x_client_message32_send(win, ECORE_X_ATOM_WM_PROTOCOLS,
406 XCB_EVENT_MASK_NO_EVENT,
407 ECORE_X_ATOM_WM_DELETE_WINDOW,
408 XCB_CURRENT_TIME, 0, 0, 0);
412 ecore_x_window_configure(Ecore_X_Window win,
413 Ecore_X_Window_Configure_Mask mask,
419 Ecore_X_Window sibling,
426 LOGFN(__FILE__, __LINE__, __FUNCTION__);
431 if (mask & XCB_CONFIG_WINDOW_X)
433 vmask |= XCB_CONFIG_WINDOW_X;
436 if (mask & XCB_CONFIG_WINDOW_Y)
438 vmask |= XCB_CONFIG_WINDOW_Y;
441 if (mask & XCB_CONFIG_WINDOW_WIDTH)
443 vmask |= XCB_CONFIG_WINDOW_WIDTH;
446 if (mask & XCB_CONFIG_WINDOW_HEIGHT)
448 vmask |= XCB_CONFIG_WINDOW_HEIGHT;
451 if (mask & XCB_CONFIG_WINDOW_BORDER_WIDTH)
453 vmask |= XCB_CONFIG_WINDOW_BORDER_WIDTH;
454 vlist[i++] = border_width;
456 if (mask & XCB_CONFIG_WINDOW_SIBLING)
458 vmask |= XCB_CONFIG_WINDOW_SIBLING;
459 vlist[i++] = sibling;
461 if (mask & XCB_CONFIG_WINDOW_STACK_MODE)
463 vmask |= XCB_CONFIG_WINDOW_STACK_MODE;
464 vlist[i++] = stack_mode;
467 xcb_configure_window(_ecore_xcb_conn, win, vmask,
468 (const uint32_t *)&vlist);
473 * @defgroup Ecore_X_Window_Geometry_Group X Window Geometry Functions
475 * Functions that change or retrieve the geometry of X windows.
479 * Moves a window to the position @p x, @p y.
481 * The position is relative to the upper left hand corner of the
484 * @param win The window to move.
485 * @param x X position.
486 * @param y Y position.
487 * @ingroup Ecore_X_Window_Geometry_Group
490 ecore_x_window_move(Ecore_X_Window win,
494 uint32_t list[2], mask;
496 LOGFN(__FILE__, __LINE__, __FUNCTION__);
501 mask = (XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y);
505 xcb_configure_window(_ecore_xcb_conn, win, mask,
506 (const uint32_t *)&list);
512 * @param win The window to resize.
513 * @param w New width of the window.
514 * @param h New height of the window.
515 * @ingroup Ecore_X_Window_Geometry_Group
518 ecore_x_window_resize(Ecore_X_Window win,
522 uint32_t list[2], mask;
524 LOGFN(__FILE__, __LINE__, __FUNCTION__);
531 mask = (XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT);
535 xcb_configure_window(_ecore_xcb_conn, win, mask,
536 (const uint32_t *)&list);
541 * Moves and resizes a window.
542 * @param win The window to move and resize.
543 * @param x New X position of the window.
544 * @param y New Y position of the window.
545 * @param w New width of the window.
546 * @param h New height of the window.
547 * @ingroup Ecore_X_Window_Geometry_Group
550 ecore_x_window_move_resize(Ecore_X_Window win,
556 uint32_t list[4], mask;
558 LOGFN(__FILE__, __LINE__, __FUNCTION__);
565 mask = (XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y |
566 XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT);
572 xcb_configure_window(_ecore_xcb_conn, win, mask,
573 (const uint32_t *)&list);
578 * Retrieves the width of the border of the given window.
579 * @param win The given window.
580 * @return Width of the border of @p win.
581 * @ingroup Ecore_X_Window_Geometry_Group
584 ecore_x_window_border_width_get(Ecore_X_Window win)
586 LOGFN(__FILE__, __LINE__, __FUNCTION__);
589 return ecore_x_drawable_border_width_get(win);
593 * Sets the width of the border of the given window.
594 * @param win The given window.
595 * @param width The new border width.
596 * @ingroup Ecore_X_Window_Geometry_Group
599 ecore_x_window_border_width_set(Ecore_X_Window win,
604 LOGFN(__FILE__, __LINE__, __FUNCTION__);
611 xcb_configure_window(_ecore_xcb_conn, win,
612 XCB_CONFIG_WINDOW_BORDER_WIDTH, &list);
617 * @defgroup Ecore_X_Window_Z_Order_Group X Window Z Order Functions
619 * Functions that change the Z order of X windows.
623 * Raises the given window.
624 * @param win The window to raise.
625 * @ingroup Ecore_X_Window_Z_Order_Group
628 ecore_x_window_raise(Ecore_X_Window win)
630 uint32_t list[] = { XCB_STACK_MODE_ABOVE };
632 LOGFN(__FILE__, __LINE__, __FUNCTION__);
635 xcb_configure_window(_ecore_xcb_conn, win,
636 XCB_CONFIG_WINDOW_STACK_MODE, list);
641 * Lowers the given window.
642 * @param win The window to lower.
643 * @ingroup Ecore_X_Window_Z_Order_Group
646 ecore_x_window_lower(Ecore_X_Window win)
648 uint32_t list[] = { XCB_STACK_MODE_BELOW };
650 LOGFN(__FILE__, __LINE__, __FUNCTION__);
653 xcb_configure_window(_ecore_xcb_conn, win,
654 XCB_CONFIG_WINDOW_STACK_MODE, list);
659 * Retrieves the depth of the given window.
660 * @param win The given window.
661 * @return Depth of the window.
664 ecore_x_window_depth_get(Ecore_X_Window win)
666 LOGFN(__FILE__, __LINE__, __FUNCTION__);
668 return ecore_x_drawable_depth_get(win);
672 * @defgroup Ecore_X_Window_Properties_Group X Window Property Functions
674 * Functions that set window properties.
678 * Sets the default properties for the given window.
680 * The default properties set for the window are @c WM_CLIENT_MACHINE and
683 * @param win The given window.
684 * @ingroup Ecore_X_Window_Properties_Group
687 ecore_x_window_defaults_set(Ecore_X_Window win)
689 char buff[MAXHOSTNAMELEN], **argv;
693 LOGFN(__FILE__, __LINE__, __FUNCTION__);
696 gethostname(buff, MAXHOSTNAMELEN);
697 buff[MAXHOSTNAMELEN - 1] = '\0';
699 xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win,
700 ECORE_X_ATOM_WM_CLIENT_MACHINE, ECORE_X_ATOM_STRING,
701 8, strlen(buff), buff);
704 ecore_x_netwm_pid_set(win, pid);
705 ecore_x_netwm_window_type_set(win, ECORE_X_WINDOW_TYPE_NORMAL);
706 ecore_app_args_get(&argc, &argv);
707 ecore_x_icccm_command_set(win, argc, argv);
711 * @defgroup Ecore_X_Window_Visibility_Group X Window Visibility Functions
713 * Functions to access and change the visibility of X windows.
719 * Synonymous to "mapping" a window in X Window System terminology.
721 * @param win The window to show.
722 * @ingroup Ecore_X_Window_Visibility
725 ecore_x_window_show(Ecore_X_Window win)
727 LOGFN(__FILE__, __LINE__, __FUNCTION__);
731 xcb_map_window(_ecore_xcb_conn, win);
737 * Synonymous to "unmapping" a window in X Window System terminology.
739 * @param win The window to hide.
740 * @ingroup Ecore_X_Window_Visibility
743 ecore_x_window_hide(Ecore_X_Window win)
745 LOGFN(__FILE__, __LINE__, __FUNCTION__);
750 xcb_unmap_notify_event_t ev;
753 if (xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn)).rem == 1)
754 root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
757 xcb_get_geometry_cookie_t cookie;
758 xcb_get_geometry_reply_t *reply;
760 cookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, win);
761 reply = xcb_get_geometry_reply(_ecore_xcb_conn, cookie, NULL);
767 memset(&ev, 0, sizeof(xcb_unmap_notify_event_t));
769 ev.response_type = XCB_UNMAP_NOTIFY;
772 ev.from_configure = 0;
774 xcb_send_event(_ecore_xcb_conn, 0, root,
775 (XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
776 XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT),
779 xcb_unmap_window(_ecore_xcb_conn, win);
785 * @defgroup Ecore_X_Window_Focus_Functions X Window Focus Functions
787 * Functions that give the focus to an X Window.
791 * Sets the focus to the window @p win.
792 * @param win The window to focus.
793 * @ingroup Ecore_X_Window_Focus_Functions
796 ecore_x_window_focus(Ecore_X_Window win)
798 LOGFN(__FILE__, __LINE__, __FUNCTION__);
801 if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
803 xcb_set_input_focus(_ecore_xcb_conn,
804 XCB_INPUT_FOCUS_PARENT, win, XCB_CURRENT_TIME);
809 * Sets the focus to the given window at a specific time.
810 * @param win The window to focus.
811 * @param t When to set the focus to the window.
812 * @ingroup Ecore_X_Window_Focus_Functions
815 ecore_x_window_focus_at_time(Ecore_X_Window win,
816 Ecore_X_Time time __UNUSED__)
818 LOGFN(__FILE__, __LINE__, __FUNCTION__);
821 if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
822 xcb_set_input_focus(_ecore_xcb_conn,
823 XCB_INPUT_FOCUS_PARENT, win, XCB_CURRENT_TIME);
828 * @defgroup Ecore_X_Window_Parent_Group X Window Parent Functions
830 * Functions that retrieve or changes the parent window of a window.
834 * Moves a window to within another window at a given position.
835 * @param win The window to reparent.
836 * @param new_parent The new parent window.
837 * @param x X position within new parent window.
838 * @param y Y position within new parent window.
839 * @ingroup Ecore_X_Window_Parent_Group
842 ecore_x_window_reparent(Ecore_X_Window win,
843 Ecore_X_Window parent,
847 LOGFN(__FILE__, __LINE__, __FUNCTION__);
851 parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
853 xcb_reparent_window(_ecore_xcb_conn, win, parent, x, y);
858 ecore_x_window_pixmap_set(Ecore_X_Window win,
859 Ecore_X_Pixmap pixmap)
863 LOGFN(__FILE__, __LINE__, __FUNCTION__);
868 xcb_change_window_attributes(_ecore_xcb_conn, win,
869 XCB_CW_BACK_PIXMAP, &list);
874 * Sets the background color of the given window.
875 * @param win The given window
876 * @param r red value (0...65536, 16 bits)
877 * @param g green value (0...65536, 16 bits)
878 * @param b blue value (0...65536, 16 bits)
881 ecore_x_window_background_color_set(Ecore_X_Window win,
883 unsigned short green,
886 xcb_alloc_color_cookie_t cookie;
887 xcb_alloc_color_reply_t *reply;
890 LOGFN(__FILE__, __LINE__, __FUNCTION__);
894 xcb_alloc_color_unchecked(_ecore_xcb_conn,
895 ((xcb_screen_t *)_ecore_xcb_screen)->default_colormap,
897 reply = xcb_alloc_color_reply(_ecore_xcb_conn, cookie, NULL);
902 xcb_change_window_attributes(_ecore_xcb_conn, win,
903 XCB_CW_BACK_PIXEL, &list);
908 ecore_x_window_pixel_gravity_set(Ecore_X_Window win,
909 Ecore_X_Gravity gravity)
913 LOGFN(__FILE__, __LINE__, __FUNCTION__);
918 xcb_change_window_attributes(_ecore_xcb_conn, win,
919 XCB_CW_BIT_GRAVITY, &list);
924 ecore_x_window_gravity_set(Ecore_X_Window win,
925 Ecore_X_Gravity gravity)
929 LOGFN(__FILE__, __LINE__, __FUNCTION__);
934 xcb_change_window_attributes(_ecore_xcb_conn, win,
935 XCB_CW_WIN_GRAVITY, &list);
940 ecore_x_window_override_set(Ecore_X_Window win,
945 LOGFN(__FILE__, __LINE__, __FUNCTION__);
950 xcb_change_window_attributes(_ecore_xcb_conn, win,
951 XCB_CW_OVERRIDE_REDIRECT, &list);
956 * @brief Show the cursor on a window of type Ecore_X_Window.
957 * @param win The window for which the cursor will be showed.
958 * @param show Enables the show of the cursor on the window if equals EINA_TRUE, disables if equals EINA_FALSE.
961 ecore_x_window_cursor_show(Ecore_X_Window win,
966 LOGFN(__FILE__, __LINE__, __FUNCTION__);
969 if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
973 Ecore_X_Cursor cursor;
978 p = xcb_generate_id(_ecore_xcb_conn);
979 xcb_create_pixmap(_ecore_xcb_conn, 1, p, win, 1, 1);
980 m = xcb_generate_id(_ecore_xcb_conn);
981 xcb_create_pixmap(_ecore_xcb_conn, 1, m, win, 1, 1);
982 gc = xcb_generate_id(_ecore_xcb_conn);
983 xcb_create_gc(_ecore_xcb_conn, gc, win, 0, NULL);
984 xcb_change_gc(_ecore_xcb_conn, gc, XCB_GC_FOREGROUND, &list);
987 xcb_poly_point(_ecore_xcb_conn, XCB_COORD_MODE_ORIGIN,
989 xcb_free_gc(_ecore_xcb_conn, gc);
991 cursor = xcb_generate_id(_ecore_xcb_conn);
992 xcb_create_cursor(_ecore_xcb_conn, cursor,
993 p, m, 0, 0, 0, 0, 0, 0, 0, 0);
996 xcb_change_window_attributes(_ecore_xcb_conn, win,
997 XCB_CW_CURSOR, &list);
999 xcb_free_cursor(_ecore_xcb_conn, cursor);
1000 xcb_free_pixmap(_ecore_xcb_conn, m);
1001 xcb_free_pixmap(_ecore_xcb_conn, p);
1005 xcb_change_window_attributes(_ecore_xcb_conn, win,
1006 XCB_CW_CURSOR, &list);
1012 ecore_x_window_cursor_set(Ecore_X_Window win,
1013 Ecore_X_Cursor cursor)
1017 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1022 xcb_change_window_attributes(_ecore_xcb_conn, win, XCB_CW_CURSOR, &list);
1027 ecore_x_window_container_manage(Ecore_X_Window win)
1031 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1034 list = (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
1035 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY);
1037 xcb_change_window_attributes(_ecore_xcb_conn, win,
1038 XCB_CW_EVENT_MASK, &list);
1043 ecore_x_window_client_manage(Ecore_X_Window win)
1047 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1050 list = (XCB_EVENT_MASK_VISIBILITY_CHANGE |
1051 XCB_EVENT_MASK_FOCUS_CHANGE |
1052 XCB_EVENT_MASK_PROPERTY_CHANGE |
1053 XCB_EVENT_MASK_COLOR_MAP_CHANGE |
1054 XCB_EVENT_MASK_STRUCTURE_NOTIFY |
1055 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY);
1057 xcb_change_window_attributes(_ecore_xcb_conn, win,
1058 XCB_CW_EVENT_MASK, &list);
1060 #ifdef ECORE_XCB_SHAPE
1061 xcb_shape_select_input(_ecore_xcb_conn, win, EINA_TRUE);
1067 ecore_x_window_sniff(Ecore_X_Window win)
1071 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1074 list = (XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
1075 XCB_EVENT_MASK_PROPERTY_CHANGE);
1077 xcb_change_window_attributes(_ecore_xcb_conn, win,
1078 XCB_CW_EVENT_MASK, &list);
1083 ecore_x_window_unsniff(Ecore_X_Window win)
1087 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1088 ///TODO: implement xcb
1093 ecore_x_window_client_sniff(Ecore_X_Window win)
1097 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1100 list = (XCB_EVENT_MASK_VISIBILITY_CHANGE |
1101 XCB_EVENT_MASK_STRUCTURE_NOTIFY |
1102 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
1103 XCB_EVENT_MASK_FOCUS_CHANGE |
1104 XCB_EVENT_MASK_PROPERTY_CHANGE |
1105 XCB_EVENT_MASK_COLOR_MAP_CHANGE);
1107 xcb_change_window_attributes(_ecore_xcb_conn, win,
1108 XCB_CW_EVENT_MASK, &list);
1109 #ifdef ECORE_XCB_SHAPE
1110 xcb_shape_select_input(_ecore_xcb_conn, win, EINA_TRUE);
1116 ecore_x_window_area_clear(Ecore_X_Window win,
1122 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1125 xcb_clear_area(_ecore_xcb_conn, 0, win, x, y, w, h);
1130 ecore_x_window_area_expose(Ecore_X_Window win,
1136 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1139 xcb_clear_area(_ecore_xcb_conn, 1, win, x, y, w, h);
1144 ecore_x_window_save_set_add(Ecore_X_Window win)
1146 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1149 xcb_change_save_set(_ecore_xcb_conn, XCB_SET_MODE_INSERT, win);
1153 ecore_x_window_save_set_del(Ecore_X_Window win)
1155 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1158 xcb_change_save_set(_ecore_xcb_conn, XCB_SET_MODE_DELETE, win);
1162 * gets the window that has focus.
1163 * @return The window that has focus.
1164 * @ingroup Ecore_X_Window_Focus_Functions
1167 ecore_x_window_focus_get(void)
1169 xcb_get_input_focus_cookie_t cookie;
1170 xcb_get_input_focus_reply_t *reply;
1171 Ecore_X_Window focus = 0;
1173 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1176 cookie = xcb_get_input_focus_unchecked(_ecore_xcb_conn);
1177 reply = xcb_get_input_focus_reply(_ecore_xcb_conn, cookie, NULL);
1178 if (!reply) return 0;
1179 focus = reply->focus;
1185 ecore_x_window_argb_get(Ecore_X_Window win)
1188 #ifdef ECORE_XCB_RENDER
1189 Ecore_X_Visual visual;
1192 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1195 // if (!win) return ret;
1197 #ifdef ECORE_XCB_RENDER
1198 /* grab the window's visual */
1199 visual = _ecore_xcb_window_visual_get(win);
1201 /* check if this visual supports alpha */
1202 ret = _ecore_xcb_render_visual_supports_alpha(visual);
1209 ecore_x_window_manage(Ecore_X_Window win)
1211 xcb_get_window_attributes_cookie_t cookie;
1212 xcb_get_window_attributes_reply_t *reply;
1213 xcb_void_cookie_t change_cookie;
1214 xcb_generic_error_t *err;
1217 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1220 cookie = xcb_get_window_attributes(_ecore_xcb_conn, win);
1221 reply = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie, NULL);
1222 if (!reply) return EINA_FALSE;
1224 ecore_x_sync(); // needed
1226 list = (XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
1227 XCB_EVENT_MASK_PROPERTY_CHANGE | XCB_EVENT_MASK_RESIZE_REDIRECT |
1228 XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
1229 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
1230 XCB_EVENT_MASK_STRUCTURE_NOTIFY |
1231 XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE |
1232 reply->your_event_mask);
1235 change_cookie = xcb_change_window_attributes(_ecore_xcb_conn, win,
1236 XCB_CW_EVENT_MASK, &list);
1238 ecore_x_sync(); // needed
1240 err = xcb_request_check(_ecore_xcb_conn, change_cookie);
1243 _ecore_xcb_error_handle(err);
1252 ecore_x_window_attributes_get(Ecore_X_Window win,
1253 Ecore_X_Window_Attributes *att_ret)
1255 xcb_get_window_attributes_cookie_t cookie;
1256 xcb_get_window_attributes_reply_t *reply;
1257 xcb_get_geometry_cookie_t gcookie;
1258 xcb_get_geometry_reply_t *greply;
1260 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1263 cookie = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, win);
1264 reply = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie, NULL);
1265 if (!reply) return EINA_FALSE;
1267 memset(att_ret, 0, sizeof(Ecore_X_Window_Attributes));
1269 if (reply->map_state != XCB_MAP_STATE_UNMAPPED)
1270 att_ret->visible = EINA_TRUE;
1272 if (reply->map_state == XCB_MAP_STATE_VIEWABLE)
1273 att_ret->viewable = EINA_TRUE;
1275 if (reply->override_redirect)
1276 att_ret->override = EINA_TRUE;
1278 if (reply->_class == XCB_WINDOW_CLASS_INPUT_ONLY)
1279 att_ret->input_only = EINA_TRUE;
1281 if (reply->save_under)
1282 att_ret->save_under = EINA_TRUE;
1284 att_ret->event_mask.mine = reply->your_event_mask;
1285 att_ret->event_mask.all = reply->all_event_masks;
1286 att_ret->event_mask.no_propagate = reply->do_not_propagate_mask;
1287 att_ret->window_gravity = reply->win_gravity;
1288 att_ret->pixel_gravity = reply->bit_gravity;
1289 att_ret->colormap = reply->colormap;
1290 att_ret->visual = _ecore_xcb_window_find_visual_by_id(reply->visual);
1294 gcookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, win);
1295 greply = xcb_get_geometry_reply(_ecore_xcb_conn, gcookie, NULL);
1296 if (!greply) return EINA_TRUE;
1298 /* xcb_translate_coordinates_reply_t *trans; */
1299 /* xcb_query_tree_cookie_t tcookie; */
1300 /* xcb_query_tree_reply_t *treply; */
1302 /* tcookie = xcb_query_tree(_ecore_xcb_conn, win); */
1303 /* treply = xcb_query_tree_reply(_ecore_xcb_conn, tcookie, NULL); */
1306 /* xcb_translate_coordinates_reply(_ecore_xcb_conn, */
1307 /* xcb_translate_coordinates(_ecore_xcb_conn, */
1308 /* win, treply->parent, greply->x, greply->y), NULL); */
1311 att_ret->root = greply->root;
1312 att_ret->depth = greply->depth;
1313 // att_ret->x = trans->dst_x;
1314 // att_ret->y = trans->dst_y;
1315 att_ret->x = greply->x;
1316 att_ret->y = greply->y;
1317 att_ret->w = greply->width;
1318 att_ret->h = greply->height;
1319 att_ret->border = greply->border_width;
1328 * Retrieves the size of the given window.
1329 * @param win The given window.
1330 * @param w Pointer to an integer into which the width is to be stored.
1331 * @param h Pointer to an integer into which the height is to be stored.
1332 * @ingroup Ecore_X_Window_Geometry_Group
1335 ecore_x_window_size_get(Ecore_X_Window win,
1339 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1342 if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
1343 ecore_x_drawable_geometry_get(win, NULL, NULL, width, height);
1347 * Set if a window should be ignored.
1348 * @param win The given window.
1349 * @param ignore if to ignore
1352 ecore_x_window_ignore_set(Ecore_X_Window win,
1355 int i = 0, j = 0, count = 0;
1357 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1364 for (i = 0; i < ignore_num; i++)
1365 if (win == ignore_list[i]) return;
1368 realloc(ignore_list, (ignore_num + 1) * sizeof(Ecore_X_Window));
1369 if (!ignore_list) return;
1371 ignore_list[ignore_num++] = win;
1376 ignore_list = malloc(sizeof(Ecore_X_Window));
1377 if (!ignore_list) return;
1378 ignore_list[ignore_num++] = win;
1383 if (!ignore_list) return;
1384 for (count = ignore_num, i = 0, j = 0; i < count; i++)
1386 if (win != ignore_list[i])
1387 ignore_list[j++] = ignore_list[i];
1391 if (ignore_num <= 0)
1399 realloc(ignore_list, ignore_num * sizeof(Ecore_X_Window));
1404 * Get the ignore list
1405 * @param num number of windows in the list
1406 * @return list of windows to ignore
1408 EAPI Ecore_X_Window *
1409 ecore_x_window_ignore_list(int *num)
1411 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1413 if (num) *num = ignore_num;
1418 * Get a list of all the root windows on the server.
1420 * @note The returned array will need to be freed after use.
1421 * @param num_ret Pointer to integer to put number of windows returned in.
1422 * @return An array of all the root windows. @c NULL is returned if memory
1423 * could not be allocated for the list, or if @p num_ret is @c NULL.
1425 EAPI Ecore_X_Window *
1426 ecore_x_window_root_list(int *num_ret)
1428 xcb_screen_iterator_t iter;
1430 Ecore_X_Window *roots = NULL;
1431 #ifdef ECORE_XCB_XPRINT
1432 const xcb_query_extension_reply_t *ext_reply;
1435 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1438 if (!num_ret) return NULL;
1439 if (num_ret) *num_ret = 0;
1441 /* if (xcb_connection_has_error(_ecore_xcb_conn)) */
1443 /* DBG("XCB Connection Has Error !!!"); */
1447 num = ecore_x_screen_count_get();
1449 #ifdef ECORE_XCB_XPRINT
1450 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_x_print_id);
1451 if ((ext_reply) && (ext_reply->present))
1453 xcb_x_print_print_query_screens_cookie_t cookie;
1454 xcb_x_print_print_query_screens_reply_t *reply;
1456 cookie = xcb_x_print_print_query_screens_unchecked(_ecore_xcb_conn);
1458 xcb_x_print_print_query_screens_reply(_ecore_xcb_conn, cookie, NULL);
1461 xcb_window_t *screens;
1462 int psnum = 0, overlap = 0, j = 0, k = 0;
1464 psnum = xcb_x_print_print_query_screens_roots_length(reply);
1465 screens = xcb_x_print_print_query_screens_roots(reply);
1466 for (i = 0; i < num; i++)
1468 for (j = 0; j < psnum; j++)
1472 if ((s = _ecore_xcb_window_screen_of_display(i)))
1474 if (s->root == screens[j])
1479 if (!(roots = malloc((num - overlap)
1480 * sizeof(Ecore_X_Window)))) return NULL;
1481 for (i = 0; i < num; i++)
1483 Eina_Bool is_print = EINA_FALSE;
1485 for (j = 0; j < psnum; j++)
1489 if ((s = _ecore_xcb_window_screen_of_display(i)))
1491 if (s->root == screens[j])
1493 is_print = EINA_TRUE;
1502 if ((s = _ecore_xcb_window_screen_of_display(i)))
1509 if (num_ret) *num_ret = k;
1514 /* Fallback to default method */
1516 xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
1517 if (!(roots = malloc(num * sizeof(Ecore_X_Window)))) return NULL;
1518 if (num_ret) *num_ret = num;
1519 for (i = 0; iter.rem; xcb_screen_next(&iter), i++)
1520 roots[i] = iter.data->root;
1525 /* Fallback to default method */
1527 xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
1528 if (!(roots = malloc(num * sizeof(Ecore_X_Window)))) return NULL;
1529 if (num_ret) *num_ret = num;
1530 for (i = 0; iter.rem; xcb_screen_next(&iter), i++)
1531 roots[i] = iter.data->root;
1535 xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
1536 if (!(roots = malloc(num * sizeof(Ecore_X_Window)))) return NULL;
1537 if (num_ret) *num_ret = num;
1538 for (i = 0; iter.rem; xcb_screen_next(&iter), i++)
1539 roots[i] = iter.data->root;
1545 EAPI Ecore_X_Window *
1546 ecore_x_window_children_get(Ecore_X_Window win,
1549 xcb_query_tree_cookie_t cookie;
1550 xcb_query_tree_reply_t *reply;
1551 Ecore_X_Window *windows = NULL;
1553 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1557 cookie = xcb_query_tree_unchecked(_ecore_xcb_conn, win);
1558 reply = xcb_query_tree_reply(_ecore_xcb_conn, cookie, NULL);
1559 if (!reply) return NULL;
1561 if (num) *num = reply->children_len;
1562 if (reply->children_len > 0)
1564 windows = malloc(sizeof(Ecore_X_Window) * reply->children_len);
1570 w = xcb_query_tree_children(reply);
1571 for (i = 0; i < reply->children_len; i++)
1581 * Retrieves the root window a given window is on.
1582 * @param win The window to get the root window of
1583 * @return The root window of @p win
1584 * @ingroup Ecore_X_Window_Geometry_Group
1587 ecore_x_window_root_get(Ecore_X_Window win)
1589 xcb_get_geometry_cookie_t gcookie;
1590 xcb_get_geometry_reply_t *greply;
1591 Ecore_X_Window window = 0;
1593 /* LOGFN(__FILE__, __LINE__, __FUNCTION__); */
1596 gcookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, win);
1597 greply = xcb_get_geometry_reply(_ecore_xcb_conn, gcookie, NULL);
1598 if (!greply) return 0;
1599 window = greply->root;
1606 ecore_x_window_root_first_get(void)
1608 return ((xcb_screen_t *)_ecore_xcb_screen)->root;
1612 * Retrieves the geometry of the given window.
1614 * Note that the x & y coordingates are relative to your parent. In
1615 * particular for reparenting window managers - relative to you window border.
1616 * If you want screen coordinates either walk the window tree to the root,
1617 * else for ecore_evas applications see ecore_evas_geometry_get(). Elementary
1618 * applications can use elm_win_screen_position_get().
1620 * @param win The given window.
1621 * @param x Pointer to an integer in which the X position is to be stored.
1622 * @param y Pointer to an integer in which the Y position is to be stored.
1623 * @param w Pointer to an integer in which the width is to be stored.
1624 * @param h Pointer to an integer in which the height is to be stored.
1625 * @ingroup Ecore_X_Window_Geometry_Group
1628 ecore_x_window_geometry_get(Ecore_X_Window win,
1634 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1637 if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
1638 ecore_x_drawable_geometry_get(win, x, y, w, h);
1642 * Retrieves the top, visible window at the given location.
1643 * @param x The given X position.
1644 * @param y The given Y position.
1645 * @return The window at that position.
1646 * @ingroup Ecore_X_Window_Geometry_Group
1649 ecore_x_window_at_xy_get(int x,
1652 Ecore_X_Window root, win = 0;
1654 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1657 root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
1660 win = _ecore_xcb_window_at_xy_get(root, 0, 0, x, y, NULL, 0);
1663 return win ? win : root;
1667 * Retrieves the top, visible window at the given location,
1668 * but skips the windows in the list.
1669 * @param x The given X position.
1670 * @param y The given Y position.
1671 * @param skip The list of windows to be skipped.
1672 * @param skip_num The number of windows to be skipped.
1673 * @return The window at that position.
1674 * @ingroup Ecore_X_Window_Geometry_Group
1677 ecore_x_window_at_xy_with_skip_get(int x,
1679 Ecore_X_Window *skip,
1682 Ecore_X_Window root, win = 0;
1684 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1687 root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
1690 win = _ecore_xcb_window_at_xy_get(root, 0, 0, x, y, skip, skip_num);
1693 return win ? win : root;
1697 ecore_x_window_at_xy_begin_get(Ecore_X_Window begin,
1701 Ecore_X_Window win = 0;
1703 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1707 win = _ecore_xcb_window_at_xy_get(begin, 0, 0, x, y, NULL, 0);
1710 return win ? win : begin;
1714 * Retrieves the parent window of the given window.
1715 * @param win The given window.
1716 * @return The parent window of @p win.
1717 * @ingroup Ecore_X_Window_Parent_Group
1720 ecore_x_window_parent_get(Ecore_X_Window win)
1722 xcb_query_tree_cookie_t cookie;
1723 xcb_query_tree_reply_t *reply;
1724 Ecore_X_Window window = 0;
1726 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1729 // if (!win) return 0;
1730 cookie = xcb_query_tree(_ecore_xcb_conn, win);
1731 reply = xcb_query_tree_reply(_ecore_xcb_conn, cookie, NULL);
1732 if (!reply) return 0;
1733 window = reply->parent;
1740 * Finds out whether the given window is currently visible.
1741 * @param win The given window.
1742 * @return 1 if the window is visible, otherwise 0.
1743 * @ingroup Ecore_X_Window_Visibility_Group
1746 ecore_x_window_visible_get(Ecore_X_Window win)
1748 xcb_get_window_attributes_cookie_t cookie;
1749 xcb_get_window_attributes_reply_t *reply;
1750 int ret = EINA_FALSE;
1752 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1755 cookie = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, win);
1756 reply = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie, NULL);
1757 if (!reply) return EINA_FALSE;
1759 if (reply->map_state == XCB_MAP_STATE_VIEWABLE)
1767 ecore_x_window_button_grab(Ecore_X_Window win,
1769 Ecore_X_Event_Mask mask,
1774 uint16_t m, locks[8], ev;
1778 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1783 b = XCB_BUTTON_INDEX_ANY;
1785 m = _ecore_xcb_window_modifiers_get(mod);
1786 if (any_mod) m = XCB_MOD_MASK_ANY;
1789 locks[1] = ECORE_X_LOCK_CAPS;
1790 locks[2] = ECORE_X_LOCK_NUM;
1791 locks[3] = ECORE_X_LOCK_SCROLL;
1792 locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
1793 locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
1794 locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1795 locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1798 for (i = 0; i < 8; i++)
1799 xcb_grab_button(_ecore_xcb_conn, 0, win, ev,
1800 XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC,
1801 XCB_NONE, XCB_NONE, b, m | locks[i]);
1803 _ecore_xcb_button_grabs_num++;
1804 t = realloc(_ecore_xcb_button_grabs,
1805 _ecore_xcb_button_grabs_num * sizeof(Ecore_X_Window));
1808 _ecore_xcb_button_grabs = t;
1809 _ecore_xcb_button_grabs[_ecore_xcb_button_grabs_num - 1] = win;
1813 ecore_x_window_button_ungrab(Ecore_X_Window win,
1819 uint16_t m = 0, locks[8];
1822 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1826 if (b == 0) b = XCB_BUTTON_INDEX_ANY;
1828 m = _ecore_xcb_window_modifiers_get(mod);
1829 if (any_mod) m = XCB_MOD_MASK_ANY;
1832 locks[1] = ECORE_X_LOCK_CAPS;
1833 locks[2] = ECORE_X_LOCK_NUM;
1834 locks[3] = ECORE_X_LOCK_SCROLL;
1835 locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
1836 locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
1837 locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1838 locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1840 for (i = 0; i < 8; i++)
1841 xcb_ungrab_button(_ecore_xcb_conn, b, win, m | locks[i]);
1843 _ecore_xcb_sync_magic_send(1, win);
1847 ecore_x_window_key_grab(Ecore_X_Window win,
1852 xcb_keycode_t keycode = XCB_NO_SYMBOL;
1853 uint16_t m = 0, locks[8];
1857 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1860 keycode = _ecore_xcb_keymap_string_to_keycode(key);
1861 if (keycode == XCB_NO_SYMBOL) return;
1863 m = _ecore_xcb_window_modifiers_get(mod);
1864 if (any_mod) m = XCB_MOD_MASK_ANY;
1867 locks[1] = ECORE_X_LOCK_CAPS;
1868 locks[2] = ECORE_X_LOCK_NUM;
1869 locks[3] = ECORE_X_LOCK_SCROLL;
1870 locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
1871 locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
1872 locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1873 locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1875 for (i = 0; i < 8; i++)
1876 xcb_grab_key(_ecore_xcb_conn, 0, win, m | locks[i],
1877 keycode, XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC);
1878 _ecore_xcb_key_grabs_num++;
1879 t = realloc(_ecore_xcb_key_grabs,
1880 _ecore_xcb_key_grabs_num * sizeof(Ecore_X_Window));
1882 _ecore_xcb_key_grabs = t;
1883 _ecore_xcb_key_grabs[_ecore_xcb_key_grabs_num - 1] = win;
1887 ecore_x_window_key_ungrab(Ecore_X_Window win,
1892 xcb_keycode_t keycode = XCB_NO_SYMBOL;
1893 uint16_t m = 0, locks[8];
1896 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1899 keycode = _ecore_xcb_keymap_string_to_keycode(key);
1900 if (keycode == XCB_NO_SYMBOL) return;
1902 m = _ecore_xcb_window_modifiers_get(mod);
1903 if (any_mod) m = XCB_MOD_MASK_ANY;
1906 locks[1] = ECORE_X_LOCK_CAPS;
1907 locks[2] = ECORE_X_LOCK_NUM;
1908 locks[3] = ECORE_X_LOCK_SCROLL;
1909 locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
1910 locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
1911 locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1912 locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1914 for (i = 0; i < 8; i++)
1915 xcb_ungrab_key(_ecore_xcb_conn, keycode, win, m | locks[i]);
1917 _ecore_xcb_sync_magic_send(2, win);
1920 /* local functions */
1922 _ecore_xcb_window_root_of_screen_get(int screen)
1924 xcb_screen_iterator_t iter;
1927 iter = xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
1928 for (; iter.rem; --screen, xcb_screen_next(&iter))
1933 if ((s = iter.data))
1939 static Ecore_X_Window
1940 _ecore_xcb_window_argb_internal_new(Ecore_X_Window parent,
1945 uint8_t override_redirect,
1948 Ecore_X_Window win = 0;
1949 #ifdef ECORE_XCB_RENDER
1950 uint32_t value_list[10];
1951 uint32_t value_mask;
1953 Ecore_X_Colormap colormap;
1956 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1959 #ifdef ECORE_XCB_RENDER
1961 parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
1964 _ecore_xcb_render_find_visual_id(XCB_RENDER_PICT_TYPE_DIRECT, EINA_TRUE);
1966 colormap = xcb_generate_id(_ecore_xcb_conn);
1967 xcb_create_colormap(_ecore_xcb_conn, XCB_COLORMAP_ALLOC_NONE,
1968 colormap, parent, vis);
1970 value_mask = (XCB_CW_BACK_PIXMAP | XCB_CW_BORDER_PIXEL | XCB_CW_BIT_GRAVITY |
1971 XCB_CW_WIN_GRAVITY | XCB_CW_BACKING_STORE |
1972 XCB_CW_OVERRIDE_REDIRECT | XCB_CW_SAVE_UNDER |
1973 XCB_CW_EVENT_MASK | XCB_CW_DONT_PROPAGATE | XCB_CW_COLORMAP);
1975 value_list[0] = XCB_BACK_PIXMAP_NONE;
1977 value_list[2] = XCB_GRAVITY_NORTH_WEST;
1978 value_list[3] = XCB_GRAVITY_NORTH_WEST;
1979 value_list[4] = XCB_BACKING_STORE_NOT_USEFUL;
1980 value_list[5] = override_redirect;
1981 value_list[6] = save_under;
1982 value_list[7] = (XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE |
1983 XCB_EVENT_MASK_BUTTON_PRESS |
1984 XCB_EVENT_MASK_BUTTON_RELEASE |
1985 XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
1986 XCB_EVENT_MASK_POINTER_MOTION | XCB_EVENT_MASK_EXPOSURE |
1987 XCB_EVENT_MASK_VISIBILITY_CHANGE |
1988 XCB_EVENT_MASK_STRUCTURE_NOTIFY |
1989 XCB_EVENT_MASK_FOCUS_CHANGE |
1990 XCB_EVENT_MASK_PROPERTY_CHANGE |
1991 XCB_EVENT_MASK_COLOR_MAP_CHANGE);
1992 value_list[8] = XCB_EVENT_MASK_NO_EVENT;
1993 value_list[9] = colormap;
1995 win = xcb_generate_id(_ecore_xcb_conn);
1996 xcb_create_window(_ecore_xcb_conn, 32, win, parent, x, y, w, h, 0,
1997 XCB_WINDOW_CLASS_INPUT_OUTPUT, vis, value_mask,
2000 xcb_free_colormap(_ecore_xcb_conn, colormap);
2002 if (parent == ((xcb_screen_t *)_ecore_xcb_screen)->root)
2003 ecore_x_window_defaults_set(win);
2009 static Ecore_X_Window
2010 _ecore_xcb_window_at_xy_get(Ecore_X_Window base,
2015 Ecore_X_Window *skip,
2018 xcb_query_tree_cookie_t cookie;
2019 xcb_query_tree_reply_t *reply;
2020 Ecore_X_Window *windows = NULL;
2021 int wx, wy, ww, wh, num, i = 0;
2022 Eina_Bool skipit = EINA_FALSE;
2024 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2027 if (!ecore_x_window_visible_get(base)) return 0;
2029 ecore_x_window_geometry_get(base, &wx, &wy, &ww, &wh);
2033 if (!((x >= wx) && (y >= wy) && (x < (wx + ww)) && (y < (wy + wh))))
2036 cookie = xcb_query_tree_unchecked(_ecore_xcb_conn, base);
2037 reply = xcb_query_tree_reply(_ecore_xcb_conn, cookie, NULL);
2038 if (!reply) return 0;
2040 num = reply->children_len;
2041 windows = xcb_query_tree_children(reply);
2043 for (i = (num - 1); i >= 0; --i)
2045 skipit = EINA_FALSE;
2051 for (j = 0; j < skip_num; j++)
2053 if (windows[i] == skip[j])
2063 Ecore_X_Window child = 0;
2066 _ecore_xcb_window_at_xy_get(windows[i],
2067 wx, wy, x, y, skip, skip_num);
2070 if (reply) free(reply);
2076 if (reply) free(reply);
2081 _ecore_xcb_window_visual_get(Ecore_X_Window win)
2083 xcb_get_window_attributes_cookie_t cookie;
2084 xcb_get_window_attributes_reply_t *reply;
2085 Ecore_X_Visual visual = 0;
2089 cookie = xcb_get_window_attributes(_ecore_xcb_conn, win);
2090 reply = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie, NULL);
2091 if (!reply) return 0;
2092 visual = _ecore_xcb_window_find_visual_by_id(reply->visual);
2099 _ecore_xcb_window_button_grab_remove(Ecore_X_Window win)
2101 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2104 if (_ecore_xcb_button_grabs_num > 0)
2106 int i = 0, shuffle = 0;
2108 for (i = 0; i < _ecore_xcb_button_grabs_num; i++)
2111 _ecore_xcb_button_grabs[i - 1] = _ecore_xcb_button_grabs[i];
2113 if ((!shuffle) && (_ecore_xcb_button_grabs[i] == win))
2121 _ecore_xcb_button_grabs_num--;
2122 if (_ecore_xcb_button_grabs_num <= 0)
2124 free(_ecore_xcb_button_grabs);
2125 _ecore_xcb_button_grabs = NULL;
2129 t = realloc(_ecore_xcb_button_grabs,
2130 _ecore_xcb_button_grabs_num * sizeof(Ecore_X_Window));
2132 _ecore_xcb_button_grabs = t;
2138 _ecore_xcb_window_key_grab_remove(Ecore_X_Window win)
2140 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2143 if (_ecore_xcb_key_grabs_num > 0)
2145 int i = 0, shuffle = 0;
2147 for (i = 0; i < _ecore_xcb_key_grabs_num; i++)
2150 _ecore_xcb_key_grabs[i - 1] = _ecore_xcb_key_grabs[i];
2152 if ((!shuffle) && (_ecore_xcb_key_grabs[i] == win))
2160 _ecore_xcb_key_grabs_num--;
2161 if (_ecore_xcb_key_grabs_num <= 0)
2163 free(_ecore_xcb_key_grabs);
2164 _ecore_xcb_key_grabs = NULL;
2168 t = realloc(_ecore_xcb_key_grabs,
2169 _ecore_xcb_key_grabs_num * sizeof(Ecore_X_Window));
2171 _ecore_xcb_key_grabs = t;
2177 _ecore_xcb_window_grab_allow_events(Ecore_X_Window event_win,
2178 Ecore_X_Window child_win,
2181 Ecore_X_Time timestamp)
2185 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2188 for (i = 0; i < _ecore_xcb_button_grabs_num; i++)
2190 if ((_ecore_xcb_button_grabs[i] == event_win) ||
2191 (_ecore_xcb_button_grabs[i] == child_win))
2193 Eina_Bool replay = EINA_FALSE;
2195 if (_ecore_xcb_window_grab_replay_func)
2198 _ecore_xcb_window_grab_replay_func(_ecore_xcb_window_grab_replay_data,
2203 xcb_allow_events(_ecore_xcb_conn,
2204 XCB_ALLOW_REPLAY_POINTER, timestamp);
2208 xcb_allow_events(_ecore_xcb_conn,
2209 XCB_ALLOW_ASYNC_POINTER, timestamp);
2217 _ecore_xcb_window_modifiers_get(unsigned int state)
2221 if (state & ECORE_EVENT_MODIFIER_SHIFT)
2222 xmodifiers |= ECORE_X_MODIFIER_SHIFT;
2223 if (state & ECORE_EVENT_MODIFIER_CTRL)
2224 xmodifiers |= ECORE_X_MODIFIER_CTRL;
2225 if (state & ECORE_EVENT_MODIFIER_ALT)
2226 xmodifiers |= ECORE_X_MODIFIER_ALT;
2227 if (state & ECORE_EVENT_MODIFIER_WIN)
2228 xmodifiers |= ECORE_X_MODIFIER_WIN;
2229 if (state & ECORE_EVENT_MODIFIER_ALTGR)
2230 xmodifiers |= ECORE_X_MODIFIER_ALTGR;
2231 if (state & ECORE_EVENT_LOCK_SCROLL)
2232 xmodifiers |= ECORE_X_LOCK_SCROLL;
2233 if (state & ECORE_EVENT_LOCK_NUM)
2234 xmodifiers |= ECORE_X_LOCK_NUM;
2235 if (state & ECORE_EVENT_LOCK_CAPS)
2236 xmodifiers |= ECORE_X_LOCK_CAPS;
2237 if (state & ECORE_EVENT_LOCK_SHIFT)
2238 xmodifiers |= ECORE_X_LOCK_SHIFT;
2243 static xcb_visualtype_t *
2244 _ecore_xcb_window_find_visual_by_id(xcb_visualid_t id)
2246 xcb_depth_iterator_t diter;
2247 xcb_visualtype_iterator_t viter;
2250 diter = xcb_screen_allowed_depths_iterator(_ecore_xcb_screen);
2251 for (; diter.rem; xcb_depth_next(&diter))
2253 viter = xcb_depth_visuals_iterator(diter.data);
2254 for (; viter.rem; xcb_visualtype_next(&viter))
2256 if (viter.data->visual_id == id)
2263 #ifdef ECORE_XCB_XPRINT
2264 static xcb_screen_t *
2265 _ecore_xcb_window_screen_of_display(int screen)
2267 xcb_screen_iterator_t iter;
2270 iter = xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
2271 for (; iter.rem; --screen, xcb_screen_next(&iter))