Select for XI2 events everywhere else

In random places that are not grabs, we selected for events on
things like the root window, stage window, COW and more. Switch
these over to using the proper XI2 APIs.

https://bugzilla.gnome.org/show_bug.cgi?id=688779
This commit is contained in:
Jasper St. Pierre 2012-11-20 20:15:09 -05:00
parent 7c20621112
commit 774ceec243
3 changed files with 72 additions and 40 deletions

View File

@ -157,23 +157,26 @@ get_output_window (MetaScreen *screen)
Window output, xroot; Window output, xroot;
XWindowAttributes attr; XWindowAttributes attr;
long event_mask; long event_mask;
unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
xroot = meta_screen_get_xroot (screen); xroot = meta_screen_get_xroot (screen);
event_mask = FocusChangeMask |
ExposureMask |
EnterWindowMask | LeaveWindowMask |
PointerMotionMask |
PropertyChangeMask |
ButtonPressMask | ButtonReleaseMask |
KeyPressMask | KeyReleaseMask;
output = XCompositeGetOverlayWindow (xdisplay, xroot); output = XCompositeGetOverlayWindow (xdisplay, xroot);
XISetMask (mask.mask, XI_KeyPress);
XISetMask (mask.mask, XI_KeyRelease);
XISetMask (mask.mask, XI_ButtonPress);
XISetMask (mask.mask, XI_ButtonRelease);
XISetMask (mask.mask, XI_Enter);
XISetMask (mask.mask, XI_Leave);
XISetMask (mask.mask, XI_FocusIn);
XISetMask (mask.mask, XI_FocusOut);
XISetMask (mask.mask, XI_Motion);
XISelectEvents (xdisplay, output, &mask, 1);
event_mask = ExposureMask | PropertyChangeMask;
if (XGetWindowAttributes (xdisplay, output, &attr)) if (XGetWindowAttributes (xdisplay, output, &attr))
{ event_mask |= attr.your_event_mask;
event_mask |= attr.your_event_mask;
}
XSelectInput (xdisplay, output, event_mask); XSelectInput (xdisplay, output, event_mask);
@ -475,8 +478,6 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
Window xroot = meta_screen_get_xroot (screen); Window xroot = meta_screen_get_xroot (screen);
Window xwin; Window xwin;
gint width, height; gint width, height;
XWindowAttributes attr;
long event_mask;
guint n_retries; guint n_retries;
guint max_retries; guint max_retries;
@ -543,21 +544,29 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
XResizeWindow (xdisplay, xwin, width, height); XResizeWindow (xdisplay, xwin, width, height);
event_mask = FocusChangeMask | {
ExposureMask | long event_mask;
EnterWindowMask | LeaveWindowMask | unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
PointerMotionMask | XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
PropertyChangeMask | XWindowAttributes attr;
ButtonPressMask | ButtonReleaseMask |
KeyPressMask | KeyReleaseMask |
StructureNotifyMask;
if (XGetWindowAttributes (xdisplay, xwin, &attr)) XISetMask (mask.mask, XI_KeyPress);
{ XISetMask (mask.mask, XI_KeyRelease);
event_mask |= attr.your_event_mask; XISetMask (mask.mask, XI_ButtonPress);
} XISetMask (mask.mask, XI_ButtonRelease);
XISetMask (mask.mask, XI_Enter);
XISetMask (mask.mask, XI_Leave);
XISetMask (mask.mask, XI_FocusIn);
XISetMask (mask.mask, XI_FocusOut);
XISetMask (mask.mask, XI_Motion);
XISelectEvents (xdisplay, xwin, &mask, 1);
XSelectInput (xdisplay, xwin, event_mask); event_mask = ExposureMask | PropertyChangeMask | StructureNotifyMask;
if (XGetWindowAttributes (xdisplay, xwin, &attr))
event_mask |= attr.your_event_mask;
XSelectInput (xdisplay, xwin, event_mask);
}
info->window_group = meta_window_group_new (screen); info->window_group = meta_window_group_new (screen);
info->background_actor = meta_background_actor_new_for_screen (screen); info->background_actor = meta_background_actor_new_for_screen (screen);

View File

@ -628,7 +628,6 @@ meta_screen_new (MetaDisplay *display,
MetaScreen *screen; MetaScreen *screen;
Window xroot; Window xroot;
Display *xdisplay; Display *xdisplay;
XWindowAttributes attr;
Window new_wm_sn_owner; Window new_wm_sn_owner;
Window current_wm_sn_owner; Window current_wm_sn_owner;
gboolean replace_current_wm; gboolean replace_current_wm;
@ -743,15 +742,29 @@ meta_screen_new (MetaDisplay *display,
/* We need to or with the existing event mask since /* We need to or with the existing event mask since
* gtk+ may be interested in other events. * gtk+ may be interested in other events.
*/ */
XGetWindowAttributes (xdisplay, xroot, &attr); {
XSelectInput (xdisplay, long event_mask;
xroot, unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
SubstructureRedirectMask | SubstructureNotifyMask | XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
ColormapChangeMask | PropertyChangeMask | XWindowAttributes attr;
LeaveWindowMask | EnterWindowMask |
KeyPressMask | KeyReleaseMask | XISetMask (mask.mask, XI_KeyPress);
FocusChangeMask | StructureNotifyMask | XISetMask (mask.mask, XI_KeyRelease);
ExposureMask | attr.your_event_mask); XISetMask (mask.mask, XI_Enter);
XISetMask (mask.mask, XI_Leave);
XISetMask (mask.mask, XI_FocusIn);
XISetMask (mask.mask, XI_FocusOut);
XISetMask (mask.mask, XI_Motion);
XISelectEvents (xdisplay, xroot, &mask, 1);
event_mask = (SubstructureRedirectMask | SubstructureNotifyMask |
StructureNotifyMask | ColormapChangeMask | PropertyChangeMask);
if (XGetWindowAttributes (xdisplay, xroot, &attr))
event_mask |= attr.your_event_mask;
XSelectInput (xdisplay, xroot, event_mask);
}
if (meta_error_trap_pop_with_return (display) != Success) if (meta_error_trap_pop_with_return (display) != Success)
{ {
meta_warning (_("Screen %d on display \"%s\" already has a window manager\n"), meta_warning (_("Screen %d on display \"%s\" already has a window manager\n"),

View File

@ -922,9 +922,7 @@ meta_window_new_with_attrs (MetaDisplay *display,
XAddToSaveSet (display->xdisplay, xwindow); XAddToSaveSet (display->xdisplay, xwindow);
meta_error_trap_pop_with_return (display); meta_error_trap_pop_with_return (display);
event_mask = event_mask = PropertyChangeMask | ColormapChangeMask;
PropertyChangeMask | EnterWindowMask | LeaveWindowMask |
FocusChangeMask | ColormapChangeMask;
if (attrs->override_redirect) if (attrs->override_redirect)
event_mask |= StructureNotifyMask; event_mask |= StructureNotifyMask;
@ -934,6 +932,18 @@ meta_window_new_with_attrs (MetaDisplay *display,
*/ */
XSelectInput (display->xdisplay, xwindow, attrs->your_event_mask | event_mask); XSelectInput (display->xdisplay, xwindow, attrs->your_event_mask | event_mask);
{
unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
XISetMask (mask.mask, XI_Enter);
XISetMask (mask.mask, XI_Leave);
XISetMask (mask.mask, XI_FocusIn);
XISetMask (mask.mask, XI_FocusOut);
XISelectEvents (display->xdisplay, xwindow, &mask, 1);
}
has_shape = FALSE; has_shape = FALSE;
#ifdef HAVE_SHAPE #ifdef HAVE_SHAPE
if (META_DISPLAY_HAS_SHAPE (display)) if (META_DISPLAY_HAS_SHAPE (display))