From fdde7e0f3706ff1aab72fd41f52acae98d37c79c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Mon, 30 May 2022 20:27:02 +0200 Subject: [PATCH 1/2] x11: Let X11 connection owners call XSynchronize() themselves Only make the context carry the boolean state, but move the two libX11 calls into their corresponding connection handler objects. Part-of: --- src/backends/x11/meta-backend-x11.c | 3 +++ src/core/display.c | 41 ----------------------------- src/core/meta-context-main.c | 14 +++++++++- src/core/meta-context-private.h | 9 +++++++ src/core/meta-context.c | 8 ++++++ src/core/util-private.h | 3 --- src/meta/util.h | 3 --- src/tests/meta-context-test.c | 13 +++++++-- src/x11/meta-x11-display.c | 7 +++-- 9 files changed, 47 insertions(+), 54 deletions(-) diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c index 056a16ad71c..969b64dddb0 100644 --- a/src/backends/x11/meta-backend-x11.c +++ b/src/backends/x11/meta-backend-x11.c @@ -821,6 +821,7 @@ meta_backend_x11_initable_init (GInitable *initable, GCancellable *cancellable, GError **error) { + MetaContext *context = meta_backend_get_context (META_BACKEND (initable)); MetaBackendX11 *x11 = META_BACKEND_X11 (initable); MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11); Display *xdisplay; @@ -842,6 +843,8 @@ meta_backend_x11_initable_init (GInitable *initable, return FALSE; } + XSynchronize (xdisplay, meta_context_is_x11_sync (context)); + priv->xdisplay = xdisplay; priv->xscreen = DefaultScreenOfDisplay (xdisplay); priv->xcb = XGetXCBConnection (priv->xdisplay); diff --git a/src/core/display.c b/src/core/display.c index 2145fde0db2..ee1c372bf87 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -2117,47 +2117,6 @@ meta_display_queue_retheme_all_windows (MetaDisplay *display) g_slist_free (windows); } -/* - * Stores whether syncing is currently enabled. - */ -static gboolean is_syncing = FALSE; - -/** - * meta_is_syncing: - * - * Returns whether X synchronisation is currently enabled. - * - * FIXME: This is *only* called by meta_display_open(), but by that time - * we have already turned syncing on or off on startup, and we don't - * have any way to do so while Mutter is running, so it's rather - * pointless. - * - * Returns: %TRUE if we must wait for events whenever we send X requests; - * %FALSE otherwise. - */ -gboolean -meta_is_syncing (void) -{ - return is_syncing; -} - -/** - * meta_set_syncing: - * @setting: whether to turn syncing on or off - * - * A handy way to turn on synchronisation on or off for every display. - */ -void -meta_set_syncing (gboolean setting) -{ - if (setting != is_syncing) - { - is_syncing = setting; - if (meta_get_display ()) - XSynchronize (meta_get_display ()->x11_display->xdisplay, is_syncing); - } -} - /** * meta_display_ping_timeout: * @data: All the information about this ping. It is a #MetaPingData diff --git a/src/core/meta-context-main.c b/src/core/meta-context-main.c index d2445e369a5..5baa7c9f5c1 100644 --- a/src/core/meta-context-main.c +++ b/src/core/meta-context-main.c @@ -391,7 +391,6 @@ meta_context_main_setup (MetaContext *context, return FALSE; meta_context_set_unsafe_mode (context, context_main->options.unsafe_mode); - meta_set_syncing (context_main->options.x11.sync || g_getenv ("MUTTER_SYNC")); #ifdef HAVE_NATIVE_BACKEND if (!add_persistent_virtual_monitors (context_main, error)) @@ -503,6 +502,16 @@ meta_context_main_notify_ready (MetaContext *context) g_clear_pointer (&context_main->options.sm.save_file, g_free); } +#ifdef HAVE_X11 +static gboolean +meta_context_main_is_x11_sync (MetaContext *context) +{ + MetaContextMain *context_main = META_CONTEXT_MAIN (context); + + return context_main->options.x11.sync || g_getenv ("MUTTER_SYNC"); +} +#endif + #ifdef HAVE_NATIVE_BACKEND static gboolean add_virtual_monitor_cb (const char *option_name, @@ -706,6 +715,9 @@ meta_context_main_class_init (MetaContextMainClass *klass) context_class->setup = meta_context_main_setup; context_class->create_backend = meta_context_main_create_backend; context_class->notify_ready = meta_context_main_notify_ready; +#ifdef HAVE_X11 + context_class->is_x11_sync = meta_context_main_is_x11_sync; +#endif } static void diff --git a/src/core/meta-context-private.h b/src/core/meta-context-private.h index 87f5261f541..c8b9066a7f0 100644 --- a/src/core/meta-context-private.h +++ b/src/core/meta-context-private.h @@ -49,6 +49,10 @@ struct _MetaContextClass GError **error); void (* notify_ready) (MetaContext *context); + +#ifdef HAVE_X11 + gboolean (* is_x11_sync) (MetaContext *context); +#endif }; const char * meta_context_get_name (MetaContext *context); @@ -64,4 +68,9 @@ MetaWaylandCompositor * meta_context_get_wayland_compositor (MetaContext *contex MetaX11DisplayPolicy meta_context_get_x11_display_policy (MetaContext *context); +#ifdef HAVE_X11 +META_EXPORT_TEST +gboolean meta_context_is_x11_sync (MetaContext *context); +#endif + #endif /* META_CONTEXT_PRIVATE_H */ diff --git a/src/core/meta-context.c b/src/core/meta-context.c index 4363e14e11a..d50956b9c19 100644 --- a/src/core/meta-context.c +++ b/src/core/meta-context.c @@ -245,6 +245,14 @@ meta_context_get_x11_display_policy (MetaContext *context) return META_CONTEXT_GET_CLASS (context)->get_x11_display_policy (context); } +#ifdef HAVE_X11 +gboolean +meta_context_is_x11_sync (MetaContext *context) +{ + return META_CONTEXT_GET_CLASS (context)->is_x11_sync (context); +} +#endif + static gboolean meta_context_real_configure (MetaContext *context, int *argc, diff --git a/src/core/util-private.h b/src/core/util-private.h index ff9d7ce426e..fa9f2be4be3 100644 --- a/src/core/util-private.h +++ b/src/core/util-private.h @@ -37,9 +37,6 @@ void meta_set_verbose (gboolean setting); void meta_set_debugging (gboolean setting); -META_EXPORT_TEST -void meta_set_syncing (gboolean setting); - void meta_set_replace_current_wm (gboolean setting); void meta_set_is_wayland_compositor (gboolean setting); diff --git a/src/meta/util.h b/src/meta/util.h index 79de380d820..6c54f557917 100644 --- a/src/meta/util.h +++ b/src/meta/util.h @@ -32,9 +32,6 @@ META_EXPORT gboolean meta_is_verbose (void); -META_EXPORT -gboolean meta_is_syncing (void); - META_EXPORT gboolean meta_is_wayland_compositor (void); diff --git a/src/tests/meta-context-test.c b/src/tests/meta-context-test.c index c07a66b7b52..5a4e48876b5 100644 --- a/src/tests/meta-context-test.c +++ b/src/tests/meta-context-test.c @@ -136,8 +136,6 @@ meta_context_test_setup (MetaContext *context, settings, META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER); - meta_set_syncing (!!g_getenv ("MUTTER_SYNC")); - return TRUE; } @@ -203,6 +201,14 @@ meta_context_test_notify_ready (MetaContext *context) { } +#ifdef HAVE_X11 +static gboolean +meta_context_test_is_x11_sync (MetaContext *context) +{ + return !!g_getenv ("MUTTER_SYNC"); +} +#endif + static gboolean run_tests_idle (gpointer user_data) { @@ -329,6 +335,9 @@ meta_context_test_class_init (MetaContextTestClass *klass) context_class->setup = meta_context_test_setup; context_class->create_backend = meta_context_test_create_backend; context_class->notify_ready = meta_context_test_notify_ready; +#ifdef HAVE_X11 + context_class->is_x11_sync = meta_context_test_is_x11_sync; +#endif signals[BEFORE_TESTS] = g_signal_new ("before-tests", diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c index 9a2f02e9e45..bb5f4bf50ba 100644 --- a/src/x11/meta-x11-display.c +++ b/src/x11/meta-x11-display.c @@ -1136,6 +1136,7 @@ on_window_visibility_updated (MetaDisplay *display, MetaX11Display * meta_x11_display_new (MetaDisplay *display, GError **error) { + MetaContext *context = meta_display_get_context (display); MetaX11Display *x11_display; Display *xdisplay; Screen *xscreen; @@ -1168,10 +1169,11 @@ meta_x11_display_new (MetaDisplay *display, GError **error) gdk_display = g_steal_pointer (&prepared_gdk_display); xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display); + XSynchronize (xdisplay, meta_context_is_x11_sync (context)); + #ifdef HAVE_WAYLAND if (meta_is_wayland_compositor ()) { - MetaContext *context = meta_display_get_context (display); MetaWaylandCompositor *compositor = meta_context_get_wayland_compositor (context); @@ -1179,9 +1181,6 @@ meta_x11_display_new (MetaDisplay *display, GError **error) } #endif - if (meta_is_syncing ()) - XSynchronize (xdisplay, True); - replace_current_wm = meta_context_is_replacing (meta_backend_get_context (backend)); -- GitLab From 3776f9df8cd576e75e38affcb67ab295780f84da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Mon, 30 May 2022 21:29:41 +0200 Subject: [PATCH 2/2] x11/clutter-backend: Remove unused XSynchronize() call Part-of: --- src/backends/x11/meta-clutter-backend-x11.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/backends/x11/meta-clutter-backend-x11.c b/src/backends/x11/meta-clutter-backend-x11.c index 9ee2be164af..345c1424dca 100644 --- a/src/backends/x11/meta-clutter-backend-x11.c +++ b/src/backends/x11/meta-clutter-backend-x11.c @@ -78,9 +78,6 @@ static const gchar *atom_names[] = { /* various flags corresponding to pre init setup calls */ static gboolean clutter_enable_stereo = FALSE; -/* options */ -static gboolean clutter_synchronise = FALSE; - /* X error trap */ static int TrappedErrorCode = 0; static int (* old_error_handler) (Display *, XErrorEvent *); @@ -129,9 +126,6 @@ meta_clutter_backend_x11_finish_init (ClutterBackend *clutter_backend, cogl_xlib_filter, clutter_backend); - if (clutter_synchronise) - XSynchronize (clutter_backend_x11->xdisplay, True); - XInternAtoms (clutter_backend_x11->xdisplay, (char **) atom_names, N_ATOM_NAMES, False, atoms); -- GitLab