x11: Handle accounting of ignored serials in X11 code

Move this out of MetaDisplay.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2828>
This commit is contained in:
Carlos Garnacho 2023-02-01 11:25:59 +01:00
parent 67a69709b9
commit caf68a6563
5 changed files with 28 additions and 30 deletions

View File

@ -55,15 +55,6 @@ typedef enum
#define _NET_WM_STATE_ADD 1 /* add/set property */ #define _NET_WM_STATE_ADD 1 /* add/set property */
#define _NET_WM_STATE_TOGGLE 2 /* toggle property */ #define _NET_WM_STATE_TOGGLE 2 /* toggle property */
/* This is basically a bogus number, just has to be large enough
* to handle the expected case of the alt+tab operation, where
* we want to ignore serials from UnmapNotify on the tab popup,
* and the LeaveNotify/EnterNotify from the pointer ungrab. It
* also has to be big enough to hold ignored serials from the point
* where we reshape the stage to the point where we get events back.
*/
#define N_IGNORED_CROSSING_SERIALS 10
typedef enum typedef enum
{ {
META_TILE_NONE, META_TILE_NONE,
@ -114,12 +105,6 @@ struct _MetaDisplay
GHashTable *stamps; GHashTable *stamps;
GHashTable *wayland_windows; GHashTable *wayland_windows;
/* serials of leave/unmap events that may
* correspond to an enter event we should
* ignore
*/
unsigned long ignored_crossing_serials[N_IGNORED_CROSSING_SERIALS];
guint32 current_time; guint32 current_time;
/* We maintain a sequence counter, incremented for each #MetaWindow /* We maintain a sequence counter, incremented for each #MetaWindow

View File

@ -857,7 +857,6 @@ meta_display_new (MetaContext *context,
MetaBackend *backend = meta_context_get_backend (context); MetaBackend *backend = meta_context_get_backend (context);
MetaDisplay *display; MetaDisplay *display;
MetaDisplayPrivate *priv; MetaDisplayPrivate *priv;
int i;
guint32 timestamp; guint32 timestamp;
Window old_active_xwindow = None; Window old_active_xwindow = None;
MetaMonitorManager *monitor_manager; MetaMonitorManager *monitor_manager;
@ -886,13 +885,6 @@ meta_display_new (MetaContext *context,
display->allow_terminal_deactivation = TRUE; /* Only relevant for when a display->allow_terminal_deactivation = TRUE; /* Only relevant for when a
terminal has the focus */ terminal has the focus */
i = 0;
while (i < N_IGNORED_CROSSING_SERIALS)
{
display->ignored_crossing_serials[i] = 0;
++i;
}
display->current_time = META_CURRENT_TIME; display->current_time = META_CURRENT_TIME;
meta_display_init_keys (display); meta_display_init_keys (display);

View File

@ -927,7 +927,7 @@ crossing_serial_is_ignored (MetaX11Display *x11_display,
i = 0; i = 0;
while (i < N_IGNORED_CROSSING_SERIALS) while (i < N_IGNORED_CROSSING_SERIALS)
{ {
if (x11_display->display->ignored_crossing_serials[i] == serial) if (x11_display->ignored_crossing_serials[i] == serial)
return TRUE; return TRUE;
++i; ++i;
} }
@ -942,7 +942,7 @@ reset_ignored_crossing_serials (MetaX11Display *x11_display)
i = 0; i = 0;
while (i < N_IGNORED_CROSSING_SERIALS) while (i < N_IGNORED_CROSSING_SERIALS)
{ {
x11_display->display->ignored_crossing_serials[i] = 0; x11_display->ignored_crossing_serials[i] = 0;
++i; ++i;
} }
} }

View File

@ -39,6 +39,15 @@
#include "meta-x11-stack-private.h" #include "meta-x11-stack-private.h"
#include "x11/meta-sync-counter.h" #include "x11/meta-sync-counter.h"
/* This is basically a bogus number, just has to be large enough
* to handle the expected case of the alt+tab operation, where
* we want to ignore serials from UnmapNotify on the tab popup,
* and the LeaveNotify/EnterNotify from the pointer ungrab. It
* also has to be big enough to hold ignored serials from the point
* where we reshape the stage to the point where we get events back.
*/
#define N_IGNORED_CROSSING_SERIALS 10
typedef struct _MetaGroupPropHooks MetaGroupPropHooks; typedef struct _MetaGroupPropHooks MetaGroupPropHooks;
typedef struct _MetaWindowPropHooks MetaWindowPropHooks; typedef struct _MetaWindowPropHooks MetaWindowPropHooks;
@ -155,6 +164,12 @@ struct _MetaX11Display
guint closing : 1; guint closing : 1;
/* serials of leave/unmap events that may
* correspond to an enter event we should
* ignore
*/
unsigned long ignored_crossing_serials[N_IGNORED_CROSSING_SERIALS];
/* we use property updates as sentinels for certain window focus events /* we use property updates as sentinels for certain window focus events
* to avoid some race conditions on EnterNotify events * to avoid some race conditions on EnterNotify events
*/ */

View File

@ -1338,6 +1338,13 @@ meta_x11_display_new (MetaDisplay *display,
x11_display->server_focus_window = None; x11_display->server_focus_window = None;
x11_display->server_focus_serial = 0; x11_display->server_focus_serial = 0;
i = 0;
while (i < N_IGNORED_CROSSING_SERIALS)
{
x11_display->ignored_crossing_serials[i] = 0;
++i;
}
x11_display->prop_hooks = NULL; x11_display->prop_hooks = NULL;
meta_x11_display_init_window_prop_hooks (x11_display); meta_x11_display_init_window_prop_hooks (x11_display);
x11_display->group_prop_hooks = NULL; x11_display->group_prop_hooks = NULL;
@ -2386,24 +2393,23 @@ static void
meta_x11_display_add_ignored_crossing_serial (MetaX11Display *x11_display, meta_x11_display_add_ignored_crossing_serial (MetaX11Display *x11_display,
unsigned long serial) unsigned long serial)
{ {
MetaDisplay *display = x11_display->display;
int i; int i;
/* don't add the same serial more than once */ /* don't add the same serial more than once */
if (serial == if (serial ==
display->ignored_crossing_serials[N_IGNORED_CROSSING_SERIALS - 1]) x11_display->ignored_crossing_serials[N_IGNORED_CROSSING_SERIALS - 1])
return; return;
/* shift serials to the left */ /* shift serials to the left */
i = 0; i = 0;
while (i < (N_IGNORED_CROSSING_SERIALS - 1)) while (i < (N_IGNORED_CROSSING_SERIALS - 1))
{ {
display->ignored_crossing_serials[i] = x11_display->ignored_crossing_serials[i] =
display->ignored_crossing_serials[i + 1]; x11_display->ignored_crossing_serials[i + 1];
++i; ++i;
} }
/* put new one on the end */ /* put new one on the end */
display->ignored_crossing_serials[i] = serial; x11_display->ignored_crossing_serials[i] = serial;
} }
void void