cairo_surface_t *surface;
cairo_t *cr;
- surface = _gdk_x11_window_create_bitmap_surface (gdk_x11_display_get_root_window (display), 1, 1);
+ surface = _gdk_x11_display_create_bitmap_surface (display, 1, 1);
/* Clear surface */
cr = cairo_create (surface);
cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
guint *width,
guint *height)
{
- GdkWindow *window;
-
g_return_if_fail (GDK_IS_DISPLAY (display));
- window = gdk_x11_display_get_root_window (display);
XQueryBestCursor (GDK_DISPLAY_XDISPLAY (display),
- GDK_WINDOW_XID (window),
+ GDK_SCREEN_XROOTWIN (GDK_X11_DISPLAY (display)->screen),
128, 128, width, height);
}
display = gdk_device_get_display (device);
xdisplay = GDK_DISPLAY_XDISPLAY (display);
screen = GDK_X11_DISPLAY (display)->screen;
- dest = GDK_WINDOW_XID (gdk_x11_display_get_root_window (display));
+ dest = GDK_SCREEN_XROOTWIN (screen);
XWarpPointer (xdisplay, None, dest, 0, 0, 0, 0,
round (x * GDK_X11_SCREEN (screen)->window_scale),
gdouble *win_y,
GdkModifierType *mask)
{
- GdkWindowImplX11 *impl;
GdkDisplay *display;
GdkScreen *screen;
+ Window xwindow, w;
Window xroot_window, xchild_window;
int xroot_x, xroot_y, xwin_x, xwin_y;
unsigned int xmask;
+ int scale;
display = gdk_device_get_display (device);
screen = GDK_X11_DISPLAY (display)->screen;
if (window == NULL)
- window = gdk_x11_display_get_root_window (display);
- impl = GDK_WINDOW_IMPL_X11 (window->impl);
+ {
+ xwindow = GDK_SCREEN_XROOTWIN (screen);
+ scale = GDK_X11_SCREEN (screen)->window_scale;
+ }
+ else
+ {
+ xwindow = GDK_WINDOW_XID (window);
+ scale = GDK_WINDOW_IMPL_X11 (window->impl)->window_scale;
+ }
if (!GDK_X11_DISPLAY (display)->trusted_client ||
!XQueryPointer (GDK_WINDOW_XDISPLAY (window),
- GDK_WINDOW_XID (window),
+ xwindow,
&xroot_window,
&xchild_window,
&xroot_x, &xroot_y,
{
XSetWindowAttributes attributes;
Display *xdisplay;
- Window xwindow, w;
/* FIXME: untrusted clients not multidevice-safe */
xdisplay = GDK_SCREEN_XDISPLAY (screen);
*child_window = gdk_x11_window_lookup_for_display (display, xchild_window);
if (root_x)
- *root_x = (double)xroot_x / impl->window_scale;
+ *root_x = (double)xroot_x / scale;
if (root_y)
- *root_y = (double)xroot_y / impl->window_scale;
+ *root_y = (double)xroot_y / scale;
if (win_x)
- *win_x = (double)xwin_x / impl->window_scale;
+ *win_x = (double)xwin_x / scale;
if (win_y)
- *win_y = (double)xwin_y / impl->window_scale;
+ *win_y = (double)xwin_y / scale;
if (mask)
*mask = xmask;
GdkDisplay *display;
XIDeviceInfo *info;
gint i, j, ndevices;
+ Screen *xscreen;
display = gdk_device_get_display (device);
+ xscreen = GDK_X11_SCREEN (GDK_X11_DISPLAY (display)->screen)->xscreen;
gdk_x11_display_error_trap_push (display);
info = XIQueryDevice (GDK_DISPLAY_XDISPLAY (display),
_gdk_device_translate_window_coord (device, window, j, value, &axes[j]);
else
{
- GdkWindow *root_window;
gint root_x, root_y;
- root_window = gdk_x11_display_get_root_window (gdk_window_get_display (window));
/* FIXME: Maybe root coords chaching should happen here */
gdk_window_get_origin (window, &root_x, &root_y);
_gdk_device_translate_screen_coord (device, window,
root_x, root_y,
- gdk_window_get_width (root_window),
- gdk_window_get_height (root_window),
+ WidthOfScreen (xscreen),
+ HeightOfScreen (xscreen),
j, value,
&axes[j]);
}
gdouble y)
{
GdkX11DeviceXI2 *device_xi2 = GDK_X11_DEVICE_XI2 (device);
- Window dest;
GdkDisplay *display = gdk_device_get_display (device);
GdkScreen *screen = GDK_X11_DISPLAY (display)->screen;
-
- dest = GDK_WINDOW_XID (gdk_x11_display_get_root_window (display));
+ Window dest = GDK_DISPLAY_XROOTWIN (display);
XIWarpPointer (GDK_SCREEN_XDISPLAY (screen),
device_xi2->device_id,
None, dest,
0, 0, 0, 0,
- round (x * GDK_X11_SCREEN(screen)->window_scale),
- round (y * GDK_X11_SCREEN(screen)->window_scale));
+ round (x * GDK_X11_SCREEN (screen)->window_scale),
+ round (y * GDK_X11_SCREEN (screen)->window_scale));
}
static void
gdouble *win_y,
GdkModifierType *mask)
{
- GdkWindowImplX11 *impl;
GdkX11DeviceXI2 *device_xi2 = GDK_X11_DEVICE_XI2 (device);
GdkDisplay *display;
GdkScreen *default_screen;
- Window xroot_window, xchild_window;
+ Window xroot_window, xchild_window, xwindow;
gdouble xroot_x, xroot_y, xwin_x, xwin_y;
XIButtonState button_state;
XIModifierState mod_state;
XIGroupState group_state;
+ int scale;
display = gdk_device_get_display (device);
default_screen = GDK_X11_DISPLAY (display)->screen;
if (window == NULL)
- window = gdk_x11_display_get_root_window (display);
- impl = GDK_WINDOW_IMPL_X11 (window->impl);
+ {
+ xwindow = GDK_DISPLAY_XROOTWIN (display);
+ scale = GDK_X11_SCREEN (default_screen)->window_scale;
+ }
+ else
+ {
+ xwindow = GDK_WINDOW_XID (window);
+ scale = GDK_WINDOW_IMPL_X11 (window->impl)->window_scale;
+ }
if (gdk_device_get_device_type (device) == GDK_DEVICE_TYPE_SLAVE)
{
if (!GDK_X11_DISPLAY (display)->trusted_client ||
!XIQueryPointer (GDK_WINDOW_XDISPLAY (window),
device_xi2->device_id,
- GDK_WINDOW_XID (window),
+ xwindow,
&xroot_window,
&xchild_window,
&xroot_x, &xroot_y,
{
XSetWindowAttributes attributes;
Display *xdisplay;
- Window xwindow, w;
+ Window w;
/* FIXME: untrusted clients not multidevice-safe */
xdisplay = GDK_SCREEN_XDISPLAY (default_screen);
*child_window = gdk_x11_window_lookup_for_display (display, xchild_window);
if (root_x)
- *root_x = xroot_x / impl->window_scale;
+ *root_x = xroot_x / scale;
if (root_y)
- *root_y = xroot_y / impl->window_scale;
+ *root_y = xroot_y / scale;
if (win_x)
- *win_x = xwin_x / impl->window_scale;
+ *win_x = xwin_x / scale;
if (win_y)
- *win_y = xwin_y / impl->window_scale;
+ *win_y = xwin_y / scale;
if (mask)
*mask = _gdk_x11_device_xi2_translate_state (&mod_state, &button_state, &group_state);
event_mask.mask = mask;
_gdk_x11_device_manager_xi2_select_events (GDK_DEVICE_MANAGER (object),
- GDK_WINDOW_XID (gdk_x11_display_get_root_window (display)),
+ GDK_DISPLAY_XROOTWIN (display),
&event_mask);
}
#include "gdkx11dnd.h"
#include "gdkdndprivate.h"
+#include "gdkdeviceprivate.h"
#include "gdkmain.h"
#include "gdkinternals.h"
cairo_region_t *shape;
} GdkCacheChild;
-typedef struct {
+struct _GdkWindowCache {
GList *children;
GHashTable *child_hash;
guint old_event_mask;
GdkDisplay *display;
gint ref_count;
-} GdkWindowCache;
+};
struct _GdkX11DragContext
/* Forward declarations */
-static GdkWindowCache *gdk_window_cache_get (GdkDisplay *display);
static GdkWindowCache *gdk_window_cache_ref (GdkWindowCache *cache);
static void gdk_window_cache_unref (GdkWindowCache *cache);
cache->children);
}
-static GdkFilterReturn
+GdkFilterReturn
gdk_window_cache_shape_filter (GdkXEvent *xev,
GdkEvent *event,
gpointer data)
return GDK_FILTER_CONTINUE;
}
-static GdkFilterReturn
+GdkFilterReturn
gdk_window_cache_filter (GdkXEvent *xev,
GdkEvent *event,
gpointer data)
XWindowAttributes xwa;
GdkScreen *screen = GDK_X11_DISPLAY (display)->screen;
Display *xdisplay = GDK_SCREEN_XDISPLAY (screen);
- GdkWindow *root_window = gdk_x11_display_get_root_window (display);
+ Window xroot_window = GDK_DISPLAY_XROOTWIN (display);
GdkChildInfoX11 *children;
guint nchildren, i;
#ifdef HAVE_XCOMPOSITE
result->display = display;
result->ref_count = 1;
- XGetWindowAttributes (xdisplay, GDK_WINDOW_XID (root_window), &xwa);
+ XGetWindowAttributes (xdisplay, xroot_window, &xwa);
result->old_event_mask = xwa.your_event_mask;
if (G_UNLIKELY (!GDK_X11_DISPLAY (display)->trusted_client))
return result;
}
- XSelectInput (xdisplay, GDK_WINDOW_XID (root_window),
- result->old_event_mask | SubstructureNotifyMask);
- gdk_window_add_filter (root_window, gdk_window_cache_filter, result);
- gdk_window_add_filter (NULL, gdk_window_cache_shape_filter, result);
+ XSelectInput (xdisplay, xroot_window, result->old_event_mask | SubstructureNotifyMask);
if (!_gdk_x11_get_window_child_info (display,
- GDK_WINDOW_XID (root_window),
+ xroot_window,
FALSE, NULL,
&children, &nchildren))
return result;
*/
if (gdk_display_is_composited (display))
{
- cow = XCompositeGetOverlayWindow (xdisplay, GDK_WINDOW_XID (root_window));
- gdk_window_cache_add (result, cow, 0, 0,
- gdk_window_get_width (root_window) * GDK_X11_SCREEN(screen)->window_scale,
- gdk_window_get_height (root_window) * GDK_X11_SCREEN(screen)->window_scale,
+ cow = XCompositeGetOverlayWindow (xdisplay, xroot_window);
+ gdk_window_cache_add (result, cow, 0, 0,
+ WidthOfScreen (GDK_X11_SCREEN (screen)->xscreen) * GDK_X11_SCREEN (screen)->window_scale,
+ HeightOfScreen (GDK_X11_SCREEN (screen)->xscreen) * GDK_X11_SCREEN (screen)->window_scale,
TRUE);
- XCompositeReleaseOverlayWindow (xdisplay, GDK_WINDOW_XID (root_window));
+ XCompositeReleaseOverlayWindow (xdisplay, xroot_window);
}
#endif
static void
gdk_window_cache_destroy (GdkWindowCache *cache)
{
- GdkWindow *root_window = gdk_x11_display_get_root_window (cache->display);
-
- XSelectInput (GDK_WINDOW_XDISPLAY (root_window),
- GDK_WINDOW_XID (root_window),
+ XSelectInput (GDK_DISPLAY_XDISPLAY (cache->display),
+ GDK_DISPLAY_XROOTWIN (cache->display),
cache->old_event_mask);
- gdk_window_remove_filter (root_window, gdk_window_cache_filter, cache);
- gdk_window_remove_filter (NULL, gdk_window_cache_shape_filter, cache);
gdk_x11_display_error_trap_push (cache->display);
g_list_foreach (cache->children, (GFunc)free_cache_child, cache->display);
if (retval)
return retval;
else
- return GDK_WINDOW_XID (gdk_x11_display_get_root_window (cache->display));
+ return GDK_DISPLAY_XROOTWIN (display);
}
#ifdef G_ENABLE_DEBUG
GdkX11DragContext *x11_context = GDK_X11_DRAG_CONTEXT (context);
GdkDevice *device = gdk_drag_context_get_device (context);
GdkSeatCapabilities capabilities;
- GdkWindow *root;
+ Window root;
GdkSeat *seat;
gint keycode, i;
GdkCursor *cursor;
if (!x11_context->ipc_window)
return FALSE;
- root = gdk_x11_display_get_root_window (GDK_WINDOW_DISPLAY (x11_context->ipc_window));
+ root = GDK_DISPLAY_XROOTWIN (GDK_WINDOW_DISPLAY (x11_context->ipc_window));
seat = gdk_device_get_seat (gdk_drag_context_get_device (context));
#ifdef XINPUT_2
XIGrabKeycode (GDK_WINDOW_XDISPLAY (x11_context->ipc_window),
deviceid,
keycode,
- GDK_WINDOW_XID (root),
+ root,
GrabModeAsync,
GrabModeAsync,
False,
{
XGrabKey (GDK_WINDOW_XDISPLAY (x11_context->ipc_window),
keycode, grab_keys[i].modifiers,
- GDK_WINDOW_XID (root),
+ root,
FALSE,
GrabModeAsync,
GrabModeAsync);
{
GdkX11DragContext *x11_context = GDK_X11_DRAG_CONTEXT (context);
GdkDevice *keyboard;
- GdkWindow *root;
+ Window root;
gint keycode, i;
if (!x11_context->grab_seat)
gdk_seat_ungrab (x11_context->grab_seat);
keyboard = gdk_seat_get_keyboard (x11_context->grab_seat);
- root = gdk_x11_display_get_root_window (GDK_WINDOW_DISPLAY (x11_context->ipc_window));
+ root = GDK_DISPLAY_XROOTWIN (GDK_WINDOW_DISPLAY (x11_context->ipc_window));
g_clear_object (&x11_context->grab_seat);
for (i = 0; i < G_N_ELEMENTS (grab_keys); ++i)
XIUngrabKeycode (GDK_WINDOW_XDISPLAY (x11_context->ipc_window),
gdk_x11_device_get_id (keyboard),
keycode,
- GDK_WINDOW_XID (root),
+ root,
num_mods,
&mods);
}
{
XUngrabKey (GDK_WINDOW_XDISPLAY (x11_context->ipc_window),
keycode, grab_keys[i].modifiers,
- GDK_WINDOW_XID (root));
+ root);
}
}
}
{
GdkX11DragContext *x11_context = GDK_X11_DRAG_CONTEXT (context);
GdkModifierType state;
- GdkWindow *root_window;
GdkDevice *pointer;
gint dx, dy;
* to query it here. We could use XGetModifierMapping, but
* that would be overkill.
*/
- root_window = gdk_x11_display_get_root_window (GDK_WINDOW_DISPLAY (x11_context->ipc_window));
- gdk_window_get_device_position (root_window, pointer, NULL, NULL, &state);
+ _gdk_device_query_state (pointer, NULL, NULL, NULL, NULL, NULL, NULL, &state);
if (dx != 0 || dy != 0)
{
GdkWindow *filter_window;
Display *dpy;
GdkX11Screen *x11_screen;
+ gpointer cache;
x11_screen = (GdkX11Screen *) gdk_x11_display_get_screen (event_source->display);
xevent->xany.window == x11_screen->xsettings_manager_window)
result = gdk_xsettings_manager_window_filter (xevent, event, x11_screen);
+ cache = gdk_window_cache_get (event_source->display);
+ if (cache)
+ {
+ if (result == GDK_FILTER_CONTINUE)
+ result = gdk_window_cache_shape_filter (xevent, event, cache);
+
+ if (result == GDK_FILTER_CONTINUE &&
+ xevent->xany.window == XRootWindow (dpy, 0))
+ result = gdk_window_cache_filter (xevent, event, cache);
+ }
+
/* Run default filters */
if (result == GDK_FILTER_CONTINUE &&
_gdk_default_filters)
GdkEvent *event,
gpointer data);
+typedef struct _GdkWindowCache GdkWindowCache;
+
+GdkWindowCache *
+gdk_window_cache_get (GdkDisplay *display);
+
+GdkFilterReturn
+gdk_window_cache_filter (GdkXEvent *xev,
+ GdkEvent *event,
+ gpointer data);
+GdkFilterReturn
+gdk_window_cache_shape_filter (GdkXEvent *xev,
+ GdkEvent *event,
+ gpointer data);
+
void _gdk_x11_screen_init_root_window (GdkScreen *screen);
void _gdk_x11_screen_init_visuals (GdkScreen *screen,
gboolean setup_display);
GdkGrabStatus _gdk_x11_convert_grab_status (gint status);
-cairo_surface_t * _gdk_x11_window_create_bitmap_surface (GdkWindow *window,
- int width,
- int height);
-
+cairo_surface_t * _gdk_x11_display_create_bitmap_surface (GdkDisplay *display,
+ int width,
+ int height);
+
extern const gint _gdk_x11_event_mask_table[];
extern const gint _gdk_x11_event_mask_table_size;
#define GDK_SCREEN_DISPLAY(screen) (GDK_X11_SCREEN (screen)->display)
#define GDK_SCREEN_XROOTWIN(screen) (GDK_X11_SCREEN (screen)->xroot_window)
+#define GDK_DISPLAY_XROOTWIN(display) (GDK_SCREEN_XROOTWIN (GDK_X11_DISPLAY (display)->screen))
#define GDK_WINDOW_SCREEN(win) (GDK_X11_DISPLAY (gdk_window_get_display (win))->screen)
#define GDK_WINDOW_DISPLAY(win) (gdk_window_get_display (win))
#define GDK_WINDOW_XROOTWIN(win) (GDK_X11_SCREEN (GDK_WINDOW_SCREEN (win))->xroot_window)
Atom xproperty;
Atom xtype;
int res;
+ Window xwindow;
g_return_val_if_fail (!window || GDK_WINDOW_IS_X11 (window), FALSE);
if (!window)
- window = gdk_x11_display_get_root_window (gdk_display_get_default ());
+ xwindow = GDK_DISPLAY_XROOTWIN (gdk_display_get_default ());
else if (!GDK_WINDOW_IS_X11 (window))
return FALSE;
-
- if (GDK_WINDOW_DESTROYED (window))
+ else if (GDK_WINDOW_DESTROYED (window))
return FALSE;
+ else
+ xwindow = GDK_WINDOW_XID (window);
display = gdk_window_get_display (window);
xproperty = gdk_x11_atom_to_xatom_for_display (display, property);
}
res = XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display),
- GDK_WINDOW_XID (window), xproperty,
+ xwindow, xproperty,
offset, get_length, pdelete,
xtype, &ret_prop_type, &ret_format,
&ret_nitems, &ret_bytes_after,
g_return_if_fail (!window || GDK_WINDOW_IS_X11 (window));
if (!window)
- window = gdk_x11_display_get_root_window (gdk_display_get_default ());
+ xwindow = GDK_DISPLAY_XROOTWIN (gdk_display_get_default ());
else if (!GDK_WINDOW_IS_X11 (window))
return;
-
- if (GDK_WINDOW_DESTROYED (window))
+ else if (GDK_WINDOW_DESTROYED (window))
return;
+ else
+ xwindow = GDK_WINDOW_XID (window);
if (!gdk_window_has_native (window))
{
display = gdk_window_get_display (window);
xproperty = gdk_x11_atom_to_xatom_for_display (display, property);
xtype = gdk_x11_atom_to_xatom_for_display (display, type);
- xwindow = GDK_WINDOW_XID (window);
if (xtype == XA_ATOM ||
xtype == gdk_x11_get_xatom_by_name_for_display (display, "ATOM_PAIR"))
_gdk_x11_window_delete_property (GdkWindow *window,
GdkAtom property)
{
+ Window xwindow;
+
g_return_if_fail (!window || GDK_WINDOW_IS_X11 (window));
if (!window)
- window = gdk_x11_display_get_root_window (gdk_display_get_default ());
+ xwindow = GDK_DISPLAY_XROOTWIN (gdk_display_get_default ());
else if (!GDK_WINDOW_IS_X11 (window))
return;
-
- if (GDK_WINDOW_DESTROYED (window))
+ else if (GDK_WINDOW_DESTROYED (window))
return;
+ else
+ xwindow = GDK_WINDOW_XID (window);
- XDeleteProperty (GDK_WINDOW_XDISPLAY (window), GDK_WINDOW_XID (window),
+ XDeleteProperty (GDK_WINDOW_XDISPLAY (window), xwindow,
gdk_x11_atom_to_xatom_for_display (GDK_WINDOW_DISPLAY (window),
property));
}
GdkRectangle *area)
{
GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen);
- GdkWindow *root_window;
Atom workarea;
Atom type;
Window win;
Display *display;
display = GDK_SCREEN_XDISPLAY (screen);
- root_window = gdk_x11_display_get_root_window (GDK_SCREEN_DISPLAY (screen));
workarea = XInternAtom (display, "_NET_WORKAREA", True);
/* Defaults in case of error */
area->x = 0;
area->y = 0;
- area->width = gdk_window_get_width (root_window);
- area->height = gdk_window_get_height (root_window);
+ area->width = WidthOfScreen (x11_screen->xscreen);
+ area->height = HeightOfScreen (x11_screen->xscreen);
if (!gdk_x11_screen_supports_net_wm_hint (screen,
gdk_atom_intern_static_string ("_NET_WORKAREA")))
* These functions ensure an Xlib surface.
*/
cairo_surface_t *
-_gdk_x11_window_create_bitmap_surface (GdkWindow *window,
- int width,
- int height)
+_gdk_x11_display_create_bitmap_surface (GdkDisplay *display,
+ int width,
+ int height)
{
cairo_surface_t *surface;
Pixmap pixmap;
- pixmap = XCreatePixmap (GDK_WINDOW_XDISPLAY (window),
- GDK_WINDOW_XID (window),
+ pixmap = XCreatePixmap (GDK_DISPLAY_XDISPLAY (display),
+ GDK_SCREEN_XROOTWIN (GDK_X11_DISPLAY (display)->screen),
width, height, 1);
- surface = cairo_xlib_surface_create_for_bitmap (GDK_WINDOW_XDISPLAY (window),
+ surface = cairo_xlib_surface_create_for_bitmap (GDK_DISPLAY_XDISPLAY (display),
pixmap,
- GDK_X11_SCREEN (GDK_WINDOW_SCREEN (window))->xscreen,
+ GDK_X11_SCREEN (GDK_X11_DISPLAY (display)->screen)->xscreen,
width, height);
- attach_free_pixmap_handler (surface, GDK_WINDOW_DISPLAY (window), pixmap);
+ attach_free_pixmap_handler (surface, display, pixmap);
return surface;
}
cairo_surface_t *surface;
cairo_t *cr;
- toplevel->icon_pixmap = gdk_x11_window_create_pixmap_surface (window,
- width,
- height);
+ toplevel->icon_pixmap = gdk_x11_window_create_pixmap_surface (window, width, height);
surface = gdk_texture_download_surface (best_icon);
if (cairo_surface_get_content (surface) == CAIRO_CONTENT_COLOR_ALPHA)
{
- toplevel->icon_mask = _gdk_x11_window_create_bitmap_surface (window,
- width,
- height);
+ GdkDisplay *display = gdk_window_get_display (window);
+
+ toplevel->icon_mask = _gdk_x11_display_create_bitmap_surface (display, width, height);
cr = cairo_create (toplevel->icon_mask);
cairo_set_source_surface (cr, surface, 0, 0);