Compare commits

...

12 Commits

Author SHA1 Message Date
jasonhilder 8c06125493 Really never ends. 2026-07-03 10:45:31 +02:00
jasonhilder d7863ed010 Its just dotfiles... 2026-07-03 09:28:42 +02:00
jasonhilder 5bb60e1a35 Getting old now... 2026-07-03 08:13:08 +02:00
jasonhilder 00d3b3c3d9 Testing new remote 2026-07-02 10:17:39 +02:00
jasonhilder 379e008024 Added overlay for rofi menus 2026-07-02 08:21:47 +02:00
jasonhilder e1c3745f3b Awesomewm config into modules. 2026-07-02 07:44:28 +02:00
jasonhilder 1a49af00cc Awesome updates.
Setup naughty for the notification manager.
Stoped default notification service.
Made better rules for window placement.
2026-07-02 07:06:06 +02:00
jasonhilder d3c89f89f6 Rofi scripts for extra menus 2026-07-02 07:04:59 +02:00
jasonhilder ccd02e718b Cleanup/updates for new software.
Dropped xfwm for awesomewm
Themed it accordingly, theme, icons, cursor, rofi
Cleaned up picom for awesome and made better animations
Install script cleanup and removed unneeded tools
2026-07-01 10:31:20 +02:00
jasonhilder 179f2a10fe Cleanup, no longer in use config + scripts. 2026-07-01 10:06:05 +02:00
jasonhilder befd7d745c Update for rofi corner radius. 2026-06-24 10:36:26 +02:00
jasonhilder 59752bb8d4 Updates to lackluster theme, newline/space cleanup 2026-06-24 10:35:48 +02:00
27 changed files with 999 additions and 634 deletions
+1 -2
View File
@@ -2,7 +2,6 @@ config/fish/conf.d
config/fish/functions config/fish/functions
config/fish/fish_variables config/fish/fish_variables
config/nvim/nvim-pack-lock.json config/nvim/nvim-pack-lock.json
config/alacritty/dank-theme.toml config/awesome/bling
scripts/bin/Obsidian scripts/bin/Obsidian
scripts/bin/ols scripts/bin/ols
+2 -2
View File
@@ -93,5 +93,5 @@ These are not run automatically by `install.sh` — they are opt-in.
--- ---
This setup prioritises **stability** and **simplicity** over customisation. Void Linux + XFCE4 + X11 This setup prioritises **stability** and **simplicity** over customisation.
provides a fast, predictable base with minimal moving parts. Void Linux + XFCE4 + X11 provides a fast, predictable base with minimal moving parts.
+2 -2
View File
@@ -1,7 +1,7 @@
[general] [general]
[font] [font]
size = 13 size = 12
offset = { x = 0, y = 3 } offset = { x = 0, y = 3 }
normal = { family = "JetBrainsMono Nerd Font", style = "Regular" } normal = { family = "JetBrainsMono Nerd Font", style = "Regular" }
@@ -16,7 +16,7 @@ style.blinking = "Always"
# Kanagawa Wave Alacritty Colors # Kanagawa Wave Alacritty Colors
[colors.primary] [colors.primary]
background = '#141415' background = '#101010'
foreground = '#dcd7ba' foreground = '#dcd7ba'
[colors.normal] [colors.normal]
+116
View File
@@ -0,0 +1,116 @@
local awful = require("awful")
local gears = require("gears")
local wibox = require("wibox")
local beautiful = require("beautiful")
local colors = require("config.colors")
local widgets = require("config.widgets")
local M = {}
local taglist_buttons = gears.table.join(
awful.button({ }, 1, function(t) t:view_only() end),
awful.button({ modkey }, 1, function(t) if client.focus then client.focus:move_to_tag(t) end end),
awful.button({ }, 3, awful.tag.viewtoggle)
)
local function set_wallpaper(s)
if beautiful.wallpaper then
local wp = beautiful.wallpaper
if type(wp) == "function" then wp = wp(s) end
gears.wallpaper.maximized(wp, s, true)
end
end
screen.connect_signal("property::geometry", set_wallpaper)
function M.setup()
awful.screen.connect_for_each_screen(function(s)
set_wallpaper(s)
awful.tag({ "1", "2", "3", "4", "5" }, s, awful.layout.layouts[1])
s.mypromptbox = awful.widget.prompt()
s.mylayoutbox = awful.widget.layoutbox(s)
s.mylayoutbox:buttons(gears.table.join(
awful.button({ }, 1, function() awful.layout.inc(1) end),
awful.button({ }, 3, function() awful.layout.inc(-1) end)
))
s.mytaglist = awful.widget.taglist {
screen = s, filter = awful.widget.taglist.filter.all, buttons = taglist_buttons,
style = { shape = function(cr, w, h) gears.shape.rounded_rect(cr, w, h, 4) end },
layout = { spacing = 4, layout = wibox.layout.fixed.horizontal },
widget_template = {
{ { id = "text_role", widget = wibox.widget.textbox }, left = 10, right = 10, top = 4, bottom = 4, widget = wibox.container.margin },
id = "background_role", widget = wibox.container.background,
},
}
-- Per-screen monitor widgets (created here so multi-monitor stays valid)
local title = widgets.make_title()
local vol = widgets.make_vol()
local cpu = widgets.make_cpu()
local brightness = widgets.make_brightness()
local clock = wibox.widget.textclock("%Y-%m-%d %H:%M")
local right = wibox.layout.fixed.horizontal()
local function push(w) right:add(widgets.padded(w, 4, 4)) end
push(wibox.widget.systray()); right:add(widgets.sep())
push(vol); right:add(widgets.sep())
push(cpu); right:add(widgets.sep())
push(clock);
push(brightness);
push(s.mylayoutbox)
s.mywibox = awful.wibar {
position = "top", screen = s, height = 45, bg = colors.background, fg = colors.white,
shape = function(cr, w, h) gears.shape.rounded_rect(cr, w, h, 0) end,
}
s.mywibox:setup {
layout = wibox.container.margin, left = 8, right = 8, top = 10, bottom = 10,
{
layout = wibox.layout.align.horizontal,
{ -- Left: workspaces + focused window title
layout = wibox.layout.fixed.horizontal,
widgets.padded(s.mytaglist, 8, 4), s.mypromptbox,
{ title, left = 18, widget = wibox.container.margin },
},
nil, -- empty center
widgets.padded(right, 4, 12),
}
}
end)
-- Overlay for rofi launchers
local dim_overlay = wibox({
visible = false,
ontop = true,
type = "splash",
bg = "#00000099",
})
dim_overlay.name = "awesome_dim_overlay"
awful.screen.connect_for_each_screen(function(s)
dim_overlay.screen = s -- adjust if you want it per-screen vs spanning all
end)
-- span the primary screen's geometry (or loop over all screens if you use a multi-monitor dim)
local function update_dim_geometry()
local geo = screen.primary.geometry
dim_overlay:geometry(geo)
end
update_dim_geometry()
screen.connect_signal("property::geometry", update_dim_geometry)
-- expose functions over awesome-client
_G.show_dim = function() dim_overlay.visible = true end
_G.hide_dim = function() dim_overlay.visible = false end
-- Prime the window so X/picom register its type before first real use,
-- avoiding a one-time grow animation on the very first show_dim() call
dim_overlay.visible = true
gears.timer.delayed_call(function()
dim_overlay.visible = false
end)
end
return M
+12
View File
@@ -0,0 +1,12 @@
return {
background = "#111111",
background_alt = "#1a1a1a",
foreground = "#dcd7ba", -- kanagawa foreground
accent = "#6a9589", -- black (bright) - muted gray, same role as old #6e6e6e
accent_alt = "#7fb4ca", -- blue (normal) - crystalBlue
red = "#e82424", -- red (bright) - samuraiRed, vivid
green = "#98bb6c", -- green (bright) - springGreen
yellow = "#e6c384", -- yellow (bright) - carpYellow
disabled = "#6a9589", -- cyan (normal) - muted, low-contrast
white = "#ffffff", -- white (normal) - dimmer than foreground
}
+85
View File
@@ -0,0 +1,85 @@
local awful = require("awful")
local gears = require("gears")
local hotkeys_popup = require("awful.hotkeys_popup")
local menubar = require("menubar")
local M = {}
M.globalkeys = gears.table.join(
awful.key({ modkey }, "s", hotkeys_popup.show_help, { description = "show help", group = "awesome" }),
-- Directional focus (vim keys)
awful.key({ modkey }, "h", function() awful.client.focus.bydirection("left") end, { description = "focus left", group = "client" }),
awful.key({ modkey }, "j", function() awful.client.focus.bydirection("down") end, { description = "focus down", group = "client" }),
awful.key({ modkey }, "k", function() awful.client.focus.bydirection("up") end, { description = "focus up", group = "client" }),
awful.key({ modkey }, "l", function() awful.client.focus.bydirection("right") end, { description = "focus right", group = "client" }),
-- Directional move (swap clients in the tiling layout)
awful.key({ modkey, "Control" }, "h", function() awful.client.swap.bydirection("left") end, { description = "move left", group = "client" }),
awful.key({ modkey, "Control" }, "j", function() awful.client.swap.bydirection("down") end, { description = "move down", group = "client" }),
awful.key({ modkey, "Control" }, "k", function() awful.client.swap.bydirection("up") end, { description = "move up", group = "client" }),
awful.key({ modkey, "Control" }, "l", function() awful.client.swap.bydirection("right") end, { description = "move right", group = "client" }),
-- Resize the master/other split
awful.key({ modkey, "Shift" }, "h", function() awful.tag.incmwfact(-0.05) end, { description = "shrink master", group = "layout" }),
awful.key({ modkey, "Shift" }, "l", function() awful.tag.incmwfact( 0.05) end, { description = "grow master", group = "layout" }),
-- Launching / layout
awful.key({ modkey }, "Return", function() awful.spawn(terminal) end, { description = "open a terminal", group = "launcher" }),
awful.key({ modkey }, "e", function() awful.spawn("thunar") end, { description = "Filemanager", group = "system" }),
awful.key({ modkey }, "w", function() awful.layout.inc(1) end, { description = "next layout", group = "layout" }),
-- screenshooter
awful.key({ modkey, "Control" }, "p", function() awful.spawn("xfce4-screenshooter") end, { description = "screenshot", group = "system" }),
-- Alt tab current workspace windows
awful.key({ "Mod1" }, "Tab", function() awful.client.focus.byidx(1) end),
-- Media keys
awful.key({ }, "XF86AudioRaiseVolume", function() awful.spawn.easy_async_with_shell([[sh -c 'pactl set-sink-volume "$(pactl get-default-sink)" +2%']]) end, { description = "volume up", group = "media" }),
awful.key({ }, "XF86AudioLowerVolume", function() awful.spawn.easy_async_with_shell([[sh -c 'pactl set-sink-volume "$(pactl get-default-sink)" -2%']]) end, { description = "volume down", group = "media" }),
awful.key({ }, "XF86AudioMute", function() awful.spawn.easy_async_with_shell([[sh -c 'pactl set-sink-mute "$(pactl get-default-sink)" toggle']]) end, { description = "toggle mute", group = "media" }),
-- rofi menus
awful.key({ modkey }, "space", function() awful.spawn("/home/jason/.local/bin/runrofi") end, { description = "application launcher", group = "launcher" }),
awful.key({ modkey }, "`", function() awful.spawn("/home/jason/.local/bin/powermenu") end, { description = "power menu", group = "system" }),
awful.key({ modkey }, "a", function() awful.spawn("/home/jason/.local/bin/audioswitch") end, { description = "audio output", group = "system" }),
awful.key({ modkey }, "b", function () awful.spawn("/home/jason/.local/bin/bookmarks") end, {description = "bookmarks", group = "internet"}),
-- Awesome control
awful.key({ modkey, "Control" }, "r", awesome.restart, { description = "reload awesome", group = "awesome" })
)
-- Workspace keys 1..5: Alt+N view, Alt+Shift+N move client to tag
for i = 1, 5 do
M.globalkeys = gears.table.join(M.globalkeys,
awful.key({ modkey }, "#" .. i + 9, function()
local screen = awful.screen.focused()
local tag = screen.tags[i]
if tag then tag:view_only() end
end, { description = "view tag #" .. i, group = "tag" }),
awful.key({ modkey, "Control" }, "#" .. i + 9, function()
if client.focus then
local tag = client.focus.screen.tags[i]
if tag then client.focus:move_to_tag(tag) end
end
end, { description = "move focused client to tag #" .. i, group = "tag" })
)
end
M.clientkeys = gears.table.join(
awful.key({ modkey }, "q", function(c) c:kill() end, { description = "kill window", group = "client" }),
awful.key({ modkey }, "f", function(c) c.fullscreen = not c.fullscreen; c:raise() end, { description = "toggle fullscreen", group = "client" }),
awful.key({ modkey }, "m", function(c) c:swap(awful.client.getmaster()) end, { description = "make master", group = "client" }),
awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle, { description = "toggle floating", group = "client" })
)
M.clientbuttons = gears.table.join(
awful.button({ }, 1, function(c) c:emit_signal("request::activate", "mouse_click", { raise = true }) end),
awful.button({ modkey }, 1, function(c) c:emit_signal("request::activate", "mouse_click", { raise = true }); awful.mouse.client.move(c) end),
awful.button({ modkey }, 3, function(c) c:emit_signal("request::activate", "mouse_click", { raise = true }); awful.mouse.client.resize(c) end)
)
return M
+20
View File
@@ -0,0 +1,20 @@
local awful = require("awful")
local beautiful = require("beautiful")
local keys = require("config.keys")
return {
{ rule = { }, properties = {
border_width = beautiful.border_width, border_color = beautiful.border_normal,
focus = awful.client.focus.filter, raise = true,
keys = keys.clientkeys, buttons = keys.clientbuttons,
screen = awful.screen.preferred,
placement = awful.placement.no_overlap + awful.placement.no_offscreen,
}},
{ rule_any = {
instance = { "pinentry" },
class = { "Arandr", "Blueman-manager", "Gpick", "Pavucontrol" },
name = { "Event Tester" },
role = { "AlarmWindow", "pop-up" },
}, properties = { floating = true }},
}
+27
View File
@@ -0,0 +1,27 @@
local gears = require("gears")
local awful = require("awful")
local beautiful = require("beautiful")
client.connect_signal("manage", function(c)
if awesome.startup and not c.size_hints.user_position and not c.size_hints.program_position then
awful.placement.no_offscreen(c)
end
-- New windows open into the stack (to the right); first window becomes master.
if not awesome.startup then awful.client.setslave(c) end
-- 0 or ie 13 = corner radius
c.shape = function(cr, width, height) gears.shape.rounded_rect(cr, width, height, 0) end
end)
client.connect_signal("property::floating", function(c)
if c.floating and c.type ~= "notification" then awful.placement.centered(c, { honor_workarea = true }) end
end)
client.connect_signal("manage", function(c)
if c.floating and c.type ~= "notification" then awful.placement.centered(c, { honor_workarea = true }) end
end)
-- Focus follows mouse (i3-like). Comment out for click-to-focus only.
client.connect_signal("mouse::enter", function(c) c:emit_signal("request::activate", "mouse_enter", { raise = false }) end)
client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end)
client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end)
+47
View File
@@ -0,0 +1,47 @@
local gears = require("gears")
local beautiful = require("beautiful")
local naughty = require("naughty")
local colors = require("config.colors")
beautiful.init(gears.filesystem.get_themes_dir() .. "default/theme.lua")
beautiful.useless_gap = 8
beautiful.gap_single_client = true
beautiful.font = "JetBrainsMono Nerd Font 11"
beautiful.border_width = 4
beautiful.border_normal = colors.background_alt
beautiful.border_focus = colors.accent
beautiful.taglist_bg_focus = colors.accent
beautiful.taglist_fg_focus = colors.background
beautiful.taglist_fg_occupied = colors.accent
beautiful.taglist_bg_occupied = colors.background
beautiful.taglist_fg_empty = colors.white
beautiful.taglist_bg_empty = colors.background
beautiful.taglist_bg_urgent = colors.red
beautiful.taglist_fg_urgent = colors.background
beautiful.bg_systray = colors.background
beautiful.systray_icon_spacing = 4
-- Notifications, styled to match the wibar/client theme
naughty.config.defaults.position = "top_right"
naughty.config.defaults.timeout = 5
naughty.config.padding = 12
naughty.config.defaults.margin = 12
naughty.config.defaults.spacing = 8
naughty.config.defaults.icon_size = 48
naughty.config.defaults.border_width = 3
naughty.config.defaults.font = "JetBrainsMono Nerd Font 12"
naughty.config.defaults.shape = function(cr, w, h) gears.shape.rounded_rect(cr, w, h, 13) end
naughty.config.presets.normal = {
bg = colors.background, fg = colors.foreground, border_color = colors.background_alt,
border_width = 3, font = "JetBrainsMono Nerd Font 12", timeout = 5,
}
naughty.config.presets.low = naughty.config.presets.normal
naughty.config.presets.critical = {
bg = colors.background, fg = colors.red, border_color = colors.red,
border_width = 3, font = "JetBrainsMono Nerd Font 12", timeout = 0, -- stays until dismissed
}
+118
View File
@@ -0,0 +1,118 @@
local awful = require("awful")
local gears = require("gears")
local wibox = require("wibox")
local colors = require("config.colors")
local M = {}
-- "ICON value" with ICON tinted accent, like polybar's *-prefix-foreground.
function M.label(icon, val)
return string.format("<span foreground='%s'>%s</span> %s", colors.white, icon, val or "")
end
-- A slim separator in the disabled color, like polybar's separator.
function M.sep()
local w = wibox.widget.textbox()
w.markup = string.format("<span foreground='%s00'> </span>", colors.disabled)
return w
end
-- Wrap a widget in a small margin so bar modules aren't crammed together.
function M.padded(w, left, right)
return wibox.container.margin(w, left or 8, right or 8)
end
-- Focused window title (polybar xwindow / %title%)
function M.make_title()
local t = wibox.widget.textbox()
local function update()
local c = client.focus
t.markup = c and string.format("<span foreground='%s'>%s</span>", colors.white, gears.string.xml_escape(c.name or "")) or ""
end
client.connect_signal("focus", update)
client.connect_signal("unfocus", update)
client.connect_signal("property::name", update)
return t
end
-- CPU usage % (two top samples so the reading is accurate)
function M.make_cpu()
return awful.widget.watch(
{ "bash", "-c", [[LANG=C top -bn2 -d0.3 | grep -m2 '^%Cpu' | tail -1 | awk '{printf "%.0f", 100 - $8}']] },
3, function(w, out) w.markup = M.label("<span font_size='large'> </span>", out:gsub("%s+$", "") .. "%") end)
end
-- Volume: click to mute, scroll to adjust, right-click for the mixer.
-- Keeps its own refresh() so button presses update instantly instead of
-- waiting on the polling timer.
function M.make_vol()
local w = wibox.widget.textbox()
local vol_script = [[
sink=$(LANG=C pactl get-default-sink 2>/dev/null)
m=$(LANG=C pactl get-sink-mute "$sink" 2>/dev/null | grep -oE 'yes|no')
v=$(LANG=C pactl get-sink-volume "$sink" 2>/dev/null | grep -oE '[0-9]+%' | head -n1)
echo "$m $v"
]]
local function shell_quote(s) return "'" .. s:gsub("'", "'\\''") .. "'" end
local vol_cmd = "sh -c " .. shell_quote(vol_script)
local function refresh()
awful.spawn.easy_async_with_shell(vol_cmd, function(out)
local muted, pct = out:match("(%a+)%s+(%d+)%%")
if muted == nil and pct == nil then
w.markup = string.format("<span foreground='%s'><span font_size='large'>󱄠</span> n/a</span>", colors.disabled)
return
end
muted = muted == "yes"
pct = pct or "0"
w.markup = muted and string.format("<span foreground='%s'>MUTE</span>", colors.yellow) or M.label("<span font_size='large'>󱄠</span>", pct .. "%")
end)
end
w:buttons(gears.table.join(
awful.button({ }, 1, function() awful.spawn("/home/jason/.local/bin/audioswitch") end),
awful.button({ }, 3, function() awful.spawn.easy_async_with_shell([[sh -c 'pactl set-sink-mute "$(pactl get-default-sink)" toggle']], function() refresh() end) end),
awful.button({ }, 4, function() awful.spawn.easy_async_with_shell([[sh -c 'pactl set-sink-volume "$(pactl get-default-sink)" +2%']], function() refresh() end) end),
awful.button({ }, 5, function() awful.spawn.easy_async_with_shell([[sh -c 'pactl set-sink-volume "$(pactl get-default-sink)" -2%']], function() refresh() end) end)
))
gears.timer { timeout = 2, call_now = true, autostart = true, callback = refresh }
return w
end
-- Brightness: click to toggle between night (default gamma) and day (boosted).
function M.make_brightness()
local OUTPUT = "HDMI-A-0"
local DAY_CMD = "xrandr --output " .. OUTPUT .. " --set CTM \"1.1,0,0,0,1.1,0,0,0,1.1\" --gamma 1.08:1.08:1.08"
local NIGHT_CMD = "xrandr --output " .. OUTPUT .. " --set CTM \"1,0,0,0,1,0,0,0,1\" --gamma 1.0:1.0:1.0"
local w = wibox.widget.textbox()
local is_day = true
local function render()
local icon = is_day and " 󱁞 " or " 󱠩 "
w.markup = string.format(
"<span font_family='JetBrainsMono Nerd Font' foreground='%s' font_size='large'>%s</span>",
colors.white, icon
)
end
local function apply(day)
local cmd = day and DAY_CMD or NIGHT_CMD
awful.spawn.easy_async_with_shell(cmd, function()
is_day = day
render()
end)
end
w:buttons(gears.table.join(
awful.button({ }, 1, function() apply(not is_day) end)
))
apply(true)
return w
end
return M
+52
View File
@@ -0,0 +1,52 @@
pcall(require, "luarocks.loader")
local gears = require("gears")
local awful = require("awful")
require("awful.autofocus")
local naughty = require("naughty")
local bling = require("bling")
-- Global config
modkey = "Mod1" -- Alt. Use "Mod4" for the Super/Windows key.
terminal = "alacritty"
editor = os.getenv("EDITOR") or "nano"
-- Layouts: suit.tile = master column LEFT, stack column RIGHT.
awful.layout.layouts = { awful.layout.suit.tile, awful.layout.suit.max }
-- Kill xfce4-notifyd on startup (with a short delay + retry, in case it
-- hasn't started yet at this point in the session)
awful.spawn.easy_async_with_shell("pkill xfce4-notifyd", function() end)
gears.timer.start_new(3, function()
awful.spawn.easy_async_with_shell("pkill xfce4-notifyd", function() end)
return false -- don't repeat
end)
-- Error handling
if awesome.startup_errors then
naughty.notify({ preset = naughty.config.presets.critical, title = "Error during startup", text = awesome.startup_errors })
end
do
local in_error = false
awesome.connect_signal("debug::error", function(err)
if in_error then return end
in_error = true
naughty.notify({ preset = naughty.config.presets.critical, title = "An error happened", text = tostring(err) })
in_error = false
end)
end
-- Modules (order matters: theme before bar, keys before rules)
require("config.theme")
local keys = require("config.keys")
require("config.bar").setup()
root.keys(keys.globalkeys)
awful.rules.rules = require("config.rules")
require("config.signals")
-- Wallpaper
bling.module.wallpaper.setup {
wallpaper = { "/home/jason/Pictures/Wallpapers/farewell.jpg" },
position = "fit",
background = "#181818",
}
+2 -1
View File
@@ -87,12 +87,13 @@ alias bat='bat --theme="ansi" --paging=never'
# Application shortcuts # Application shortcuts
alias vi='nvim' alias vi='nvim'
alias :q='exit' alias :q='exit'
alias lg='lazygit'
alias files='thunar .' alias files='thunar .'
alias fetch='pfetch' alias fetch='pfetch'
# Custom shortcuts # Custom shortcuts
alias reload='source ~/.config/fish/config.fish' alias reload='source ~/.config/fish/config.fish'
alias dotf='cd ~/.dotfiles' alias dots='cd ~/.dotfiles && nvim'
alias doti='bash ~/.dotfiles/install.sh -i' alias doti='bash ~/.dotfiles/install.sh -i'
alias dotl='bash ~/.dotfiles/install.sh -l' alias dotl='bash ~/.dotfiles/install.sh -l'
alias myip='curl ipinfo.io/ip; echo ""' alias myip='curl ipinfo.io/ip; echo ""'
-8
View File
@@ -1,8 +0,0 @@
[general]
always_show_help.enabled = true
collapsed_sections = ["staged_changes"]
refresh_on_file_change.enabled = true
stash_list_limit = 20
recent_commits_limit = 100
mouse_support = true
mouse_scroll_lines = 3
+5 -25
View File
@@ -1,10 +1,6 @@
require("vim._core.ui2").enable({}) require("vim._core.ui2").enable({})
map = vim.keymap.set map = vim.keymap.set
vim.g.termguicolors = true vim.o.termguicolors = true
vim.g.netrw_keepdir = 1
vim.g.netrw_winsize = 30
vim.g.netrw_liststyle = 3
vim.g.netrw_browse_split = 4
vim.o.nu = true vim.o.nu = true
vim.o.swapfile = false vim.o.swapfile = false
vim.o.winborder = "single" vim.o.winborder = "single"
@@ -21,9 +17,7 @@ vim.o.foldlevel = 99
vim.o.completeopt = "menuone,noselect,fuzzy,nosort" vim.o.completeopt = "menuone,noselect,fuzzy,nosort"
vim.o.undofile = true vim.o.undofile = true
vim.o.undodir = os.getenv("HOME") .. "/.cache/nvim/undodir" vim.o.undodir = os.getenv("HOME") .. "/.cache/nvim/undodir"
vim.cmd.colorscheme("retrobox")
vim.o.errorformat = "%f(%l:%c) %m,%-G%.%#" vim.o.errorformat = "%f(%l:%c) %m,%-G%.%#"
-- ----------------------------- -- -----------------------------
-- @BINDS -- @BINDS
-- ----------------------------- -- -----------------------------
@@ -42,7 +36,6 @@ map("n", "<C-p>", ":find ")
map("n", "<C-e>", ":Lex<CR>") map("n", "<C-e>", ":Lex<CR>")
map("n", "<C-backspace>", ":bd<CR>") map("n", "<C-backspace>", ":bd<CR>")
map("i", "<C-h>", vim.lsp.buf.signature_help) map("i", "<C-h>", vim.lsp.buf.signature_help)
-- ----------------------------- -- -----------------------------
-- @PLUGINS -- @PLUGINS
-- ----------------------------- -- -----------------------------
@@ -50,11 +43,12 @@ vim.pack.add({
{ src = 'https://github.com/ibhagwan/fzf-lua' }, { src = 'https://github.com/ibhagwan/fzf-lua' },
{ src = 'https://github.com/neovim/nvim-lspconfig' }, { src = 'https://github.com/neovim/nvim-lspconfig' },
{ src = 'https://github.com/echasnovski/mini.nvim' }, { src = 'https://github.com/echasnovski/mini.nvim' },
{ src = 'https://github.com/nvim-tree/nvim-tree.lua' },
{ src = 'https://github.com/romus204/tree-sitter-manager.nvim' }, { src = 'https://github.com/romus204/tree-sitter-manager.nvim' },
{ src = 'https://github.com/lukas-reineke/indent-blankline.nvim' },
{ src = 'https://github.com/rebelot/kanagawa.nvim' },
{ src = 'https://github.com/rose-pine/neovim' },
{ src = 'https://github.com/xiyaowong/transparent.nvim' }, { src = 'https://github.com/xiyaowong/transparent.nvim' },
{ src = "https://github.com/rebelot/kanagawa.nvim" },
{ src = "https://github.com/lukas-reineke/indent-blankline.nvim" },
{ src = "https://github.com/nvim-tree/nvim-tree.lua" },
}) })
require("terminal") require("terminal")
@@ -65,19 +59,6 @@ require("ibl").setup({
indent = { char = "" }, indent = { char = "" },
scope = { show_start = false, show_end = false }, scope = { show_start = false, show_end = false },
}) })
require('kanagawa').setup({
commentStyle = { italic = false },
keywordStyle = { italic = false },
transparent = true,
overrides = function(colors)
return {
SignColumn = { bg = "none" },
LineNr = { bg = "none" },
CursorLineNr = { bg = "none" },
FoldColumn = { bg = "none" },
}
end,
})
vim.cmd.colorscheme('kanagawa') vim.cmd.colorscheme('kanagawa')
vim.api.nvim_set_hl(0, "WinSeparator", { fg = "#54546D" }) vim.api.nvim_set_hl(0, "WinSeparator", { fg = "#54546D" })
@@ -96,7 +77,6 @@ map("n", "<C-b>", ":FzfLua grep_curbuf<CR>")
require("nvim-tree").setup() require("nvim-tree").setup()
map("n", "<C-e>", ":NvimTreeToggle<CR>") map("n", "<C-e>", ":NvimTreeToggle<CR>")
-- ----------------------------- -- -----------------------------
-- @AUTOCMDS -- @AUTOCMDS
-- ----------------------------- -- -----------------------------
+254 -33
View File
@@ -1,45 +1,225 @@
################################# #################################
# Fading # # Fading #
################################# #################################
fading = true; fading = false;
fade-in-step = 0.08; fade-in-step = 0.04;
fade-out-step = 0.08; fade-out-step = 0.04;
#################################
# Transparency / Opacity #
#################################
frame-opacity = 1.0;
################################# #################################
# Corners # # Corners #
################################# #################################
corner-radius = 13; # corner-radius = 0;
################################# #################################
# FAST SNAPPY ANIMATIONS # # FAST SNAPPY ANIMATIONS #
################################# #################################
match = "window_type = 'normal'";
animations = ( animations = (
{
triggers = ["open", "show"];
preset = "appear";
duration = 0.20;
},
{
triggers = ["close", "hide"];
preset = "disappear";
duration = 0.20;
},
{
triggers = ["geometry"];
preset = "geometry-change";
duration = 0.30;
}
);
{
triggers = ["close"];
opacity = {
curve = "cubic-bezier(0,1,1,1)";
duration = 0.3;
start = "window-raw-opacity-before";
end = 0;
};
blur-opacity = "opacity";
shadow-opacity = "opacity";
scale-x = {
curve = "cubic-bezier(0,1.3,1,1)";
duration = 0.3;
start = 1;
end = 0.6;
};
scale-y = "scale-x";
offset-x = "(1 - scale-x) / 2 * window-width";
offset-y = "(1 - scale-y) / 2 * window-height";
shadow-scale-x = "scale-x";
shadow-scale-y = "scale-y";
shadow-offset-x = "offset-x";
shadow-offset-y = "offset-y";
},
{
triggers = ["open"];
opacity = {
curve = "cubic-bezier(0,1,1,1)";
duration = 0.5;
start = 0;
end = "window-raw-opacity";
};
blur-opacity = "opacity";
shadow-opacity = "opacity";
scale-x = {
curve = "cubic-bezier(0,1.3,1,1)";
duration = 0.5;
start = 0.6;
end = 1;
};
scale-y = "scale-x";
offset-x = "(1 - scale-x) / 2 * window-width";
offset-y = "(1 - scale-y) / 2 * window-height";
shadow-scale-x = "scale-x";
shadow-scale-y = "scale-y";
shadow-offset-x = "offset-x";
shadow-offset-y = "offset-y";
},
{
triggers = ["geometry"];
scale-x = {
curve = "cubic-bezier(0,0,0,1.28)";
duration = 0.5;
start = "window-width-before / window-width";
end = 1;
};
scale-x-reverse = {
curve = "cubic-bezier(0,0,0,1.28)";
duration = 0.3;
start = "window-width / window-width-before";
end = 1;
};
scale-y = {
curve = "cubic-bezier(0,0,0,1.28)";
duration = 0.5;
start = "window-height-before / window-height";
end = 1;
};
scale-y-reverse = {
curve = "cubic-bezier(0,0,0,1.28)";
duration = 0.5;
start = "window-height / window-height-before";
end = 1;
};
offset-x = {
curve = "cubic-bezier(0,0,0,1.28)";
duration = 0.5;
start = "window-x-before - window-x";
end = 0;
};
offset-y = {
curve = "cubic-bezier(0,0,0,1.28)";
duration = 0.5;
start = "window-y-before - window-y";
end = 0;
};
shadow-scale-x = "scale-x";
shadow-scale-y = "scale-y";
shadow-offset-x = "offset-x";
shadow-offset-y = "offset-y";
},
)
################################# #################################
# General Settings # # General Settings #
################################# #################################
backend = "xrender"; backend = "glx";
dithered-present = false; dithered-present = false;
vsync = true; vsync = true;
detect-rounded-corners = true; detect-rounded-corners = true;
@@ -47,19 +227,60 @@ detect-client-opacity = true;
detect-transient = true; detect-transient = true;
use-damage = true; use-damage = true;
log-level = "warn"; log-level = "warn";
################################# #################################
# Window Rules # # Window Rules #
################################# #################################
rules: ( rules: (
# No rounded corners on dock and desktop # No rounded corners on dock and desktop
{ {
match = "window_type = 'dock' || window_type = 'desktop' || class_g = 'Rofi'"; match = "window_type = 'dock' || window_type = 'desktop'";
corner-radius = 0; corner-radius = 0;
}, },
# Dim all app windows besides systems stuff
{ {
match = "focused = 0 && window_type = 'normal' && class_g != 'Rofi'"; match = "class_g = 'Rofi'";
dim = 0.45; animations = (
} {
triggers = ["open", "show"];
opacity = {
curve = "cubic-bezier(0, 1, 1, 1)";
duration = 0.2;
start = 0;
end = "window-raw-opacity";
};
shadow-opacity = "opacity";
scale-y = {
curve = "cubic-bezier(0.2, 0, 0, 1)";
duration = 0.2;
start = 0.55;
end = 1;
};
shadow-scale-y = "scale-y";
},
{
triggers = ["close", "hide"];
opacity = {
curve = "cubic-bezier(0, 1, 1, 1)";
duration = 0.15;
start = "window-raw-opacity-before";
end = 0;
};
shadow-opacity = "opacity";
scale-y = {
curve = "cubic-bezier(0.2, 0, 0, 1)";
duration = 0.15;
start = 1;
end = 0.55;
};
shadow-scale-y = "scale-y";
},
);
},
{
match = "window_type = 'splash' && name = 'awesome_dim_overlay'";
animations = ();
shadow = false;
corner-radius = 0;
fade = false;
},
) )
-132
View File
@@ -1,132 +0,0 @@
;==========================================================
; Polybar config - Qogir themed
; Place at ~/.config/polybar/config.ini
;==========================================================
[colors]
background = #212121
background-alt = #3c3c3c
foreground = #d3dae3
foreground-alt = #000000
accent = #616161
accent-alt = #6ba0e8
red = #e35b5b
green = #98c379
yellow = #e5c07b
disabled = #707880
[bar/main]
width = 100%
height = 35px
radius = 0
fixed-center = true
background = ${colors.background}
foreground = ${colors.foreground}
line-size = 0px
line-color = ${colors.accent}
border-size = 0px
border-color = #00000000
padding-left = 1
padding-right = 1
module-margin = 1
separator = "|"
separator-foreground = ${colors.disabled}
font-0 = "JetBrainsMono Nerd Font:size=14;3"
font-1 = "JetBrainsMono Nerd Font:size=14;3"
modules-left = xworkspaces xwindow
modules-right = filesystem pulseaudio memory cpu eth date tray
cursor-click = pointer
cursor-scroll = ns-resize
enable-ipc = true
;==========================================================
; Workspaces
;==========================================================
[module/xworkspaces]
type = internal/xworkspaces
label-active = " %name% "
label-active-background = ${colors.accent}
label-active-foreground = ${colors.background}
label-active-underline = ${colors.accent-alt}
label-active-padding = 1
label-occupied = " %name% "
label-occupied-foreground = #ffffff
label-occupied-padding = 1
label-urgent = " %name% "
label-urgent-background = ${colors.red}
label-urgent-foreground = ${colors.background}
label-urgent-padding = 1
label-empty = " %name% "
label-empty-foreground = ${colors.disabled}
label-empty-padding = 1
;==========================================================
; Focused window title - focus indicator
;==========================================================
[module/xwindow]
type = internal/xwindow
label = %title%
label-foreground = #ffffff
label-padding = 1
;==========================================================
; Date / time
;==========================================================
[module/date]
type = internal/date
interval = 1
;date = %Y-%m-%d %H:%M:%S
date = %Y-%m-%d %H:%M
date-alt = %H:%M
label = %date%
label-foreground = ${colors.foreground}
label-padding = 1
;==========================================================
; Pulseaudio
;==========================================================
[module/pulseaudio]
type = internal/pulseaudio
format-volume-prefix = "VOL "
format-volume-prefix-foreground = ${colors.accent}
format-volume = <label-volume>
label-volume = %percentage%%
label-volume-padding = 1
label-muted = "MUTED"
label-muted-foreground = ${colors.disabled}
label-muted-padding = 1
;==========================================================
; Pulseaudio
;==========================================================
[module/tray]
type = internal/tray
tray-maxsize = 16
tray-padding = 4
tray-background = ${colors.background}
;==========================================================
; Settings
;==========================================================
[settings]
screenchange-reload = true
pseudo-transparency = false
-9
View File
@@ -1,9 +0,0 @@
#!/usr/bin/env bash
# Terminate already running bar instances
pkill -x polybar
# Wait until the processes have been shut down
while pgrep -u $UID -x polybar >/dev/null; do sleep 1; done
polybar main &
+103 -123
View File
@@ -1,142 +1,122 @@
configuration { * {
display-run: "# "; /* -- Palette, matches colors{} in awesome rc.lua -- */
display-drun: "App "; bg0: #111111; /* colors.background */
font: "Inter 14"; bg1: #1a1a1a; /* colors.background_alt */
auto-select: false; fg0: #dcd7ba; /* colors.foreground */
terminal: "terminator"; fg-selected: #ffffff; /* colors.white */
run-shell-command: "{terminal} -e \"bash -c '{cmd};bash'\""; accent: #6a9589; /* colors.accent */
separator-style: "solid"; accent-alt: #727169; /* colors.accent_alt */
show-icons: true; red: #e82424; /* colors.red */
kb-row-last: ""; disabled: #6a9589; /* colors.disabled */
kb-row-first: ""; font: "JetBrainsMono Nerd Font 14";
kb-move-front: "Home"; background-color: transparent;
kb-move-end: "End"; text-color: @fg0;
kb-element-next: "Alt+Tab";
kb-element-prev: "Alt+Shift+Tab";
kb-row-select: "Tab";
kb-row-down: "Control+n";
kb-row-up: "Control+p";
kb-clear-line: "Control+a";
click-to-exit: false;
disable-history: false;
run,drun {
fallback-icon: "exec";
} }
}
window { window {
width: 700px; transparency: "real";
background-color: #212121; /* Anchor top-center, right below the wibar. */
border: 0; location: north;
padding: 0; anchor: north;
children: [ vertbox ]; y-offset: 48px;
orientation: vertical; width: 32em;
children: [ inputbar, listview ]; height: 26em; /* fixed — box size no longer changes with result count */
spacing: 0; background-color: @bg0;
border: 3px;
border-color: @accent;
border-radius: -1px; /* matches gears.shape.rounded_rect radius in rc.lua */
padding: 14px;
} }
mainbox {
mode-switcher { children: [ inputbar, message, listview, mode-switcher ];
margin: 0; spacing: 10px;
expand: true;
}
button {
font: "Inter 13";
expand: false;
padding: 3px 15px 7px 20px;
text-color: #707880;
border: 2px 0 0 0;
border-color: transparent;
}
button selected.normal {
text-color: #d3dae3;
border-color: #5294e2;
border: 2px 0 0 0;
background-color: transparent; background-color: transparent;
} }
/* -- Search field -- */
error-message {
border: 0;
background-color: #212121;
padding: 10px 25px;
}
inputbar { inputbar {
font: "Inter 15"; children: [ prompt, entry ];
background-color: #212121; spacing: 10px;
border-color: #1c1c1c; background-color: @bg1;
border: 0 0 1px solid 0; border-radius: 10px;
padding: 10px 15px; padding: 10px 14px;
children: [ prompt, entry, num-filtered-rows, textbox-slash, num-rows ];
} }
textbox-slash {
padding: 0 5px;
content: "/";
expand: false;
text-color: #707880;
}
entry {
placeholder: "";
text-color: #d3dae3;
}
prompt { prompt {
text-color: #5294e2; text-color: @accent-alt;
} }
entry {
num-filtered-rows, placeholder: "Search";
num-rows { placeholder-color: @disabled;
text-color: #707880; text-color: @fg0;
cursor: text;
} }
/* -- List/grid toggle icons, top-right (matches screenshot) -- */
mode-switcher {
enabled: false; /* flip to true if you use rofi's built-in mode tabs */
}
/* -- Results -- */
listview { listview {
lines: 8;
columns: 1;
spacing: 6px;
scrollbar: false; scrollbar: false;
expand: true; background-color: transparent;
border: 0 0 1px 0; fixed-height: true; /* box height stays locked, doesn't shrink/grow with result count */
border-color: #1c1c1c; dynamic: false; /* don't resize dynamically as you type either */
padding: 0;
background-color: #212121;
children: [element-icon, element-text];
} }
/*
scrollbar { * Rofi tracks row state as a combination of position (normal/alternate,
handle-color: #707880; * i.e. even/odd rows for banding) and status (normal/urgent/active/selected).
border-radius: 5px; * Each combination needs its own selector or a competing @theme import
} * (if you have one elsewhere in your rofi config) can still win on states
* this file doesn't explicitly cover. Pinning all of them here.
toolbar { */
orientation: horizontal;
children: [ mode-switcher ];
expand: false;
padding: 0 5px 3px 0;
background-color: #212121;
}
element { element {
padding: 9px 10px; padding: 10px 12px;
cursor: default; border-radius: 10px;
orientation: horizontal;
} }
element normal.normal,
element.normal.normal, element alternate.normal {
element.normal.urgent, background-color: @bg1;
element.normal.active, text-color: @fg0;
element.alternate.normal,
element.alternate.urgent,
element.alternate.active {
background-color: #212121;
text-color: #d3dae3;
} }
element normal.urgent,
element.selected.normal, element alternate.urgent {
element.selected.urgent, background-color: @bg1;
element.selected.active { text-color: @red;
background-color: #424242; }
text-color: #d3dae3; element normal.active,
element alternate.active {
background-color: @bg1;
text-color: @accent-alt;
}
element selected.normal {
background-color: @accent-alt;
text-color: @fg-selected;
}
element selected.urgent {
background-color: @red;
text-color: @fg-selected;
}
element selected.active {
background-color: @accent-alt;
text-color: @bg0;
} }
element-icon { element-icon {
padding: 0 7px 0 0; size: 24px;
padding: 0 12px 0 0;
vertical-align: 0.5;
background-color: transparent;
}
element-text {
vertical-align: 0.5;
text-color: inherit;
background-color: transparent;
}
message {
background-color: @bg1;
border-radius: 10px;
padding: 8px 12px;
}
textbox {
text-color: @fg0;
} }
+2 -2
View File
@@ -88,7 +88,7 @@ if [ "$DO_LINKS" = true ]; then
link_file "$DOTFILES_DIR/config/alacritty" "$HOME/.config/alacritty" link_file "$DOTFILES_DIR/config/alacritty" "$HOME/.config/alacritty"
link_file "$DOTFILES_DIR/config/lf" "$HOME/.config/lf" link_file "$DOTFILES_DIR/config/lf" "$HOME/.config/lf"
link_file "$DOTFILES_DIR/config/picom" "$HOME/.config/picom" link_file "$DOTFILES_DIR/config/picom" "$HOME/.config/picom"
link_file "$DOTFILES_DIR/config/polybar" "$HOME/.config/polybar" link_file "$DOTFILES_DIR/config/awesome" "$HOME/.config/awesome"
link_file "$DOTFILES_DIR/config/rofi" "$HOME/.config/rofi" link_file "$DOTFILES_DIR/config/rofi" "$HOME/.config/rofi"
link_file "$DOTFILES_DIR/config/nvim" "$HOME/.config/nvim" link_file "$DOTFILES_DIR/config/nvim" "$HOME/.config/nvim"
link_file "$DOTFILES_DIR/scripts/bin" "$HOME/.local/bin" link_file "$DOTFILES_DIR/scripts/bin" "$HOME/.local/bin"
@@ -153,7 +153,7 @@ if [ "$DO_INSTALL" = true ]; then
# core utilities # core utilities
git unzip jq fzf tree direnv make git unzip jq fzf tree direnv make
# modern cli replacements # modern cli replacements
lf fd ripgrep bat delta lf fd ripgrep bat delta lazygit
# shell & terminal # shell & terminal
fish-shell alacritty fish-shell alacritty
# build & dev tools # build & dev tools
+68
View File
@@ -0,0 +1,68 @@
#!/usr/bin/env bash
# rofi-audio-switch: pick a PulseAudio/PipeWire sink via rofi
set -euo pipefail
awesome-client 'show_dim()' >/dev/null 2>&1
trap 'awesome-client "hide_dim()" >/dev/null 2>&1' EXIT
# Get list of sinks: index, name, description
mapfile -t sinks < <(pactl list sinks | awk -F': ' '
/^Sink #/ { idx=$2 }
/Name:/ { name=$2 }
/Description:/ { desc=$2; print idx"\t"name"\t"desc }
')
if [ "${#sinks[@]}" -eq 0 ]; then
notify-send "Audio Switch" "No sinks found"
exit 1
fi
current_sink=$(pactl get-default-sink)
# Build rofi menu: show description, mark current with a star
menu=""
for line in "${sinks[@]}"; do
name=$(echo "$line" | cut -f2)
desc=$(echo "$line" | cut -f3)
if [ "$name" = "$current_sink" ]; then
menu+="* $desc\n"
else
menu+=" $desc\n"
fi
done
chosen=$(echo -e "$menu" | rofi -dmenu -i -p "Audio Output" -markup-rows \
-theme-str 'listview { lines: 3; }' \
-theme-str 'window { height: 220px; }')
[ -z "$chosen" ] && exit 0
# Strip the leading marker to match description text
chosen_desc=$(echo "$chosen" | sed 's/^[* ] //')
# Find matching sink name for that description
target_name=""
for line in "${sinks[@]}"; do
desc=$(echo "$line" | cut -f3)
if [ "$desc" = "$chosen_desc" ]; then
target_name=$(echo "$line" | cut -f2)
break
fi
done
if [ -z "$target_name" ]; then
notify-send "Audio Switch" "Could not resolve selection"
exit 1
fi
# Set as default sink
pactl set-default-sink "$target_name"
# Move all currently running streams to the new sink
mapfile -t inputs < <(pactl list short sink-inputs | cut -f1)
for input in "${inputs[@]}"; do
pactl move-sink-input "$input" "$target_name"
done
notify-send "Audio Switch" "Switched to: $chosen_desc"
+47
View File
@@ -0,0 +1,47 @@
#!/usr/bin/env bash
# rofi-bookmarks: pick a Chromium bookmark and open it (new tab or new window)
set -euo pipefail
awesome-client 'show_dim()' >/dev/null 2>&1
trap 'awesome-client "hide_dim()" >/dev/null 2>&1' EXIT
BOOKMARKS_FILE="$HOME/.config/chromium/Default/Bookmarks"
if [ ! -f "$BOOKMARKS_FILE" ]; then
notify-send "Bookmarks" "Chromium bookmarks file not found"
exit 1
fi
# Recursively walk the bookmark tree (roots -> bookmark_bar / other / synced)
# and emit "title\turl" for every leaf ("type": "url"), skipping folders.
list=$(jq -r '
def walk_nodes:
if .type == "url" then
"\(.name)\t\(.url)"
elif .children then
.children[] | walk_nodes
else
empty
end;
.roots | to_entries[] | .value | walk_nodes
' "$BOOKMARKS_FILE")
if [ -z "$list" ]; then
notify-send "Bookmarks" "No bookmarks found"
exit 0
fi
chosen=$(echo "$list" | awk -F'\t' '{print $1}' | rofi -dmenu -i -p "Bookmarks" \
-theme-str 'listview { lines: 5; }' \
-theme-str 'window { width: 21%; }' \
-theme-str 'window { height: 400px; }')
[ -z "$chosen" ] && exit 0
url=$(echo "$list" | awk -F'\t' -v title="$chosen" '$1 == title { print $2; exit }')
[ -z "$url" ] && exit 0
# Open in a new tab of the existing Chromium window if one's running,
# otherwise this also launches Chromium fresh with that tab.
chromium --new-tab "$url"
+27
View File
@@ -0,0 +1,27 @@
#!/usr/bin/env bash
# rofi-power-menu: logout / restart / shutdown via rofi
set -euo pipefail
awesome-client 'show_dim()' >/dev/null 2>&1
trap 'awesome-client "hide_dim()" >/dev/null 2>&1' EXIT
options=" Logout\n Restart\n Shutdown"
chosen=$(echo -e "$options" | rofi -dmenu -i -p "Power" -markup-rows \
-theme-str 'listview { lines: 3; }' \
-theme-str 'window { height: 240px; }')
[ -z "$chosen" ] && exit 0
case "$chosen" in
*Logout*)
loginctl terminate-session ${XDG_SESSION_ID-}
;;
*Restart*)
loginctl reboot
;;
*Shutdown*)
loginctl poweroff
;;
esac
+4
View File
@@ -0,0 +1,4 @@
#!/bin/sh
awesome-client 'show_dim()'
rofi -show drun "$@"
awesome-client 'hide_dim()'
-6
View File
@@ -1,6 +0,0 @@
#!/bin/bash
/usr/bin/alacritty &
sleep 0.1
# xdotool windowactivate
/home/jason/.local/bin/tile
-6
View File
@@ -1,6 +0,0 @@
#!/bin/bash
/usr/bin/chromium --password-store=basic &
sleep 0.4
# xdotool windowactivate
/home/jason/.local/bin/tile
-200
View File
@@ -1,200 +0,0 @@
#!/bin/bash
set -e
# --- CONFIG ---
TOP_BAR=36
DECOR_H=30
DECOR_W=5
MASTER_RATIO_NUM=1
MASTER_RATIO_DEN=2
OUTER_GAP=8
INNER_GAP=8
# Master selection:
# focused = currently focused window
# first = first window on desktop
# last = last window on desktop
MASTER_MODE="focused"
# ----------------
# Get current screen resolution
read SCREEN_W SCREEN_H <<< $(xrandr | awk '
/\*/ {
split($1,a,"x")
print a[1], a[2]
exit
}')
USABLE_H=$((SCREEN_H - TOP_BAR))
# Work area after outer gaps
WORK_X=$OUTER_GAP
WORK_Y=$((TOP_BAR + OUTER_GAP))
WORK_W=$((SCREEN_W - 2 * OUTER_GAP))
WORK_H=$((USABLE_H - 2 * OUTER_GAP))
# --- focused window ---
FOCUSED=$(printf "0x%08x" "$(xdotool getactivewindow)")
# --- current desktop ---
CUR_DESKTOP=$(xdotool get_desktop)
# --- collect windows on current desktop ---
ALL_WINDOWS=$(wmctrl -l -x | awk '$2!="-1" {print $1}')
WINDOWS=()
for w in $ALL_WINDOWS; do
win_desktop=$(xdotool get_desktop_for_window "$(printf "%d" "$w")" 2>/dev/null) || continue
if [ "$win_desktop" = "$CUR_DESKTOP" ]; then
WINDOWS+=("$w")
fi
done
if [ ${#WINDOWS[@]} -eq 0 ]; then
echo "No windows found on current desktop."
exit 1
fi
# ----------------------------------------------------
# Determine master window
# ----------------------------------------------------
case "$MASTER_MODE" in
focused)
MASTER="$FOCUSED"
;;
first)
MASTER="${WINDOWS[0]}"
;;
last)
MASTER="${WINDOWS[$((${#WINDOWS[@]} - 1))]}"
;;
*)
echo "Invalid MASTER_MODE: $MASTER_MODE"
exit 1
;;
esac
# --- separate master from stack ---
STACK=()
for w in "${WINDOWS[@]}"; do
if [ "$w" != "$MASTER" ]; then
STACK+=("$w")
fi
done
place() {
local id=$1
local x=$2
local y=$3
local raw_w=$4
local raw_h=$5
local class decor_h decor_w x_offset y_offset
x_offset=0
y_offset=0
class=$(xprop -id "$id" WM_CLASS 2>/dev/null | sed -r 's/.*"(.*)"$/\1/')
case "$class" in
Alacritty)
decor_h=42
decor_w=8
;;
Chromium)
decor_h=42
decor_w=5
;;
obsidian)
decor_h=5
decor_w=0
x_offset=-0
y_offset=-0
;;
dev.zed.Zed)
decor_h=-19
decor_w=-23
x_offset=-13
y_offset=-13
;;
*)
decor_h=$DECOR_H
decor_w=$DECOR_W
;;
esac
local w=$((raw_w - decor_w))
local h=$((raw_h - decor_h))
local fx=$((x + x_offset))
local fy=$((y + y_offset))
wmctrl -i -r "$id" -b remove,maximized_vert,maximized_horz
wmctrl -i -r "$id" -e 1,"$fx","$fy","$w","$h"
}
# ----------------------------------------------------
# Single window
# ----------------------------------------------------
if [ ${#WINDOWS[@]} -eq 1 ]; then
place \
"$MASTER" \
"$WORK_X" \
"$WORK_Y" \
"$WORK_W" \
"$WORK_H"
exit 0
fi
# ----------------------------------------------------
# Master / Stack layout
# ----------------------------------------------------
MID=$((WORK_W * MASTER_RATIO_NUM / MASTER_RATIO_DEN))
MASTER_X=$WORK_X
MASTER_Y=$WORK_Y
MASTER_W=$((MID - INNER_GAP / 2))
MASTER_H=$WORK_H
STACK_X=$((WORK_X + MID + INNER_GAP / 2))
STACK_Y=$WORK_Y
STACK_W=$((WORK_W - MID - INNER_GAP / 2))
STACK_H=$WORK_H
# --- place master ---
place \
"$MASTER" \
"$MASTER_X" \
"$MASTER_Y" \
"$MASTER_W" \
"$MASTER_H"
# --- place stack ---
COUNT=${#STACK[@]}
if [ "$COUNT" -gt 0 ]; then
SLOT_H=$(((STACK_H - INNER_GAP * (COUNT - 1)) / COUNT))
i=0
for w in "${STACK[@]}"; do
SLOT_Y=$((STACK_Y + i * (SLOT_H + INNER_GAP)))
place \
"$w" \
"$STACK_X" \
"$SLOT_Y" \
"$STACK_W" \
"$SLOT_H"
i=$((i + 1))
done
fi
-78
View File
@@ -1,78 +0,0 @@
#!/bin/bash
# focus-dir.sh - focus the nearest window in a given direction (h/j/k/l)
# Usage: focus-dir.sh h|j|k|l (or left/down/up/right)
DIR=$1
if [ -z "$DIR" ]; then
echo "Usage: $0 h|j|k|l"
exit 1
fi
# --- get current desktop ---
CUR_DESKTOP=$(xdotool get_desktop)
# --- get focused window geometry ---
FOCUSED=$(xdotool getactivewindow)
read -r FX FY FW FH < <(xdotool getwindowgeometry --shell "$FOCUSED" | awk -F= '
/^X=/ {x=$2} /^Y=/ {y=$2} /^WIDTH=/ {w=$2} /^HEIGHT=/ {h=$2}
END {print x, y, w, h}
')
FCX=$((FX + FW / 2))
FCY=$((FY + FH / 2))
# --- get list of normal windows on current desktop ---
ALL_WINDOWS=$(wmctrl -l -x | awk '$2!="-1" {print $1}')
BEST=""
BEST_DIST=""
for w in $ALL_WINDOWS; do
wid=$(printf "%d" "$w")
[ "$wid" = "$FOCUSED" ] && continue
win_desktop=$(xdotool get_desktop_for_window "$wid" 2>/dev/null) || continue
[ "$win_desktop" = "$CUR_DESKTOP" ] || continue
read -r WX WY WW WH < <(xdotool getwindowgeometry --shell "$wid" | awk -F= '
/^X=/ {x=$2} /^Y=/ {y=$2} /^WIDTH=/ {w=$2} /^HEIGHT=/ {h=$2}
END {print x, y, w, h}
')
WCX=$((WX + WW / 2))
WCY=$((WY + WH / 2))
DX=$((WCX - FCX))
DY=$((WCY - FCY))
case "$DIR" in
h|left)
[ "$DX" -ge 0 ] && continue
;;
l|right)
[ "$DX" -le 0 ] && continue
;;
k|up)
[ "$DY" -ge 0 ] && continue
;;
j|down)
[ "$DY" -le 0 ] && continue
;;
*)
echo "Invalid direction: $DIR"
exit 1
;;
esac
# Manhattan distance, weighted to prefer windows roughly in line
DIST=$(( (DX<0?-DX:DX) + (DY<0?-DY:DY) ))
if [ -z "$BEST_DIST" ] || [ "$DIST" -lt "$BEST_DIST" ]; then
BEST_DIST=$DIST
BEST=$wid
fi
done
if [ -n "$BEST" ]; then
xdotool windowactivate "$BEST"
fi