diff --git a/user/.chezmoidata/packages.yaml b/user/.chezmoidata/packages.yaml index dcaf590..7b4cebd 100644 --- a/user/.chezmoidata/packages.yaml +++ b/user/.chezmoidata/packages.yaml @@ -40,10 +40,7 @@ packages: # Thunderbolt - bolt # Hyprland - - hypridle - hyprland - - hyprlock - - hyprpaper - xdg-desktop-portal - xdg-desktop-portal-gtk - xdg-desktop-portal-hyprland @@ -116,10 +113,11 @@ packages: - librewolf-bin - meld - nemo + - nemo-fileroller - neovim - - network-manager-applet - networkmanager - nm-connection-editor + - network-manager-applet - nodejs - npm - nvm @@ -140,6 +138,9 @@ packages: - hunspell-de - hunspell-en_gb - hunspell-en_us + - qalculate-gtk + # VIM + - lua-language-server intel_graphics_i915: yay: - intel-media-driver diff --git a/user/.chezmoiexternal.yaml b/user/.chezmoiexternal.yaml index f96b049..5c1f4a6 100644 --- a/user/.chezmoiexternal.yaml +++ b/user/.chezmoiexternal.yaml @@ -12,3 +12,8 @@ type: file url: https://raw.githubusercontent.com/catppuccin/btop/refs/heads/main/themes/catppuccin_macchiato.theme refreshPeriod: 168h + +.config/DankMaterialShell/catppuccin.json: + type: file + url: https://raw.githubusercontent.com/catppuccin/dankmaterialshell/refs/heads/main/catppuccin.json + refreshPeriod: 168h diff --git a/user/dot_config/DankMaterialShell/settings.json b/user/dot_config/DankMaterialShell/settings.json index 16488ba..95c39f1 100644 --- a/user/dot_config/DankMaterialShell/settings.json +++ b/user/dot_config/DankMaterialShell/settings.json @@ -1,7 +1,7 @@ { "currentThemeName": "custom", "currentThemeCategory": "custom", - "customThemeFile": "/home/frank/Downloads/catppuccin.json", + "customThemeFile": "/home/frank/.config/DankMaterialShell/catppuccin.json", "registryThemeVariants": { "catppuccin": { "dark": { @@ -63,7 +63,7 @@ "m3ElevationCustomColor": "#000000", "modalElevationEnabled": true, "popoutElevationEnabled": true, - "barElevationEnabled": true, + "barElevationEnabled": false, "blurEnabled": true, "blurForegroundLayers": true, "blurLayerOutlineOpacity": 0.12, @@ -389,15 +389,6 @@ "fadeToDpmsEnabled": true, "fadeToDpmsGracePeriod": 5, "launchPrefix": "uwsm-app -- ", - "brightnessDevicePins": {}, - "wifiNetworkPins": { - "preferredWifi": [ - "wifi.zechert.net" - ] - }, - "bluetoothDevicePins": {}, - "audioInputDevicePins": {}, - "audioOutputDevicePins": {}, "gtkThemingEnabled": false, "qtThemingEnabled": false, "syncModeWithPortal": true, @@ -562,7 +553,9 @@ "updaterIgnoredPackages": [], "displayNameMode": "model", "screenPreferences": { - "wallpaper": [] + "wallpaper": [ + "all" + ] }, "showOnLastDisplay": {}, "niriOutputSettings": {}, @@ -669,10 +662,10 @@ } ], "spacing": 4, - "innerPadding": 4, + "innerPadding": 6, "barInsetPadding": 4, "bottomGap": 0, - "transparency": 0.09, + "transparency": 0, "widgetTransparency": 1, "squareCorners": false, "noBackground": false, @@ -827,5 +820,5 @@ "barInsetPaddingShared": -1, "barInsetPaddingSyncAll": false, "frameBarInsetPadding": -1, - "configVersion": 12 + "configVersion": 13 } diff --git a/user/dot_config/environment.d/.keep b/user/dot_config/environment.d/.keep new file mode 100644 index 0000000..e69de29 diff --git a/user/dot_config/gtk-3.0/bookmarks b/user/dot_config/gtk-3.0/bookmarks index 2d5bc9a..dd522a7 100644 --- a/user/dot_config/gtk-3.0/bookmarks +++ b/user/dot_config/gtk-3.0/bookmarks @@ -1 +1,5 @@ +file:///home/frank/Documents Documents +file:///home/frank/Downloads Downloads +file:///home/frank/Pictures Pictures +file:///home/frank/Projects Projects smb://10.10.10.5/ HOMESERVER diff --git a/user/dot_config/gtk-4.0/settings.ini b/user/dot_config/gtk-4.0/settings.ini new file mode 100644 index 0000000..969efba --- /dev/null +++ b/user/dot_config/gtk-4.0/settings.ini @@ -0,0 +1,7 @@ +[Settings] +gtk-theme-name=Colloid-Dark-Catppuccin +gtk-icon-theme-name=Papirus-Dark +gtk-font-name=Inter 11 +gtk-cursor-theme-name=Breeze_Light +gtk-cursor-theme-size=24 +gtk-application-prefer-dark-theme=1 diff --git a/user/dot_config/gtk-4.0/symlink_assets b/user/dot_config/gtk-4.0/symlink_assets new file mode 100644 index 0000000..5a99d21 --- /dev/null +++ b/user/dot_config/gtk-4.0/symlink_assets @@ -0,0 +1 @@ +/usr/share/themes/Colloid-Dark-Catppuccin/gtk-4.0/assets diff --git a/user/dot_config/gtk-4.0/symlink_gtk-dark.css b/user/dot_config/gtk-4.0/symlink_gtk-dark.css new file mode 100644 index 0000000..b5f0003 --- /dev/null +++ b/user/dot_config/gtk-4.0/symlink_gtk-dark.css @@ -0,0 +1 @@ +/usr/share/themes/Colloid-Dark-Catppuccin/gtk-4.0/gtk-dark.css diff --git a/user/dot_config/gtk-4.0/symlink_gtk.css b/user/dot_config/gtk-4.0/symlink_gtk.css new file mode 100644 index 0000000..7df6fa8 --- /dev/null +++ b/user/dot_config/gtk-4.0/symlink_gtk.css @@ -0,0 +1 @@ +/usr/share/themes/Colloid-Dark-Catppuccin/gtk-4.0/gtk.css diff --git a/user/dot_config/hypr/dms/binds-user.lua b/user/dot_config/hypr/dms/binds-user.lua deleted file mode 100644 index c410a95..0000000 --- a/user/dot_config/hypr/dms/binds-user.lua +++ /dev/null @@ -1 +0,0 @@ --- Optional per-user keybind overrides (managed by DMS). Loaded after default binds. diff --git a/user/dot_config/hypr/dms/empty_binds-user.lua b/user/dot_config/hypr/dms/empty_binds-user.lua new file mode 100644 index 0000000..e69de29 diff --git a/user/dot_config/hypr/dot_luarc.json b/user/dot_config/hypr/dot_luarc.json new file mode 100644 index 0000000..b4ecec0 --- /dev/null +++ b/user/dot_config/hypr/dot_luarc.json @@ -0,0 +1,7 @@ +{ + "workspace": { + "library": [ + "/usr/share/hypr/stubs" + ] + } +} diff --git a/user/dot_config/hypr/hyprland-autostart.lua b/user/dot_config/hypr/hyprland-autostart.lua index 59e6615..6eb7e5a 100644 --- a/user/dot_config/hypr/hyprland-autostart.lua +++ b/user/dot_config/hypr/hyprland-autostart.lua @@ -4,10 +4,18 @@ -- Autostart necessary processes (like notifications daemons, status bars, etc.) -- Or execute your favorite apps at launch like this: -- --- hl.on("hyprland.start", function () +-- hl.on("hyprland.start", function () -- hl.exec_cmd(terminal) -- hl.exec_cmd("nm-applet") -- hl.exec_cmd("waybar & hyprpaper & firefox") -- end) +hl.on("hyprland.start", function() + hl.exec_cmd("librewolf", { workspace = 9 }) + hl.exec_cmd("thunderbird", { workspace = 10 }) + hl.timer(function() + hl.exec_cmd("signal-desktop", { workspace = 10 }) + hl.exec_cmd("Telegram", { workspace = 10 }) + end, { timeout = 1000, type = "oneshot" }) +end) diff --git a/user/dot_config/hypr/hyprland-binds.lua b/user/dot_config/hypr/hyprland-binds.lua new file mode 100644 index 0000000..f919cf5 --- /dev/null +++ b/user/dot_config/hypr/hyprland-binds.lua @@ -0,0 +1,167 @@ +local launchPrefix = "uwsm app -- " + +local function is_ipc_call(command) + -- check if this is an ipc call to a running programm + is_dms_ipc = starts_with(command, "dms ipc") + is_hyprctl = starts_with(command, "hyprctl") + is_ipc = any({is_dms_ipc, is_hyprctl}, function(v) return v end) + return is_ipc +end + +function create_launcher(command) + if is_ipc_call(command) then + return command + end + return launchPrefix .. command +end + +function execute(command) + return hl.dsp.exec_cmd(create_launcher(command)) +end + +-- Program Launchers +hl.bind("SUPER + Return", execute(programs.terminal), { description = "Open Terminal" }) +hl.bind("SUPER + Space", execute(programs.menu), { description = "Open Application Menu" }) +hl.bind("SUPER + W", execute(programs.browser), { description = "Start Webbrowser"}) +hl.bind("SUPER + E", execute(programs.explorer), { description = "Start Webbrowser"}) +hl.bind("CTRL + SHIFT + Escape", execute("dms ipc call processlist focusOrToggle"), { description = "Process Manager" }) +hl.bind("SUPER + Comma", execute("dms ipc call settings focusOrToggle"), { description = "Open DMS Settings" }) +hl.bind("SUPER + Escape", execute("dms ipc call powermenu toggle"), { description = "Open Power Menu" }) +hl.bind("SUPER + Plus", execute(programs.calculator), { description = "Open Calculator" }) +hl.bind("SUPER + B", execute("dms ipc call night toggle"), { description = "Toggle Night Mode" }) +hl.bind("SUPER + SHIFT + I", execute("dms ipc call inhibit toggle"), { description = "Toggle Idle Inhibitor" }) + + + +-- Workspaces +for i = 1, 10 do + local workspace_num = i%10 + local workspace_name = i + hl.bind("SUPER + " .. workspace_num, hl.dsp.focus({ workspace = workspace_name}), { description = "Focus Workspace "..workspace_name }) +end + +hl.bind("SUPER + Page_Down", hl.dsp.focus({ workspace = "e+1" }), { description = "Focus Next Workspace" }) +hl.bind("SUPER + mouse_down", hl.dsp.focus({ workspace = "e+1" }), { description = "Focus Next Workspace" }) +hl.bind("SUPER + Page_Up", hl.dsp.focus({ workspace = "e-1" }), { description = "Focus Previous Workspace" }) +hl.bind("SUPER + mouse_up", hl.dsp.focus({ workspace = "e-1" }), { description = "Focus Previous Workspace" }) + +-- Windows +hl.bind("SUPER + Q", hl.dsp.window.close() , { description = "Close Window" }) +hl.bind("SUPER + SHIFT + Q", hl.dsp.window.kill() , { description = "Close Window" }) +hl.bind("SUPER + F", hl.dsp.window.fullscreen({ mode = "maximized", action = "toggle" }), { description = "Maximize Window"}) +hl.bind("SUPER + SHIFT + F", hl.dsp.window.fullscreen({ mode = "fullscreen", action = "toggle" }), { description = "Fullscreen Window"}) +hl.bind("SUPER + V", function() + hl.dispatch(hl.dsp.window.float({action="float"})) + hl.dispatch(hl.dsp.window.center()) +end, { description = "Flaot & Center Window"}) +hl.bind("SUPER + C", hl.dsp.window.center(), { description = "Center Window" }) +hl.bind("SUPER + G", hl.dsp.group.toggle(), { description = "Toggle Group" }) +hl.bind("SUPER + S", hl.dsp.window.pin({action="toggle"}), { description = "Pin Window (Sticky)" }) + +hl.bind("SUPER + mouse:272", hl.dsp.window.drag(), { description = "Move Window", mouse = true }) +hl.bind("SUPER + mouse:273", hl.dsp.window.resize(), { description = "Resize Window", mouse = true }) + +local function smart_focus(direction) + local window = hl.get_active_window() + if not window then return end + + local group = window.group + if not group or not group.members or #group.members == 0 then + hl.dispatch(hl.dsp.focus({direction=direction})) + return + end + + -- when in a group, try to focus next grouped window + local members = group.members or {} + local index = nil + for i, member in ipairs(members) do + if member.address == window.address then + index = i + break + end + end + + if not index then + hl.dispatch(hl.dsp.focus({direction=direction})) + return + end + + next = members[direction == "left" and index - 1 or index + 1] + if next then + hl.dispatch(hl.dsp.focus({ window = next })) + return + end + hl.dispatch(hl.dsp.focus({direction=direction})) +end +hl.bind("SUPER + H", function() smart_focus("left") end, { description = "Move Focus Left" }) +hl.bind("SUPER + J", hl.dsp.focus({direction="down"}), { description = "Move Focus Down" }) +hl.bind("SUPER + K", hl.dsp.focus({direction="up"}), { description = "Move Focus Up" }) +hl.bind("SUPER + L", function() smart_focus("right") end, { description = "Move Focus Right" }) + +hl.bind("SUPER + SHIFT + H", hl.dsp.window.move({direction="left", group_aware = true}), { description = "Move Window Left" }) +hl.bind("SUPER + SHIFT + J", hl.dsp.window.move({direction="down", group_aware = true}), { description = "Move Window Down" }) +hl.bind("SUPER + SHIFT + K", hl.dsp.window.move({direction="up", group_aware = true}), { description = "Move Window Up" }) +hl.bind("SUPER + SHIFT + L", hl.dsp.window.move({direction="right", group_aware = true}), { description = "Move Window Right" }) + +for i = 1, 10 do + local workspace_num = i%10 + local workspace_name = i + + hl.bind("SUPER + SHIFT + " .. workspace_num, hl.dsp.window.move({ workspace = workspace_name, follow = true}), { description = "Move Window to Workspace " .. workspace_name }) + hl.bind("SUPER + CTRL + SHIFT + " .. workspace_num, hl.dsp.window.move({ workspace = workspace_name, follow = false}), { description = "Move Window to Workspace " .. workspace_name .. " (silent)" }) +end + +-- Resizing Submap +local resizeSubmapName = "Resize Window: [hjkl]" +hl.bind("SUPER + R", hl.dsp.submap(resizeSubmapName), { description = "Resize..." }) +hl.define_submap(resizeSubmapName, function() + hl.bind("h", hl.dsp.window.resize({ x = -10, y = 0, relative = true}), { repeating = true }) + hl.bind("j", hl.dsp.window.resize({ x = 0, y = -10, relative = true}), { repeating = true }) + hl.bind("k", hl.dsp.window.resize({ x = 0, y = 10, relative = true}), { repeating = true }) + hl.bind("l", hl.dsp.window.resize({ x = 10, y = 0, relative = true}), { repeating = true }) + hl.bind("escape", hl.dsp.submap("reset")) + hl.bind("catchall", function() hl.dispatch(submap_toast) end) +end) + +-- Move Workspaces +local workspaceSubmapName = "Workspace: [hjkl]" +hl.bind("SUPER + T", hl.dsp.submap(workspaceSubmapName), { description = "Workspace..." }) +hl.define_submap(workspaceSubmapName, function() + hl.bind("escape", hl.dsp.submap("reset")) + hl.bind("catchall", function() hl.dispatch(submap_toast) end) +end) + +-- Master Layout +hl.bind("SUPER + M", hl.dsp.layout("focusmaster"), { description = "Focus Master" }) +hl.bind("SUPER + SHIFT + M", hl.dsp.layout("swapwithmaster ignoremaster"), { description = "Swap With Master" }) + + + +-- Clipboard +hl.bind("SUPER + SHIFT + V", execute("dms ipc call clipboard toggle"), { description = "Open Clipboard Manager" }) + +-- Screenshot +hl.bind("Print", execute("dms screenshot region -d ~/Pictures/Screenshots"), { description = "Screenshot" }) +hl.bind("CTRL + Print", execute("dms screenshot full -d ~/Pictures/Screenshots"), { description = "Full Screenshot" }) +hl.bind("ALT + Print", execute("dms screenshot window -d ~/Pictures/Screenshots"), { description = "Window Screenshot" }) + +-- Notifications +hl.bind("SUPER + N", execute("dms ipc call notifications toggle"), { description = "Toggle Notifications" }) +hl.bind("SUPER + SHIFT + N", execute("dms ipc call notifications clearAll"), { description = "Toggle Notifications" }) + +-- Multimedia +hl.bind("XF86AudioRaiseVolume", execute("dms ipc call audio increment 1"), { description = "Increase Volume", repeating = true }) +hl.bind("XF86AudioLowerVolume", execute("dms ipc call audio decrement 1"), { description = "Decrease Volume", repeating = true }) +hl.bind("CTRL + XF86AudioRaiseVolume", execute("dms ipc call mpris increment 1"), { description = "Increase Player Volume", repeating = true }) +hl.bind("CTRL + XF86AudioLowerVolume", execute("dms ipc call mpris decrement 1"), { description = "Decrease Player Volume", repeating = true }) +hl.bind("XF86AudioMute", execute("dms ipc call audio mute"), { description = "Mute Audio"}) +hl.bind("XF86AudioMicMute", execute("dms ipc call audio micmute"), { description = "Mute Microphone"}) +hl.bind("XF86AudioPause", execute("dms ipc call mpris playPause"), { description = "Play / Pause"}) +hl.bind("XF86AudioPlay", execute("dms ipc call mpris playPause"), { description = "Play / Pause"}) +hl.bind("XF86AudioPrev", execute("dms ipc call mpris previous"), { description = "Previous"}) +hl.bind("XF86AudioNext", execute("dms ipc call mpris next"), { description = "Next"}) +hl.bind("XF86MonBrightnessUp", execute("dms ipc call brightness increment 5 \"\""), { description = "Increase Brightness", repeating = true, locked = true}) +hl.bind("XF86MonBrightnessDown", execute("dms ipc call brightness decrement 5 \"\""), { description = "Decrease Brightness", repeating = true, locked = true}) + +-- Hyprland +hl.bind("SUPER + SHIFT + ALT + CTRL + Escape", hl.dsp.exit(), { description = "Exit Hyprland" }) diff --git a/user/dot_config/hypr/hyprland-environment-variables.lua b/user/dot_config/hypr/hyprland-environment-variables.lua index dd45f1d..e5dd000 100644 --- a/user/dot_config/hypr/hyprland-environment-variables.lua +++ b/user/dot_config/hypr/hyprland-environment-variables.lua @@ -1,5 +1,2 @@ --- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Environment-variables/ - -hl.env("XCURSOR_SIZE", "24") -hl.env("HYPRCURSOR_SIZE", "24") - +-- environment variables should usually go in ~/.config/uwsm/env +-- hyprland specific ones should usually go in ~/.config/uwsm/env-hyprland diff --git a/user/dot_config/hypr/hyprland-monitors.lua b/user/dot_config/hypr/hyprland-monitors.lua index c15768b..e27727b 100644 --- a/user/dot_config/hypr/hyprland-monitors.lua +++ b/user/dot_config/hypr/hyprland-monitors.lua @@ -1,50 +1,267 @@ --- Home Monitor Setup -hl.monitor({ - output = "desc:GIGA-BYTE TECHNOLOGY CO. LTD. M34WQ 0x00000B52", - mode = "3440x1440@60", - position = "0x0", - scale = "1" -}) +-- Monitor configuration and automatic and manual switching-- -hl.monitor({ - output = "desc:Dell Inc. DELL U2414H 292K475V26JL", - mode = "1920x1080@60", - position = "760x-1080", - scale = "1" -}) +------------------ +---- PROFILES ---- +------------------ -hl.monitor({ - output = "desc:Dell Inc. DELL U2724D DL7R834", - mode = "2560x1440@60", - position = "3440x0", - scale = "1" -}) +-- Profiles: +-- Key of the profile is the name of the profile +-- Profiles are ordered by priority, higher number takes precedence over smaller number +-- First (by priority) profile that matches will be applied, all others will be ignored +-- +-- A profile matches the current setup if _ALL_ of its match criteria are fulfilled +-- If there are no match criteria, it will match always +local PROFILES = { + -- The most basic fallback if nothing else ever works + fallback = { + priority = -999, + matches = {}, + monitors = { + { + output = "", + mode = "preferred", + position = "auto", + scale = 1, + disabled = false, + }, + }, + }, + laptop = { + priority = 0, + matches = {{ output = "eDP-1" }}, + monitors = { + { + output = "eDP-1", + mode = "1920x1200@120", + position = "0x0", + scale = 1, + disabled = false, + }, + }, + }, + home_docked = { + priority = 10, + matches = { + { output = "desc:GIGA-BYTE TECHNOLOGY CO. LTD. M34WQ 0x00000B52" }, + { output = "desc:Dell Inc. DELL U2414H 292K475V26JL" }, + { output = "desc:Dell Inc. DELL U2724D DL7R834" }, + }, + monitors = { + { + output = "eDP-1", + mode = "preferred", + position = "0x0", + scale = 1, + disabled = true, + }, + { + output = "desc:GIGA-BYTE TECHNOLOGY CO. LTD. M34WQ 0x00000B52", + mode = "3440x1440@60", + position = "0x0", + scale = 1, + disabled = false, + }, + { + output = "desc:Dell Inc. DELL U2414H 292K475V26JL", + mode = "1920x1080@60", + position = "760x-1080", + scale = 1, + disabled = false, + }, + { + output = "desc:Dell Inc. DELL U2724D DL7R834", + mode = "2560x1440@60", + position = "3440x0", + scale = 1, + disabled = false, + }, + }, + postprocess = function() + debug_notify("now applying workspace rules") + for i = 1,5 do + hl.workspace_rule({ workspace = string.format("%d", i), monitor = "desc:GIGA-BYTE TECHNOLOGY CO. LTD. M34WQ 0x00000B52"}) + end + hl.workspace_rule({ workspace = "1", default = true, persistent = true}) + for i = 6,9 do + hl.workspace_rule({ workspace = string.format("%d", i), monitor = "desc:Dell Inc. DELL U2724D DL7R834"}) + end + hl.workspace_rule({ workspace = "9", default = true, persistent = true}) + hl.workspace_rule({ workspace = "10", monitor = "desc:Dell Inc. DELL U2414H 292K475V26JL", default = true, persistent = true}) --- Integrated Laptop Monitor -hl.monitor({ - output = "eDP-1", - mode = "1920x1200@120", - position = "auto", - scale = "1" -}) + hl.dispatch(hl.dsp.focus({workspace = 10})) + hl.dispatch(hl.dsp.focus({workspace = 9})) + hl.dispatch(hl.dsp.focus({workspace = 1})) + end + }, +} --- Default for all other monitors -hl.monitor({ - output = "", - mode = "preferred", - position = "auto", - scale = "auto", -}) +local function refresh_monitors() + hl.exec_cmd("hyprctl monitors all -j | jq -r '.[] | [.name, .description] | @tsv' > /tmp/hypr_monitors.tsv") +end +local function get_monitors() + -- FIXME: Use hl.get_monitors({all=true}) as soon as it is released + local handle = io.open("/tmp/hypr_monitors.tsv", "r") + if handle ~= nil then + local out = handle:read("*a") + handle:close() --- In Clamshell Mode, deactivate the internal monitor -hl.bind("switch:on:Lid Switch", function() + local result = {} + for line in out:gmatch("[^\n]+") do + local name, desc = line:match("([^\t]+)\t(.+)") + table.insert(result, { name = name, description = desc }) + end + return result + end + return {} +end + +local function get_matching_profile() + local monitors = get_monitors() + local profiles = {} or {} + + local monitor_debug = map(monitors, function(monitor) + return monitor.name .. ": "..monitor.description + end) + debug_notify("Currently " .. #monitors .. " connected: " .. table.concat(monitor_debug, "; ")) + + for profile_name, profile in pairs(PROFILES) do + profile.name = profile_name or "unknown" + table.insert(profiles, profile) + end + table.sort(profiles, function(a, b) return (a.priority or 0) > (b.priority or 0) end) + + for _, profile in ipairs(profiles) do + local matches = profile.matches or {} + local has_matched = {} + for _, match in ipairs(matches) do + if starts_with(match.output, "desc:") then + table.insert(has_matched, any(monitors, function(m) return "desc:" .. m.description == match.output end)) + else + table.insert(has_matched, any(monitors, function(m) return m.name == match.output end)) + end + end + + if #has_matched == 0 then + debug_notify("Monitor profile " .. profile.name .. " is active because it does not require any matches (fallback)") + return profile + elseif all(has_matched, function(v) return v end) then + return profile + else + local failed = map(has_matched, function(v, i) + if not v then + return matches[i].output + else + return "" + end + end) + local failedmsg = table.concat(failed, " ") + debug_notify("Monitor profile " .. profile.name .. " does not match, could not match " .. failedmsg) + end + end + return nil +end + +local PROFILE_CHANGE_ONGOING = false +local PROFILE_CHANGE_RESET_TIMER = nil +local PROFILE_CHANGE_START_TIMER = nil +local POSTPROCESS_TIMER = nil + +local function apply_profile(profile) + if PROFILE_CHANGE_ONGOING then + debug_notify("Monitor profile change is inprogress (debounce)") + return + end + + if profile == nil then + debug_notify("No monitor profile available") + return + end + + debug_notify("Applying monitor profile " .. profile.name) + PROFILE_CHANGE_ONGOING = true + + -- delay application of the profile for some time, as other monitor change events might still be arriving + PROFILE_CHANGE_START_TIMER = hl.timer(function() + + -- after we have started applying our profile, we will generate monitor change events that we do not + -- want to process. Assume 5 seconds of non-interesting monitor events that we do not want to process + -- afterwards, reset the PROFILE_CHANGE_ONGOING flag for the next time we actually want to change + -- monitor profiles + PROFILE_CHANGE_RESET_TIMER = hl.timer(function() + PROFILE_CHANGE_ONGOING = false + debug_notify("Monitor Profile Change Debounce Finished") + PROFILE_CHANGE_RESET_TIMER = nil + end, { timeout = 5000, type = "oneshot" }) + + local monitors = profile.monitors + for _, monitor in ipairs(monitors) do + hl.monitor(monitor) + end + + debug_notify("Monitor Profile " .. profile.name .. " successfully applied") + + -- start any post processing + if profile.postprocess ~= nil then + POSTPROCESS_TIMER = hl.timer(function() + if profile.postprocess ~= nil then + profile.postprocess() + end + + PROFILE_CHANGE_START_TIMER = nil + POSTPROCESS_TIMER = nil + end, { timeout = 200, type = "oneshot" }) + else + PROFILE_CHANGE_START_TIMER = nil + end + end, { timeout = 500, type = "oneshot" }) +end + +local function apply_current_profile() + apply_profile(get_matching_profile()) +end + +local function force_refresh_profile() + if PROFILE_CHANGE_RESET_TIMER ~= nil then PROFILE_CHANGE_RESET_TIMER:set_enabled(false) end + if POSTPROCESS_TIMER ~= nil then POSTPROCESS_TIMER:set_enabled(false) end + if PROFILE_CHANGE_START_TIMER ~= nil then PROFILE_CHANGE_START_TIMER:set_enabled(false) end + + PROFILE_CHANGE_RESET_TIMER = nil + POSTPROCESS_TIMER = nil + PROFILE_CHANGE_START_TIMER = nil + PROFILE_CHANGE_ONGOING = false + + debug_notify("Force applying monitor profile") + refresh_monitors() + apply_current_profile() +end + +local function on_lid_close() + debug_notify("Lid was closed") + refresh_monitors() hl.monitor({ output = "eDP-1", disabled = true }) -end, { locked = true }) - -hl.bind("switch:off:Lid Switch", function() - hl.monitor({ output = "eDP-1", disabled = false }) -end, { locked = true }) +end +local function on_lid_open() + debug_notify("Lid was opened") + refresh_monitors() + apply_current_profile() +end +local function on_monitor_added(_event) + debug_notify("A monitor was added") + refresh_monitors() + apply_current_profile() +end +local function on_monitor_removed(_event) + debug_notify("A monitor was removed") + refresh_monitors() + apply_current_profile() +end +hl.bind("switch:on:Lid Switch", on_lid_close, { locked = true }) +hl.bind("switch:off:Lid Switch", on_lid_open, { locked = true }) +hl.bind("SUPER + P", function() force_refresh_profile() end, { locked = true, description = "Force Refresh Monitor Profile" }) +hl.on("monitor.added", on_monitor_added) +hl.on("monitor.removed", on_monitor_removed) +hl.on("hyprland.start", function() refresh_monitors() end) diff --git a/user/dot_config/hypr/hyprland-permissions.lua b/user/dot_config/hypr/hyprland-permissions.lua deleted file mode 100644 index c1997ce..0000000 --- a/user/dot_config/hypr/hyprland-permissions.lua +++ /dev/null @@ -1,16 +0,0 @@ - --- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Permissions/ --- Please note permission changes here require a Hyprland restart and are not applied on-the-fly --- for security reasons - --- hl.config({ --- ecosystem = { --- enforce_permissions = true, --- }, --- }) - --- hl.permission("/usr/(bin|local/bin)/grim", "screencopy", "allow") --- hl.permission("/usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland", "screencopy", "allow") --- hl.permission("/usr/(bin|local/bin)/hyprpm", "plugin", "allow") - - diff --git a/user/dot_config/hypr/hyprland-variables.lua b/user/dot_config/hypr/hyprland-variables.lua index 181e93b..1edf4a4 100644 --- a/user/dot_config/hypr/hyprland-variables.lua +++ b/user/dot_config/hypr/hyprland-variables.lua @@ -1 +1,189 @@ --- test +-- catppuccin color scheme -- +-- macchiato +local cat_macchiato_rosewater = "#f4dbd6" +local cat_macchiato_flamingo = "#f0c6c6" +local cat_macchiato_pink = "#f5bde6" +local cat_macchiato_mauve = "#c6a0f6" +local cat_macchiato_red = "#ed8796" +local cat_macchiato_maroon = "#ee99a0" +local cat_macchiato_peach = "#f5a97f" +local cat_macchiato_yellow = "#eed49f" +local cat_macchiato_green = "#a6da95" +local cat_macchiato_teal = "#8bd5ca" +local cat_macchiato_sky = "#91d7e3" +local cat_macchiato_sapphire = "#7dc4e4" +local cat_macchiato_blue = "#8aadf4" +local cat_macchiato_lavender = "#b7bdf8" +local cat_macchiato_text = "#cad3f5" +local cat_macchiato_subtext1 = "#b8c0e0" +local cat_macchiato_subtext0 = "#a5adcb" +local cat_macchiato_overlay2 = "#939ab7" +local cat_macchiato_overlay1 = "#8087a2" +local cat_macchiato_overlay0 = "#6e738d" +local cat_macchiato_surface2 = "#5b6078" +local cat_macchiato_surface1 = "#494d64" +local cat_macchiato_surface0 = "#363a4f" +local cat_macchiato_base = "#24273a" +local cat_macchiato_mantle = "#1e2030" +local cat_macchiato_crust = "#181926" + +-- colors to be used +local color_rosewater = cat_macchiato_rosewater +local color_flamingo = cat_macchiato_flamingo +local color_pink = cat_macchiato_pink +local color_mauve = cat_macchiato_mauve +local color_red = cat_macchiato_red +local color_maroon = cat_macchiato_maroon +local color_peach = cat_macchiato_peach +local color_yellow = cat_macchiato_yellow +local color_green = cat_macchiato_green +local color_teal = cat_macchiato_teal +local color_sky = cat_macchiato_sky +local color_sapphire = cat_macchiato_sapphire +local color_blue = cat_macchiato_blue +local color_lavender = cat_macchiato_lavender +local color_text = cat_macchiato_text +local color_subtext1 = cat_macchiato_subtext1 +local color_subtext0 = cat_macchiato_subtext0 +local color_overlay2 = cat_macchiato_overlay2 +local color_overlay1 = cat_macchiato_overlay1 +local color_overlay0 = cat_macchiato_overlay0 +local color_surface2 = cat_macchiato_surface2 +local color_surface1 = cat_macchiato_surface1 +local color_surface0 = cat_macchiato_surface0 +local color_base = cat_macchiato_base +local color_mantle = cat_macchiato_mantle +local color_crust = cat_macchiato_crust + +-- configuration -- +local FollowMouse = { + NEVER = 0, + ALWAYS = 1, + CLICK = 2, + SEPARATE_KEYBOARD_MOUSE_FOCUS = 3, +} +local FocusOnClose = { + NEXT = 0, + UNDER_CURSOR = 1, + MOST_RECENT = 2, +} +local DragLock = { + DISABLED = 0, + WITH_TIMEOUT = 1, + STICKY = 2, +} +local Vrr = { + OFF = 0, + ON = 1, + FULLSCREEN = 2, + FULLSCREEN_VIDEO_OR_GAME = 3, +} +local PreferHdr = { + OFF = 0, + ALWAYS = 1, + GAMES = 2 +} + +return { + input = { + kb_model = "", + kb_layout = "de", + kb_variant = "nodeadkeys", + kb_options = "compose:rwin", + kb_rules = "", + numlock_by_default = true, + scroll_method = "2fg", + natural_scroll = false, + follow_mouse = FollowMouse.ALWAYS, + follow_mouse_threshold = 10.0, + focus_on_close = FocusOnClose.MOST_RECENT, + touchpad = { + disable_while_typing = true, + natural_scroll = false, + middle_button_emulation = false, + drag_lock = DragLock.WITH_TIMEOUT, + }, + }, + general = { + border_size = 3, + gaps_in = 10, + gaps_out = 20, + float_gaps = 10, + gaps_workspaces = 0, + col = { + inactive_border = color_overlay0, + active_border = color_lavender, + nogroup_border = color_mauve, + nogroup_border_active = color_red, + }, + layout = "master", + snap = { + enabled = true, -- floating windows should snap to each other + respect_gaps = true, -- respect gaps_in when snapping + window_gap = 20, -- distance between windows before snapping + }, + }, + decoration = { + rounding = 0, + active_opacity = 1.0, + inactive_opacity = 1.0, + fullscreen_opacity = 1.0, + dim_modal = true, + dim_inactive = true, + dim_strength = 0.1, + dim_special = 0.8, + }, + group = { + col = { + border_active = color_green, + border_inactive = color_overlay0, + border_locked_active = color_green, + border_locked_inactive = color_overlay0, + }, + groupbar = { + enabled = true, + font_size = 14, + font_weight_active = "bold", + height = 18, + text_color = color_text, + text_color_locked_active = color_red, + text_color_locked_inactive = color_red, + col = { + active = color_green, + inactive = color_overlay0, + locked_active = color_red, + locked_inactive = color_overlay0, + }, + middle_click_close = false, + } + }, + master = { + mfact = 0.7, + new_status = "slave", + new_on_top = false, + new_on_active = "none", + orientation = "left", + }, + misc = { + disable_hyprland_logo = true, + disable_splash_rendering = true, + disable_scale_notification = false, + font_family = "Inter", + vrr = Vrr.FULLSCREEN_VIDEO_OR_GAME, + lockdead_screen_delay = 5000, + }, + binds = { + workspace_back_and_forth = true, + }, + cursor = { + inactive_timeout = 30, + }, + ecosystem = { + no_update_news = false, + no_donation_nag = true, + enforce_permissions = false, + }, + quirks = { + prefer_hdr = PreferHdr.OFF, + } +} diff --git a/user/dot_config/hypr/hyprland-windowrules.lua b/user/dot_config/hypr/hyprland-windowrules.lua new file mode 100644 index 0000000..52d880e --- /dev/null +++ b/user/dot_config/hypr/hyprland-windowrules.lua @@ -0,0 +1,279 @@ +--- Possible Effects on Windows +--- Static Efects +local function float() return { float = true } end +local function tile() return { tile = true } end +local function fullscreen() return { fullscreen = true } end +local FullScreenState = { + NONE = 0, + MAXMIMIZE = 1, + FULLSCREEN = 2, + MAXIMIZE_AND_FULLSCREEN = 3, +} +local function fullscreen_state(internal, client) + local internal = internal or FullScreenState.NONE + local client = client or FullScreenState.NONE + return { fullscreen_state = string.format("%d %d", internal, client) } +end +local function move(location) return { move = location } end +local function size(width, height) return { size = {width, height} } end +local function center() return { center = true } end +local function pseudo() return { pseudo = true } end +local function monitor(monitor, silent) + if silent then + monitor = monitor .. " silent" + end + return { monitor = monitor } +end +local function workspace(workspace, silent) + if silent then + workspace = workspace .. " silent" + end + return { workspace = workspace } +end +local function no_initial_focus() return { no_initial_focus = true } end +local SuppressEvents = { + FULLSCREEN = "fullscreen", + MAXIMIZE = "maximize", + ACTIVATE = "activate", + ACTIVATE_FOCUS = "activatefocus", + FULLSCREEN_OUTPUT = "fullscreenoutput", + X11_CONFIG_REQUEST = "x11configrequest", +} +local function pin() return { pin = true } end +local function group() return { group = true } end +local function suppress_event(events) + events = events or {} + return { suppress_event = table.concat(events, " ") } +end +local ContentType = { + NONE = "none", + PHOTO = "photo", + VIDEO = "video", + GAME = "game", +} +local function content(content) + return { content = content } +end +local function no_close_for(milliseconds) + return { no_close_for = milliseconds } +end +local function scrolling_width(width) + return { scrolling_width = width } +end +-- Dynamic Effects +local function no_blur() return { no_blur = true } end +local function no_dim() return { no_dim = true } end +local function no_focus() return { no_focus = true } end +local function stay_focused() return { stay_focused = true } end + +-- Matching Properties +local function matches_class(class) + return { class = class } +end + +local function matches_title(title) + return { title = title } +end +local function matches_initial_class(class) + return { initial_class = class } +end +local function matches_initial_title(title) + return { initial_title = title } +end +local function has_tag(tag) + return { tag = tag } +end +local function is_xwayland() + return { xwayland = true } +end +local function is_not_xwayland() + return { xwalyand = false } +end +local function is_float() + return { float = true } +end +local function is_tiling() + return { float = false } +end +local function is_fullscreen() + return { fullscreen = true } +end +local function is_not_fullscreen() + return { fullscreen = false } +end + +local function is_pinned() + return { pin = true } +end +local function is_not_pinned() + return { pin = false } +end +local function has_focus() + return { focus = true } +end +local function has_no_focus() + return { focus = false } +end +local function is_grouped() + return { group = true } +end +local function is_not_grouped() + return { group = false } +end +local function is_modal() + return { modal = true } +end +local function is_not_modal() + return { modal = false } +end +local function has_fullscreen_state_client(state) + return { fullscreen_state_client = state } +end +local function has_fullscreen_state_internal(state) + return { fullscreen_state_internal = state } +end +local function is_on_workspace(workspace) + return { workspace = workspace } +end + +local function has_content(content) + return { content = content } +end +local function has_xdg_tag(tag) + return { xdg_tag = tag } +end + +local function dump(t, indent) + indent = indent or 0 + local prefix = string.rep(" ", indent) + + if type(t) ~= "table" then + print(prefix .. tostring(t)) + return + end + + print(prefix .. "{") + for k, v in pairs(t) do + local key = tostring(k) + if type(v) == "table" then + print(prefix .. " " .. key .. " = ") + dump(v, indent + 1) + else + print(prefix .. " " .. key .. " = " .. tostring(v)) + end + end + print(prefix .. "}") +end + +local function rule(matches, effects) + local flat_matches = {} + for _, match in ipairs(matches) do + for k, v in pairs(match) do + flat_matches[k] = v + end + end + local args = { match = flat_matches } + for _, effect in ipairs(effects) do + for k,v in pairs(effect) do + args[k] = v + end + end + hl.window_rule(args) + debug_notify(dump(args)) +end + +-- Ignore maximize requests +rule( + { matches_class("^.*$") }, + { suppress_event({SuppressEvents.MAXIMIZE}) } +) + +-- Do not dim full screen applications +rule( + { is_fullscreen() }, + { no_dim(), no_blur() } +) + +-- Do not dim video content +rule( + { has_content(ContentType.VIDEO) }, + { no_dim(), no_blur() } +) + +-- System Utilities +rule( + { matches_class("^(org.pulseaudio.pavucontrol)$") }, + { float(), center(), size(800, 600) } +) +rule( + { matches_class("^(nm-connection-editor)$") }, + { float(), center(), size(800, 600) } +) +rule( + { matches_class("^(xdg-desktop-portal)$") }, + { float(), center(), size(800, 600) } +) +rule( + { matches_class("^(org.gnome.seahorse.Application)$") }, + { float(), center(), size(800, 600) } +) + +-- Nemo +rule( + { matches_class("^(nemo)$") }, + { float(), center(), size(1200, 700) } +) + +-- Librewolf and Firefox +rule( + { matches_class("^(firefox|librewolf)$"), matches_title("^(Picture-in-Picture)$") }, + { float() } +) +rule( + { matches_class("^(firefox|librewolf)$"), matches_title("^.*(Youtube).*$") }, + { content(ContentType.VIDEO), no_dim(), no_blur() } +) + +-- MPV +rule( + { matches_class("^(mpv)$") }, + { content(ContentType.VIDEO), no_dim(), no_blur() } +) +-- Java +rule( + { matches_class("^(net-sourceforge-jnlp-runtime-Boot)$"), matches_title("^$") }, + { float(), center() } +) +rule( + { matches_class("^$"), matches_title("^(Java)$") }, + { float(), center() } +) + +-- StellwerkSimulator +rule( + { matches_title("^(StellwerkSim Kommunikator)$") }, + { tile() } +) +rule( + { matches_class("^(java-lang-Thread|net-sourceforge-jnlp-runtime-Boot)$"), matches_title("^(BÜ Zeiten|Elementname|Verspätungsmeldung.*)$") }, + { float(), pin() } +) +rule( + { matches_class("^(java-lang-Thread|net-sourceforge-jnlp-runtime-Boot)$"), matches_title("^(Verspätungsmeldung.*)$") }, + { stay_focused() } +) +rule( + { matches_title("^(.*StellwerkSim.*)$") }, + { no_dim(), no_blur() } +) +rule( + { matches_class("^(java-lang-Thread|net-sourceforge-jnlp-runtime-Boot)$"), matches_title("^(StellwerkSim Funktionstest|Downloading...|Wirklich schlie.*)$") }, + { float(), center() } +) + +-- Qualculate +rule( + { matches_class("^(qalculate-gtk)$") }, + { float(), size(700, 600), center(), pin() } +) + diff --git a/user/dot_config/hypr/hyprland.lua b/user/dot_config/hypr/hyprland.lua index a304420..957ed67 100644 --- a/user/dot_config/hypr/hyprland.lua +++ b/user/dot_config/hypr/hyprland.lua @@ -1,31 +1,109 @@ hl.config({ autogenerated = false }) --- DMS_STARTUP_BEGIN -hl.on("hyprland.start", function() - hl.exec_cmd("dbus-update-activation-environment --systemd --all") --- hl.exec_cmd("systemctl --user start hyprland-session.target") -end) --- DMS_STARTUP_END +debug_flag = true +------------------- +---- FUNCTIONS ---- +------------------- +function debug_notify(message) + if debug_flag and message ~= nil then + -- hl.notification.create({text = message, timeout = 30000}) + hl.exec_cmd("echo '" .. message .. "' >> /tmp/hyprland-notify.log") + end +end + +function map(list, fn) + local out = {} + for i, v in ipairs(list) do + out[i] = fn(v, i) + end + return out +end + +function any(values, predicate) + if values == nil then + return false + end + + for _, value in ipairs(values) do + if predicate(value) then + return true + end + end + + return false +end + +function all(values, predicate) + return not any(values, function(v) + return not predicate(v) + end) +end + +function starts_with(haystack, needle) + if haystack == nil then + return false + elseif needle == nil then + return true + end + return string.sub(haystack, 1, #needle) == needle +end + +--------------- +---- HOOKS ---- +--------------- + +function on_start() + hl.exec_cmd("dbus-update-activation-environment --systemd --all") +end + +function submap_toast(submap) + submap = submap or hl.get_current_submap() + + if submap ~= "" then + message = "Submap: " .. submap + hl.exec_cmd("dms ipc call toast warnWith \"" .. message .. "\" \"\" \"\" submap") + else + hl.exec_cmd("dms ipc call toast dismiss submap") + end +end + +hl.on("hyprland.start", on_start) +hl.on("keybinds.submap", submap_toast) ------------------ ---- MONITORS ---- ------------------ -require("hyprland-monitors") + +-- By default, only the laptop screen is active and no other screen +-- will be actived. Activation of different monitor layouts is deferred +-- to other scripts, so to automate profile switching and provide some +-- stable fallbacks +--[[ +hl.monitor({ + output = "eDP-1", + mode = "1920x1200@120", + position = "0x0", + scale = "1", + disabled = false, +}) +]] --------------------- ---- MY PROGRAMS ---- --------------------- - --- Set programs that you use -local terminal = "kitty" -local fileManager = "dolphin" -local menu = "hyprlauncher" +programs = { + terminal = "kitty", + explorer = "nemo", + menu = "dms ipc call launcher toggle", + browser = "librewolf", + calculator = "qalculate-gtk", +} ------------------- ---- Variables ---- ------------------- -require("hyprland-variables") +local vars = require("hyprland-variables") ------------------- ---- AUTOSTART ---- @@ -37,58 +115,10 @@ require("hyprland-autostart") ------------------------------- require("hyprland-environment-variables") ------------------------ ------ PERMISSIONS ----- ------------------------ -require("hyprland-permissions") - ----------------------- ---- LOOK AND FEEL ---- ----------------------- - - -hl.config({ - input = { - -- empty inherits XKB_DEFAULT_LAYOUT (libxkbcommon), falls back to "us" - kb_layout = "de", - numlock_by_default = true, - follow_mouse = 0, - touchpad = { - tap_to_click = true, - natural_scroll = true, - }, - }, - general = { - gaps_in = 5, - gaps_out = 5, - border_size = 2, - layout = "dwindle", - }, - decoration = { - rounding = 12, - active_opacity = 1.0, - inactive_opacity = 1.0, - shadow = { - enabled = true, - range = 30, - render_power = 5, - offset = "0 5", - color = "rgba(00000070)", - }, - }, - misc = { - disable_hyprland_logo = true, - disable_splash_rendering = true, - key_press_enables_dpms = true, - mouse_move_enables_dpms = true, - }, - dwindle = { - preserve_split = true, - }, - master = { - mfact = 0.5, - }, -}) +hl.config(vars) hl.animation({ leaf = "windowsIn", enabled = true, speed = 3, bezier = "default" }) hl.animation({ leaf = "windowsOut", enabled = true, speed = 3, bezier = "default" }) @@ -97,35 +127,28 @@ hl.animation({ leaf = "windowsMove", enabled = true, speed = 4, bezier = "defaul hl.animation({ leaf = "fade", enabled = true, speed = 3, bezier = "default" }) hl.animation({ leaf = "border", enabled = true, speed = 3, bezier = "default" }) -hl.window_rule({ match = { class = "^(org\\.wezfurlong\\.wezterm)$" }, tile = true }) -hl.window_rule({ match = { class = "^(org\\.gnome\\.)" }, rounding = 12 }) -hl.window_rule({ match = { class = "^(gnome-control-center)$" }, tile = true }) -hl.window_rule({ match = { class = "^(pavucontrol)$" }, tile = true }) -hl.window_rule({ match = { class = "^(nm-connection-editor)$" }, tile = true }) -hl.window_rule({ match = { class = "^(org\\.gnome\\.Calculator)$" }, float = true }) -hl.window_rule({ match = { class = "^(gnome-calculator)$" }, float = true }) -hl.window_rule({ match = { class = "^(galculator)$" }, float = true }) -hl.window_rule({ match = { class = "^(blueman-manager)$" }, float = true }) -hl.window_rule({ match = { class = "^(org\\.gnome\\.Nautilus)$" }, float = true }) -hl.window_rule({ match = { class = "^(xdg-desktop-portal)$" }, float = true }) -hl.window_rule({ - match = { class = "^(steam)$", title = "^(notificationtoasts)" }, - no_initial_focus = true, - pin = true, -}) -hl.window_rule({ - match = { class = "^(firefox)$", title = "^(Picture-in-Picture)$" }, - float = true, -}) -hl.window_rule({ match = { class = "^(zoom)$" }, float = true }) +------------------ +---- KEYBINDS ---- +------------------ +require("hyprland-binds") + +---------------------- +---- WINDOW RULES ---- +---------------------- +require("hyprland-windowrules") hl.layer_rule({ match = { namespace = "^(quickshell)$" }, no_anim = true }) hl.layer_rule({ match = { namespace = "^dms:.*" }, no_anim = true }) -require("dms.colors") ---require("dms.outputs") -require("dms.layout") -require("dms.cursor") -require("dms.binds") -require("dms.binds-user") -require("dms.windowrules") +------------------ +---- MONITORS ---- +------------------ require("hyprland-monitors") + + +-- require("dms.colors") +-- require("dms.outputs") +-- require("dms.layout") +-- require("dms.cursor") +-- require("dms.binds") +-- require("dms.binds-user") +-- require("dms.windowrules") diff --git a/user/dot_config/kitty/dank-theme.conf b/user/dot_config/kitty/dank-theme.conf new file mode 100644 index 0000000..2587bcf --- /dev/null +++ b/user/dot_config/kitty/dank-theme.conf @@ -0,0 +1,24 @@ +cursor #e0e2e8 +cursor_text_color #c2c7cf + +foreground #e0e2e8 +background #101418 +selection_foreground #243240 +selection_background #b9c8da +url_color #9dcbfb +color0 #101418 +color1 #d75a59 +color2 #8ed88c +color3 #e0d99d +color4 #4087bc +color5 #839fbc +color6 #9dcbfb +color7 #abb2bf +color8 #5c6370 +color9 #e57e7e +color10 #a2e5a0 +color11 #efe9b3 +color12 #a7d9ff +color13 #3d8197 +color14 #5c7ba3 +color15 #ffffff diff --git a/user/dot_config/nwg-look/config b/user/dot_config/nwg-look/config new file mode 100644 index 0000000..50cd4cf --- /dev/null +++ b/user/dot_config/nwg-look/config @@ -0,0 +1,10 @@ +{ + "export-settings-ini": true, + "export-gtkrc-20": true, + "export-index-theme": true, + "export-xsettingsd": true, + "export-gtk4-symlinks": true, + "flatpak-export-gtk-theme-override": false, + "flatpak-export-icon-theme-override": false, + "flatpak-install-current-gtk-theme": false +} \ No newline at end of file diff --git a/user/dot_config/qalculate/qalculate-gtk.cfg b/user/dot_config/qalculate/qalculate-gtk.cfg new file mode 100644 index 0000000..e96589b --- /dev/null +++ b/user/dot_config/qalculate/qalculate-gtk.cfg @@ -0,0 +1,149 @@ + +[General] +version=5.12.0 +allow_multiple_instances=0 +width=718 +always_on_top=0 +enable_tooltips=1 +error_info_shown=0 +save_mode_on_exit=1 +save_definitions_on_exit=1 +save_history_separately=0 +auto_update_exchange_rates=-1 +clear_history_on_exit=0 +history_expression_type=2 +use_custom_history_font=0 +use_custom_expression_font=0 +replace_expression=0 +enable_completion=1 +enable_completion2=1 +completion_min=1 +completion_min2=1 +completion_delay=0 +use_custom_status_font=0 +vertical_button_padding=-1 +horizontal_button_padding=-1 +use_custom_keypad_font=0 +latest_button_currency=EUR +use_custom_result_font=0 +continuous_conversion=1 +set_missing_prefixes=0 +show_bases_keypad=1 +keep_function_dialog_open=0 +ignore_locale=0 +load_global_definitions=1 +local_currency_conversion=1 +use_binary_prefixes=0 +check_version=0 +show_keypad=1 +show_history=0 +history_height=0 +minimal_width=500 +show_stack=1 +show_convert=0 +persistent_keypad=0 +minimal_mode=0 +rpn_keys=1 +display_expression_status=1 +parsed_expression_in_resultview=0 +calculate_as_you_type_history_delay=2000 +use_unicode_signs=1 +lower_case_numbers=0 +duodecimal_symbols=0 +exp_display=3 +imaginary_j=0 +base_display=1 +twos_complement=1 +hexadecimal_twos_complement=0 +twos_complement_input=0 +hexadecimal_twos_complement_input=0 +spell_out_logical_operators=1 +caret_as_xor=0 +close_with_esc=-1 +digit_grouping=1 +copy_ascii=0 +copy_ascii_without_units=0 +decimal_comma=-1 +dot_as_separator=-1 +comma_as_separator=0 +use_custom_application_font=0 +multiplication_sign=2 +division_sign=1 +recent_functions= +recent_variables= +recent_units= + +[Mode] +min_deci=0 +use_min_deci=0 +max_deci=2 +use_max_deci=0 +precision=10 +interval_arithmetic=1 +interval_display=0 +min_exp=-1 +negative_exponents=0 +sort_minus_last=1 +number_fraction_format=0 +complex_number_form=0 +use_prefixes=1 +use_prefixes_for_all_units=0 +use_prefixes_for_currencies=0 +abbreviate_names=1 +all_prefixes_enabled=0 +denominator_prefix_enabled=1 +place_units_separately=1 +auto_post_conversion=3 +mixed_units_conversion=3 +number_base=10 +number_base_expression=10 +read_precision=0 +assume_denominators_nonzero=1 +warn_about_denominators_assumed_nonzero=1 +structuring=1 +angle_unit=1 +functions_enabled=1 +variables_enabled=1 +calculate_functions=1 +calculate_variables=1 +variable_units_enabled=1 +sync_units=1 +unknownvariables_enabled=0 +units_enabled=1 +allow_complex=1 +allow_infinite=1 +indicate_infinite_series=0 +show_ending_zeroes=1 +rounding_mode=0 +approximation=1 +interval_calculation=1 +concise_uncertainty_input=0 +calculate_as_you_type=1 +in_rpn_mode=0 +chain_mode=0 +limit_implicit_multiplication=0 +parsing_mode=0 +simplified_percentage=-1 +spacious=1 +excessive_parenthesis=0 +visible_keypad=0 +short_multiplication=1 +default_assumption_type=4 +default_assumption_sign=0 + +[Plotting] +plot_legend_placement=2 +plot_style=0 +plot_smoothing=0 +plot_display_grid=1 +plot_full_border=0 +plot_min=0 +plot_max=10 +plot_step=1 +plot_sampling_rate=1001 +plot_use_sampling_rate=1 +plot_variable=x +plot_rows=0 +plot_type=0 +plot_color=1 +plot_linewidth=2 diff --git a/user/dot_config/qt5ct/qt5ct.conf b/user/dot_config/qt5ct/qt5ct.conf new file mode 100644 index 0000000..47285a2 --- /dev/null +++ b/user/dot_config/qt5ct/qt5ct.conf @@ -0,0 +1,2 @@ +[Appearance] +icon_theme=Papirus-Dark diff --git a/user/dot_config/qt6ct/colors/.keep b/user/dot_config/qt6ct/colors/.keep new file mode 100644 index 0000000..e69de29 diff --git a/user/dot_config/qt6ct/qss/.keep b/user/dot_config/qt6ct/qss/.keep new file mode 100644 index 0000000..e69de29 diff --git a/user/dot_config/qt6ct/qt6ct.conf b/user/dot_config/qt6ct/qt6ct.conf new file mode 100644 index 0000000..91f561f --- /dev/null +++ b/user/dot_config/qt6ct/qt6ct.conf @@ -0,0 +1,5 @@ +[SettingsWindow] +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x4\x13\0\0\x2l\0\0\0\0\0\0\0\0\0\0\x4\x13\0\0\x2l\0\0\0\x1\x2\0\0\0\rp\0\0\0\0\0\0\0\0\0\0\x4\x13\0\0\x2l) + +[Appearance] +icon_theme=Papirus-Dark diff --git a/user/dot_config/quickshell/.keep b/user/dot_config/quickshell/.keep new file mode 100644 index 0000000..e69de29 diff --git a/user/dot_config/uwsm/env b/user/dot_config/uwsm/env new file mode 100644 index 0000000..2a5bd0a --- /dev/null +++ b/user/dot_config/uwsm/env @@ -0,0 +1,2 @@ +export XCURSOR_THEME="Breeze_Light" +export XCURSOR_SIZE="24" diff --git a/user/dot_config/uwsm/env-hyprland b/user/dot_config/uwsm/env-hyprland new file mode 100644 index 0000000..48a8006 --- /dev/null +++ b/user/dot_config/uwsm/env-hyprland @@ -0,0 +1,2 @@ +export HYPRCURSOR_THEME="Breeze_Light" +export HYPRCURSOR_SIZE="24" diff --git a/user/dot_config/xdg-terminals.list b/user/dot_config/xdg-terminals.list new file mode 100644 index 0000000..f53f3ca --- /dev/null +++ b/user/dot_config/xdg-terminals.list @@ -0,0 +1 @@ +kitty.desktop