Compare commits

..

66 Commits

Author SHA1 Message Date
273c4d090c Revert env 2026-04-17 15:01:12 +01:00
a88a419669 Update tmux binding 2026-04-11 14:16:05 +01:00
b5471c5f25 Remove env 2026-04-06 19:42:00 +01:00
422466e483 Improve hypr 2026-04-06 17:52:40 +01:00
ee49471228 Update neovim 2026-04-06 15:04:22 +01:00
802f0dd84e Update gradle 2026-04-06 14:13:24 +01:00
5570e58efc Update android home 2026-04-06 13:55:37 +01:00
5d687eb837 Scaling 2026-04-05 19:59:28 +01:00
e46820b5f7 Update workspaces 2026-04-04 20:36:10 +01:00
ab9854d12f Walker 2026-04-01 20:37:45 +01:00
2e83db4b69 Navigation improvements 2026-03-31 21:52:20 +01:00
b27f3fa744 Backgrounds 2026-03-30 19:40:32 +01:00
1c845777e8 Tablet settings 2026-03-28 17:49:13 +00:00
e1eb5794c5 Update env 2026-03-27 21:40:10 +00:00
b5f7738df3 Fix issue 2026-03-27 09:47:44 +00:00
6817507506 Add gemini path 2026-03-27 09:44:04 +00:00
2a993c2ceb Remove failing line 2026-03-27 09:43:32 +00:00
e2069193fe Remove warning 2026-03-27 09:08:26 +00:00
dc16123c82 Fix binding for Enpass 2026-03-24 19:02:42 +00:00
641212f0e3 Fixing lock time 2026-03-23 22:16:03 +00:00
5e57111548 env variables 2026-03-23 21:12:33 +00:00
2e148cb31a Try different scaling 2026-03-23 20:39:48 +00:00
be76b81d6e Hardcode monitor layout 2026-03-23 20:12:35 +00:00
815c1f4edb Add nix conf 2026-03-22 22:24:58 +00:00
6fb2964443 direnv 2026-03-22 22:03:39 +00:00
506e8ef15e Fix issue 2026-03-22 21:55:46 +00:00
f3f9e58805 Password directory 2026-03-22 21:28:41 +00:00
966d31c6a8 Script to set password 2026-03-22 14:01:11 +00:00
9e59127cb2 Add function for saving envs 2026-03-21 17:22:16 +00:00
22a684c1a6 Add function for saving envs 2026-03-21 17:10:09 +00:00
fd0ccc015b Improve scaling 2026-03-18 21:03:39 +00:00
fa735bac88 Update scaling 2026-03-17 20:12:11 +00:00
97664054b7 Steam install 2026-03-15 17:03:58 +00:00
b3637e4d6f Refactoring install 2026-03-15 16:24:30 +00:00
10939f2ea3 More install scripts 2026-03-14 19:40:46 +00:00
2de91ed77b Improving scripts 2026-03-14 19:15:38 +00:00
23bbbbdbe8 Password manager 2026-03-14 17:48:40 +00:00
3f5b212d37 Add enpass launch"
"
2026-03-14 16:32:05 +00:00
dbeb4d02a4 Improve install 2026-03-14 16:07:57 +00:00
673748402a Change waybar 2026-03-14 13:15:47 +00:00
605b30c730 Update alias 2026-03-14 10:48:54 +00:00
41f219ddee Stuff 2026-03-09 23:21:04 +00:00
645dc16ce1 Stuff 2026-03-09 19:44:35 +00:00
67109d6f64 More fixes 2026-03-08 23:18:13 +00:00
4bc5a0a6c0 mako style 2026-03-08 21:19:33 +00:00
2aa98a181b Update waybar 2026-03-08 21:01:32 +00:00
99bcc94970 Colorscheme stuff 2026-03-08 20:51:14 +00:00
0918d86c6c Background stuff 2026-03-08 19:37:53 +00:00
91e15f6d48 Fix icon 2026-03-08 18:33:02 +00:00
6240282513 Organising 2026-03-08 18:24:38 +00:00
ca7d4accb9 Fixes 2026-03-08 17:17:22 +00:00
202a0be14b Voxtype 2026-03-08 17:14:04 +00:00
e63ec85def Lots of config 2026-03-08 00:25:01 +00:00
5723a8b677 Waybar7 2026-03-07 19:11:53 +00:00
380b0a9458 Walker 2026-03-07 13:01:48 +00:00
de78533fde Walker 2026-03-07 10:33:11 +00:00
4b1b60b660 Update menu 2026-03-07 09:45:21 +00:00
fa28c3b659 Fix waybar 2026-03-07 09:36:43 +00:00
e14b863bf3 Minecraft stuff 2026-03-07 00:26:25 +00:00
6a444b9de5 More config 2026-03-06 23:42:56 +00:00
3740b69b53 Lots of scripts 2026-03-06 22:33:30 +00:00
b1863b545a Adding stuff 2026-03-06 21:09:52 +00:00
38a5880704 Brightness controls 2026-03-06 19:39:49 +00:00
8ca70b0b49 Exec things 2026-03-06 18:50:36 +00:00
3ceeab3381 Fix monitor 2026-03-04 23:04:47 +00:00
b20d1f42b0 Xcompose 2026-03-04 21:22:35 +00:00
199 changed files with 4343 additions and 1814 deletions

View File

@@ -0,0 +1,110 @@
{
"Revision": "0.6.6.2",
"Profiles": [
{
"Tablet": "Wacom PTH-451",
"OutputMode": {
"Path": "OpenTabletDriver.Desktop.Output.LinuxArtistMode",
"Settings": [],
"Enable": true
},
"Filters": [],
"AbsoluteModeSettings": {
"Display": {
"Width": 2560.0,
"Height": 1440.0,
"X": 1280.0001,
"Y": 720.0,
"Rotation": 0.0
},
"Tablet": {
"Width": 157.48,
"Height": 88.5825,
"X": 78.74,
"Y": 49.2125,
"Rotation": 0.0
},
"EnableClipping": true,
"EnableAreaLimiting": false,
"LockAspectRatio": true
},
"RelativeModeSettings": {
"XSensitivity": 10.0,
"YSensitivity": 10.0,
"RelativeRotation": 0.0,
"RelativeResetDelay": "00:00:00.1000000"
},
"Bindings": {
"TipActivationThreshold": 1.0,
"TipButton": {
"Path": "OpenTabletDriver.Desktop.Binding.AdaptiveBinding",
"Settings": [
{
"Property": "Binding",
"Value": "Tip"
}
],
"Enable": true
},
"EraserActivationThreshold": 1.0,
"EraserButton": {
"Path": "OpenTabletDriver.Desktop.Binding.AdaptiveBinding",
"Settings": [
{
"Property": "Binding",
"Value": "Eraser"
}
],
"Enable": true
},
"PenButtons": [
{
"Path": "OpenTabletDriver.Desktop.Binding.AdaptiveBinding",
"Settings": [
{
"Property": "Binding",
"Value": "Button 1"
}
],
"Enable": true
},
{
"Path": "OpenTabletDriver.Desktop.Binding.AdaptiveBinding",
"Settings": [
{
"Property": "Binding",
"Value": "Button 2"
}
],
"Enable": true
}
],
"AuxButtons": [
{
"Path": "OpenTabletDriver.Desktop.Binding.MultiKeyBinding",
"Settings": [
{
"Property": "Keys",
"Value": "Control+Z"
}
],
"Enable": true
},
null,
null,
null,
null,
null
],
"MouseButtons": [],
"MouseScrollUp": null,
"MouseScrollDown": null,
"DisablePressure": false,
"DisableTilt": false
}
}
],
"LockUsableAreaDisplay": true,
"LockUsableAreaTablet": true,
"Tools": []
}

3
.config/brave-flags.conf Normal file
View File

@@ -0,0 +1,3 @@
--ozone-platform=wayland
--ozone-platform-hint=wayland
--enable-features=TouchpadOverscrollHistoryNavigation

257
.config/btop/btop.conf Normal file
View File

@@ -0,0 +1,257 @@
#? Config file for btop v. 1.4.5
#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes.
#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes"
color_theme = "current"
#* If the theme set background should be shown, set to False if you want terminal background transparency.
theme_background = True
#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false.
truecolor = True
#* Set to true to force tty mode regardless if a real tty has been detected or not.
#* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols.
force_tty = False
#* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets.
#* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box.
#* Use whitespace " " as separator between different presets.
#* Example: "cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty"
presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty"
#* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists.
#* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift.
vim_keys = True
#* Rounded corners on boxes, is ignored if TTY mode is ON.
rounded_corners = True
#* Default symbols to use for graph creation, "braille", "block" or "tty".
#* "braille" offers the highest resolution but might not be included in all fonts.
#* "block" has half the resolution of braille but uses more common characters.
#* "tty" uses only 3 different symbols but will work with most fonts and should work in a real TTY.
#* Note that "tty" only has half the horizontal resolution of the other two, so will show a shorter historical view.
graph_symbol = "braille"
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
graph_symbol_cpu = "default"
# Graph symbol to use for graphs in gpu box, "default", "braille", "block" or "tty".
graph_symbol_gpu = "default"
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
graph_symbol_mem = "default"
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
graph_symbol_net = "default"
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
graph_symbol_proc = "default"
#* Manually set which boxes to show. Available values are "cpu mem net proc" and "gpu0" through "gpu5", separate values with whitespace.
shown_boxes = "cpu mem net proc"
#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs.
update_ms = 2000
#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct",
#* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly.
proc_sorting = "cpu lazy"
#* Reverse sorting order, True or False.
proc_reversed = False
#* Show processes as a tree.
proc_tree = False
#* Use the cpu graph colors in the process list.
proc_colors = True
#* Use a darkening gradient in the process list.
proc_gradient = True
#* If process cpu usage should be of the core it's running on or usage of the total available cpu power.
proc_per_core = False
#* Show process memory as bytes instead of percent.
proc_mem_bytes = True
#* Show cpu graph for each process.
proc_cpu_graphs = True
#* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate)
proc_info_smaps = False
#* Show proc box on left side of screen instead of right.
proc_left = False
#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop).
proc_filter_kernel = False
#* In tree-view, always accumulate child process resources in the parent process.
proc_aggregate = False
#* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available.
#* Select from a list of detected attributes from the options menu.
cpu_graph_upper = "Auto"
#* Sets the CPU stat shown in lower half of the CPU graph, "total" is always available.
#* Select from a list of detected attributes from the options menu.
cpu_graph_lower = "Auto"
#* If gpu info should be shown in the cpu box. Available values = "Auto", "On" and "Off".
show_gpu_info = "Auto"
#* Toggles if the lower CPU graph should be inverted.
cpu_invert_lower = True
#* Set to True to completely disable the lower CPU graph.
cpu_single_graph = False
#* Show cpu box at bottom of screen instead of top.
cpu_bottom = False
#* Shows the system uptime in the CPU box.
show_uptime = True
#* Shows the CPU package current power consumption in watts. Requires running `make setcap` or `make setuid` or running with sudo.
show_cpu_watts = True
#* Show cpu temperature.
check_temp = True
#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors.
cpu_sensor = "Auto"
#* Show temperatures for cpu cores also if check_temp is True and sensors has been found.
show_coretemp = True
#* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core.
#* Use lm-sensors or similar to see which cores are reporting temperatures on your machine.
#* Format "x:y" x=core with wrong temp, y=core with correct temp, use space as separator between multiple entries.
#* Example: "4:0 5:1 6:3"
cpu_core_map = ""
#* Which temperature scale to use, available values: "celsius", "fahrenheit", "kelvin" and "rankine".
temp_scale = "celsius"
#* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024.
base_10_sizes = False
#* Show CPU frequency.
show_cpu_freq = True
#* Draw a clock at top of screen, formatting according to strftime, empty string to disable.
#* Special formatting: /host = hostname | /user = username | /uptime = system uptime
clock_format = "%X"
#* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort.
background_update = True
#* Custom cpu model name, empty string to disable.
custom_cpu_name = ""
#* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with whitespace " ".
#* Only disks matching the filter will be shown. Prepend exclude= to only show disks not matching the filter. Examples: disk_filter="/boot /home/user", disks_filter="exclude=/boot /home/user"
disks_filter = ""
#* Show graphs instead of meters for memory values.
mem_graphs = True
#* Show mem box below net box instead of above.
mem_below_net = False
#* Count ZFS ARC in cached and available memory.
zfs_arc_cached = True
#* If swap memory should be shown in memory box.
show_swap = True
#* Show swap as a disk, ignores show_swap value above, inserts itself after first disk.
swap_disk = True
#* If mem box should be split to also show disks info.
show_disks = True
#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar.
only_physical = True
#* Read disks list from /etc/fstab. This also disables only_physical.
use_fstab = True
#* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool)
zfs_hide_datasets = False
#* Set to true to show available disk space for privileged users.
disk_free_priv = False
#* Toggles if io activity % (disk busy time) should be shown in regular disk usage view.
show_io_stat = True
#* Toggles io mode for disks, showing big graphs for disk read/write speeds.
io_mode = False
#* Set to True to show combined read/write io graphs in io mode.
io_graph_combined = False
#* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ".
#* Example: "/mnt/media:100 /:20 /boot:1".
io_graph_speeds = ""
#* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False.
net_download = 100
net_upload = 100
#* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest.
net_auto = True
#* Sync the auto scaling for download and upload to whichever currently has the highest scale.
net_sync = True
#* Starts with the Network Interface specified here.
net_iface = ""
#* "True" shows bitrates in base 10 (Kbps, Mbps). "False" shows bitrates in binary sizes (Kibps, Mibps, etc.). "Auto" uses base_10_sizes.
base_10_bitrate = "Auto"
#* Show battery stats in top right if battery is present.
show_battery = True
#* Which battery to use if multiple are present. "Auto" for auto detection.
selected_battery = "Auto"
#* Show power stats of battery next to charge indicator.
show_battery_watts = True
#* Set loglevel for "~/.config/btop/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG".
#* The level set includes all lower levels, i.e. "DEBUG" will show all logging info.
log_level = "WARNING"
#* Measure PCIe throughput on NVIDIA cards, may impact performance on certain cards.
nvml_measure_pcie_speeds = True
#* Measure PCIe throughput on AMD cards, may impact performance on certain cards.
rsmi_measure_pcie_speeds = True
#* Horizontally mirror the GPU graph.
gpu_mirror_graph = True
#* Custom gpu0 model name, empty string to disable.
custom_gpu_name0 = ""
#* Custom gpu1 model name, empty string to disable.
custom_gpu_name1 = ""
#* Custom gpu2 model name, empty string to disable.
custom_gpu_name2 = ""
#* Custom gpu3 model name, empty string to disable.
custom_gpu_name3 = ""
#* Custom gpu4 model name, empty string to disable.
custom_gpu_name4 = ""
#* Custom gpu5 model name, empty string to disable.
custom_gpu_name5 = ""

View File

@@ -0,0 +1,3 @@
--ozone-platform=wayland
--ozone-platform-hint=wayland
--enable-features=TouchpadOverscrollHistoryNavigation

6
.config/direnv/direnvrc Normal file
View File

@@ -0,0 +1,6 @@
# Better support for Nix flakes
use_flake() {
watch_file flake.nix
watch_file flake.lock
eval "$(nix print-dev-env)"
}

View File

@@ -0,0 +1 @@
async = false

View File

@@ -0,0 +1,3 @@
show_actions = false
only_search_title = true
history = false

View File

@@ -0,0 +1,63 @@
Name = "stationBackgroundSelector"
NamePretty = "Station Background Selector"
Cache = false
HideFromProviderlist = true
SearchName = true
local function ShellEscape(s)
return "'" .. s:gsub("'", "'\\''") .. "'"
end
function FormatName(filename)
-- Remove leading number and dash
local name = filename:gsub("^%d+", ""):gsub("^%-", "")
-- Remove extension
name = name:gsub("%.[^%.]+$", "")
-- Replace dashes with spaces
name = name:gsub("-", " ")
-- Capitalize each word
name = name:gsub("%S+", function(word)
return word:sub(1, 1):upper() .. word:sub(2):lower()
end)
return name
end
function GetEntries()
local entries = {}
local home = os.getenv("HOME")
-- Directories to search
local dirs = {
home .. "/Tower/Library/Pictures/Wallpapers/3840x2160",
}
-- Track added files to avoid duplicates
local seen = {}
for _, wallpaper_dir in ipairs(dirs) do
local handle = io.popen(
"find " .. ShellEscape(wallpaper_dir)
.. " -maxdepth 1 -type f \\( -name '*.jpg' -o -name '*.jpeg' -o -name '*.png' -o -name '*.gif' -o -name '*.bmp' -o -name '*.webp' \\) 2>/dev/null | sort"
)
if handle then
for background in handle:lines() do
local filename = background:match("([^/]+)$")
if filename and not seen[filename] then
seen[filename] = true
table.insert(entries, {
Text = FormatName(filename),
Value = background,
Actions = {
activate = "station-bg-set " .. ShellEscape(background),
},
Preview = background,
PreviewType = "file",
})
end
end
handle:close()
end
end
return entries
end

View File

@@ -0,0 +1 @@
command = 'wl-copy && hyprctl dispatch sendshortcut "SHIFT, Insert,"'

View File

@@ -0,0 +1,4 @@
# INPUT_METHOD=fcitx
# QT_IM_MODULE=fcitx
# XMODIFIERS=@im=fcitx
# SDL_IM_MODULE=fcitx

View File

@@ -0,0 +1,2 @@
TriggerKey=
PastePrimaryKey=

View File

@@ -0,0 +1 @@
Allow Overriding System XKB Settings=False

View File

@@ -1,3 +1,6 @@
# Dynamic theme colors
config-file = ?"~/.cache/wal/ghostty.conf"
confirm-close-surface=false
keybind = all:unconsumed:ctrl+shift+,=reload_config
@@ -133,3 +136,37 @@ keybind = all:unconsumed:shift+arrow_left=unbind
keybind = all:unconsumed:shift+arrow_right=unbind
#adjust_selection:up
keybind = all:unconsumed:shift+arrow_up=unbind
# Font
font-family = "Fira Code Nerd Font"
font-style = Regular
font-size = 14
# Window
window-theme = ghostty
# window-padding-x = 14
# window-padding-y = 14
confirm-close-surface=false
resize-overlay = never
gtk-toolbar-style = flat
# Cursor styling
cursor-style = "block"
cursor-style-blink = false
# Cursor styling + SSH session terminfo
# (all shell integration options must be passed together)
shell-integration-features = no-cursor,ssh-env
# Keyboard bindings
keybind = shift+insert=paste_from_clipboard
keybind = control+insert=copy_to_clipboard
# Slowdown mouse scrolling
mouse-scroll-multiplier = 0.95
# Fix general slowness on hyprland (https://github.com/ghostty-org/ghostty/discussions/3224)
async-backend = epoll
background-opacity = 0.8
background-blur = false

View File

@@ -1,14 +1,36 @@
[user]
email = stofflees@gmail.com
name = Chris
email = stofflees@gmail.com
name = Chris
[pull]
rebase = true
rebase = true
[push]
autoSetupRemote = true
[init]
defaultBranch = main
defaultBranch = main
[core]
excludesfile = /home/chris/.config/git/ignore
excludesfile = /home/chris/.config/git/ignore
[filter "lfs"]
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
process = git-lfs filter-process
required = true
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
process = git-lfs filter-process
required = true
[alias]
co = checkout
br = branch
ci = commit
st = status
[diff]
algorithm = histogram # Clearer diffs on moved/edited lines
colorMoved = plain # Highlight moved blocks in diffs
mnemonicPrefix = true # More intuitive refs in diff output
[commit]
verbose = true # Include diff comment in commit message template
[column]
ui = auto # Output in columns when possible
[branch]
sort = -committerdate # Sort branches by most recent commit first
[tag]
sort = -version:refname # Sort version numbers as you would expect
[rerere]
enabled = true # Record and reuse conflict resolutions
autoupdate = true # Apply stored conflict resolutions automatically

View File

@@ -16,9 +16,9 @@ windowrule = opacity 1.0 0.97, match:tag chromium-based-browser
windowrule = opacity 1.0 0.97, match:tag firefox-based-browser
windowrule {
name = geforce
match:class = GeForceNOW
idle_inhibit = fullscreen
name = geforce
match:class = GeForceNOW
idle_inhibit = fullscreen
}
# Remove 1px border around hyprshot screenshots
@@ -67,6 +67,15 @@ windowrule {
match:class = ^(jetbrains-.*)$
}
# Keep enpass focused
windowrule {
name = enpass-assistant
match:title = ^(Enpass Assistant)$
match:class = ^(Enpass)$
stay_focused = on
center = on
}
# Float LocalSend and fzf file picker
windowrule = float on, match:class (Share|localsend)
windowrule = center on, match:class (Share|localsend)
@@ -88,12 +97,32 @@ windowrule = opacity 1 1, match:class qemu
# Retroarch
windowrule = fullscreen on, match:class com.libretro.RetroArch
windowrule = workspace 5, match:class com.libretro.RetroArch
windowrule = tag -default-opacity, match:class com.libretro.RetroArch
windowrule = opacity 1 1, match:class com.libretro.RetroArch
windowrule = idle_inhibit fullscreen, match:class com.libretro.RetroArch
# Scratchpad apps
windowrule = workspace special:scratchpad, match:class Spotify
windowrule = workspace special:scratchpad, match:class signal
windowrule = workspace special:scratchpad, match:class ^(chrome-discord.com__channels_@me-Default)$
windowrule = workspace special:scratchpad, match:class ^(chrome-web.whatsapp.com__-Default)$
# Float Nextcloud
windowrule = float on, match:class com.nextcloud.desktopclient.nextcloud
# Position drawing
windowrule = workspace 5, match:class (krita)
windowrule = tag -default-opacity, match:class (krita)
windowrule = opacity 1 1, match:class (krita)
# Position TV
windowrule = workspace 7, match:class ^(chrome-youtube.com__-Default)$
windowrule = workspace 7, match:class ^(chrome-netflix.com__-Default)$
# Float Steam
windowrule = float on, match:class steam
windowrule = workspace 7, match:class steam
windowrule = center on, match:class steam, match:title Steam
windowrule = tag -default-opacity, match:class steam.*
windowrule = opacity 1 1, match:class steam.*
@@ -101,19 +130,28 @@ windowrule = size 1100 700, match:class steam, match:title Steam
windowrule = size 460 800, match:class steam, match:title Friends List
windowrule = idle_inhibit fullscreen, match:class steam
# Float Lunar Client
windowrule = float on, match:class lunarclient
windowrule = workspace 7, match:class lunarclient
windowrule = center on, match:class lunarclient
windowrule = tag -default-opacity, match:class lunarclient
windowrule = opacity 1 1, match:class lunarclient
windowrule = size 1100 700, match:class lunarclient
windowrule = idle_inhibit fullscreen, match:class lunarclient
# Floating windows
windowrule = float on, match:tag floating-window
windowrule = center on, match:tag floating-window
windowrule = size 875 600, match:tag floating-window
windowrule = tag +floating-window, match:class (org.omarchy.bluetui|org.omarchy.impala|org.omarchy.wiremix|org.omarchy.btop|org.omarchy.terminal|org.omarchy.bash|org.gnome.NautilusPreviewer|org.gnome.Evince|com.gabm.satty|Omarchy|About|TUI.float|imv|mpv)
windowrule = tag +floating-window, match:class (org.station.bluetui|org.station.impala|org.station.wiremix|org.station.btop|org.station.terminal|org.station.bash|org.gnome.NautilusPreviewer|org.gnome.Evince|com.gabm.satty|Station|About|TUI.float|imv|mpv)
windowrule = tag +floating-window, match:class (xdg-desktop-portal-gtk|sublime_text|DesktopEditors|org.gnome.Nautilus), match:title ^(Open.*Files?|Open [F|f]older.*|Save.*Files?|Save.*As|Save|All Files|.*wants to [open|save].*|[C|c]hoose.*)
windowrule = float on, match:class org.gnome.Calculator
# Fullscreen screensaver
windowrule = fullscreen on, match:class org.omarchy.screensaver
windowrule = float on, match:class org.omarchy.screensaver
windowrule = animation slide, match:class org.omarchy.screensaver
windowrule = fullscreen on, match:class org.station.screensaver
windowrule = float on, match:class org.station.screensaver
windowrule = animation slide, match:class org.station.screensaver
# No transparency on media windows
windowrule = tag -default-opacity, match:class ^(zoom|vlc|mpv|org.kde.kdenlive|com.obsproject.Studio|com.github.PintaProject.Pinta|imv|org.gnome.NautilusPreviewer)$
@@ -142,3 +180,4 @@ windowrule = pin on, match:title WebcamOverlay
windowrule = no_initial_focus on, match:title WebcamOverlay
windowrule = no_dim on, match:title WebcamOverlay
windowrule = move (monitor_w-window_w-40) (monitor_h-window_h-40), match:title WebcamOverlay

View File

@@ -1,12 +1,11 @@
# exec-once = uwsm-app -- hypridle
# exec-once = uwsm-app -- mako
exec-once = uwsm-app -- hypridle
exec-once = uwsm-app -- mako
# exec-once = Enpass
# exec-once = uwsm-app -- waybar
# exec-once = uwsm-app -- fcitx5 --disable notificationitem
# exec-once = uwsm-app -- swaybg -i ~/.config/omarchy/current/background -m fill
# exec-once = uwsm-app -- swayosd-server
# exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
# exec-once = omarchy-cmd-first-run
exec-once = uwsm-app -- fcitx5 --disable notificationitem
exec-once = station-bg-random
exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
# Slow app launch fix -- set systemd vars
# exec-once = systemctl --user import-environment $(env | cut -d'=' -f 1)
# exec-once = dbus-update-activation-environment --systemd --all
exec-once = systemctl --user import-environment $(env | cut -d'=' -f 1)
exec-once = dbus-update-activation-environment --systemd --all

View File

@@ -2,33 +2,33 @@
# Media
# ==========================
# Only display the OSD on the currently focused monitor
# $osdclient = swayosd-client --monitor "$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name')"
$osdclient = swayosd-client --monitor "$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name')"
# Laptop multimedia keys for volume and LCD brightness (with OSD)
# bindeld = ,XF86AudioRaiseVolume, Volume up, exec, $osdclient --output-volume raise
# bindeld = ,XF86AudioLowerVolume, Volume down, exec, $osdclient --output-volume lower
# bindeld = ,XF86AudioMute, Mute, exec, $osdclient --output-volume mute-toggle
# bindeld = ,XF86AudioMicMute, Mute microphone, exec, $osdclient --input-volume mute-toggle
# bindeld = ,XF86MonBrightnessUp, Brightness up, exec, omarchy-brightness-display +5%
# bindeld = ,XF86MonBrightnessDown, Brightness down, exec, omarchy-brightness-display 5%-
# bindeld = ,XF86KbdBrightnessUp, Keyboard brightness up, exec, omarchy-brightness-keyboard up
# bindeld = ,XF86KbdBrightnessDown, Keyboard brightness down, exec, omarchy-brightness-keyboard down
# bindld = ,XF86KbdLightOnOff, Keyboard backlight cycle, exec, omarchy-brightness-keyboard cycle
bindeld = ,XF86AudioRaiseVolume, Volume up, exec, $osdclient --output-volume raise
bindeld = ,XF86AudioLowerVolume, Volume down, exec, $osdclient --output-volume lower
bindeld = ,XF86AudioMute, Mute, exec, $osdclient --output-volume mute-toggle
bindeld = ,XF86AudioMicMute, Mute microphone, exec, $osdclient --input-volume mute-toggle
bindeld = ,XF86MonBrightnessUp, Brightness up, exec, station-brightness-display +5%
bindeld = ,XF86MonBrightnessDown, Brightness down, exec, station-brightness-display 5%-
bindeld = ,XF86KbdBrightnessUp, Keyboard brightness up, exec, station-brightness-keyboard up
bindeld = ,XF86KbdBrightnessDown, Keyboard brightness down, exec, station-brightness-keyboard down
bindld = ,XF86KbdLightOnOff, Keyboard backlight cycle, exec, station-brightness-keyboard cycle
# Precise 1% multimedia adjustments with Alt modifier
# bindeld = ALT, XF86AudioRaiseVolume, Volume up precise, exec, $osdclient --output-volume +1
# bindeld = ALT, XF86AudioLowerVolume, Volume down precise, exec, $osdclient --output-volume -1
# bindeld = ALT, XF86MonBrightnessUp, Brightness up precise, exec, omarchy-brightness-display +1%
# bindeld = ALT, XF86MonBrightnessDown, Brightness down precise, exec, omarchy-brightness-display 1%-
bindeld = ALT, XF86AudioRaiseVolume, Volume up precise, exec, $osdclient --output-volume +1
bindeld = ALT, XF86AudioLowerVolume, Volume down precise, exec, $osdclient --output-volume -1
bindeld = ALT, XF86MonBrightnessUp, Brightness up precise, exec, station-brightness-display +1%
bindeld = ALT, XF86MonBrightnessDown, Brightness down precise, exec, station-brightness-display 1%-
# Requires playerctl
# bindld = , XF86AudioNext, Next track, exec, $osdclient --playerctl next
# bindld = , XF86AudioPause, Pause, exec, $osdclient --playerctl play-pause
# bindld = , XF86AudioPlay, Play, exec, $osdclient --playerctl play-pause
# bindld = , XF86AudioPrev, Previous track, exec, $osdclient --playerctl previous
bindld = , XF86AudioNext, Next track, exec, $osdclient --playerctl next
bindld = , XF86AudioPause, Pause, exec, $osdclient --playerctl play-pause
bindld = , XF86AudioPlay, Play, exec, $osdclient --playerctl play-pause
bindld = , XF86AudioPrev, Previous track, exec, $osdclient --playerctl previous
# Switch audio output with Super + Mute
# bindld = SUPER, XF86AudioMute, Switch audio output, exec, omarchy-cmd-audio-switch
bindld = SUPER, XF86AudioMute, Switch audio output, exec, station-cmd-audio-switch
# ==========================
# Copy & Paste
@@ -36,23 +36,23 @@
bindd = SUPER, C, Universal copy, sendshortcut, CTRL, Insert,
bindd = SUPER, V, Universal paste, sendshortcut, SHIFT, Insert,
bindd = SUPER, X, Universal cut, sendshortcut, CTRL, X,
# bindd = SUPER CTRL, V, Clipboard manager, exec, omarchy-launch-walker -m clipboard
bindd = SUPER CTRL, V, Clipboard manager, exec, station-launch-walker -m clipboard
# Close windows
bindd = SUPER, Q, Close window, killactive,
# bindd = CTRL ALT, DELETE, Close all windows, exec, omarchy-hyprland-window-close-all
bindd = CTRL ALT, DELETE, Close all windows, exec, station-hyprland-window-close-all
# ==========================
# Tiling
# ==========================
# bindd = SUPER, J, Toggle window split, togglesplit, # dwindle
bindd = SUPER CTRL, J, Toggle window split, togglesplit, # dwindle
bindd = SUPER, P, Pseudo window, pseudo, # dwindle
bindd = SUPER, T, Toggle window floating/tiling, togglefloating,
bindd = SUPER, F, Full screen, fullscreen, 0
bindd = SUPER CTRL, F, Tiled full screen, fullscreenstate, 0 2
bindd = SUPER ALT, F, Full width, fullscreen, 1
# bindd = SUPER, O, Pop window out (float & pin), exec, omarchy-hyprland-window-pop
# bindd = SUPER, L, Toggle workspace layout, exec, omarchy-hyprland-workspace-layout-toggle
bindd = SUPER, O, Pop window out (float & pin), exec, station-hyprland-window-pop
# bindd = SUPER CTRL, L, Toggle workspace layout, exec, station-hyprland-workspace-layout-toggle
# Move focus with SUPER + arrow keys
bindd = SUPER, H, Move window focus left, movefocus, l
@@ -60,68 +60,15 @@ bindd = SUPER, L, Move window focus right, movefocus, r
bindd = SUPER, K, Move window focus up, movefocus, u
bindd = SUPER, J, Move window focus down, movefocus, d
# Switch workspaces with SUPER + [1-9; 0]
bindd = SUPER, code:10, Switch to workspace 1, workspace, 1
bindd = SUPER, code:11, Switch to workspace 2, workspace, 2
bindd = SUPER, code:12, Switch to workspace 3, workspace, 3
bindd = SUPER, code:13, Switch to workspace 4, workspace, 4
bindd = SUPER, code:14, Switch to workspace 5, workspace, 5
bindd = SUPER, code:15, Switch to workspace 6, workspace, 6
bindd = SUPER, code:16, Switch to workspace 7, workspace, 7
bindd = SUPER, code:17, Switch to workspace 8, workspace, 8
bindd = SUPER, code:18, Switch to workspace 9, workspace, 9
bindd = SUPER, code:19, Switch to workspace 10, workspace, 10
# Move active window to a workspace with SUPER + SHIFT + [1-9; 0]
bindd = SUPER SHIFT, code:10, Move window to workspace 1, movetoworkspace, 1
bindd = SUPER SHIFT, code:11, Move window to workspace 2, movetoworkspace, 2
bindd = SUPER SHIFT, code:12, Move window to workspace 3, movetoworkspace, 3
bindd = SUPER SHIFT, code:13, Move window to workspace 4, movetoworkspace, 4
bindd = SUPER SHIFT, code:14, Move window to workspace 5, movetoworkspace, 5
bindd = SUPER SHIFT, code:15, Move window to workspace 6, movetoworkspace, 6
bindd = SUPER SHIFT, code:16, Move window to workspace 7, movetoworkspace, 7
bindd = SUPER SHIFT, code:17, Move window to workspace 8, movetoworkspace, 8
bindd = SUPER SHIFT, code:18, Move window to workspace 9, movetoworkspace, 9
bindd = SUPER SHIFT, code:19, Move window to workspace 10, movetoworkspace, 10
# Move active window silently to a workspace with SUPER + SHIFT + ALT + [1-9; 0]
bindd = SUPER SHIFT ALT, code:10, Move window silently to workspace 1, movetoworkspacesilent, 1
bindd = SUPER SHIFT ALT, code:11, Move window silently to workspace 2, movetoworkspacesilent, 2
bindd = SUPER SHIFT ALT, code:12, Move window silently to workspace 3, movetoworkspacesilent, 3
bindd = SUPER SHIFT ALT, code:13, Move window silently to workspace 4, movetoworkspacesilent, 4
bindd = SUPER SHIFT ALT, code:14, Move window silently to workspace 5, movetoworkspacesilent, 5
bindd = SUPER SHIFT ALT, code:15, Move window silently to workspace 6, movetoworkspacesilent, 6
bindd = SUPER SHIFT ALT, code:16, Move window silently to workspace 7, movetoworkspacesilent, 7
bindd = SUPER SHIFT ALT, code:17, Move window silently to workspace 8, movetoworkspacesilent, 8
bindd = SUPER SHIFT ALT, code:18, Move window silently to workspace 9, movetoworkspacesilent, 9
bindd = SUPER SHIFT ALT, code:19, Move window silently to workspace 10, movetoworkspacesilent, 10
# Control scratchpad
bindd = SUPER, S, Toggle scratchpad, togglespecialworkspace, scratchpad
bindd = SUPER ALT, S, Move window to scratchpad, movetoworkspacesilent, special:scratchpad
# TAB between workspaces
bindd = SUPER, TAB, Next workspace, workspace, e+1
bindd = SUPER SHIFT, TAB, Previous workspace, workspace, e-1
bindd = SUPER CTRL, TAB, Former workspace, workspace, previous
# Move workspaces to other monitors
bindd = SUPER SHIFT ALT, LEFT, Move workspace to left monitor, movecurrentworkspacetomonitor, l
bindd = SUPER SHIFT ALT, RIGHT, Move workspace to right monitor, movecurrentworkspacetomonitor, r
bindd = SUPER SHIFT ALT, UP, Move workspace to up monitor, movecurrentworkspacetomonitor, u
bindd = SUPER SHIFT ALT, DOWN, Move workspace to down monitor, movecurrentworkspacetomonitor, d
# Swap active window with the one next to it with SUPER + SHIFT + arrow keys
bindd = SUPER SHIFT, LEFT, Swap window to the left, swapwindow, l
bindd = SUPER SHIFT, RIGHT, Swap window to the right, swapwindow, r
bindd = SUPER SHIFT, UP, Swap window up, swapwindow, u
bindd = SUPER SHIFT, DOWN, Swap window down, swapwindow, d
# Cycle through applications on active workspace
bindd = ALT, TAB, Cycle to next window, cyclenext
bindd = ALT SHIFT, TAB, Cycle to prev window, cyclenext, prev
bindd = ALT, TAB, Reveal active window on top, bringactivetotop
bindd = ALT SHIFT, TAB, Reveal active window on top, bringactivetotop
bindd = SUPER, TAB, Cycle to next window, cyclenext, visible
bindd = SUPER SHIFT, TAB, Cycle to prev window, cyclenext, visible prev
bindd = SUPER, TAB, Reveal active window on top, bringactivetotop
bindd = SUPER SHIFT, TAB, Reveal active window on top, bringactivetotop
# Resize active window
bindd = SUPER, code:20, Expand window left, resizeactive, -100 0 # - key
@@ -169,60 +116,56 @@ bindd = SUPER ALT, code:14, Switch to group window 5, changegroupactive, 5
# ==========================
# Utilities
# ==========================
# bindd = SUPER, Slash, Cycle monitor scaling, exec, omarchy-hyprland-monitor-scaling-cycle
bindd = SUPER, Slash, Cycle monitor scaling, exec, station-hyprland-monitor-scaling-cycle
# Menus
# bindd = SUPER, SPACE, Launch apps, exec, omarchy-launch-walker
# bindd = SUPER CTRL, E, Emoji picker, exec, omarchy-launch-walker -m symbols
# bindd = SUPER CTRL, C, Capture menu, exec, omarchy-menu capture
# bindd = SUPER CTRL, O, Toggle menu, exec, omarchy-menu toggle
# bindd = SUPER ALT, SPACE, Omarchy menu, exec, omarchy-menu
# bindd = SUPER, ESCAPE, System menu, exec, omarchy-menu system
# bindld = , XF86PowerOff, Power menu, exec, omarchy-menu system
# bindd = SUPER, K, Show key bindings, exec, omarchy-menu-keybindings
# bindd = , XF86Calculator, Calculator, exec, gnome-calculator
bindd = SUPER, SPACE, Launch apps, exec, station-launch-walker
bindd = SUPER CTRL, E, Emoji picker, exec, station-launch-walker -m symbols
bindd = SUPER CTRL, C, Capture menu, exec, station-menu capture
bindd = SUPER CTRL, O, Toggle menu, exec, station-menu toggle
bindd = SUPER ALT, SPACE, Station menu, exec, station-menu
bindd = SUPER, ESCAPE, System menu, exec, station-menu system
bindld = , XF86PowerOff, Power menu, exec, station-menu system
bindd = SUPER, K, Show key bindings, exec, station-menu-keybindings
bindd = , XF86Calculator, Calculator, exec, gnome-calculator
# Aesthetics
# bindd = SUPER SHIFT, SPACE, Toggle top bar, exec, omarchy-toggle-waybar
# bindd = SUPER CTRL, SPACE, Theme background menu, exec, omarchy-menu background
# bindd = SUPER SHIFT CTRL, SPACE, Theme menu, exec, omarchy-menu theme
bindd = SUPER SHIFT, SPACE, Toggle top bar, exec, station-toggle-waybar
bindd = SUPER CTRL, SPACE, Theme background menu, exec, station-menu background
# bindd = SUPER SHIFT CTRL, SPACE, Theme menu, exec, station-menu theme
bindd = SUPER, BACKSPACE, Toggle window transparency, exec, hyprctl dispatch setprop "address:$(hyprctl activewindow -j | jq -r '.address')" opaque toggle
# bindd = SUPER SHIFT, BACKSPACE, Toggle window gaps, exec, omarchy-hyprland-window-gaps-toggle
# bindd = SUPER CTRL, Backspace, Toggle single-window square aspect, exec, omarchy-hyprland-window-single-square-aspect-toggle
bindd = SUPER SHIFT, BACKSPACE, Toggle window gaps, exec, station-hyprland-window-gaps-toggle
bindd = SUPER CTRL, Backspace, Toggle single-window square aspect, exec, station-hyprland-window-single-square-aspect-toggle
# Notifications
# bindd = SUPER, COMMA, Dismiss last notification, exec, makoctl dismiss
# bindd = SUPER SHIFT, COMMA, Dismiss all notifications, exec, makoctl dismiss --all
# bindd = SUPER CTRL, COMMA, Toggle silencing notifications, exec, omarchy-toggle-notification-silencing
# bindd = SUPER ALT, COMMA, Invoke last notification, exec, makoctl invoke
# bindd = SUPER SHIFT ALT, COMMA, Restore last notification, exec, makoctl restore
bindd = SUPER, COMMA, Dismiss last notification, exec, makoctl dismiss
bindd = SUPER SHIFT, COMMA, Dismiss all notifications, exec, makoctl dismiss --all
bindd = SUPER CTRL, COMMA, Toggle silencing notifications, exec, station-toggle-notification-silencing
bindd = SUPER ALT, COMMA, Invoke last notification, exec, makoctl invoke
bindd = SUPER SHIFT ALT, COMMA, Restore last notification, exec, makoctl restore
# Toggles
# bindd = SUPER CTRL, I, Toggle locking on idle, exec, omarchy-toggle-idle
# bindd = SUPER CTRL, N, Toggle nightlight, exec, omarchy-toggle-nightlight
# Control Apple Display brightness
# bindd = CTRL, F1, Apple Display brightness down, exec, omarchy-brightness-display-apple -5000
# bindd = CTRL, F2, Apple Display brightness up, exec, omarchy-brightness-display-apple +5000
# bindd = SHIFT CTRL, F2, Apple Display full brightness, exec, omarchy-brightness-display-apple +60000
bindd = SUPER CTRL, I, Toggle locking on idle, exec, station-toggle-idle
bindd = SUPER CTRL, N, Toggle nightlight, exec, station-toggle-nightlight
# Captures
# bindd = , PRINT, Screenshot, exec, omarchy-cmd-screenshot
# bindd = ALT, PRINT, Screenrecording, exec, omarchy-menu screenrecord
# bindd = SUPER, PRINT, Color picker, exec, pkill hyprpicker || hyprpicker -a
bindd = , PRINT, Screenshot, exec, station-cmd-screenshot
bindd = ALT, PRINT, Screenrecording, exec, station-menu screenrecord
bindd = SUPER, PRINT, Color picker, exec, pkill hyprpicker || hyprpicker -a
# File sharing
# bindd = SUPER CTRL, S, Share, exec, omarchy-menu share
bindd = SUPER CTRL, S, Share, exec, station-menu share
# Waybar-less information
bindd = SUPER CTRL ALT, T, Show time, exec, notify-send " $(date +"%A %H:%M — %d %B W%V %Y")"
bindd = SUPER CTRL ALT, B, Show battery remaining, exec, notify-send "󰁹 Battery is at $(omarchy-battery-remaining)%"
bindd = SUPER CTRL ALT, B, Show battery remaining, exec, notify-send "󰁹 Battery is at $(station-battery-remaining)%"
bindd = SUPER CTRL ALT, W, Show active window name and class, exec, notify-send "$(hyprctl activewindow -j | jq -r '"Window: \(.title)\nClass: \(.class)"')"
# Control panels
# bindd = SUPER CTRL, A, Audio controls, exec, omarchy-launch-audio
# bindd = SUPER CTRL, B, Bluetooth controls, exec, omarchy-launch-bluetooth
# bindd = SUPER CTRL, W, Wifi controls, exec, omarchy-launch-wifi
# bindd = SUPER CTRL, T, Activity, exec, omarchy-launch-tui btop
bindd = SUPER CTRL, A, Audio controls, exec, station-launch-audio
bindd = SUPER CTRL, B, Bluetooth controls, exec, station-launch-bluetooth
bindd = SUPER CTRL, W, Wifi controls, exec, station-launch-wifi
bindd = SUPER CTRL, T, Activity, exec, station-launch-tui btop
# Dictation
# bindd = SUPER CTRL, X, Toggle dictation, exec, voxtype record toggle
@@ -232,41 +175,36 @@ bindd = SUPER CTRL, Z, Zoom in, exec, hyprctl keyword cursor:zoom_factor $(hyprc
bindd = SUPER CTRL ALT, Z, Reset zoom, exec, hyprctl keyword cursor:zoom_factor 1
# Lock system
# bindd = SUPER CTRL, L, Lock system, exec, omarchy-lock-screen
bindd = SUPER CTRL, L, Lock system, exec, station-lock-screen
# ==========================
# Applications
# ==========================
bindd = SUPER, RETURN, Terminal, exec, uwsm-app -- xdg-terminal-exec --dir="$(station-cmd-terminal-cwd)"
bindd = SUPER, RETURN, Terminal, exec, uwsm-app -- xdg-terminal-exec
bindd = SUPER ALT, RETURN, Tmux, exec, uwsm-app -- xdg-terminal-exec --dir="$(station-cmd-terminal-cwd)" tmux new
bindd = SUPER SHIFT, F, File manager, exec, uwsm-app -- nautilus --new-window
# bindd = SUPER ALT SHIFT, F, File manager (cwd), exec, uwsm-app -- nautilus --new-window "$(omarchy-cmd-terminal-cwd)"
debug:disable_logs = false
bindd = SUPER ALT SHIFT, F, File manager (cwd), exec, uwsm-app -- nautilus --new-window "$(station-cmd-terminal-cwd)"
bindd = SUPER SHIFT, B, Browser, exec, /home/chris/.local/bin/station-launch-browser
bindd = SUPER SHIFT ALT, B, Browser (private), exec, station-launch-browser --private
# bindd = SUPER SHIFT, M, Music, exec, omarchy-launch-or-focus spotify
# bindd = SUPER SHIFT, N, Editor, exec, omarchy-launch-editor
# bindd = SUPER SHIFT, D, Docker, exec, omarchy-launch-tui lazydocker
# bindd = SUPER SHIFT, G, Signal, exec, omarchy-launch-or-focus ^signal$ "uwsm-app -- signal-desktop"
# bindd = SUPER SHIFT, O, Obsidian, exec, omarchy-launch-or-focus ^obsidian$ "uwsm-app -- obsidian -disable-gpu --enable-wayland-ime"
bindd = SUPER SHIFT, M, Music, exec, station-launch-or-focus spotify
bindd = SUPER SHIFT, N, Editor, exec, station-launch-editor
# bindd = SUPER SHIFT, D, Docker, exec, station-launch-tui lazydocker
bindd = SUPER SHIFT, G, Signal, exec, station-launch-or-focus ^signal$ "uwsm-app -- signal-desktop"
bindd = SUPER SHIFT, O, Obsidian, exec, station-launch-or-focus ^obsidian$ "uwsm-app -- obsidian -disable-gpu --enable-wayland-ime"
# bindd = SUPER SHIFT, W, Typora, exec, uwsm-app -- typora --enable-wayland-ime
bindd = SUPER SHIFT, SLASH, Passwords, exec, uwsm-app -- Enpass
bindd = SUPER SHIFT, SLASH, Passwords, exec, Enpass showassistant
bindd = SUPER SHIFT, E, Email, exec, station-launch-or-focus mailspring
# If your web app url contains #, type it as ## to prevent hyprland treating it as a comment
# bindd = SUPER SHIFT, A, ChatGPT, exec, omarchy-launch-webapp "https://chatgpt.com"
# bindd = SUPER SHIFT ALT, A, Grok, exec, omarchy-launch-webapp "https://grok.com"
# bindd = SUPER SHIFT, C, Calendar, exec, omarchy-launch-webapp "https://app.hey.com/calendar/weeks/"
# bindd = SUPER SHIFT, E, Email, exec, omarchy-launch-webapp "https://app.hey.com"
# bindd = SUPER SHIFT, Y, YouTube, exec, omarchy-launch-webapp "https://youtube.com/"
# bindd = SUPER SHIFT ALT, G, WhatsApp, exec, omarchy-launch-or-focus-webapp WhatsApp "https://web.whatsapp.com/"
# bindd = SUPER SHIFT CTRL, G, Google Messages, exec, omarchy-launch-or-focus-webapp "Google Messages" "https://messages.google.com/web/conversations"
# bindd = SUPER SHIFT, P, Google Photos, exec, omarchy-launch-or-focus-webapp "Google Photos" "https://photos.google.com/"
# bindd = SUPER SHIFT, X, X, exec, omarchy-launch-webapp "https://x.com/"
# bindd = SUPER SHIFT ALT, X, X Post, exec, omarchy-launch-webapp "https://x.com/compose/post"
bindd = SUPER SHIFT, A, ChatGPT, exec, station-launch-webapp "https://gemini.google.com/app"
bindd = SUPER SHIFT, C, Calendar, exec, station-launch-webapp "https://tower.scarif.space/apps/calendar"
bindd = SUPER SHIFT, Y, YouTube, exec, station-launch-or-focus-webapp "YouTube" "https://youtube.com/"
bindd = SUPER SHIFT ALT, G, WhatsApp, exec, station-launch-or-focus-webapp WhatsApp "https://web.whatsapp.com/"
bindd = SUPER SHIFT CTRL, G, Google Maps, exec, station-launch-or-focus-webapp "Google Maps" "https://maps.google.com"
# bindd = SUPER SHIFT, P, Google Photos, exec, station-launch-or-focus-webapp "Google Photos" "https://photos.google.com/"
# bindd = SUPER SHIFT, X, X, exec, station-launch-webapp "https://x.com/"
# bindd = SUPER SHIFT ALT, X, X Post, exec, station-launch-webapp "https://x.com/compose/post"
# Add extra bindings
# bind = SUPER SHIFT, R, exec, alacritty -e ssh your-server
bind = SUPER SHIFT, R, exec, ghostty -e ssh scarif
# Overwrite existing bindings, like putting Omarchy Menu on Super + Space
# unbind = SUPER, SPACE
# bindd = SUPER, SPACE, Omarchy menu, exec, omarchy-menu

View File

@@ -21,7 +21,7 @@ xwayland {
}
# Use XCompose file
env = XCOMPOSEFILE,~/.share/local/XCompose
env = XCOMPOSEFILE,~/.config/xcompose
# Don't show update on first launch
ecosystem {

View File

@@ -0,0 +1,28 @@
general {
lock_cmd = station-lock-screen # lock screen
before_sleep_cmd = loginctl lock-session # lock before suspend.
after_sleep_cmd = sleep 1 && hyprctl dispatch dpms on # delay for PAM readiness, then turn on display.
inhibit_sleep = 3 # wait until screen is locked
}
listener {
timeout = 300 # 5min
on-timeout = pidof hyprlock || station-launch-screensaver # start screensaver (if we haven't locked already)
}
listener {
timeout = 301 # 5min
on-timeout = loginctl lock-session # lock screen when timeout has passed
}
listener {
timeout = 330 # 5.5min
on-timeout = brightnessctl -sd '*::kbd_backlight' set 0 # save state and turn off keyboard backlight
on-resume = brightnessctl -rd '*::kbd_backlight' # restore keyboard backlight
}
listener {
timeout = 330 # 5.5min
on-timeout = station-system-suspend # suspend when timeout has passed
on-resume = hyprctl dispatch dpms on && brightnessctl -r # screen on when activity is detected
}

View File

@@ -7,4 +7,4 @@ source = ~/.config/hypr/windows.conf
source = ~/.config/hypr/monitors.conf
source = ~/.config/hypr/looknfeel.conf
source = ~/.config/hypr/autostart.conf
# source = ~/.config/hypr/theme.conf
source = ~/.config/hypr/workspaces.conf

View File

@@ -0,0 +1,43 @@
source = ~/.cache/wal/colors-hyprland.conf
general {
ignore_empty_input = true
}
background {
monitor =
color = $background
path = $wallpaper
blur_passes = 3
}
animations {
enabled = false
}
input-field {
monitor =
size = 650, 100
position = 0, 0
halign = center
valign = center
inner_color = $background
outer_color = $color14
outline_thickness = 4
font_family = JetBrainsMono Nerd Font
font_color = $foreground
placeholder_text = Enter Password
check_color = $color4
fail_text = <i>$FAIL ($ATTEMPTS)</i>
rounding = 0
shadow_passes = 0
fade_on_empty = false
}
auth {
fingerprint:enabled = false
}

View File

@@ -0,0 +1,14 @@
# Makes hyprsunset do nothing to the screen by default
# Without this, the default applies some tint to the monitor
profile {
time = 07:00
identity = true
}
# To enable auto switch to nightlight, set in your .config/hypr/autostart:
# exec-once = uwsm app -- hyprsunset
# and use the following:
# profile {
# time = 20:00
# temperature = 4000
# }

View File

@@ -1,6 +1,11 @@
# Variables
$activeBorderColor = rgba(33ccffee) rgba(00ff99ee) 45deg
$inactiveBorderColor = rgba(595959aa)
# $activeBorderColor = rgba(33ccffee) rgba(00ff99ee) 45deg
# $inactiveBorderColor = rgba(595959aa)
source = ~/.cache/wal/colors-hyprland.conf
$activeBorderColor = $color14
$inactiveBorderColor = $background
# https://wiki.hyprland.org/Configuring/Variables/#general
general {
@@ -129,6 +134,7 @@ misc {
focus_on_activate = true
anr_missed_pings = 3
on_focus_under_fullscreen = 1
disable_watchdog_warning = true
}
# https://wiki.hypr.land/Configuring/Variables/#cursor

View File

@@ -3,11 +3,10 @@
# Format: monitor = [port], resolution, position, scale
# Optimized for retina-class 2x displays, like 13" 2.8K, 27" 5K, 32" 6K.
env = GDK_SCALE,2
env = QT_AUTO_SCREEN_SCALE_FACTOR,1
env = QT_ENABLE_HIGHDPI_SCALING,1
env = QT_SCREEN_SCALE_FACTORS,2
monitor=eDP-1,3840x2160,0x0,2
# monitor=eDP-1,3840x2160,0x0,2
monitor=desc:Samsung Electric Company LU28R55 HNMN500475,3840x2160,auto-left,1.5
monitor=desc:Samsung Electric Company LU28R55 HNMN500462,3840x2160,auto-right,1.5
# monitor=HDMI-A-1,preferred,auto,auto
# Good compromise for 27" or 32" 4K monitors (but fractional!)
# env = GDK_SCALE,1.75

View File

@@ -0,0 +1,33 @@
workspace = 1, monitor:DP-1
workspace = 2, monitor:DP-2
workspace = 3, monitor:DP-1
workspace = 4, monitor:DP-2
workspace = 5, monitor:DP-1
workspace = 6, monitor:DP-2
workspace = 7, monitor:DP-1
workspace = 8, monitor:DP-2
workspace = 9, monitor:DP-1
workspace = 10, monitor:DP-2
bindd = SUPER, code:10, Switch to Home, workspace, 2
bindd = SUPER, code:10, Switch to Home, workspace, 1
bindd = SUPER, code:11, Switch to Dev, workspace, 4
bindd = SUPER, code:11, Switch to Dev, workspace, 3
bindd = SUPER, code:12, Switch to Art, workspace, 6
bindd = SUPER, code:12, Switch to Art, workspace, 5
bindd = SUPER, code:13, Switch to Gaming, workspace, 8
bindd = SUPER, code:13, Switch to Gaming, workspace, 7
bindd = SUPER, code:14, Switch to Writing, workspace, 10
bindd = SUPER, code:14, Switch to Writing, workspace, 9
# Move active window to a workspace with SUPER + SHIFT + [1-9; 0]
bindd = SUPER SHIFT, code:10, Move window to workspace 1, exec, station-move-to-workspace 1
bindd = SUPER SHIFT, code:11, Move window to workspace 1, exec, station-move-to-workspace 2
bindd = SUPER SHIFT, code:12, Move window to workspace 1, exec, station-move-to-workspace 3
bindd = SUPER SHIFT, code:13, Move window to workspace 1, exec, station-move-to-workspace 4
bindd = SUPER SHIFT, code:14, Move window to workspace 1, exec, station-move-to-workspace 5
bindd = SUPER SHIFT, L, Move window to right monitor, movewindow, r
bindd = SUPER SHIFT, H, Move window to left monitor, movewindow, l
bindd = SUPER SHIFT, J, Move window to right monitor, movewindow, d
bindd = SUPER SHIFT, K, Move window to left monitor, movewindow, u

View File

@@ -0,0 +1,71 @@
# paths to stylesheets on the filesystem which should be applied to the application
#
# relative paths are resolved relative to the location of the config file
stylesheets: ["../../.local/state/station/theme/hyprland-preview-share-picker.css"]
# default page selected when the picker is opened
default_page: windows
window:
# height of the application window
height: 500
# width of the application window
width: 1000
image:
# size to which the images should be internally resized to reduce the memory footprint
resize_size: 500
# target size of the longer side of the image widget
widget_size: 150
classes:
# css classname of the window
window: window
# css classname of the card containing an image and a label
image_card: card
# css classname of the card containing an image and a label when the image is still being loaded
image_card_loading: card-loading
# css classname of the image inside the card
image: image
# css classname of the label inside the card
image_label: image-label
# css classname of the notebook containing all pages
notebook: notebook
# css classname of a label of the notebook
tab_label: tab-label
# css classname of a notebook page (e.g. windows container)
notebook_page: page
# css classname of the region selection button
region_button: region-button
# css classname of the button containing the session restore checkbox and label
restore_button: restore-button
windows:
# minimum amount of image cards per row on the windows page
min_per_row: 3
# maximum amount of image cards per row on the windows page
max_per_row: 999
# number of clicks needed to select a window
clicks: 1
# spacing in pixels between the window cards
spacing: 12
outputs:
# number of clicks needed to select an output
clicks: 1
# spacing in pixels between the outputs in the layout
# note: the spacing is applied from both sides (the gap is `spacing * 2`)
spacing: 6
# show the label with the output name
show_label: false
# size the output cards respectively to their scaling
respect_output_scaling: true
region:
# command to run for region selection
# the output needs to be in the <output>@<x>,<y>,<w>,<h> (e.g. DP-3@2789,436,756,576) format
command: slurp -f '%o@%x,%y,%w,%h'
# hide the token restore checkbox and use the default value instead
hide_token_restore: true
# enable debug logs by default
debug: false

13
.config/imv/config Normal file
View File

@@ -0,0 +1,13 @@
[binds]
# Print the current image file
<Ctrl+p> = exec lp "$imv_current_file"
# Delete the current image and quit the viewer
<Ctrl+x> = exec rm "$imv_current_file"; quit
# Delete the current image and move to the next one
<Ctrl+Shift+X> = exec rm "$imv_current_file"; close
# Rotate the currently open image by 90 degrees
<Ctrl+r> = exec mogrify -rotate 90 "$imv_current_file"

30
.config/mako/config Normal file
View File

@@ -0,0 +1,30 @@
include=~/.cache/wal/colors-mako
anchor=top-right
default-timeout=5000
width=420
outer-margin=20
padding=10,15
border-size=2
max-icon-size=32
font=sans-serif 14px
[app-name=Spotify]
invisible=1
[mode=do-not-disturb]
invisible=true
[mode=do-not-disturb app-name=notify-send]
invisible=false
[urgency=critical]
default-timeout=0
layer=overlay
[summary~="Setup Wi-Fi"]
on-button-left=exec sh -c 'station-notification-dismiss "Setup Wi-Fi"; station-launch-wifi'
[summary~="Screenshot copied & saved"]
max-icon-size=80
format=<b>%s</b>\n%b

1
.config/nix/nix.conf Normal file
View File

@@ -0,0 +1 @@
extra-experimental-features = flakes nix-command

View File

@@ -0,0 +1,99 @@
import QtQuick 2.0
import SddmComponents 2.0
Rectangle {
id: root
width: 640
height: 480
color: "#000000"
property string currentUser: userModel.lastUser
property int sessionIndex: {
for (var i = 0; i < sessionModel.rowCount(); i++) {
var name = (sessionModel.data(sessionModel.index(i, 0), Qt.DisplayRole) || "").toString()
if (name.indexOf("uwsm") !== -1)
return i
}
return sessionModel.lastIndex
}
Connections {
target: sddm
function onLoginFailed() {
errorMessage.text = "Login failed"
password.text = ""
password.focus = true
}
function onLoginSucceeded() {
errorMessage.text = ""
}
}
Column {
anchors.centerIn: parent
spacing: root.height * 0.04
width: parent.width
// Image {
// source: "logo.svg"
// width: root.width * 0.35
// height: Math.round(width * sourceSize.height / sourceSize.width)
// fillMode: Image.PreserveAspectFit
// anchors.horizontalCenter: parent.horizontalCenter
// }
Row {
anchors.horizontalCenter: parent.horizontalCenter
spacing: root.width * 0.007
Text {
text: "\uf023"
color: "#ffffff"
font.family: "JetBrainsMono Nerd Font"
font.pixelSize: root.height * 0.025
anchors.verticalCenter: parent.verticalCenter
}
Rectangle {
width: root.width * 0.17
height: root.height * 0.04
color: "#000000"
border.color: "#ffffff"
border.width: 1
clip: true
TextInput {
id: password
anchors.fill: parent
anchors.margins: root.height * 0.008
verticalAlignment: TextInput.AlignVCenter
echoMode: TextInput.Password
font.family: "JetBrainsMono Nerd Font"
font.pixelSize: root.height * 0.02
font.letterSpacing: root.height * 0.004
passwordCharacter: "\u2022"
color: "#ffffff"
focus: true
Keys.onPressed: {
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) {
sddm.login(root.currentUser, password.text, root.sessionIndex)
event.accepted = true
}
}
}
}
}
Text {
id: errorMessage
text: ""
color: "#f7768e"
font.family: "JetBrainsMono Nerd Font"
font.pixelSize: root.height * 0.018
anchors.horizontalCenter: parent.horizontalCenter
}
}
Component.onCompleted: password.forceActiveFocus()
}

View File

@@ -0,0 +1,6 @@
[SddmGreeterTheme]
Name=Station
Description=Minimal terminal-style login theme matching the Limine bootloader aesthetic
Author=Station
Type=sddm-theme
Version=1.0

View File

@@ -0,0 +1 @@
[General]

View File

@@ -1,6 +1,5 @@
#!/bin/sh
# Use neovim for vim if present
[ -x "$(command -v nvim)" ] && alias vim="nvim" vimdiff="nvim -d"
@@ -14,6 +13,13 @@ done
# Verbosity and settings that you pretty much just always are going to want.
alias \
...="cd .." \
...="cd ../.." \
....="cd ../../.." \
.....="cd ../../../.." \
df="df -h" \
du="du -h" \
free="free -m" \
cp="cp -iv" \
mv="mv -iv" \
rm="rm -vI" \
@@ -25,45 +31,41 @@ alias \
tmux="tmux -f ~/.config/tmux/tmux.conf" \
aider="aider --config ~/.config/aider/aider.yaml"
alias ff="fzf --preview 'bat --style=numbers --color=always {}'"
alias eff='$EDITOR "$(ff)"'
if command -v eza &> /dev/null; then
alias ls='eza -lh --group-directories-first --icons=auto'
alias la='ls -al'
alias lt='eza --tree --level=2 --long --icons --git'
alias lta='lt -a'
fi
if command -v zoxide &> /dev/null; then
alias cd="zd"
zd() {
if (( $# == 0 )); then
builtin cd ~ || return
elif [[ -d $1 ]]; then
builtin cd "$1" || return
else
if ! z "$@"; then
echo "Error: Directory not found"
return 1
fi
printf "\U000F17A9 "
pwd
fi
if [[ -n $TMUX ]]; then
tmux rename-window "$(basename "$PWD")"
fi
}
fi
# Colorize commands when possible.
alias \
ls="ls -hAN --color=auto --group-directories-first"\
li="ls -AhgGFt --group-directories-first --time=atime --color=auto --time-style=long-iso \
| sed 's/^[^ ][^ ]* *[^ ][^ ]* //' \
| awk '\
/^total/ { next }\
{\
filename = \$NF;\
icon = \"📄\";\
if (filename ~ /\/$/) {\
icon = \"📁\";\
} else if (filename ~ /\*$/) {\
icon = \"⚙️ \";\
} else if (filename ~ /@$/) {\
icon = \"🔗\";\
} else {\
ext = tolower(cleanName);\
if (ext ~ /\./) {\
sub(/^.*\./, \"\", ext);\
} else {\
ext = \"\";\
}\
if (ext ~ /^(jpg|jpeg|png|gif)$/) {\
icon = \"🖼\";\
} else if (ext ~ /^(mp3|wav|flac)$/) {\
icon = \"🎵\";\
} else if (ext ~ /^(pdf)$/) {\
icon = \"📕\";\
} else if (ext ~ /^(txt|md)$/) {\
icon = \"📝\";\
} else if (ext ~ /^(js|py|sh|c|cpp|java)$/) {\
icon = \"⚡\";\
}\
}\
print icon \" \" \$0;\
}\
'" \
grep="grep --color=auto" \
diff="diff --color=auto" \
ccat="highlight --out-format=ansi"
@@ -73,11 +75,9 @@ alias \
ka="killall" \
YT="youtube-viewer" \
sdn="sudo shutdown -h now" \
e="$EDITOR" \
v="$EDITOR" \
cl="clear" \
p="sudo pacman" \
z="zathura" \
ll="ls -AhlFt --group-directories-first --time=atime --color=auto --time-style=long-iso" \
ag="alias | grep" \
lc="clone_from_labs" \
@@ -89,10 +89,6 @@ alias \
notes="cd ~/Tower/Notes && nvim ." \
aid="aider"
# Projects
alias \
src="tmuxinator start runcats"
# Dev
alias \
sail='[ -f sail ] && sh sail || sh vendor/bin/sail' \
@@ -112,15 +108,19 @@ alias \
enr="trans en:ro -j -- " \
enri="trans en:ro -i"
alias d='docker'
alias dc='docker compose'
alias t='tmux attach || tmux new -s Work'
e() { if [ "$#" -eq 0 ]; then command nvim . ; else command nvim "$@"; fi; }
open() (
xdg-open "$@" >/dev/null 2>&1 &
)
function tf() {
php artisan test --filter="$*"
}
function cdj() {
dir=$1
cd $1 2>/dev/null || autojump $1
}
function dut() {
threshold=${1:-5}
sudo du -hax -t"${threshold}G" /* --exclude=/{proc,sys,dev,run}
@@ -246,7 +246,6 @@ alias \
alias \
docker-compose="podman-compose" \
cat="bat" \
ls="eza --icons=always" \
fullClean="nix-collect-garbage --delete-old; sudo nix-collect-garbage -d; sudo /run/current-system/bin/switch-to-configuration boot" \

305
.config/shell/fns Executable file
View File

@@ -0,0 +1,305 @@
# Compression
compress() { tar -czf "${1%/}.tar.gz" "${1%/}"; }
alias decompress="tar -xzf"
# Write iso file to sd card
iso2sd() {
if (( $# < 1 )); then
echo "Usage: iso2sd <input_file> [output_device]"
echo "Example: iso2sd ~/Downloads/ubuntu-25.04-desktop-amd64.iso /dev/sda"
return 1
fi
local iso="$1"
local drive="$2"
if [[ -z $drive ]]; then
local available_sds=$(lsblk -dpno NAME | grep -E '/dev/sd')
if [[ -z $available_sds ]]; then
echo "No SD drives found and no drive specified"
return 1
fi
drive=$(omarchy-drive-select "$available_sds")
if [[ -z $drive ]]; then
echo "No drive selected"
return 1
fi
fi
sudo dd bs=4M status=progress oflag=sync if="$iso" of="$drive"
sudo eject "$drive"
}
# Format an entire drive for a single partition using exFAT
format-drive() {
if (( $# != 2 )); then
echo "Usage: format-drive <device> <name>"
echo "Example: format-drive /dev/sda 'My Stuff'"
echo -e "\nAvailable drives:"
lsblk -d -o NAME -n | awk '{print "/dev/"$1}'
else
echo "WARNING: This will completely erase all data on $1 and label it '$2'."
read -rp "Are you sure you want to continue? (y/N): " confirm
if [[ $confirm =~ ^[Yy]$ ]]; then
sudo wipefs -a "$1"
sudo dd if=/dev/zero of="$1" bs=1M count=100 status=progress
sudo parted -s "$1" mklabel gpt
sudo parted -s "$1" mkpart primary 1MiB 100%
sudo parted -s "$1" set 1 msftdata on
partition="$([[ $1 == *"nvme"* ]] && echo "${1}p1" || echo "${1}1")"
sudo partprobe "$1" || true
sudo udevadm settle || true
sudo mkfs.exfat -n "$2" "$partition"
echo "Drive $1 formatted as exFAT and labeled '$2'."
fi
fi
}
# SSH Port Forwarding Functions
fip() {
(( $# < 2 )) && echo "Usage: fip <host> <port1> [port2] ..." && return 1
local host="$1"
shift
for port in "$@"; do
ssh -f -N -L "$port:localhost:$port" "$host" && echo "Forwarding localhost:$port -> $host:$port"
done
}
dip() {
(( $# == 0 )) && echo "Usage: dip <port1> [port2] ..." && return 1
for port in "$@"; do
pkill -f "ssh.*-L $port:localhost:$port" && echo "Stopped forwarding port $port" || echo "No forwarding on port $port"
done
}
lip() {
pgrep -af "ssh.*-L [0-9]+:localhost:[0-9]+" || echo "No active forwards"
}
# Create a Tmux Dev Layout with editor, ai, and terminal
# Usage: tdl <c|cx|codex|other_ai> [<second_ai>]
tdl() {
[[ -z $1 ]] && { echo "Usage: tdl <c|cx|codex|other_ai> [<second_ai>]"; return 1; }
[[ -z $TMUX ]] && { echo "You must start tmux to use tdl."; return 1; }
local current_dir="${PWD}"
local editor_pane ai_pane ai2_pane
local ai="$1"
local ai2="$2"
# Use TMUX_PANE for the pane we're running in (stable even if active window changes)
editor_pane="$TMUX_PANE"
# Name the current window after the base directory name
tmux rename-window -t "$editor_pane" "$(basename "$current_dir")"
# Split window vertically - top 85%, bottom 15% (target editor pane explicitly)
tmux split-window -v -p 15 -t "$editor_pane" -c "$current_dir"
# Split editor pane horizontally - AI on right 30% (capture new pane ID directly)
ai_pane=$(tmux split-window -h -p 30 -t "$editor_pane" -c "$current_dir" -P -F '#{pane_id}')
# If second AI provided, split the AI pane vertically
if [[ -n $ai2 ]]; then
ai2_pane=$(tmux split-window -v -t "$ai_pane" -c "$current_dir" -P -F '#{pane_id}')
tmux send-keys -t "$ai2_pane" "$ai2" C-m
fi
# Run ai in the right pane
tmux send-keys -t "$ai_pane" "$ai" C-m
# Run nvim in the left pane
tmux send-keys -t "$editor_pane" "$EDITOR ." C-m
# Select the nvim pane for focus
tmux select-pane -t "$editor_pane"
}
# Create multiple tdl windows with one per subdirectory in the current directory
# Usage: tdlm <c|cx|codex|other_ai> [<second_ai>]
tdlm() {
[[ -z $1 ]] && { echo "Usage: tdlm <c|cx|codex|other_ai> [<second_ai>]"; return 1; }
[[ -z $TMUX ]] && { echo "You must start tmux to use tdlm."; return 1; }
local ai="$1"
local ai2="$2"
local base_dir="$PWD"
local first=true
# Rename the session to the current directory name (replace dots/colons which tmux disallows)
tmux rename-session "$(basename "$base_dir" | tr '.:' '--')"
for dir in "$base_dir"/*/; do
[[ -d $dir ]] || continue
local dirpath="${dir%/}"
if $first; then
# Reuse the current window for the first project
tmux send-keys -t "$TMUX_PANE" "cd '$dirpath' && tdl $ai $ai2" C-m
first=false
else
local pane_id=$(tmux new-window -c "$dirpath" -P -F '#{pane_id}')
tmux send-keys -t "$pane_id" "tdl $ai $ai2" C-m
fi
done
}
# Create a multi-pane swarm layout with the same command started in each pane (great for AI)
# Usage: tsl <pane_count> <command>
tsl() {
[[ -z $1 || -z $2 ]] && { echo "Usage: tsl <pane_count> <command>"; return 1; }
[[ -z $TMUX ]] && { echo "You must start tmux to use tsl."; return 1; }
local count="$1"
local cmd="$2"
local current_dir="${PWD}"
local -a panes
tmux rename-window -t "$TMUX_PANE" "$(basename "$current_dir")"
panes+=("$TMUX_PANE")
while (( ${#panes[@]} < count )); do
local new_pane
local split_target="${panes[-1]}"
new_pane=$(tmux split-window -h -t "$split_target" -c "$current_dir" -P -F '#{pane_id}')
panes+=("$new_pane")
tmux select-layout -t "${panes[0]}" tiled
done
for pane in "${panes[@]}"; do
tmux send-keys -t "$pane" "$cmd" C-m
done
tmux select-pane -t "${panes[0]}"
}
# Transcode a video to a good-balance 1080p that's great for sharing online
transcode-video-1080p() {
ffmpeg -i "$1" -vf scale=1920:1080 -c:v libx264 -preset fast -crf 23 -c:a copy "${1%.*}-1080p.mp4"
}
# Transcode a video to a good-balance 4K that's great for sharing online
transcode-video-4K() {
ffmpeg -i "$1" -c:v libx265 -preset slow -crf 24 -c:a aac -b:a 192k "${1%.*}-optimized.mp4"
}
# Transcode any image to JPG image that's great for shrinking wallpapers
img2jpg() {
img="$1"
shift
magick "$img" "$@" -quality 95 -strip "${img%.*}-converted.jpg"
}
# Transcode any image to a small JPG (max 1080px wide) that's great for sharing online
img2jpg-small() {
img="$1"
shift
magick "$img" "$@" -resize 1080x\> -quality 95 -strip "${img%.*}-small.jpg"
}
# Transcode any image to a medium JPG (max 1800px wide) that's great for sharing online
img2jpg-medium() {
img="$1"
shift
magick "$img" "$@" -resize 1800x\> -quality 95 -strip "${img%.*}-medium.jpg"
}
# Transcode any image to compressed-but-lossless PNG
img2png() {
img="$1"
shift
magick "$img" "$@" -strip -define png:compression-filter=5 \
-define png:compression-level=9 \
-define png:compression-strategy=1 \
-define png:exclude-chunk=all \
"${img%.*}-optimized.png"
}
# Create a new worktree and branch from within current git directory.
gwa() {
if [[ -z "$1" ]]; then
echo "Usage: ga [branch name]"
return 1
fi
local branch="$1"
local base="$(basename "$PWD")"
local path="../${base}--${branch}"
git worktree add -b "$branch" "$path"
mise trust "$path"
cd "$path"
}
# Remove worktree and branch from within active worktree directory.
gwd() {
if gum confirm "Remove worktree and branch?"; then
local cwd base branch root
cwd="$(pwd)"
worktree="$(basename "$cwd")"
# split on first `--`
root="${worktree%%--*}"
branch="${worktree#*--}"
# Protect against accidentially nuking a non-worktree directory
if [[ "$root" != "$worktree" ]]; then
cd "../$root"
git worktree remove "$worktree" --force
git branch -D "$branch"
fi
fi
}
linkenv() {
local env="${1:-dev}"
local env_files_directory="$HOME/Tower/.backups/Development/Environments"
# Fetch the closest git parent or current directory if not
local root_dir=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
local project_name=$(basename "$root_dir")
local source_file="$env_files_directory/${project_name}-${env}-env"
local target_file="$root_dir/.env"
if [[ -f "$target_file" ]]; then
if gum confirm "Overwrite existing .env file?"; then
if [[ -L "$target_file" ]]; then
rm "$target_file"
else
mv "$target_file" "${target_file}.bak"
echo "Existing .env backed up to .env.bak"
fi
else
return 1
fi
fi
if [[ -f "$source_file" ]]; then
ln -sf "$source_file" "$target_file"
echo "Linked $source_file -> $target_file"
else
echo "No environment file found for $project_name at $source_file copying example, copying example if exists"
if [[ -f "$root_dir/.env.example" ]]; then
cp "$root_dir/.env.example" "$source_file"
ln -sf "$source_file" "$target_file"
echo "Copied .env.example to $source_file and linked"
else
echo "No .env.example found."
fi
fi
}

View File

@@ -46,6 +46,8 @@ export ELECTRUMDIR="${XDG_DATA_HOME:-$HOME/.local/share}/electrum"
export ANDROID_AVD_HOME="${XDG_DATA_HOME:-$HOME/.local/share}/android/avd"
export ANDROID_USER_HOME="${XDG_DATA_HOME:-$HOME/.local/share}/android"
export CODEX_HOME="${XDG_CONFIG_HOME:-$HOME/.config}/codex"
export XCOMPOSEFILE="${XDG_CONFIG_HOME:-$HOME/.config}/xcompose"
export GEMINI_CLI_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
# Export OPENAI_API_KEY from GitHub Copilot config
# if [ -f "$HOME/.config/github-copilot/apps.json" ]; then
@@ -69,14 +71,15 @@ export LESS_TERMCAP_us="$(printf '%b' '\e[1;32m')"
export LESS_TERMCAP_ue="$(printf '%b' '\e[0m')"
export LESS_OPEN="| /usr/bin/highlight -O ansi %s 2>/dev/null"
export QT_QPA_PLATFORMTHEME="gtk2" # Have QT use gtk2 theme.
export QT_AUTO_SCREEN_SCALE_FACTOR=1
export QT_SCREEN_SCALE_FACTORS=2
# export QT_AUTO_SCREEN_SCALE_FACTOR=1
# export QT_SCREEN_SCALE_FACTORS=2
export MOZ_USE_XINPUT2="1" # Mozilla smooth scrolling/touchpads.
export _JAVA_AWT_WM_NONREPARENTING=1 # Fix for Java applications in dwm
# Development variables
export ANDROID_SDK_ROOT="$HOME/Android/Sdk"
export ANDROID_SDK_ROOT="$HOME/.local/share/android/Sdk"
export ANDROID_HOME="$ANDROID_SDK_ROOT"
export GRADLE_USER_HOME="${XDG_DATA_HOME:-$HOME/.local/share}/gradle"
export PATH="$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/cmdline-tools/bin:$ANDROID_HOME/platform-tools:$ANDROID_AVD_HOME:$ANDROID_HOME/emulator:$XDG_DATA_HOME/cargo/bin"
export PATH="$HOME/development/flutter/bin:$PATH"
@@ -175,8 +178,6 @@ export NVM_DIR="$HOME/.config/nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
source "$HOME/.local/share/../bin/env"
env_file="$HOME/.config/shell/.env"
if [ -f "$env_file" ]; then
set -a

28
.config/swayosd/style.css Normal file
View File

@@ -0,0 +1,28 @@
@import "../../.cache/wal/colors-waybar.css";
window {
border-radius: 0;
opacity: 0.97;
border: 2px solid @foreground;
background-color: @background;
}
label {
font-family: 'Fira Code Nerd Font';
font-size: 11pt;
color: @foreground;
}
image {
color: @foreground;
}
progressbar {
border-radius: 0;
}
progress {
background-color: @foreground;
}

View File

@@ -49,13 +49,13 @@ bind-key -T copy-mode-vi 'v' send -X begin-selection
bind-key -T copy-mode-vi 'y' send -X copy-selection-and-cancel
# Status bar
set -g status-left-length 52
set -g status-right-length 451
set -g status-style fg="white",bg="colour234"
set -g window-status-activity-style bold
set -g pane-border-style fg="colour245"
set -g pane-active-border-style fg="colour39"
set -g message-style bold,fg="colour16",bg="colour221"
# set -g status-left-length 52
# set -g status-right-length 451
# set -g status-style fg="white",bg="colour234"
# set -g window-status-activity-style bold
# set -g pane-border-style fg="colour245"
# set -g pane-active-border-style fg="colour39"
# set -g message-style bold,fg="colour16",bg="colour221"
# set -g status-left '#[fg=colour235,bg=colour252,bold] ❐ #S#[fg=colour252,bg=colour238,nobold]⮀#[fg=colour245,bg=colour238,bold] #(hostname)#[fg=colour238,bg=colour234,nobold]⮀'
# set -g status-right "#[fg=colour39, bg=colour234]⮂#[fg=colour234,bg=colour39] 🐳 "
# set -g window-status-format "#[fg=white,bg=colour234] #I #W "
@@ -81,3 +81,84 @@ bind-key -n User0 send-keys C-S-o
bind-key -n User0 send-keys C-S-y
bind-key -n User0 send-keys C-S-a
# Prefix
set -g prefix C-Space
set -g prefix2 C-b
bind C-Space send-prefix
# Reload config
bind q source-file ~/.config/tmux/tmux.conf
# Pane Controls
bind x kill-pane
bind -n C-M-Left select-pane -L
bind -n C-M-Right select-pane -R
bind -n C-M-Up select-pane -U
bind -n C-M-Down select-pane -D
bind -n C-M-S-Left resize-pane -L 5
bind -n C-M-S-Down resize-pane -D 5
bind -n C-M-S-Up resize-pane -U 5
bind -n C-M-S-Right resize-pane -R 5
# Window navigation
bind r command-prompt -I "#W" "rename-window -- '%%'"
bind c new-window -c "#{pane_current_path}"
bind -n M-1 select-window -t 1
bind -n M-2 select-window -t 2
bind -n M-3 select-window -t 3
bind -n M-4 select-window -t 4
bind -n M-5 select-window -t 5
bind -n M-6 select-window -t 6
bind -n M-7 select-window -t 7
bind -n M-8 select-window -t 8
bind -n M-9 select-window -t 9
bind -n M-Left select-window -t -1
bind -n M-Right select-window -t +1
bind -n M-S-Left swap-window -t -1 \; select-window -t -1
bind -n M-S-Right swap-window -t +1 \; select-window -t +1
# Session controls
bind R command-prompt -I "#S" "rename-session -- '%%'"
bind C new-session -c "#{pane_current_path}"
bind X kill-session
bind P switch-client -p
bind N switch-client -n
bind -n M-Up switch-client -p
bind -n M-Down switch-client -n
# General
set -g mouse on
set -g base-index 1
setw -g pane-base-index 1
set -g renumber-windows on
set -g history-limit 50000
set -g focus-events on
set -g set-clipboard on
set -g allow-passthrough on
setw -g aggressive-resize on
set -g detach-on-destroy off
# Status bar
set -g status-position top
set -g status-interval 5
set -g status-left-length 30
set -g status-right-length 50
set -g window-status-separator ""
# Theme
set -g status-style "bg=default,fg=default"
set -g status-left "#[fg=black,bg=blue,bold] #S #[bg=default] "
set -g status-right "#[fg=blue]#{?client_prefix,PREFIX ,}#{?window_zoomed_flag,ZOOM ,}#[fg=brightblack]#h "
set -g window-status-format "#[fg=brightblack] #I:#W "
set -g window-status-current-format "#[fg=blue,bold] #I:#W "
set -g pane-border-style "fg=brightblack"
set -g pane-active-border-style "fg=blue"
set -g message-style "bg=default,fg=blue"
set -g message-command-style "bg=default,fg=blue"
set -g mode-style "bg=blue,fg=black"
setw -g clock-mode-colour blue

13
.config/uwsm/default Normal file
View File

@@ -0,0 +1,13 @@
# Changes require a restart to take effect.
# Install other terminals via Install > Terminal
export TERMINAL=xdg-terminal-exec
# Use code for VSCode
export EDITOR=nvim
# Use a custom directory for screenshots (remember to make the directory!)
# export STATION_SCREENSHOT_DIR="$HOME/Pictures/Screenshots"
# Use a custom directory for screenrecordings (remember to make the directory!)
# export STATION_SCREENRECORD_DIR="$HOME/Videos/Screencasts"

16
.config/uwsm/env Normal file
View File

@@ -0,0 +1,16 @@
# Changes require a restart to take effect.
# Ensure Omarchy bins are in the path
export STATION_PATH=$HOME/.local/share/station
export PATH=$STATION_PATH/bin:$PATH
export GDK_SCALE=2
# export QT_AUTO_SCALE_FACTOR=1
# export QT_ENABLE_HIGHDPI_SCALING=1
export QT_SCALE_FACTOR=1.5
# Set default terminal and editor
source ~/.config/uwsm/default
# Activate mise if present on the system
station-cmd-present mise && eval "$(mise activate bash --shims)"

View File

@@ -0,0 +1,97 @@
# Voxtype Configuration
#
# Location: ~/.config/voxtype/config.toml
# All settings can be overridden via CLI flags
#
# State file for external integrations (Waybar, polybar, etc.)
# Use "auto" for default location ($XDG_RUNTIME_DIR/voxtype/state),
# a custom path, or "disabled" to turn off. The daemon writes state
# ("idle", "recording", "transcribing") to this file whenever it changes.
# Required for `voxtype record toggle` and `voxtype status` commands.
state_file = "auto"
[hotkey]
# Hotkey is configured in Hyprland. Default is Super + Ctrl + X
enabled = false
[audio]
# Audio input device ("default" uses system default)
# List devices with: pactl list sources short
device = "default"
# Sample rate in Hz (whisper expects 16000)
sample_rate = 16000
# Maximum recording duration in seconds (safety limit)
max_duration_secs = 60
# [audio.feedback]
# Enable audio feedback sounds (beeps when recording starts/stops)
# enabled = true
#
# Sound theme: "default", "subtle", "mechanical", or path to custom theme directory
# theme = "default"
#
# Volume level (0.0 to 1.0)
# volume = 0.7
[whisper]
# Model to use for transcription
# Options: tiny, tiny.en, base, base.en, small, small.en, medium, medium.en, large-v3, large-v3-turbo
# .en models are English-only but faster and more accurate for English
# large-v3-turbo is faster than large-v3 with minimal accuracy loss (recommended for GPU)
# Or provide absolute path to a custom .bin model file
model = "base.en"
# Language for transcription
# Use "en" for English, "auto" for auto-detection
# See: https://github.com/openai/whisper#available-models-and-languages
language = "en"
# Translate non-English speech to English
translate = false
# Number of CPU threads for inference (omit for auto-detection)
# threads = 4
[output]
# Primary output mode: "type" or "clipboard"
# - type: Simulates keyboard input at cursor position (requires ydotool)
# - clipboard: Copies text to clipboard (requires wl-copy)
mode = "type"
# Fall back to clipboard if typing fails
fallback_to_clipboard = true
# Delay between typed characters in milliseconds
# 0 = fastest possible, increase if characters are dropped
type_delay_ms = 1
# Post-processing command (optional)
# Pipe transcribed text through an external command for cleanup before output.
# The command receives text on stdin and outputs processed text on stdout.
# Useful for LLM-based text cleanup, grammar correction, filler word removal.
# On any failure (timeout, error), falls back to original transcription.
#
# [output.post_process]
# command = "ollama run llama3.2:1b 'Clean up this dictation. Fix grammar, remove filler words. Output only the cleaned text:'"
# timeout_ms = 30000 # 30 second timeout (generous for LLM)
[output.notification]
# Show notification when recording starts (hotkey pressed)
on_recording_start = false
# Show notification when recording stops (transcription beginning)
on_recording_stop = false
# Show notification with transcribed text after transcription completes
on_transcription = false
# [text]
# Text processing options (word replacements, spoken punctuation)
#
# Enable spoken punctuation conversion (e.g., say "period" to get ".")
# spoken_punctuation = false
#
# Custom word replacements (case-insensitive)
# replacements = { "hyperwhisper" = "hyprwhspr" }

View File

@@ -0,0 +1,49 @@
force_keyboard_focus = true # forces keyboard focuses to stay in Walker
selection_wrap = true # wrap list if at bottom or top
theme = "station-default" # theme to use
# additional_theme_location = "~/.config/walker/themes/"
hide_action_hints = true # globally hide the action hints
[placeholders]
"default" = { input = " Search...", list = "No Results" } # placeholders for input and empty list, key is the providers name, so f.e. "desktopapplications" or "menus:other"
[keybinds]
quick_activate = []
[columns]
symbols = 1 # providers to be queried by default
[providers]
max_results = 256 # 256 should be enough for everyone
default = [
"desktopapplications",
"websearch",
]
[[providers.prefixes]]
prefix = "/"
provider = "providerlist"
[[providers.prefixes]]
prefix = "."
provider = "files"
[[providers.prefixes]]
prefix = ":"
provider = "symbols"
[[providers.prefixes]]
prefix = "="
provider = "calc"
[[providers.prefixes]]
prefix = "@"
provider = "websearch"
[[providers.prefixes]]
prefix = "$"
provider = "clipboard"
[[emergencies]]
text = "Restart Walker"
command = "omarchy-restart-walker"

View File

@@ -0,0 +1,156 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk" version="4.0"></requires>
<object class="GtkWindow" id="Window">
<style>
<class name="window"></class>
</style>
<property name="resizable">true</property>
<property name="title">Walker</property>
<child>
<object class="GtkBox" id="BoxWrapper">
<style>
<class name="box-wrapper"></class>
</style>
<property name="width-request">644</property>
<property name="overflow">hidden</property>
<property name="orientation">horizontal</property>
<property name="valign">center</property>
<property name="halign">center</property>
<child>
<object class="GtkBox" id="Box">
<style>
<class name="box"></class>
</style>
<property name="orientation">vertical</property>
<property name="hexpand-set">true</property>
<property name="hexpand">true</property>
<property name="spacing">10</property>
<child>
<object class="GtkBox" id="SearchContainer">
<style>
<class name="search-container"></class>
</style>
<property name="overflow">hidden</property>
<property name="orientation">horizontal</property>
<property name="halign">fill</property>
<property name="hexpand-set">true</property>
<property name="hexpand">true</property>
<child>
<object class="GtkEntry" id="Input">
<style>
<class name="input"></class>
</style>
<property name="halign">fill</property>
<property name="hexpand-set">true</property>
<property name="hexpand">true</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox" id="ContentContainer">
<style>
<class name="content-container"></class>
</style>
<property name="orientation">horizontal</property>
<property name="spacing">10</property>
<property name="vexpand">true</property>
<property name="vexpand-set">true</property>
<child>
<object class="GtkLabel" id="ElephantHint">
<style>
<class name="elephant-hint"></class>
</style>
<property name="hexpand">true</property>
<property name="height-request">100</property>
<property name="label">Waiting for elephant...</property>
</object>
</child>
<child>
<object class="GtkLabel" id="Placeholder">
<style>
<class name="placeholder"></class>
</style>
<property name="label">No Results</property>
<property name="yalign">0.0</property>
<property name="hexpand">true</property>
</object>
</child>
<child>
<object class="GtkScrolledWindow" id="Scroll">
<style>
<class name="scroll"></class>
</style>
<property name="hexpand">true</property>
<property name="can_focus">false</property>
<property name="overlay-scrolling">true</property>
<property name="max-content-width">600</property>
<property name="max-content-height">300</property>
<property name="min-content-height">0</property>
<property name="propagate-natural-height">true</property>
<property name="propagate-natural-width">true</property>
<property name="hscrollbar-policy">automatic</property>
<property name="vscrollbar-policy">automatic</property>
<child>
<object class="GtkGridView" id="List">
<style>
<class name="list"></class>
</style>
<property name="max_columns">1</property>
<property name="can_focus">false</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox" id="Preview">
<style>
<class name="preview"></class>
</style>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox" id="Keybinds">
<property name="hexpand">true</property>
<property name="margin-top">10</property>
<style>
<class name="keybinds"></class>
</style>
<child>
<object class="GtkBox" id="GlobalKeybinds">
<property name="spacing">10</property>
<style>
<class name="global-keybinds"></class>
</style>
</object>
</child>
<child>
<object class="GtkBox" id="ItemKeybinds">
<property name="hexpand">true</property>
<property name="halign">end</property>
<property name="spacing">10</property>
<style>
<class name="item-keybinds"></class>
</style>
</object>
</child>
</object>
</child>
<child>
<object class="GtkLabel" id="Error">
<style>
<class name="error"></class>
</style>
<property name="xalign">0</property>
<property name="visible">false</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>

View File

@@ -0,0 +1,116 @@
@import "../../../../.cache/wal/colors-waybar.css";
* {
all: unset;
}
* {
font-family: monospace;
font-size: 18px;
color: @foreground;
}
scrollbar {
opacity: 0;
}
.normal-icons {
-gtk-icon-size: 16px;
}
.large-icons {
-gtk-icon-size: 32px;
}
.box-wrapper {
background: alpha(@background, 0.95);
padding: 20px;
border: 2px solid @foreground;
}
.preview-box {
}
.box {
}
.search-container {
background: @background;
padding: 10px;
}
.input placeholder {
opacity: 0.5;
}
.input {
}
.input:focus,
.input:active {
box-shadow: none;
outline: none;
}
.content-container {
}
.placeholder {
}
.scroll {
}
.list {
}
child,
child > * {
}
child:hover .item-box {
}
child:selected .item-box {
}
child:selected .item-box * {
color: @color14;
}
.item-box {
padding-left: 14px;
}
.item-text-box {
all: unset;
padding: 14px 0;
}
.item-text {
}
.item-subtext {
font-size: 0px;
min-height: 0px;
margin: 0px;
padding: 0px;
}
.item-image {
margin-right: 14px;
-gtk-icon-transform: scale(0.9);
}
.current {
font-style: italic;
}
.keybind-hints {
background: @background;
padding: 10px;
margin-top: 10px;
}
.preview {
}

View File

@@ -1,80 +1,162 @@
{
"layer": "top",
"position": "top",
"mod": "dock",
"exclusice": true,
"passthrough": false,
"gtk-layer-shell": true,
"height": 0,
"modules-left": [
"hyprland/workspaces"
],
"modules-center": ["hyprland/window"],
"modules-right": [
"tray",
"custom/updates",
"hyprland/language",
"pulseaudio",
"pulseaudio#microphone",
"clock",
"custom/weather"
],
"hyprland/window": {
"format": {}
},
"hyprland/workspaces": {
"disable-scroll": true,
"all-outputs": true,
"on-click": "activate",
"persisten_workspaces": {
"1": []
"reload_style_on_change": true,
"layer": "top",
"position": "top",
"spacing": 0,
"height": 26,
"modules-left": ["custom/station", "hyprland/workspaces"],
"modules-center": ["clock", "custom/voxtype", "custom/screenrecording-indicator", "custom/idle-indicator", "custom/notification-silencing-indicator"],
"modules-right": [
"group/tray-expander",
"bluetooth",
"network",
"pulseaudio",
"cpu",
"battery"
],
"hyprland/workspaces": {
"on-click": "activate",
"format": "{icon}",
"format-icons": {
"default": "",
"1": "",
"2": "",
"3": "",
"4": "",
"5": "",
"6": "",
"7": "",
"8": "",
"9": "󱚍",
"10": "󱚍",
},
"persistent-workspaces": {
"DP-1": [1, 3, 5, 7, 9],
"DP-2": [2, 4, 6, 8, 10]
}
},
"custom/station": {
"format": "<span font='station'>\ueb6a</span>",
"on-click": "station-menu",
"on-click-right": "xdg-terminal-exec",
"tooltip-format": "Station Menu\n\nSuper + Alt + Space"
},
"cpu": {
"interval": 5,
"format": "󰍛",
"on-click": "station-launch-or-focus-tui btop",
"on-click-right": "ghostty"
},
"clock": {
"format": "{:L%A %H:%M}",
"format-alt": "{:L%d %B W%V %Y}",
"tooltip": false,
"on-click-right": "station-launch-floating-terminal-with-presentation station-tz-select"
},
"network": {
"format-icons": ["󰤯", "󰤟", "󰤢", "󰤥", "󰤨"],
"format": "{icon}",
"format-wifi": "{icon}",
"format-ethernet": "󰀂",
"format-disconnected": "󰤮",
"tooltip-format-wifi": "{essid} ({frequency} GHz)\n⇣{bandwidthDownBytes} ⇡{bandwidthUpBytes}",
"tooltip-format-ethernet": "⇣{bandwidthDownBytes} ⇡{bandwidthUpBytes}",
"tooltip-format-disconnected": "Disconnected",
"interval": 3,
"spacing": 1,
"on-click": "station-launch-wifi"
},
"battery": {
"format": "{capacity}% {icon}",
"format-discharging": "{icon}",
"format-charging": "{icon}",
"format-plugged": "",
"format-icons": {
"charging": ["󰢜", "󰂆", "󰂇", "󰂈", "󰢝", "󰂉", "󰢞", "󰂊", "󰂋", "󰂅"],
"default": ["󰁺", "󰁻", "󰁼", "󰁽", "󰁾", "󰁿", "󰂀", "󰂁", "󰂂", "󰁹"]
},
"format-full": "󰂅",
"tooltip-format-discharging": "{power:>1.0f}W↓ {capacity}%",
"tooltip-format-charging": "{power:>1.0f}W↑ {capacity}%",
"interval": 5,
"on-click": "station-menu power",
"states": {
"warning": 20,
"critical": 10
}
},
"bluetooth": {
"format": "",
"format-off": "󰂲",
"format-disabled": "󰂲",
"format-connected": "󰂱",
"format-no-controller": "",
"tooltip-format": "Devices connected: {num_connections}",
"on-click": "station-launch-bluetooth"
},
"pulseaudio": {
"format": "{icon}",
"on-click": "station-launch-audio",
"on-click-right": "pamixer -t",
"tooltip-format": "Playing at {volume}%",
"scroll-step": 5,
"format-muted": "",
"format-icons": {
"headphone": "",
"headset": "",
"default": ["", "", ""]
}
},
"group/tray-expander": {
"orientation": "inherit",
"drawer": {
"transition-duration": 600,
"children-class": "tray-group-item"
},
"modules": ["custom/expand-icon", "tray"]
},
"custom/expand-icon": {
"format": "",
"tooltip": false,
"on-scroll-up": "",
"on-scroll-down": "",
"on-scroll-left": "",
"on-scroll-right": ""
},
"custom/screenrecording-indicator": {
"on-click": "station-cmd-screenrecord",
"exec": "$HOME/.config/waybar/indicators/screen-recording.sh",
"signal": 8,
"return-type": "json"
},
"custom/idle-indicator": {
"on-click": "station-toggle-idle",
"exec": "$HOME/.config/waybar/indicators/idle.sh",
"signal": 9,
"return-type": "json"
},
"custom/notification-silencing-indicator": {
"on-click": "station-toggle-notification-silencing",
"exec": "$HOME/.config/waybar/indicators/notification-silencing.sh",
"signal": 10,
"return-type": "json"
},
"custom/voxtype": {
"exec": "station-voxtype-status",
"return-type": "json",
"format": "{icon}",
"format-icons": {
"idle": "",
"recording": "󰍬",
"transcribing": "󰔟"
},
"tooltip": true,
"on-click-right": "station-voxtype-config",
"on-click": "station-voxtype-model"
},
"tray": {
"icon-size": 12,
"spacing": 17
}
},
"hyprland/language": {
"format": "{}",
"format-en": "EN",
"format-ro": "RO"
},
"custom/weather": {
"tooltip": true,
"format": "{}",
"interval": 30,
"exec": "~/.config/waybar/scripts/waybar-wttr.py",
"return-type": "json"
},
"tray": {
"icon-size": 16,
"spacing": 10
},
"clock": {
"format": "{:%R %d%M}",
"tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>"
},
"pulseaudio": {
"format": "{icon} {volume}%",
"tooltip": false,
"format-muted": "Muted",
"on-click": "pamixer -t",
"on-scroll-up": "pamixer -i 5",
"on-scroll-down": "pamixer -d 5",
"scroll-step": 5
// "format-icons": {
// "headphones": "",
// "hands-free": "",
// "headset": "",
// "phone": "",
// "portable": "",
// "car": "",
// "default": ["", "", ""]
// }
},
"pulseaudio#microphone": {
"format": "{format_source}",
"format-source": "{volume}%",
"format-source-muted": "Muted",
"on-click": "pamixer --default-source -t",
"on-scroll-up": "pamixer --default-source -i 5",
"on-scroll-down": "pamixer --default-source -d 5",
"scroll-step": 5
}
}

View File

@@ -0,0 +1,7 @@
#!/bin/bash
if pgrep -x hypridle >/dev/null; then
echo '{"text": ""}'
else
echo '{"text": "󱫖", "tooltip": "Idle lock disabled", "class": "active"}'
fi

View File

@@ -0,0 +1,7 @@
#!/bin/bash
if makoctl mode | grep -q 'do-not-disturb'; then
echo '{"text": "󰂛", "tooltip": "Notifications silenced", "class": "active"}'
else
echo '{"text": ""}'
fi

View File

@@ -0,0 +1,7 @@
#!/bin/bash
if pgrep -f "^gpu-screen-recorder" >/dev/null; then
echo '{"text": "󰻂", "tooltip": "Stop recording", "class": "active"}'
else
echo '{"text": ""}'
fi

View File

@@ -1,124 +0,0 @@
#!/run/current-system/sw/bin/python
import json
from datetime import datetime
import requests
WEATHER_CODES = {
"113": "Sunny",
"116": "Patchy",
"119": "Cloudy",
"122": "Cloudy",
"143": "Cloudy",
"176": "Rain",
"179": "Rain",
"182": "Rain",
"185": "Rain",
"200": "Storm",
"227": "Rain",
"230": "Rain",
"248": "Cloudy",
"260": "Cloudy",
"263": "Rain",
"266": "Rain",
"281": "Rain",
"284": "Rain",
"293": "Rain",
"296": "Rain",
"299": "Rain",
"302": "Rain",
"305": "Rain",
"308": "Rain",
"311": "Rain",
"314": "Rain",
"317": "Rain",
"320": "Rain",
"323": "Rain",
"326": "Rain",
"329": "Snow",
"332": "Snow",
"335": "Snow",
"338": "Snow",
"350": "Rain",
"353": "Rain",
"356": "Rain",
"359": "Rain",
"362": "Rain",
"365": "Rain",
"368": "Rain",
"371": "Snow",
"374": "Rain",
"377": "Rain",
"386": "Rain",
"389": "Rain",
"392": "Rain",
"395": "Snow",
}
data = {}
weather = request.get("https://wttr.in/?format=j1").json()
def format_time(time):
return time.replace("00", "").zfill(2)
def format_temp(temp):
return(temp["FeelsLikeC"] + "o").ljust(3)
def format_chances(hour):
chances = {
"chancesoffog": "Fog",
"chancesoffrost": "Frost",
"chancesofovercast": "Overcast",
"chancesofrain": "Rain",
"chancesofsnow": "Snow",
"chancesofsunshine": "Sunshine",
"chancesofthunder": "Thunder",
"chancesofwindy": "Wind",
}
conditions = []
for event in chances.keys():
if int(hour[event]) > 0:
conditions.append(chances[event] + "" + hour[event] + "%")
return ", ".join(conditions)
tempint = int(weather["current_condition"][0]["FeelsLikeC"])
extrachar = ""
if tempint > 0 and tempint < 10:
extrachar = "+"
data["text"] = (
" "
+ WEATHER_CODES[weather["current_condition"][0]["weatherCode"]]
+ " "
+ extrachar
+ weather["current_condition"][0]["FeelsLikeC"]
+ "o"
)
data["tooltip"] = (
f"<b>{weather['current_condition'][0]['weatherDesc'][0]['value']} {weather['current_condition'][0]['temp_C']}o</b>\n"
)
data["tooltip"] += f"Feels like: {weather['current_condition'][0]['FeelsLikeC']}o\n"
data["tooltip"] += f"Wind: {weather['current_condition'][0]['WindspeedKmph']}Km/h\n"
data["tooltip"] += f"Humidity: {weather['current_condition'][0]['FeelsLikeC']}%\n"
for i, day in enumerate(weather["weather"]):
data["tooltip"] += f"\n<b>"
if i == 0:
data["tooltip"] += "Today, "
if i == 1:
data["tooltip"] += "Tomorrow, "
data["tooltip"] += f"{day['date']}</b>\n"
data["tooltip"] += f"Up {day['maxtempC']}o Down {day['mintempC']}o "
data["tooltip"] += f"Sunrise {day['astronomy'][0]['sunrise']} Sunset {day['astronomy'][0]['sunset']} \n"
for hour in day["hourly"]:
if i == 0"
if int(format_time(hour["time"])) < datetime.now().hour - 2:
continue
data["tooltip"] += f"{format_time(hour['time'])} {WEATHER_CODES[hour['weatherCode']]} {format_temp(hour['FeelsLikeC'])} {hour['weatherDesc'][0]['value']}, {format_chances(hour)}\n"
print(json.dumps(data))

View File

@@ -1,149 +1,111 @@
@import "../../.cache/wal/colors-waybar.css";
* {
border: none;
border-radius: 0;
font-family:
JetBrains Mono Nerd Font,
monospace;
font-weight: bold;
font-size: 14px;
min-height: 0;
background-color: @background;
color: @foreground;
border: none;
border-radius: 0;
min-height: 0;
font-family: 'Fira Code Nerd Font';
font-size: 20px;
margin: 1px 0;
}
window#waybar {
background: rgba(21, 18, 27, 0);
color: #cdd6f4;
.modules-left {
margin-left: 8px;
}
tooltip {
background: #1e1e2e;
border-radius: 10px;
border-width: 2px;
border-style: solid;
border-color: #11111b;
}
#workspaces button {
padding: 5px;
color: #313244;
margin-right: 5px;
}
#workspaces button.active {
color: #a6adc8;
}
#workspaces button.focused {
color: #a6adc8;
background: #eba0ac;
border-radius: 10px;
}
#workspaces button.urgent {
color: #11111b;
background: #a6e3a1;
border-radius: 10px;
}
#workspaces button.active {
color: #11111b;
background: #cdd6f4;
border-radius: 10px;
}
#language,
#custom-updates,
#custom-caffeine,
#custom-weather,
#window,
#clock,
#battery,
#pulseaudio,
#network,
#workspaces,
#tray,
#backlight {
background: #1e1e2e;
padding: 0px 10px;
margin: 3px 0px;
margin-top: 10px;
border: 1px solid #181825;
}
#tray {
border-radius: 10px;
margin-right: 10px;
.modules-right {
margin-right: 8px;
}
#workspaces {
background: #1e1e2e;
border-radius: 10px;
margin-left: 10px;
padding-right: 0px;
padding-left: 5px;
margin-left: 10px;
}
#custom-caffeine {
color: #89dceb;
border-radius: 10px 0 0 10px;
border-right: 0;
margin-left: 10px;
#workspaces button {
all: initial;
padding: 0 6px;
margin: 0 1.5px;
margin: 0 5px;
min-width: 15px;
color: blue;
}
#custom-language {
color: #f38ba8;
border-right: 0;
border-left: 0;
#workspaces button.empty {
opacity: 0.5;
}
#custom-updates {
color: #f5c2e7;
border-radius: 10px 0 0 10px;
border-left: 0;
border-right: 0;
#workspaces button.active .workspace-label {
color: @color13;
}
#window {
border-radius: 10px;
margin-left: 0;
margin-right: 0;
#cpu,
#battery,
#pulseaudio,
#custom-omarchy,
#custom-update {
min-width: 12px;
margin: 0 7.5px;
}
#clock {
color: #fab387;
border-radius: 10px 0 0 10px;
margin-left: 5px;
border-right: 0px;
#tray {
margin-right: 16px;
}
#bluetooth {
margin-right: 17px;
}
#network {
color: #f9e2af;
border-left: 0px;
border-right: 0px;
margin-right: 13px;
}
#pulseaudio {
color: #89b4fa;
border-left: 0px;
border-right: 0px;
#custom-expand-icon {
margin-right: 18px;
}
#pulseaudio.microphone {
color: #cba6f7;
border-radius: 0 10px 10px 0;
border-left: 0;
border-right: 0;
margin-right: 5px;
tooltip {
padding: 2px;
}
#battery {
color: #a6e3a1;
border-radius: 0 10px 10px 0;
margin-right: 10px;
border-left: 0px;
#custom-update {
font-size: 10px;
}
#custom-weather {
border-radius: 0 10px 10px 0;
border-right: 0;
margin-left: 0;
#clock {
margin-left: 8.75px;
}
.hidden {
opacity: 0;
}
#custom-screenrecording-indicator,
#custom-idle-indicator,
#custom-notification-silencing-indicator {
min-width: 12px;
margin-left: 5px;
margin-right: 0;
font-size: 10px;
padding-bottom: 1px;
}
#custom-screenrecording-indicator.active {
color: #a55555;
}
#custom-idle-indicator.active,
#custom-notification-silencing-indicator.active {
color: #a55555;
}
#custom-voxtype {
min-width: 12px;
margin: 0 0 0 7.5px;
}
#custom-voxtype.recording {
color: #a55555;
}

View File

@@ -0,0 +1,5 @@
# overwrites default wiremix configuration
# defaults: https://github.com/tsowell/wiremix/blob/main/wiremix.toml
[char_sets.default]
default_device = "⮞"

35
.config/xcompose Normal file
View File

@@ -0,0 +1,35 @@
# Run station-restart-xcompose to apply changes
include "%L"
# Emoji
<Multi_key> <m> <s> : "😄" # smile
<Multi_key> <m> <c> : "😂" # cry
<Multi_key> <m> <l> : "😍" # love
<Multi_key> <m> <v> : "✌️" # victory
<Multi_key> <m> <h> : "❤️" # heart
<Multi_key> <m> <y> : "👍" # yes
<Multi_key> <m> <n> : "👎" # no
<Multi_key> <m> <f> : "🖕" # fuck
<Multi_key> <m> <w> : "🤞" # wish
<Multi_key> <m> <r> : "🤘" # rock
<Multi_key> <m> <k> : "😘" # kiss
<Multi_key> <m> <e> : "🙄" # eyeroll
<Multi_key> <m> <d> : "🤤" # droll
<Multi_key> <m> <m> : "💰" # money
<Multi_key> <m> <x> : "🎉" # xellebrate
<Multi_key> <m> <1> : "💯" # 100%
<Multi_key> <m> <t> : "🥂" # toast
<Multi_key> <m> <p> : "🙏" # pray
<Multi_key> <m> <i> : "😉" # wink
<Multi_key> <m> <o> : "👌" # OK
<Multi_key> <m> <g> : "👋" # greeting
<Multi_key> <m> <a> : "💪" # arm
<Multi_key> <m> <b> : "🤯" # blowing
# Typography
<Multi_key> <space> <space> : "—"
# Identification
<Multi_key> <space> <n> : "chris"
<Multi_key> <space> <e> : "stofflees@gmail.com"

View File

@@ -0,0 +1,268 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--The Xournal++ settings file. Do not edit this file! Most settings are available in the Settings dialog, the others are commented in this file, but handle with care!-->
<settings>
<property name="pressureSensitivity" value="true"/>
<property name="minimumPressure" value="0.05"/>
<property name="pressureMultiplier" value="1"/>
<property name="zoomGesturesEnabled" value="true"/>
<property name="selectedToolbar" value="Portrait"/>
<property name="lastSavePath" value="/home/dhh/Downloads"/>
<property name="lastOpenPath" value=""/>
<property name="lastImagePath" value="/home/dhh/Dropbox/Images"/>
<property name="edgePanSpeed" value="20"/>
<property name="edgePanMaxMult" value="5"/>
<property name="zoomStep" value="10"/>
<property name="zoomStepScroll" value="2"/>
<property name="displayDpi" value="72"/>
<property name="mainWndWidth" value="800"/>
<property name="mainWndHeight" value="600"/>
<property name="maximized" value="true"/>
<property name="showToolbar" value="true"/>
<property name="showSidebar" value="true"/>
<property name="sidebarWidth" value="150"/>
<property name="sidebarNumberingStyle" value="1"/>
<property name="sidebarOnRight" value="false"/>
<property name="scrollbarOnLeft" value="false"/>
<property name="menubarVisible" value="true"/>
<property name="filepathShownInTitlebar" value="false"/>
<property name="numColumns" value="1"/>
<property name="numRows" value="1"/>
<property name="viewFixedRows" value="false"/>
<property name="showPairedPages" value="false"/>
<property name="layoutVertical" value="false"/>
<property name="layoutRightToLeft" value="false"/>
<property name="layoutBottomToTop" value="false"/>
<property name="numPairsOffset" value="1"/>
<!--The icon theme, allowed values are "disabled", "onDrawOfLastPage", and "onScrollOfLastPage"-->
<property name="emptyLastPageAppend" value="disabled"/>
<property name="presentationMode" value="false"/>
<!--Which GUI elements are shown in default view mode, separated by a colon (,)-->
<property name="defaultViewModeAttributes" value="showMenubar,showToolbar,showSidebar"/>
<!--Which GUI elements are shown in fullscreen view mode, separated by a colon (,)-->
<property name="fullscreenViewModeAttributes" value="goFullscren,showToolbar,showSidebar"/>
<!--Which GUI elements are shown in presentation view mode, separated by a colon (,)-->
<property name="presentationViewModeAttributes" value="goFullscren,showToolbar"/>
<!--The cursor icon used with a stylus, allowed values are "none", "dot", "big", "arrow"-->
<property name="stylusCursorType" value="dot"/>
<!--The eraser cursor visibility used with a stylus, allowed values are "never", "always", "hover", "touch"-->
<property name="eraserVisibility" value="always"/>
<!--The icon theme, allowed values are "iconsColor", "iconsLucide"-->
<property name="iconTheme" value="iconsColor"/>
<!--Dark/light mode, allowed values are "useSystem", "forceLight", "forceDark"-->
<property name="themeVariant" value="forceDark"/>
<property name="highlightPosition" value="false"/>
<property name="cursorHighlightColor" value="2164260608"/>
<property name="cursorHighlightBorderColor" value="2147483903"/>
<property name="cursorHighlightRadius" value="30"/>
<property name="cursorHighlightBorderWidth" value="0"/>
<property name="useStockIcons" value="false"/>
<property name="disableScrollbarFadeout" value="false"/>
<property name="disableAudio" value="false"/>
<!--Hides scroolbars in the main window, allowed values: "none", "horizontal", "vertical", "both"-->
<property name="scrollbarHideType" value="none"/>
<property name="autoloadMostRecent" value="false"/>
<property name="autoloadPdfXoj" value="true"/>
<property name="defaultSaveName" value="%F-Note-%H-%M"/>
<property name="defaultPdfExportName" value="%{name}_annotated"/>
<property name="autosaveEnabled" value="true"/>
<property name="autosaveTimeout" value="3"/>
<property name="addHorizontalSpace" value="false"/>
<property name="addHorizontalSpaceAmount" value="150"/>
<property name="addVerticalSpace" value="false"/>
<property name="addVerticalSpaceAmount" value="150"/>
<property name="drawDirModsEnabled" value="false"/>
<property name="drawDirModsRadius" value="50"/>
<property name="snapRotation" value="true"/>
<property name="snapRotationTolerance" value="0.3"/>
<property name="snapGrid" value="true"/>
<property name="snapGridTolerance" value="0.5"/>
<property name="snapGridSize" value="14.17"/>
<property name="strokeRecognizerMinSize" value="40"/>
<property name="touchDrawing" value="false"/>
<property name="gtkTouchInertialScrolling" value="true"/>
<property name="pressureGuessing" value="false"/>
<property name="selectionBorderColor" value="4294901760"/>
<property name="backgroundColor" value="4292664021"/>
<property name="selectionMarkerColor" value="4285702095"/>
<property name="touchZoomStartThreshold" value="0"/>
<property name="pageRerenderThreshold" value="5"/>
<!--The count of rendered PDF pages which will be cached.-->
<property name="pdfPageCacheSize" value="10"/>
<property name="preloadPagesBefore" value="3"/>
<property name="preloadPagesAfter" value="5"/>
<property name="eagerPageCleanup" value="true"/>
<!--Config for new pages-->
<property name="pageTemplate" value="xoj/template&#10;copyLastPageSettings=true&#10;size=595.275591x841.889764&#10;backgroundType=lined&#10;backgroundColor=#ffffff&#10;"/>
<property name="sizeUnit" value=""/>
<property name="audioFolder" value=""/>
<property name="audioInputDevice" value="-1"/>
<property name="audioOutputDevice" value="-1"/>
<property name="audioSampleRate" value="44100"/>
<property name="audioGain" value="1"/>
<property name="defaultSeekTime" value="5"/>
<property name="pluginEnabled" value=""/>
<property name="pluginDisabled" value=""/>
<property name="strokeFilterIgnoreTime" value="150"/>
<property name="strokeFilterIgnoreLength" value="1"/>
<property name="strokeFilterSuccessiveTime" value="500"/>
<property name="strokeFilterEnabled" value="false"/>
<property name="doActionOnStrokeFiltered" value="false"/>
<property name="trySelectOnStrokeFiltered" value="false"/>
<property name="snapRecognizedShapesEnabled" value="false"/>
<property name="restoreLineWidthEnabled" value="false"/>
<property name="numIgnoredStylusEvents" value="0"/>
<property name="inputSystemTPCButton" value="false"/>
<property name="inputSystemDrawOutsideWindow" value="true"/>
<property name="preferredLocale" value=""/>
<property name="stabilizerAveragingMethod" value="0"/>
<property name="stabilizerPreprocessor" value="0"/>
<property name="stabilizerBuffersize" value="20"/>
<property name="stabilizerSigma" value="0.5"/>
<property name="stabilizerDeadzoneRadius" value="1.3"/>
<property name="stabilizerDrag" value="0.4"/>
<property name="stabilizerMass" value="5"/>
<property name="stabilizerCuspDetection" value="true"/>
<property name="stabilizerFinalizeStroke" value="true"/>
<property name="latexSettings.autoCheckDependencies" value="true"/>
<property name="latexSettings.defaultText" value="x^2"/>
<property name="latexSettings.globalTemplatePath" value="/usr/share/xournalpp/resources/default_template.tex"/>
<property name="latexSettings.genCmd" value="pdflatex -halt-on-error -interaction=nonstopmode '{}'"/>
<property name="latexSettings.sourceViewThemeId" value=""/>
<property name="latexSettings.editorFont" value="Monospace 12"/>
<property name="latexSettings.useCustomEditorFont" value="false"/>
<property name="latexSettings.editorWordWrap" value="true"/>
<property name="latexSettings.sourceViewAutoIndent" value="true"/>
<property name="latexSettings.sourceViewSyntaxHighlight" value="true"/>
<property name="latexSettings.sourceViewShowLineNumbers" value="false"/>
<property name="font" font="Sans" size="12"/>
<data name="buttonConfig">
<data name="default">
<attribute name="color" type="hex" value="ff000000"/>
<attribute name="drawingType" type="string" value="default"/>
<attribute name="size" type="string" value="thin"/>
<attribute name="tool" type="string" value="pen"/>
</data>
<data name="eraser">
<attribute name="eraserMode" type="string" value="none"/>
<attribute name="size" type="string" value="none"/>
<attribute name="tool" type="string" value="eraser"/>
</data>
<data name="middle">
<attribute name="tool" type="string" value="hand"/>
</data>
<data name="right">
<attribute name="tool" type="string" value="none"/>
</data>
<data name="stylus">
<attribute name="tool" type="string" value="none"/>
</data>
<data name="stylus2">
<attribute name="tool" type="string" value="none"/>
</data>
<data name="touch">
<attribute name="device" type="string" value=""/>
<attribute name="disableDrawing" type="boolean" value="false"/>
<attribute name="tool" type="string" value="none"/>
</data>
</data>
<data name="deviceClasses">
<data name="Wayland Finger Scrolling">
<attribute name="deviceClass" type="int" value="1"/>
<attribute name="deviceSource" type="int" value="6"/>
</data>
<data name="Wayland Pointer">
<attribute name="deviceClass" type="int" value="1"/>
<attribute name="deviceSource" type="int" value="0"/>
</data>
</data>
<data name="tools">
<attribute name="current" type="string" value="text"/>
<data name="drawArrow">
<attribute name="drawingType" type="string" value="default"/>
</data>
<data name="drawCoordinateSystem">
<attribute name="drawingType" type="string" value="default"/>
</data>
<data name="drawDoubleArrow">
<attribute name="drawingType" type="string" value="default"/>
</data>
<data name="drawEllipse">
<attribute name="drawingType" type="string" value="default"/>
</data>
<data name="drawRect">
<attribute name="drawingType" type="string" value="default"/>
</data>
<data name="drawSpline">
<attribute name="drawingType" type="string" value="default"/>
</data>
<data name="eraser">
<attribute name="drawingType" type="string" value="default"/>
<attribute name="size" type="string" value="MEDIUM"/>
<attribute name="type" type="string" value="default"/>
</data>
<data name="hand">
<attribute name="drawingType" type="string" value="default"/>
</data>
<data name="highlighter">
<attribute name="color" type="hex" value="ffffff00"/>
<attribute name="drawingType" type="string" value="default"/>
<attribute name="fill" type="int" value="0"/>
<attribute name="fillAlpha" type="int" value="128"/>
<attribute name="size" type="string" value="MEDIUM"/>
</data>
<data name="image">
<attribute name="drawingType" type="string" value="default"/>
</data>
<data name="pen">
<attribute name="color" type="hex" value="ff3333cc"/>
<attribute name="drawingType" type="string" value="default"/>
<attribute name="fill" type="int" value="0"/>
<attribute name="fillAlpha" type="int" value="128"/>
<attribute name="size" type="string" value="MEDIUM"/>
<attribute name="style" type="string" value="plain"/>
</data>
<data name="playObject">
<attribute name="drawingType" type="string" value="default"/>
</data>
<data name="selectMultiLayerRect">
<attribute name="drawingType" type="string" value="default"/>
</data>
<data name="selectMultiLayerRegion">
<attribute name="drawingType" type="string" value="default"/>
</data>
<data name="selectObject">
<attribute name="drawingType" type="string" value="default"/>
</data>
<data name="selectPdfTextLinear">
<attribute name="color" type="hex" value="ff000000"/>
<attribute name="drawingType" type="string" value="default"/>
</data>
<data name="selectPdfTextRect">
<attribute name="color" type="hex" value="ff000000"/>
<attribute name="drawingType" type="string" value="default"/>
</data>
<data name="selectRect">
<attribute name="drawingType" type="string" value="default"/>
</data>
<data name="selectRegion">
<attribute name="drawingType" type="string" value="default"/>
</data>
<data name="showFloatingToolbox">
<attribute name="drawingType" type="string" value="default"/>
</data>
<data name="text">
<attribute name="color" type="hex" value="ff000000"/>
<attribute name="drawingType" type="string" value="default"/>
</data>
<data name="verticalSpace">
<attribute name="drawingType" type="string" value="default"/>
</data>
</data>
<data name="touch">
<attribute name="cmdDisable" type="string" value=""/>
<attribute name="cmdEnable" type="string" value=""/>
<attribute name="disableTouch" type="boolean" value="false"/>
<attribute name="method" type="string" value="auto"/>
<attribute name="timeout" type="int" value="1000"/>
</data>
</settings>

View File

@@ -183,8 +183,12 @@ set -o ignoreeof # Stop CTRL-D from quitting
# Load syntax highlighting; should be last.
source /usr/share/zsh/plugins/fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh 2>/dev/null
. "$HOME/.local/share/../bin/env"
eval "$(zoxide init --cmd cd zsh)"
eval "$(try init ~/src/tries)"
eval "$(direnv hook zsh)"
[ -f ~/.cache/wal/sequences ] && \cat ~/.cache/wal/sequences
[ -f ~/.cache/wal/colors-tty.sh ] && source ~/.cache/wal/colors-tty.sh

View File

@@ -1,57 +0,0 @@
#!/bin/sh
# This script will compile or run another finishing operation on a document. I
# have this script run via vim.
#
# Compiles .tex. groff (.mom, .ms), .rmd, .md, .org. Opens .sent files as sent
# presentations. Runs scripts based on extention or shebang.
#
# Note that .tex files which you wish to compile with XeLaTeX should have the
# string "xelatex" somewhere in a comment/command in the first 5 lines.
file=$(readlink -f "$1")
dir=${file%/*}
base="${file%.*}"
ext="${file##*.}"
cd "$dir" || exit 1
textype() { \
command="pdflatex"
( head -n5 "$file" | grep -qi 'xelatex' ) && command="xelatex"
$command --output-directory="$dir" "$base" &&
grep -qi addbibresource "$file" &&
biber --input-directory "$dir" "$base" &&
$command --output-directory="$dir" "$base" &&
$command --output-directory="$dir" "$base"
}
case "$ext" in
# Try to keep these cases in alphabetical order.
[0-9]) preconv "$file" | refer -PS -e | groff -mandoc -T pdf > "$base".pdf ;;
c) cc "$file" -o "$base" && "$base" ;;
cpp) g++ "$file" -o "$base" && "$base" ;;
cs) mcs "$file" && mono "$base".exe ;;
go) go run "$file" ;;
h) sudo make install ;;
java) javac -d classes "$file" && java -cp classes "${1%.*}" ;;
m) octave "$file" ;;
md) if [ -x "$(command -v lowdown)" ]; then
lowdown -d nointem -e super "$file" -Tms | groff -mpdfmark -ms -kept > "$base".pdf
elif [ -x "$(command -v groffdown)" ]; then
groffdown -i "$file" | groff > "$base.pdf"
else
pandoc -t ms --highlight-style=kate -s -o "$base".pdf "$file"
fi ; ;;
mom) preconv "$file" | refer -PS -e | groff -mom -kept -T pdf > "$base".pdf ;;
ms) preconv "$file" | refer -PS -e | groff -me -ms -kept -T pdf > "$base".pdf ;;
org) emacs "$file" --batch -u "$USER" -f org-latex-export-to-pdf ;;
py) python "$file" ;;
[rR]md) Rscript -e "rmarkdown::render('$file', quiet=TRUE)" ;;
rs) cargo build ;;
sass) sassc -a "$file" "$base.css" ;;
scad) openscad -o "$base".stl "$file" ;;
sent) setsid -f sent "$file" 2>/dev/null ;;
tex) textype "$file" ;;
*) head -n1 "$file" | grep "^#!/" | sed "s/^#!//" | xargs -r -I % "$file" ;;
esac

View File

@@ -1,16 +0,0 @@
#!/bin/sh
# Syncs repositories and downloads updates, meant to be run as a cronjob.
notify-send " Repository Sync" "Checking for package updates..."
sudo yay -Syyuw --noconfirm || notify-send "Error downloading updates.
Check your internet connection, if pacman is already running, or run update manually to see errors."
pkill -RTMIN+8 "${STATUSBAR:-dwmblocks}"
if pacman -Qu | grep -v "\[ignored\]"
then
notify-send " Repository Sync" "Updates available. Click statusbar icon () for update."
else
notify-send " Repository Sync" "Sync complete. No new packages for update."
fi

View File

@@ -1,6 +0,0 @@
#!/bin/sh
# Toggles all cronjobs off/on.
# Stores disabled crontabs in ~/.consaved until restored.
([ -f "${XDG_CONFIG_HOME:-$HOME/.config}"/cronsaved ] && crontab - < "${XDG_CONFIG_HOME:-$HOME/.config}"/cronsaved && rm "${XDG_CONFIG_HOME:-$HOME/.config}"/cronsaved && notify-send "🕓 Cronjobs re-enabled.") || ( crontab -l > "${XDG_CONFIG_HOME:-$HOME/.config}"/cronsaved && crontab -r && notify-send "🕓 Cronjobs saved and disabled.")

View File

@@ -1,15 +0,0 @@
#!/bin/sh
# Set as a cron job to check for new RSS entries for newsboat.
# If newsboat is open, sends it an "R" key to refresh.
/usr/bin/notify-send "📰 Updating RSS feeds..."
pgrep -f newsboat$ && /usr/bin/xdotool key --window "$(/usr/bin/xdotool search --name newsboat)" R && exit
echo  > /tmp/newsupdate
pkill -RTMIN+6 "${STATUSBAR:-dwmblocks}"
/usr/bin/newsboat -x reload
rm -f /tmp/newsupdate
pkill -RTMIN+6 "${STATUSBAR:-dwmblocks}"
/usr/bin/notify-send "📰 RSS feed update complete."

View File

@@ -1,21 +0,0 @@
#!/bin/sh
# Feed this script a link and it will give dmenu
# some choice programs to use to open it.
feed="${1:-$(printf "%s" | dmenu -p 'Paste URL or file path')}"
case "$(printf "Copy URL\\nsxiv\\nsetbg\\nPDF\\nbrowser\\nlynx\\nvim\\nmpv\\nmpv loop\\nmpv float\\nqueue download\\nqueue yt-dl\\nqueue yt-dl audio" | dmenu -i -p "Open it with?")" in
"copy url") echo "$feed" | xclip -selection clipboard ;;
mpv) setsid -f mpv -quiet "$feed" >/dev/null 2>&1 ;;
"mpv loop") setsid -f mpv -quiet --loop "$feed" >/dev/null 2>&1 ;;
"mpv float") setsid -f "$TERMINAL" -e mpv --geometry=+0-0 --autofit=30% --title="mpvfloat" "$feed" >/dev/null 2>&1 ;;
"queue yt-dl") qndl "$feed" >/dev/null 2>&1 ;;
"queue yt-dl audio") qndl "$feed" 'youtube-dl --add-metadata -icx -f bestaudio/best' >/dev/null 2>&1 ;;
"queue download") qndl "$feed" 'curl -LO' >/dev/null 2>&1 ;;
PDF) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" && zathura "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 ;;
sxiv) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" && sxiv -a "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 ;;
vim) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" && setsid -f "$TERMINAL" -e "$EDITOR" "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 ;;
setbg) curl -L "$feed" > $XDG_CACHE_HOME/pic ; xwallpaper --zoom $XDG_CACHE_HOME/pic >/dev/null 2>&1 ;;
browser) setsid -f "$BROWSER" "$feed" >/dev/null 2>&1 ;;
lynx) lynx "$feed" >/dev/null 2>&1 ;;
esac

View File

@@ -1,16 +0,0 @@
#!/bin/sh
files="$(find -L "$HOME/Tower/Library" -name '*.pdf' -or -name '*.epub')"
options=$(echo "$files" | xargs --delimiter="\n" basename -a)
chosen=$(echo "$options" | dmenu -i -ix -c -l 30)
[ -z "$chosen" ] && exit
line="$(($chosen + 1))"
file="$(echo "$files" | sed "${line}q;d")"
zathura "$file"

View File

@@ -1,67 +0,0 @@
#!/bin/sh
# Gives a dmenu prompt to mount unmounted drives and Android phones. If
# they're in /etc/fstab, they'll be mounted automatically. Otherwise, you'll
# be prompted to give a mountpoint from already existsing directories. If you
# input a novel directory, it will prompt you to create that directory.
getmount() { \
[ -z "$chosen" ] && exit 1
# shellcheck disable=SC2086
mp="$(find $1 2>/dev/null | dmenu -i -p "Type in mount point.")" || exit 1
[ "$mp" = "" ] && exit 1
if [ ! -d "$mp" ]; then
mkdiryn=$(printf "No\\nYes" | dmenu -i -p "$mp does not exist. Create it?") || exit 1
[ "$mkdiryn" = "Yes" ] && (mkdir -p "$mp" || sudo -A mkdir -p "$mp")
fi
}
mountusb() { \
chosen="$(echo "$usbdrives" | dmenu -i -p "Mount which drive?")" || exit 1
chosen="$(echo "$chosen" | awk '{print $1}')"
sudo -A mount "$chosen" 2>/dev/null && notify-send "💻 USB mounting" "$chosen mounted." && exit 0
alreadymounted=$(lsblk -nrpo "name,type,mountpoint" | awk '$3!~/\/boot|\/home$|SWAP/&&length($3)>1{printf "-not ( -path *%s -prune ) ",$3}')
getmount "/mnt /media /mount /home -maxdepth 5 -type d $alreadymounted"
partitiontype="$(lsblk -no "fstype" "$chosen")"
case "$partitiontype" in
"vfat") sudo -A mount -t vfat "$chosen" "$mp" -o rw,umask=0000;;
"exfat") sudo -A mount "$chosen" "$mp" -o uid="$(id -u)",gid="$(id -g)";;
*) sudo -A mount "$chosen" "$mp"; user="$(whoami)"; ug="$(groups | awk '{print $1}')"; sudo -A chown "$user":"$ug" "$mp";;
esac
notify-send "💻 USB mounting" "$chosen mounted to $mp."
}
mountandroid() { \
chosen="$(echo "$anddrives" | dmenu -i -p "Which Android device?")" || exit 1
chosen="$(echo "$chosen" | cut -d : -f 1)"
getmount "$HOME -maxdepth 3 -type d"
simple-mtpfs --device "$chosen" "$mp"
echo "OK" | dmenu -i -p "Tap Allow on your phone if it asks for permission and then press enter" || exit 1
simple-mtpfs --device "$chosen" "$mp"
notify-send "🤖 Android Mounting" "Android device mounted to $mp."
}
asktype() { \
choice="$(printf "USB\\nAndroid" | dmenu -i -p "Mount a USB drive or Android device?")" || exit 1
case $choice in
USB) mountusb ;;
Android) mountandroid ;;
esac
}
anddrives=$(simple-mtpfs -l 2>/dev/null)
usbdrives="$(lsblk -rpo "name,type,size,mountpoint" | grep 'part\|rom' | awk '$4==""{printf "%s (%s)\n",$1,$3}')"
if [ -z "$usbdrives" ]; then
[ -z "$anddrives" ] && echo "No USB drive or Android device detected" && exit
echo "Android device(s) detected."
mountandroid
else
if [ -z "$anddrives" ]; then
echo "USB drive(s) detected."
mountusb
else
echo "Mountable USB drive(s) and Android device(s) detected."
asktype
fi
fi

View File

@@ -1,6 +0,0 @@
#!/bin/sh
# This script is the SUDO_ASKPASS variable, meaning that it will be used as a
# password prompt if needed.
dmenu -P -p "$1" <&- && echo

View File

@@ -1,44 +0,0 @@
#!/bin/sh
# A dmenu prompt to unmount drives.
# Provides you with mounted partitions, select one to unmount.
# Drives mounted at /, /boot and /home will not be options to unmount.
unmountusb() {
[ -z "$drives" ] && exit
chosen="$(echo "$drives" | dmenu -i -p "Unmount which drive?")" || exit 1
chosen="$(echo "$chosen" | awk '{print $1}')"
[ -z "$chosen" ] && exit
sudo -A umount "$chosen" && notify-send "💻 USB unmounting" "$chosen unmounted."
}
unmountandroid() { \
chosen="$(awk '/simple-mtpfs/ {print $2}' /etc/mtab | dmenu -i -p "Unmount which device?")" || exit 1
[ -z "$chosen" ] && exit
sudo -A umount -l "$chosen" && notify-send "🤖 Android unmounting" "$chosen unmounted."
}
asktype() { \
choice="$(printf "USB\\nAndroid" | dmenu -i -p "Unmount a USB drive or Android device?")" || exit 1
case "$choice" in
USB) unmountusb ;;
Android) unmountandroid ;;
esac
}
drives=$(lsblk -nrpo "name,type,size,mountpoint" | awk '$4!~/\/boot|\/home$|SWAP/&&length($4)>1{printf "%s (%s)\n",$4,$3}')
if ! grep simple-mtpfs /etc/mtab; then
[ -z "$drives" ] && echo "No drives to unmount." && exit
echo "Unmountable USB drive detected."
unmountusb
else
if [ -z "$drives" ]
then
echo "Unmountable Android device detected."
unmountandroid
else
echo "Unmountable USB drive(s) and Android device(s) detected."
asktype
fi
fi

View File

@@ -1,18 +0,0 @@
#!/bin/sh
# The famous "get a menu of emojis to copy" script.
# Get user selection via dmenu from emoji file.
chosen=$(cut -d ';' -f1 ~/.local/share/emojis | dmenu -i -l 30 | sed "s/ .*//")
# Exit if none chosen.
[ -z "$chosen" ] && exit
# If you run this command with an argument, it will automatically insert the
# character. Otherwise, show a message that the emoji has been copied.
if [ -n "$1" ]; then
xdotool type "$chosen"
else
printf "$chosen" | xclip -selection clipboard
notify-send "'$chosen' copied to clipboard." &
fi

View File

@@ -1,24 +0,0 @@
#!/bin/sh
echo "starting"
echo "$1"
file="${1:-$HOME/Downloads}"
[ -d "$file" ] && file="$file/$(ls -Art "$file" | tail -n 1)"
echo "continuing"
echo "$file"
case "$file" in
*ergodox*.hex)
wally-cli "$file" ;;
# *png|*jpg|*jpe|*jpeg|*gif)
# curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" && sxiv -a "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;;
# *pdf|*cbz|*cbr)
# curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" && zathura "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;;
# *mp3|*flac|*opus|*mp3?source*)
# qndl "$1" 'curl -LO' >/dev/null 2>&1 ;;
# *)
# [ -f "$1" ] && setsid -f "$TERMINAL" -e "$EDITOR" "$1" >/dev/null 2>&1 || setsid -f "$BROWSER" "$1" >/dev/null 2>&1
esac

View File

@@ -1,11 +0,0 @@
#!/bin/sh
# add binaries to PATH if they aren't added yet
# affix colons on either side of $PATH to simplify matching
case ":${PATH}:" in
*:"$HOME/.local/share/../bin":*)
;;
*)
# Prepending path in case a system-installed binary needs to be overridden
export PATH="$HOME/.local/share/../bin:$PATH"
;;
esac

View File

@@ -1,45 +0,0 @@
#!/bin/sh
# A general, all-purpose extraction script. Not all extraction programs here
# are installed by LARBS automatically.
#
# Default behavior: Extract archive into new directory
# Behavior with `-c` option: Extract contents into current directory
while getopts "hc" o; do case "${o}" in
c) extracthere="True" ;;
*) printf "Options:\\n -c: Extract archive into current directory rather than a new one.\\n" && exit 1 ;;
esac done
if [ -z "$extracthere" ]; then
archive="$(readlink -f "$*")" &&
directory="$(echo "$archive" | sed 's/\.[^\/.]*$//')" &&
mkdir -p "$directory" &&
cd "$directory" || exit 1
else
archive="$(readlink -f "$(echo "$*" | cut -d' ' -f2)" 2>/dev/null)"
fi
[ -z "$archive" ] && printf "Give archive to extract as argument.\\n" && exit 1
if [ -f "$archive" ] ; then
case "$archive" in
*.tar.bz2|*.tbz2) tar xvjf "$archive" ;;
*.tar.xz) tar -xf "$archive" ;;
*.tar.gz|*.tgz) tar xvzf "$archive" ;;
*.tar.zst) tar -I zstd -xf "$archive" ;;
*.lzma) unlzma "$archive" ;;
*.bz2) bunzip2 "$archive" ;;
*.rar) unrar x -ad "$archive" ;;
*.gz) gunzip "$archive" ;;
*.tar) tar xvf "$archive" ;;
*.zip) unzip "$archive" ;;
*.Z) uncompress "$archive" ;;
*.7z) 7z x "$archive" ;;
*.xz) unxz "$archive" ;;
*.exe) cabextract "$archive" ;;
*) printf "extract: '%s' - unknown archive method\\n" "$archive" ;;
esac
else
printf "File \"%s\" not found.\\n" "$archive"
fi

View File

@@ -1,94 +0,0 @@
const fs = require('fs');
const input = fs.readFileSync('./Chris S. Coaching Tracker - Weekly Tracker.csv', 'utf8');
const rows = [];
const week = {
'Chest': null,
'Right thigh': null,
'Left thigh': null,
'Waist': null,
'Left biceps': null,
'Right biceps': null,
}
let year = 2023;
input.split("\n").forEach((line) => {
if (line.includes(' 1 Jan')) {
year++;
}
const map = {
'R Arm': 'Right biceps',
'L Arm': 'Left biceps',
'Navel': 'Waist',
'Chest': 'Chest',
'R Leg': 'Right thigh',
'L Leg': 'Left thigh',
}
for (let key in map) {
const val = map[key];
const match = line.match(new RegExp(`${key},([^,]+)`));
if (match) {
week[val] = (1*match[1]).toPrecision(3);
}
}
if (line.startsWith('"Sun')) {
const match = line.match(/^"(Sun[^"]+)\s*"/)[1];
const date = new Date(`${match} UTC`);
date.setFullYear(year);
for (let key in week) {
const val = week[key];
rows.push(`BODYMEASURE,${date.toJSON().split('T')[0]},${key},${val},cm`);
}
}
});
['Weight', 'Weight(1)', 'Weight(2)', 'Weight(3)'].forEach((name) => {
const weightInput = fs.readFileSync(`./${name}.csv`, 'utf8').split("\n");
weightInput.shift();
for (let i = 0; i < weightInput.length;) {
if (!weightInput[i] || !weightInput[i + 1]) {
i++;
continue;
}
const date = new Date(`${weightInput[i].substring(2, weightInput[i].length - 2)} UTC`);
const [time, weight, change, bmi, fat, muscle, bone, water] = weightInput[i + 1].split(',')
if (weight && weight !== '--') {
const [kg, units] = weight.split(' ');
rows.push(`BODYMEASURE,${date.toJSON().split('T')[0]},Weight,${kg},${units}`);
}
if (fat && fat !== '--') {
const [perc, units] = fat.split(' ');
rows.push(`BODYMEASURE,${date.toJSON().split('T')[0]},Fat,${perc},${units}`);
}
if (muscle && muscle !== '--' && weight && weight !== '--') {
const [kg, units] = muscle.split(' ');
const weightKg = weight.split(' ')[0];
const perc = (100 * kg / weightKg).toPrecision(3);
rows.push(`BODYMEASURE,${date.toJSON().split('T')[0]},Muscles,${perc},%`);
}
if (water && water !== '--') {
const [perc, units] = water.split(' ');
rows.push(`BODYMEASURE,${date.toJSON().split('T')[0]},Water,${perc},${units}`);
}
i++;
while (weightInput[i] && weightInput[i][0] !== '"') {
i++;
}
}
});
rows.sort();
rows.unshift('TABLE,DATE,BODYPART_NAME,MEASURE,UNIT');
fs.writeFileSync('./fnfImport.csv', rows.join("\n"));

View File

@@ -1,15 +0,0 @@
#!/bin/bash
echo "Creating development directories"
mkdir "$HOME/Code"
mkdir "$HOME/Code/DevOps" # For server and computer admin
mkdir "$HOME/Code/FSharp"
mkdir "$HOME/Code/JavaScript"
mkdir "$HOME/Code/Scala"
mkdir "$HOME/Code/Rust"
mkdir "$HOME/Code/PHP"
mkdir "$HOME/Code/Tutorials" # For doing tutorials/courses
mkdir "$HOME/Code/Sites" # Websites in any language
mkdir "$HOME/Code/MobileApps" # Mobile apps in any language
mkdir "$HOME/Code/Tests" # Small test files/scripts

View File

@@ -1,9 +0,0 @@
#! /bin/zsh
enpass-cli -vault="$HOME/.local/share/Enpass/Enpass/Vaults/primary" -sort copy "Firefox"
firefox "https://accounts.firefox.com/signin?action=email&service=sync" &
read -s -k $'?Press enter when you have synced Firefox...\n'
echo "" | wl-copy

View File

@@ -1,7 +0,0 @@
#! /bin/bash
"$HOME/.local/bin/install/password.sh"
"$HOME/.local/bin/install/ssh.sh"
"$HOME/.local/bin/install/dev.sh"
"$HOME/.local/bin/install/firefox.sh"
"$HOME/.local/bin/install/nextcloud.sh"

View File

@@ -1,12 +0,0 @@
#! /bin/zsh
mkdir -p "$HOME/Tower"
nextcloud &
enpasscli -vault="$HOME/.local/share/Enpass/Enpass/Vaults/primary" -sort copy "Scarif: Tower"
read -s -k $'?Press enter when you have synced Nextcloud... \n'
wl-copy --clear

View File

@@ -1,8 +0,0 @@
#! /bin/bash
doas tee /etc/udev/rules/90-backlight.rules <<HRD
SUBSYSTEM=="backlight", ACTION=="add" \
RUN+="/bin/chgrp video /sys/class/backlight/%k/brightness", \
RUN+="/bin/chmod g+w /sys/class/backlight/%k/brightness"
HRD

View File

@@ -1,14 +0,0 @@
#! /bin/bash
sudo pacman --noconfirm --needed -S python-pyqt5 hplip nss-mdns
sudo sed -i 's/hosts: files mymachines myhostname resolve [!UNAVAIL=return] dns/hosts: files mymachines myhostname mdns_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] dns/' /etc/nsswitch.conf
sudo systemctl enable --now avahi-daemon
hp-setup -i 192.168.2.77
lpoptions -d DeskJet_3700
lpoptions -o PageSize=A4

View File

@@ -1,18 +0,0 @@
#! /bin/bash
doas tee /etc/NetworkManager/conf.d <<HRD
[main]
dhcpd=dhclient
HRD
doas tee /etc/iwd/main.conf <<HRD
[Network]
EnableNetworkConfiguration=True
EnableIPv6=True
HRD
doas systemctl enable --now iwd
doas systemctl enable --now NetworkManager
nmtui

View File

@@ -1,21 +0,0 @@
#! /bin/bash
export MASTERPW=$(gum input --header="Master password" --password)
Enpass &
echo "$MASTERPW" | wl-copy
read -n 1 -r -s -p $'Press enter when you have synced enpass...\n'
wl-copy --clear
CHECKPW=$(enpass-cli -vault="$HOME/.local/share/Enpass/Enpass/Vaults/primary" -sort list 2>&1)
while [[ "$CHECKPW" == *level=fatal* ]]; do
export MASTERPW=$(zenity --password)
CHECKPW=$(enpass-cli -vault="$HOME/.local/share/Enpass/Enpass/Vaults/primary" -sort list)
done
echo "Password set successfuly"

View File

@@ -1,17 +0,0 @@
#! /bin/bash
sudo systemctl enable --now expressvpn.service
VPN=$(enpasscli -vault="$HOME/Documents/Enpass/Vaults/primary" -sort show "ExpressVPN Activation Code" 2>&1)
VPNPW=$(echo "$LABS" | grep -Po "(?<=pass : ).+(?=\")")
echo "$VPNPW" | xclip -selection clipboard -i
expressvpn activate
expressvpn autoconnect true
expressvpn connect smart
echo "" | xclip -selection clipboard -i

View File

@@ -1,23 +0,0 @@
#!/bin/sh
# Feed script a url or file location.
# If an image, it will view in sxiv,
# if a video or gif, it will view in mpv
# if a music file or pdf, it will download,
# otherwise it opens link in browser.
# If no url given. Opens browser. For using script as $BROWSER.
[ -z "$1" ] && { "$BROWSER"; exit; }
case "$1" in
*mkv|*webm|*mp4|*youtube.com/watch*|*youtube.com/playlist*|*youtu.be*|*hooktube.com*|*bitchute.com*|*videos.lukesmith.xyz*)
setsid -f mpv -quiet "$1" >/dev/null 2>&1 ;;
*png|*jpg|*jpe|*jpeg|*gif)
curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" && sxiv -a "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;;
*pdf|*cbz|*cbr)
curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" && zathura "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;;
*mp3|*flac|*opus|*mp3?source*)
qndl "$1" 'curl -LO' >/dev/null 2>&1 ;;
*)
[ -f "$1" ] && setsid -f "$TERMINAL" -e "$EDITOR" "$1" >/dev/null 2>&1 || setsid -f "$BROWSER" "$1" >/dev/null 2>&1
esac

View File

@@ -1,13 +0,0 @@
#!/bin/sh
# opout: "open output": A general handler for opening a file's intended output,
# usually the pdf of a compiled document. I find this useful especially
# running from vim.
basename="$(echo "${*}" | sed 's/\.[^\/.]*$//')"
case "${*}" in
*.tex|*.m[dse]|*.[rR]md|*.mom|*.[0-9]) setsid -f xdg-open "$basename".pdf >/dev/null 2>&1 ;;
*.html) setsid -f "$BROWSER" "$basename".html >/dev/null 2>&1 ;;
*.sent) setsid -f sent "$1" >/dev/null 2>&1 ;;
esac

View File

@@ -1,44 +0,0 @@
#!/bin/sh
# This script does the following:
# Run by itself, set the wallpaper (at X start).
# If given a file, set that as the new wallpaper.
# If given a directory, choose random file in it.
# If wal is installed, also generates a colorscheme.
# Location of link to wallpaper link.
bgloc="${XDG_DATA_HOME:-$HOME/.local/share/}/bg"
trueloc="$(readlink -f "$1")" &&
case "$(file --mime-type -b "$trueloc")" in
image/* ) ln -sf "$(readlink -f "$1")" "$bgloc" ;;
inode/directory ) trueloc=$(find "$trueloc" -iregex '.*.\(jpg\|jpeg\|png\|gif\)' -type f | shuf -n 1) && ln -sf "$trueloc" "$bgloc" ;;
*) notify-send "Error" "Not a valid image." ; exit 1;;
esac
[ -z "$trueloc" ] && trueloc="$(readlink -f "$bgloc")"
# If pywal is installed, use it.
# command -v wal >/dev/null 2>&1 &&
# wal -i "$trueloc" -n -o "${XDG_CONFIG_HOME:-$HOME/.config}/wal/postrun" >/dev/null 2>&1 &&
# dwmc xrdb
xwallpaper --no-randr --zoom "$bgloc"
parent_dir=$(dirname "$trueloc")
filename=$(basename "$trueloc")
filename_without_extension=${filename%.*}
split_dir="${parent_dir}_split"
left_image="${split_dir}/${filename_without_extension}_left.jpg"
right_image="${split_dir}/${filename_without_extension}_right.jpg"
# Check if left and right images exist
if [ -e "$left_image" ] && [ -e "$right_image" ]; then
kwriteconfig5 --file "$HOME/.config/plasma-org.kde.plasma.desktop-appletsrc" \
--group 'Containments' --group '127' --group 'Wallpaper' --group 'org.kde.image' \
--group 'General' --key 'Image' "$left_image"
kwriteconfig5 --file "$HOME/.config/plasma-org.kde.plasma.desktop-appletsrc" \
--group 'Containments' --group '94' --group 'Wallpaper' --group 'org.kde.image' \
--group 'General' --key 'Image' "$right_image"
fi

View File

@@ -1,12 +0,0 @@
sudo tee /etc/modprobes.d/r8169.conf <<HRD
# Do not load the r819 realtek module to force it to use r8168 instead for
# better reliability
# https://wiki.archlinux.org/title/Network_configuration/Ethernet#Troubleshooting
blacklist r8169
HRD
# Rebuild kernel modules
sudo mkinitcpio -p linux
echo "Please restart your computer to update kernel modules"

Some files were not shown because too many files have changed in this diff Show More