From 0bf7d9ce3926290b98a8613e15c9cc53337c12bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 4 Sep 2023 17:33:37 +0200 Subject: [PATCH] gdk/wayland: Don't notify of settings changes on startup. I was profiling Firefox startup on Wayland, and I realized that we were doing too much work because we get extra settings changed events, posted from here: #0 gdk_event_copy (event=0x7ffe9c4a7fd0) at ../gtk/gdk/gdkevents.c:659 #1 0x00007f8b8a5060c6 in gdk_display_put_event (event=0x7ffe9c4a7fd0, display=0x7f8b8d551a00) at ../gtk/gdk/gdkdisplay.c:503 #2 gdk_display_put_event (display=0x7f8b8d551a00, event=0x7ffe9c4a7fd0) at ../gtk/gdk/gdkdisplay.c:497 #3 0x00007f8b8a5456e6 in notify_setting (setting=0x7f8b8a59b6d6 "gtk-xft-dpi", screen=0x7f8b8d517700) at ../gtk/gdk/wayland/gdkscreen-wayland.c:237 #4 update_xft_settings (screen=0x7f8b8d517700) at ../gtk/gdk/wayland/gdkscreen-wayland.c:513 #5 0x00007f8b8a53ef6d in init_settings (screen=0x7f8b8d517700) at ../gtk/gdk/wayland/gdkscreen-wayland.c:842 #6 _gdk_wayland_screen_new (display=0x7f8b8d551a00) at ../gtk/gdk/wayland/gdkscreen-wayland.c:1367 #7 _gdk_wayland_display_open (display_name=) at ../gtk/gdk/wayland/gdkdisplay-wayland.c:618 #8 0x00007f8b8a507bc7 in gdk_display_manager_open_display (manager=, name=0x0) at ../gtk/gdk/gdkdisplaymanager.c:462 #9 0x00007f8b82bda2f8 in XREMain::XRE_mainStartup(bool*) (this=this@entry=0x7ffe9c4a8398, aExitFlag=aExitFlag@entry=0x7ffe9c4a830f) at /home/emilio/src/moz/gecko-6/toolkit/xre/nsAppRunner.cpp:4760 #10 0x00007f8b82be1742 in XREMain::XRE_main(int, char**, mozilla::BootstrapConfig const&) (this=this@entry=0x7ffe9c4a8398, argc=argc@entry=4, argv=argv@entry=0x7ffe9c4a9698, aConfig=...) at /home/emilio/src/moz/gecko-6/toolkit/xre/nsAppRunner.cpp:5874 #11 0x00007f8b82be1c2c in XRE_main(int, char**, mozilla::BootstrapConfig const&) (argc=4, argv=0x7ffe9c4a9698, aConfig=...) at /home/emilio/src/moz/gecko-6/toolkit/xre/nsAppRunner.cpp:5942 #12 0x000055631ef3b3e9 in do_main(int, char**, char**) (argc=4, argv=0x7ffe9c4a9698, envp=) at /home/emilio/src/moz/gecko-6/browser/app/nsBrowserApp.cpp:227 #13 main(int, char**, char**) (argc=, argv=, envp=) at /home/emilio/src/moz/gecko-6/browser/app/nsBrowserApp.cpp:445 We shouldn't post events for a screen we're just creating, because it can make apps do too much work during startup. X11 had code for this. --- gdk/wayland/gdkscreen-wayland.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/gdk/wayland/gdkscreen-wayland.c b/gdk/wayland/gdkscreen-wayland.c index 295180d43b..c53f00a88b 100644 --- a/gdk/wayland/gdkscreen-wayland.c +++ b/gdk/wayland/gdkscreen-wayland.c @@ -336,7 +336,7 @@ struct _TranslationEntry { static TranslationEntry * find_translation_entry_by_schema (const char *schema, const char *key); static void -update_xft_settings (GdkScreen *screen) +update_xft_settings (GdkScreen *screen, gboolean notify) { GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen); GSettings *settings; @@ -471,25 +471,29 @@ update_xft_settings (GdkScreen *screen) if (screen_wayland->xft_settings.antialias != xft_settings.antialias) { screen_wayland->xft_settings.antialias = xft_settings.antialias; - notify_setting (screen, "gtk-xft-antialias"); + if (notify) + notify_setting (screen, "gtk-xft-antialias"); } if (screen_wayland->xft_settings.hinting != xft_settings.hinting) { screen_wayland->xft_settings.hinting = xft_settings.hinting; - notify_setting (screen, "gtk-xft-hinting"); + if (notify) + notify_setting (screen, "gtk-xft-hinting"); } if (screen_wayland->xft_settings.hintstyle != xft_settings.hintstyle) { screen_wayland->xft_settings.hintstyle = xft_settings.hintstyle; - notify_setting (screen, "gtk-xft-hintstyle"); + if (notify) + notify_setting (screen, "gtk-xft-hintstyle"); } if (screen_wayland->xft_settings.rgba != xft_settings.rgba) { screen_wayland->xft_settings.rgba = xft_settings.rgba; - notify_setting (screen, "gtk-xft-rgba"); + if (notify) + notify_setting (screen, "gtk-xft-rgba"); } if (screen_wayland->xft_settings.dpi != xft_settings.dpi) @@ -510,7 +514,8 @@ update_xft_settings (GdkScreen *screen) _gdk_screen_set_resolution (screen, dpi); - notify_setting (screen, "gtk-xft-dpi"); + if (notify) + notify_setting (screen, "gtk-xft-dpi"); } } @@ -626,7 +631,7 @@ settings_changed (GSettings *settings, else if (strcmp (key, "high-contrast") == 0) high_contrast_changed (screen); else - update_xft_settings (screen); + update_xft_settings (screen, TRUE); } } @@ -658,7 +663,7 @@ apply_portal_setting (TranslationEntry *entry, entry->fallback.i = get_order (g_variant_get_string (value, NULL)); else if (strcmp (entry->key, "text-scaling-factor") == 0) entry->fallback.i = (int) (g_variant_get_double (value) * 65536.0); - update_xft_settings (screen); + update_xft_settings (screen, TRUE); break; default: break; @@ -839,7 +844,7 @@ fallback: g_settings_schema_unref (schema); } - update_xft_settings (screen); + update_xft_settings (screen, FALSE); } static void