initial commit

This commit is contained in:
2026-02-24 11:51:37 +01:00
parent e79551e289
commit e20a3e51a0
23 changed files with 2184 additions and 0 deletions

84
modules/groups.py Normal file
View File

@@ -0,0 +1,84 @@
import re
from libqtile.config import Group, Key, Match, DropDown, ScratchPad
from libqtile.lazy import lazy
from modules.keys import keys, mod
groups = [
Group(name="1", label="󰲡"),
Group(name="2", label="󰲣"),
Group(name="3", label="󰲥"),
Group(name="4", label="󰲧"),
Group(name="5", label="󰲩"),
Group(name="6", label="󰲫"),
Group(name="7", label="󰲭"),
Group(name="8", label="󰲯", matches=[Match(wm_class=re.compile(r"^(firefox)$"))]),
Group(name="9", label="󰲱", matches=[Match(wm_class="AFFiNE")]),
]
for i in groups:
keys.extend(
[
Key(
[mod],
i.name,
lazy.group[i.name].toscreen(toggle=True),
desc=f"Switch to group {i.name}",
),
Key(
[mod, "shift"],
i.name,
lazy.window.togroup(i.name, switch_group=True),
desc=f"Switch to & move focused window to group {i.name}",
),
]
)
groups.append(
ScratchPad(
"scratchpad",
[
DropDown(
"term",
"alacritty",
width=0.4,
height=0.5,
x=0.3,
y=0.25,
opacity=1,
on_focus_lost_hide=True,
),
DropDown(
"discord",
"discord",
match=Match(title=re.compile(r".*Discord$")),
opacity=1,
x=0.1,
y=0.05,
width=0.8,
height=0.9,
on_focus_lost_hide=True,
),
DropDown(
"files",
"nemo",
width=0.6,
height=0.6,
x=0.2,
y=0.2,
opacity=1,
on_focus_lost_hide=False,
),
DropDown(
"calc",
"qalculate-gtk",
width=0.3,
height=0.6,
x=0.35,
y=0.2,
opacity=1,
on_focus_lost_hide=False,
),
],
)
)

25
modules/hooks.py Normal file
View File

@@ -0,0 +1,25 @@
# _ _ _ _ _
# __ _| |_(_) | ___ | |__ ___ ___ | | _____
# / _` | __| | |/ _ \ | '_ \ / _ \ / _ \| |/ / __|
# | (_| | |_| | | __/ | | | | (_) | (_) | <\__ \
# \__, |\__|_|_|\___| |_| |_|\___/ \___/|_|\_\___/
# |_|
# by cerberus
# --------------------------------------------------------------------
# --------------------------------------------------------------------
# Imports
# --------------------------------------------------------------------
from libqtile import hook, qtile
import subprocess
import os.path
# --------------------------------------------------------------------
# HOOK startup
# --------------------------------------------------------------------
@hook.subscribe.startup_once
def autostart():
autostartscript = "~/.config/qtile/res/scripts/autostart.sh"
home = os.path.expanduser(autostartscript)
subprocess.Popen([home])

196
modules/keys.py Normal file
View File

@@ -0,0 +1,196 @@
# _ _ _ _
# __ _| |_(_) | ___ | | _____ _ _ ___
# / _` | __| | |/ _ \ | |/ / _ \ | | / __|
# | (_| | |_| | | __/ | < __/ |_| \__ \
# \__, |\__|_|_|\___| |_|\_\___|\__, |___/
# |_| |___/
# by cerberus
# --------------------------------------------------------------------
# --------------------------------------------------------------------
# Imports
# --------------------------------------------------------------------
from libqtile import qtile
from libqtile.config import Key, Drag, Click
from libqtile.lazy import lazy
from modules.screens import notifier
# --------------------------------------------------------------------
# Set default apps
# --------------------------------------------------------------------
terminal = "kitty"
browser = "firefox"
filemanager = "nemo"
# --------------------------------------------------------------------
# Keybindings
# --------------------------------------------------------------------
mod = "mod4" # SUPER KEY
alt = "mod1"
# KeybindStart
keys = [
# KB_GROUP-Focus Window
Key([mod], "h", lazy.layout.left(), desc="Move focus to left"),
Key([mod], "l", lazy.layout.right(), desc="Move focus to right"),
Key([mod], "j", lazy.layout.down(), desc="Move focus down"),
Key([mod], "k", lazy.layout.up(), desc="Move focus up"),
# KB_GROUP-Move Window
# Key([mod, "shift"], "h", lazy.layout.shuffle_left(), desc="Move window to the left"),
# Key([mod, "shift"], "l", lazy.layout.shuffle_right(), desc="Move window to the right"),
Key(
[mod, "shift"],
"h",
lazy.layout.swap_left(),
desc="Move window to the left - Monad",
),
Key(
[mod, "shift"],
"l",
lazy.layout.swap_right(),
desc="Move window to the left - Monad",
),
Key([mod, "shift"], "j", lazy.layout.shuffle_down(), desc="Move window down"),
Key([mod, "shift"], "k", lazy.layout.shuffle_up(), desc="Move window up"),
# KB_GROUP-Resize Window
# Key([mod, "control"], "h", lazy.layout.grow_left(), desc="Grow window to the left"),
# Key([mod, "control"], "l", lazy.layout.grow_right(), desc="Grow window to the right"),
Key([mod], "m", lazy.layout.shrink(), desc="Grow window to the top"),
Key([mod], "i", lazy.layout.grow(), desc="Grow window to the bottom"),
# KB_GROUP-Window Controls
Key([mod], "n", lazy.layout.normalize(), desc="Normalize all window sizes"),
Key([mod, "shift"], "n", lazy.layout.reset(), desc="Reset all window sizes"),
Key([mod], "t", lazy.window.toggle_floating(), desc="Toggle floating"),
Key([mod], "o", lazy.layout.maximize(), desc="Maximize window"),
Key(
[mod, "shift"],
"s",
lazy.layout.toggle_auto_maximize(),
desc="Toggle auto maximize",
),
Key([mod], "f", lazy.window.toggle_fullscreen(), desc="Toggle full screen"),
Key([mod, "shift"], "space", lazy.layout.flip(), desc="Flip windows"),
Key(
[mod, "shift"],
"Return",
lazy.layout.toggle_split(),
desc="Toggle between split and unsplit sides of stack",
),
# KB_GROUP-System Controls
Key([mod], "Tab", lazy.next_layout(), desc="Toggle between layouts"),
Key([mod], "c", lazy.window.kill(), desc="Kill focused window"),
Key([mod, "control"], "r", lazy.reload_config(), desc="Reload the config"),
Key(
[mod, "mod1"],
"l",
lazy.spawn("betterlockscreen --lock blur"),
desc="Lock Computer",
),
# KB_GROUP-Audio and Media Control
Key([], "XF86AudioMute", lazy.spawn("pamixer -t"), desc="Mute Audio"),
Key([], "XF86AudioLowerVolume", lazy.spawn("pamixer -d 2"), desc="Lower Volume"),
Key([], "XF86AudioRaiseVolume", lazy.spawn("pamixer -i 2"), desc="Next Song"),
Key([], "XF86AudioPrev", lazy.spawn("playerctl previous"), desc="Previous Media"),
Key(
[], "XF86AudioPlay", lazy.spawn("playerctl play-pause"), desc="Play Pause Media"
),
Key([], "XF86AudioNext", lazy.spawn("playerctl next"), desc="Next Media"),
# XF86MonBrightnessUp
Key(
[],
"XF86MonBrightnessUp",
lazy.widget["brightnesscontrol"].brightness_up(),
desc="Increase brightness",
),
Key(
[],
"XF86MonBrightnessDown",
lazy.widget["brightnesscontrol"].brightness_down(),
desc="Decrease brightness",
),
# Key([], "XF86MonBrightnessUp", lazy.spawn("brightness_up")),
# Key([], "XF86MonBrightnessDown", lazy.spawncmd(brightness_down)),
# KB_GROUP-Rofi Menus
Key([mod], "r", lazy.spawn("rofi -show drun -show-icons"), desc="Spawn Rofi D-Run"),
Key(
[alt], "Tab", lazy.spawn("rofi -show window -show-icons"), desc="Spawn Windows"
),
Key([mod], "p", lazy.spawn("rofi -show ssh"), desc="Spawn Rofi SSH-Connections"),
# KB_GROUP-ScratchPad
Key(
["control"],
"1",
lazy.group["scratchpad"].dropdown_toggle("term"),
desc="PopUp Terminal",
),
Key(
["control"],
"2",
lazy.group["scratchpad"].dropdown_toggle("discord"),
desc="Discord",
),
Key(
["control"],
"3",
lazy.group["scratchpad"].dropdown_toggle("files"),
desc="PopUp Filemanager",
),
Key(
["control"],
"4",
lazy.group["scratchpad"].dropdown_toggle("calc"),
desc="Calculator",
),
# Key([], "XF86Calculator", lazy.group['scratchpad'].dropdown_toggle('calc'), desc="Open Calculator in scratchpad"),
# KB_GROUP-Programs
Key([mod], "Return", lazy.spawn(terminal), desc="Launch terminal"),
Key([mod], "v", lazy.spawn("copyq toggle"), desc="Shows Clipboard"),
Key([mod, "shift"], "q", lazy.spawn("flameshot gui"), desc="Screenshot selection"),
Key(
[mod, "shift"], "b", lazy.spawn(browser), desc="Opens Browser on current screen"
),
Key(
[mod, "shift"],
"p",
lazy.spawn("firefox --private-window"),
desc="Opens Private Browser on current screen",
),
Key([mod, "shift"], "e", lazy.spawn(filemanager), desc="Opens File Manager"),
Key([mod], "b", lazy.spawn("bitwarden-desktop"), desc="Opens Bitwarden"),
Key(
[mod, "shift"],
"i",
lazy.spawn(
"alacritty --config-file=/home/cerberus/.config/alacritty/cheat-sheet.toml -T FloatWindow -e /home/cerberus/.config/qtile/res/scripts/keybinds.py"
),
desc="Opens Cheat-Sheet",
),
]
# --------------------------------------------------------------------
# Drag floating layouts
# --------------------------------------------------------------------
mouse = [
Drag(
[mod],
"Button1",
lazy.window.set_position_floating(),
start=lazy.window.get_position(),
),
Drag(
[mod], "Button3", lazy.window.set_size_floating(), start=lazy.window.get_size()
),
Click([mod], "Button2", lazy.window.bring_to_front()),
]
# KeybindEnd
keys.extend(
[
Key([mod], "grave", lazy.function(notifier.prev)),
Key([mod, "shift"], "grave", lazy.function(notifier.next)),
Key(["control"], "space", lazy.function(notifier.close)),
]
)

78
modules/layouts.py Normal file
View File

@@ -0,0 +1,78 @@
# _ _ _ _ _
# __ _| |_(_) | ___ | | __ _ _ _ ___ _ _| |_ ___
# / _` | __| | |/ _ \ | |/ _` | | | |/ _ \| | | | __/ __|
# | (_| | |_| | | __/ | | (_| | |_| | (_) | |_| | |_\__ \
# \__, |\__|_|_|\___| |_|\__,_|\__, |\___/ \__,_|\__|___/
# |_| |___/
# --------------------------------------------------------------------
# --------------------------------------------------------------------
# Imports
# --------------------------------------------------------------------
from libqtile import layout
from libqtile.config import Match
layout_defaults = dict(
margin = 3,
border_width = 0,
# border_focus=gruvbox_dark["red"],
# border_normal=gruvbox_dark["fg1"],
grow_amount = 2,
)
floating_layout_defaults = layout_defaults.copy()
layouts = [
# layout.Max(**layout_defaults),
# layout.Plasma(),
# layout.Stack(num_stacks=2),
# layout.Columns(),
# layout.Matrix(),
layout.MonadTall(name="Monad",
auto_maximize=True,
change_ratio=0.05,
change_size=20,
ratio=0.55,
min_ratio=0.30,
max_ratio=0.75,
single_border_width=0,
**layout_defaults
),
layout.Bsp(name="bsp",
ratio = 0.5,
# border_on_single= True,
lower_right = True,
**layout_defaults,
),
layout.Spiral(**layout_defaults),
# layout.MonadWide(),
# layout.RatioTile(),
# layout.Tile(name="Tile", **layout_defaults),
# layout.TreeTab(),
# layout.VerticalTile(),
# layout.Zoomy(**layout_defaults),
]
floating_layout = layout.Floating(
float_rules=[
# Run the utility of `xprop` to see the wm class and name of an X client.
*layout.Floating.default_float_rules,
Match(wm_class="confirmreset"), # gitk
Match(wm_class="makebranch"), # gitk
Match(wm_class="maketag"), # gitk
Match(wm_class="ssh-askpass"), # ssh-askpass
Match(wm_class="nm-connection-editor"), # networkmanager
# Match(wm_class="bitwarden"), # bitwarden
Match(title="branchdialog"), # gitk
Match(title="pinentry"), # GPG key password entry
Match(title="FloatWindow"),
Match(wm_class="qalculate-qt"),
Match(wm_class="copyq"),
Match(wm_class="nitrogen"),
Match(wm_class="nemo-preview-start"),
Match(wm_class="wireguird"),
Match(wm_class="blueman-manager"),
],
**floating_layout_defaults
)

191
modules/screens.py Normal file
View File

@@ -0,0 +1,191 @@
# _ _ _
# __ _| |_(_) | ___ ___ ___ _ __ ___ ___ _ __ ___
# / _` | __| | |/ _ \ / __|/ __| '__/ _ \/ _ \ '_ \/ __|
# | (_| | |_| | | __/ \__ \ (__| | | __/ __/ | | \__ \
# \__, |\__|_|_|\___| |___/\___|_| \___|\___|_| |_|___/
# |_|
# --------------------------------------------------------------------
# Imports
# --------------------------------------------------------------------
from libqtile.config import Screen
from libqtile import bar
from libqtile.lazy import lazy
from qtile_extras import widget
from qtile_extras.widget.groupbox2 import GroupBoxRule
from plugins.notifications import Notifier
from popups.powermenu import power_menu
from popups.start_menu import start_menu
from popups.calendar import calendar
from popups.mpris2_layout import MPRIS2_LAYOUT
from popups.volume_notification import VOL_POPUP
from popups.brightness_notification import BRIGHTNESS_NOTIFICATION
from res.themes.colors import gruvbox_dark
# --------------------------------------------------------
# GroupBox2 rules
# --------------------------------------------------------
# def set_app_group_color(rule, box):
# if box.has.win.name("Jellyfin Media Player"):
# rule.foreground = gruvbox_dark
# # elif box.occupied:
# # rule.text = "◎"
# # else:
# # rule.text = "○"
# return True
def get_groupbox_rules(monitor_specific=True):
# Base rules applied to all GroupBoxes
rules = [
GroupBoxRule(text_colour=gruvbox_dark["bg3"]).when(
focused=False, occupied=True
),
# GroupBoxRule(text_colour=gruvbox_dark["aqua"]).when(focused=False, occupied=False),
GroupBoxRule(text_colour=gruvbox_dark["fg3"]).when(focused=True),
GroupBoxRule(text_colour=gruvbox_dark["red"]).when(
focused=False, occupied=True, urgent=True
),
GroupBoxRule(visible=False).when(focused=False, occupied=False),
# GroupBoxRule().when(func=set_app_group_color)
]
# Add extra rule for a specific monitor (e.g., show "X" as label)
if monitor_specific:
rules.append(GroupBoxRule(text=""))
return rules
# --------------------------------------------------------
# Widget Defaults
# --------------------------------------------------------
widget_defaults = dict(font="Open Sans", fontsize=18, foreground=gruvbox_dark["fg1"])
extension_defaults = widget_defaults.copy()
# --------------------------------------------------------
# Screens
# --------------------------------------------------------
bar.Bar
screens = [
Screen(
top=bar.Bar(
[
widget.TextBox(
text="",
fontsize=24, # PopUp-Toolkit?
foreground=gruvbox_dark["blue"],
mouse_callbacks={"Button1": lazy.function(start_menu)},
),
widget.GroupBox2(
padding=5,
fontsize=22,
font="Open Sans",
center_aligned=True,
visible_groups=["1", "2", "3", "4", "5", "6", "7"], # , '8', '9'
hide_unused=True,
rules=get_groupbox_rules(monitor_specific=False),
),
widget.Spacer(length=20),
widget.Mpris2(
name="mpris2",
width=350,
scroll=True,
scroll_clear=True,
foreground=gruvbox_dark["fg1"],
format="{xesam:title} - {xesam:artist}",
paused_text="{track} ",
popup_layout=MPRIS2_LAYOUT,
poll_interval=15,
popup_show_args={"relative_to": 2, "relative_to_bar": True, "y": 3},
mouse_callbacks={"Button1": lazy.widget["mpris2"].toggle_player()},
),
widget.Spacer(),
widget.Battery(
format="{char}{percent:2.0%}",
low_percentage=0.25,
low_foreground=gruvbox_dark["red"],
charging_foreground=gruvbox_dark["green"],
charge_char="",
discharge_char="",
empty_char="!",
full_char="",
not_charging_char="",
unknown_char="?",
update_interval=1,
),
widget.WidgetBox(
fontsize=22,
text_closed="󱤟",
text_open="󱤠 ",
widgets=[
widget.Memory(format="{MemPercent}%"),
widget.CPU(format="{load_percent}%"),
],
),
widget.Spacer(length=2),
widget.Systray(
icon_size=21,
),
widget.Spacer(length=6),
widget.Clock(mouse_callbacks={"Button1": lazy.function(calendar)}),
widget.Spacer(length=2),
widget.TextBox(
fontsize=20,
text="",
mouse_callbacks={"Button1": lazy.function(power_menu)},
),
# Invisible widgets for popup notifications at value change
widget.BrightnessControl(
mode="popup",
popup_layout=BRIGHTNESS_NOTIFICATION,
device="/sys/class/backlight/intel_backlight",
brightness_path="brightness",
max_brightness_path="max_brightness",
popup_show_args={"relative_to": 8, "y": -70},
),
widget.PulseVolumeExtra(
mode="popup",
fmt="",
popup_layout=VOL_POPUP,
popup_hide_timeout=3,
popup_show_args={"relative_to": 8, "y": -70},
),
],
background=gruvbox_dark["bg0_hard"],
opacity=0.75,
size=32,
margin=[3, 3, 0, 3],
),
),
]
notifier = Notifier(
x=835,
y=38,
width=250,
height=96,
format="<b>{summary}</b>\n{app_name}\n{body}",
# file_name='/home/cerberus/.config/qtile/normal.png', # Not working
foreground=gruvbox_dark["fg1"],
background=(
gruvbox_dark["bg0_hard"],
gruvbox_dark["bg0_hard"],
gruvbox_dark["orange"],
),
horizontal_padding=8,
vertical_padding=8,
opacity=0.65,
border_width=0,
font="Open Sans",
font_size=16,
# overflow='more_width',
fullscreen="queue",
screen="focus",
actions=True,
# wrap=True
)