Qtile Configuration

Table of Contents

Qtile

config.py

imports

1: import os
2: from collections.abc import Callable
3: import shutil
4: 
5: import libqtile.resources
6: from libqtile import bar, layout, qtile, widget, hook
7: from libqtile.config import Click, Drag, Group, Key, Match, Output, Screen
8: from libqtile.lazy import lazy
9: from libqtile.utils import guess_terminal

Set the mod variable

10: mod = "mod4"

Set the terminal variable

11: terminal = guess_terminal()

guessbrowser() function

12: 
13: def guess_browser():
14:     """"Get currently available browser."""
15:     for b in ["firefox", "brave-browser", "google-chrome-stable"]:
16:         if shutil.which(b):
17:             return b
18: 
19: 
20: browser = guess_browser()

mail variable

21: mail = "thunderbird"

filemanager variable

22: filemanager = "thunar"

Keys

 23: keys = [
 24:     # A list of available commands that can be bound to keys can be found
 25:     # at https://docs.qtile.org/en/latest/manual/config/lazy.html
 26:     # Switch between windows
 27:     Key([mod], "h", lazy.layout.left(), desc="Move focus to left"),
 28:     Key([mod], "l", lazy.layout.right(), desc="Move focus to right"),
 29:     Key([mod], "j", lazy.layout.down(), desc="Move focus down"),
 30:     Key([mod], "k", lazy.layout.up(), desc="Move focus up"),
 31:     Key([mod], "space", lazy.layout.next(), desc="Move window focus to other window"),
 32:     Key(["mod1"], "Tab", lazy.layout.next(), desc="Move window focus to other window"),
 33:     # Move windows between left/right columns or move up/down in current stack.
 34:     # Moving out of range in Columns layout will create new column.
 35:     Key([mod, "shift"], "h", lazy.layout.shuffle_left(), desc="Move window to the left"),
 36:     Key([mod, "shift"], "l", lazy.layout.shuffle_right(), desc="Move window to the right"),
 37:     Key([mod, "shift"], "j", lazy.layout.shuffle_down(), desc="Move window down"),
 38:     Key([mod, "shift"], "k", lazy.layout.shuffle_up(), desc="Move window up"),
 39:     # Grow windows. If current window is on the edge of screen and direction
 40:     # will be to screen edge - window would shrink.
 41:     Key([mod, "control"], "h", lazy.layout.grow_left(), desc="Grow window to the left"),
 42:     Key([mod, "control"], "l", lazy.layout.grow_right(), desc="Grow window to the right"),
 43:     Key([mod, "control"], "j", lazy.layout.grow_down(), desc="Grow window down"),
 44:     Key([mod, "control"], "k", lazy.layout.grow_up(), desc="Grow window up"),
 45:     Key([mod], "n", lazy.layout.normalize(), desc="Reset all window sizes"),
 46:     # Toggle between split and unsplit sides of stack.
 47:     # Split = all windows displayed
 48:     # Unsplit = 1 window displayed, like Max layout, but still with
 49:     # multiple stack panes
 50:     Key(
 51:         [mod, "shift"],
 52:         "Return",
 53:         lazy.layout.toggle_split(),
 54:         desc="Toggle between split and unsplit sides of stack",
 55:     ),
 56:     # Toggle between different layouts as defined below
 57:     Key([mod], "Tab", lazy.screen.toggle_group(), desc="Toggle between groups"),
 58:     Key([mod, "mod1"], "Tab", lazy.next_layout(), desc="Toggle between layouts"),
 59:     # Key([mod], "w", lazy.window.kill(), desc="Kill focused window"),
 60:     Key(
 61:         [mod],
 62:         "f",
 63:         lazy.window.toggle_fullscreen(),
 64:         desc="Toggle fullscreen on the focused window",
 65:     ),
 66:     Key([mod], "t", lazy.window.toggle_floating(), desc="Toggle floating on the focused window"),
 67:     Key([mod, "control"], "r", lazy.reload_config(), desc="Reload the config"),
 68:     Key([mod, "control"], "q", lazy.shutdown(), desc="Shutdown Qtile"),
 69:     Key([mod], "r", lazy.spawncmd(), desc="Spawn a command using a prompt widget"),
 70:     Key([mod], "bracketleft", lazy.to_screen(0)),
 71:     Key([mod], "bracketright", lazy.to_screen(1)),
 72: 
 73:     Key([], "XF86AudioRaiseVolume",
 74:         lazy.spawn("pactl set-sink-volume @DEFAULT_SINK@ +10%"), desc="Raise Volume Up"),
 75:     Key([], "XF86AudioLowerVolume",
 76:         lazy.spawn("pactl set-sink-volume @DEFAULT_SINK@ -10%"), desc="Raise Volume Down"),
 77:     Key([], "XF86AudioMute",
 78:         lazy.spawn("pactl set-sink-mute @DEFAULT_SINK@ toggle"), desc="Toggle Audio Mute"),
 79:     Key([], "XF86AudioMicMute",
 80:         lazy.spawn("pactl set-source-mute @DEFAULT_SOURCE@ toggle"), desc="Toggle Audio Mic Mute"),
 81: 
 82:     Key([], "XF86AudioPlay",
 83:         lazy.spawn("playerctl play-pause"), desc="Toggle play/pause"),
 84:     Key([], "XF86AudioPrev",
 85:         lazy.spawn("playerctl previous"), desc="Previous"),
 86:     Key([], "XF86AudioNext",
 87:         lazy.spawn("playerctl next"), desc="Next"),
 88:     # TODO: XF86Tools for Audio
 89:     Key([], "XF86Calculator",
 90:         lazy.spawn("rofi -show calc -modi calc -no-show-match -no-sort"), desc="Calculator"),
 91: 
 92:     Key([], "XF86HomePage",
 93:         lazy.spawn(browser), desc="Browser"),
 94:     Key([mod, "mod1"], "b",
 95:         lazy.spawn(browser), desc="Browser"),
 96:     Key([], "XF86Mail",
 97:         lazy.spawn(mail), desc="Mail Client"),
 98:     Key([], "XF86Search",
 99:         lazy.spawn("rofi-search"), desc="Search"),
100: 
101:     Key([], "Print",
102:         lazy.spawn("flameshot gui"), desc="flameshot"),
103: 
104:     Key([mod, "mod1"], "v", lazy.spawn("neovide"), desc="neovide"),
105:     Key([mod, "mod1"], "p", lazy.spawn("rofi-pass"), desc="rofi pass"),
106:     Key([mod, "mod1"], "n", lazy.spawn("emacsclient -c -a emacs"), desc="emacs"),
107:     Key([mod, "mod1"], "s", lazy.spawn("screenkey"), desc="screenkey"),
108: 
109:     Key([mod], "e", lazy.spawn(filemanager), desc="file-manager"),
110:     Key([mod], "Return", lazy.spawn(terminal), desc="Launch terminal"),
111:     Key([mod, "shift"], "Return", lazy.spawn(f"{terminal} -e tmux new -A -s main"), desc="Tmux"),
112:     Key(["mod1"], "F4", lazy.window.kill(), desc="kill focused window"),
113:     Key([mod], "F4", lazy.window.kill(), desc="kill focused window"),
114:     Key([mod], "d", lazy.spawn("rofi -show drun"), desc="rofi menu"),
115:     Key([mod], "c",
116:         lazy.spawn("rofi -modi 'clipboard:greenclip print' -show clipboard"),
117:         desc="rofi greenclip"),
118:     Key([mod, "shift"], "w",
119:         lazy.spawn("rofi -show windowcd"), desc="rofi windowcd"),
120:     Key([mod], "w",
121:         lazy.spawn("rofi -show window"), desc="rofi window"),
122:     Key([mod], "q",
123:         lazy.spawn("rofi -show p -modi p:'rofi-power-menu --symbols-font \"Symbols Nerd Font Mono\"' -font 'OverpassM Nerd Font Mono' -theme catppuccin-default -theme-str 'window {width: 8em;} listview {lines: 6;}'"), desc="rofi-power-menu"),
124:     Key([mod], "period", lazy.spawn("rofimoji"), desc="rofimoji"),
125:     # Key([mod, "shift"], "t", lazy.spawn(ocr()), desc="ocr"),
126: ]

Switch VTs in wayland

127: for vt in range(1, 8):
128:     keys.append(
129:         Key(
130:             ["control", "mod1"],
131:             f"f{vt}",
132:             lazy.core.change_vt(vt).when(func=lambda: qtile.core.name == "wayland"),
133:             desc=f"Switch to VT{vt}",
134:         )
135:     )

groups

136: groups = [Group(i) for i in "123456789"]
137: 
138: for i in groups:
139:     keys.extend(
140:         [
141:             # mod + group number = switch to group
142:             Key(
143:                 [mod],
144:                 i.name,
145:                 lazy.group[i.name].toscreen(),
146:                 desc=f"Switch to group {i.name}",
147:             ),
148:             # mod + shift + group number = switch to & move focused window to group
149:             Key(
150:                 [mod, "shift"],
151:                 i.name,
152:                 lazy.window.togroup(i.name, switch_group=True),
153:                 desc=f"Switch to & move focused window to group {i.name}",
154:             ),
155:             # Or, use below if you prefer not to switch to that group.
156:             # # mod + shift + group number = move focused window to group
157:             # Key([mod, "shift"], i.name, lazy.window.togroup(i.name),
158:             #     desc="move focused window to group {}".format(i.name)),
159:         ]
160:     )

layouts

161: layouts = [
162:     layout.Columns(border_focus_stack=["#d75f5f", "#8f3d3d"], border_width=4),
163:     layout.Max(),
164:     # Try more layouts by unleashing below layouts.
165:     # layout.Stack(num_stacks=2),
166:     # layout.Bsp(),
167:     # layout.Matrix(),
168:     # layout.MonadTall(),
169:     # layout.MonadWide(),
170:     # layout.RatioTile(),
171:     # layout.Tile(),
172:     # layout.TreeTab(),
173:     # layout.VerticalTile(),
174:     # layout.Zoomy(),
175: ]

widget and extension defaults

176: widget_defaults = dict(
177:     font="OverpassM Nerd Font Mono",
178:     fontsize=12,
179:     padding=3,
180: )
181: extension_defaults = widget_defaults.copy()

screens

182: logo = os.path.join(os.path.dirname(libqtile.resources.__file__), "logo.png")
183: screens = [
184:     Screen(
185:         bottom=bar.Bar(
186:             [
187:                 widget.CurrentLayout(),
188:                 widget.GroupBox(),
189:                 widget.Prompt(),
190:                 widget.WindowName(),
191:                 widget.CurrentScreen(),
192:                 widget.Chord(
193:                     chords_colors={
194:                         "launch": ("#ff0000", "#ffffff"),
195:                     },
196:                     name_transform=lambda name: name.upper(),
197:                 ),
198:                 # widget.TextBox("default config", name="default"),
199:                 # widget.TextBox("Press <M-r> to spawn", foreground="#d75f5f"),
200:                 # NB Systray is incompatible with Wayland, consider using StatusNotifier instead
201:                 # widget.StatusNotifier(),
202:                 # widget.TunedManager(),
203:                 widget.CapsNumLockIndicator(),
204:                 widget.ThermalZone(),
205:                 widget.PulseVolume(),
206:                 # widget.Volume(
207:                 #     volume_down_command="pactl set-sink-volume @DEFAULT_SINK@ -10%",
208:                 #     volume_up_command="pactl set-sink-volume @DEFAULT_SINK@ +10%",
209:                 #     volume_app="pavucontrol",
210:                 # ),
211:                 widget.Clock(format="%Y-%m-%d %a %I:%M %p"),
212:                 widget.QuickExit(),
213:                 widget.Systray(),
214:             ],
215:             24,
216:             # border_width=[2, 0, 2, 0],  # Draw top and bottom borders
217:             # border_color=["ff00ff", "000000", "ff00ff", "000000"]  # Borders are magenta
218:         ),
219:         #background="#000000",
220:         wallpaper="assets/img/arch-black-4k.png",
221:         #wallpaper_mode="fill",
222:         # You can uncomment this variable if you see that on X11 floating resize/moving is laggy
223:         # By default we handle these events delayed to already improve performance, however your system might still be struggling
224:         # This variable is set to None (no cap) by default, but you can set it to 60 to indicate that you limit it to 60 events per second
225:         # x11_drag_polling_rate = 60,
226:     ),
227:     Screen(
228:         bottom=bar.Bar(
229:             [
230:                 widget.WindowName(),
231:                 widget.CurrentScreen(),
232:                 # widget.Canto(),
233:             ],
234:             24,
235:         ),
236:         wallpaper="assets/img/various-arch-1-4k.png",
237:         #wallpaper_mode="center",
238:     ),
239: ]
240: 
241: # Instead of screens, you can define a function here to specify which Screen
242: # should correspond to which Output.
243: fake_screens: list[Screen] | None = None
244: 
245: # Instead of screens or fake screens, you can define a function here that
246: # returns a list of Screen objects based on the list of Outputs; that way you
247: # can decide based on e.g. the number of screens, or which ports are plugged
248: # in exactly what do render in each bar for each screen.
249: generate_screens: Callable[[list[Output]], list[Screen]] | None = None

mouse - drag floating layouts

250: mouse = [
251:     Drag([mod], "Button1", lazy.window.set_position_floating(), start=lazy.window.get_position()),
252:     Drag([mod], "Button3", lazy.window.set_size_floating(), start=lazy.window.get_size()),
253:     Click([mod], "Button2", lazy.window.bring_to_front()),
254: ]

misc

255: dgroups_key_binder = None
256: dgroups_app_rules = []  # type: list
257: follow_mouse_focus = True
258: bring_front_click = False
259: floats_kept_above = True
260: cursor_warp = False
261: auto_fullscreen = True
262: focus_on_window_activation = "smart"
263: focus_previous_on_window_remove = False
264: reconfigure_screens = True
265: 
266: # If things like steam games want to auto-minimize themselves when losing
267: # focus, should we respect this or not?
268: auto_minimize = True
269: 
270: # When using the Wayland backend, this can be used to configure input devices.
271: wl_input_rules = None
272: 
273: # xcursor theme (string or None) and size (integer) for Wayland backend
274: wl_xcursor_theme = None
275: wl_xcursor_size = 24
276: 
277: idle_timers = []  # type: list
278: idle_inhibitors = []  # type: list
279: 
280: # XXX: Gasp! We're lying here. In fact, nobody really uses or cares about this
281: # string besides java UI toolkits; you can see several discussions on the
282: # mailing lists, GitHub issues, and other WM documentation that suggest setting
283: # this string if your java app doesn't work correctly. We may as well just lie
284: # and say that we're a working one by default.
285: #
286: # We choose LG3D to maximize irony: it is a 3D non-reparenting WM written in
287: # java that happens to be on java's whitelist.
288: wmname = "LG3D"

float rules

289: floating_layout = layout.Floating(
290:     float_rules=[
291:         # Run the utility of `xprop` to see the wm class and name of an X client.
292:         *layout.Floating.default_float_rules,
293:         Match(wm_class="confirmreset"),  # gitk
294:         Match(wm_class="makebranch"),  # gitk
295:         Match(wm_class="maketag"),  # gitk
296:         Match(wm_class="ssh-askpass"),  # ssh-askpass
297:         Match(title="branchdialog"),  # gitk
298:         Match(title="pinentry"),  # GPG key password entry
299:     ]
300: )

startups

301: STARTUP_COMMANDS = [
302:     "dbus-update-activation-environment --all"
303:     "xsetroot -cursor_name left_ptr",
304:     "xset r rate 500 25",
305:     "/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 &",
306:     "picom -b &",
307:     "greenclip daemon>/dev/null &",
308:     "thunar --daemon &",
309:     "unclutter &",
310:     "nm-applet & ",
311:     "~/.fehbg &",
312:     "emacs --daemon &",
313:     "xsettingsd &"
314: ]
315: 
316: 
317: @hook.subscribe.startup_once
318: def autostart():
319:     """Stuffs to autostart."""
320:     for cmd in STARTUP_COMMANDS:
321:         os.system(cmd)

Picom

picom.conf

shadows

 1: # Enabled client-side shadows on windows. Note desktop windows
 2: # (windows with '_NET_WM_WINDOW_TYPE_DESKTOP') never get shadow,
 3: # unless explicitly requested using the wintypes option.
 4: #
 5: # Can be set per-window using rules.
 6: #
 7: # Default: false
 8: shadow = true;
 9: 
10: # The blur radius for shadows, in pixels.
11: #
12: # Default: 12
13: shadow-radius = 7;
14: 
15: # The opacity of shadows.
16: #
17: # Range: 0.0 - 1.0
18: # Default: 0.75
19: # shadow-opacity = .75
20: 
21: # The left offset for shadows, in pixels.
22: #
23: # Default: -15
24: shadow-offset-x = -7;
25: 
26: # The top offset for shadows, in pixels.
27: #
28: # Default: -15
29: shadow-offset-y = -7;
30: 
31: # Hex string color value of shadow. Formatted like "#RRGGBB", e.g. "#C0FFEE".
32: #
33: # Default: #000000
34: # shadow-color = "#000000"
35: 
36: # Crop shadow of a window fully on a particular monitor to that monitor. This is
37: # currently implemented using the X RandR extension.
38: #
39: # Default: false
40: # crop-shadow-to-monitor = false

fading

41: # Fade windows in/out when opening/closing and when opacity changes,
42: # unless no-fading-openclose is used. Can be set per-window using rules.
43: #
44: # Default: false
45: fading = true;
46: 
47: # Opacity change between steps while fading in. (0.01 - 1.0, defaults to 0.028)
48: fade-in-step = 0.03;
49: 
50: # Opacity change between steps while fading out. (0.01 - 1.0, defaults to 0.03)
51: fade-out-step = 0.03;
52: 
53: # The time between steps in fade step, in milliseconds. (> 0, defaults to 10)
54: # fade-delta = 10
55: 
56: # Do not fade on window open/close.
57: # no-fading-openclose = false
58: 
59: # Do not fade destroyed ARGB windows with WM frame. Workaround of bugs in Openbox, Fluxbox, etc.
60: # no-fading-destroyed-argb = false

transparency / opacity

61: # Opacity of window titlebars and borders.
62: #
63: # Range: 0.1 - 1.0
64: # Default: 1.0 (disabled)
65: frame-opacity = 0.9;
66: 
67: # Use fixed inactive dim value, instead of adjusting according to window opacity.
68: #
69: # Default: false
70: # inactive-dim-fixed = true

corners

71: # Sets the radius of rounded window corners. When > 0, the compositor will
72: # round the corners of windows. Does not interact well with
73: # `transparent-clipping`.
74: #
75: # Default: 0 (disabled)
76: corner-radius = 0

blur

 77: # Parameters for background blurring, see BLUR section in the man page for more information.
 78: # blur-method =
 79: # blur-size = 12
 80: #
 81: # blur-deviation = false
 82: #
 83: # blur-strength = 5
 84: 
 85: # Blur background of semi-transparent / ARGB windows.
 86: # Can be set per-window using rules.
 87: #
 88: # Default: false
 89: # blur-background = false
 90: 
 91: # Blur background of windows when the window frame is not opaque.
 92: # Implies:
 93: #    blur-background
 94: #
 95: # Default: false
 96: # blur-background-frame = false
 97: 
 98: # Use fixed blur strength rather than adjusting according to window opacity.
 99: #
100: # Default: false
101: # blur-background-fixed = false
102: 
103: 
104: # Specify the blur convolution kernel, with the following format:
105: # example:
106: #   blur-kern = "5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1";
107: # Can also be a pre-defined kernel, see the man page.
108: #
109: # Default: ""
110: blur-kern = "3x3box";

general settings

111: # Enable remote control via D-Bus. See the man page for more details.
112: #
113: # Default: false
114: # dbus = true
115: 
116: # Daemonize process. Fork to background after initialization. Causes issues with certain (badly-written) drivers.
117: # daemon = false
118: 
119: # Specify the backend to use: `xrender`, `glx`, or `egl`.
120: #
121: # Default: "xrender"
122: backend = "xrender"
123: 
124: # Use higher precision during rendering, and apply dither when presenting the
125: # rendered screen. Reduces banding artifacts, but may cause performance
126: # degradation. Only works with OpenGL.
127: dithered-present = false;
128: 
129: # Enable/disable VSync.
130: #
131: # Default: false
132: vsync = true;
133: 
134: # Try to detect windows with rounded corners and don't consider them
135: # shaped windows. The accuracy is not very high, unfortunately.
136: #
137: # Has nothing to do with `corner-radius`.
138: #
139: # Default: false
140: detect-rounded-corners = true;
141: 
142: # Detect '_NET_WM_WINDOW_OPACITY' on client windows, useful for window managers
143: # not passing '_NET_WM_WINDOW_OPACITY' of client windows to frame windows.
144: #
145: # Default: false
146: detect-client-opacity = true;
147: 
148: # Use EWMH '_NET_ACTIVE_WINDOW' to determine currently focused window,
149: # rather than listening to 'FocusIn'/'FocusOut' event. May be more accurate,
150: # provided that the WM supports it.
151: #
152: # Default: false
153: # use-ewmh-active-win = false
154: 
155: # Unredirect all windows if a full-screen opaque window is detected,
156: # to maximize performance for full-screen windows. Known to cause flickering
157: # when redirecting/unredirecting windows.
158: #
159: # Default: false
160: # unredir-if-possible = false
161: 
162: # Delay before unredirecting the window, in milliseconds.
163: #
164: # Default: 0.
165: # unredir-if-possible-delay = 0
166: 
167: # Use 'WM_TRANSIENT_FOR' to group windows, and consider windows
168: # in the same group focused at the same time.
169: #
170: # Default: false
171: detect-transient = true;
172: 
173: # Use 'WM_CLIENT_LEADER' to group windows, and consider windows in the same
174: # group focused at the same time. This usually means windows from the same application
175: # will be considered focused or unfocused at the same time.
176: # 'WM_TRANSIENT_FOR' has higher priority if detect-transient is enabled, too.
177: #
178: # Default: false
179: # detect-client-leader = false
180: 
181: # Use of damage information for rendering. This cause the only the part of the
182: # screen that has actually changed to be redrawn, instead of the whole screen
183: # every time. Should improve performance.
184: #
185: # Default: false
186: use-damage = true;
187: 
188: # Use X Sync fence to wait for the completion of rendering of other windows,
189: # before using their content to render the current screen.
190: #
191: # Required for explicit sync drivers, such as nvidia.
192: #
193: # Default: false
194: # xrender-sync-fence = false
195: 
196: # GLX backend: Use specified GLSL fragment shader for rendering window
197: # contents. Read the man page for a detailed explanation of the interface.
198: #
199: # Can be set per-window using rules.
200: #
201: # window-shader-fg = "default"
202: 
203: # Force all windows to be painted with blending. Useful if you
204: # have a `window-shader-fg` that could turn opaque pixels transparent.
205: #
206: # Default: false
207: # force-win-blend = false
208: 
209: # Do not use EWMH to detect fullscreen windows.
210: # Reverts to checking if a window is fullscreen based only on its size and coordinates.
211: #
212: # Default: false
213: # no-ewmh-fullscreen = false
214: 
215: # Dimming bright windows so their brightness doesn't exceed this set value.
216: # Brightness of a window is estimated by averaging all pixels in the window,
217: # so this could comes with a performance hit.
218: # Setting this to 1.0 disables this behaviour. Requires --use-damage to be disabled.
219: #
220: # Default: 1.0 (disabled)
221: # max-brightness = 1.0
222: 
223: # Make transparent windows clip other windows like non-transparent windows do,
224: # instead of blending on top of them. e.g. placing a transparent window on top
225: # of another window will cut a "hole" in that window, and show the desktop background
226: # underneath.
227: #
228: # Default: false
229: # transparent-clipping = false
230: 
231: # Set the log level. Possible values are:
232: #  "trace", "debug", "info", "warn", "error"
233: # in increasing level of importance. Case insensitive.
234: # If using the "TRACE" log level, it's better to log into a file
235: # using *--log-file*, since it can generate a huge stream of logs.
236: #
237: # Default: "warn"
238: # log-level = "warn";
239: 
240: # Set the log file.
241: # If *--log-file* is never specified, logs will be written to stderr.
242: # Otherwise, logs will to written to the given file, though some of the early
243: # logs might still be written to the stderr.
244: # When setting this option from the config file, it is recommended to use an absolute path.
245: #
246: # log-file = "/path/to/your/log/file"
247: 
248: # Write process ID to a file.
249: # write-pid-path = "/path/to/your/log/file"

rules

250: rules: ({
251:   match = "window_type = 'tooltip'";
252:   fade = false;
253:   shadow = true;
254:   opacity = 0.75;
255:   full-shadow = false;
256: }, {
257:   match = "window_type = 'dock'    || "
258:           "window_type = 'desktop' || "
259:           "_GTK_FRAME_EXTENTS@";
260:   blur-background = false;
261: }, {
262:   match = "window_type != 'dock'";
263:   # shader = "my_shader.frag";
264: }, {
265:   match = "window_type = 'dock' || "
266:           "window_type = 'desktop'";
267:   corner-radius = 0;
268: }, {
269:   match = "name = 'Notification'   || "
270:           "class_g = 'Conky'       || "
271:           "class_g ?= 'Notify-osd' || "
272:           "class_g = 'Cairo-clock' || "
273:           "_GTK_FRAME_EXTENTS@";
274:   shadow = false;
275: })

imports

276: # `@include` directive can be used to include additional configuration files.
277: # Relative paths are search either in the parent of this configuration file
278: # (when the configuration is loaded through a symlink, the symlink will be
279: # resolved first). Or in `$XDG_CONFIG_HOME/picom/include`.
280: #
281: # @include "extra.conf"

xdg-desktop-portal

qtile-portal.conf

[preferred]
default=gtk

Rofi

config.rasi

/* -*- mode: css; eval: (rainbow-mode +1) -*- */
@theme "catppuccin-default"

catppuccin-default.rasi

/* -*- mode: css; eval: (rainbow-mode +1) -*- */
@import "catppuccin-mocha"

* {
  selected-active-foreground:  @background;
  lightfg:                     @text;
  separatorcolor:              @foreground;
  urgent-foreground:           @red;
  alternate-urgent-background: @lightbg;
  lightbg:                     @mantle;
  background-color:            transparent;
  border-color:                @foreground;
  normal-background:           @background;
  selected-urgent-background:  @red;
  alternate-active-background: @lightbg;
  spacing:                     2;
  alternate-normal-foreground: @foreground;
  urgent-background:           @background;
  selected-normal-foreground:  @lightbg;
  active-foreground:           @blue;
  background:                  @base;
  selected-active-background:  @blue;
  active-background:           @background;
  selected-normal-background:  @lightfg;
  alternate-normal-background: @lightbg;
  foreground:                  @text;
  selected-urgent-foreground:  @background;
  normal-foreground:           @foreground;
  alternate-urgent-foreground: @red;
  alternate-active-foreground: @blue;

}
element {
    padding: 1px ;
    cursor:  pointer;
    spacing: 5px ;
    border:  0;
}
element normal.normal {
    background-color: @normal-background;
    text-color:       @normal-foreground;
}
element normal.urgent {
    background-color: @urgent-background;
    text-color:       @urgent-foreground;
}
element normal.active {
    background-color: @active-background;
    text-color:       @active-foreground;
}
element selected.normal {
    background-color: @selected-normal-background;
    text-color:       @selected-normal-foreground;
}
element selected.urgent {
    background-color: @selected-urgent-background;
    text-color:       @selected-urgent-foreground;
}
element selected.active {
    background-color: @selected-active-background;
    text-color:       @selected-active-foreground;
}
element alternate.normal {
    background-color: @alternate-normal-background;
    text-color:       @alternate-normal-foreground;
}
element alternate.urgent {
    background-color: @alternate-urgent-background;
    text-color:       @alternate-urgent-foreground;
}
element alternate.active {
    background-color: @alternate-active-background;
    text-color:       @alternate-active-foreground;
}
element-text {
    background-color: transparent;
    cursor:           inherit;
    highlight:        inherit;
    text-color:       inherit;
}
element-icon {
    background-color: transparent;
    size:             1.0000em ;
    cursor:           inherit;
    text-color:       inherit;
}
window {
    padding:          5;
    background-color: @background;
    border:           1;
}
mainbox {
    padding: 0;
    border:  0;
}
message {
    padding:      1px ;
    border-color: @separatorcolor;
    border:       2px dash 0px 0px ;
}
textbox {
    text-color: @foreground;
}
listview {
    padding:      2px 0px 0px ;
    scrollbar:    true;
    border-color: @separatorcolor;
    spacing:      2px ;
    fixed-height: 0;
    border:       2px dash 0px 0px ;
}
scrollbar {
    width:        4px ;
    padding:      0;
    handle-width: 8px ;
    border:       0;
    handle-color: @normal-foreground;
}
sidebar {
    border-color: @separatorcolor;
    border:       2px dash 0px 0px ;
}
button {
    cursor:     pointer;
    spacing:    0;
    text-color: @normal-foreground;
}
button selected {
    background-color: @selected-normal-background;
    text-color:       @selected-normal-foreground;
}
num-filtered-rows {
    expand:     false;
    text-color: Gray;
}
num-rows {
    expand:     false;
    text-color: Gray;
}
textbox-num-sep {
    expand:     false;
    str:        "/";
    text-color: Gray;
}
inputbar {
    padding:    1px ;
    spacing:    0px ;
    text-color: @normal-foreground;
    children:   [ "prompt","textbox-prompt-colon","entry","num-filtered-rows","textbox-num-sep","num-rows","case-indicator" ];
}
case-indicator {
    spacing:    0;
    text-color: @normal-foreground;
}
entry {
    text-color:        @normal-foreground;
    cursor:            text;
    spacing:           0;
    placeholder-color: Gray;
    placeholder:       "Type to filter";
}
prompt {
    spacing:    0;
    text-color: @normal-foreground;
}
textbox-prompt-colon {
    margin:     0px 0.3000em 0.0000em 0.0000em ;
    expand:     false;
    str:        ":";
    text-color: inherit;
}

themes/catppuccin-mocha.rasi

/* -*- mode: css; eval: (rainbow-mode +1) -*- */
* {
  rosewater: #f5e0dc;
  flamingo: #f2cdcd;
  pink: #f5c2e7;
  mauve: #cba6f7;
  red: #f38ba8;
  maroon: #eba0ac;
  peach: #fab387;
  yellow: #f9e2af;
  green: #a6e3a1;
  teal: #94e2d5;
  sky: #89dceb;
  sapphire: #74c7ec;
  blue: #89b4fa;
  lavender: #b4befe;
  text: #cdd6f4;
  subtext1: #bac2de;
  subtext0: #a6adc8;
  overlay2: #9399b2;
  overlay1: #7f849c;
  overlay0: #6c7086;
  surface2: #585b70;
  surface1: #45475a;
  surface0: #313244;
  base: #1e1e2e;
  mantle: #181825;
  crust: #11111b;
}

GTK-3

settings.ini

[Settings]
gtk-theme-name=catppuccin-mocha-blue-standard+default
gtk-icon-theme-name=Papirus-Dark
gtk-font-name=Adwaita Sans 11
gtk-cursor-theme-name=catppuccin-mocha-light-cursors
gtk-cursor-theme-size=0
gtk-toolbar-style=GTK_TOOLBAR_BOTH_HORIZ
gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
gtk-button-images=0
gtk-menu-images=0
gtk-enable-event-sounds=1
gtk-enable-input-feedback-sounds=1
gtk-xft-antialias=1
gtk-xft-hinting=1
gtk-xft-hintstyle=hintmedium
gtk-application-prefer-dark-theme = true
gtk-key-theme-name = Emacs

GTK-4

settings.ini

[Settings]
gtk-icon-theme-name = Papirus-Dark
gtk-theme-name = catppuccin-mocha-blue-standard+default
gtk-font-name=Adwaita Sans 11
gtk-cursor-theme-name=catppuccin-mocha-light-cursors
gtk-cursor-theme-size=0
gtk-toolbar-style=GTK_TOOLBAR_BOTH_HORIZ
gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
gtk-button-images=0
gtk-menu-images=0
gtk-enable-event-sounds=1
gtk-enable-input-feedback-sounds=1
gtk-xft-antialias=1
gtk-xft-hinting=1
gtk-xft-hintstyle=hintmedium
gtk-application-prefer-dark-theme = true
gtk-key-theme-name = Emacs

Date: 2026-05-11 Mon 00:00

Author: Kristian Alexander P

Created: 2026-05-11 Mon 12:16