How to easily implement a Mac theme (with built-in traffic light and three-dot window buttons) on Ubuntu 26.04

How to easily implement a Mac theme (with built-in traffic light and three-dot window buttons) on Ubuntu 26.04

Ubuntu Version:ubuntu 26.04 wayland

Desktop Environment (if applicable):Budggie

Problem Description:
Use GitHub - vinceliuice/MacTahoe-gtk-theme: MacOS Tahoe theme for gtk desktops · GitHub theme uses this design, but many applications lack the three small dots in their top-right corner for closing, minimizing, or maximizing windows. Is there a simple way to implement this feature, or can Ubuntu integrate this style into software compatible with Qt/Snap?

Many software programs cannot display the three small circles.(Thunderbird [deb], vscode, jetbrains,Double Commnader,dbGate, wps, onlyoffice,etc...)

2 Likes

So this is actually a few different problems stacked on top of each other, not one single thing.

the MacTahoe theme works fine for GTK apps because that’s what it’s built for. the issue is that a bunch of the apps you listed — JetBrains, WPS, OnlyOffice, Double Commander, dbGate — those are Qt apps. Qt has its own completely separate theming system and your GTK theme has zero say over how their titlebars look. that’s just how it is on Linux, two different toolkits, two different worlds.

then VSCode and Thunderbird (deb) are Electron, which is a whole third thing. Electron draws its own titlebar inside a Chromium window. there’s nothing at the OS level that can reach in and change those buttons. the app decides what the titlebar looks like, not your theme.

and Snaps on top of that are sandboxed so they barely see your host system theme at all.


for the Qt apps — this is actually the most fixable one.

the main reason Qt apps look broken on your setup is the Wayland transition. Ubuntu dropped the xcb plugin as default and Qt apps end up with no proper decorations. fix that first:

sudo apt install qt5ct qt6ct adwaita-qt adwaita-qt6 kvantum

then add this to your ~/.profile:

export QT_QPA_PLATFORM="xcb;wayland"
export QT_QPA_PLATFORMTHEME=qt5ct

log out, log back in. after that open Qt5 Settings and Qt6 Settings and configure the window buttons from there. for the circular macOS-style buttons specifically there’s a plugin called QWhiteSurGtkDecorations — if you’re on Arch it’s on AUR, otherwise you’d have to build it. once installed:

export QT_WAYLAND_DECORATION=whitesur-gtk

that gets you pretty close on Wayland. not identical to MacTahoe but much better than what you have now. Kvantum with a WhiteSur or McMojave theme on top of that and it looks decent.


for VSCode — go into settings and change Window: Title Bar Style to native. that makes VSCode stop drawing its own titlebar and lets your compositor handle it instead. MacTahoe buttons will show up. the integration isn’t perfect but it works.

for Thunderbird it’s the same idea but you do it through userChrome.css. go to about:config, enable toolkit.legacyUserProfileCustomizations.stylesheets, then create the file at ~/.thunderbird/<your profile>/chrome/userChrome.css and put:

#titlebar { display: none !important; }

that hides Thunderbird’s internal titlebar and your WM draws the decorations instead.


for Snap apps — honestly the cleanest answer is just replace them with .deb versions where you can. OnlyOffice has a .deb, WPS has a .deb. Snap theming on Wayland is a mess and there’s no real fix from the user side right now. if .deb isn’t available try the Flatpak version, those at least support theme overrides through the portal:

sudo flatpak override --filesystem=~/.themes
sudo flatpak override --env=GTK_THEME=MacTahoe-Dark

Some GTK4 Apps not following the GTK theme

That’s a libadwaita thing. since GNOME 43 a lot of built-in apps moved to libadwaita which completely ignores custom GTK themes. MacTahoe handles this by letting you overwrite the gtk-4.0 config directly:

./install.sh -l

run that from the MacTahoe directory. heads up though — it locks all your GTK4 apps into that theme. you can’t switch without re-running the installer with different options.


  • GTK apps > MacTahoe already handles it
  • Qt apps > xcb plugin + qt5ct + Kvantum, fixable
  • Electron (VSCode, Thunderbird) > switch to native titlebar in app settings, partial fix
  • Snap > replace with .deb or Flatpak if you can, otherwise not much you can do
  • libadwaita > run install.sh -l, but it’s all-or-nothing

there’s no single switch that makes everything consistent. it’s a Linux theming problem that’s been around forever and Wayland made parts of it worse. but the Qt fix alone should cover most of the apps you’re having trouble with.

6 Likes

Many moons ago, I stumbled across some special gtk configurations for traffic light style window buttons.
The following (Nautilus) images use the window buttons together with the built-in Yaru dark theme

The folders are temporarily stored in google-drive
Download them and see if it helps

Place (or replace) these folders in .config in your user directory.


For firefox snap package, place the gtk-3.0and gtk-4.0 folders in /home/user/snap/firefox/current/.config
firefox > More Tools > Customise toolbar > Enable titlebar

3 Likes

For QT apps, I follow a procedure similar to @marcelstevano’s suggestion

Install two packages

Open a terminal Ctrl Alt t

sudo apt install qt5-style-kvantum qt6-style-kvantum

The following essential packages will also be installed

libkf6windowsystem-data  
libkf6windowsystem6  
qt-style-kvantum  
qt-style-kvantum-l10n  
qt-style-kvantum-themes

Set Environment Variable for Kvantum

Open Files
Press Ctrl h to reveal hidden files

Add the following line at the end of .profile

export QT_STYLE_OVERRIDE=kvantum

Example
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
	. "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi
export QT_STYLE_OVERRIDE=kvantum

Change theme for QT applications

Open Kvantum Manager > Change/Delete Theme > KvGnomeDark (for example)
Plenty of other light/dark themes themes to explore.

Ensure QT applications display Traffic Light Window Buttons

(Special gtk-3.0 and gtk-4.0 folders must be installed in .config)

Ghostwriter (for example):-

sudo nano /usr/share/applications/org.kde.ghostwriter.desktop

Look for the Exec line

Exec=ghostwriter %f

Change to

Exec=ghostwriter -platform xcb %f

Ctrl o to save
Ctrl x to exit


Ubuntu 26.04 + Gnome 50 + Wayland + Kvantum + Special Window Button Folders + QT APP + Dark Theme

4 Likes

FYI, such environment variables should be set in environment.d drop-ins, otherwise they only have an effect in login shells:

mkdir -p ~/.config/environment.d/
cat >~/.config/environment.d/QT.conf <<EOF
QT_QPA_PLATFORM="xcb;wayland"
QT_QPA_PLATFORMTHEME=qt5ct
# QT_WAYLAND_DECORATION=whitesur-gtk
EOF

(log out and back in for changes to take effect)

1 Like

Thank you for your helpful guidance. Due to potential version issues, the icon may not function properly.Additionally, using this configuration will prevent Crystal-Dock from displaying. No problem; if the theme is difficult to customize, just leave it as-is.

 sudo apt install qt5ct qt6ct adwaita-qt adwaita-qt6 kvantum
Error: Unable to locate package kvantum

ENV: Ubuntu budgie 26.04 wayland(labwc)
first:
sudo apt install qt5ct qt6ct adwaita-qt adwaita-qt6
second:

~/.profile:

export QT_QPA_PLATFORM=“xcb;wayland”
export QT_QPA_PLATFORMTHEME=qt5ct
export QT_WAYLAND_DECORATION=MacTahoe-gtk

1 Like
sudo apt install qt5-style-kvantum qt6-style-kvantum

~/.profile

export QT_STYLE_OVERRIDE=kvantum

/usr/share/applications$ cat onlyoffice-desktopeditors.desktop
Modify as follows:

Exec=/usr/bin/onlyoffice-desktopeditors --new:word -platform xcb %f

theme:

Thank you very much for your assistance. On Ubuntu Budgie 26.04 with Wayland (LabWC), the Apple icon does not display properly, and neither the File Manager nor the Terminal are visible. Given that changing the theme on Ubuntu 26.04 is quite troublesome, I’ll just leave it at that to avoid wasting time.

1 Like
ubuntu@master:\~$ cat \~/.config/environment.d/QT.conf
QT_QPA_PLATFORM=“xcb;wayland”
QT_QPA_PLATFORMTHEME=qt5ct
QT_WAYLAND_DECORATION=MacTahoe-gtk

Thank you very much for your assistance. On Ubuntu Budgie 26.04 with Wayland (LabWC), the Apple icon does not display properly, and neither the File Manager nor the Terminal are visible. Given that changing the theme on Ubuntu 26.04 is quite troublesome, I’ll just leave it at that to avoid wasting time.

1 Like

The proper way of checking is

systemctl --user show-environment | grep QT

@tianyazi, please put all log and other console/terminal output in pre-formatted code blocks (open a new line and click the </> icon in the editor first, then paste into the new element), ideally wrapped in a “Hide Details” element, if it’s more than just a few lines. See items 4 and 5 in the Posting Guide. Also, please use proper quoting; your last posts are pretty messy and it’s hard to tell which is (supposed to be) quoted text and which is your own.

Optional helper script

If you are so inclined, I took it upon myself to provide a little helper script for that. :sweat_droplets:


If I’m not mistaken, such changes shouldn’t be necessary, when the $QT_* environment variables are set in the proper context, i.e. not like this:

~/.profile is only sourced when Bash, or any other compatible shell, is the the login shell, like it is when pressing CtrlAltF3 and logging in there, for instance. As far as I’m aware, there are no provisions to read such shell-specific files when logging in via a graphical display manager; the “login shell” in that case is gnome-shell or gnome-session.
If you (think you) have those set, check this:

systemctl --user show-environment

See the environment.d manual page for more details.

1 Like

The GTK theme only affects GTK apps. Qt, Electron, JetBrains, and many Snap apps draw their own title bars, so they won’t automatically show macOS-style traffic light buttons. Unfortunately, there’s no universal Ubuntu setting to enforce this across all applications.

2 Likes

ubuntu budgie 26.04 wayland(labwc),The primary goal is to ensure that Budgie’s built-in file manager and terminal adopt a Mac-style interface; features not easily implemented with (Qt/Electron/JetBrains) can be omitted.

ubuntu@master:~$ systemctl --user show-environment
HOME=/home/ubuntu
LANG=zh_CN.UTF-8
LOGNAME=ubuntu
PATH=/usr/local/pgsql/18/bin:/usr/local/node-v24.16.0-linux-x64/bin:/usr/local/pgsql/18/bin:/usr/local/node-v24.>
SHELL=/bin/bash
USER=ubuntu
XDG_RUNTIME_DIR=/run/user/1000
GTK_MODULES=gail:atk-bridge
QT_ACCESSIBILITY=1
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
SDL_IM_MODULE=fcitx
GLFW_IM_MODULE=fcitx
XDG_DATA_DIRS=/usr/share/budgie-desktop:/usr/local/share:/usr/share:/var/lib/snapd/desktop
BUDGIE_SESSION_VERSION=10.10.2
CLION_VM_OPTIONS=/opt/jetbrains/license/ja-netfilter/vmoptions/clion.vmoptions
CLUTTER_BACKEND=gdk
DATAGRIP_VM_OPTIONS=/opt/jetbrains/license/ja-netfilter/vmoptions/datagrip.vmoptions
DATASPELL_VM_OPTIONS=/opt/jetbrains/license/ja-netfilter/vmoptions/dataspell.vmoptions
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
DEBUGINFOD_URLS=$'https://debuginfod.ubuntu.com '
DESKTOP_SESSION=budgie-desktop
DEVECOSTUDIO_VM_OPTIONS=/opt/jetbrains/license/ja-netfilter/vmoptions/devecostudio.vmoptions
DISPLAY=:1
GATEWAY_VM_OPTIONS=/opt/jetbrains/license/ja-netfilter/vmoptions/gateway.vmoptions
GDK_BACKEND=wayland,x11
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
GOLAND_VM_OPTIONS=/opt/jetbrains/license/ja-netfilter/vmoptions/goland.vmoptions
GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1
IDEA_VM_OPTIONS=/opt/jetbrains/license/ja-netfilter/vmoptions/idea.vmoptions
IM_CONFIG_ENTRY=profile
JETBRAINSCLIENT_VM_OPTIONS=/opt/jetbrains/license/ja-netfilter/vmoptions/jetbrainsclient.vmoptions
JETBRAINS_CLIENT_VM_OPTIONS=/opt/jetbrains/license/ja-netfilter/vmoptions/jetbrains_client.vmoptions
LABWC_PID=1025061
LABWC_VER=0.9.3
LANGUAGE=en_US:en
LC_ADDRESS=C.UTF-8
LC_IDENTIFICATION=C.UTF-8
LC_MEASUREMENT=C.UTF-8
LC_MONETARY=C.UTF-8
LC_NAME=C.UTF-8
LC_NUMERIC=C.UTF-8
LC_PAPER=C.UTF-8
LC_TELEPHONE=C.UTF-8
LC_TIME=C.UTF-8
LD_LIBRARY_PATH=/usr/local/pgsql/18/lib:/usr/local/pgsql/18/lib:
MOZ_ENABLE_WAYLAND=1
PAPERSIZE=a4
PGDATA=/opt/db/postgresql-18/data/
PGHOME=/usr/local/pgsql/18
PHPSTORM_VM_OPTIONS=/opt/jetbrains/license/ja-netfilter/vmoptions/phpstorm.vmoptions
PWD=/home/ubuntu
PYCHARM_VM_OPTIONS=/opt/jetbrains/license/ja-netfilter/vmoptions/pycharm.vmoptions
QT_QPA_PLATFORM=wayland
QT_QPA_PLATFORMTHEME=gtk3
QT_STYLE_OVERRIDE=kvantum
RIDER_VM_OPTIONS=/opt/jetbrains/license/ja-netfilter/vmoptions/rider.vmoptions
RUBYMINE_VM_OPTIONS=/opt/jetbrains/license/ja-netfilter/vmoptions/rubymine.vmoptions
SDL_VIDEODRIVER=wayland
SESSION_MANAGER=local/master:@/tmp/.ICE-unix/1025290,unix/master:/tmp/.ICE-unix/1025290
SHLVL=0
SSH_AUTH_SOCK=/run/user/1000/gcr/ssh
STUDIO_VM_OPTIONS=/opt/jetbrains/license/ja-netfilter/vmoptions/studio.vmoptions
WAYLAND_DISPLAY=wayland-0
WEBIDE_VM_OPTIONS=/opt/jetbrains/license/ja-netfilter/vmoptions/webide.vmoptions
WEBSTORM_VM_OPTIONS=/opt/jetbrains/license/ja-netfilter/vmoptions/webstorm.vmoptions
XCURSOR_SIZE=32
XCURSOR_THEME=Bibata-Modern-Amber
XDG_CONFIG_DIRS=/etc/xdg
XDG_CURRENT_DESKTOP=Budgie
XDG_MENU_PREFIX=gnome-
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
XDG_SESSION_CLASS=user
XDG_SESSION_DESKTOP=Budgie
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session11
XDG_SESSION_TYPE=wayland
XKB_DEFAULT_LAYOUT=us,cn
XKB_DEFAULT_OPTIONS=grp:alt_shift_toggle,terminate:ctrl_alt_bksp
_=/usr/bin/budgie-session
_JAVA_AWT_WM_NONREPARENTING=1
ubuntu@master:~$ 

1 Like

@tianyazi
Did you remove (or disable) the MacTahoe-gtk-theme and try the folders containing the Traffic Light Window buttons in post no.3?

1 Like

It’s likely that Ubuntu Budgie 26.04 uses LabWC instead of GNOME, which is probably why folder management doesn’t work in the Mac style.

I performed the operation, but it didn’t work.

1 Like

Your second screenshot shows that you still have the MacTahoe theme installed?

I just installed xfce4-terminal
The traffic light window buttons are fine for xfce4-terminal when used in Gnome 50 as long as the special folders are installed in .config

1 Like

yes, I use MacTahoe-gtk, os: ubuntu budgie 26.04 (wayland+ labwc)

1 Like

I’ve just installed Ubuntu Budgie 26.04 to test the Special Window Button gtk-3.0 and gtk-4.0 folders.
As you have discovered, not all the applications display the Traffic Light Buttons in Budgie.

I have noticed that each theme in usr/share/themes contain a labwc folder.
Does the Mac-Tahoe-gtk theme contain alabwc folder?

Gnome, generally more inflexible, seems to be happy with adjusting gtk-3.0 and gtk-4.0 in user/.config.

I’ve grep’d this from your systemd user envrionment:

QT_ACCESSIBILITY=1
QT_IM_MODULE=fcitx
QT_QPA_PLATFORM=wayland
QT_QPA_PLATFORMTHEME=gtk3
QT_STYLE_OVERRIDE=kvantum

If you had set up the environment.d drop-ins correctly, it should look like this:

QT_ACCESSIBILITY=1
QT_IM_MODULE=fcitx
QT_QPA_PLATFORM="xcb;wayland"
QT_QPA_PLATFORMTHEME=qt5ct
QT_WAYLAND_DECORATION=MacTahoe-gtk
QT_STYLE_OVERRIDE=kvantum

You do need to log out and back in again after configuring those, and they must have the .conf suffix.

Um, why is the ~ escaped? That might explain those environment variables not showing up as configured, because, as far as systemd-environment-d-generator can know, they don’t exist.

The point of ~ is its special meaning, so it should not be escaped, when it’s supposed to expand to $HOME, e.g. /home/tianyazi.

You most probably now have an actual directory named ~ in your home directory and you should be very careful with that, because it can lead to all kinds of confusion.

Does the Mac-Tahoe-gtk theme contain alabwc folder? —> Not contain alabwc folder.

ubuntu@master:/usr/share/themes/Default$ find ./ -name labwc
ubuntu@master:/usr/share/themes/Default$
ubuntu@master:/usr/share/themes/Default$ find ~ -name labwc
/home/ubuntu/.config/budgie-desktop/labwc

You have installed Budgie 26.04. See how to modify this theme to accommodate the window styles of various software applications on Mac.

Thank you for your response, but Ubuntu Budgie 26.04 is incompatible with this Qt theme; even the Budgie file manager does not support it.