summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Sadler <david@flashacademy.com>2026-07-07 09:15:46 +0100
committerDavid Sadler <david@flashacademy.com>2026-07-07 09:15:46 +0100
commit626c119a60701e2908e5795b3941078ebb8dba6b (patch)
treead8b6577953f50ad958051ef1d2493e8785ad4cb
parent4c8d52122d962a0194737450e825471f27c93451 (diff)
parentfc2b007057dc763de14f9cd7860360bc5c9b646e (diff)
Merge branch 'main' into WSL
-rw-r--r--bash/.bash_aliases2
-rwxr-xr-xbin/.bin/add-bookmark.sh36
-rwxr-xr-xbin/.bin/bluetooth.sh140
-rwxr-xr-xbin/.bin/new-episode35
-rwxr-xr-xbin/.bin/open-bookmark.sh23
-rwxr-xr-xbin/.bin/power.sh22
-rw-r--r--bookmarks.txt7
-rw-r--r--dunst/.config/dunst/dunstrc56
-rw-r--r--git/.config/git/gitignore1
-rw-r--r--gtk-3.0/.config/gtk-3.0/settings.ini16
-rwxr-xr-xinstall.sh4
-rw-r--r--nvim/.config/nvim/lsp/bash_language_server.lua5
-rw-r--r--nvim/.config/nvim/lsp/vtsls.lua39
-rw-r--r--nvim/.config/nvim/lua/config/lsp.lua2
-rw-r--r--nvim/.config/nvim/lua/plugins/conform.lua15
-rw-r--r--nvim/.config/nvim/lua/plugins/nvim-lint.lua2
-rw-r--r--nvim/.config/nvim/lua/plugins/nvim-treesitter.lua3
-rw-r--r--oxwm/.config/oxwm/config.lua28
-rw-r--r--rofi/.config/rofi/config.rasi3
-rw-r--r--rofi/.config/rofi/themes/nord.rasi75
20 files changed, 473 insertions, 41 deletions
diff --git a/bash/.bash_aliases b/bash/.bash_aliases
index 427b880..a443389 100644
--- a/bash/.bash_aliases
+++ b/bash/.bash_aliases
@@ -68,5 +68,5 @@ se() {
mkdir -p "$(dirname "$SECRET_PATH")"
fi
- nix shell nixpkgs#sops -c sops "$SECRET_PATH"
+ sops "$SECRET_PATH"
}
diff --git a/bin/.bin/add-bookmark.sh b/bin/.bin/add-bookmark.sh
new file mode 100755
index 0000000..9a8ab6b
--- /dev/null
+++ b/bin/.bin/add-bookmark.sh
@@ -0,0 +1,36 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+BOOKMARKS_FILE="$DOTFILES_REPO/bookmarks.txt"
+
+mkdir -p "$(dirname "$BOOKMARKS_FILE")"
+touch "$BOOKMARKS_FILE"
+
+xdotool key --delay 50 ctrl+l ctrl+c Escape
+
+sleep 0.15
+
+URL=$(xclip -selection clipboard -o)
+
+if [[ "$URL" =~ ^https?:// ]]; then
+ NAME=$(zenity --entry \
+ --title="Add Bookmark" \
+ --text="Enter a name for this bookmark:" \
+ --entry-text="" 2>/dev/null)
+
+ if [ -z "$NAME" ]; then
+ notify-send "Bookmark Cancelled" "No name was provided."
+ exit 0
+ fi
+
+ CLEAN_NAME=$(echo "$NAME" | tr '|' '-')
+
+ if ! grep -q "|$URL$" "$BOOKMARKS_FILE"; then
+ echo "$CLEAN_NAME|$URL" >>"$BOOKMARKS_FILE"
+ notify-send "Bookmark Saved" "$CLEAN_NAME\n$URL"
+ else
+ notify-send "Bookmark" "This exact URL already exists!"
+ fi
+else
+ notify-send "Bookmark Error" "Clipboard did not contain a valid URL."
+fi
diff --git a/bin/.bin/bluetooth.sh b/bin/.bin/bluetooth.sh
new file mode 100755
index 0000000..5ae5281
--- /dev/null
+++ b/bin/.bin/bluetooth.sh
@@ -0,0 +1,140 @@
+#!/usr/bin/env bash
+set -uo pipefail # Keep -e off so our self-healing logic can handle error codes safely
+
+# Define the Rofi menu layout.
+declare -a order=(
+ "⚡ Power On Bluetooth"
+ "🛑 Power Off Bluetooth"
+ "🔌 Disconnect All Devices"
+ "---"
+ "Speaker"
+ "Earphones"
+ "Earphones Left"
+ "Living Room"
+)
+
+# Map profiles to hardware MAC addresses.
+declare -A devices
+devices[Speaker]="A0:E9:DB:0E:43:79"
+devices[Earphones]="98:52:3D:F2:6E:3E"
+devices["Earphones Left"]="98:52:3D:F2:36:78"
+devices["Living Room"]="42:46:9F:D0:2C:53"
+
+# Prompt User via Rofi.
+MENU_OPTIONS=$(printf "%s\n" "${order[@]}")
+SELECTION=$(echo "$MENU_OPTIONS" | rofi -dmenu -p "Bluetooth Menu:")
+
+# Exit gracefully if the user hits Escape.
+if [ -z "$SELECTION" ] || [ "$SELECTION" = "---" ]; then
+ exit 0
+fi
+
+if [ "$SELECTION" = "⚡ Power On Bluetooth" ]; then
+ notify-send "BT" "Powering adapter on..."
+ bluetoothctl power on
+ exit 0
+fi
+
+if [ "$SELECTION" = "🛑 Power Off Bluetooth" ]; then
+ notify-send "BT" "Powering adapter off..."
+ bluetoothctl power off
+ exit 0
+fi
+
+if [ "$SELECTION" = "🔌 Disconnect All Devices" ]; then
+ notify-send "BT" "Clearing all active connections..."
+ for name in "${!devices[@]}"; do
+ bluetoothctl disconnect "${devices[$name]}" >/dev/null 2>&1 || true
+ done
+ notify-send "BT" "All devices disconnected."
+ exit 0
+fi
+
+if [ -z "${devices[$SELECTION]:-}" ]; then
+ notify-send "ERROR" "Invalid choice: $SELECTION"
+ exit 1
+fi
+
+TARGET_MAC="${devices[$SELECTION]}"
+
+# Ensure controller is actually powered up before trying to connect.
+if ! bluetoothctl show | grep -q "Powered: yes"; then
+ notify-send "BT" "Waking up Bluetooth adapter..."
+ bluetoothctl power on
+ sleep 2
+fi
+
+# Force controller runtime options to accept incoming passthroughs.
+bluetoothctl pairable on >/dev/null 2>&1 || true
+bluetoothctl discoverable on >/dev/null 2>&1 || true
+
+# Disconnect existing targets to free up the system audio pipelines.
+for name in "${!devices[@]}"; do
+ bluetoothctl disconnect "${devices[$name]}" >/dev/null 2>&1 || true
+done
+
+# Query the machine's local hardware database cache.
+DEVICE_CHECK=$(bluetoothctl info "$TARGET_MAC" 2>&1 || true)
+
+if echo "$DEVICE_CHECK" | grep -q "not available"; then
+ notify-send "BT: Provisioning" "Device missing from system cache. Probing airwaves..."
+
+ # Run a targeted background scan pass to register device metadata.
+ bluetoothctl --timeout 5 scan on >/dev/null 2>&1 &
+ SCAN_PID=$!
+ sleep 4
+ kill "$SCAN_PID" 2>/dev/null || true
+ wait "$SCAN_PID" 2>/dev/null || true
+ sleep 1
+
+ notify-send "BT: Provisioning" "Exchanging encryption keys..."
+ bluetoothctl pair "$TARGET_MAC"
+ bluetoothctl trust "$TARGET_MAC"
+fi
+
+# Attempt targeted connection sequence.
+notify-send "BT Switch" "Routing audio to $SELECTION..."
+CONNECT_OUT=$(bluetoothctl connect "$TARGET_MAC" 2>&1 || true)
+echo "$CONNECT_OUT"
+
+if echo "$CONNECT_OUT" | grep -q "Connection successful"; then
+ bluetoothctl trust "$TARGET_MAC" >/dev/null 2>&1 || true
+
+ # WirePlumber Sinks Syncing Engine.
+ CLEAN_MAC="${TARGET_MAC//:/_}"
+ SINK_NAME=$(wpctl status | grep -o "bluez_output\.[^\ ]*${CLEAN_MAC}[^\ ]*" | head -n 1 || true)
+
+ if [ ! -z "$SINK_NAME" ]; then
+ wpctl set-default "$SINK_NAME"
+ # Set a safe volumne just in case we connect to earphones.
+ wpctl set-volume "$SINK_NAME" 0.10
+ fi
+
+ notify-send "BT Switch" "$SELECTION connected successfully!"
+
+# Handle key synchronization issues seamlessly....
+elif echo "$CONNECT_OUT" | grep -q "br-connection-key-missing"; then
+ notify-send "BT Error" "Key mismatch! Purging and re-pairing..."
+
+ bluetoothctl remove "$TARGET_MAC" >/dev/null 2>&1 || true
+ sleep 1
+
+ bluetoothctl --timeout 5 scan on >/dev/null 2>&1 &
+ SCAN_PID=$!
+ sleep 4
+ kill "$SCAN_PID" 2>/dev/null || true
+ wait "$SCAN_PID" 2>/dev/null || true
+ sleep 1
+
+ notify-send "BT Recovery" "Put device in pairing mode!"
+ bluetoothctl pair "$TARGET_MAC"
+ bluetoothctl trust "$TARGET_MAC"
+
+ if bluetoothctl connect "$TARGET_MAC"; then
+ notify-send "BT Switch" "$SELECTION repaired and connected!"
+ else
+ notify-send "BT ERROR" "Repair fallback routing failed."
+ fi
+else
+ notify-send "BT ERROR" "Failed to link with $SELECTION. Check pairing state or other devices."
+fi
diff --git a/bin/.bin/new-episode b/bin/.bin/new-episode
deleted file mode 100755
index c8a2305..0000000
--- a/bin/.bin/new-episode
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/env bash
-
-if [ -z "$1" ]; then
- echo "Usage: new-episode <number> <name>"
- exit 1
-fi
-
-EP_NUM=$(printf "%03d" "$1")
-
-# Capture the Name (Shift the first arg so we can join the rest).
-shift
-RAW_NAME="${*:-untitled}"
-
-# Create the Title (Capitalize first letter of every word).
-# Using a simple sed regex to capitalize words.
-EP_TITLE=$(echo "$RAW_NAME" | sed 's/\b./\U&/g')
-
-# Create the Filename Slug (Lower case and replace spaces with hyphens)
-# tr '[:upper:]' '[:lower:]' handles the casing
-# tr ' ' '-' handles the spaces
-SLUG=$(echo "$RAW_NAME" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')
-FILENAME="episode-${EP_NUM}-${SLUG}.php"
-
-# Generate the file
-cat <<EOF > "$FILENAME"
-<?php
-
-declare(strict_types=1);
-
-/**
- * Episode ${EP_NUM}: ${EP_TITLE}
- * The Coding Brummie Fundamental PHP Series
- */
-
-EOF
diff --git a/bin/.bin/open-bookmark.sh b/bin/.bin/open-bookmark.sh
new file mode 100755
index 0000000..67e724b
--- /dev/null
+++ b/bin/.bin/open-bookmark.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+BOOKMARKS_FILE="$DOTFILES_REPO/bookmarks.txt"
+
+if [ ! -f "$BOOKMARKS_FILE" ] || [ ! -s "$BOOKMARKS_FILE" ]; then
+ notify-send "Bookmarks" "Your bookmarks file is empty or missing."
+ exit 1
+fi
+
+SELECTION=$(cut -d'|' -f1 "$BOOKMARKS_FILE" | rofi -dmenu -p "Go To:")
+
+if [ -z "$SELECTION" ]; then
+ exit 0
+fi
+
+URL=$(grep "^$SELECTION|" "$BOOKMARKS_FILE" | head -n 1 | cut -d'|' -f2)
+
+if [ -n "$URL" ]; then
+ firefox "$URL" &
+else
+ notify-send "Error" "Could not resolve the URL for: $SELECTION"
+fi
diff --git a/bin/.bin/power.sh b/bin/.bin/power.sh
new file mode 100755
index 0000000..e17bae3
--- /dev/null
+++ b/bin/.bin/power.sh
@@ -0,0 +1,22 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+declare -A actions
+actions[Reboot]="systemctl reboot"
+actions[Shutdown]="systemctl poweroff"
+
+SELECTION=$(printf "Reboot\nShutdown" | rofi -dmenu -p "")
+
+if [ -z "$SELECTION" ]; then
+ exit 0
+fi
+
+if [ -z "${actions[$SELECTION]:-}" ]; then
+ notify-send "ERROR" "Invalid choice: $SELECTION"
+ exit 1
+fi
+
+notify-send "System" "Initiating $SELECTION..."
+sleep 0.5
+
+${actions[$SELECTION]}
diff --git a/bookmarks.txt b/bookmarks.txt
new file mode 100644
index 0000000..ae9e13a
--- /dev/null
+++ b/bookmarks.txt
@@ -0,0 +1,7 @@
+gemini|https://gemini.google.com/app
+davidtsadler.com|https://davidtsadler.com/
+jellyfin|http://192.168.1.11:8096/web
+nix package|https://search.nixos.org/packages
+vasm|http://sun.hasenbraten.de/vasm/
+vlink|http://sun.hasenbraten.de/vlink/index.php?view=main
+motion canvas|https://motion-canvas.io/
diff --git a/dunst/.config/dunst/dunstrc b/dunst/.config/dunst/dunstrc
new file mode 100644
index 0000000..786d035
--- /dev/null
+++ b/dunst/.config/dunst/dunstrc
@@ -0,0 +1,56 @@
+[global]
+ ### Display Settings ###
+ monitor = 0
+ follow = mouse
+ width = 300
+ height = 150
+ origin = top-right
+ offset = 10x50
+ scale = 0
+ notification_limit = 5
+
+ ### Progress Bar ###
+ progress_bar = true
+ progress_bar_height = 10
+ progress_bar_frame_width = 1
+ progress_bar_min_width = 150
+ progress_bar_max_width = 300
+
+ ### Styling ###
+ frame_width = 2
+ separator_height = 2
+ padding = 8
+ horizontal_padding = 8
+ text_icon_padding = 0
+
+ # Official Nord Accent Colors
+ frame_color = "#88c0d0" # Nord8 (Ice Blue Frame)
+ separator_color = "#4c566a" # Nord3
+
+ ### Text Properties ###
+ font = JetBrains Mono 10
+ line_height = 0
+ format = "<b>%s</b>\n%b"
+ alignment = left
+ show_age_threshold = 60
+ ellipsize = middle
+ ignore_newline = no
+ stack_duplicates = true
+ hide_duplicate_count = false
+
+[urgency_low]
+ # Nord Night backgrounds with bright snow text
+ background = "#2e3440" # Nord0
+ foreground = "#d8dee9" # Nord4
+ timeout = 4
+
+[urgency_normal]
+ background = "#3b4252" # Nord1
+ foreground = "#eceff4" # Nord6
+ timeout = 6
+
+[urgency_critical]
+ background = "#bf616a" # Nord11 (Aurora Red for warnings)
+ foreground = "#eceff4" # Nord6
+ frame_color = "#bf616a"
+ timeout = 0
diff --git a/git/.config/git/gitignore b/git/.config/git/gitignore
index d992b6f..51f1a72 100644
--- a/git/.config/git/gitignore
+++ b/git/.config/git/gitignore
@@ -1 +1,2 @@
Session.vim
+result
diff --git a/gtk-3.0/.config/gtk-3.0/settings.ini b/gtk-3.0/.config/gtk-3.0/settings.ini
new file mode 100644
index 0000000..5b4a49a
--- /dev/null
+++ b/gtk-3.0/.config/gtk-3.0/settings.ini
@@ -0,0 +1,16 @@
+[Settings]
+gtk-theme-name = Nordic
+gtk-icon-theme-name = Nordzy
+gtk-font-name = JetBrains Mono 11
+gtk-cursor-theme-name = Adwaita
+gtk-cursor-theme-size = 24
+gtk-toolbar-style = GTK_TOOLBAR_BOTH_TEXT
+gtk-toolbar-icon-size = GTK_ICON_SIZE_LARGE_TOOLBAR
+gtk-button-images = 1
+gtk-menu-images = 1
+gtk-enable-event-sounds = 0
+gtk-enable-input-feedback = 0
+gtk-xft-antialias = 1
+gtk-xft-hinting = 1
+gtk-xft-hintstyle = hintslight
+gtk-xft-rgba = rgb
diff --git a/install.sh b/install.sh
index 2b82e29..5c65c4d 100755
--- a/install.sh
+++ b/install.sh
@@ -6,10 +6,14 @@ dotfiles=(
alacritty
bash
bat
+ bin
+ dunst
git
+ gtk-3.0
lazygit
nvim
oxwm
+ rofi
ssh
starship
tmux
diff --git a/nvim/.config/nvim/lsp/bash_language_server.lua b/nvim/.config/nvim/lsp/bash_language_server.lua
new file mode 100644
index 0000000..d7c9ef1
--- /dev/null
+++ b/nvim/.config/nvim/lsp/bash_language_server.lua
@@ -0,0 +1,5 @@
+---@type vim.lsp.Config
+return {
+ cmd = { "bash-language-server", "start" },
+ filetypes = { "bash", "sh" },
+}
diff --git a/nvim/.config/nvim/lsp/vtsls.lua b/nvim/.config/nvim/lsp/vtsls.lua
new file mode 100644
index 0000000..544f942
--- /dev/null
+++ b/nvim/.config/nvim/lsp/vtsls.lua
@@ -0,0 +1,39 @@
+-- https://raw.githubusercontent.com/neovim/nvim-lspconfig/refs/heads/master/lsp/vtsls.lua
+---@type vim.lsp.Config
+return {
+ cmd = { 'vtsls', '--stdio' },
+ init_options = {
+ hostInfo = 'neovim',
+ },
+ filetypes = {
+ 'javascript',
+ 'javascriptreact',
+ 'typescript',
+ 'typescriptreact',
+ },
+ root_dir = function(bufnr, on_dir)
+ -- The project root is where the LSP can be started from
+ -- As stated in the documentation above, this LSP supports monorepos and simple projects.
+ -- We select then from the project root, which is identified by the presence of a package
+ -- manager lock file.
+ local root_markers = { 'package-lock.json', 'yarn.lock', 'pnpm-lock.yaml', 'bun.lockb', 'bun.lock' }
+ -- Give the root markers equal priority by wrapping them in a table
+ root_markers = vim.fn.has('nvim-0.11.3') == 1 and { root_markers, { '.git' } }
+ or vim.list_extend(root_markers, { '.git' })
+ -- exclude deno
+ local deno_root = vim.fs.root(bufnr, { 'deno.json', 'deno.jsonc' })
+ local deno_lock_root = vim.fs.root(bufnr, { 'deno.lock' })
+ local project_root = vim.fs.root(bufnr, root_markers)
+ if deno_lock_root and (not project_root or #deno_lock_root > #project_root) then
+ -- deno lock is closer than package manager lock, abort
+ return
+ end
+ if deno_root and (not project_root or #deno_root >= #project_root) then
+ -- deno config is closer than or equal to package manager lock, abort
+ return
+ end
+ -- project is standard TS, not deno
+ -- We fallback to the current working directory if no project root is found
+ on_dir(project_root or vim.fn.getcwd())
+ end,
+}
diff --git a/nvim/.config/nvim/lua/config/lsp.lua b/nvim/.config/nvim/lua/config/lsp.lua
index be37e27..2ddeb6a 100644
--- a/nvim/.config/nvim/lua/config/lsp.lua
+++ b/nvim/.config/nvim/lua/config/lsp.lua
@@ -1,8 +1,10 @@
vim.lsp.enable({
+ "bash_language_server",
"intelephense",
"lua_ls",
"marksman",
"nixd",
+ "vtsls",
})
vim.diagnostic.config({
diff --git a/nvim/.config/nvim/lua/plugins/conform.lua b/nvim/.config/nvim/lua/plugins/conform.lua
index 31d0302..94bdb06 100644
--- a/nvim/.config/nvim/lua/plugins/conform.lua
+++ b/nvim/.config/nvim/lua/plugins/conform.lua
@@ -6,10 +6,25 @@ require("conform").setup({
markdown = { "prettier" },
nix = { "nixfmt" },
php = { "php_cs_fixer" },
+ bash = { "shfmt" },
+ sh = { "shfmt" },
+ javascript = { "biome", "prettier", stop_after_first = true },
+ typescript = { "biome", "prettier", stop_after_first = true },
+ javascriptreact = { "biome", "prettier", stop_after_first = true },
+ typescriptreact = { "biome", "prettier", stop_after_first = true },
},
formatters = {
php_cs_fixer = {
command = "php-cs-fixer",
},
+ -- Biome is great because it doesn't require a node_modules folder to work.
+ biome = {
+ command = "biome",
+ args = { "format", "--stdin-file-path", "$FILENAME" },
+ },
+ -- Force shfmt to always use the bash parser variant.
+ shfmt = {
+ prepend_args = { "-ln", "bash" },
+ },
},
})
diff --git a/nvim/.config/nvim/lua/plugins/nvim-lint.lua b/nvim/.config/nvim/lua/plugins/nvim-lint.lua
index 7129dab..9df79bf 100644
--- a/nvim/.config/nvim/lua/plugins/nvim-lint.lua
+++ b/nvim/.config/nvim/lua/plugins/nvim-lint.lua
@@ -5,4 +5,6 @@ require("lint").linters_by_ft = {
markdown = { "markdownlint-cli2" },
nix = { "statix" },
php = { "phpcs" },
+ bash = { "shellcheck" },
+ sh = { "shellcheck" },
}
diff --git a/nvim/.config/nvim/lua/plugins/nvim-treesitter.lua b/nvim/.config/nvim/lua/plugins/nvim-treesitter.lua
index acb3fbd..e646c1b 100644
--- a/nvim/.config/nvim/lua/plugins/nvim-treesitter.lua
+++ b/nvim/.config/nvim/lua/plugins/nvim-treesitter.lua
@@ -7,10 +7,13 @@ require("nvim-treesitter").install({
"gitattributes",
"gitcommit",
"gitignore",
+ "javascript",
"json",
"lua",
"markdown",
"markdown_inline",
"nix",
"php",
+ "tsx",
+ "typescript",
})
diff --git a/oxwm/.config/oxwm/config.lua b/oxwm/.config/oxwm/config.lua
index d899890..eda0688 100644
--- a/oxwm/.config/oxwm/config.lua
+++ b/oxwm/.config/oxwm/config.lua
@@ -138,7 +138,10 @@ oxwm.gaps.set_outer(0, 0)
-- Examples (uncomment to use):
-- oxwm.rule.add({ instance = "gimp", floating = true })
oxwm.rule.add({ class = "firefox", title = "Library", floating = true })
+oxwm.rule.add({ class = "firefox", role = "GtkFileChooserDialog", floating = true })
oxwm.rule.add({ class = "firefox", tag = 2 })
+oxwm.rule.add({ class = "zenity", floating = true })
+oxwm.rule.add({ class = "amiberry", tag = 3 })
-- oxwm.rule.add({ instance = "mpv", floating = true })
-- To find window properties, use xprop and click on the window
@@ -177,8 +180,8 @@ oxwm.bar.set_scheme_selected(colors.cyan, colors.bg, colors.purple)
-- Basic window management
oxwm.key.bind({ modkey }, "Return", oxwm.spawn_terminal())
--- Launch Dmenu
-oxwm.key.bind({ modkey }, "D", oxwm.spawn({ "sh", "-c", "dmenu_run -l 10" }))
+-- Launch Rofi
+oxwm.key.bind({ modkey }, "D", oxwm.spawn({ "sh", "-c", "rofi -show run" }))
-- Copy screenshot to clipboard
-- oxwm.key.bind({ modkey }, "S", oxwm.spawn({ "sh", "-c", "maim -s | xclip -selection clipboard -t image/png" }))
oxwm.key.bind({ modkey }, "Q", oxwm.client.kill())
@@ -274,9 +277,24 @@ oxwm.key.bind({ modkey, "Control", "Shift" }, "9", oxwm.tag.toggletag(8))
-- Format: {{modifiers}, key1}, {{modifiers}, key2}, ...
-- Example: Press Mod4+Space, then release and press T to spawn a terminal without auto starting anything.
oxwm.key.chord({
+ { { modkey }, "b" },
+ { {}, "a" }
+}, oxwm.spawn({ "add-bookmark.sh" }))
+
+oxwm.key.chord({
+ { { modkey }, "b" },
+ { {}, "o" }
+}, oxwm.spawn({ "open-bookmark.sh" }))
+
+oxwm.key.chord({
+ { { modkey }, "Space" },
+ { {}, "p" }
+}, oxwm.spawn({ "power.sh" }))
+
+oxwm.key.chord({
{ { modkey }, "Space" },
- { {}, "T" }
-}, oxwm.spawn({ "alacritty", "-e", "bash" }))
+ { {}, "b" }
+}, oxwm.spawn({ "bluetooth.sh" }))
-------------------------------------------------------------------------------
-- Autostart
@@ -286,7 +304,7 @@ oxwm.key.chord({
-- Keycode 108 was found using the exv command and pressing the AltGr key in the popup window.
oxwm.autostart("xmodmap -e 'keycode 108 = Super_R' -e 'add mod4 = Super_R'")
+oxwm.autostart("dunst")
-- oxwm.autostart("picom")
-- oxwm.autostart("feh --bg-scale ~/wallpaper.jpg")
--- oxwm.autostart("dunst")
-- oxwm.autostart("nm-applet")
diff --git a/rofi/.config/rofi/config.rasi b/rofi/.config/rofi/config.rasi
new file mode 100644
index 0000000..5d67754
--- /dev/null
+++ b/rofi/.config/rofi/config.rasi
@@ -0,0 +1,3 @@
+configuration {
+}
+@theme "~/.config/rofi/themes/nord.rasi"
diff --git a/rofi/.config/rofi/themes/nord.rasi b/rofi/.config/rofi/themes/nord.rasi
new file mode 100644
index 0000000..53161ad
--- /dev/null
+++ b/rofi/.config/rofi/themes/nord.rasi
@@ -0,0 +1,75 @@
+* {
+ /* Nord Color Palette Blueprint */
+ nord0: #2e3440; /* Polar Night (Base Background) */
+ nord1: #3b4252; /* Polar Night (Elevated Background) */
+ nord2: #434c5e; /* Polar Night (Selection Element) */
+ nord3: #4c566a; /* Polar Night (Comments/Muted Text) */
+ nord4: #d8dee9; /* Snow Storm (Primary Text) */
+ nord5: #e5e9f0; /* Snow Storm (Bright Text) */
+ nord6: #eceff4; /* Snow Storm (Blinding Text) */
+ nord7: #8fbcbb; /* Frost (Teal Accent) */
+ nord8: #88c0d0; /* Frost (Ice Blue Highlight) */
+ nord9: #81a1c1; /* Frost (Flat Blue) */
+ nord10: #5e81ac; /* Frost (Deep Blue) */
+
+ background-color: transparent;
+ text-color: @nord4;
+ accent-color: @nord8;
+
+ font: "JetBrains Mono 12";
+}
+
+window {
+ background-color: @nord0;
+ border-color: @accent-color;
+ border: 2px;
+ width: 550px;
+ location: center;
+ anchor: center;
+ padding: 14px;
+}
+
+inputbar {
+ spacing: 12px;
+ padding: 0px 0px 10px 0px;
+ border: 0px 0px 1px 0px;
+ border-color: @nord3;
+ children: [ prompt, entry ];
+}
+
+prompt {
+ text-color: @accent-color;
+ font: "JetBrains Mono Bold 12";
+}
+
+entry {
+ text-color: @nord5;
+ placeholder: "Search...";
+ placeholder-color: @nord3;
+}
+
+listview {
+ lines: 12;
+ columns: 1;
+ fixed-height: false;
+ spacing: 4px;
+ padding: 8px 0px 0px 0px;
+}
+
+element {
+ padding: 6px 10px;
+ border-radius: 4px;
+}
+
+element normal text {
+ text-color: @nord4;
+}
+
+element selected {
+ background-color: @nord2; /* Highlight bar color */
+}
+
+element selected text {
+ text-color: @nord6; /* Text inside the highlight bar */
+ font: "JetBrains Mono Bold 12";
+}