72 Commits
Author SHA1 Message Date
jozamudi 1e96b238a6 fix(shell): track the real ~/.bashrc and ~/.gitconfig
The repo copy of .bashrc was a stock Debian startup file that nothing on this
machine reads; the live one is the Arch-style file (interactive guard, color
aliases, vim->nvim, fzf init). Replace it with the live content and start
tracking .gitconfig (identity + nvim as editor/difftool).
2026-10-29 08:55:14 -07:00
jozamudi 4bb1c06883 feat(clipboard): add read-only clipboard-check diagnostic script
Lists selection owner/metadata via wl-paste -l to tell Firefox, kitty OSC 52
and wl-copy apart when a copy appears to do nothing. 'clipboard-check.sh test'
runs a 20s observation window. Never writes the clipboard or restarts anything.
Lives in scripts/ with ~/clipboard-check.sh symlinked in, matching the
existing scripts/ convention.
2026-10-29 08:55:14 -07:00
jozamudi bf87375356 chore(portal): mask xdg-desktop-portal-hyprland
Stays masked under sway: the default backend is gtk and ScreenCast/Screenshot
route to wlr, so the hyprland portal was ~35MB of never-used daemon. Committed
as a /dev/null symlink -- that IS the systemd mask mechanism, so a checkout
restores the mask without an extra enable/mask step. Verified afterwards that
the session still exposes every portal interface.
2026-10-29 08:45:28 -07:00
jozamudi 879ade5425 feat(input): clickfinger + tap on the PIXA3854 clickpad
Framework 13 Pro pad (PIXA3854:00 093A:1343). clickfinger so a two-finger press
is the right button anywhere instead of the bottom-right corner zone, and tap
enabled with the matching left/right/middle mapping.
2026-10-29 08:45:12 -07:00
jozamudi 26efcdc6ae fix(sway): pkill-guard hypridle under exec_always
`exec` re-runs on every config reload, so each `swaymsg reload` leaked a second
hypridle: duplicate suspend/lock timers and two processes fighting over the
logind sleep inhibitor. Same pattern already used for waybar and wl-paste.
2026-10-29 08:45:08 -07:00
jozamudi d770486d87 fix(power): stop forcing the TLP power-saver profile at login
`exec tlpctl power-saver` made tlp-pd apply the *_ON_SAV keys even on AC, so
platform_profile stayed low-power while docked and the battery tuning never
took effect on charger. tlp-pd's default 'balanced' profile already flips on
charger events. Profile writes are polkit-gated, so flips must be done from
the session (`tlpctl set balanced`), not via runuser/su.
2026-10-29 08:45:04 -07:00
jozamudi 085c2a7951 chore(clipboard): disable clipman history (AUR package removed)
clipman-git was uninstalled and has no pacman equivalent, so sway was spawning
ENOENT on `clipman` at every reload/launch. Commented out rather than deleted,
with the cliphist (extra/) port noted inline for when the keybinds come back.
2026-10-29 08:44:56 -07:00
jozamudi 8d93ac7e2f feat(idle): suspend after 10 min of lid-open idle
The panel powered off at 330s but nothing ever suspended, so a lid-open idle
laptop kept drawing 6-7W indefinitely; only lid *close* suspended (logind's
default HandleLidSwitch). logind IdleAction stays Ignore on purpose -- it
cannot run swaymsg/hyprlock hooks, hypridle's before_sleep_cmd can.
Plain suspend, not suspend-then-hibernate: swap is zram-only.
2026-10-29 08:44:53 -07:00
jozamudi 77470bd03e fix(portal): screen-capture script, portal backend, swaync autostart
screen-capture.sh was a single non-executable line containing a `slur` typo,
so it never ran and nothing referenced it; rewritten as a working region
capture to ~/Pictures plus clipboard.

xdg-desktop-portal/portals.conf pins the wlr backend for sway, and swaync is
pulled in via graphical-session.target.wants so the portal's
Requisite=graphical-session.target is satisfied (the reason screen sharing
previously never started).
2026-10-27 18:32:33 -07:00
jozamudi b08cd84158 fix(sway): visible focus ring, floating modifier, volume binds
swayfx: with `border pixel` the visible line is child_border, not `border`
(which only paints title bars). Focused child_border was $base00 = black on
black, i.e. invisible; both are now the same gray.

keybinds: restore `floating_modifier $mod normal` (was `none`) and drop the
`pkill -RTMIN+10 i3blocks` tail from the volume binds -- i3blocks is not in
use, waybar is.

windows: drop a stray trailing semicolon; waybar: remove the unused
sway/submap module.
2026-10-27 18:32:33 -07:00
jozamudi 35e64fc0cc fix(swaylock): rewrite for vanilla swaylock 1.8.6
The previous file used swaylock-EFFECTS options, which the packaged swaylock
ignores. Documents that swaylock reads $XDG_CONFIG_HOME/swaylock/config on
every invocation, including hypridle's before_sleep_cmd and the $mod+m
keybind.
2026-10-27 18:32:33 -07:00
jozamudi d1bd6aae48 fix(shikane): detect silent deadlocks; re-apply profile on sway reload
watchdog: covers both observed deadlock flavours -- the loud one that repeats
"Received invalid input AtomicChangeDone at state Discarded", and the silent
one that logs nothing and just never leaves VariantInProgress.

shikane-recover-on-reload.sh (new, previously referenced by sway/config but
never committed): shikanectl reload -> sleep 2 -> watchdog check, falling
back to a service restart when reload cannot recover.

clamshell-mode.sh: documents why the laptop panel is no longer enabled
unconditionally on lid-open, which raced shikane's "External Display" profile
(eDP-1 disabled by design) and produced "Atomic commit failed: Device or
resource busy" churn.
2026-10-27 18:32:33 -07:00
jozamudi 0ceec0b4ab fix(sway): only force a post-resume modeset when the stall is actually present
recover-output-after-resume.sh existed to work around the old ThinkPad's
/etc/modprobe.d/i915.conf, which forced PSR2 and the deepest display
C-states; the flip pending across suspend never completed, so every later
commit returned EBUSY and only a full modeset cleared it.

That file is gone and this laptop's iGPU is driven by `xe` (Panther Lake has
no i915 support at all), so the original cause cannot recur. The modeset is
now conditional on the user journal actually reporting "Atomic commit
failed"/"Page-flip failed" within the last 3 minutes.

Unconditional disable/enable + `shikanectl reload` on every resume was itself
a hazard: it is the exact sequence that re-triggers the shikane
VariantInProgress deadlock the watchdog exists to recover from.

hypridle.conf's comment no longer references the deleted i915.conf.
2026-10-27 18:32:33 -07:00
jozamudi 078f9acf71 fix(display): target the Framework 13 Pro panel
Migration from the ThinkPad X1 Carbon (2880x1800) to the Framework Laptop
13 Pro, whose panel is CSOT MND508ZB1-1 = 2880x1920 3:2 @120Hz and exposes
only 2880x1920@120000Hz / @60000Hz.

shikane was requesting [email protected], a mode this panel cannot provide,
so the variant could never be satisfied: it sat in NoVariantApplied for the
whole session, with 61 historical "Discarded" events. Both profiles now use
2880x1920@120Hz (including the disabled eDP-1 block, whose mode string still
has to resolve). Verified: profile now reaches VariantApplied.

Scale is 1.75 -> 1645x1097 logical, ~147 effective DPI, chosen to reproduce
the ~145 DPI of the old panel at 1.67. 1.75 is exactly representable as
float32, which sway stores scale in; 1.6 and 1.67 are not. 2.0 would be the
only integer (1:1, unresampled) scale but yields just 1440x960 logical.

The .config/sway/config hunk also adds the matching `output $laptop` baseline
so sway does not start at scale 2.0 and re-flow when shikane applies 1.75,
and carries previously-uncommitted session wiring for the scripts below.

shikane's config.toml was previously unversioned; it now lives in this repo
and ~/.config/shikane is a symlink, matching the existing convention.
2026-10-27 18:32:21 -07:00
jozamudi 63345e51e3 unify color palette, harden shikane service, misc sway/opencode updates
sway:
- config: re-apply shikane profile after every reload
  (exec_always shikanectl reload); restart waybar on reload
  (exec_always pkill+waybar); enable default_border pixel 2;
  add tlpctl power-saver at startup
- keybinds: disable floating_modifier (was "$mod normal") -
  experiment for windows popping out via accidental mod+click
- windows: case-insensitive pydm title match for floating rule
- swayfx + waybar style: unified 5-color palette (base00-0F) with
  doc headers; waybar theme restyled to match the sway palette
- waybar config: scratchpad module in left bar, "S{count}" format
- new quickshell shell.qml bar

systemd user units:
- shikane.service: bind to graphical-session/sway-session targets,
  Type=simple, Restart=on-failure (2s) with start limits so crashes
  recover without giving up permanently
- new sway-session.target and its wants/ symlinks

opencode:
- load AGENTS.md as instructions (new file)
- move OpenWebUI API key from hardcoded to {env:OPENWEBUI_API_KEY}
2026-09-28 14:04:22 -07:00
jozamudi e338d15922 add shikane-watchdog user service to auto-recover shikane deadlocks 2026-09-28 14:04:22 -07:00
jozamudi e3643c3ae2 fix(nvim): use clipboard:append for unnamedplus; add sway dbus-update script 2026-07-06 16:13:38 -07:00
jozamudi cc949db097 Fix sway session setup and migrate waybar to sway modules
- Start xdg-desktop-portal-wlr and sway-session.target for proper portal init
- Re-enable systemd/dbus environment import for Wayland session vars
- Move hypridle startup earlier
- Switch waybar left modules from hyprland/* to sway/*
2026-06-10 18:10:43 -07:00
jozamudi b4b2ca0d43 refactor: strip waybar icons, disable pseudotile/VFR, clean up configs
Waybar:
- Remove Nerd Font icons from battery, power, audio, media modules
- Switch power profile to text format, simplify all format strings
- Mango config: switch sway/* to hyprland/* modules, remove unused modules

Hyprland:
- Disable pseudotile and VFR

Sway:
- Fix clamshell script path (jozamudi -> work)
- Comment out gsettings, systemctl, dbus exec lines
- Delete unused env.sh script

Other:
- Delete nvim llm plugin and opencode coding-partner agent
- Delete Zoom and Nextcloud desktop entries
- Migrate Discord to Flatpak
- Rotate opencode API key
- Add extended-keys to tmux config
- Clear defaults.list
2026-06-03 10:11:06 -07:00
jozamudi b52849f1dc add opencode configuration with symlink support 2026-05-07 09:52:03 -07:00
jozamudi 8630f6318e chore: update waybar, nvim llm plugin, and sway config
- Replace sway window module with hyprland submap in waybar
- Move clock to right side and update display format
- Enable battery time display and update workspace button styling
- Update nvim llm plugin model ID, backend URL, and FIM tokens
- Uncomment default terminal and add GTK/Qt wayland env vars in sway
2026-05-04 16:59:40 -07:00
jozamudi 0784b17f26 feat(hyprland): replace sway modules with hyprland equivalents (submap, window) 2026-05-04 16:33:56 -07:00
jozamudi cd2d55137b fix(hyprland): switch workspaces module and add active workspace styling 2026-05-04 16:31:17 -07:00
jozamudi 2ad618af1b feat: nvim; llm inline llm autocomplete 2026-03-08 10:17:22 -07:00
jozamudi 7ebe8337b0 hyprlock: reduce input field size, move clock to bottom 2026-03-07 15:18:27 -08:00
jozamudi cad7412741 refactor: adjust hyprland, kitty, and nvim settings
- hyprland: add hy3 plugin config, prefer kitty terminal, change shift+exit to E
- kitty: reduce font size to 10.5
- nvim: change indent width to 2 spaces
- nvim: replace avante with parrot (Ollama provider)
- nvim: temporarily disable treesitter install
2026-03-07 15:12:35 -08:00
jozamudi 8e87a3a909 feat: hyprland; set env variables to prefer wayland. nvim; ai plugin 2026-02-10 15:04:26 -08:00
jozamudi 88af90e9ee Changes to be committed:
modified:   .config/hypr/hyprland.conf
	modified:   .config/nvim/lua/plugins/treesitter.lua
2026-02-08 09:11:24 -08:00
jozamudi b09ebf25d5 Changes to be committed:
modified:   .config/sway/config
	deleted:    .config/sway/waybar
	new file:   .config/sway/waybar/config.jsonc
	new file:   .config/sway/waybar/style.css
	new file:   .config/systemd/user/default.target.wants/shikane.service
	new file:   .config/systemd/user/shikane.service
	modified:   .zshrc
	new file:   applications/application.desktop
2026-02-06 10:28:14 -08:00
jozamudi e99e6b3d92 feat: use hyprile; zsh better prompt; 2026-02-05 22:25:36 -08:00
jozamudi fc10f8c36d Changes to be committed:
modified:   .config/hypr/hyprland.conf
	modified:   .config/kitty/kitty.conf
	modified:   .config/nvim/init.lua
	modified:   .config/nvim/lua/plugins/colorscheme.lua
	new file:   .config/nvim/lua/plugins/outline.lua
	modified:   .config/nvim/lua/plugins/treesitter.lua
2026-02-05 21:48:50 -08:00
jozamudi 9b066c7dd8 Changes to be committed:
modified:   .config/hypr/hyprland.conf
	modified:   .config/kitty/kitty.conf
	modified:   .zshrc
2026-02-05 09:49:45 -08:00
jozamudi 05c9fbada5 feat: zsh color 2026-01-26 09:23:33 -08:00
jozamudi fcdfa97317 feat: sway waybar config, and change font size for kitty 2026-01-24 20:16:01 -08:00
jozamudi 592db54a84 feat: hypridle and hyprlock 2026-01-24 20:16:01 -08:00
jozamudi 5d7301d01f merege 2026-01-20 09:27:00 -08:00
jozamudi b9888fa856 fix: nvim treesitter error, add hyperland lock keybind and some other cosmetic settings 2026-01-20 09:13:03 -08:00
jozamudi 33d2198ff6 fix: snippits leaving icons on autocomplete 2026-01-19 23:01:47 -08:00
jozamudi e72e7289d9 feat: screenshots, scaling, and h3:layout changes 2026-01-15 09:06:06 -08:00
jozamudi 0ff69d94b3 fix: xwayland scaling 2026-01-05 15:06:24 -08:00
jozamudi ee3428acd0 latest 2026-01-01 15:23:37 -08:00
jozamudi 087b6e8422 latest 2025-12-26 10:35:15 -08:00
jozamudi 685dcfa301 fix: gitignore 2025-12-26 10:34:05 -08:00
jozamudi 0d9fd45d34 feat: hyperland with i3 manual tiling 2025-12-25 07:51:28 -08:00
jozamudi 970a284ebc latest 2025-12-23 19:33:56 -08:00
jozamudi e2da3d9a20 feat: Waybar 2025-12-19 22:14:03 -08:00
jozamudi acd842c2aa latest lsp config with mason and autocomplete 2025-12-15 15:49:30 -08:00
jozamudi 798d6bb69c Add autoload autocommands for file change reload 2025-12-01 20:03:07 -08:00
jozamudi 833d17bc94 Update sway config to set Mod4 as mod key and other tweaks 2025-12-01 20:02:30 -08:00
jozamudi a1ef3c6e12 feat:new nvim config and some other stuff 2025-11-29 11:30:17 -08:00
jozamudi d524ebac95 latest 2025-11-21 08:19:00 -08:00
jozamudi 3e3c580aa6 feat: mango animation speed and kitty opacity 2025-10-19 16:53:42 -07:00
jozamudi c39b29f3a7 feat: latest nvim setup 2025-10-19 15:10:41 -07:00
jozamudi 1f31c845a6 feat: latest kitty, mango, and mango config 2025-10-19 11:59:48 -07:00
jozamudi 64bcfde70e feat: mango tweaks 2025-10-17 16:17:44 -07:00
jozamudi a14fe27f98 feat: add mango window manager config 2025-10-17 11:56:34 -07:00
jozamudi e9df39d7ea tmux and nvim changes 2025-10-06 21:30:57 -07:00
jozamudi 42b0e5c64d fix lsp to and code completion 2025-09-26 23:14:04 -05:00
jozamudi 91fe229e59 latest 2025-09-14 22:06:00 -07:00
jozamudi 9fbf3bc8c1 waybar, swaylock, swayfx, and nvim plugins 2025-09-01 12:10:45 -07:00
jozamudi d38aa180bb fixed waybar colors and lables; add keybinds for sway config 2025-08-24 20:01:14 -07:00
jozamudi 17a739b0d5 latest 2025-08-15 22:30:49 -07:00
jozamudi e803a33497 latest 2025-07-10 11:42:42 -07:00
jozamudi e0adb27cb0 vim copilot, waybar config 2025-07-04 19:57:35 -07:00
jozamudi 5e635a8ef1 latest 2025-05-22 08:04:48 -07:00
jozamudi 5caee464f3 latest 2025-05-21 16:22:38 -07:00
jozamudi 7ee39c0028 latest 2025-05-01 18:08:06 -07:00
jozamudi 360781528c lastes 2025-04-23 18:36:13 -07:00
jozamudi 81d65761fd latest 2025-03-21 13:06:13 -07:00
jozamudi 1c129553ea move to hyper for better screen sharing suppor 2025-03-11 10:14:22 -07:00
jozamudi 7fdd22930c add foot and way config 2025-03-06 20:10:47 -08:00
jozamudi 311db4a0a5 latest 2025-03-06 19:34:04 -08:00
62 changed files with 2223 additions and 944 deletions

No files matched your search

+9 -128
View File
@@ -1,132 +1,13 @@
# ~/.bashrc: executed by bash(1) for non-login shells. #
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) # ~/.bashrc
# for examples #
# If not running interactively, don't do anything # If not running interactively, don't do anything
case $- in [[ $- != *i* ]] && return
*i*) ;;
*) return;;
esac
# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth
# append to the history file, don't overwrite it
shopt -s histappend
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000
# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize
# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar
# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
xterm-color|*-256color) color_prompt=yes;;
esac
# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes
if [ -n "$force_color_prompt" ]; then
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
# We have color support; assume it's compliant with Ecma-48
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
# a case would tend to support setf rather than setaf.)
color_prompt=yes
else
color_prompt=
fi
fi
#if [ "$color_prompt" = yes ]; then
# PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
#else
# PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
#fi
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w $(parse_git_branch)\$ '
fi
unset color_prompt force_color_prompt
# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
;;
*)
;;
esac
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
#alias dir='dir --color=auto'
#alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
# Add an "alert" alias for long running commands. Use like so:
# sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
alias ls='ls --color=auto'
alias grep='grep --color=auto'
alias vim='nvim' alias vim='nvim'
alias ssh='ssh -XC' PS1='[\u@\h \W]\$ '
alias xfreerdp='xfreerdp +clipboard /dynamic-resolution'
eval "$(fzf --bash)"
+4 -4
View File
@@ -1,13 +1,13 @@
live_config_reload = true general.live_config_reload = true
[font] [font]
normal = { family = "JetBrainsMono NF", style = "Regular" } normal = { family = "JetBrainsMono NF", style = "Regular" }
size = 12 size = 10
[window] [window]
decorations = 'buttonless' dynamic_padding = true
dynamic_padding = false
opacity = 0.9 opacity = 0.9
decorations = "None"
[colors] [colors]
draw_bold_text_with_bright_colors = true draw_bold_text_with_bright_colors = true
+240
View File
@@ -0,0 +1,240 @@
# -*- conf -*-
# shell=$SHELL (if set, otherwise user's default shell from /etc/passwd)
# term=foot (or xterm-256color if built with -Dterminfo=disabled)
term=xterm-256color
# login-shell=no
#include=/usr/share/foot/themes/jetbrains-darcula
#include=/usr/share/foot/themes/paper-color-dark
app-id=foot # globally set wayland app-id. Default values are "foot" and "footclient" for desktop and server mode
title=foot
locked-title=no
font=JetBrainsMono NF:size=10.5
#font= :size=10
# font-bold=<bold variant of regular font>
# font-italic=<italic variant of regular font>
# font-bold-italic=<bold+italic variant of regular font>
# font-size-adjustment=0.5
# line-height=<font metrics>
# letter-spacing=0
# horizontal-letter-offset=0
# vertical-letter-offset=0
# underline-offset=<font metrics>
# underline-thickness=<font underline thickness>
# box-drawings-uses-font-glyphs=no
# dpi-aware=no
# initial-window-size-pixels=700x500 # Or,
# initial-window-size-chars=<COLSxROWS>
# initial-window-mode=windowed
pad=5x5 # optionally append 'center'
#resize-by-cells=yes
# resize-delay-ms=100
# bold-text-in-bright=no
# word-delimiters=,│`|:"'()[]{}<>
selection-target=primary
# workers=<number of logical CPUs>
# utmp-helper=/usr/lib/utempter/utempter # When utmp backend is ‘libutempter’ (Linux)
# utmp-helper=/usr/libexec/ulog-helper # When utmp backend is ‘ulog’ (FreeBSD)
[environment]
# name=value
[bell]
# urgent=no
# notify=no
# visual=no
# command=
# command-focused=no
[desktop-notifications]
command=notify-send --wait --app-name ${app-id} --icon ${app-id} --category ${category} --urgency ${urgency} --expire-time ${expire-time} --hint STRING:image-path:${icon} --hint BOOLEAN:suppress-sound:${muted} --hint STRING:sound-name:${sound-name} --replace-id ${replace-id} ${action-argument} --print-id -- ${title} ${body}
# command-action-argument=--action ${action-name}=${action-label}
# close=""
# inhibit-when-focused=yes
[scrollback]
# lines=1000
# multiplier=3.0
# indicator-position=relative
# indicator-format=""
[url]
launch=xdg-open ${url}
# label-letters=sadfjklewcmpgh
# osc8-underline=url-mode
# protocols=http, https, ftp, ftps, file, gemini, gopher
# uri-characters=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.,~:;/?#@!$&%*+="'()[]
[cursor]
# style=block
# color=<inverse foreground/background>
# blink=no
# blink-rate=500
# beam-thickness=1.5
# underline-thickness=<font underline thickness>
[mouse]
# hide-when-typing=no
# alternate-scroll-mode=yes
[touch]
# long-press-delay=400
[colors]
alpha=0.9
# background=242424
# foreground=ffffff
# flash=7f7f00
# flash-alpha=0.5
# Normal/regular colors (color palette 0-7)
regular0=242424 # black
regular1=f62b5a # red
regular2=47b413 # green
regular3=e3c401 # yellow
regular4=24acd4 # blue
regular5=f2affd # magenta
regular6=13c299 # cyan
regular7=e6e6e6 # white
# Bright colors (color palette 8-15)
bright0=616161 # bright black
bright1=ff4d51 # bright red
bright2=35d450 # bright green
bright3=e9e836 # bright yellow
bright4=5dc5f8 # bright blue
bright5=feabf2 # bright magenta
bright6=24dfc4 # bright cyan
bright7=ffffff # bright white
## dimmed colors (see foot.ini(5) man page)
# dim0=<not set>
# ...
# dim7=<not-set>
## The remaining 256-color palette
# 16 = <256-color palette #16>
# ...
# 255 = <256-color palette #255>
## Misc colors
# selection-foreground=<inverse foreground/background>
# selection-background=<inverse foreground/background>
# jump-labels=<regular0> <regular3> # black-on-yellow
# scrollback-indicator=<regular0> <bright4> # black-on-bright-blue
# search-box-no-match=<regular0> <regular1> # black-on-red
# search-box-match=<regular0> <regular3> # black-on-yellow
# urls=<regular3>
[csd]
# preferred=server
# size=26
# font=<primary font>
# color=<foreground color>
# hide-when-maximized=no
# double-click-to-maximize=yes
# border-width=0
# border-color=<csd.color>
# button-width=26
# button-color=<background color>
# button-minimize-color=<regular4>
# button-maximize-color=<regular2>
# button-close-color=<regular1>
[key-bindings]
# scrollback-up-page=Shift+Page_Up
# scrollback-up-half-page=none
# scrollback-up-line=none
# scrollback-down-page=Shift+Page_Down
# scrollback-down-half-page=none
# scrollback-down-line=none
# scrollback-home=none
# scrollback-end=none
# clipboard-copy=Control+Shift+c XF86Copy
# clipboard-paste=Control+Shift+v XF86Paste
# primary-paste=Shift+Insert
# search-start=Control+Shift+r
# font-increase=Control+plus Control+equal Control+KP_Add
# font-decrease=Control+minus Control+KP_Subtract
# font-reset=Control+0 Control+KP_0
# spawn-terminal=Control+Shift+n
# minimize=none
# maximize=none
# fullscreen=none
# pipe-visible=[sh -c "xurls | fuzzel | xargs -r firefox"] none
# pipe-scrollback=[sh -c "xurls | fuzzel | xargs -r firefox"] none
# pipe-selected=[xargs -r firefox] none
# pipe-command-output=[wl-copy] none # Copy last command's output to the clipboard
# show-urls-launch=Control+Shift+o
# show-urls-copy=none
# show-urls-persistent=none
# prompt-prev=Control+Shift+z
# prompt-next=Control+Shift+x
# unicode-input=Control+Shift+u
# noop=none
[search-bindings]
# cancel=Control+g Control+c Escape
# commit=Return
# find-prev=Control+r
# find-next=Control+s
# cursor-left=Left Control+b
# cursor-left-word=Control+Left Mod1+b
# cursor-right=Right Control+f
# cursor-right-word=Control+Right Mod1+f
# cursor-home=Home Control+a
# cursor-end=End Control+e
# delete-prev=BackSpace
# delete-prev-word=Mod1+BackSpace Control+BackSpace
# delete-next=Delete
# delete-next-word=Mod1+d Control+Delete
# extend-char=Shift+Right
# extend-to-word-boundary=Control+w Control+Shift+Right
# extend-to-next-whitespace=Control+Shift+w
# extend-line-down=Shift+Down
# extend-backward-char=Shift+Left
# extend-backward-to-word-boundary=Control+Shift+Left
# extend-backward-to-next-whitespace=none
# extend-line-up=Shift+Up
# clipboard-paste=Control+v Control+Shift+v Control+y XF86Paste
# primary-paste=Shift+Insert
# unicode-input=none
# quit=none
# scrollback-up-page=Shift+Page_Up
# scrollback-up-half-page=none
# scrollback-up-line=none
# scrollback-down-page=Shift+Page_Down
# scrollback-down-half-page=none
# scrollback-down-line=none
# scrollback-home=none
# scrollback-end=none
[url-bindings]
# cancel=Control+g Control+c Control+d Escape
# toggle-url-visible=t
[text-bindings]
# \x03=Mod4+c # Map Super+c -> Ctrl+c
[mouse-bindings]
# scrollback-up-mouse=BTN_WHEEL_BACK
# scrollback-down-mouse=BTN_WHEEL_FORWARD
# font-increase=Control+BTN_WHEEL_BACK
# font-decrease=Control+BTN_WHEEL_FORWARD
# selection-override-modifiers=Shift
# primary-paste=BTN_MIDDLE
# select-begin=BTN_LEFT
# select-begin-block=Control+BTN_LEFT
# select-extend=BTN_RIGHT
# select-extend-character-wise=Control+BTN_RIGHT
# select-word=BTN_LEFT-2
# select-word-whitespace=Control+BTN_LEFT-2
# select-quote = BTN_LEFT-3
# select-row=BTN_LEFT-4
# vim: ft=dosini
+47 -18
View File
@@ -1,34 +1,63 @@
# Idle / lock for SWAY (wlroots), not Hyprland.
#
# Two things in the original Hyprland template silently did nothing under sway:
# * `loginctl lock-session` -> sway implements no freedesktop login1 Session
# Lock protocol, so it is a no-op. Lock directly.
# * `hyprctl dispatch dpms` -> "HYPRLAND_INSTANCE_SIGNATURE not set!".
# Use `swaymsg "output * power on|off"`.
# Also: a hyprlock instance can outlive a sway session and then make the
# `pidof hyprlock || hyprlock` guard a permanent no-op; the sway config kills
# leftovers at login (`exec --no-startup-id pkill -x hyprlock`).
general { general {
lock_cmd = pidof hyprlock || hyprlock # avoid starting multiple hyprlock instances. lock_cmd = pidof hyprlock || hyprlock
before_sleep_cmd = loginctl lock-session # lock before suspend. # pre-suspend uses swaylock: fast, sway-native, exits cleanly (no leak)
after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display. before_sleep_cmd = swaylock -f -c 000000
# DPMS "power on" alone does not clear a post-resume eDP page-flip stall
# ("Atomic commit failed: Device or resource busy" for tens of minutes).
# The script does a full disable/enable (forced modeset) but ONLY when the
# journal actually shows the stall -- it used to fire unconditionally, which
# risked the shikane VariantInProgress deadlock on healthy resumes. The
# original i915 PSR2/DC4 cause is gone; this laptop uses the `xe` driver.
# Lid-aware so it does not race shikane's "External Display" profile.
after_sleep_cmd = /home/work/.config/sway/scripts/recover-output-after-resume.sh
} }
listener { listener {
timeout = 150 # 2.5min. timeout = 150 # 2.5min
on-timeout = brightnessctl -s set 10 # set monitor backlight to minimum, avoid 0 on OLED monitor. on-timeout = brightnessctl -s set 10
on-resume = brightnessctl -r # monitor backlight restore. on-resume = brightnessctl -r
} }
# turn off keyboard backlight, comment out this section if you dont have a keyboard backlight. # keyboard backlight
listener { listener {
timeout = 150 # 2.5min. timeout = 150
on-timeout = brightnessctl -sd rgb:kbd_backlight set 0 # turn off keyboard backlight. on-timeout = brightnessctl -sd rgb:kbd_backlight set 0
on-resume = brightnessctl -rd rgb:kbd_backlight # turn on keyboard backlight. on-resume = brightnessctl -rd rgb:kbd_backlight
} }
listener { listener {
timeout = 300 # 5min timeout = 300 # 5min -> lock
on-timeout = loginctl lock-session # lock screen when timeout has passed on-timeout = pidof hyprlock || hyprlock
} }
listener { listener {
timeout = 330 # 5.5min timeout = 330 # 5.5min -> output power off
on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed on-timeout = swaymsg "output * power off"
on-resume = hyprctl dispatch dpms on && brightnessctl -r # screen on when activity is detected after timeout has fired. on-resume = swaymsg "output * power on" && brightnessctl -r
} }
# 10min -> s2idle. This listener used to be missing entirely: the panel powered
# off at 330s but the machine never suspended, so a lid-open idle laptop kept
# draining ~6-7W (10h battery) forever. Closing the lid did suspend, because
# logind's default HandleLidSwitch=suspend -- but only the lid path.
# logind's own IdleAction stays Ignore on purpose (it cannot run swaymsg/hyprlock
# pre-sleep hooks; hypridle's before_sleep_cmd can).
# 600s = long enough that a compile/syncthing burst usually finishes; a suspend
# mid-task is recoverable, and before_sleep_cmd locks on resume.
# Verified: polkit org.freedesktop.login1.suspend allow_active=yes, so this
# needs no auth prompt from an active local session. Plain suspend (not
# suspend-then-hibernate) because swap is zram-only -> hibernate impossible.
listener { listener {
timeout = 1800 # 30min timeout = 600 # 10min -> suspend
on-timeout = systemctl suspend # suspend pc on-timeout = systemctl suspend
} }
+50 -35
View File
@@ -23,13 +23,8 @@ autogenerated = 0 # remove this line to remove the warning
################ ################
# See https://wiki.hypr.land/Configuring/Monitors/ # See https://wiki.hypr.land/Configuring/Monitors/
monitor=,preferred,auto,auto, monitor=,preferred,auto,auto
#exec-once = swaybg -i /usr/share/backgrounds/gnome/vnc-d.png
workspace=name:1, monitor:DP-1
exec-once=hyprctl dispatch workspace 1
workspace=name:10, monitor:DP-2
exec-once=hyprctl dispatch workspace 10
################### ###################
@@ -40,6 +35,7 @@ exec-once=hyprctl dispatch workspace 10
# Set programs that you use # Set programs that you use
$terminal = kitty $terminal = kitty
#$terminal = foot
$fileManager = nautilus $fileManager = nautilus
$menu = wofi --show drun -GI $menu = wofi --show drun -GI
@@ -54,14 +50,18 @@ $menu = wofi --show drun -GI
# exec-once = $terminal # exec-once = $terminal
# exec-once = nm-applet & # exec-once = nm-applet &
# exec-once = waybar & hyprpaper & firefox # exec-once = waybar & hyprpaper & firefox
exec-once = hypridle &
exec-once = nm-applet & exec-once = nm-applet &
exec-once = blueman-applet & exec-once = blueman-applet &
exec-once = shikane & exec-once = shikane &
exec-once = waybar -c ~/.config/hypr/waybar/config.jsonc -s ~/.config/hypr/waybar/style.css & exec-once = waybar -c ~/.config/hypr/waybar/config.jsonc -s ~/.config/hypr/waybar/style.css &
exec-once = hyprpm reload -n exec-once = hyprpm reload -n
exec-once = flatpak run com.github.wwmm.easyeffects -w
exec-once = flatpak run com.github.wwmm.easyeffects -w &
exec-once = systemctl --user start hyprpolkitagent exec-once = systemctl --user start hyprpolkitagent
exec-once = hypridle exec-once = xrdb -merge ~/.Xresources
exec-once = gsettings set org.gnome.desktop.interface color-scheme "prefer-dark"
############################# #############################
@@ -103,8 +103,8 @@ permission = /usr/(bin|local/bin)/hyprpm, plugin, allow
# https://wiki.hypr.land/Configuring/Variables/#general # https://wiki.hypr.land/Configuring/Variables/#general
general { general {
gaps_in = 4 gaps_in = 2
gaps_out = 4 gaps_out = 2
border_size = 1 border_size = 1
@@ -113,10 +113,10 @@ general {
col.inactive_border = rgba(595959aa) col.inactive_border = rgba(595959aa)
# Set to true enable resizing windows by clicking and dragging on borders and gaps # Set to true enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = false resize_on_border = true
# Please see https://wiki.hypr.land/Configuring/Tearing/ before you turn this on # Please see https://wiki.hypr.land/Configuring/Tearing/ before you turn this on
allow_tearing = false allow_tearing = true
#layout = dwindle #layout = dwindle
layout = hy3 layout = hy3
@@ -125,8 +125,8 @@ general {
# https://wiki.hypr.land/Configuring/Variables/#decoration # https://wiki.hypr.land/Configuring/Variables/#decoration
decoration { decoration {
rounding = 4 rounding = 6
rounding_power = 2 rounding_power = 3
# Change transparency of focused and unfocused windows # Change transparency of focused and unfocused windows
active_opacity = 1.0 active_opacity = 1.0
@@ -152,7 +152,8 @@ decoration {
# https://wiki.hypr.land/Configuring/Variables/#animations # https://wiki.hypr.land/Configuring/Variables/#animations
animations { animations {
#enabled = yes, please :) #enabled = yes, please :)
enabled = false enabled = no
# Default curves, see https://wiki.hypr.land/Configuring/Animations/#curves # Default curves, see https://wiki.hypr.land/Configuring/Animations/#curves
# NAME, X0, Y0, X1, Y1 # NAME, X0, Y0, X1, Y1
@@ -195,7 +196,7 @@ animations {
# See https://wiki.hypr.land/Configuring/Dwindle-Layout/ for more # See https://wiki.hypr.land/Configuring/Dwindle-Layout/ for more
dwindle { dwindle {
pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below #pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
preserve_split = true # You probably want this preserve_split = true # You probably want this
} }
@@ -208,9 +209,29 @@ master {
misc { misc {
force_default_wallpaper = 0 # Set to 0 or 1 to disable the anime mascot wallpapers force_default_wallpaper = 0 # Set to 0 or 1 to disable the anime mascot wallpapers
disable_hyprland_logo = true# If true disables the random hyprland logo / anime girl background. :( disable_hyprland_logo = true# If true disables the random hyprland logo / anime girl background. :(
vfr = true #vfr = true
} }
xwayland {
force_zero_scaling = true
}
env = GTK_SCALE,1
env = XCURSOR_SIZE,32
plugin {
hy3 {
tabs {
# height of the tab bar
height = 2 # default: 22
# render the window title on the bar
render_text = false # default: true
}
}
}
############# #############
### INPUT ### ### INPUT ###
@@ -256,21 +277,23 @@ $mainMod = SUPER # Sets "Windows" key as main modifier
bind = $mainMod, RETURN, exec, $terminal bind = $mainMod, RETURN, exec, $terminal
bind = $mainMod, D, exec, $menu bind = $mainMod, D, exec, $menu
bind = $mainMod, F, fullscreen bind = $mainMod, F, fullscreen
bind = $mainMod, M, exec, hyprlock
bind = $mainMod SHIFT, SPACE, togglefloating, bind = $mainMod SHIFT, SPACE, togglefloating,
bind = $mainMod SHIFT, Q, hy3:killactive, bind = $mainMod SHIFT, Q, hy3:killactive,
bind = $mainMod SHIFT, M, exit, bind = $mainMod SHIFT, E, exit,
bind = $mainMod SHIFT, S, pin bind = $mainMod SHIFT, S, pin
bind = $mainMod, B, hy3:makegroup, h bind = $mainMod, B, hy3:makegroup, h
bind = $mainMod, V, hy3:makegroup, v bind = $mainMod, V, hy3:makegroup, v
bind = $mainMod, W, hy3:makegroup, tab bind = $mainMod, W, hy3:makegroup, tab
bind = $mainMod, A, hy3:changefocus, raise
bind = $mainMod, X, hy3:locktab bind = $mainMod, X, hy3:locktab
bind = $mainMod, E, hy3:expand, expand
bind = $mainMod, R, hy3:changegroup, opposite bind = $mainMod, R, hy3:changegroup, opposite
bind = $mainMod SHIFT, A, hy3:changefocus, lower #bind = $mainMod SHIFT, A, hy3:changefocus, lower
bind = $mainMod SHIFT, E, hy3:expand, base #bind = $mainMod, A, hy3:changefocus, raise
#bind = $mainMod SHIFT, E, hy3:expand, base
#bind = $mainMod, E, hy3:expand, expand
# Move focus with mainMod + arrow keys # Move focus with mainMod + arrow keys
bind = $mainMod, h, hy3:movefocus, l bind = $mainMod, h, hy3:movefocus, l
@@ -316,14 +339,6 @@ bind = $mainMod SHIFT, 8, hy3:movetoworkspace, 8
bind = $mainMod SHIFT, 9, hy3:movetoworkspace, 9 bind = $mainMod SHIFT, 9, hy3:movetoworkspace, 9
bind = $mainMod SHIFT, 0, hy3:movetoworkspace, 10 bind = $mainMod SHIFT, 0, hy3:movetoworkspace, 10
#workspace = name:10, monitor:DP-3
#exec-once = hyperctl dispatch workspace 10
#workspace = name:1, monitor:DP-2
#exec-once = hyperctl dispatch workspace 1
# Example special workspace (scratchpad) # Example special workspace (scratchpad)
bind = $mainMod, MINUS, togglespecialworkspace, magic bind = $mainMod, MINUS, togglespecialworkspace, magic
bind = $mainMod SHIFT, MINUS, movetoworkspace, special:magic bind = $mainMod SHIFT, MINUS, movetoworkspace, special:magic
@@ -350,6 +365,10 @@ bindl = , XF86AudioPause, exec, playerctl play-pause
bindl = , XF86AudioPlay, exec, playerctl play-pause bindl = , XF86AudioPlay, exec, playerctl play-pause
bindl = , XF86AudioPrev, exec, playerctl previous bindl = , XF86AudioPrev, exec, playerctl previous
# Screenshots
bindel = $mainMod, p, exec, grimshot --notify savecopy anything
bindel = $mainMod, m, exec, shikanectl reload
############################## ##############################
### WINDOWS AND WORKSPACES ### ### WINDOWS AND WORKSPACES ###
############################## ##############################
@@ -365,7 +384,3 @@ bindl = , XF86AudioPrev, exec, playerctl previous
# Fix some dragging issues with XWayland # Fix some dragging issues with XWayland
#windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0 #windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0
bindel = $mainMod, p, exec, grimshot --notify savecopy anything
bind = $mainMod, M, exec, hyprlock; playerctl pause
+3 -5
View File
@@ -6,17 +6,15 @@ background {
input-field { input-field {
monitor = monitor =
size = 10%, 3% size = 15%, 5%
font_family = Noto Sans font_family = Noto Sans
dots_size = 0.08 dots_size = 0.08
position = 0, -200
fade_on_empty = false
} }
label { label {
monitor = monitor =
text = $TIME text = $TIME
font_size = 80 font_size = 200
position = 0,0 position = 0, 200
} }
+23 -38
View File
@@ -3,19 +3,18 @@
"spacing": 2, // Gaps between modules (4px) "spacing": 2, // Gaps between modules (4px)
"modules-left": [ "modules-left": [
"hyprland/workspaces", "hyprland/workspaces",
"hyprland/mode", "hyprland/submap",
"hyprland/scratchpad",
"hyprland/window" "hyprland/window"
], ],
"modules-center": [ //"modules-center": [
//"sway/window" //"sway/window"
"clock", //],
],
"modules-right": [ "modules-right": [
//"mpd", //"mpd",
"pulseaudio", "pulseaudio",
//"network", //"network",
"battery", "battery",
"clock",
"tray" "tray"
//"custom/power" //"custom/power"
], ],
@@ -23,9 +22,8 @@
"format": "<span style=\"italic\">{}</span>" "format": "<span style=\"italic\">{}</span>"
}, },
"sway/scratchpad": { "sway/scratchpad": {
"format": "{icon} {count}", "format": "{count}",
"show-empty": false, "show-empty": false,
"format-icons": ["", ""],
"tooltip": true, "tooltip": true,
"tooltip-format": "{app}: {title}" "tooltip-format": "{app}: {title}"
}, },
@@ -50,66 +48,53 @@
"warning": 30, "warning": 30,
"critical": 15 "critical": 15
}, },
//"format": "{time} {capacity}% {icon}", "format": "{time} {capacity}%",
"format": "{capacity}% {icon}", "format-full": "{capacity}%",
"format-full": "{capacity}% {icon}",
"format-charging": "{capacity}% C", "format-charging": "{capacity}% C",
"format-plugged": "{capacity}% P", "format-plugged": "{capacity}% P",
"format-alt": "{time} {icon}", "format-alt": "{time}",
// "format-good": "", // An empty format will hide the module // "format-good": "", // An empty format will hide the module
// "format-full": "", // "format-full": "",
"format-icons": ["", "", "", "", ""]
}, },
"battery#bat2": { "battery#bat2": {
"bat": "BAT2" "bat": "BAT2"
}, },
"power-profiles-daemon": { "power-profiles-daemon": {
"format": "{icon}", "format": "{profile}",
"tooltip-format": "Power profile: {profile}\nDriver: {driver}", "tooltip-format": "Power profile: {profile}\nDriver: {driver}",
"tooltip": true, "tooltip": true,
"format-icons": { "format-icons": {"default": [""]}
"default": "",
"performance": "",
"balanced": "",
"power-saver": ""
}
}, },
"network": { "network": {
// "interface": "wlp2*", // (Optional) To force the use of this interface // "interface": "wlp2*", // (Optional) To force the use of this interface
//"format-wifi": "{essid} ({signalStrength}%)", //"format-wifi": "{essid} ({signalStrength}%)",
//"format-ethernet": "{ipaddr}/{cidr}", //"format-ethernet": "{ipaddr}/{cidr}",
//"tooltip-format": "{ifname} via {gwaddr}", //"tooltip-format": "{ifname} via {gwaddr}",
//"format-linked": "{ifname} (No IP)", //"format-linked": "{ifname} (No IP)",
//"format-disconnected": "Disconnected ⚠", //"format-disconnected": "Disconnected",
"format-disconnected": "Disconnected", "format-disconnected": "Disconnected",
"format-alt": "{ifname}: {ipaddr}/{cidr}" "format-alt": "{ifname}: {ipaddr}/{cidr}"
}, },
"pulseaudio": { "pulseaudio": {
// "scroll-step": 1, // %, can be a float // "scroll-step": 1, // %, can be a float
"format": "{volume}% {icon} {format_source}", "format": "{volume}% {format_source}",
"format-bluetooth": "{volume}% {icon}  {format_source}", "format-bluetooth": "{volume}% {format_source}",
"format-bluetooth-muted": " {icon}  {format_source}", "format-bluetooth-muted": " {format_source}",
"format-muted": " {format_source}", "format-muted": " {format_source}",
"format-source": "{volume}%", "format-source": "{volume}%",
"format-source-muted": "", "format-source-muted": "",
"format-icons": { "format-icons": {
"headphone": "", "default": [""]
"hands-free": "",
"headset": "",
"phone": "",
"portable": "",
"car": "",
"default": ["", "", ""]
}, },
"on-click": "pavucontrol" "on-click": "pavucontrol"
}, },
"custom/media": { "custom/media": {
"format": "{icon} {text}", "format": "{text}",
"return-type": "json", "return-type": "json",
"max-length": 40, "max-length": 40,
"format-icons": { "format-icons": {
"spotify": "", "spotify": "",
"default": "🎜" "default": ""
}, },
"escape": true, "escape": true,
"exec": "$HOME/.config/waybar/mediaplayer.py 2> /dev/null" // Script in resources folder "exec": "$HOME/.config/waybar/mediaplayer.py 2> /dev/null" // Script in resources folder
+19 -9
View File
@@ -3,8 +3,8 @@
/*font-family: FontAwesome, Roboto, Helvetica, Arial, sans-serif; */ /*font-family: FontAwesome, Roboto, Helvetica, Arial, sans-serif; */
/*font-family: "JetBrainsMono NF";*/ /*font-family: "JetBrainsMono NF";*/
font-family: "JetBrainsMonoNFM-Regular"; font-family: "JetBrainsMonoNFM-Regular";
font-size: 13px; font-size: 14px;
font-weight: bold; font-weight: normal;
} }
window#waybar { window#waybar {
@@ -49,7 +49,7 @@ button:hover {
#workspaces button { #workspaces button {
padding: 0 4px; padding: 0 4px;
/*background-color: transparent;*/ background-color: transparent;
color: #ffffff; color: #ffffff;
} }
@@ -57,15 +57,25 @@ button:hover {
background: rgba(0, 0, 0, 0.2); background: rgba(0, 0, 0, 0.2);
} }
#workspaces button.focused { #workspaces button.active {
background-color: #64727D; background-color: #eb4d4b;
/*box-shadow: inset 0 -3px #ffffff;*/ box-shadow: inset 0 -3px #ffffff;
color: #ffffff;
font-weight: bold;
} }
#workspaces button.urgent { #workspaces button.urgent {
background-color: #eb4d4b; background-color: #eb4d4b;
} }
#workspaces button.visible {
background-color: #64727D;
}
#workspaces button.empty {
background-color: transparent;
}
#mode { #mode {
background-color: #64727D; background-color: #64727D;
box-shadow: inset 0 -3px #ffffff; box-shadow: inset 0 -3px #ffffff;
@@ -93,17 +103,17 @@ button:hover {
} }
#window, #window,
#workspaces { #workspaces-hyprland {
margin: 0 4px; margin: 0 4px;
} }
/* If workspaces is the leftmost module, omit left margin */ /* If workspaces is the leftmost module, omit left margin */
.modules-left > widget:first-child > #workspaces { .modules-left > widget:first-child > #workspaces-hyprland {
margin-left: 0; margin-left: 0;
} }
/* If workspaces is the rightmost module, omit right margin */ /* If workspaces is the rightmost module, omit right margin */
.modules-right > widget:last-child > #workspaces { .modules-right > widget:last-child > #workspaces-hyprland {
margin-right: 0; margin-right: 0;
} }
-215
View File
@@ -1,215 +0,0 @@
# This file has been auto-generated by i3-config-wizard(1).
# It will not be overwritten, so edit it as you like.
#
# Should you change your keyboard layout some time, delete
# this file and re-run i3-config-wizard(1).
#
# i3 config file (v4)
#
# Please see https://i3wm.org/docs/userguide.html for a complete reference!
set $mod Mod1
# Font for window titles. Will also be used by the bar unless a different font
# is used in the bar {} block below.
#font pango:monospace 10
font pango:JetBrainsMono NF 10
# This font is widely installed, provides lots of unicode glyphs, right-to-left
# text rendering and scalability on retina/hidpi displays (thanks to pango).
#font pango:DejaVu Sans Mono 8
# Start XDG autostart .desktop files using dex. See also
# https://wiki.archlinux.org/index.php/XDG_Autostart
exec --no-startup-id dex --autostart --environment i3
# The combination of xss-lock, nm-applet and pactl is a popular choice, so
# they are included here as an example. Modify as you see fit.
# xss-lock grabs a logind suspend inhibit lock and will use i3lock to lock the
# screen before suspend. Use loginctl lock-session to lock your screen.
exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock --nofork
# NetworkManager is the most popular way to manage wireless networks on Linux,
# and nm-applet is a desktop environment-independent system tray GUI for it.
exec --no-startup-id nm-applet
# Use pactl to adjust volume in PulseAudio.
set $refresh_i3status killall -SIGUSR1 i3status
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status
# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod
# move tiling windows via drag & drop by left-clicking into the title bar,
# or left-clicking anywhere into the window while holding the floating modifier.
tiling_drag modifier titlebar
# start a terminal
bindsym $mod+Return exec kitty --single-instance
#bindsym $mod+Return exec ghostty
# kill focused window
bindsym $mod+Shift+q kill
# start dmenu (a program launcher)
bindsym $mod+d exec --no-startup-id rofi -show drun
# A more modern dmenu replacement is rofi:
# bindcode $mod+40 exec "rofi -modi drun,run -show drun"
# There also is i3-dmenu-desktop which only displays applications shipping a
# .desktop file. It is a wrapper around dmenu, so you need that installed.
# bindcode $mod+40 exec --no-startup-id i3-dmenu-desktop
# change focus
bindsym $mod+h focus left
bindsym $mod+j focus down
bindsym $mod+k focus up
bindsym $mod+l focus right
# alternatively, you can use the cursor keys:
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right
# move focused window
bindsym $mod+Shift+h move left
bindsym $mod+Shift+j move down
bindsym $mod+Shift+k move up
bindsym $mod+Shift+l move right
# alternatively, you can use the cursor keys:
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right
# split in horizontal orientation
#bindsym $mod+h split h
# split in vertical orientation
bindsym $mod+v split v
# enter fullscreen mode for the focused container
bindsym $mod+f fullscreen toggle
# change container layout (stacked, tabbed, toggle split)
bindsym $mod+s layout stacking
bindsym $mod+w layout tabbed
bindsym $mod+e layout toggle split
# toggle tiling / floating
bindsym $mod+Shift+space floating toggle
# change focus between tiling / floating windows
bindsym $mod+space focus mode_toggle
# focus the parent container
bindsym $mod+a focus parent
# focus the child container
#bindsym $mod+d focus child
bindsym $mod+p exec spectacle -rb
# Define names for default workspaces for which we configure key bindings later on.
# We use variables to avoid repeating the names in multiple places.
set $ws1 "1"
set $ws2 "2"
set $ws3 "3"
set $ws4 "4"
set $ws5 "5"
set $ws6 "6"
set $ws7 "7"
set $ws8 "8"
set $ws9 "9"
set $ws10 "10"
# switch to workspace
bindsym $mod+1 workspace number $ws1
bindsym $mod+2 workspace number $ws2
bindsym $mod+3 workspace number $ws3
bindsym $mod+4 workspace number $ws4
bindsym $mod+5 workspace number $ws5
bindsym $mod+6 workspace number $ws6
bindsym $mod+7 workspace number $ws7
bindsym $mod+8 workspace number $ws8
bindsym $mod+9 workspace number $ws9
bindsym $mod+0 workspace number $ws10
# move focused container to workspace
bindsym $mod+Shift+1 move container to workspace number $ws1
bindsym $mod+Shift+2 move container to workspace number $ws2
bindsym $mod+Shift+3 move container to workspace number $ws3
bindsym $mod+Shift+4 move container to workspace number $ws4
bindsym $mod+Shift+5 move container to workspace number $ws5
bindsym $mod+Shift+6 move container to workspace number $ws6
bindsym $mod+Shift+7 move container to workspace number $ws7
bindsym $mod+Shift+8 move container to workspace number $ws8
bindsym $mod+Shift+9 move container to workspace number $ws9
bindsym $mod+Shift+0 move container to workspace number $ws10
# reload the configuration file
bindsym $mod+Shift+c reload
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
bindsym $mod+Shift+r restart
# exit i3 (logs you out of your X session)
bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -B 'Yes, exit i3' 'i3-msg exit'"
bindsym $mod+Shift+s sticky toggle
# resize window (you can also use the mouse for that)
mode "resize" {
# These bindings trigger as soon as you enter the resize mode
# Pressing left will shrink the window’s width.
# Pressing right will grow the window’s width.
# Pressing up will shrink the window’s height.
# Pressing down will grow the window’s height.
bindsym h resize shrink width 10 px or 10 ppt
bindsym j resize grow height 10 px or 10 ppt
bindsym k resize shrink height 10 px or 10 ppt
bindsym l resize grow width 10 px or 10 ppt
# same bindings, but for the arrow keys
bindsym Left resize shrink width 10 px or 10 ppt
bindsym Down resize grow height 10 px or 10 ppt
bindsym Up resize shrink height 10 px or 10 ppt
bindsym Right resize grow width 10 px or 10 ppt
# back to normal: Enter or Escape or $mod+r
bindsym Return mode "default"
bindsym Escape mode "default"
bindsym $mod+r mode "default"
}
bindsym $mod+r mode "resize"
# Start i3bar to display a workspace bar (plus the system information i3status
# finds out, if available)
bar {
status_command i3blocks
position bottom
}
# Make the currently focused window a scratchpad
bindsym $mod+Shift+minus move scratchpad
# Show the first scratchpad window
bindsym $mod+minus scratchpad show
gaps inner 4
gaps outer 4
exec --no-startup-id pipewire
exec --no-startup-id picom -b
exec --no-startup-id dunst
exec xrandr --output DP-2 --auto -r 144
+12 -6
View File
@@ -1,17 +1,23 @@
#font_family family='JetBrainsMono Nerd Font Mono'
#font_family family='JetBrainsMono'
font_family family='JetBrainsMonoNFM-Regular'
font_size 10.5 font_size 10.5
#text_composition_strategy legacy #text_composition_strategy legacy
modify_font cell_width 95% #modify_font cell_width 95%
#background_opacity 20
cursor_trail 10 cursor_trail 20
cursor_trail_start_threshold 0 cursor_trail_start_threshold 0
shell_integration no-cursor shell_integration no-cursor
cursor_trail_decay 0.01 0.15 cursor_trail_decay 0.01 0.15
cursor_shape block cursor_shape block
cursor_blink true
linux_display_server wayland linux_display_server wayland
wayland_enable_ime yes wayland_enable_ime yes
# BEGIN_KITTY_FONTS
#font_family family="JetBrainsMono Nerd Font Mono"
font_family family="Fira Code"
bold_font auto
italic_font auto
bold_italic_font auto
# END_KITTY_FONTS
+20
View File
@@ -0,0 +1,20 @@
#font_family 'JetBrainsMono NF'
font_family 'JetBrainsMonoNL NFM ExtraBold'
font_size 12
bold_font auto
italic_font auto
bold_italic_font auto
text_composition_strategy legacy
modify_font cell_width 95%
cursor_trail 10
cursor_trail_start_threshold 0
shell_integration no-cursor
cursor_trail_decay 0.01 0.15
cursor_shape block
linux_display_server wayland
wayland_enable_ime yes
+3 -1
View File
@@ -19,10 +19,12 @@ wl-paste --type text --watch cliphist store &
systemctl --user start shikane & systemctl --user start shikane &
systemctl --user start sway-audio-idle-inhibit & systemctl --user start sway-audio-idle-inhibit &
#pipewire & pipewire &
swaync & swaync &
dex -a & dex -a &
# screen record or share # screen record or share
dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=wlroots dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=wlroots
/usr/lib/xdg-desktop-portal-wlr & /usr/lib/xdg-desktop-portal-wlr &
+15 -12
View File
@@ -12,7 +12,7 @@ blur_params_contrast = 0.9
blur_params_saturation = 1.2 blur_params_saturation = 1.2
shadows = 1 shadows = 1
layer_shadows = 0 layer_shadows = 1
shadow_only_floating = 1 shadow_only_floating = 1
shadows_size = 5 shadows_size = 5
shadows_blur = 15 shadows_blur = 15
@@ -52,7 +52,7 @@ scroller_structs=20
scroller_default_proportion=1.0 scroller_default_proportion=1.0
scroller_focus_center=0 scroller_focus_center=0
scroller_prefer_center=0 scroller_prefer_center=0
edge_scroller_pointer_focus=1 edge_scroller_pointer_focus=0
scroller_default_proportion_single=1.0 scroller_default_proportion_single=1.0
scroller_proportion_preset=1.0,1.0,1.0 scroller_proportion_preset=1.0,1.0,1.0
@@ -64,8 +64,8 @@ smartgaps=0
# Overview Setting # Overview Setting
hotarea_size=10 hotarea_size=10
enable_hotarea=1 enable_hotarea=0
ov_tab_mode=0 ov_tab_mode=1
overviewgappi=5 overviewgappi=5
overviewgappo=30 overviewgappo=30
@@ -84,8 +84,9 @@ cursor_size=24
drag_tile_to_tile=1 drag_tile_to_tile=1
# keyboard # keyboard
repeat_rate=25 #repeat_rate=25
repeat_delay=600 repeat_rate=30
repeat_delay=300
numlockon=1 numlockon=1
xkb_rules_layout=us xkb_rules_layout=us
@@ -112,7 +113,7 @@ gappoh=10
gappov=10 gappov=10
scratchpad_width_ratio=0.8 scratchpad_width_ratio=0.8
scratchpad_height_ratio=0.9 scratchpad_height_ratio=0.9
borderpx=2 borderpx=1
rootcolor=0x201b14ff rootcolor=0x201b14ff
bordercolor=0x444444ff bordercolor=0x444444ff
focuscolor=0xc9b890ff focuscolor=0xc9b890ff
@@ -137,6 +138,7 @@ tagrule=id:9,layout_name:tile
# Key Bindings # Key Bindings
# key name refer to `xev` or `wev` command output, # key name refer to `xev` or `wev` command output,
# mod keys name: super,ctrl,alt,shift,none # mod keys name: super,ctrl,alt,shift,none
bind=SUPER,period,incnmaster,+1 bind=SUPER,period,incnmaster,+1
bind=SUPER,comma,incnmaster,-1 bind=SUPER,comma,incnmaster,-1
@@ -149,7 +151,8 @@ bind=SUPER,d,spawn,wofi --show drun -GI
bind=SUPER,Return,spawn,kitty bind=SUPER,Return,spawn,kitty
# exit # exit
bind=SUPER+SHIFT,m,quit #bind=SUPER+SHIFT,e,quit
bind=SUPER+SHIFT,m,spawn_shell, wlr-randr --output eDP-1 --toggle
bind=SUPER,m,spawn_shell, playerctl pause; swaylock -f -c 000000 # lock bind=SUPER,m,spawn_shell, playerctl pause; swaylock -f -c 000000 # lock
bind=SUPER+SHIFT,q,killclient, bind=SUPER+SHIFT,q,killclient,
@@ -245,10 +248,10 @@ bind=CTRL+SHIFT,Left,movewin,-50,+0
bind=CTRL+SHIFT,Right,movewin,+50,+0 bind=CTRL+SHIFT,Right,movewin,+50,+0
# resizewin # resizewin
bind=SUPER,Up,resizewin,+0,-50 #bind=none,Up,resizewin,+0,-50
bind=SUPER,Down,resizewin,+0,+50 #bind=none,Down,resizewin,+0,+50
bind=SUPER,Left,resizewin,-50,+0 #bind=none,Left,resizewin,-50,+0
bind=SUPER,Right,resizewin,+50,+0 #bind=none,Right,resizewin,+50,+0
# Mouse Button Bindings # Mouse Button Bindings
# NONE mode key only work in ov mode # NONE mode key only work in ov mode
+27 -175
View File
@@ -1,125 +1,32 @@
// -*- mode: jsonc -*- // -*- mode: jsonc -*-
{ {
// "layer": "top", // Waybar at top layer "spacing": 2, // Gaps between modules (4px)
// "position": "bottom", // Waybar position (top|bottom|left|right)
//"height": 10, // Waybar height (to be removed for auto height)
// "width": 1280, // Waybar width
"spacing": 6, // Gaps between modules (4px)
// Choose the order of the modules
"modules-left": [ "modules-left": [
"ext/workspaces", "hyprland/workspaces",
"dwl/window", "hyprland/submap",
"sway/mode", "hyprland/window"
"sway/scratchpad",
"custom/media"
], ],
//"modules-center": [ //"modules-center": [
//"sway/window" //"sway/window"
//], //],
"modules-right": [ "modules-right": [
"mpd", //"mpd",
"custom/audio_idle_inhibitor",
"pulseaudio", "pulseaudio",
"network", //"network",
//"power-profiles-daemon",
//"cpu",
//"memory",
//"temperature",
//"backlight",
//"keyboard-state",
//"sway/language",
"battery", "battery",
//"battery#bat2",
"clock", "clock",
"tray" "tray"
//"custom/power" //"custom/power"
], ],
"ext/workspaces": {
"format": "{icon}",
"ignore-hidden": true,
"on-click": "activate",
"on-click-right": "deactivate",
"sort-by-id": true,
},
"dwl/tags": {
"num-tags":9,
},
"dwl/window": {
//"format": "[{layout}]{title}"
"format": "[{layout}]"
},
// Modules configuration
// "sway/workspaces": {
// "disable-scroll": true,
// "all-outputs": true,
// "warp-on-scroll": false,
// "format": "{name}: {icon}",
// "format-icons": {
// "1": "",
// "2": "",
// "3": "",
// "4": "",
// "5": "",
// "urgent": "",
// "focused": "",
// "default": ""
// }
// },
"keyboard-state": {
"numlock": true,
"capslock": true,
"format": "{name} {icon}",
"format-icons": {
"locked": "",
"unlocked": ""
}
},
"sway/mode": { "sway/mode": {
"format": "<span style=\"italic\">{}</span>" "format": "<span style=\"italic\">{}</span>"
}, },
"sway/scratchpad": { "sway/scratchpad": {
"format": "{icon} {count}", "format": "{count}",
"show-empty": false, "show-empty": false,
"format-icons": ["", ""],
"tooltip": true, "tooltip": true,
"tooltip-format": "{app}: {title}" "tooltip-format": "{app}: {title}"
}, },
"mpd": {
"format": "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {title} ⸨{songPosition}|{queueLength}⸩% ",
"format-alt": "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ⸨{songPosition}|{queueLength}⸩% ",
"format-disconnected": "Disconnected ",
//"format-stopped": "{consumeIcon}{randomIcon}{repeatIcon}{singleIcon}Stopped ",
"format-stopped": "",
//"unknown-tag": "N/A",
"unknown-tag": "",
"interval": 5,
"consume-icons": {
"on": " "
},
"random-icons": {
"off": "<span color=\"#f53c3c\"></span> ",
"on": " "
},
"repeat-icons": {
"on": " "
},
"single-icons": {
"on": "1 "
},
"state-icons": {
"paused": "",
"playing": ""
},
"tooltip-format": "MPD (connected)",
"tooltip-format-disconnected": "MPD (disconnected)"
},
"idle_inhibitor": {
"format": "{icon}",
"format-icons": {
"activated": "",
"deactivated": ""
}
},
"tray": { "tray": {
// "icon-size": 21, // "icon-size": 21,
"spacing": 10, "spacing": 10,
@@ -135,117 +42,62 @@
//"format": "{:%R %p %Y-%m-%d}", //"format": "{:%R %p %Y-%m-%d}",
//"format-alt": "{:%Y-%m-%d}" //"format-alt": "{:%Y-%m-%d}"
}, },
"cpu": {
"format": "{usage}% ",
"tooltip": false
},
"memory": {
"format": "{}% "
},
"temperature": {
// "thermal-zone": 2,
// "hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input",
"critical-threshold": 80,
// "format-critical": "{temperatureC}°C {icon}",
"format": "{temperatureC}°C {icon}",
"format-icons": ["", "", ""]
},
"backlight": {
// "device": "acpi_video1",
"format": "{percent}% {icon}",
"format-icons": ["", "", "", "", "", "", "", "", ""]
},
"battery": { "battery": {
"states": { "states": {
// "good": 95, // "good": 95,
"warning": 30, "warning": 30,
"critical": 15 "critical": 15
}, },
"format": "{time} {capacity}% {icon}", "format": "{time} {capacity}%",
"format-full": "{capacity}% {icon}", "format-full": "{capacity}%",
"format-charging": "{capacity}% C", "format-charging": "{capacity}% C",
"format-plugged": "{capacity}% P", "format-plugged": "{capacity}% P",
"format-alt": "{time} {icon}", "format-alt": "{time}",
// "format-good": "", // An empty format will hide the module // "format-good": "", // An empty format will hide the module
// "format-full": "", // "format-full": "",
"format-icons": ["", "", "", "", ""]
}, },
"battery#bat2": { "battery#bat2": {
"bat": "BAT2" "bat": "BAT2"
}, },
"power-profiles-daemon": { "power-profiles-daemon": {
"format": "{icon}", "format": "{profile}",
"tooltip-format": "Power profile: {profile}\nDriver: {driver}", "tooltip-format": "Power profile: {profile}\nDriver: {driver}",
"tooltip": true, "tooltip": true,
"format-icons": { "format-icons": {"default": [""]}
"default": "",
"performance": "",
"balanced": "",
"power-saver": ""
}
}, },
"network": { "network": {
// "interface": "wlp2*", // (Optional) To force the use of this interface // "interface": "wlp2*", // (Optional) To force the use of this interface
"format-wifi": "{essid} ({signalStrength}%) ", //"format-wifi": "{essid} ({signalStrength}%)",
"format-ethernet": "{ipaddr}/{cidr} ", //"format-ethernet": "{ipaddr}/{cidr}",
"tooltip-format": "{ifname} via {gwaddr} ", //"tooltip-format": "{ifname} via {gwaddr}",
"format-linked": "{ifname} (No IP) ", //"format-linked": "{ifname} (No IP)",
"format-disconnected": "Disconnected ⚠", //"format-disconnected": "Disconnected",
"format-disconnected": "Disconnected",
"format-alt": "{ifname}: {ipaddr}/{cidr}" "format-alt": "{ifname}: {ipaddr}/{cidr}"
}, },
"pulseaudio": { "pulseaudio": {
// "scroll-step": 1, // %, can be a float // "scroll-step": 1, // %, can be a float
"format": "{volume}% {icon} {format_source}", "format": "{volume}% {format_source}",
"format-bluetooth": "{volume}% {icon}  {format_source}", "format-bluetooth": "{volume}% {format_source}",
"format-bluetooth-muted": " {icon} {format_source}", "format-bluetooth-muted": " {format_source}",
"format-muted": " {format_source}", "format-muted": " {format_source}",
"format-source": "{volume}%", "format-source": "{volume}%",
"format-source-muted": "", "format-source-muted": "",
"format-icons": { "format-icons": {
"headphone": "", "default": [""]
"hands-free": "",
"headset": "",
"phone": "",
"portable": "",
"car": "",
"default": ["", "", ""]
}, },
"on-click": "pavucontrol" "on-click": "pavucontrol"
}, },
"custom/media": { "custom/media": {
"format": "{icon} {text}", "format": "{text}",
"return-type": "json", "return-type": "json",
"max-length": 40, "max-length": 40,
"format-icons": { "format-icons": {
"spotify": "", "spotify": "",
"default": "🎜" "default": ""
}, },
"escape": true, "escape": true,
"exec": "$HOME/.config/waybar/mediaplayer.py 2> /dev/null" // Script in resources folder "exec": "$HOME/.config/waybar/mediaplayer.py 2> /dev/null" // Script in resources folder
// "exec": "$HOME/.config/waybar/mediaplayer.py --player spotify 2> /dev/null" // Filter player based on name // "exec": "$HOME/.config/waybar/mediaplayer.py --player spotify 2> /dev/null" // Filter player based on name
},
"custom/power": {
"format" : "⏻ ",
"tooltip": false,
"menu": "on-click",
"menu-file": "$HOME/.config/waybar/power_menu.xml", // Menu file in resources folder
"menu-actions": {
"shutdown": "shutdown",
"reboot": "reboot",
"suspend": "systemctl suspend",
"hibernate": "systemctl hibernate"
}
},
"custom/audio_idle_inhibitor": {
"format": "{icon} ",
"exec": "sway-audio-idle-inhibit --dry-print-both-waybar",
"exec-if": "which sway-audio-idle-inhibit",
"return-type": "json",
"format-icons": {
"output": "",
"input": "",
"output-input": " ",
"none": ""
}
} }
} }
+6 -7
View File
@@ -1,13 +1,13 @@
require("config.lazy") require("config.lazy")
-- colorscheme -- colorscheme
vim.o.termguicolors = true -- vim.o.termguicolors = true
vim.opt.winborder = 'rounded' vim.opt.winborder = 'rounded'
--vim.o.background = "dark" -- or "light" for light mode vim.o.background = "dark" -- or "light" for light mode
--vim.cmd("colorscheme gruvbox ") --vim.cmd("colorscheme gruvbox ")
--vim.cmd("colorscheme retrobox") --vim.cmd("colorscheme retrobox")
vim.opt.clipboard = "unnamedplus" -- uses the clipboard register for all operations except yank. vim.opt.clipboard:append("unnamedplus") -- sync yank/delete/put with system clipboard
vim.cmd("set nocompatible") vim.cmd("set nocompatible")
vim.cmd("syntax on") vim.cmd("syntax on")
@@ -16,9 +16,9 @@ vim.cmd("set number")
vim.cmd("set relativenumber") vim.cmd("set relativenumber")
vim.cmd("set expandtab") vim.cmd("set expandtab")
vim.cmd("set shiftwidth=4") vim.cmd("set shiftwidth=2")
vim.cmd("set softtabstop=4") vim.cmd("set softtabstop=2")
vim.cmd("set tabstop=4") vim.cmd("set tabstop=2")
vim.cmd("set smartindent") vim.cmd("set smartindent")
vim.cmd("set backspace=indent,eol,start") vim.cmd("set backspace=indent,eol,start")
@@ -34,4 +34,3 @@ vim.cmd("set complete-=i")
vim.cmd("au FileType python set fileformat=unix encoding=utf-8") vim.cmd("au FileType python set fileformat=unix encoding=utf-8")
vim.cmd("au FileType markdown,tex set spell spelllang=en_us") vim.cmd("au FileType markdown,tex set spell spelllang=en_us")
-14
View File
@@ -1,14 +0,0 @@
{
"black-metal-theme-neovim": { "branch": "main", "commit": "6d0207871387077f40d5396ab1ae90520e688d36" },
"claude-code.nvim": { "branch": "main", "commit": "55c0cb59828fbc3bec744288286a46f5d5750b83" },
"lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" },
"mason-lspconfig.nvim": { "branch": "main", "commit": "3d89e7c92fbd96c5e10e0298fc2b006f21cf9428" },
"mason.nvim": { "branch": "main", "commit": "44d1e90e1f66e077268191e3ee9d2ac97cc18e65" },
"mini.completion": { "branch": "main", "commit": "4d451f82f193f6751719935a63d16ccb79a76e0b" },
"mini.nvim": { "branch": "main", "commit": "9b935c218ddba02e5dc75c94f90143bce1f7c646" },
"nvim-lspconfig": { "branch": "master", "commit": "79c9a15be5731bc8694840a8fb0c9141c20a80c0" },
"nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" },
"plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" },
"telescope.nvim": { "branch": "master", "commit": "84b9ba066d1860f7a586ce9cd732fd6c4f77d1d9" },
"vim-tmux-navigator": { "branch": "master", "commit": "e41c431a0c7b7388ae7ba341f01a0d217eb3a432" }
}
-11
View File
@@ -1,11 +0,0 @@
return {
"greggh/claude-code.nvim",
dependencies = {
"nvim-lua/plenary.nvim", -- Required for git operations
},
config = function()
require("claude-code").setup({
command = "ollama launch --model gpt-oss:latest",
})
end
}
+1 -1
View File
@@ -5,7 +5,7 @@ return {
config = function() config = function()
require("black-metal").setup({ require("black-metal").setup({
-- optional configuration here -- optional configuration here
term_colors = true, -- term_colors = true,
}) })
require("black-metal").load() require("black-metal").load()
-1
View File
@@ -15,7 +15,6 @@ return {
--- ---
-- Autocompletion -- Autocompletion
--- ---
--require('mini.snippets').setup() --require('mini.snippets').setup()
require('mini.completion').setup() require('mini.completion').setup()
+12
View File
@@ -0,0 +1,12 @@
return {
"hedyhli/outline.nvim",
config = function()
-- Example mapping to toggle outline
vim.keymap.set("n", "<leader>o", "<cmd>Outline<CR>",
{ desc = "Toggle Outline" })
require("outline").setup {
-- Your setup opts here (leave empty to use defaults)
}
end,
}
+2 -41
View File
@@ -2,45 +2,6 @@ return {
"nvim-treesitter/nvim-treesitter", "nvim-treesitter/nvim-treesitter",
build = ":TSUpdate", build = ":TSUpdate",
config = function() config = function()
require("nvim-treesitter.configs").setup { --require("nvim-treesitter").install({})
-- A list of parser names, or "all" (the five listed parsers should always be installed)
ensure_installed = { "c", "lua", "vim", "vimdoc", "python", "bash", "make" },
-- Install parsers synchronously (only applied to `ensure_installed`)
sync_install = false,
-- Automatically install missing parsers when entering buffer
-- Recommendation: set to false if you don't have `tree-sitter` CLI installed locally
auto_install = true,
-- List of parsers to ignore installing (for "all")
ignore_install = { "javascript" },
---- If you need to change the installation directory of the parsers (see -> Advanced Setup)
-- parser_install_dir = "/some/path/to/store/parsers", -- Remember to run vim.opt.runtimepath:append("/some/path/to/store/parsers")!
highlight = {
enable = true,
-- NOTE: these are the names of the parsers and not the filetype. (for example if you want to
-- disable highlighting for the `tex` filetype, you need to include `latex` in this list as this is
-- the name of the parser)
-- list of language that will be disabled
-- disable = { "c", "rust" },
-- Or use a function for more flexibility, e.g. to disable slow treesitter highlight for large files
disable = function(lang, buf)
local max_filesize = 100 * 1024 -- 100 KB
local ok, stats = pcall(vim.loop.fs_stat, vim.api.nvim_buf_get_name(buf))
if ok and stats and stats.size > max_filesize then
return true
end end
end, }
-- Setting this to true will run `:h syntax` and tree-sitter at the same time.
-- Set this to `true` if you depend on 'syntax' being enabled (like for indentation).
-- Using this option may slow down your editor, and you may see some duplicate highlights.
-- Instead of true it can also be a list of languages
additional_vim_regex_highlighting = false,
},
}
end }
+3
View File
@@ -0,0 +1,3 @@
# Agent Instructions
If you're not sure about something, search it up on the web.
+22
View File
@@ -0,0 +1,22 @@
{
"$schema": "https://opencode.ai/config.json",
"instructions": ["AGENTS.md"],
"provider": {
"openwebui": {
"npm": "@ai-sdk/openai-compatible",
"name": "OpenWebUI",
"options": {
"baseURL": "https://ai.zamudio.dev/api",
"apiKey": "{env:OPENWEBUI_API_KEY}"
},
"models": {
"Qwen3.6-35B-A3B": {
"name": "Qwen3.6-35B-A3B"
},
"Qwen3.6-27B": {
"name": "Qwen3.6-27B"
}
}
}
}
}
+47
View File
@@ -0,0 +1,47 @@
[[profile]]
name = "laptop"
exec = ["notify-send shikane \"Profile $SHIKANE_PROFILE_NAME has been applied\""]
[[profile.output]]
enable = true
search = "eDP-1"
# Panel on the Framework Laptop 13 Pro is CSOT MND508ZB1-1 = 2880x1920 (3:2)
# @120Hz. /sys/class/drm/card0-eDP-1/modes exposes ONLY 2880x1920@120000Hz
# and @60000Hz. The previous value here, [email protected], was the OLD
# ThinkPad's panel mode and does not exist on this panel, so shikane could
# never satisfy the variant -- the most likely root cause of the
# VariantInProgress deadlocks.
mode = "2880x1920@120Hz"
position = "0,0"
# Scale 1.75 chosen deliberately (2026-10-27).
# Panel: CSOT MND508ZB1-1, 2880x1920 on 13.5in = 256 PPI. What matters is
# effective DPI = PPI/scale; 1.75 -> 147 DPI, which matches the 145 DPI this
# laptop's owner previously used on the old ThinkPad (2880x1800 on 14in at
# 1.67). The exact equivalent would be 1.765; 1.75 is the nearest value that
# is exactly representable as float32 (sway stores scale as float).
# 2.0 is the only integer scale (1:1 pixel mapping, no resampling, sharpest)
# but gives just 1440x960 logical. 1.5 = max workspace at 171 DPI (small).
# History: 1.67/1.5/1.6 all tried; 1.6 was not float-exact (1.600000024).
scale = 1.75
transform = "normal"
adaptive_sync = false
[[profile]]
name = "External Display"
exec = ["notify-send shikane \"Profile $SHIKANE_PROFILE_NAME has been applied\""]
[[profile.output]]
enable = false
search = "eDP-1"
# Even a disabled block carries a mode string that shikane must resolve
# against the panel's mode list, so keep it valid.
mode = "2880x1920@120Hz"
position = "0,0"
scale = 1.75
transform = "normal"
adaptive_sync = false
[[profile.output]]
enable = true
search = "n/DP-(.*)"
scale = 1.3
transform = "normal"
adaptive_sync = false
+140 -22
View File
@@ -1,10 +1,13 @@
font 'JetBrainsMono' 10 #font 'JetBrainsMono NF' 9
#font 'JetBrainsMono Nerd Font Mono' 9
font 'JetBrainsMonoNFM-Regular' 9
### Variables ### Variables
#set $mod Mod1 #set $mod Mod1
set $mod Mod4 set $mod Mod4
set $term kitty set $term kitty
#set $term foot
#set $term ghostty #set $term ghostty
set $menu wofi -S drun -GI set $menu wofi -S drun -GI
@@ -15,36 +18,151 @@ set $up k
set $right l set $right l
#env GDK_BACKEND=wayland
#env QT_QPA_PLATFORM=wayland
set $laptop eDP-1
include ~/.config/sway/config.d/* include ~/.config/sway/config.d/*
### Output configuration
# You can get the names of your outputs by running: swaymsg -t get_outputs
# https://gitlab.com/w0lff/shikane for multitple display handling
#output * bg /home/jozamudi/Documents/Wallpapers/windows-11-stock-official-colorful-3840x2160-5658.jpg fill
#output 'BNQ BenQ PD3200U S2N01233019' scale 1.5
# Baseline for the built-in panel so sway starts at the same geometry shikane
# will apply. Panel is CSOT MND508ZB1-1: 2880x1920 (3:2) with only 120Hz/60Hz
# modes available. Without this, sway defaults to scale 2.0 and the desktop
# visibly re-flows when shikane applies 1.5 a moment after login.
output $laptop mode 2880x1920@120Hz scale 1.75
#exec_always shikanectl reload
bindswitch --reload --locked lid:on output $laptop disable
bindswitch --reload --locked lid:off output $laptop enable
exec_always --no-startup-id '/home/work/.config/sway/scripts/clamshell-mode.sh'
# Re-apply shikane display profile after every sway reload;
# falls back to a service restart if the daemon deadlocked
exec_always --no-startup-id /home/work/.config/sway/scripts/shikane-recover-on-reload.sh
#input "1267:12792:ELAN067B:00_04F3:31F8_Touchpad" {
# dwt enabled
# tap enabled
# middle_emulation enabled
#}
# Touchpad (PIXA3854:00 093A:1343, clickpad): clickfinger so a two-finger press
# is a right click instead of using the bottom-right button area.
# Tap-to-click mirrors the same 1/2/3-finger lrm mapping.
input type:touchpad {
click_method clickfinger
clickfinger_button_map lrm
tap enabled
tap_button_map lrm
}
### Idle configuration ### Idle configuration
#exec swayidle -w \ #exec swayidle -w \
# timeout 300 'swaylock -f -c 000000' \ # timeout 300 'swaylock -f -c 000000' \
# timeout 600 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' \ # timeout 600 'swaymsg "output * power off"' \
# before-sleep 'playerctl pause; swaylock -f -c 000000' # resume 'swaymsg "output * power on"' \
# before-sleep 'swaylock -f -c 000000'
output HDMI-A-3 mode 3440x1440
#seat seat0 xcursor_theme Adwaita 25 seat seat0 xcursor_theme Adwaita 35
# Auto start .desktop files using dex # Portal implementations are pinned in ~/.config/xdg-desktop-portal/portals.conf
exec dex -a # (default=gtk, ScreenCast/Screenshot=wlr, Inhibit=none, GlobalShortcuts=hyprland).
#exec nohup pipewire exec systemctl --user start xdg-desktop-portal-wlr.service
exec nohup swaync #exec pipewire
exec nohup sway-audio-idle-inhibit # swaync is started by its systemd user unit / D-Bus activation; starting it
exec nohup waybar # here too caused "already running" crash-loops (start-limit-hit).
exec nohup nm-applet #exec swaync
exec nohup shikane # NOTE: the command must be quoted -- sway splits unquoted ';' into separate
exec nohup flatpak run com.github.wwmm.easyeffects -w # sway commands and fails with "Unknown/invalid command 'waybar'"
exec_always --no-startup-id "pkill -x waybar; waybar -c ~/.config/sway/waybar/config.jsonc -s ~/.config/sway/waybar/style.css"
exec nm-applet
exec blueman-applet
# Guarded with pkill because `exec`/`exec_always` re-runs on every sway config
# reload: a second hypridle instance would double-fire every listener (two
# suspend timers, two lock screens) and fight over the sleep inhibitor.
exec_always --no-startup-id "pkill -x hypridle; sleep 0.3; hypridle >/dev/null 2>&1 &"
# hyprlock can outlive a sway session; a stale instance then makes hypridle's
# "pidof hyprlock || hyprlock" guard a permanent no-op. Clear leftovers at login.
exec --no-startup-id pkill -x hyprlock
exec wl-paste -t text --watch clipman store --no-persist # Polkit authentication agent.
exec dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=wlroots DISPLAY # The original line was a typo ("hyperolkitagent"), so no agent ever started.
exec /usr/lib/xdg-desktop-portal-wlr # hyprpolkitagent is installed but aborts on this machine: hyprtoolkit vendors
exec systemctl --user start shikane & # aquamarine, which refuses to create a GBM allocator because the Intel Iris Xe
exec systemctl --user start sway-audio-idle-inhibit & # iGPU has no PRIME export (drmGetCap DRM_CAP_PRIME -> unsupported) and then
exec wl-clip-persist --clipboard regular --reconnect-tries 0 & # asserts "Couldn't open a gbm fd" instead of falling back -- 5/5 core dumps.
exec wl-paste --type text --watch cliphist store & # Keep hyprpolkitagent.service disabled; polkit-gnome is used instead.
exec /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
exec flatpak run com.github.wwmm.easyeffects -w
exec xrdb -merge ~/.Xresources
# Removed 2026-10-27 (power audit): forcing the power-saver profile made TLP apply
# *_ON_SAV keys even on AC, so the platform profile stayed low-power when docked and
# the *_ON_BAT tuning in /etc/tlp.d/90-framework.conf never ran. tlp-pd's default
# 'balanced' profile already switches on charger events -- no script needed.
# # Removed 2026-10-28 (power audit): forcing power-saver made TLP apply *_ON_SAV
# keys even on AC, so the docked platform profile stayed low-power and the
# *_ON_BAT tuning never ran. tlp-pd's 'balanced' profile switches on charger
# events by itself. NOTE: profile writes are polkit-gated -- flip manually with
# tlpctl set balanced (from the desktop session, not via runuser/su).
# exec tlpctl power-saver
#exec gsettings set org.gnome.desktop.interface color-scheme "prefer-dark"
#exec mpd
#exec syncthing
# Auto start .desktop files using dex -- dex is not installed (and there is no
# ~/.config/autostart), so this was a no-op.
#exec dex -a
#exec wl-paste -t text --watch clipman store --no-persist
# There are two wl-paste watchers on purpose: one for the regular clipboard,
# one for the primary selection (clipman keeps a single shared history, the
# --primary flag on `pick` only decides where the picked item is served).
# Guarded with pkill because `exec` re-runs on every `swaymsg reload`: a stale
# `store --no-persist` instance from an older config survived three reloads and
# ran alongside the current pair.
# NOTE: `pkill -x` matches the process *name* only. Do NOT use `pkill -f` here --
# sway runs exec lines through `sh -c`, so the wrapper's own command line
# contains the pattern and pkill would kill the shell that is about to start
# the replacements (learned the hard way).
# [aur-cleanup 2026-10-28] clipman-git uninstalled -- AUR-only, no pacman equivalent.
# Disabled so sway doesn't spawn ENOENT on the missing `clipman` binary.
# Restore by reinstalling clipman-git, or port to extra/cliphist:
# exec_always --no-startup-id "pkill -x wl-paste; sleep 0.3; \
# wl-paste -t text --watch cliphist store & \
# wl-paste -p -t text --watch cliphist store & \
# wait"
# bindsym $mod+y exec sh -c 'cliphist list | wofi --dmenu | cliphist decode | wl-copy'
# bindsym $mod+Shift+y exec cliphist wipe
# (verify flag order with `cliphist -h`; -p selects the primary buffer)
#
# exec_always --no-startup-id "pkill -x wl-paste; sleep 0.3; \
# wl-paste -t text --watch clipman store & \
# wl-paste -p -t text --watch clipman store & \
# wait"
# The keybind to select a clipping
# bindsym $mod+y exec clipman --primary pick --tool wofi
# Clear all clippings
# bindsym $mod+Shift+y exec clipman clear -a
# Remove a selected clipping
# bindsym $mod+Mod1+y exec clipman clear --tool wofi
# Empty the current clipping
bindsym $mod+Ctrl+y exec : | wl-copy -p
#better audio
#exec easyeffects -w -l Laptop
default_border pixel 2 default_border pixel 2
default_floating_border pixel 2 #default_floating_border pixel 2
exec systemctl --user import-environment XDG_SESSION_TYPE XDG_CURRENT_DESKTOP WAYLAND_DISPLAY SWAYSOCK
exec dbus-update-activation-environment --systemd WAYLAND_DISPLAY DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP=sway XDG_SESSION_DESKTOP=sway
# Activate graphical-session.target so xdg-desktop-portal (Requisite=graphical-session.target) can start
exec systemctl --user start sway-session.target
#exec --no-startup-id dbus-update-activation-environment --all
+31 -15
View File
@@ -13,7 +13,9 @@ bindsym $mod+d exec $menu
# Despite the name, also works for non-floating windows. # Despite the name, also works for non-floating windows.
# Change normal to inverse to use left mouse button for resizing and right # Change normal to inverse to use left mouse button for resizing and right
# mouse button for dragging. # mouse button for dragging.
# DISABLED 2026-09-28: experiment for windows popping out (accidental mod+click)
floating_modifier $mod normal floating_modifier $mod normal
#floating_modifier none
# Reload the configuration file # Reload the configuration file
bindsym $mod+Shift+c reload bindsym $mod+Shift+c reload
@@ -90,15 +92,15 @@ mode "resize" {
# right will grow the containers width # right will grow the containers width
# up will shrink the containers height # up will shrink the containers height
# down will grow the containers height # down will grow the containers height
bindsym $right resize shrink width 10px bindsym $left resize shrink width 10px
bindsym $down resize grow height 10px bindsym $down resize grow height 10px
bindsym $up resize shrink height 10px bindsym $up resize shrink height 10px
bindsym $left resize grow width 10px bindsym $right resize grow width 10px
bindsym Shift+$right resize shrink width 40px bindsym Shift+$left resize shrink width 40px
bindsym Shift+$down resize grow height 40px bindsym Shift+$down resize grow height 40px
bindsym Shift+$up resize shrink height 40px bindsym Shift+$up resize shrink height 40px
bindsym Shift+$left resize grow width 40px bindsym Shift+$right resize grow width 40px
# Ditto, with arrow keys # Ditto, with arrow keys
bindsym Left resize shrink width 10px bindsym Left resize shrink width 10px
@@ -113,27 +115,41 @@ mode "resize" {
bindsym $mod+r mode "resize" bindsym $mod+r mode "resize"
bindsym $mod+Shift+s sticky toggle bindsym $mod+Shift+s sticky toggle
bindsym $mod+m exec 'playerctl pause && swaylock -c 0x0000' #bindsym $mod+Shift+o exec 'playerctl pause && swaylock -c 0x0000'
# Toggle laptop display # Toggle laptop display
bindsym $mod+Shift+m output $laptop toggle bindsym $mod+shift+m output $laptop toggle
bindsym $mod+m exec bash -c 'playerctl pause; swaymsg output $laptop power on; swaylock -f -c 000000'
bindsym XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +5% \ # play/pause media player
&& pkill -RTMIN+10 i3blocks; #bindsym XF86Favorites exec playerctl play-pause
bindsym $mod+bracketleft exec playerctl previous
bindsym $mod+bracketright exec playerctl next
bindsym $mod+backslash exec playerctl play-pause
bindsym XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -5% \
&& pkill -RTMIN+10 i3blocks;
bindsym XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle \ bindsym XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +5%
&& pkill -RTMIN+10 i3blocks;
bindsym XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -5%
bindsym XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle
bindsym XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle bindsym XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle
bindsym XF86MonBrightnessDown exec brightnessctl set 5%- bindsym XF86MonBrightnessDown exec brightnessctl set 2%-
bindsym XF86MonBrightnessUp exec brightnessctl set 5%+ bindsym XF86MonBrightnessUp exec brightnessctl set 2%+
bindsym $mod+shift+p exec slurp | grim -g - - | tee ~/Pictures/$(date +%s).png | wl-copy bindsym $mod+shift+p exec slurp | \
grim -g - - | \
tee ~/Pictures/$(date +%F-%s).png | \
wl-copy
bindgesture swipe:right workspace prev bindgesture swipe:right workspace prev
bindgesture swipe:left workspace next bindgesture swipe:left workspace next
# Custom App Keybinds
bindsym $mod+Shift+f exec firefox
bindsym $mod+Shift+n exec nautilus
+83
View File
@@ -0,0 +1,83 @@
#smart_corner_radius on
# ╔══════════════════════════════════════════════════════════════════╗
# ║ COLOR PALETTE ║
# ║ To change colors: ║
# ║ 1. Edit the $base00–$base0F values below ║
# ║ 2. Mirror those hex values in ~/.config/sway/waybar/style.css ║
# ║ (search for @define-color and replace the hex codes) ║
# ║ 3. Run: swaymsg reload ║
# ╚══════════════════════════════════════════════════════════════════╝
gaps inner 2
default_border pixel 2
# ╔══════════════════════════════════════════════════════════════════╗
# ║ COLOR PALETTE (your 5 colors + black) ║
# ║ ║
# ║ To change colors: ║
# ║ 1. Edit the $base00–$base0F hex values below ║
# ║ 2. Mirror those hex values in ~/.config/sway/waybar/style.css ║
# ║ (search for @define-color and replace the hex codes) ║
# ║ 3. Run: swaymsg reload ║
# ╚══════════════════════════════════════════════════════════════════╝
set $base00 #000000
set $base01 #111111
set $base02 #222222
set $base03 #333333
set $base04 #666666
set $base05 #999999
set $base06 #CCCCCC
set $base07 #FFFFFF
set $base08 #999999
set $base09 #999999
set $base0A #CCCCCC
set $base0B #999999
set $base0C #CCCCCC
set $base0D #999999
set $base0E #CCCCCC
set $base0F #666666
# base00-02=bg #3E3B33, base03=olive #8C9A6B, base04=peach #F3B49F, base05=rust #D9714C, base06-07=cream #FFE8DB
# ╔══════════════════════════════════════════════════════════════════╗
# ║ FOCUS RING (subtle gray ramp) ║
# ║ ║
# ║ With `border pixel` the line you actually see around a window is ║
# ║ child_border (5th color). `border` (1st) only paints title bars, ║
# ║ which pixel borders don't have -- so both are set to the same ║
# ║ gray here. Previously child_border for focused windows was ║
# ║ $base00 (#000000) = invisible on a black background, which is ║
# ║ why the focused window was hard to spot. ║
# ║ ║
# ║ Tune: lighter = easier to spot, darker = less obvious. ║
# ╚══════════════════════════════════════════════════════════════════╝
set $border_focus #252525
set $border_inactive #171717
set $border_unfocused #0D0D0D
#set $base00 #000000
#set $base01 #121212
#set $base02 #222222
#set $base03 #333333
#set $base04 #999999
#set $base05 #c1c1c1
#set $base06 #999999
#set $base07 #c1c1c1
#set $base08 #5f8787
#set $base09 #aaaaaa
#set $base0A #a06666
#set $base0B #dd9999
#set $base0C #aaaaaa
#set $base0D #888888
#set $base0E #999999
#set $base0F #444444
# Property Name Border BG Text Indicator Child Border
client.focused $border_focus $base00 $base07 $border_focus $border_focus
client.focused_inactive $border_inactive $base00 $base05 $border_inactive $border_inactive
client.unfocused $border_unfocused $base00 $base05 $border_unfocused $border_unfocused
client.urgent #FFA14C #FFA14C $base00 #FFA14C #FFA14C
client.placeholder $base00 $base00 $base05 $base00 $base00
client.background $base00
+3 -2
View File
@@ -1,5 +1,5 @@
# Generated windows. # Generated windows.
for_window [title="(?:Open|Save) (?:File|Folder|As)"] floating enable; for_window [title="(?:Open|Save) (?:File|Folder|As)"] floating enable
for_window [title="(?:Open|Save) (?:File|Folder|As)"] resize set 800 600 for_window [title="(?:Open|Save) (?:File|Folder|As)"] resize set 800 600
for_window [window_role="pop-up"] floating enable for_window [window_role="pop-up"] floating enable
for_window [window_role="bubble"] floating enable for_window [window_role="bubble"] floating enable
@@ -10,6 +10,7 @@ for_window [window_type="menu"] floating enable
for_window [shell="xwayland"] title_format "[XWayland] %title" for_window [shell="xwayland"] title_format "[XWayland] %title"
for_window [title="LUCID"] floating enable for_window [title="LUCID"] floating enable
for_window [title="Pydm|pydm"] floating enable for_window [title="(?i)pydm"] floating enable
for_window [title="Form"] floating enable for_window [title="Form"] floating enable
for_window [title="zoom"] floating enable for_window [title="zoom"] floating enable
+357
View File
@@ -0,0 +1,357 @@
import Quickshell._Window
import Quickshell.I3
import Quickshell.Services.UPower
import Quickshell.Services.Pipewire
import Quickshell.Services.SystemTray
import Quickshell
import Quickshell.Widgets
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls as QQC2
FloatingWindow {
id: root
title: "Quickshell Bar"
visible: true
implicitWidth: 1920
implicitHeight: 40
property string mode: ""
property string windowTitle: ""
Component.onCompleted: {
I3.rawEvent.connect(handleRawEvent)
pollWindowTitle()
pinBar()
}
function pinBar() {
I3.dispatch('[title="Quickshell Bar"] floating enable')
I3.dispatch('[title="Quickshell Bar"] move absolute position 0 0')
I3.dispatch('[title="Quickshell Bar"] resize set 1920 40')
I3.dispatch('[title="Quickshell Bar"] sticky enable')
}
function handleRawEvent(event) {
if (event.type === "mode") {
root.mode = event.data === "default" ? "" : event.data
}
if (event.type === "window" || event.type === "workspace") {
pollWindowTitle()
}
}
function pollWindowTitle() {
try {
var ws = I3.focusedWorkspace
if (ws && ws.lastIpcObject) {
root.windowTitle = findFocusedTitle(ws.lastIpcObject.nodes || [])
}
} catch (e) { root.windowTitle = "" }
}
function findFocusedTitle(nodes) {
for (var i = 0; i < nodes.length; i++) {
var n = nodes[i]
if (n.focused && n.name && !["$external", "i3bar"].includes(n.name)) {
return n.name
}
if (n.nodes && findFocusedTitle(n.nodes)) return findFocusedTitle(n.nodes)
if (n.floating_nodes) {
for (var j = 0; j < n.floating_nodes.length; j++) {
var fn = n.floating_nodes[j]
if (fn.focused && fn.name && fn.name !== "$external") return fn.name
}
}
}
return ""
}
function wsColor(num) {
var colors = ["#eb4d4b", "#64727D", "#f7ca18", "#fb6f92",
"#2ecc71", "#2980b9", "#f7768e", "#667581"]
return colors[num % 8] || colors[0]
}
function updateBattery() {
if (!UPower.displayDevice || !UPower.displayDevice.isReady ||
!UPower.displayDevice.powerSupply) {
batteryLabel.text = ""
return
}
var dev = UPower.displayDevice
var pct = Math.round(dev.percentage)
var state = dev.state
batteryItem.isCritical = pct <= 15 && state === 2
if (state === 4) { batteryLabel.text = pct + "%"; return }
var timeStr = ""
var seconds = 0
if (state === 1 || state === 5) seconds = dev.timeToFull * 60
else if (state === 2 || state === 6) seconds = dev.timeToEmpty * 60
if (seconds > 0 && seconds < 86400) {
var h = Math.floor(seconds / 3600)
var m = Math.floor((seconds % 3600) / 60)
timeStr = h > 0 ? h + ":" + m.toString().padStart(2, '0') + " " : m + "m "
}
var suffix = ""
if (state === 1 || state === 5) suffix = " C"
else if (state === 3) suffix = " P"
batteryLabel.text = timeStr + pct + "%" + suffix
}
// Background
Rectangle {
anchors.fill: parent
color: "black"
z: 0
}
// Bar content
RowLayout {
anchors.fill: parent
anchors.leftMargin: 4
anchors.rightMargin: 4
anchors.top: parent.top
anchors.bottom: parent.bottom
spacing: 2
z: 1
// LEFT SECTION
Item {
Layout.fillWidth: true
Layout.maximumWidth: root.implicitWidth * 0.33
RowLayout {
anchors.fill: parent
spacing: 2
// Workspaces
RowLayout {
Layout.fillWidth: true
Layout.maximumWidth: 600
spacing: 2
Repeater {
model: I3.workspaces
delegate: QQC2.ToolButton {
id: wsBtn
property bool isFocused: modelData.focused
property int wsNum: modelData.number
text: modelData.name
visible: modelData.active || modelData.focused || modelData.urgent
highlighted: isFocused
checkable: true
checked: isFocused
down: isFocused
onClicked: {
if (modelData.activate) modelData.activate()
else I3.dispatch(`workspace ${modelData.name}`)
}
font.pixelSize: 14
font.bold: true
width: implicitWidth + 8
padding: 0
palette {
button: isFocused ? wsColor(wsNum) : "transparent"
buttonText: "#ffffff"
}
// Hover underline
background: Rectangle {
anchors.fill: parent
color: "transparent"
Rectangle {
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
height: 3
color: wsBtn.hovered || wsBtn.isFocused ? "#ffffff" : "transparent"
}
}
}
}
}
// Mode indicator
QQC2.Label {
text: root.mode
visible: root.mode !== ""
color: "#64727D"
font.pixelSize: 14
font.bold: true
font.italic: true
padding: 10
}
// Window title
QQC2.Label {
text: root.windowTitle
visible: root.windowTitle !== ""
Layout.fillWidth: true
Layout.maximumWidth: 300
elide: Text.ElideMiddle
color: "#ffffff"
font.pixelSize: 14
font.bold: true
padding: 10
}
}
}
// Spacer
Item { Layout.fillWidth: true }
// RIGHT SECTION
RowLayout {
spacing: 2
// Volume
Item {
height: parent.height
QQC2.Label {
id: volumeLabel
anchors.fill: parent
anchors.leftMargin: 10
anchors.rightMargin: 10
anchors.verticalCenter: parent.verticalCenter
color: "#ffffff"
font.pixelSize: 14
font.bold: true
horizontalAlignment: Text.AlignHCenter
text: {
if (!Pipewire.ready || !Pipewire.defaultAudioSink) return ""
var sink = Pipewire.defaultAudioSink
var vol = sink.audio ? sink.audio.averageVolume * 100 : 0
var muted = sink.audio ? sink.audio.isMuted : false
return muted ? "Muted" : Math.round(vol) + "%"
}
MouseArea {
anchors.fill: parent
onClicked: Qt.shellCommand("pavucontrol")
onWheel: function(event) {
if (Pipewire.ready && Pipewire.defaultAudioSink &&
Pipewire.defaultAudioSink.audio) {
var v = Pipewire.defaultAudioSink.audio.averageVolume
var step = event.angleDelta.y > 0 ? 0.05 : -0.05
Pipewire.defaultAudioSink.audio.averageVolume =
Math.max(0, Math.min(1, v + step))
}
}
}
}
}
// Battery
Item {
id: batteryItem
height: parent.height
property bool isCritical: false
QQC2.Label {
id: batteryLabel
anchors.fill: parent
anchors.leftMargin: 10
anchors.rightMargin: 10
anchors.verticalCenter: parent.verticalCenter
color: batteryItem.isCritical ? "#f53c3c" : "#ffffff"
font.pixelSize: 14
font.bold: true
horizontalAlignment: Text.AlignHCenter
}
Timer {
interval: 5000
running: true
repeat: true
onTriggered: root.updateBattery()
}
Component.onCompleted: root.updateBattery()
}
// Clock
Item {
height: parent.height
QQC2.Label {
id: clockLabel
anchors.fill: parent
anchors.leftMargin: 10
anchors.rightMargin: 10
anchors.verticalCenter: parent.verticalCenter
color: "#ffffff"
font.pixelSize: 14
font.bold: true
horizontalAlignment: Text.AlignHCenter
}
Timer {
interval: 1000
running: true
repeat: true
onTriggered: {
var now = new Date()
var h = now.getHours()
var ampm = h >= 12 ? "PM" : "AM"
h = h % 12 || 12
var time = h + ":" + now.getMinutes().toString().padStart(2, '0') +
":" + now.getSeconds().toString().padStart(2, '0') + " " + ampm
var date = now.getFullYear() + "-" +
(now.getMonth()+1).toString().padStart(2, '0') + "-" +
now.getDate().toString().padStart(2, '0')
clockLabel.text = time + " " + date
}
}
}
// System Tray
Item {
id: trayContainer
height: parent.height
Repeater {
model: SystemTray.items
delegate: Item {
width: 24
height: trayContainer.height
IconImage {
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 2
width: 22
height: 22
source: modelData.iconName || ""
visible: source !== ""
MouseArea {
anchors.fill: parent
onClicked: function(mouse) {
if (modelData.hasMenu) {
modelData.display(QsWindowAttached.window, 0, 0)
} else {
modelData.activate()
}
}
}
}
}
}
}
}
}
}
+20
View File
@@ -0,0 +1,20 @@
#!/bin/sh
# Lid-driven laptop panel handling.
#
# shikane is authoritative for output layout/scaling
# (~/.config/shikane/config.toml + shikane-watchdog.timer). This script used to
# run `swaymsg output eDP-1 enable` whenever the lid was open, which on every
# `swaymsg reload` raced the shikane "External Display" profile (eDP-1 off) and
# contributed to "Atomic commit failed: Device or resource busy" churn.
# It now only ever disables.
LAPTOP_OUTPUT="eDP-1"
LID_STATE_FILE="/proc/acpi/button/lid/LID/state"
read -r LS < "$LID_STATE_FILE"
case "$LS" in
*closed) swaymsg output "$LAPTOP_OUTPUT" disable ;;
*open) : ;; # leave to shikane
*) echo "Could not get lid state" >&2 ; exit 1 ;;
esac
+16
View File
@@ -0,0 +1,16 @@
#!/bin/bash
dbus-update-activation-environment --systemd \
WAYLAND_DISPLAY \
DISPLAY \
SWAYSOCK \
XDG_SESSION_DESKTOP=sway \
XDG_SESSION_CLASS=user \
XDG_SEAT=seat0 \
XCURSOR_THEME=Adwaita \
XCURSOR_SIZE=35 \
GDK_BACKEND=wayland \
SDL_VIDEODRIVER=wayland \
"QT_QPA_PLATFORM=wayland-egl;xcb" \
MOZ_ENABLE_WAYLAND=1 \
WLR_DRM_NO_MODIFIERS=1 \
XWAYLAND_NO_SCALE=1
+60
View File
@@ -0,0 +1,60 @@
#!/bin/sh
# recover-output-after-resume -- clear a post-resume eDP page-flip stall.
#
# Symptom (see journalctl --user --since -5m | grep 'Atomic commit failed'):
# [wlr] backend/drm/atomic.c:82 connector eDP-1: Atomic commit failed:
# Device or resource busy
# [sway] desktop/output.c:307 Page-flip failed on output eDP-1
# ...repeatedly for tens of minutes after a resume.
#
# HISTORY: this was originally a workaround for the old ThinkPad's
# /etc/modprobe.d/i915.conf, which forced PSR2 and the deepest display C-states
# (options i915 enable_guc=3 enable_psr=2 enable_dc=4 enable_rc6=1 -- both of
# which taint the kernel). With PSR2 forced on, the flip pending across suspend
# never completed, so every later commit returned EBUSY, and DPMS "power on"
# alone did not clear it -- only a full modeset did.
#
# STATUS: that file is gone. This machine is a Framework Laptop 13 Pro whose
# iGPU is driven by `xe` (Panther Lake has no i915 support at all), so the
# original cause cannot recur. The modeset below is therefore CONDITIONAL and
# only fires when the stall is actually present in the journal.
#
# Why conditional: an unconditional disable/enable plus `shikanectl reload`
# after every resume is exactly the sequence that re-triggers the shikane
# 1.1.1 VariantInProgress deadlock (see shikane-watchdog.sh). No point paying
# that risk on resumes that are already healthy.
#
# Lid-aware on purpose: a blind `output eDP-1 enable` raced shikane's
# "External Display" profile (which keeps eDP-1 off) and caused
# "Atomic commit failed: Device or resource busy" churn in clamshell mode.
# See the note in clamshell-mode.sh.
set -u
LID_STATE="${LID_STATE:-/proc/acpi/button/lid/LID/state}"
OUTPUT="${OUTPUT:-eDP-1}"
# Always undo the idle DPMS-off first (this is what after_sleep_cmd used to do).
swaymsg "output * power on" 2>/dev/null
# Only escalate to a modeset if the page-flip stall is actually being reported.
# sway runs inside the user session, so its stderr is in the user journal.
if command -v journalctl >/dev/null 2>&1; then
if ! journalctl --user --since '-3 min' --no-pager 2>/dev/null \
| grep -qE 'Atomic commit failed|Page-flip failed on output'; then
exit 0 # healthy resume -> do not disturb shikane
fi
fi
# The modeset below is lid-gated only.
[ -r "$LID_STATE" ] || exit 0
grep -q 'open' "$LID_STATE" || exit 0 # lid closed -> leave layout to shikane
# Give the driver a moment to finish re-training the link before we modeset.
sleep 1
swaymsg "output $OUTPUT disable" 2>/dev/null
sleep 1
swaymsg "output $OUTPUT enable" 2>/dev/null
# Re-assert the shikane profile (mode/scale/position) on top of the modeset.
command -v shikanectl >/dev/null 2>&1 && shikanectl reload 2>/dev/null
exit 0
+33
View File
@@ -0,0 +1,33 @@
#!/bin/sh
# Region screenshot -> ~/Pictures + clipboard.
#
# This file used to contain a single broken line (`slur`, and it was not
# executable): the typo meant `slurp` never ran, and nothing referenced it
# anyway -- the $mod+shift+p keybind in config.d/keybinds has its own inline
# pipeline. Fixed and kept as the shared implementation so the behaviour is
# identical wherever it gets wired up.
#
# Usage: screen-capture.sh [region|output|full] (default: region)
# (no "window" mode: slurp offers region, `-o` output and `-p` point selection
# only -- it cannot pick a window)
set -u
outdir="${XDG_PICTURES_DIR:-$HOME/Pictures}"
mkdir -p "$outdir"
file="$outdir/$(date +%F-%H%M%S).png"
case "${1:-region}" in
region) geom=$(slurp) || exit 1 # Esc cancels
[ -n "$geom" ] || exit 1
grim -g "$geom" "$file" ;;
output) geom=$(slurp -o -f '%g') || exit 1 # pick a monitor
[ -n "$geom" ] || exit 1
grim -g "$geom" "$file" ;;
full) grim "$file" ;;
*) echo "usage: $(basename "$0") [region|output|full]" >&2; exit 2 ;;
esac
[ -s "$file" ] || { echo "capture failed" >&2; exit 1; }
wl-copy < "$file"
notify-send -i "$file" "Screenshot saved" "$file"
+13
View File
@@ -0,0 +1,13 @@
#!/bin/sh
# shikane-recover-on-reload: run after every sway startup/reload
# (wired up via exec_always in the sway config).
#
# Re-applies the shikane profile, then verifies the daemon came out
# the other side: if the re-apply hit the commit-failure race, the
# watchdog check (2s later) restarts the service to recover.
set -u
shikanectl reload 2>/dev/null
sleep 2
exec /home/work/.config/sway/scripts/shikane-watchdog.sh
+62
View File
@@ -0,0 +1,62 @@
#!/bin/sh
# shikane-watchdog: auto-recover shikane from its deadlock bug.
#
# Bug (shikane 1.1.1): if a variant application is discarded mid-way
# (e.g. by a failing DP atomic commit), the daemon gets stuck in
# VariantInProgress/Discarded. Two flavors observed:
# loud: keeps logging
# [WARN shikane::variant] Received invalid input AtomicChangeDone at state Discarded
# silent: no WARN at all; the variant state ends at "Discarded" and the
# daemon state machine simply never leaves VariantInProgress
# `shikanectl reload` does not recover it; a service restart does
# (re-applies the active profile in ~1s).
#
# A healthy daemon's last state-machine line is "VariantApplied".
set -u
unit=shikane
stuck=0
logs3=$(journalctl --user -u "$unit" -q --since "-3min" 2>/dev/null)
[ -z "$logs3" ] && exit 0
latest3=$(printf '%s\n' "$logs3" | grep 'daemon::state_machine' | tail -1)
if [ -n "$latest3" ]; then
case "$latest3" in
*VariantApplied*)
: ;; # healthy
*)
# Daemon still InProgress. Deadlock signatures (a legitimate
# slow transition has neither):
# loud: the WARN from the discarded-variant race
# silent: variant discarded but daemon never processed it
printf '%s\n' "$logs3" | grep -q 'invalid input' && stuck=1
if [ "$stuck" -eq 0 ]; then
lastvariant=$(printf '%s\n' "$logs3" \
| grep 'shikane::variant' | grep 'New variant state' | tail -1)
case "$lastvariant" in
*Discarded*) stuck=1 ;;
esac
fi
;;
esac
else
# No state change in the last 3 min — check the last known state
# (unbounded: a stuck daemon may have gone silent long ago,
# e.g. across a laptop suspend)
lastline=$(journalctl --user -u "$unit" -q -n 500 2>/dev/null \
| grep 'daemon::state_machine' | tail -1)
case "$lastline" in
'' | *VariantApplied*)
: ;; # stable and applied, or nothing to check
*)
stuck=1 ;; # stuck in-progress/discarded, any age
esac
fi
if [ "$stuck" -eq 1 ]; then
echo "shikane-watchdog: shikane stuck, restarting" >&2
systemctl --user restart "$unit"
fi
+103
View File
@@ -0,0 +1,103 @@
// -*- mode: jsonc -*-
{
"spacing": 2, // Gaps between modules (4px)
"modules-left": [
"sway/workspaces",
"sway/scratchpad",
"sway/window"
],
//"modules-center": [
//"sway/window"
//],
"modules-right": [
//"mpd",
"pulseaudio",
//"network",
"battery",
"clock",
"tray"
//"custom/power"
],
"sway/mode": {
"format": "<span style=\"italic\">{}</span>"
},
"sway/scratchpad": {
"format": "S{count}",
"show-empty": false,
"tooltip": true,
"tooltip-format": "{app}: {title}"
},
"tray": {
// "icon-size": 21,
"spacing": 10,
// "icons": {
// "blueman": "bluetooth",
// "TelegramDesktop": "$HOME/.local/share/icons/hicolor/16x16/apps/telegram.png"
// }
},
"clock": {
//"timezone": "America/Los_Angeles",
"tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>",
"format": "{:%r %Y-%m-%d}",
//"format": "{:%R %p %Y-%m-%d}",
//"format-alt": "{:%Y-%m-%d}"
},
"battery": {
"states": {
// "good": 95,
"warning": 30,
"critical": 15
},
"format": "{time} {capacity}%",
"format-full": "{capacity}%",
"format-charging": "{capacity}% C",
"format-plugged": "{capacity}% P",
"format-alt": "{time}",
// "format-good": "", // An empty format will hide the module
// "format-full": "",
},
"battery#bat2": {
"bat": "BAT2"
},
"power-profiles-daemon": {
"format": "{profile}",
"tooltip-format": "Power profile: {profile}\nDriver: {driver}",
"tooltip": true,
"format-icons": {"default": [""]}
},
"network": {
// "interface": "wlp2*", // (Optional) To force the use of this interface
//"format-wifi": "{essid} ({signalStrength}%)",
//"format-ethernet": "{ipaddr}/{cidr}",
//"tooltip-format": "{ifname} via {gwaddr}",
//"format-linked": "{ifname} (No IP)",
//"format-disconnected": "Disconnected",
"format-disconnected": "Disconnected",
"format-alt": "{ifname}: {ipaddr}/{cidr}"
},
"pulseaudio": {
// "scroll-step": 1, // %, can be a float
"format": "{volume}% {format_source}",
"format-bluetooth": "{volume}% {format_source}",
"format-bluetooth-muted": " {format_source}",
"format-muted": " {format_source}",
"format-source": "{volume}%",
"format-source-muted": "",
"format-icons": {
"default": [""]
},
"on-click": "pavucontrol"
},
"custom/media": {
"format": "{text}",
"return-type": "json",
"max-length": 40,
"format-icons": {
"spotify": "",
"default": ""
},
"escape": true,
"exec": "$HOME/.config/waybar/mediaplayer.py 2> /dev/null" // Script in resources folder
// "exec": "$HOME/.config/waybar/mediaplayer.py --player spotify 2> /dev/null" // Filter player based on name
}
}
+347
View File
@@ -0,0 +1,347 @@
/*
* Waybar theme — unified with sway color palette.
*
* ╔══════════════════════════════════════════════════════════════════╗
* ║ COLOR PALETTE ║
* ║ To change colors: ║
* ║ 1. Edit the $base00–$base0F values in ║
* ║ ~/.config/sway/config.d/swayfx ║
* ║ 2. Mirror those hex values in the @define-color block below ║
* ║ 3. Run: swaymsg reload ║
* ╚══════════════════════════════════════════════════════════════════╝
*/
/* ── Palette (your 5 colors + black) ── */
@define-color bg #000000;
@define-color bg-dark #000000;
@define-color bg-mid #000000;
@define-color bg-light #333333;
@define-color fg-dim #666666;
@define-color fg #999999;
@define-color fg-bright #CCCCCC;
@define-color fg-max #FFFFFF;
@define-color teal #999999;
@define-color blue #999999;
@define-color indigo #CCCCCC;
@define-color magenta #999999;
@define-color red #CCCCCC;
@define-color yellow #999999;
@define-color orange #999999;
@define-color green #CCCCCC;
@define-color cyan #666666;
/* ── Semantic aliases ── */
@define-color highlight @blue;
@define-color accent @teal;
@define-color urgent @red;
@define-color warning @yellow;
@define-color success @green;
* {
font-family: "JetBrainsMonoNFM-Regular";
font-size: 14px;
font-weight: bold;
}
window#waybar {
background-color: @bg;
color: @fg;
transition-property: background-color;
transition-duration: .5s;
}
window#waybar.hidden {
opacity: 0.2;
}
/* ── Buttons ── */
button {
box-shadow: inset 0 -3px transparent;
border: none;
border-radius: 0;
}
button:hover {
background: inherit;
box-shadow: inset 0 -3px @fg-bright;
}
/* ── Workspaces ── */
#workspaces button {
padding: 0 4px;
color: @fg-dim;
}
#workspaces button:hover {
background: @bg-mid;
}
#workspaces button.focused {
background-color: @highlight;
color: @bg;
}
#workspaces button.urgent {
background-color: @urgent;
}
/* ── Mode indicator ── */
#mode {
background-color: @blue;
box-shadow: inset 0 -3px @fg-bright;
}
/* ── Common module spacing ── */
#clock,
#battery,
#cpu,
#memory,
#disk,
#temperature,
#backlight,
#network,
#pulseaudio,
#wireplumber,
#custom-media,
#tray,
#mode,
#idle_inhibitor,
#scratchpad,
#power-profiles-daemon,
#mpd {
padding: 0 10px;
color: @fg;
}
/* ── Window & workspace margins ── */
#window,
#workspaces {
margin: 0 4px;
}
.modules-left > widget:first-child > #workspaces {
margin-left: 0;
}
.modules-right > widget:last-child > #workspaces {
margin-right: 0;
}
/* ── Battery ── */
#battery.charging, #battery.plugged {
color: @teal;
}
@keyframes blink {
to {
background-color: @fg-bright;
color: @bg;
}
}
#battery.critical:not(.charging) {
background-color: @urgent;
color: @fg-max;
animation-name: blink;
animation-duration: 0.5s;
animation-timing-function: steps(12);
animation-iteration-count: infinite;
animation-direction: alternate;
}
/* ── Power profiles ── */
#power-profiles-daemon {
padding-right: 15px;
}
#power-profiles-daemon.performance {
background-color: @urgent;
color: @fg-max;
}
#power-profiles-daemon.balanced {
background-color: @blue;
color: @fg-max;
}
#power-profiles-daemon.power-saver {
background-color: @success;
color: @bg;
}
/* ── Scratchpad ── */
#scratchpad {
background-color: transparent;
color: @fg-dim;
opacity: 0.5;
padding: 0 6px;
}
#scratchpad:hover {
opacity: 0.8;
}
#scratchpad.empty {
background-color: transparent;
}
/* ── Clock ── */
#clock {
/* background-color: @highlight; */
}
/* ── Battery ── */
#battery {
/* background-color: @fg-max;
color: @bg; */
}
/* ── Tray ── */
#tray > .passive {
-gtk-icon-effect: dim;
}
#tray > .needs-attention {
-gtk-icon-effect: highlight;
background-color: @urgent;
}
/* ── Pulseaudio ── */
#pulseaudio:hover {
/* hover style optional */
}
#pulseaudio.muted {
color: @fg-dim;
}
/* ── Idle inhibitor ── */
#idle_inhibitor {
background-color: @bg-dark;
}
#idle_inhibitor.activated {
background-color: @fg-bright;
color: @bg-dark;
}
label:focus {
background-color: @bg;
}
/* ── Legacy module styles (if ever enabled) ── */
#cpu {
background-color: @success;
color: @bg;
}
#memory {
background-color: @magenta;
}
#disk {
background-color: @warning;
}
#backlight {
background-color: @bg-light;
}
#network.disconnected {
background-color: @urgent;
}
#wireplumber {
background-color: @fg-max;
color: @bg;
}
#wireplumber.muted {
background-color: @urgent;
}
#custom-media {
background-color: @cyan;
color: @bg-dark;
min-width: 100px;
}
#custom-media.custom-spotify {
background-color: @cyan;
}
#custom-media.custom-vlc {
background-color: @warning;
}
#temperature {
background-color: @warning;
}
#temperature.critical {
background-color: @urgent;
}
#mpd {
background-color: @cyan;
color: @bg-dark;
}
#mpd.disconnected {
background-color: @urgent;
}
#mpd.stopped {
background-color: @bg-light;
}
#mpd.paused {
background-color: @accent;
}
/* ── Privacy items ── */
#privacy {
padding: 0;
}
#privacy-item {
padding: 0 5px;
color: @fg-max;
}
#privacy-item.screenshare {
background-color: @orange;
}
#privacy-item.audio-in {
background-color: @success;
}
#privacy-item.audio-out {
background-color: @blue;
}
/* ── Language & keyboard ── */
#language {
background: @teal;
color: @bg;
padding: 0 5px;
margin: 0 5px;
min-width: 16px;
}
#keyboard-state {
background: @teal;
color: @bg;
padding: 0;
margin: 0 5px;
min-width: 16px;
}
#keyboard-state > label {
padding: 0 5px;
}
#keyboard-state > label.locked {
background: @bg-dark;
}
+59
View File
@@ -0,0 +1,59 @@
# swaylock configuration -- VANILLA swaylock (packaged v1.8.6).
#
# swaylock reads $XDG_CONFIG_HOME/swaylock/config automatically, so this file
# applies to every invocation, including hypridle's before_sleep_cmd and the
# $mod+m keybind.
#
# IMPORTANT: the previous version of this file used swaylock-EFFECTS options
# (clock, timestr, datestr, fade-in, effect-blur, effect-scale and a bare
# `indicator`). The packaged swaylock is vanilla, and each of those lines logs
# swaylock: unrecognized option '--effect-blur=20x2'
# + a full usage dump, then ignores it (verified against v1.8.6). So the file
# was never fatal -- but none of its styling ever applied either, which is why
# the lock screen always looked like a bare `swaylock -c 000000`. Keep only
# names that appear in `swaylock --help` (check: every key here matches one).
#
# Want the blurred background + clock lock screen? Use hyprlock (installed and
# configured at ~/.config/hypr/hyprlock.conf) -- that is what hypridle's
# lock_cmd / 300s listener already call. Or install swaylock-effects from the
# AUR and re-add the effect-* keys.
ignore-empty-password
show-failed-attempts
indicator-caps-lock
font=JetBrainsMono Nerd Font Mono
font-size=24
indicator-radius=110
indicator-thickness=12
color=000000
inside-color=00000000
inside-clear-color=00000000
inside-ver-color=00000000
inside-wrong-color=00000000
line-color=333333
line-clear-color=CCCCCC
line-ver-color=999999
line-wrong-color=FFA14C
ring-color=333333
ring-clear-color=CCCCCC
ring-ver-color=999999
ring-wrong-color=FFA14C
key-hl-color=CCCCCC
bs-hl-color=FFA14C
separator-color=222222
text-color=FFFFFF
text-clear-color=CCCCCC
text-ver-color=FFFFFF
text-wrong-color=FFA14C
layout-bg-color=00000000
layout-border-color=00000000
layout-text-color=CCCCCC
@@ -0,0 +1 @@
/usr/lib/systemd/user/swaync.service
@@ -0,0 +1,6 @@
[Unit]
Description=shikane watchdog - restart shikane if its state machine is stuck
[Service]
Type=oneshot
ExecStart=/home/work/.config/sway/scripts/shikane-watchdog.sh
@@ -0,0 +1,10 @@
[Unit]
Description=Run shikane watchdog every 2 minutes
[Timer]
OnBootSec=2min
OnUnitInactiveSec=2min
AccuracySec=5s
[Install]
WantedBy=timers.target
+17
View File
@@ -0,0 +1,17 @@
[Unit]
Description=shikane
PartOf=graphical-session.target
After=graphical-session.target
Requisite=graphical-session.target
# Recover from crashes without giving up permanently
StartLimitIntervalSec=60
StartLimitBurst=10
[Service]
Type=simple
ExecStart=/usr/bin/shikane
Restart=on-failure
RestartSec=2
[Install]
WantedBy=sway-session.target
+6
View File
@@ -0,0 +1,6 @@
[Unit]
Description=sway compositor session
Documentation=man:systemd.special(7)
BindsTo=graphical-session.target
Wants=graphical-session-pre.target
After=graphical-session-pre.target
@@ -0,0 +1 @@
/home/work/.config/systemd/user/shikane.service
@@ -0,0 +1 @@
/home/work/.config/systemd/user/shikane-watchdog.timer
@@ -0,0 +1 @@
/dev/null
+10 -2
View File
@@ -1,14 +1,16 @@
set-option -sa terminal-overrides ",xterm*:Tc" set-option -sa terminal-overrides ",xterm*:Tc"
set -g default-terminal "xterm-256color" set -g default-terminal "xterm-256color"
set -g extended-keys on
bind-key r source-file ~/.config/tmux/tmux.conf \; display "Reloaded!" bind-key r source-file ~/.config/tmux/tmux.conf \; display "Reloaded!"
#set-option -g default-shell /bin/zsh
# remap prefix # remap prefix
unbind C-b unbind C-b
set -g prefix C-Space set -g prefix C-Space
bind C-Space send-prefix bind C-Space send-prefix
# set vi-mode # set vi-mode
set-window-option -g mode-keys vi set-window-option -g mode-keys vi
# keybindings # keybindings
@@ -37,7 +39,6 @@ bind-key -T copy-mode-vi 'C-l' select-pane -R
bind-key -T copy-mode-vi 'C-\' select-pane -l bind-key -T copy-mode-vi 'C-\' select-pane -l
set -g renumber-windows on set -g renumber-windows on
set-option -g allow-rename off set-option -g allow-rename off
@@ -50,3 +51,10 @@ bind % split-window -h -c "#{pane_current_path}"
set-option -g update-environment "SSH_AUTH_SOCK \ set-option -g update-environment "SSH_AUTH_SOCK \
SSH_CONNECTION \ SSH_CONNECTION \
DISPLAY " DISPLAY "
# set -g status-position bottom
# set -g status-left " #{session_name} "
# set -g status-right ""
# set -g status-right-length 100
# set -g status-style 'fg=default'
+31 -161
View File
@@ -1,108 +1,32 @@
// -*- mode: jsonc -*- // -*- mode: jsonc -*-
{ {
// "layer": "top", // Waybar at top layer "spacing": 2, // Gaps between modules (4px)
"position": "top", // Waybar position (top|bottom|left|right)
//"height": 10, // Waybar height (to be removed for auto height)
//"width": 0, // Waybar width
"spacing": 10, // Gaps between modules (4px)
// Choose the order of the modules
"modules-left": [ "modules-left": [
"sway/workspaces", "hyprland/workspaces",
"sway/mode", "hyprland/submap",
"sway/scratchpad", "hyprland/window"
"custom/media"
], ],
//"modules-center": [ //"modules-center": [
//"sway/window" //"sway/window"
//], //],
"modules-right": [ "modules-right": [
//"mpd", //"mpd",
//"custom/audio_idle_inhibitor", "pulseaudio",
//"pulseaudio",
//"network", //"network",
//"power-profiles-daemon", "battery",
//"cpu",
//"memory",
//"temperature",
//"backlight",
//"keyboard-state",
//"sway/language",
//"battery",
//"battery#bat2",
"clock", "clock",
"tray" "tray"
//"custom/power" //"custom/power"
], ],
// Modules configuration
// "sway/workspaces": {
// "disable-scroll": true,
// "all-outputs": true,
// "warp-on-scroll": false,
// "format": "{name}: {icon}",
// "format-icons": {
// "1": "",
// "2": "",
// "3": "",
// "4": "",
// "5": "",
// "urgent": "",
// "focused": "",
// "default": ""
// }
// },
"keyboard-state": {
"numlock": true,
"capslock": true,
"format": "{name} {icon}",
"format-icons": {
"locked": "",
"unlocked": ""
}
},
"sway/mode": { "sway/mode": {
"format": "<span style=\"italic\">{}</span>" "format": "<span style=\"italic\">{}</span>"
}, },
"sway/scratchpad": { "sway/scratchpad": {
"format": "{icon} {count}", "format": "{count}",
"show-empty": false, "show-empty": false,
"format-icons": ["", ""],
"tooltip": true, "tooltip": true,
"tooltip-format": "{app}: {title}" "tooltip-format": "{app}: {title}"
}, },
"mpd": {
"format": "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ⸨{songPosition}|{queueLength}⸩ {volume}% ",
"format-disconnected": "Disconnected ",
//"format-stopped": "{consumeIcon}{randomIcon}{repeatIcon}{singleIcon}Stopped ",
"format-stopped": "",
"unknown-tag": "N/A",
"interval": 5,
"consume-icons": {
"on": " "
},
"random-icons": {
"off": "<span color=\"#f53c3c\"></span> ",
"on": " "
},
"repeat-icons": {
"on": " "
},
"single-icons": {
"on": "1 "
},
"state-icons": {
"paused": "",
"playing": ""
},
"tooltip-format": "MPD (connected)",
"tooltip-format-disconnected": "MPD (disconnected)"
},
"idle_inhibitor": {
"format": "{icon} ",
"format-icons": {
"activated": "",
"deactivated": ""
}
},
"tray": { "tray": {
// "icon-size": 21, // "icon-size": 21,
"spacing": 10, "spacing": 10,
@@ -112,30 +36,11 @@
// } // }
}, },
"clock": { "clock": {
// "timezone": "America/New_York", //"timezone": "America/Los_Angeles",
"tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>", "tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>",
"format": "{:%r}", "format": "{:%r %Y-%m-%d}",
"format-alt": "{:%Y-%m-%d}" //"format": "{:%R %p %Y-%m-%d}",
}, //"format-alt": "{:%Y-%m-%d}"
"cpu": {
"format": "{usage}% ",
"tooltip": false
},
"memory": {
"format": "{}% "
},
"temperature": {
// "thermal-zone": 2,
// "hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input",
"critical-threshold": 80,
// "format-critical": "{temperatureC}°C {icon}",
"format": "{temperatureC}°C {icon}",
"format-icons": ["", "", ""]
},
"backlight": {
// "device": "acpi_video1",
"format": "{percent}% {icon}",
"format-icons": ["", "", "", "", "", "", "", "", ""]
}, },
"battery": { "battery": {
"states": { "states": {
@@ -143,91 +48,56 @@
"warning": 30, "warning": 30,
"critical": 15 "critical": 15
}, },
"format": "{capacity}% {icon}", "format": "{time} {capacity}%",
"format-full": "{capacity}% {icon}", "format-full": "{capacity}%",
"format-charging": "{capacity}% C", "format-charging": "{capacity}% C",
"format-plugged": "{capacity}% P", "format-plugged": "{capacity}% P",
"format-alt": "{time} {icon}", "format-alt": "{time}",
// "format-good": "", // An empty format will hide the module // "format-good": "", // An empty format will hide the module
// "format-full": "", // "format-full": "",
"format-icons": ["", "", "", "", ""]
}, },
"battery#bat2": { "battery#bat2": {
"bat": "BAT2" "bat": "BAT2"
}, },
"power-profiles-daemon": { "power-profiles-daemon": {
"format": "{icon}", "format": "{profile}",
"tooltip-format": "Power profile: {profile}\nDriver: {driver}", "tooltip-format": "Power profile: {profile}\nDriver: {driver}",
"tooltip": true, "tooltip": true,
"format-icons": { "format-icons": {"default": [""]}
"default": "",
"performance": "",
"balanced": "",
"power-saver": ""
}
}, },
"network": { "network": {
// "interface": "wlp2*", // (Optional) To force the use of this interface // "interface": "wlp2*", // (Optional) To force the use of this interface
"format-wifi": "{essid} ({signalStrength}%) ", //"format-wifi": "{essid} ({signalStrength}%)",
"format-ethernet": "{ipaddr}/{cidr} ", //"format-ethernet": "{ipaddr}/{cidr}",
"tooltip-format": "{ifname} via {gwaddr} ", //"tooltip-format": "{ifname} via {gwaddr}",
"format-linked": "{ifname} (No IP) ", //"format-linked": "{ifname} (No IP)",
"format-disconnected": "Disconnected ⚠", //"format-disconnected": "Disconnected",
"format-disconnected": "Disconnected",
"format-alt": "{ifname}: {ipaddr}/{cidr}" "format-alt": "{ifname}: {ipaddr}/{cidr}"
}, },
"pulseaudio": { "pulseaudio": {
// "scroll-step": 1, // %, can be a float // "scroll-step": 1, // %, can be a float
"format": "{volume}% {icon} {format_source}", "format": "{volume}% {format_source}",
"format-bluetooth": "{volume}% {icon}  {format_source}", "format-bluetooth": "{volume}% {format_source}",
"format-bluetooth-muted": " {icon} {format_source}", "format-bluetooth-muted": " {format_source}",
"format-muted": " {format_source}", "format-muted": " {format_source}",
"format-source": "{volume}%", "format-source": "{volume}%",
"format-source-muted": "", "format-source-muted": "",
"format-icons": { "format-icons": {
"headphone": "", "default": [""]
"hands-free": "",
"headset": "",
"phone": "",
"portable": "",
"car": "",
"default": ["", "", ""]
}, },
"on-click": "pavucontrol" "on-click": "pavucontrol"
}, },
"custom/media": { "custom/media": {
"format": "{icon} {text}", "format": "{text}",
"return-type": "json", "return-type": "json",
"max-length": 40, "max-length": 40,
"format-icons": { "format-icons": {
"spotify": "", "spotify": "",
"default": "🎜" "default": ""
}, },
"escape": true, "escape": true,
"exec": "$HOME/.config/waybar/mediaplayer.py 2> /dev/null" // Script in resources folder "exec": "$HOME/.config/waybar/mediaplayer.py 2> /dev/null" // Script in resources folder
// "exec": "$HOME/.config/waybar/mediaplayer.py --player spotify 2> /dev/null" // Filter player based on name // "exec": "$HOME/.config/waybar/mediaplayer.py --player spotify 2> /dev/null" // Filter player based on name
},
"custom/power": {
"format" : "⏻ ",
"tooltip": false,
"menu": "on-click",
"menu-file": "$HOME/.config/waybar/power_menu.xml", // Menu file in resources folder
"menu-actions": {
"shutdown": "shutdown",
"reboot": "reboot",
"suspend": "systemctl suspend",
"hibernate": "systemctl hibernate"
}
},
"custom/audio_idle_inhibitor": {
"format": "{icon} ",
"exec": "sway-audio-idle-inhibit --dry-print-both-waybar",
"exec-if": "which sway-audio-idle-inhibit",
"return-type": "json",
"format-icons": {
"output": "",
"input": "",
"output-input": " ",
"none": ""
}
} }
} }
+21 -18
View File
@@ -1,15 +1,16 @@
* { * {
/* `otf-font-awesome` is required to be installed for icons */ /* `otf-font-awesome` is required to be installed for icons */
/*font-family: FontAwesome, Roboto, Helvetica, Arial, sans-serif; */ /*font-family: FontAwesome, Roboto, Helvetica, Arial, sans-serif; */
/*font-family: "JetBrainsMono NF";*/
font-family: "JetBrainsMonoNFM-Regular"; font-family: "JetBrainsMonoNFM-Regular";
font-size: 14px;
font-weight: bold; font-weight: bold;
font-size: 15px;
} }
window#waybar { window#waybar {
/*background-color: rgba(43, 48, 59, 0.5);*/ /*background-color: rgba(43, 48, 59, 0.5);
border-bottom: 3px solid rgba(100, 114, 125, 0.5); */
background-color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 1);
/*border-bottom: 3px solid rgba(100, 114, 125, 0.5);*/
color: #ffffff; color: #ffffff;
transition-property: background-color; transition-property: background-color;
transition-duration: .5s; transition-duration: .5s;
@@ -26,18 +27,10 @@ window#waybar.solo {
/*background-color: #FFFFFF;*/ /*background-color: #FFFFFF;*/
} }
window#waybar.termite {
background-color: #3F3F3F;
}
window#waybar.chromium {
background-color: #000000;
border: none;
}
button { button {
/* Use box-shadow instead of border so the text isn't offset */ /* Use box-shadow instead of border so the text isn't offset */
/*box-shadow: inset 0 -3px transparent;*/ box-shadow: inset 0 -3px transparent;
/* Avoid rounded borders under each button name */ /* Avoid rounded borders under each button name */
border: none; border: none;
border-radius: 0; border-radius: 0;
@@ -55,7 +48,7 @@ button:hover {
} }
#workspaces button { #workspaces button {
padding: 0 5px; padding: 0 4px;
background-color: transparent; background-color: transparent;
color: #ffffff; color: #ffffff;
} }
@@ -64,15 +57,25 @@ button:hover {
background: rgba(0, 0, 0, 0.2); background: rgba(0, 0, 0, 0.2);
} }
#workspaces button.focused { #workspaces button.active {
background-color: #64727D; background-color: #eb4d4b;
box-shadow: inset 0 -3px #ffffff; box-shadow: inset 0 -3px #ffffff;
color: #ffffff;
font-weight: bold;
} }
#workspaces button.urgent { #workspaces button.urgent {
background-color: #eb4d4b; background-color: #eb4d4b;
} }
#workspaces button.visible {
background-color: #64727D;
}
#workspaces button.empty {
background-color: transparent;
}
#mode { #mode {
background-color: #64727D; background-color: #64727D;
box-shadow: inset 0 -3px #ffffff; box-shadow: inset 0 -3px #ffffff;
@@ -100,17 +103,17 @@ button:hover {
} }
#window, #window,
#workspaces { #workspaces-hyprland {
margin: 0 4px; margin: 0 4px;
} }
/* If workspaces is the leftmost module, omit left margin */ /* If workspaces is the leftmost module, omit left margin */
.modules-left > widget:first-child > #workspaces { .modules-left > widget:first-child > #workspaces-hyprland {
margin-left: 0; margin-left: 0;
} }
/* If workspaces is the rightmost module, omit right margin */ /* If workspaces is the rightmost module, omit right margin */
.modules-right > widget:last-child > #workspaces { .modules-right > widget:last-child > #workspaces-hyprland {
margin-right: 0; margin-right: 0;
} }
+22
View File
@@ -0,0 +1,22 @@
# Portal implementation pinning for the SWAY session.
#
# Without this file xdg-desktop-portal fell back to the deprecated `UseIn` key
# and picked hyprland.portal at random ("Choosing hyprland.portal ... via the
# deprecated UseIn key"), while the sway config also started the wlr portal --
# two implementations registered at once.
#
# Base is Arch's own /usr/share/xdg-desktop-portal/sway-portals.conf.
# GlobalShortcuts is added because neither wlr nor gtk implements it, and
# easyeffects requests it (journal: "Unknown method CreateSession or interface
# org.freedesktop.impl.portal.GlobalShortcuts").
[preferred]
default=gtk
org.freedesktop.impl.portal.ScreenCast=wlr
org.freedesktop.impl.portal.Screenshot=wlr
# gtk's Inhibit uses org.gnome.SessionManager / org.freedesktop.ScreenSaver,
# neither of which sway implements; "none" lets apps use Wayland's
# idle-inhibit protocol, which sway does implement.
org.freedesktop.impl.portal.Inhibit=none
org.freedesktop.impl.portal.GlobalShortcuts=hyprland
org.freedesktop.impl.portal.InputCapture=hyprland
+7
View File
@@ -0,0 +1,7 @@
[user]
email = [email protected]
name = Josue Zamudio
[diff]
tool = nvimdiff
[core]
editor = nvim
+4 -1
View File
@@ -1,2 +1,5 @@
.config/nvim/lazy-lock.json .config/nvim/lazy-lock.json
.config/opencode/node_modules/
.config/opencode/package.json
.config/opencode/bun.lock
.config/opencode/package-lock.json
+18 -2
View File
@@ -2,19 +2,35 @@
autoload -Uz compinit autoload -Uz compinit
compinit compinit
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
alias dir='dir --color=auto'
alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
# Alias # Alias
alias vim='nvim' alias vim='nvim'
alias ssh='ssh -YC'
# Config # Config
source <(fzf --zsh) source <(fzf --zsh)
autoload -Uz vcs_info autoload -Uz vcs_info
precmd_vcs_info() { vcs_info } precmd_vcs_info() { vcs_info }
precmd_functions+=( precmd_vcs_info ) precmd_functions+=( precmd_vcs_info )
setopt prompt_subst setopt prompt_subst
RPROMPT='${vcs_info_msg_0_}' RPROMPT='${vcs_info_msg_0_}'
#PROMPT='${vcs_info_msg_0_}%# ' #PROMPT='${vcs_info_msg_0_}%# '
PROMPT='%~%# ' PROMPT='%n@%c%# '
zstyle ':vcs_info:git:*' formats '%b' zstyle ':vcs_info:git:*' formats '%b'
+22
View File
@@ -11,3 +11,25 @@ stow .
``` ```
If stow is not installed use ./install.sh from .dotfiles repo If stow is not installed use ./install.sh from .dotfiles repo
# User services
## shikane-watchdog
`.config/systemd/user/shikane-watchdog.timer` (every 2 min, user unit)
runs `.config/sway/scripts/shikane-watchdog.sh`, which restarts the
`shikane` user service if its state machine is stuck.
Why: shikane 1.1.1 deadlocks when a profile application is discarded
mid-way (e.g. by a failing DP atomic commit on the external display).
The daemon then keeps logging
`[WARN shikane::variant] Received invalid input AtomicChangeDone at state Discarded`
and `shikanectl reload` no longer recovers it. The watchdog detects
that signature in the journal and runs `systemctl --user restart shikane`
(re-applies the active profile in ~1s). It never restarts a healthy
or legitimately transitioning daemon.
```console
systemctl --user status shikane-watchdog.timer # check it's active
systemctl --user disable --now shikane-watchdog.timer # disable
```
+8
View File
@@ -0,0 +1,8 @@
[Desktop Entry]
Type=Application
Name=myAppName
Icon=~/myApp/icon.xpm
Exec=~/myApp/launcher
Comment=brief description
Categories=Development;IDE;
Terminal=false
File renamed without changes.
+12
View File
@@ -0,0 +1,12 @@
[Desktop Entry]
Name=Discord
StartupWMClass=discord
Comment=All-in-one voice and text chat for gamers that's free, secure, and works on both your desktop and phone.
GenericName=Internet Messenger
Exec=/usr/bin/flatpak run --socket=wayland com.discordapp.Discord --enable-features=UseOzonePlatform --ozone-platform=wayland
#Exec=/usr/lib/discord/Discord --enable-features=UseOzonePlatform --ozone-platform=wayland
#Exec=/usr/lib/discord/Discord
Icon=discord
Type=Application
Categories=Network;InstantMessaging;
Path=/usr/bin
+13
View File
@@ -0,0 +1,13 @@
[Desktop Entry]
Name=Feh
Name[en_US]=feh
GenericName=Image viewer
GenericName[en_US]=Image viewer
Comment=Image viewer and cataloguer
Exec=feh --start-at %u
Terminal=false
Type=Application
Icon=feh
Categories=Graphics;2DGraphics;Viewer;
MimeType=image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/tiff;image/webp;image/x-bmp;image/x-pcx;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-tga;image/x-xbitmap;image/heic;
NoDisplay=true
@@ -0,0 +1,8 @@
[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
NoDisplay=true
Exec=/usr/lib/firefox/firefox %u
Name=Firefox
Comment=Custom definition for Firefox
+95
View File
@@ -0,0 +1,95 @@
#!/usr/bin/env bash
# clipboard-check.sh -- diagnose "copy did nothing" on sway/Wayland.
# READ-ONLY: lists selection metadata and reads text; never writes the clipboard,
# never runs wl-copy, never restarts anything.
# ./clipboard-check.sh -> status (what is configured right now)
# ./clipboard-check.sh test -> 20s window: copy in Firefox, then tell me who failed
set -uo pipefail
own_sig() { # identify the owner from its advertised type list
local t
t=$(wl-paste -l 2>&1); [[ -z "$t" ]] && { echo "(clipboard empty / no owner)"; return; }
case "$t" in
*x-moz-url-priv*|*text/html*) echo "Firefox (has moz/html types)" ;;
*glfw+clipboard*) echo "kitty/GLFW terminal (OSC 52 or copy_on_select)" ;;
*image/png*) echo "image (screenshot? wl-copy -b)" ;;
*) echo "some other client: $(echo "$t" | tr '\n' ' ')" ;;
esac
}
if [[ "${1:-status}" == test ]]; then
echo "BEFORE owner: $(own_sig)"
echo
echo " >> Copy some text in Firefox NOW (Ctrl+C), then press Enter."
read -r _
echo "AFTER owner: $(own_sig)"
echo
if wl-paste -l >/dev/null 2>&1; then
n=$(wl-paste 2>/dev/null | wc -c)
echo " text available: $n byte(s)"
[[ $n -gt 0 ]] && echo " preview: $(wl-paste 2>/dev/null | head -c 70 | tr '\n' ' ')"
echo
echo " VERDICT: the compositor HAS the copy -> the loss is on the paste side"
echo " (stale PRIMARY for middle-click, or a clipboard-history keybind"
echo " that no longer exists since clipman was removed)."
else
echo " VERDICT: the compositor has NOTHING -> Firefox never took ownership."
echo " Usual causes, in order of likelihood:"
echo " 1) Firefox lacked keyboard focus at Ctrl+C -- Wayland only"
echo " accepts set_selection from the focused surface (a PiP window,"
echo " a toast, or a workspace switch stealing focus is enough)."
echo " 2) The page's own JS intercepted the copy event (sites that"
echo " block copying). dom.event.clipboardevents.enabled=true by"
echo " default, so page scripts may do this."
echo " 3) The offer got cancelled mid-transfer ('selection cancelled'"
echo " in sway's log) -- see: journalctl -b | grep 'selection cancelled'"
fi
exit 0
fi
echo "== components =="
printf ' %-22s %s\n' "sway" "$(swaymsg --version 2>&1 | head -1)"
printf ' %-22s %s\n' "wl-clipboard" "$(wl-copy --version 2>&1 | head -1)"
printf ' %-22s %s\n' "firefox" "$(firefox --version 2>&1 | head -1) [$(pacman -Q firefox 2>/dev/null || echo '?')]"
printf ' %-22s %s\n' "cliphist" "$(command -v cliphist || echo 'NOT INSTALLED (history keybinds are dead)')"
echo
echo "== clipboard managers / watchers (a watcher that dies mid-copy LOSES the copy) =="
m=$(pgrep -af 'wl-paste|cliphist|clipman|copyq|klipper|parcellite|flameshot' 2>/dev/null || true)
[[ -n "$m" ]] && echo "$m" | sed 's/^/ RUNNING /' || echo " none running <- no history is being saved, but also nothing can steal a copy"
echo
echo "== XWayland mixing (X11<->Wayland clipboard skew is a classic cause) =="
if pgrep -x Xwayland >/dev/null 2>&1; then
echo " Xwayland IS running -> any X11 app can own the selection out-of-band:"
pgrep -a Xwayland | sed 's/^/ /'
else
echo " no Xwayland -> pure Wayland, that whole failure class is ruled out"
fi
echo
echo "== window shells (a copy from an X11-surfaced Firefox behaves differently) =="
swaymsg -t get_tree 2>/dev/null | python3 -c "
import json,sys
def walk(n):
yield n
for k in ('nodes','floating_nodes'):
for c in n.get(k) or []: yield from walk(c)
for n in walk(json.load(sys.stdin)):
if n.get('pid') and n.get('type') in ('con','floating_con'):
shell = 'x11' if n.get('window') is not None else 'wayland'
wp = n.get('window_properties') or {}
ident = str(n.get('app_id') or wp.get('class'))[:24]
print(' %-8s %-26s %s' % (shell, ident, (n.get('name') or '')[:38]))
" 2>&1 | sort -u | head -12
echo
echo "== current selections (read-only) =="
printf ' CLIPBOARD owner : %s\n' "$(own_sig)"
printf ' PRIMARY types : %s\n' "$(wl-paste -p -l 2>&1 | tr '\n' ' ' | cut -c1-100)"
echo
echo "== Firefox clipboard prefs (blank = default) =="
P=$(ls ~/.mozilla/firefox/*/prefs.js 2>/dev/null | head -1)
grep -hE 'dom\.event\.clipboardevents|middlepaste|widget\.wayland' "$P" 2>/dev/null | sed 's/^/ /' || true
grep -hE 'user_pref' "$(dirname "$P")/user.js" 2>/dev/null | grep -iE 'clipboard|wayland' | sed 's/^/ user.js: /' || true
echo
echo "== past cancellations sway logged (each one = a copy that vanished) =="
journalctl -b 0 --no-pager 2>/dev/null | grep -ic 'selection cancelled' | sed 's/^/ '\''selection cancelled'\'' events this boot: /'
echo
echo "Run '$0 test' to A/B an actual Firefox copy."
+16
View File
@@ -0,0 +1,16 @@
#!/bin/bash
name=$1
if [ -z "$name" ]; then
echo "Usage: $0 <name>"
exit 1
fi
echo "Saving profile $name"
echo -e "\nprofile $name {" >> ~/.config/kanshi/config
swaymsg -t get_outputs | \
jq '.[] | " output '"'"'\(.make) \(.model) \(.serial)'"'"' mode \(.current_mode.width)x\(.current_mode.height) position \(.rect.x),\(.rect.y)"' -r \
>> ~/.config/kanshi/config
+1
View File
@@ -0,0 +1 @@
/home/jozamudi/Downloads/mullvad_config_linux_us_lax/vpn.sh