Bring Single-Meta-Keypress Overview Behavior to KDE6 (just like Gnome!) – and a bit on KDE configuration files…

I missed KDE… best of both worlds?

Like a lot of things in the tech world these days, it all started with a short question on Reddit:

Keyboard shortcut to search programs in overview like Gnome?
byu/AveryFreeman inkde

Teal;Deer:

I found out the meta-only modifier is one thing that needed to be set in $HOME/.config/kwinrc, but also the ExposeAll=Meta config in $HOME/.config/kglobalshortcutsrc – so there’s two places where it needs to be set. Also, you can add /KWin reconfigure to the end and it should start working immediately (reloads kwin config). But hey, thanks so much for pointing me in the right direction!

(my synoposis in the subred)

The biggest impediment to getting the Gnome-like super key behavior in KDE is getting KDE to interpret a single keypress as a keyboard shortcut. If you look at it critically, you can see there’s a lot going on in that single keypress in Gnome: In Gnome, a single keypress gives you both the open windows overview, and a search bar, and even has additional menus accessible from repeating the action (double-pressing super).

KDE isn’t really able to allow single-keypress shortcuts by default, but there’s a spot they’ve carved out where users can add the behavior if they really want to (I get the sense it’s caveat emptor). I’ve never been particularly interested in sticking to pre-defined conventions, so I set out to find out how we could make super behave like it does in Gnome. It couldn’t be that hard, right?

I wanted to know what was going on under the hood, so I did some digging. The most complete reference on the KDE configuration files I’ve found so far is here: https://userbase.kde.org/KDE_System_Administration/Configuration_Files

There’s a whole bunch of really great examples here: https://userbase.kde.org/Plasma/Tips

There’s some man files that are also helpful here (I don’t think this particular spec has changed from KDE 5 to 6):
https://linuxcommandlibrary.com/man/kreadconfig5
https://linuxcommandlibrary.com/man/kwriteconfig5

I found the shortcuts in KDE6 are located in a file named /home/$USER/.config/kglobalshortcutsrc. They’re grouped by category with the names in brackets, like [ActivityManager], [kmix], etc.

So, related to my question, when I opened this file, under [kwin] I found this:

# $HOME/.config/kglobalshortcutsrc

[kwin]
Activate Window Demanding Attention=Meta+Ctrl+A,Meta+Ctrl+A,Activate Window Demanding Attention
Cycle Overview=Meta+Tab,none,Cycle through Overview and Grid View
Cycle Overview Opposite=none,none,Cycle through Grid View and Overview
. . . 
ExposeAll=Meta,Ctrl+F10\tLaunch (C),Toggle Present Windows (All desktops)
. . .Code language: PHP (php)

And when I ran the following:

kreadconfig6 --file kglobalshortcutsrc --group kwin --key ExposeAll

I get this response in my terminal:


. . .  
Meta,Ctrl+F10   Launch (C),Toggle Present Windows (All desktops)

So in reference to the kreadconfig6 syntax, the key is the kwin action named ExposeAll. The group should be the category of actions, [kwin]. The harder part is keeping the description in there when writing from the command line, because it’s tab-separated, \t to the right of the same line. But anyway, I am assuming it would be:

kwriteconfig6 --file kglobalshortcutsrc --group kwin --key ExposeAll Meta"

Or if you needed the descriptor to be in the same line as the value (like in the text file), it would be:

kwriteconfig6 --file kglobalshortcutsrc --group kwin --key ExposeAll Meta\tLaunch (C),Toggle Present Windows (All desktops)"

I’m not sure if kwriteconfig6 can sort out the tab-separated sections on its own, but I imagine it probably can. I have shied away from editing these config files in a text editor just in case there’s some specificity they have regarding tab and whitespace I might mess up, but I imagine it could be one option – if you try it, be sure to use a tabspace v whitespace identifier plugin for vim

Thankfully normal people can add this behavior from the GUI under Ksettings -> Shortcuts -> Kwin, too – so that’s reassuring!

A bigger issue might be specifying that you can use only a modifier key as a shortcut (e.g. meta, alt, shift, etc.) which is what the answer to my reddit question addressed (although I don’t think they were aware, exactly).

Therefore, settings need to be created or modified in two separate places, once for the key behavior, ExposeAll (previous example), and another for allowing the key to behave like a shortcut. As far as I can tell, allowing Meta on its own to ‘be’ a shortcut does need to be invoked at the command line. Here’s the process:

Meta (the keypress) is the key value in the pair, analogous to the example with ExposeAll. It will end up in the config file for kwin:

# $HOME/.config/kwinrc 

[ModifierOnlyShortcuts]
Meta=org.kde.kglobalaccel,/component/kwin,org.kde.kglobalaccel.Component,invokeShortcut,OverviewCode language: PHP (php)

Coincidentally, there the syntax to add it is provided at the end of the kwriteconfig5 man file I linked above. At the very end, it gives the example:

kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta "org.kde.kglobalaccel,/component/krunner_desktop,org.kde.kglobalaccel.Component,invokeShortcut,_launch"Code language: JavaScript (javascript)

… which is for launching krunner if you hit meta by itself.

If you’d want the config to be reloaded (to start working immediately) you can add /KWin reconfigure to the end.

So I’m assuming if you already have the ExposeAll behavior in your kglobalshortcutsrc and you run the above argument, it should combine krunner with ExposeAll under the Meta keypress, which is extremely Gnome-like behavior (and pretty exciting!)

TBH I was trying all sorts of stuff when I was doing this and am not sure the exact point at which I got the desired behavior, it might require re-logging in or something like that, too. But these are the two elements you’d need in which to get the Gnome-like action from smashing your Meta key.

One last thing – you may have noticed there’s a more conventional keyboard shortcut Ctrl+F10 for ExposeAll in $HOME/.config/kglobalshortcutsrc – one that actually combines two keys, like normal (gee, seems quaint!)

[kwin]
. . . 
ExposeAll=Meta,Ctrl+F10\tLaunch (C),Toggle Present Windows (All desktops)
. . . 

That’s because the userbase.kde.org site I linked at the top says a single-key shortcut (Meta) might not work if there isn’t a key combination shortcut also configured for the same action (Ctrl+F10)

Lastly, I threw together a little one-liner that dumps all the configs into a single text file for analyzing. It makes them a little easier to sift and not have to open each one individually. Just run it from the $HOME/. folder:

for i in $(ls -a1 .config/k*); do echo "File: $(pwd)/$i"; echo ' '; cat $i; echo ' '; echo '--- end ---';  echo ' '; done > ./kde-config-files.txtCode language: PHP (php)

I’ll probably put all my KDE6 configs in a git repo one of these days, but for now, I’m off to study ORM development with Python and SQL… Cheers!

Name Your Distro: Flatpaks irritatingly don’t follow desktop theme (written specific to KDE / Plasma-Desktop 6)

Brings back memories of being read the Ugly Duckling

This is not an issue with any Linux distro specifically, but with all distros in general. If anyone out there’s had this issue, I’m sure you’ve shared my pain. I’d struggled with getting flatpaks to follow the (dark) system theme I set for a while, and I finally just got it fixed, so I thought I’d run through the process real quick:

  1. make sure you’re setting a theme that has a flatpak version available (I chose adw-gtk3{,-dark})
  2. install the flatpak versions: as of writing, gtk3 flatpak themes are the only ones you need to download, but if your theme doesn’t include a gtk4 variant, YMMV
  3. install the gtk themes for your desktop environment and ensure they are in the proper location
  4. enable gtk themes in gsettings
  5. A couple last-ditch effort recommendations if 1-4 doesn’t work

Here’s the steps expanded:

Choose a theme you can get in a desktop version – a good place to see if you can find the theme you want is gnome-look.org. Make sure if you use both user and system flatpaks you have a theme for both (I personally only use userspace flatpaks from flathub to avoid complications) Here’s the current list of flatpak theme runtimes as of writing:

❯ clear && flatpak search --user --columns=app theme | grep org.gtk | sort -n
org.gtk.Gtk3theme.Adapta
org.gtk.Gtk3theme.Adapta-Brila
org.gtk.Gtk3theme.Adapta-Brila-Eta
org.gtk.Gtk3theme.Adapta-Eta
org.gtk.Gtk3theme.Adapta-Nokto
org.gtk.Gtk3theme.Adapta-Nokto-Eta
org.gtk.Gtk3theme.Adementary
org.gtk.Gtk3theme.Adwaita-dark
org.gtk.Gtk3theme.adw-gtk3
org.gtk.Gtk3theme.adw-gtk3-dark
org.gtk.Gtk3theme.Akwa org.gtk.Gtk3theme.Akwa-dark org.gtk.Gtk3theme.Akwa-light org.gtk.Gtk3theme.Ambiance org.gtk.Gtk3theme.Arc org.gtk.Gtk3theme.Arc-Dark org.gtk.Gtk3theme.Arc-Darker org.gtk.Gtk3theme.Arc-Darker-solid org.gtk.Gtk3theme.Arc-Dark-solid org.gtk.Gtk3theme.Arc-Lighter org.gtk.Gtk3theme.Arc-Lighter-solid org.gtk.Gtk3theme.Arc-solid org.gtk.Gtk3theme.Breeze org.gtk.Gtk3theme.Catppuccin-blue org.gtk.Gtk3theme.Catppuccin-green org.gtk.Gtk3theme.Catppuccin-orange org.gtk.Gtk3theme.Catppuccin-pink org.gtk.Gtk3theme.Catppuccin-purple org.gtk.Gtk3theme.Catppuccin-red org.gtk.Gtk3theme.Catppuccin-teal org.gtk.Gtk3theme.Catppuccin-yellow org.gtk.Gtk3theme.Chicago95 org.gtk.Gtk3theme.Communitheme org.gtk.Gtk3theme.CrosAdapta org.gtk.Gtk3theme.deepin org.gtk.Gtk3theme.deepin-dark org.gtk.Gtk3theme.elementary org.gtk.Gtk3theme.Flat-Remix-GTK-Blue org.gtk.Gtk3theme.Flat-Remix-GTK-Blue-Dark org.gtk.Gtk3theme.Flat-Remix-GTK-Blue-Darker org.gtk.Gtk3theme.Flat-Remix-GTK-Blue-Darker-Solid org.gtk.Gtk3theme.Flat-Remix-GTK-Blue-Darkest org.gtk.Gtk3theme.Flat-Remix-GTK-Blue-Darkest-NoBorder org.gtk.Gtk3theme.Flat-Remix-GTK-Blue-Darkest-Solid org.gtk.Gtk3theme.Flat-Remix-GTK-Blue-Darkest-Solid-NoBorder org.gtk.Gtk3theme.Flat-Remix-GTK-Blue-Dark-Solid org.gtk.Gtk3theme.Flat-Remix-GTK-Blue-Solid org.gtk.Gtk3theme.Flat-Remix-GTK-Green org.gtk.Gtk3theme.Flat-Remix-GTK-Green-Dark org.gtk.Gtk3theme.Flat-Remix-GTK-Green-Darker org.gtk.Gtk3theme.Flat-Remix-GTK-Green-Darker-Solid org.gtk.Gtk3theme.Flat-Remix-GTK-Green-Darkest org.gtk.Gtk3theme.Flat-Remix-GTK-Green-Darkest-NoBorder org.gtk.Gtk3theme.Flat-Remix-GTK-Green-Darkest-Solid org.gtk.Gtk3theme.Flat-Remix-GTK-Green-Darkest-Solid-NoBorder org.gtk.Gtk3theme.Flat-Remix-GTK-Green-Dark-Solid org.gtk.Gtk3theme.Flat-Remix-GTK-Green-Solid org.gtk.Gtk3theme.Flat-Remix-GTK-Red org.gtk.Gtk3theme.Flat-Remix-GTK-Red-Dark org.gtk.Gtk3theme.Flat-Remix-GTK-Red-Darker org.gtk.Gtk3theme.Flat-Remix-GTK-Red-Darker-Solid org.gtk.Gtk3theme.Flat-Remix-GTK-Red-Darkest org.gtk.Gtk3theme.Flat-Remix-GTK-Red-Darkest-NoBorder org.gtk.Gtk3theme.Flat-Remix-GTK-Red-Darkest-Solid org.gtk.Gtk3theme.Flat-Remix-GTK-Red-Darkest-Solid-NoBorder org.gtk.Gtk3theme.Flat-Remix-GTK-Red-Dark-Solid org.gtk.Gtk3theme.Flat-Remix-GTK-Red-Solid org.gtk.Gtk3theme.Flat-Remix-GTK-Yellow org.gtk.Gtk3theme.Flat-Remix-GTK-Yellow-Dark org.gtk.Gtk3theme.Flat-Remix-GTK-Yellow-Darker org.gtk.Gtk3theme.Flat-Remix-GTK-Yellow-Darker-Solid org.gtk.Gtk3theme.Flat-Remix-GTK-Yellow-Darkest org.gtk.Gtk3theme.Flat-Remix-GTK-Yellow-Darkest-NoBorder org.gtk.Gtk3theme.Flat-Remix-GTK-Yellow-Darkest-Solid org.gtk.Gtk3theme.Flat-Remix-GTK-Yellow-Darkest-Solid-NoBorder org.gtk.Gtk3theme.Flat-Remix-GTK-Yellow-Dark-Solid org.gtk.Gtk3theme.Flat-Remix-GTK-Yellow-Solid org.gtk.Gtk3theme.Greybird org.gtk.Gtk3theme.Greybird org.gtk.Gtk3theme.Greybird-dark org.gtk.Gtk3theme.Greybird-Geeko-Dark org.gtk.Gtk3theme.Greybird-Geeko-Light org.gtk.Gtk3theme.Helium org.gtk.Gtk3theme.Helium-dark org.gtk.Gtk3theme.High-Sierra org.gtk.Gtk3theme.High-Sierra-Dark org.gtk.Gtk3theme.Jade-1 org.gtk.Gtk3theme.Jade-1-Amber org.gtk.Gtk3theme.Jade-1-Aqua org.gtk.Gtk3theme.Jade-1-Blue org.gtk.Gtk3theme.Jade-1-Gray org.gtk.Gtk3theme.Jade-1-Green org.gtk.Gtk3theme.Jade-1-Indigo org.gtk.Gtk3theme.Jade-1-Purple org.gtk.Gtk3theme.Jade-1-Red org.gtk.Gtk3theme.Jade-1-Teal org.gtk.Gtk3theme.Lounge org.gtk.Gtk3theme.Lounge-compact org.gtk.Gtk3theme.Lounge-night org.gtk.Gtk3theme.Lounge-night-compact org.gtk.Gtk3theme.Matcha-aliz org.gtk.Gtk3theme.Matcha-azul org.gtk.Gtk3theme.Matcha-dark-aliz org.gtk.Gtk3theme.Matcha-dark-azul org.gtk.Gtk3theme.Matcha-dark-pueril org.gtk.Gtk3theme.Matcha-dark-sea org.gtk.Gtk3theme.Matcha-light-aliz org.gtk.Gtk3theme.Matcha-light-azul org.gtk.Gtk3theme.Matcha-light-pueril org.gtk.Gtk3theme.Matcha-light-sea org.gtk.Gtk3theme.Matcha-pueril org.gtk.Gtk3theme.Matcha-sea org.gtk.Gtk3theme.Materia org.gtk.Gtk3theme.Materia-compact org.gtk.Gtk3theme.Materia-dark org.gtk.Gtk3theme.Materia-dark-compact org.gtk.Gtk3theme.Materia-light org.gtk.Gtk3theme.Materia-light-compact org.gtk.Gtk3theme.Materia-nord org.gtk.Gtk3theme.Materia-nord-compact org.gtk.Gtk3theme.Mint-Y org.gtk.Gtk3theme.Mint-Y-Aqua org.gtk.Gtk3theme.Mint-Y-Blue org.gtk.Gtk3theme.Mint-Y-Brown org.gtk.Gtk3theme.Mint-Y-Dark org.gtk.Gtk3theme.Mint-Y-Dark-Aqua org.gtk.Gtk3theme.Mint-Y-Dark-Blue org.gtk.Gtk3theme.Mint-Y-Dark-Brown org.gtk.Gtk3theme.Mint-Y-Darker org.gtk.Gtk3theme.Mint-Y-Darker-Aqua org.gtk.Gtk3theme.Mint-Y-Darker-Blue org.gtk.Gtk3theme.Mint-Y-Darker-Brown org.gtk.Gtk3theme.Mint-Y-Darker-Grey org.gtk.Gtk3theme.Mint-Y-Darker-Orange org.gtk.Gtk3theme.Mint-Y-Darker-Pink org.gtk.Gtk3theme.Mint-Y-Darker-Purple org.gtk.Gtk3theme.Mint-Y-Darker-Red org.gtk.Gtk3theme.Mint-Y-Darker-Sand org.gtk.Gtk3theme.Mint-Y-Darker-Teal org.gtk.Gtk3theme.Mint-Y-Dark-Grey org.gtk.Gtk3theme.Mint-Y-Dark-Orange org.gtk.Gtk3theme.Mint-Y-Dark-Pink org.gtk.Gtk3theme.Mint-Y-Dark-Purple org.gtk.Gtk3theme.Mint-Y-Dark-Red org.gtk.Gtk3theme.Mint-Y-Dark-Sand org.gtk.Gtk3theme.Mint-Y-Dark-Teal org.gtk.Gtk3theme.Mint-Y-Grey org.gtk.Gtk3theme.Mint-Y-Orange org.gtk.Gtk3theme.Mint-Y-Pink org.gtk.Gtk3theme.Mint-Y-Purple org.gtk.Gtk3theme.Mint-Y-Red org.gtk.Gtk3theme.Mint-Y-Sand org.gtk.Gtk3theme.Mint-Y-Teal org.gtk.Gtk3theme.Mojave-light org.gtk.Gtk3theme.Numix org.gtk.Gtk3theme.Numix-Frost org.gtk.Gtk3theme.Numix-Frost-Light org.gtk.Gtk3theme.Obsidian-2 org.gtk.Gtk3theme.Obsidian-2-Amber org.gtk.Gtk3theme.Obsidian-2-Aqua org.gtk.Gtk3theme.Obsidian-2-Gray org.gtk.Gtk3theme.Obsidian-2-Green org.gtk.Gtk3theme.Obsidian-2-Indigo org.gtk.Gtk3theme.Obsidian-2-Mint org.gtk.Gtk3theme.Obsidian-2-Purple org.gtk.Gtk3theme.Obsidian-2-Red org.gtk.Gtk3theme.Obsidian-2-Teal org.gtk.Gtk3theme.Plata org.gtk.Gtk3theme.Plata org.gtk.Gtk3theme.Plata-Compact org.gtk.Gtk3theme.Plata-Compact org.gtk.Gtk3theme.Plata-Lumine org.gtk.Gtk3theme.Plata-Lumine org.gtk.Gtk3theme.Plata-Lumine-Compact org.gtk.Gtk3theme.Plata-Lumine-Compact org.gtk.Gtk3theme.Plata-Noir org.gtk.Gtk3theme.Plata-Noir org.gtk.Gtk3theme.Plata-Noir-Compact org.gtk.Gtk3theme.Plata-Noir-Compact org.gtk.Gtk3theme.Pop org.gtk.Gtk3theme.Pop-dark org.gtk.Gtk3theme.Pop-light org.gtk.Gtk3theme.Pop-slim-dark org.gtk.Gtk3theme.Pop-slim-light org.gtk.Gtk3theme.Qogir org.gtk.Gtk3theme.Qogir org.gtk.Gtk3theme.Qogir-dark org.gtk.Gtk3theme.Qogir-light org.gtk.Gtk3theme.Qogir-light org.gtk.Gtk3theme.Qogir-manjaro org.gtk.Gtk3theme.Qogir-manjaro org.gtk.Gtk3theme.Qogir-manjaro-dark org.gtk.Gtk3theme.Qogir-manjaro-dark org.gtk.Gtk3theme.Qogir-manjaro-light org.gtk.Gtk3theme.Qogir-manjaro-light org.gtk.Gtk3theme.Qogir-manjaro-win org.gtk.Gtk3theme.Qogir-manjaro-win org.gtk.Gtk3theme.Qogir-manjaro-win-dark org.gtk.Gtk3theme.Qogir-manjaro-win-dark org.gtk.Gtk3theme.Qogir-manjaro-win-light org.gtk.Gtk3theme.Qogir-manjaro-win-light org.gtk.Gtk3theme.Qogir-ubuntu org.gtk.Gtk3theme.Qogir-ubuntu org.gtk.Gtk3theme.Qogir-ubuntu-dark org.gtk.Gtk3theme.Qogir-ubuntu-dark org.gtk.Gtk3theme.Qogir-ubuntu-light org.gtk.Gtk3theme.Qogir-ubuntu-light org.gtk.Gtk3theme.Qogir-ubuntu-win org.gtk.Gtk3theme.Qogir-ubuntu-win org.gtk.Gtk3theme.Qogir-ubuntu-win-dark org.gtk.Gtk3theme.Qogir-ubuntu-win-dark org.gtk.Gtk3theme.Qogir-ubuntu-win-light org.gtk.Gtk3theme.Qogir-ubuntu-win-light org.gtk.Gtk3theme.Qogir-win org.gtk.Gtk3theme.Qogir-win org.gtk.Gtk3theme.Qogir-win-dark org.gtk.Gtk3theme.Qogir-win-dark org.gtk.Gtk3theme.Qogir-win-light org.gtk.Gtk3theme.Qogir-win-light org.gtk.Gtk3theme.Sierra-Negra org.gtk.Gtk3theme.SolArc-Dark org.gtk.Gtk3theme.Yaru org.gtk.Gtk3theme.Yaru-Amber org.gtk.Gtk3theme.Yaru-Amber org.gtk.Gtk3theme.Yaru-Amber-dark org.gtk.Gtk3theme.Yaru-Amber-dark org.gtk.Gtk3theme.Yaru-Amber-light org.gtk.Gtk3theme.Yaru-Amber-light org.gtk.Gtk3theme.Yaru-Aqua org.gtk.Gtk3theme.Yaru-Aqua org.gtk.Gtk3theme.Yaru-Aqua-dark org.gtk.Gtk3theme.Yaru-Aqua-dark org.gtk.Gtk3theme.Yaru-Aqua-light org.gtk.Gtk3theme.Yaru-Aqua-light org.gtk.Gtk3theme.Yaru-Aubergine org.gtk.Gtk3theme.Yaru-Aubergine-dark org.gtk.Gtk3theme.Yaru-Aubergine-light org.gtk.Gtk3theme.Yaru-bark org.gtk.Gtk3theme.Yaru-bark-dark org.gtk.Gtk3theme.Yaru-Blue org.gtk.Gtk3theme.Yaru-Blue org.gtk.Gtk3theme.Yaru-Blue-dark org.gtk.Gtk3theme.Yaru-Blue-dark org.gtk.Gtk3theme.Yaru-Blue-light org.gtk.Gtk3theme.Yaru-Blue-light org.gtk.Gtk3theme.Yaru-Brown org.gtk.Gtk3theme.Yaru-Brown org.gtk.Gtk3theme.Yaru-Brown-dark org.gtk.Gtk3theme.Yaru-Brown-dark org.gtk.Gtk3theme.Yaru-Brown-light org.gtk.Gtk3theme.Yaru-Brown-light org.gtk.Gtk3theme.Yaru-Cinnamon org.gtk.Gtk3theme.Yaru-Cinnamon org.gtk.Gtk3theme.Yaru-Cinnamon-dark org.gtk.Gtk3theme.Yaru-Cinnamon-dark org.gtk.Gtk3theme.Yaru-Cinnamon-light org.gtk.Gtk3theme.Yaru-Cinnamon-light org.gtk.Gtk3theme.Yaru-dark org.gtk.Gtk3theme.Yaru-Deepblue org.gtk.Gtk3theme.Yaru-Deepblue org.gtk.Gtk3theme.Yaru-Deepblue-dark org.gtk.Gtk3theme.Yaru-Deepblue-dark org.gtk.Gtk3theme.Yaru-Deepblue-light org.gtk.Gtk3theme.Yaru-Deepblue-light org.gtk.Gtk3theme.Yaru-Green org.gtk.Gtk3theme.Yaru-Green org.gtk.Gtk3theme.Yaru-Green-dark org.gtk.Gtk3theme.Yaru-Green-dark org.gtk.Gtk3theme.Yaru-Green-light org.gtk.Gtk3theme.Yaru-Green-light org.gtk.Gtk3theme.Yaru-Grey org.gtk.Gtk3theme.Yaru-Grey org.gtk.Gtk3theme.Yaru-Grey-dark org.gtk.Gtk3theme.Yaru-Grey-dark org.gtk.Gtk3theme.Yaru-Grey-light org.gtk.Gtk3theme.Yaru-Grey-light org.gtk.Gtk3theme.Yaru-Lavender org.gtk.Gtk3theme.Yaru-Lavender-dark org.gtk.Gtk3theme.Yaru-Lavender-light org.gtk.Gtk3theme.Yaru-light org.gtk.Gtk3theme.Yaru-magenta org.gtk.Gtk3theme.Yaru-magenta-dark org.gtk.Gtk3theme.Yaru-MATE org.gtk.Gtk3theme.Yaru-MATE org.gtk.Gtk3theme.Yaru-MATE-dark org.gtk.Gtk3theme.Yaru-MATE-dark org.gtk.Gtk3theme.Yaru-MATE-light org.gtk.Gtk3theme.Yaru-MATE-light org.gtk.Gtk3theme.Yaru-olive org.gtk.Gtk3theme.Yaru-olive-dark org.gtk.Gtk3theme.Yaru-Orange org.gtk.Gtk3theme.Yaru-Orange org.gtk.Gtk3theme.Yaru-Orange-dark org.gtk.Gtk3theme.Yaru-Orange-dark org.gtk.Gtk3theme.Yaru-Orange-light org.gtk.Gtk3theme.Yaru-Orange-light org.gtk.Gtk3theme.Yaru-Pink org.gtk.Gtk3theme.Yaru-Pink org.gtk.Gtk3theme.Yaru-Pink-dark org.gtk.Gtk3theme.Yaru-Pink-dark org.gtk.Gtk3theme.Yaru-Pink-light org.gtk.Gtk3theme.Yaru-Pink-light org.gtk.Gtk3theme.Yaru-prussiangreen org.gtk.Gtk3theme.Yaru-prussiangreen-dark org.gtk.Gtk3theme.Yaru-Purple org.gtk.Gtk3theme.Yaru-Purple org.gtk.Gtk3theme.Yaru-Purple-dark org.gtk.Gtk3theme.Yaru-Purple-dark org.gtk.Gtk3theme.Yaru-Purple-light org.gtk.Gtk3theme.Yaru-Purple-light org.gtk.Gtk3theme.Yaru-Red org.gtk.Gtk3theme.Yaru-Red org.gtk.Gtk3theme.Yaru-Red-dark org.gtk.Gtk3theme.Yaru-Red-dark org.gtk.Gtk3theme.Yaru-Red-light org.gtk.Gtk3theme.Yaru-Red-light org.gtk.Gtk3theme.Yaru-remix org.gtk.Gtk3theme.Yaru-remix-dark org.gtk.Gtk3theme.Yaru-remix-light org.gtk.Gtk3theme.Yaru-sage org.gtk.Gtk3theme.Yaru-sage-dark org.gtk.Gtk3theme.Yaru-Teal org.gtk.Gtk3theme.Yaru-Teal org.gtk.Gtk3theme.Yaru-Teal-dark org.gtk.Gtk3theme.Yaru-Teal-dark org.gtk.Gtk3theme.Yaru-Teal-light org.gtk.Gtk3theme.Yaru-Teal-light org.gtk.Gtk3theme.Yaru-Yellow org.gtk.Gtk3theme.Yaru-Yellow-dark org.gtk.Gtk3theme.Yaru-Yellow-dark org.gtk.Gtk3theme.Yaru-Yellow-light org.gtk.Gtk3theme.Yaru-Yellow-light org.gtk.Gtk3theme.Zukitre org.gtk.Gtk3theme.Zukitwo

You can see at the top of the list adw-gtk3 and adw-gtk3-dark are separate packages, so if you wanted to support both light and dark modes, install them both:

for T in adw-gtk3 adw-gtk3-dark; do flatpak install -uy org.gtk.Gtk3theme.$T; done Code language: Bash (bash)

See if there’s a packaged or scripted version of the same theme on your distro before installing from Gnome Look – I lucked out and there was one already in the AUR (number 3 looked good to me!):

❯ paru -Ss adw-gtk3
<strong>aur</strong>/<strong>adw-gtk35.3-1</strong> [<strong>+43 ~3.15</strong>]
   The theme from libadwaita ported to GTK-3
<strong>aur</strong>/<strong>adw-gtk3-git1.0.r2.a2a0114-1</strong> [<strong>+15 ~1.21</strong>]
   The theme from libadwaita ported to GTK-3
<strong>aur</strong>/<strong>adw-gtk-theme1.1-2</strong> [<strong>+12 ~1.00</strong>]
   LibAdwaita Theme for all GTK3 and GTK4 Apps. NOTE: This is a meta package
   which uses adw-gtk3 for GTK3 and official LibAdwaita theme for GTK4
Code language: Bash (bash)

If you do have to install a theme package manually, just remember they can go in either /usr/share/themes/. (system-wide) or $HOME/.local/share/themes (user), but not both!

Go to kcm_style in your KDE settings panel and choose “Configure GNOME/GTK Application Style” (top right)

❯ systemsettings <strong>kcm</strong>_styleCode language: Bash (bash)
KDE Settings Configuration (part 1)
KDE Settings Configuration (part 2)

Last step (hopefully):

Tell gsettings your defaults – this has to be done from the command line unless you have dconf-editor or gnome-tweaks installed for some reason (unusual and unnecessary for a KDE-centric system). Here’s the key-value pairs:

❯ gsettings set org.gnome.desktop.interface gtk-theme 'adw-gtk3-dark'; 
  gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'Code language: Bash (bash)

Replace the values at the end with your particular theme and preference, of course (again, I choose adw-gtk3-dark, mostly because I knew it would be the best supported theme). Obviously, if you don’t 'prefer-dark' that second line is optional.

OK now try starting one of the flatpaks you’ve been having issues with and see how it went!

If it’s still not loading in your preferred theme, I’d go back and check the steps to make sure you covered them properly. You can try gsettings get on org.gnome.desktop.interface gtk-theme to check that it has your proper value, or check /usr/share/themes to make sure a folder exists with the name of the theme you thought you installed (manually or with a package manager) or $HOME/.local/share/themes/ if you installed it manually to your user folder.

If those all seem legit, check out xsettingsd: It looks like it’s a dependency of kde-gtk-config on Arch Linux currently, so you might already have it:

❯ pacman -Qi xsettingsd
Name            : xsettingsd
Version         : 1.0.2-1
Description     : Provides settings to X11 applications via the XSETTINGS specification
Architecture    : x86_64
URL             : https://github.com/derat/xsettingsd
Licenses        : custom:BSD
Groups          : None
Provides        : None
Depends On      : libx11  gcc-libs
Optional Deps   : None
Required By     : kde-gtk-config
Optional For    : None
Conflicts With  : None
Replaces        : None
Installed Size  : 78.82 KiB
Packager        : Antonio Rojas <arojas@archlinux.org>
Build Date      : Mon 09 Aug 2021 04:16:10 AM PDT
Install Date    : Sat 16 Mar 2024 10:31:30 PM PDT
Install Reason  : Installed as a dependency for another package
Install Script  : No
Validated By    : Signature
Code language: Bash (bash)

Do the usual checks to make sure it’s running (it’s only visible using systemctl --user in Arch):

❯  systemctl --user status xsettingsd.service
● xsettingsd.service - XSETTINGS-protocol daemon
     Loaded: loaded (/usr/lib/systemd/user/xsettingsd.service; static)
     Active: active (running) since Sat 2024-03-23 14:35:18 PDT; 1h 52min ago
   Main PID: 469119 (xsettingsd)
      Tasks: 1 (limit: 9084)
     Memory: 156.0K (peak: 696.0K swap: 344.0K swap peak: 344.0K zswap: 55.8K)
        CPU: 4ms
     CGroup: /user.slice/user-1000.slice/user@1000.service/session.slice/xsettingsd.service
             └─469119 /usr/bin/xsettingsd

Mar 23 14:35:18 purplehippo systemd[1283]: Started XSETTINGS-protocol daemon.
Mar 23 14:35:18 purplehippo xsettingsd[469119]: xsettingsd: Loaded 14 settings from /home/avery/.config/xsettingsd/xsettingsd.conf
Mar 23 14:35:18 purplehippo xsettingsd[469119]: xsettingsd: Created window 0xc00001 on screen 0 with timestamp 5373106
Mar 23 14:35:18 purplehippo xsettingsd[469119]: xsettingsd: Selection _XSETTINGS_S0 is owned by 0x0
Mar 23 14:35:18 purplehippo xsettingsd[469119]: xsettingsd: Took ownership of selection _XSETTINGS_S0
Mar 23 14:53:07 purplehippo xsettingsd[469119]: xsettingsd: Reloading configuration
Mar 23 14:53:07 purplehippo xsettingsd[469119]: xsettingsd: Loaded 14 settings from /home/avery/.config/xsettingsd/xsettingsd.conf
Code language: JavaScript (javascript)

If it’s having an issue, try restarting it, or you can examine the configuration file it creates automatically in your $XDG_CONFIG_HOME dir and make sure it all looks reasonable:

❯ bat $XDG_CONFIG_HOME/xsettingsd/xsettingsd.conf
──────┬──────────────────────────────────────────────────────────────────────────────────────────────────────
       │ File: /home/avery/.config/xsettingsd/xsettingsd.conf
──────┼──────────────────────────────────────────────────────────────────────────────────────────────────────
   1   │ Gdk/UnscaledDPI 98304
   2   │ Gdk/WindowScalingFactor 1
   3   │ Gtk/EnableAnimations 1
   4   │ Gtk/DecorationLayout "icon:minimize,maximize,close"
   5   │ Net/ThemeName "adw-gtk3-dark"
   6   │ Gtk/PrimaryButtonWarpsSlider 0
   7   │ Gtk/ToolbarStyle 3
   8   │ Gtk/MenuImages 1
   9   │ Gtk/ButtonImages 1
  10   │ Gtk/CursorThemeSize 64
  11   │ Gtk/CursorThemeName "Posy_Cursor_125_175"
  12   │ Net/SoundThemeName "ocean"
  13   │ Net/IconThemeName "Papirus"
  14   │ Gtk/FontName "Noto Sans,  10"
  15   │ 
──────┴──────────────────────────────────────────────────────────────────────────────────────────────────────Code language: JavaScript (javascript)

if THAT all looks fine, there was one last thing on wiki.archlinux.org that looked like it might work (especially with Window Manager-type setups like minimal tiling desktop such as sway and dwm – although, if you’re into minimal WMs, not sure if you’d like flatpaks – in any event, nobody’s a monolith…). You could put something like this in $HOME/bin and call it refresh-flatpak-themes (etc.) then run it when you see one getting dodgy:

#!/usr/bin/env bash
for FLATPAK_APP in "$HOME/.var/app/*"; do
  [ -d "$HOME/.var/app/$FLATPAK_APP/config/gtk-3.0" ] ||
  /usr/bin/ln -s "$HOME/.config/gtk-3.0" "$HOME/.var/app/$FLATPAK_APP/config/"
done
Code language: JavaScript (javascript)

Which basically just loops through each flatpak app you have in your user’s .var folder, checks to see if it has a gtk-3.0 definition folder, and if not, makes a symbolic link to where one usually lives in your $XDG_CONFIG_HOME. You could try making the symlink to one manually to see if it works before setting up a script, but if it works out, hey, go for it.

Another option I saw which looks pretty elegant is outlined here on a xerolinux-specific BB, but should apply to pretty much any distro using the xdg user-dirs spec:

❯ export GTK3_THEME=(name of preferred theme);
  flatpak --user override --filesystem=$HOME/.local/share/themes;
  flatpak --user override --filesystem=$XDG_CONFIG_HOME/gtk-3.0:ro;
  for FLATPAK_APP in $HOME/.var/app/*; do flatpak --user override \
  $FLATPAK_APP --env=GTK_THEME=$GTK3_THEME; doneCode language: PHP (php)

Quick pointers for troubleshooting:

  1. The user-dirs.dirs file usually lives at $HOME/.config/user-dirs.dirs
  2. Any $VARIABLE can be echoed to the screen using echo $VARNAME (make sure they’re properly set)