GTK4 gets stuck in infinite loop when `GTK_THEME` and `gtk-application-prefer-dark-theme` are set to certain values

I’m writing a GTK4 theme whose dist is symlinked to ~/.local/share/themes, which is in turn symlinked to ~/.config/gtk-4.0. Seemingly, KDE Plasma periodically generates a settings.ini file in that .config directory (likely from its automatic global theme functionality), which contains the line gtk-application-prefer-dark-theme=false.

When this value is set and I launch any GTK4 app with GTK_THEME set to the same theme as is symlinked to .config, it gets stuck in an infinite loop, printing, with G_MESSAGES_DEBUG=all:

(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.082: Using portal setting for org.gnome.fontconfig serial: 0
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.privacy disable-microphone
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.privacy disable-camera
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.privacy old-files-age
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Using portal setting for org.gnome.desktop.privacy remember-recent-files: true
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.privacy disable-sound-output
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.privacy send-software-usage-stats
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.privacy report-technical-problems
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.privacy remove-old-trash-files
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.privacy remove-old-temp-files
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.privacy privacy-screen
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.privacy usb-protection
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.privacy usb-protection-level
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.privacy remember-app-usage
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.privacy show-full-name-in-top-bar
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.privacy hide-identity
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Using portal setting for org.gnome.desktop.privacy recent-files-max-age: -1
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Using portal setting for org.gnome.desktop.a11y.interface keyboard-focus-visible-timeout: -1
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.a11y.interface reduced-motion
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Using portal setting for org.gnome.desktop.a11y.interface show-status-shapes: false
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Using portal setting for org.gnome.desktop.a11y.interface high-contrast: false
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.a11y always-show-universal-access-status
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Using portal setting for org.gnome.desktop.a11y always-show-text-caret: false
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface toolkit-accessibility
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface gtk-color-palette
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface can-change-accels
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface document-font-name
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Using portal setting for org.gnome.desktop.interface enable-animations: true
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Using portal setting for org.gnome.desktop.interface cursor-blink: true
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface clock-show-weekday
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Using portal setting for org.gnome.desktop.interface icon-theme: 'custom'
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface gtk-im-preedit-style
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface scaling-factor
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface menus-have-tearoff
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Using portal setting for org.gnome.desktop.interface cursor-size: 24
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface clock-show-seconds
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Using portal setting for org.gnome.desktop.interface gtk-im-module: ''
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface gtk-timeout-initial
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface accent-color
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Using portal setting for org.gnome.desktop.interface gtk-theme: ''
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface gtk-color-scheme
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface clock-show-date
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Using portal setting for org.gnome.desktop.interface cursor-blink-time: 1000
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface toolbar-icons-size
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Using portal setting for org.gnome.desktop.interface font-antialiasing: 'grayscale'
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface toolbar-style
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface enable-hot-corners
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface monospace-font-name
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface gtk-timeout-repeat
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Using portal setting for org.gnome.desktop.interface overlay-scrolling: true
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Using portal setting for org.gnome.desktop.interface cursor-blink-timeout: 10
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface gtk-key-theme
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface toolbar-detachable
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Using portal setting for org.gnome.desktop.interface font-rendering: 'automatic'
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Using portal setting for org.gnome.desktop.interface cursor-theme: 'Oxygen_White'
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.083: Ignoring portal setting for org.gnome.desktop.interface avatar-directories
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.085: Ignoring portal setting for org.gnome.desktop.interface gtk-im-status-style
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.085: Ignoring portal setting for org.gnome.desktop.interface menubar-detachable
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.085: Using portal setting for org.gnome.desktop.interface text-scaling-factor: 1.0
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.085: Ignoring portal setting for org.gnome.desktop.interface show-battery-percentage
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.interface clock-format
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.interface menubar-accel
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Using portal setting for org.gnome.desktop.interface gtk-enable-primary-paste: false
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.interface color-scheme
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.interface locate-pointer
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Using portal setting for org.gnome.desktop.interface font-rgba-order: 'rgb'
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Using portal setting for org.gnome.desktop.interface font-hinting: 'slight'
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Using portal setting for org.gnome.desktop.interface font-name: 'Oxygen  10'
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Using portal setting for org.gnome.desktop.sound theme-name: 'ocean'
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Using portal setting for org.gnome.desktop.sound event-sounds: true
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Using portal setting for org.gnome.desktop.sound input-feedback-sounds: false
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.sound allow-volume-above-100-percent
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.peripherals.mouse custom-accel-config
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Using portal setting for org.gnome.desktop.peripherals.mouse double-click: 400
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.peripherals.mouse accel-profile
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Using portal setting for org.gnome.desktop.peripherals.mouse drag-threshold: 8
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.peripherals.mouse scroll-wheel-emulation-button-lock
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.peripherals.mouse speed
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.peripherals.mouse natural-scroll
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.peripherals.mouse middle-click-emulation
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.peripherals.mouse left-handed
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.peripherals.mouse scroll-wheel-emulation-button
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Using portal setting for org.freedesktop.appearance contrast: 0
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Using portal setting for org.freedesktop.appearance color-scheme: 2
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Using portal setting for org.freedesktop.appearance reduced-motion: 0
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Using portal setting for org.freedesktop.appearance accent-color: (0.46666666865348816, 0.7764706015586853, 0.93725490570068359)
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.input-sources sources
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.input-sources mru-sources
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.input-sources show-all-sources
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.input-sources current
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.input-sources xkb-options
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.input-sources xkb-model
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.input-sources per-window
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.calendar show-weekdate
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.calendar week-start-day
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.wm.preferences theme
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.wm.preferences focus-new-windows
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.wm.preferences disable-workarounds
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.wm.preferences num-workspaces
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.wm.preferences titlebar-uses-system-font
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.wm.preferences raise-on-click
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.wm.preferences titlebar-font
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.wm.preferences resize-with-right-button
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.wm.preferences auto-raise
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Using portal setting for org.gnome.desktop.wm.preferences action-right-click-titlebar: 'menu'
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.wm.preferences mouse-button-modifier
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Using portal setting for org.gnome.desktop.wm.preferences action-double-click-titlebar: 'toggle-maximize'
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.wm.preferences workspace-names
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.wm.preferences visual-bell-type
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Using portal setting for org.gnome.desktop.wm.preferences action-middle-click-titlebar: 'none'
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.wm.preferences focus-mode
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Using portal setting for org.gnome.desktop.wm.preferences button-layout: 'icon:minimize,maximize,close'
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.wm.preferences auto-raise-delay
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.wm.preferences audible-bell
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.desktop.wm.preferences visual-bell
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.settings-daemon.plugins.xsettings overrides
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.settings-daemon.plugins.xsettings disabled-gtk-modules
(gtk4-widget-factory:238862): Gdk-DEBUG: 17:49:33.086: Ignoring portal setting for org.gnome.settings-daemon.plugins.xsettings enabled-gtk-modules
(gtk4-widget-factory:238862): GLib-GIO-DEBUG: 17:49:33.125: _g_io_module_get_default: Found default implementation gvfs (GDaemonVfs) for ‘gio-vfs’

(gtk4-widget-factory:238862): Gtk-WARNING **: 17:49:33.151: Theme parser error: gtk.css:3647:3-22: No property named "-gtk-outline-radius"

(gtk4-widget-factory:238862): Gtk-WARNING **: 17:49:33.239: Theme parser error: gtk.css:3647:3-22: No property named "-gtk-outline-radius"

(gtk4-widget-factory:238862): Gtk-WARNING **: 17:49:33.336: Theme parser error: gtk.css:3647:3-22: No property named "-gtk-outline-radius"

(gtk4-widget-factory:238862): Gtk-WARNING **: 17:49:33.389: Theme parser error: gtk.css:3647:3-22: No property named "-gtk-outline-radius"

(gtk4-widget-factory:238862): Gtk-WARNING **: 17:49:33.439: Theme parser error: gtk.css:3647:3-22: No property named "-gtk-outline-radius"

(gtk4-widget-factory:238862): Gtk-WARNING **: 17:49:33.492: Theme parser error: gtk.css:3647:3-22: No property named "-gtk-outline-radius"

(gtk4-widget-factory:238862): Gtk-WARNING **: 17:49:33.565: Theme parser error: gtk.css:3647:3-22: No property named "-gtk-outline-radius"

(gtk4-widget-factory:238862): Gtk-WARNING **: 17:49:33.616: Theme parser error: gtk.css:3647:3-22: No property named "-gtk-outline-radius"

(gtk4-widget-factory:238862): Gtk-WARNING **: 17:49:33.674: Theme parser error: gtk.css:3647:3-22: No property named "-gtk-outline-radius"

(gtk4-widget-factory:238862): Gtk-WARNING **: 17:49:33.733: Theme parser error: gtk.css:3647:3-22: No property named "-gtk-outline-radius"

(gtk4-widget-factory:238862): Gtk-WARNING **: 17:49:33.784: Theme parser error: gtk.css:3647:3-22: No property named "-gtk-outline-radius"

(gtk4-widget-factory:238862): Gtk-WARNING **: 17:49:33.855: Theme parser error: gtk.css:3647:3-22: No property named "-gtk-outline-radius"

(gtk4-widget-factory:238862): Gtk-WARNING **: 17:49:33.921: Theme parser error: gtk.css:3647:3-22: No property named "-gtk-outline-radius"

(gtk4-widget-factory:238862): Gtk-WARNING **: 17:49:33.982: Theme parser error: gtk.css:3647:3-22: No property named "-gtk-outline-radius"

(gtk4-widget-factory:238862): Gtk-WARNING **: 17:49:34.040: Theme parser error: gtk.css:3647:3-22: No property named "-gtk-outline-radius"

…until I Ctrl-C. While what it’s repeatedly printing is the error about -gtk-outline-radius, it definitely isn’t related to this, as it runs perfectly fine when I run another variant of the same theme that’s also using it. In fact, when I try setting GTK_THEME to that other variant without touching ~/.config/gtk-4.0, to any other theme e.g. Adwaita, or simply unsetting it entirely, it runs fine. It also runs fine when I remove the gtk-application-prefer-dark-theme=false line from settings.ini, or set it to any value which isn’t true or false.

Changing ~/.config/gtk-4.0 to be simply a copy instead of a symlink has no effect. I’ve also been able to replicate this with the Tokyo Night theme’s dark version, but interestingly its light version works regardless of whether gtk-application-prefer-dark-theme is true or false.

I’m on Arch Linux with gnome-unstable and the other testing repos enabled, but I’ve also had this on a CachyOS machine on which it happened on GNOME. gtk4’s version is 4.23.4-1, and this has been happening for at least a month, at least for the duration I’ve been working on my theme. I never had such a setup before that, so I can’t say how long it’s been a problem.