mirror of
https://github.com/AquaMorph/dotfiles.git
synced 2026-10-22 04:45:34 +00:00
Compare commits
1
Commits
main
..
fe212c0a92
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fe212c0a92 |
@@ -95,6 +95,9 @@ python3 -m py_compile ./home/bin/homeassistant.py
|
|||||||
- Check command exit status: `if <command>; then ... fi`
|
- Check command exit status: `if <command>; then ... fi`
|
||||||
- Redirect stderr appropriately: `2>/dev/null` or `2>&1`
|
- Redirect stderr appropriately: `2>/dev/null` or `2>&1`
|
||||||
|
|
||||||
|
### Configuration Files
|
||||||
|
- Before generating a commit, always consult `.agent/COMMITS.md` for the required style.
|
||||||
|
|
||||||
#### chezmoi Templates
|
#### chezmoi Templates
|
||||||
- Dotfiles use chezmoi's templating system
|
- Dotfiles use chezmoi's templating system
|
||||||
- Template syntax: `{{ }}` for variables (Chezmoi specific)
|
- Template syntax: `{{ }}` for variables (Chezmoi specific)
|
||||||
@@ -108,7 +111,12 @@ python3 -m py_compile ./home/bin/homeassistant.py
|
|||||||
## Repository Patterns
|
## Repository Patterns
|
||||||
|
|
||||||
### Commit Message Format
|
### Commit Message Format
|
||||||
- Before generating a commit, always consult @.agents/COMMITS.md for the required style.
|
Follow conventional commits style (all lowercase).
|
||||||
|
- `feat(scope): description` - New feature
|
||||||
|
- `fix(scope): description` - Bug fix
|
||||||
|
- `refactor(scope): description` - Code refactoring
|
||||||
|
- `docs(scope): description` - Documentation changes
|
||||||
|
- Example: `feat(zsh): update dotfiles` or `fix(scripts): use correct pass entry`
|
||||||
|
|
||||||
#### Pushing Remotes
|
#### Pushing Remotes
|
||||||
- **Do not push git repositories to remote unless explicitly instructed.**
|
- **Do not push git repositories to remote unless explicitly instructed.**
|
||||||
|
|||||||
@@ -1,99 +1,10 @@
|
|||||||
# Dotfiles
|
# Dotfiles
|
||||||
|
|
||||||
A collection of config files and scripts for Fedora GNU/Linux and macOS.
|
A collection of config files and scripts for Fedora GNU/Linux.
|
||||||
|
|
||||||
## Linux installation
|
## Installation
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
chezmoi init --apply git@github.com:AquaMorph/dotfiles.git
|
chezmoi init --apply git@github.com:AquaMorph/dotfiles.git
|
||||||
```
|
```
|
||||||
|
|
||||||
## macOS installation
|
|
||||||
|
|
||||||
1. Install the Xcode Command Line Tools with `xcode-select --install`, then
|
|
||||||
install [Homebrew](https://brew.sh/) and follow its `brew shellenv`
|
|
||||||
instructions.
|
|
||||||
|
|
||||||
2. Download the dotfiles without applying them, then install dependencies:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
brew install chezmoi
|
|
||||||
chezmoi init git@github.com:AquaMorph/dotfiles.git
|
|
||||||
brew bundle --file="$(chezmoi source-path ~/.brewfile)"
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Restore your password store to `~/.password-store` and import its GPG private
|
|
||||||
key from a secure backup before applying the dotfiles:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
gpg --import /path/to/private-key-backup.asc
|
|
||||||
```
|
|
||||||
|
|
||||||
If the store is kept in Git, clone it to `~/.password-store` using your
|
|
||||||
password-store repository URL. Verify that all required secrets can be
|
|
||||||
decrypted without printing their values:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pass show self-host/token/audible-activation-bytes >/dev/null
|
|
||||||
pass show self-host/token/aquaai >/dev/null
|
|
||||||
pass show self-host/token/todoist >/dev/null
|
|
||||||
```
|
|
||||||
|
|
||||||
`settings.conf` is rendered using `pass`, so applying it requires these
|
|
||||||
entries and the matching private key. Never commit keys or plaintext tokens.
|
|
||||||
|
|
||||||
4. Review and apply the dotfiles, then open a new terminal:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
chezmoi diff
|
|
||||||
chezmoi apply
|
|
||||||
```
|
|
||||||
|
|
||||||
Linux-only configuration and scripts are automatically ignored on macOS.
|
|
||||||
|
|
||||||
To install newly added macOS dependencies later:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
brew bundle --file="$(chezmoi source-path ~/.brewfile)"
|
|
||||||
```
|
|
||||||
|
|
||||||
### System preferences
|
|
||||||
|
|
||||||
Close System Settings, then review and run the optional setup script as your
|
|
||||||
normal user (not with `sudo`):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
~/bin/setup-macos.sh --dry-run
|
|
||||||
~/bin/setup-macos.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
It enables dark mode and Dock auto-hide, disables natural scrolling and
|
|
||||||
swipe-to-navigate, and removes window-tiling margins (macOS Sequoia and later).
|
|
||||||
Animation settings and machine-specific state, such as Dock contents and
|
|
||||||
monitor/Spaces layouts, are left unchanged.
|
|
||||||
|
|
||||||
The script is safe to rerun but does not back up previous values or run
|
|
||||||
automatically during `chezmoi apply`. Log out and back in if changes are not
|
|
||||||
visible.
|
|
||||||
|
|
||||||
### Hover window focus
|
|
||||||
|
|
||||||
AutoRaise focuses and raises windows on hover. Its settings are managed in
|
|
||||||
`~/.config/AutoRaise/config`.
|
|
||||||
|
|
||||||
After installing dependencies and applying the dotfiles, enable it at login:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
brew services start dimentium/autoraise/autoraise
|
|
||||||
```
|
|
||||||
|
|
||||||
Grant AutoRaise access in **System Settings → Privacy & Security → Accessibility**.
|
|
||||||
If it is not listed, use **+**, press **Cmd+Shift+G**, and enter the path printed by
|
|
||||||
`echo "$(brew --prefix autoraise)/bin/AutoRaise"`. Then restart it with
|
|
||||||
`brew services restart dimentium/autoraise/autoraise`.
|
|
||||||
|
|
||||||
Hold **Control** to temporarily suspend hover focus. To turn it off entirely:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
brew services stop dimentium/autoraise/autoraise
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
encryption = "gpg"
|
|
||||||
|
|
||||||
[gpg]
|
|
||||||
recipient = "02C20A131365D6EF3CC4A023B9BDD0975CF5592D"
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
{{ if eq .chezmoi.os "darwin" -}}
|
|
||||||
# Linux desktop configuration
|
|
||||||
.config/g13
|
|
||||||
.config/gtk-3.0
|
|
||||||
.config/gtk-4.0
|
|
||||||
.config/hypr
|
|
||||||
.config/i3
|
|
||||||
.config/mako
|
|
||||||
.config/polybar
|
|
||||||
.config/quickshell
|
|
||||||
.config/rofi
|
|
||||||
.config/waybar
|
|
||||||
|
|
||||||
# Linux services and PipeWire configuration
|
|
||||||
.config/systemd
|
|
||||||
.config/wireplumber
|
|
||||||
.local/share/wireplumber
|
|
||||||
user/*.service
|
|
||||||
|
|
||||||
# Linux package installers and desktop startup scripts
|
|
||||||
bin/installers
|
|
||||||
bin/desktop
|
|
||||||
bin/system
|
|
||||||
bin/i3-mouse.py
|
|
||||||
bin/i3wm-config-gen.sh
|
|
||||||
bin/i3wm-for-window-gen.sh
|
|
||||||
bin/launch-stocks-tracker.py
|
|
||||||
bin/start-firefox.py
|
|
||||||
bin/start-brave.sh
|
|
||||||
|
|
||||||
# Linux hardware, screen locking, and NAS mounting
|
|
||||||
bin/get-mouse-battery.sh
|
|
||||||
bin/lock.sh
|
|
||||||
bin/toggle-graphics.sh
|
|
||||||
bin/trackpad-toggle.sh
|
|
||||||
bin/connect-nas.sh
|
|
||||||
|
|
||||||
# ALSA/PipeWire routing and Rofi prompts; keep portable audio utilities
|
|
||||||
bin/audio/audio-lib.sh
|
|
||||||
bin/audio/aquamix.sh
|
|
||||||
bin/audio/es8start.sh
|
|
||||||
bin/audio/es9start.sh
|
|
||||||
bin/audio/es9stop.sh
|
|
||||||
bin/audio/system-start-audio.sh
|
|
||||||
bin/audio/synth-power-prompt.sh
|
|
||||||
|
|
||||||
# Wine-based Adobe DNG conversion with GNU date
|
|
||||||
bin/video/cr3todng.sh
|
|
||||||
{{ else -}}
|
|
||||||
# Homebrew dependencies are only managed on macOS.
|
|
||||||
.brewfile
|
|
||||||
|
|
||||||
# macOS OrcaSlicer uses a symlink to the shared Linux-style profile directory.
|
|
||||||
Library/Application Support/OrcaSlicer
|
|
||||||
{{ end -}}
|
|
||||||
|
|
||||||
{{ if ne .chezmoi.os "darwin" -}}
|
|
||||||
.config/karabiner
|
|
||||||
.config/AutoRaise
|
|
||||||
bin/setup-macos.sh
|
|
||||||
{{ end -}}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
openai/gpt-5.6-luna
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{{ .chezmoi.homeDir }}/.config/OrcaSlicer/user/default
|
|
||||||
@@ -23,9 +23,3 @@ python frc-photo-checklist.py [Event Key]
|
|||||||
## get-mouse-battery.sh
|
## get-mouse-battery.sh
|
||||||
|
|
||||||
Prints out the battery percentage of a mouse and if it is charging.
|
Prints out the battery percentage of a mouse and if it is charging.
|
||||||
|
|
||||||
## openai-usage.sh
|
|
||||||
|
|
||||||
Shows the remaining 5-hour and weekly ChatGPT Codex allowances using the current
|
|
||||||
OpenCode or Codex CLI login. Run `openai-usage --watch` to refresh every minute,
|
|
||||||
or `openai-usage --json` for machine-readable output.
|
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Start the systemd-managed Quickshell bar in the current graphical session.
|
|
||||||
|
|
||||||
if ! command -v qs &> /dev/null; then
|
|
||||||
if [ "${XDG_SESSION_TYPE}" = "x11" ]; then
|
|
||||||
~/bin/desktop/polybar-start.sh
|
|
||||||
fi
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "${XDG_SESSION_TYPE}" = "x11" ]; then
|
|
||||||
systemctl --user unset-environment WAYLAND_DISPLAY HYPRLAND_INSTANCE_SIGNATURE
|
|
||||||
systemctl --user set-environment QT_QPA_PLATFORM=xcb
|
|
||||||
else
|
|
||||||
systemctl --user set-environment QT_QPA_PLATFORM=wayland
|
|
||||||
fi
|
|
||||||
systemctl --user import-environment DISPLAY XAUTHORITY WAYLAND_DISPLAY XDG_SESSION_TYPE XDG_CURRENT_DESKTOP HYPRLAND_INSTANCE_SIGNATURE I3SOCK
|
|
||||||
if [ "$(hostname)" = "desktop" ]; then
|
|
||||||
systemctl --user set-environment QUICKSHELL_BAR_SCREEN=DP-2
|
|
||||||
else
|
|
||||||
systemctl --user unset-environment QUICKSHELL_BAR_SCREEN
|
|
||||||
fi
|
|
||||||
systemctl --user restart quickshell-bar.service
|
|
||||||
@@ -1,196 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Show the remaining ChatGPT Codex rate limits for the current OpenAI login.
|
|
||||||
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
usage_url="${OPENAI_USAGE_URL:-https://chatgpt.com/backend-api/wham/usage}"
|
|
||||||
auth_file="${OPENAI_AUTH_FILE:-}"
|
|
||||||
output_format="text"
|
|
||||||
watch_interval=""
|
|
||||||
|
|
||||||
function usage {
|
|
||||||
cat <<'EOF'
|
|
||||||
Usage: openai-usage [--json] [--watch [SECONDS]]
|
|
||||||
|
|
||||||
Show the remaining Codex allowance for the OpenAI account logged into OpenCode
|
|
||||||
or the Codex CLI. The default watch interval is 60 seconds.
|
|
||||||
|
|
||||||
Environment:
|
|
||||||
OPENAI_AUTH_FILE Override the OAuth credential file
|
|
||||||
OPENAI_USAGE_URL Override the ChatGPT usage endpoint
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
function fail {
|
|
||||||
printf 'openai-usage: %s\n' "$1" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
function require_command {
|
|
||||||
command -v "$1" &>/dev/null || fail "required command not found: $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
function find_auth_file {
|
|
||||||
local opencode_auth
|
|
||||||
local codex_auth
|
|
||||||
|
|
||||||
if [[ -n "$auth_file" ]]; then
|
|
||||||
[[ -r "$auth_file" ]] || fail "cannot read auth file: $auth_file"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
opencode_auth="${XDG_DATA_HOME:-$HOME/.local/share}/opencode/auth.json"
|
|
||||||
codex_auth="${CODEX_HOME:-$HOME/.codex}/auth.json"
|
|
||||||
|
|
||||||
if [[ -r "$opencode_auth" ]]; then
|
|
||||||
auth_file="$opencode_auth"
|
|
||||||
elif [[ -r "$codex_auth" ]]; then
|
|
||||||
auth_file="$codex_auth"
|
|
||||||
else
|
|
||||||
fail "no OpenCode or Codex login found; run 'opencode auth login' first"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function human_duration {
|
|
||||||
local total_seconds=$1
|
|
||||||
local days hours minutes
|
|
||||||
|
|
||||||
(( total_seconds < 0 )) && total_seconds=0
|
|
||||||
days=$((total_seconds / 86400))
|
|
||||||
hours=$(((total_seconds % 86400) / 3600))
|
|
||||||
minutes=$(((total_seconds % 3600) / 60))
|
|
||||||
|
|
||||||
if (( days > 0 )); then
|
|
||||||
printf '%dd %dh' "$days" "$hours"
|
|
||||||
elif (( hours > 0 )); then
|
|
||||||
printf '%dh %dm' "$hours" "$minutes"
|
|
||||||
else
|
|
||||||
printf '%dm' "$minutes"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function format_reset_time {
|
|
||||||
local reset_at=$1
|
|
||||||
|
|
||||||
if date --date="@$reset_at" '+%a %b %-d, %-I:%M %p' 2>/dev/null; then
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
# BSD date fallback.
|
|
||||||
date -r "$reset_at" '+%a %b %e, %l:%M %p' 2>/dev/null || printf '%s' "$reset_at"
|
|
||||||
}
|
|
||||||
|
|
||||||
function print_window {
|
|
||||||
local label=$1
|
|
||||||
local window=$2
|
|
||||||
local used_percent reset_after reset_at remaining
|
|
||||||
|
|
||||||
used_percent=$(jq -r '.used_percent // 0' <<<"$window")
|
|
||||||
reset_after=$(jq -r '.reset_after_seconds // 0 | floor' <<<"$window")
|
|
||||||
reset_at=$(jq -r '.reset_at // 0 | floor' <<<"$window")
|
|
||||||
remaining=$(jq -nr --argjson used "$used_percent" '100 - $used | if . < 0 then 0 else . end')
|
|
||||||
|
|
||||||
printf '%-8s %6g%% left resets in %-8s (%s)\n' \
|
|
||||||
"$label:" "$remaining" "$(human_duration "$reset_after")" "$(format_reset_time "$reset_at")"
|
|
||||||
}
|
|
||||||
|
|
||||||
function fetch_usage {
|
|
||||||
local access_token account_id raw_response status body
|
|
||||||
|
|
||||||
access_token=$(jq -r \
|
|
||||||
'.openai.access // .tokens.access_token // .access_token // empty' \
|
|
||||||
"$auth_file") || fail "invalid JSON in auth file: $auth_file"
|
|
||||||
account_id=$(jq -r \
|
|
||||||
'.openai.accountId // .tokens.account_id // .account_id // empty' \
|
|
||||||
"$auth_file") || fail "invalid JSON in auth file: $auth_file"
|
|
||||||
|
|
||||||
[[ -n "$access_token" ]] || fail "no OpenAI OAuth token found in $auth_file"
|
|
||||||
|
|
||||||
raw_response=$(curl --silent --show-error \
|
|
||||||
--header "Authorization: Bearer $access_token" \
|
|
||||||
--header "ChatGPT-Account-Id: $account_id" \
|
|
||||||
--header 'Accept: application/json' \
|
|
||||||
--write-out $'\n%{http_code}' \
|
|
||||||
"$usage_url") || fail "could not contact OpenAI"
|
|
||||||
|
|
||||||
status=${raw_response##*$'\n'}
|
|
||||||
body=${raw_response%$'\n'*}
|
|
||||||
|
|
||||||
case "$status" in
|
|
||||||
200) ;;
|
|
||||||
401|403) fail "OpenAI login expired; run 'opencode auth login' again" ;;
|
|
||||||
*) fail "OpenAI returned HTTP $status" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
jq -e '.rate_limit' <<<"$body" >/dev/null || fail "unexpected response from OpenAI"
|
|
||||||
printf '%s\n' "$body"
|
|
||||||
}
|
|
||||||
|
|
||||||
function print_usage {
|
|
||||||
local response=$1
|
|
||||||
local plan primary secondary
|
|
||||||
|
|
||||||
if [[ "$output_format" == "json" ]]; then
|
|
||||||
jq '{
|
|
||||||
plan: .plan_type,
|
|
||||||
allowed: .rate_limit.allowed,
|
|
||||||
limit_reached: .rate_limit.limit_reached,
|
|
||||||
five_hour: (.rate_limit.primary_window | . + {
|
|
||||||
remaining_percent: ([100 - .used_percent, 0] | max)
|
|
||||||
}),
|
|
||||||
weekly: (.rate_limit.secondary_window | . + {
|
|
||||||
remaining_percent: ([100 - .used_percent, 0] | max)
|
|
||||||
})
|
|
||||||
}' <<<"$response"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
plan=$(jq -r '.plan_type // "unknown"' <<<"$response")
|
|
||||||
primary=$(jq -c '.rate_limit.primary_window' <<<"$response")
|
|
||||||
secondary=$(jq -c '.rate_limit.secondary_window' <<<"$response")
|
|
||||||
|
|
||||||
printf 'OpenAI Codex usage (%s)\n' "$plan"
|
|
||||||
print_window '5-hour' "$primary"
|
|
||||||
print_window 'Weekly' "$secondary"
|
|
||||||
}
|
|
||||||
|
|
||||||
while (( $# > 0 )); do
|
|
||||||
case "$1" in
|
|
||||||
--json)
|
|
||||||
output_format="json"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--watch)
|
|
||||||
watch_interval=60
|
|
||||||
if [[ ${2:-} =~ ^[1-9][0-9]*$ ]]; then
|
|
||||||
watch_interval=$2
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-h|--help)
|
|
||||||
usage
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
usage >&2
|
|
||||||
fail "unknown argument: $1"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
require_command curl
|
|
||||||
require_command jq
|
|
||||||
find_auth_file
|
|
||||||
|
|
||||||
while true; do
|
|
||||||
if ! response=$(fetch_usage); then
|
|
||||||
[[ -n "$watch_interval" ]] || exit 1
|
|
||||||
sleep "$watch_interval"
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
print_usage "$response"
|
|
||||||
|
|
||||||
[[ -n "$watch_interval" ]] || break
|
|
||||||
sleep "$watch_interval"
|
|
||||||
done
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Apply curated macOS preferences without copying machine-specific state.
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
function usage {
|
|
||||||
echo "Usage: ${0##*/} [--dry-run]"
|
|
||||||
echo "Apply macOS preferences for the current user. Do not run with sudo."
|
|
||||||
}
|
|
||||||
|
|
||||||
dry_run=false
|
|
||||||
case "${1:-}" in
|
|
||||||
--dry-run) dry_run=true ;;
|
|
||||||
--help|-h) usage; exit 0 ;;
|
|
||||||
"") ;;
|
|
||||||
*) usage >&2; exit 1 ;;
|
|
||||||
esac
|
|
||||||
if [[ $# -gt 1 ]]; then
|
|
||||||
usage >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$(uname -s)" != "Darwin" ]]; then
|
|
||||||
echo "This script only supports macOS." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if [[ "$EUID" -eq 0 ]]; then
|
|
||||||
echo "Run this script as your normal user, not with sudo." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
function write_preference {
|
|
||||||
if [[ "$dry_run" == true ]]; then
|
|
||||||
printf '%q ' defaults write "$@"
|
|
||||||
printf '\n'
|
|
||||||
elif ! defaults write "$@"; then
|
|
||||||
echo "Could not write preference: $1 $2" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Existing preferences observed on this Mac. This is not a full defaults export:
|
|
||||||
# macOS also stores stock values, histories, and hardware-specific state there.
|
|
||||||
|
|
||||||
# Use dark appearance and automatically hide the Dock.
|
|
||||||
write_preference NSGlobalDomain AppleInterfaceStyle -string Dark
|
|
||||||
write_preference com.apple.dock autohide -bool true
|
|
||||||
|
|
||||||
# Use traditional scrolling and disable swipe-based back/forward navigation.
|
|
||||||
write_preference NSGlobalDomain com.apple.swipescrolldirection -bool false
|
|
||||||
write_preference NSGlobalDomain AppleEnableSwipeNavigateWithScrolls -bool false
|
|
||||||
|
|
||||||
# Remove the gaps around tiled windows (macOS Sequoia and later).
|
|
||||||
write_preference com.apple.WindowManager EnableTiledWindowMargins -bool false
|
|
||||||
|
|
||||||
if [[ "$dry_run" == false ]]; then
|
|
||||||
echo "Preferences saved. Log out and back in if changes are not visible."
|
|
||||||
fi
|
|
||||||
@@ -18,27 +18,6 @@ function enable_session_restore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
enable_session_restore
|
enable_session_restore
|
||||||
|
|
||||||
if [ -n "$HYPRLAND_INSTANCE_SIGNATURE" ]; then
|
|
||||||
brave-browser --restore-last-session &
|
|
||||||
|
|
||||||
# Signal starts after Brave and can steal focus while its window is mapping.
|
|
||||||
# Wait for both startup windows, then make Brave the final focused window.
|
|
||||||
for _ in {1..80}; do
|
|
||||||
sleep 0.25
|
|
||||||
if hyprctl clients -j | jq -e '
|
|
||||||
any(.[]; .class == "brave-browser") and
|
|
||||||
any(.[]; .class == "org.signal.Signal")
|
|
||||||
' > /dev/null; then
|
|
||||||
sleep 0.5
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
hyprctl eval \
|
|
||||||
'hl.dispatch(hl.dsp.focus({ workspace = "1" }))' > /dev/null
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
i3-msg 'workspace 9; append_layout ~/.config/i3/brave-workspace-9.json; workspace 5'
|
i3-msg 'workspace 9; append_layout ~/.config/i3/brave-workspace-9.json; workspace 5'
|
||||||
brave-browser --restore-last-session &
|
brave-browser --restore-last-session &
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,8 @@ function dnfUpdate {
|
|||||||
function aptUpdate {
|
function aptUpdate {
|
||||||
if command -v apt &> /dev/null; then
|
if command -v apt &> /dev/null; then
|
||||||
echo Updating APT...
|
echo Updating APT...
|
||||||
sudo apt update && sudo apt upgrade
|
sudo apt update
|
||||||
|
sudo apt upgrade
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,31 +31,22 @@ function aptUpdate {
|
|||||||
function flatpakUpdate {
|
function flatpakUpdate {
|
||||||
if command -v flatpak &> /dev/null; then
|
if command -v flatpak &> /dev/null; then
|
||||||
echo Updating Flatpak...
|
echo Updating Flatpak...
|
||||||
flatpak uninstall --unused && flatpak update
|
flatpak uninstall --unused
|
||||||
|
flatpak update
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Appimage Updater
|
# Appimage Updater
|
||||||
function appimageUpdate {
|
function appimageUpdate {
|
||||||
if command -v am &> /dev/null; then
|
|
||||||
echo Updating AppImages...
|
|
||||||
am update
|
am update
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Homebrew Updater
|
|
||||||
function brewUpdate {
|
|
||||||
if command -v brew &> /dev/null; then
|
|
||||||
echo Updating Homebrew...
|
|
||||||
brew update && brew upgrade
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Pass Repository Updater
|
# Pass Repository Updater
|
||||||
function passUpdate {
|
function passUpdate {
|
||||||
if [ -d "$HOME/.password-store/.git" ] && [ -d "$HOME/.password-store" ]; then
|
if [ -d "$HOME/.password-store/.git" ] && [ -d "$HOME/.password-store" ]; then
|
||||||
echo Updating pass repository...
|
echo Updating pass repository...
|
||||||
git -C "$HOME/.password-store" pull
|
cd "$HOME/.password-store"
|
||||||
|
git pull
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,28 +72,16 @@ function manualUpdate {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
update_failed=0
|
chezmoiUpdate
|
||||||
|
echo ''
|
||||||
|
dnfUpdate
|
||||||
|
aptUpdate
|
||||||
|
echo ''
|
||||||
|
flatpakUpdate
|
||||||
|
echo ''
|
||||||
|
appimageUpdate
|
||||||
|
echo ''
|
||||||
|
manualUpdate
|
||||||
|
echo ''
|
||||||
|
passUpdate
|
||||||
|
|
||||||
# Report failures while allowing the remaining updaters to run.
|
|
||||||
function run_updater {
|
|
||||||
if ! "$1"; then
|
|
||||||
echo "Updater failed: $1" >&2
|
|
||||||
update_failed=1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
run_updater chezmoiUpdate
|
|
||||||
echo ''
|
|
||||||
run_updater brewUpdate
|
|
||||||
run_updater dnfUpdate
|
|
||||||
run_updater aptUpdate
|
|
||||||
echo ''
|
|
||||||
run_updater flatpakUpdate
|
|
||||||
echo ''
|
|
||||||
run_updater appimageUpdate
|
|
||||||
echo ''
|
|
||||||
run_updater manualUpdate
|
|
||||||
echo ''
|
|
||||||
run_updater passUpdate
|
|
||||||
|
|
||||||
exit "$update_failed"
|
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import datetime as dt
|
|||||||
import re
|
import re
|
||||||
import operator
|
import operator
|
||||||
import os
|
import os
|
||||||
import shlex
|
|
||||||
import sys
|
import sys
|
||||||
import tbapy
|
import tbapy
|
||||||
from todoist_api_python.api import TodoistAPI
|
from todoist_api_python.api import TodoistAPI
|
||||||
@@ -106,7 +105,7 @@ configParser.read_string(configString)
|
|||||||
|
|
||||||
# Load needed credentials
|
# Load needed credentials
|
||||||
tbaKey = configParser.get('Settings', 'TBAKey')
|
tbaKey = configParser.get('Settings', 'TBAKey')
|
||||||
todoistToken = shlex.split(configParser.get('Settings', 'TodoistToken'))[0]
|
todoistToken = configParser.get('Settings', 'TodoistToken')
|
||||||
|
|
||||||
# Setup Todoist
|
# Setup Todoist
|
||||||
api = TodoistAPI(todoistToken)
|
api = TodoistAPI(todoistToken)
|
||||||
|
|||||||
@@ -3,4 +3,4 @@
|
|||||||
# Import library
|
# Import library
|
||||||
source $(dirname ${BASH_SOURCE[0]})/install-lib.sh
|
source $(dirname ${BASH_SOURCE[0]})/install-lib.sh
|
||||||
|
|
||||||
sudo $(packageManager) install sway waybar quickshell rofi mako alacritty brightnessctl
|
sudo $(packageManager) install sway waybar rofi mako alacritty
|
||||||
|
|||||||
@@ -5,8 +5,9 @@ pass git pull
|
|||||||
|
|
||||||
# Desktop
|
# Desktop
|
||||||
~/bin/connect-nas.sh
|
~/bin/connect-nas.sh
|
||||||
~/bin/desktop/quickshell-start.sh
|
systemctl --user start polybar
|
||||||
systemctl --user restart streamdeck
|
systemctl --user restart streamdeck
|
||||||
|
waybar &
|
||||||
/usr/libexec/polkit-gnome-authentication-agent-1 &
|
/usr/libexec/polkit-gnome-authentication-agent-1 &
|
||||||
|
|
||||||
# Keyring
|
# Keyring
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
# Shared command-line tools
|
|
||||||
brew "chezmoi"
|
|
||||||
brew "git"
|
|
||||||
brew "emacs"
|
|
||||||
brew "python"
|
|
||||||
brew "jq"
|
|
||||||
|
|
||||||
# Password-store secrets used by chezmoi templates
|
|
||||||
brew "pass"
|
|
||||||
brew "gnupg"
|
|
||||||
|
|
||||||
# Web browser
|
|
||||||
cask "brave-browser"
|
|
||||||
|
|
||||||
# Nextcloud file sync
|
|
||||||
cask "nextcloud"
|
|
||||||
|
|
||||||
# Gaming
|
|
||||||
cask "steam"
|
|
||||||
|
|
||||||
# 3D printing
|
|
||||||
cask "orcaslicer"
|
|
||||||
|
|
||||||
# Logitech mouse configuration
|
|
||||||
cask "logi-options+"
|
|
||||||
|
|
||||||
# Terminal and font used by the shared Alacritty configuration
|
|
||||||
cask "alacritty"
|
|
||||||
cask "font-inconsolata"
|
|
||||||
|
|
||||||
# Focus and raise windows when hovering
|
|
||||||
tap "dimentium/autoraise"
|
|
||||||
brew "dimentium/autoraise/autoraise"
|
|
||||||
|
|
||||||
# Optional tools for audio conversion and local AI
|
|
||||||
# brew "ffmpeg"
|
|
||||||
# brew "ollama"
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
# Focus and raise on hover without an intentional delay; never warp the cursor.
|
|
||||||
pollMillis=50
|
|
||||||
delay=1
|
|
||||||
requireMouseStop=true
|
|
||||||
warpX=0
|
|
||||||
warpY=0
|
|
||||||
# Hold Control to temporarily suspend hover focus.
|
|
||||||
disableKey=control
|
|
||||||
# Do not steal focus during authentication or screenshot selection.
|
|
||||||
stayFocusedBundleIds="com.apple.SecurityAgent,com.apple.screencaptureui"
|
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
$mainMod = SUPER
|
||||||
|
|
||||||
|
# Keybindings
|
||||||
|
bind = $mainMod, return, exec, $terminal
|
||||||
|
bind = $mainMod, Q, killactive,
|
||||||
|
bind = $mainMod, E, exec, $fileManager
|
||||||
|
bind = $mainMod, V, togglefloating,
|
||||||
|
bind = $mainMod, D, exec, $menu
|
||||||
|
bind = $mainMod, P, pseudo, # dwindle
|
||||||
|
bind = $mainMod, J, togglesplit, # dwindle
|
||||||
|
bind = $mainMod, L, exec, hyprlock
|
||||||
|
bind = $mainMod, F, fullscreen
|
||||||
|
|
||||||
|
# Move focus window
|
||||||
|
bind = $mainMod, left, movefocus, l
|
||||||
|
bind = $mainMod, right, movefocus, r
|
||||||
|
bind = $mainMod, up, movefocus, u
|
||||||
|
bind = $mainMod, down, movefocus, d
|
||||||
|
|
||||||
|
# Switch workspaces
|
||||||
|
bind = $mainMod, 1, workspace, 1
|
||||||
|
bind = $mainMod, 2, workspace, 2
|
||||||
|
bind = $mainMod, 3, workspace, 3
|
||||||
|
bind = $mainMod, 4, workspace, 4
|
||||||
|
bind = $mainMod, 5, workspace, 5
|
||||||
|
bind = $mainMod, 6, workspace, 6
|
||||||
|
bind = $mainMod, 7, workspace, 7
|
||||||
|
bind = $mainMod, 8, workspace, 8
|
||||||
|
bind = $mainMod, 9, workspace, 9
|
||||||
|
bind = $mainMod, 0, workspace, 10
|
||||||
|
|
||||||
|
# Move active window to a workspace
|
||||||
|
bind = $mainMod SHIFT, 1, movetoworkspace, 1
|
||||||
|
bind = $mainMod SHIFT, 2, movetoworkspace, 2
|
||||||
|
bind = $mainMod SHIFT, 3, movetoworkspace, 3
|
||||||
|
bind = $mainMod SHIFT, 4, movetoworkspace, 4
|
||||||
|
bind = $mainMod SHIFT, 5, movetoworkspace, 5
|
||||||
|
bind = $mainMod SHIFT, 6, movetoworkspace, 6
|
||||||
|
bind = $mainMod SHIFT, 7, movetoworkspace, 7
|
||||||
|
bind = $mainMod SHIFT, 8, movetoworkspace, 8
|
||||||
|
bind = $mainMod SHIFT, 9, movetoworkspace, 9
|
||||||
|
bind = $mainMod SHIFT, 0, movetoworkspace, 10
|
||||||
|
|
||||||
|
# Scroll through existing workspaces with mainMod + scroll
|
||||||
|
bind = $mainMod, mouse_down, workspace, e+1
|
||||||
|
bind = $mainMod, mouse_up, workspace, e-1
|
||||||
|
|
||||||
|
# Move/resize windows with mainMod + LMB/RMB and dragging
|
||||||
|
bindm = $mainMod, mouse:272, movewindow
|
||||||
|
bindm = $mainMod, mouse:273, resizewindow
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
local programs = require("env")
|
|
||||||
local main_mod = "SUPER"
|
|
||||||
|
|
||||||
hl.bind(main_mod .. " + return", hl.dsp.exec_cmd(programs.terminal))
|
|
||||||
hl.bind(main_mod .. " + Q", hl.dsp.window.close())
|
|
||||||
hl.bind(main_mod .. " + E", hl.dsp.exec_cmd(programs.file_manager))
|
|
||||||
hl.bind(main_mod .. " + V", hl.dsp.window.float({ action = "toggle" }))
|
|
||||||
hl.bind(main_mod .. " + D", hl.dsp.exec_cmd(programs.menu))
|
|
||||||
hl.bind(main_mod .. " + P", hl.dsp.window.pseudo())
|
|
||||||
hl.bind(main_mod .. " + J", hl.dsp.layout("togglesplit"))
|
|
||||||
hl.bind(main_mod .. " + L", hl.dsp.exec_cmd("hyprlock"))
|
|
||||||
hl.bind(main_mod .. " + F", hl.dsp.window.fullscreen())
|
|
||||||
|
|
||||||
hl.bind(main_mod .. " + left", hl.dsp.focus({ direction = "left" }))
|
|
||||||
hl.bind(main_mod .. " + right", hl.dsp.focus({ direction = "right" }))
|
|
||||||
hl.bind(main_mod .. " + up", hl.dsp.focus({ direction = "up" }))
|
|
||||||
hl.bind(main_mod .. " + down", hl.dsp.focus({ direction = "down" }))
|
|
||||||
|
|
||||||
for workspace = 1, 10 do
|
|
||||||
local key = workspace % 10
|
|
||||||
hl.bind(main_mod .. " + " .. key, hl.dsp.focus({ workspace = workspace }))
|
|
||||||
hl.bind(main_mod .. " + SHIFT + " .. key, hl.dsp.window.move({ workspace = workspace }))
|
|
||||||
end
|
|
||||||
|
|
||||||
hl.bind(main_mod .. " + mouse_down", hl.dsp.focus({ workspace = "e+1" }))
|
|
||||||
hl.bind(main_mod .. " + mouse_up", hl.dsp.focus({ workspace = "e-1" }))
|
|
||||||
|
|
||||||
hl.bind(main_mod .. " + mouse:272", hl.dsp.window.drag(), { mouse = true })
|
|
||||||
hl.bind(main_mod .. " + mouse:273", hl.dsp.window.resize(), { mouse = true })
|
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# Screen brightness controls
|
||||||
|
exec-once = light -N 1
|
||||||
|
bind = ,XF86MonBrightnessUp, exec, ~/bin/system/backlight-ctl.sh -i
|
||||||
|
bind = ,XF86MonBrightnessDown, exec, ~/bin/system/backlight-ctl.sh -d
|
||||||
|
|
||||||
|
# Pulse Audio controls
|
||||||
|
bind = ,XF86AudioRaiseVolume, exec, amixer set Master 3%+ #increase sound volume
|
||||||
|
bind = ,XF86AudioLowerVolume, exec, amixer set Master 3%- #decrease sound volume
|
||||||
|
bind = ,XF86AudioMute, exec, amixer set Master toggle # toggle sound
|
||||||
|
|
||||||
|
# Media controls
|
||||||
|
bind = ,XF86AudioPrev, exec, playerctl previous
|
||||||
|
bind = ,XF86AudioPlay, exec, playerctl play-pause
|
||||||
|
bind = ,XF86AudioNext, exec, playerctl next
|
||||||
|
|
||||||
|
# Lockscreen
|
||||||
|
bind = $mainMod, escape, exec, swaylock
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
local main_mod = "SUPER"
|
|
||||||
|
|
||||||
hl.on("hyprland.start", function()
|
|
||||||
hl.exec_cmd("light -N 1")
|
|
||||||
end)
|
|
||||||
|
|
||||||
hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("~/bin/system/backlight-ctl.sh -i"))
|
|
||||||
hl.bind("XF86MonBrightnessDown", hl.dsp.exec_cmd("~/bin/system/backlight-ctl.sh -d"))
|
|
||||||
|
|
||||||
hl.bind("XF86AudioRaiseVolume", hl.dsp.exec_cmd("amixer set Master 3%+"))
|
|
||||||
hl.bind("XF86AudioLowerVolume", hl.dsp.exec_cmd("amixer set Master 3%-"))
|
|
||||||
hl.bind("XF86AudioMute", hl.dsp.exec_cmd("amixer set Master toggle"))
|
|
||||||
|
|
||||||
hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("playerctl previous"))
|
|
||||||
hl.bind("XF86AudioPlay", hl.dsp.exec_cmd("playerctl play-pause"))
|
|
||||||
hl.bind("XF86AudioNext", hl.dsp.exec_cmd("playerctl next"))
|
|
||||||
|
|
||||||
hl.bind(main_mod .. " + escape", hl.dsp.exec_cmd("swaylock"))
|
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
# Programs
|
||||||
|
$terminal = alacritty
|
||||||
|
$fileManager = dolphin
|
||||||
|
$menu = rofi -show combi
|
||||||
|
$browser = brave-browser
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
hl.env("XCURSOR_SIZE", "24")
|
|
||||||
hl.env("QT_QPA_PLATFORMTHEME", "qt5ct")
|
|
||||||
|
|
||||||
return {
|
|
||||||
terminal = "alacritty",
|
|
||||||
file_manager = "dolphin",
|
|
||||||
menu = "rofi -show combi",
|
|
||||||
browser = "brave-browser",
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
general {
|
||||||
|
gaps_in = 5
|
||||||
|
gaps_out = 5
|
||||||
|
border_size = 2
|
||||||
|
col.active_border = rgba(e91e63ee) rgba(ffcdd2ee) 45deg
|
||||||
|
col.inactive_border = rgba(0288d1aa)
|
||||||
|
layout = dwindle
|
||||||
|
allow_tearing = false
|
||||||
|
}
|
||||||
|
|
||||||
|
decoration {
|
||||||
|
rounding = 5
|
||||||
|
|
||||||
|
blur {
|
||||||
|
enabled = true
|
||||||
|
size = 3
|
||||||
|
passes = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
animations {
|
||||||
|
enabled = yes
|
||||||
|
bezier = myBezier, 0.05, 0.9, 0.1, 1.05
|
||||||
|
animation = windows, 1, 3, myBezier
|
||||||
|
animation = windowsOut, 1, 7, default, popin 80%
|
||||||
|
animation = border, 1, 10, default
|
||||||
|
animation = borderangle, 1, 8, default
|
||||||
|
animation = fade, 1, 7, default
|
||||||
|
animation = workspaces, 1, 2, default
|
||||||
|
}
|
||||||
|
|
||||||
|
dwindle {
|
||||||
|
pseudotile = yes
|
||||||
|
preserve_split = yes
|
||||||
|
force_split = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
master {
|
||||||
|
orientation = right
|
||||||
|
}
|
||||||
|
|
||||||
|
gesture = 3, horizontal, workspace
|
||||||
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
hl.config({
|
|
||||||
general = {
|
|
||||||
gaps_in = 5,
|
|
||||||
gaps_out = 5,
|
|
||||||
border_size = 2,
|
|
||||||
col = {
|
|
||||||
active_border = {
|
|
||||||
colors = { "rgba(e91e63ee)", "rgba(ffcdd2ee)" },
|
|
||||||
angle = 45,
|
|
||||||
},
|
|
||||||
inactive_border = "rgba(0288d1aa)",
|
|
||||||
},
|
|
||||||
layout = "dwindle",
|
|
||||||
allow_tearing = false,
|
|
||||||
},
|
|
||||||
|
|
||||||
decoration = {
|
|
||||||
rounding = 5,
|
|
||||||
blur = {
|
|
||||||
enabled = true,
|
|
||||||
size = 3,
|
|
||||||
passes = 1,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
animations = {
|
|
||||||
enabled = true,
|
|
||||||
},
|
|
||||||
|
|
||||||
dwindle = {
|
|
||||||
preserve_split = true,
|
|
||||||
force_split = 2,
|
|
||||||
},
|
|
||||||
|
|
||||||
master = {
|
|
||||||
orientation = "right",
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
hl.curve("myBezier", {
|
|
||||||
type = "bezier",
|
|
||||||
points = { { 0.05, 0.9 }, { 0.1, 1.05 } },
|
|
||||||
})
|
|
||||||
|
|
||||||
hl.animation({ leaf = "windows", enabled = true, speed = 3, bezier = "myBezier" })
|
|
||||||
hl.animation({ leaf = "windowsOut", enabled = true, speed = 7, bezier = "default", style = "popin 80%" })
|
|
||||||
hl.animation({ leaf = "border", enabled = true, speed = 10, bezier = "default" })
|
|
||||||
hl.animation({ leaf = "borderangle", enabled = true, speed = 8, bezier = "default" })
|
|
||||||
hl.animation({ leaf = "fade", enabled = true, speed = 7, bezier = "default" })
|
|
||||||
hl.animation({ leaf = "workspaces", enabled = true, speed = 2, bezier = "default" })
|
|
||||||
|
|
||||||
hl.gesture({
|
|
||||||
fingers = 3,
|
|
||||||
direction = "horizontal",
|
|
||||||
action = "workspace",
|
|
||||||
})
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
general {
|
|
||||||
lock_cmd = pidof hyprlock || hyprlock
|
|
||||||
before_sleep_cmd = loginctl lock-session
|
|
||||||
after_sleep_cmd = hyprctl dispatch dpms on
|
|
||||||
}
|
|
||||||
|
|
||||||
listener {
|
|
||||||
timeout = 300
|
|
||||||
on-timeout = loginctl lock-session
|
|
||||||
}
|
|
||||||
|
|
||||||
listener {
|
|
||||||
timeout = 600
|
|
||||||
on-timeout = hyprctl dispatch dpms off
|
|
||||||
on-resume = hyprctl dispatch dpms on
|
|
||||||
}
|
|
||||||
|
|
||||||
listener {
|
|
||||||
timeout = 1200
|
|
||||||
on-timeout = sh -c 'test "$(cat /sys/class/power_supply/ACAD/online)" = 0 && systemctl suspend'
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
monitor=eDP-1,2256x1504@60,auto,1.175
|
||||||
|
|
||||||
|
# Enviroment
|
||||||
|
source = ~/.config/hypr/env.conf
|
||||||
|
|
||||||
|
# Startup programs
|
||||||
|
source = ~/.config/hypr/startup-all.conf
|
||||||
|
source = ~/.config/hypr/startup-framework.conf
|
||||||
|
|
||||||
|
# Default env vars
|
||||||
|
env = XCURSOR_SIZE,24
|
||||||
|
env = QT_QPA_PLATFORMTHEME,qt5ct
|
||||||
|
|
||||||
|
source = ~/.config/hypr/general.conf
|
||||||
|
|
||||||
|
input {
|
||||||
|
kb_layout = us
|
||||||
|
kb_variant =
|
||||||
|
kb_model =
|
||||||
|
kb_options =
|
||||||
|
kb_rules =
|
||||||
|
follow_mouse = 1
|
||||||
|
touchpad {
|
||||||
|
natural_scroll = yes
|
||||||
|
}
|
||||||
|
sensitivity = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
xwayland {
|
||||||
|
force_zero_scaling = true
|
||||||
|
}
|
||||||
|
|
||||||
|
misc {
|
||||||
|
force_default_wallpaper = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
windowrulev2 = suppressevent maximize, class:.*
|
||||||
|
|
||||||
|
source = ~/.config/hypr/bind-all.conf
|
||||||
|
source = ~/.config/hypr/bind-framework.conf
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
hl.monitor({
|
|
||||||
output = "eDP-1",
|
|
||||||
mode = "2256x1504@60",
|
|
||||||
position = "auto",
|
|
||||||
scale = 1.175,
|
|
||||||
})
|
|
||||||
|
|
||||||
require("env")
|
|
||||||
|
|
||||||
require("startup-all")
|
|
||||||
require("startup-framework")
|
|
||||||
|
|
||||||
require("general")
|
|
||||||
|
|
||||||
hl.config({
|
|
||||||
input = {
|
|
||||||
kb_layout = "us",
|
|
||||||
kb_variant = "",
|
|
||||||
kb_model = "",
|
|
||||||
kb_options = "",
|
|
||||||
kb_rules = "",
|
|
||||||
follow_mouse = 1,
|
|
||||||
touchpad = {
|
|
||||||
natural_scroll = true,
|
|
||||||
},
|
|
||||||
sensitivity = 0,
|
|
||||||
},
|
|
||||||
|
|
||||||
xwayland = {
|
|
||||||
force_zero_scaling = true,
|
|
||||||
},
|
|
||||||
|
|
||||||
misc = {
|
|
||||||
force_default_wallpaper = 0,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
hl.window_rule({
|
|
||||||
name = "suppress-maximize-events",
|
|
||||||
match = { class = ".*" },
|
|
||||||
suppress_event = "maximize",
|
|
||||||
})
|
|
||||||
|
|
||||||
hl.window_rule({
|
|
||||||
name = "signal-workspace",
|
|
||||||
match = { class = "^org\\.signal\\.Signal$" },
|
|
||||||
workspace = "10",
|
|
||||||
})
|
|
||||||
|
|
||||||
require("bind-all")
|
|
||||||
require("bind-framework")
|
|
||||||
@@ -1,99 +1,76 @@
|
|||||||
auth {
|
|
||||||
pam {
|
|
||||||
module = password-auth
|
|
||||||
}
|
|
||||||
|
|
||||||
fingerprint {
|
|
||||||
enabled = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
background {
|
background {
|
||||||
monitor =
|
monitor =
|
||||||
path = $HOME/Pictures/wallpaper/0000.jpg
|
path = $HOME/.cache/blurred_wallpaper.png
|
||||||
blur_size = 2
|
|
||||||
blur_passes = 1
|
|
||||||
noise = 0.01
|
|
||||||
contrast = 1.08
|
|
||||||
brightness = 0.68
|
|
||||||
vibrancy = 0.22
|
|
||||||
vibrancy_darkness = 0.15
|
|
||||||
}
|
|
||||||
|
|
||||||
label {
|
|
||||||
monitor =
|
|
||||||
text = cmd[update:1000] date +"%H:%M"
|
|
||||||
color = rgb(9DEBFF)
|
|
||||||
font_size = 104
|
|
||||||
font_family = Noto Sans Mono
|
|
||||||
position = 0, 230
|
|
||||||
halign = center
|
|
||||||
valign = center
|
|
||||||
shadow_passes = 3
|
|
||||||
shadow_size = 10
|
|
||||||
shadow_color = rgba(00D9FF55)
|
|
||||||
}
|
|
||||||
|
|
||||||
shape {
|
|
||||||
monitor =
|
|
||||||
size = 460, 2
|
|
||||||
color = rgb(00D9FF)
|
|
||||||
position = 0, 152
|
|
||||||
halign = center
|
|
||||||
valign = center
|
|
||||||
}
|
|
||||||
|
|
||||||
shape {
|
|
||||||
monitor =
|
|
||||||
size = 110, 2
|
|
||||||
color = rgb(FF2A9D)
|
|
||||||
position = 285, 152
|
|
||||||
halign = center
|
|
||||||
valign = center
|
|
||||||
}
|
|
||||||
|
|
||||||
label {
|
|
||||||
monitor =
|
|
||||||
text = // $USER
|
|
||||||
color = rgb(FF5CB8)
|
|
||||||
font_size = 18
|
|
||||||
font_family = Noto Sans Mono
|
|
||||||
position = 0, 112
|
|
||||||
halign = center
|
|
||||||
valign = center
|
|
||||||
shadow_passes = 2
|
|
||||||
shadow_size = 7
|
|
||||||
shadow_color = rgba(FF2A9D66)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
input-field {
|
input-field {
|
||||||
monitor =
|
monitor =
|
||||||
size = 340, 54
|
size = 200, 50
|
||||||
outline_thickness = 2
|
outline_thickness = 3
|
||||||
dots_size = 0.22
|
dots_size = 0.33 # Scale of input-field height, 0.2 - 0.8
|
||||||
dots_spacing = 0.3
|
dots_spacing = 0.15 # Scale of dots' absolute size, 0.0 - 1.0
|
||||||
dots_center = true
|
dots_center = true
|
||||||
dots_rounding = -1
|
dots_rounding = -1 # -1 default circle, -2 follow input-field rounding
|
||||||
outer_color = rgb(00D9FF)
|
outer_color = rgb(151515)
|
||||||
inner_color = rgba(3, 7, 18, 0.82)
|
inner_color = rgb(FFFFFF)
|
||||||
font_color = rgb(FF5CB8)
|
font_color = rgb(10, 10, 10)
|
||||||
fade_on_empty = true
|
fade_on_empty = true
|
||||||
fade_timeout = 1000
|
fade_timeout = 1000 # Milliseconds before fade_on_empty is triggered.
|
||||||
placeholder_text =
|
placeholder_text = <i>Input Password...</i> # Text rendered in the input box when it's empty.
|
||||||
hide_input = false
|
hide_input = false
|
||||||
rounding = 4
|
rounding = -1 # -1 means complete rounding (circle/oval)
|
||||||
check_color = rgb(FF2A9D)
|
check_color = rgb(204, 136, 34)
|
||||||
fail_color = rgb(FF2A9D)
|
fail_color = rgb(204, 34, 34) # if authentication failed, changes outer_color and fail message color
|
||||||
fail_text =
|
fail_text = <i>$FAIL <b>($ATTEMPTS)</b></i> # can be set to empty
|
||||||
|
fail_transition = 300 # transition time in ms between normal outer_color and fail_color
|
||||||
capslock_color = -1
|
capslock_color = -1
|
||||||
numlock_color = -1
|
numlock_color = -1
|
||||||
bothlock_color = -1
|
bothlock_color = -1 # when both locks are active. -1 means don't change outer color (same for above)
|
||||||
invert_numlock = false # change color if numlock is off
|
invert_numlock = false # change color if numlock is off
|
||||||
swap_font_color = false # see below
|
swap_font_color = false # see below
|
||||||
position = 0, -35
|
position = 0, -20
|
||||||
|
halign = center
|
||||||
|
valign = center
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
monitor =
|
||||||
|
#clock
|
||||||
|
text = cmd[update:1000] echo "$TIME"
|
||||||
|
color = rgba(200, 200, 200, 1.0)
|
||||||
|
font_size = 55
|
||||||
|
font_family = Fira Semibold
|
||||||
|
position = -100, 70
|
||||||
|
halign = right
|
||||||
|
valign = bottom
|
||||||
|
shadow_passes = 5
|
||||||
|
shadow_size = 10
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
monitor =
|
||||||
|
text = $USER
|
||||||
|
color = rgba(200, 200, 200, 1.0)
|
||||||
|
font_size = 20
|
||||||
|
font_family = Fira Semibold
|
||||||
|
position = -100, 160
|
||||||
|
halign = right
|
||||||
|
valign = bottom
|
||||||
|
shadow_passes = 5
|
||||||
|
shadow_size = 10
|
||||||
|
}
|
||||||
|
|
||||||
|
image {
|
||||||
|
monitor =
|
||||||
|
path = $HOME/.cache/square_wallpaper.png
|
||||||
|
size = 280 # lesser side if not 1:1 ratio
|
||||||
|
rounding = -1 # negative values mean circle
|
||||||
|
border_size = 4
|
||||||
|
border_color = rgb(221, 221, 221)
|
||||||
|
rotate = 0 # degrees, counter-clockwise
|
||||||
|
reload_time = -1 # seconds between reloading, 0 to reload with SIGUSR2
|
||||||
|
# reload_cmd = # command to get new path. if empty, old path will be used. don't run "follow" commands like tail -F
|
||||||
|
position = 0, 200
|
||||||
halign = center
|
halign = center
|
||||||
valign = center
|
valign = center
|
||||||
shadow_passes = 3
|
|
||||||
shadow_size = 10
|
|
||||||
shadow_color = rgba(00D9FF55)
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
# Password manager update
|
||||||
|
exec-once = pass git pull
|
||||||
|
|
||||||
|
# Start up script
|
||||||
|
exec-once = ~/bin/system/system-start.sh
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
hl.on("hyprland.start", function()
|
|
||||||
hl.exec_cmd("swaybg --image ~/Pictures/wallpaper/0000.jpg --mode fill")
|
|
||||||
hl.exec_cmd("pass git pull")
|
|
||||||
hl.exec_cmd("~/bin/system/system-start.sh")
|
|
||||||
hl.exec_cmd("hypridle")
|
|
||||||
end)
|
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
exec-once = [workspace 1 silent] $browser
|
||||||
|
exec-once = [workspace 2 silent] $terminal
|
||||||
|
exec-once = [workspace 10 silent] flatpak run org.signal.Signal
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
local programs = require("env")
|
|
||||||
|
|
||||||
hl.on("hyprland.start", function()
|
|
||||||
hl.exec_cmd("~/bin/start-brave.sh", { workspace = "1 silent" })
|
|
||||||
hl.exec_cmd(programs.terminal, { workspace = "2 silent" })
|
|
||||||
hl.exec_cmd("flatpak run org.signal.Signal", { workspace = "10 silent" })
|
|
||||||
end)
|
|
||||||
@@ -224,8 +224,7 @@ for_window [class="^Bitwig Studio$" title="^Bitwig Studio"] exec sh ~/bin/audio/
|
|||||||
for_window [class="^Bitwig Studio$" title="^Bitwig Studio"] exec systemctl --user restart i3wm-close-window.service
|
for_window [class="^Bitwig Studio$" title="^Bitwig Studio"] exec systemctl --user restart i3wm-close-window.service
|
||||||
|
|
||||||
#Other
|
#Other
|
||||||
for_window [class="Signal"] move to workspace $wsSignal; urgent disable
|
for_window [class="Signal"] move to workspace $wsSignal
|
||||||
for_window [class="^Brick$"] move to workspace $ws2
|
|
||||||
|
|
||||||
#bindsym $mod+F5 gaps inner current set 0; gaps outer current set 0
|
#bindsym $mod+F5 gaps inner current set 0; gaps outer current set 0
|
||||||
#bindsym $mod+F6 gaps inner current set $inner; gaps outer current set $outer
|
#bindsym $mod+F6 gaps inner current set $inner; gaps outer current set $outer
|
||||||
@@ -248,7 +247,7 @@ workspace $wsSignal output DP-2
|
|||||||
workspace $ws9 output HDMI-0
|
workspace $ws9 output HDMI-0
|
||||||
workspace $ws10 output HDMI-0
|
workspace $ws10 output HDMI-0
|
||||||
|
|
||||||
exec --no-startup-id picom --backend glx --daemon
|
exec --no-startup-id compton &
|
||||||
exec --no-startup-id feh --bg-scale ~/Pictures/desktop/0001.jpg &
|
exec --no-startup-id feh --bg-scale ~/Pictures/desktop/0001.jpg &
|
||||||
|
|
||||||
mode "$g13" {
|
mode "$g13" {
|
||||||
@@ -264,7 +263,7 @@ bindsym $mod+F1 mode "$g13"
|
|||||||
exec_always --no-startup-id g13d --config ~/.config/g13/resolve.bind --logo ~/.config/g13/resolve.lpbm &
|
exec_always --no-startup-id g13d --config ~/.config/g13/resolve.bind --logo ~/.config/g13/resolve.lpbm &
|
||||||
|
|
||||||
# Startup programs
|
# Startup programs
|
||||||
exec --no-startup-id flatpak run org.signal.Signal
|
exec --no-startup-id i3-msg "workspace $wsSignal; exec flatpak run org.signal.Signal;"
|
||||||
exec --no-startup-id ~/bin/start-brave.sh
|
exec --no-startup-id ~/bin/start-brave.sh
|
||||||
exec --no-startup-id i3-msg "workspace $ws1; exec alacritty"
|
exec --no-startup-id i3-msg "workspace $ws1; exec alacritty"
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
description: Commit currently staged code in git
|
description: Commit currently staged code in git
|
||||||
mode: all
|
mode: all
|
||||||
model: {{ template "models/small-brain" }}
|
model: "{{ template "models/small-brain" }}"
|
||||||
temperature: 0.1
|
temperature: 0.1
|
||||||
tools:
|
tools:
|
||||||
write: false
|
write: false
|
||||||
|
|||||||
-1519
File diff suppressed because it is too large
Load Diff
@@ -1,5 +0,0 @@
|
|||||||
# Single-quote values and escape embedded single quotes without changing backslashes.
|
|
||||||
computer='{{ .chezmoi.hostname | replace "'" "'\\''" }}'
|
|
||||||
activation_bytes='{{ pass "self-host/token/audible-activation-bytes" | replace "'" "'\\''" }}'
|
|
||||||
AQUAAI_KEY='{{ pass "self-host/token/aquaai" | replace "'" "'\\''" }}'
|
|
||||||
TodoistToken='{{ pass "self-host/token/todoist" | replace "'" "'\\''" }}'
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
import Quickshell
|
|
||||||
|
|
||||||
Block {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
required property var sink
|
|
||||||
required property var source
|
|
||||||
signal detailsRequested(var anchorItem)
|
|
||||||
|
|
||||||
blockColor: sink && sink.audio && sink.audio.muted
|
|
||||||
? Theme.foreground : Theme.primary
|
|
||||||
textColor: sink && sink.audio && sink.audio.muted
|
|
||||||
? Theme.foregroundDark : Theme.foreground
|
|
||||||
interactive: true
|
|
||||||
text: {
|
|
||||||
if (!sink || !sink.audio)
|
|
||||||
return "\uf026";
|
|
||||||
return sink.audio.muted
|
|
||||||
? "\uf026" : "\uf028 " + Math.round(sink.audio.volume * 100) + "%";
|
|
||||||
}
|
|
||||||
secondaryIcon: source && source.audio
|
|
||||||
? (source.audio.muted
|
|
||||||
? "file://" + Quickshell.shellPath("icons/microphone-muted.svg")
|
|
||||||
: "file://" + Quickshell.shellPath("icons/microphone.svg"))
|
|
||||||
: ""
|
|
||||||
secondaryText: source && source.audio
|
|
||||||
? (source.audio.muted ? "OFF"
|
|
||||||
: Math.round(source.audio.volume * 100) + "%")
|
|
||||||
: ""
|
|
||||||
|
|
||||||
onClicked: mouse => {
|
|
||||||
if (mouse.button === Qt.LeftButton)
|
|
||||||
detailsRequested(root);
|
|
||||||
else if (mouse.button === Qt.MiddleButton && sink && sink.audio)
|
|
||||||
sink.audio.muted = !sink.audio.muted;
|
|
||||||
else
|
|
||||||
Quickshell.execDetached(["qjackctl"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
onWheel: wheel => {
|
|
||||||
if (!sink || !sink.audio)
|
|
||||||
return;
|
|
||||||
const change = wheel.angleDelta.y > 0 ? 0.05 : -0.05;
|
|
||||||
sink.audio.volume = Math.max(0, Math.min(1.5,
|
|
||||||
sink.audio.volume + change));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
|
|
||||||
Block {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
required property var service
|
|
||||||
|
|
||||||
visible: service.brightness >= 0
|
|
||||||
blockColor: Theme.secondary
|
|
||||||
interactive: true
|
|
||||||
text: "\uf185 " + service.brightness + "%"
|
|
||||||
onWheel: wheel => {
|
|
||||||
const change = wheel.angleDelta.y > 0 ? "+5%" : "5%-";
|
|
||||||
service.setBrightness(change);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
import Quickshell
|
|
||||||
import Quickshell.Services.Pipewire
|
|
||||||
import Quickshell.Services.UPower
|
|
||||||
|
|
||||||
PanelWindow {
|
|
||||||
id: bar
|
|
||||||
|
|
||||||
property var sink: Pipewire.defaultAudioSink
|
|
||||||
property var source: Pipewire.defaultAudioSource
|
|
||||||
property var battery: UPower.displayDevice
|
|
||||||
property var hardware
|
|
||||||
property bool isWayland: Quickshell.env("XDG_SESSION_TYPE") === "wayland"
|
|
||||||
|| (!Quickshell.env("XDG_SESSION_TYPE") && !!Quickshell.env("WAYLAND_DISPLAY"))
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
top: true
|
|
||||||
left: true
|
|
||||||
right: true
|
|
||||||
}
|
|
||||||
implicitHeight: Theme.barHeight
|
|
||||||
color: Theme.background
|
|
||||||
|
|
||||||
PwObjectTracker {
|
|
||||||
objects: [bar.sink, bar.source]
|
|
||||||
}
|
|
||||||
|
|
||||||
SystemClock {
|
|
||||||
id: clock
|
|
||||||
precision: SystemClock.Seconds
|
|
||||||
}
|
|
||||||
|
|
||||||
DetailPopup {
|
|
||||||
id: detailsPopup
|
|
||||||
hardware: bar.hardware
|
|
||||||
sink: bar.sink
|
|
||||||
source: bar.source
|
|
||||||
battery: bar.battery
|
|
||||||
clock: clock
|
|
||||||
}
|
|
||||||
|
|
||||||
Row {
|
|
||||||
id: leftModules
|
|
||||||
anchors {
|
|
||||||
left: parent.left
|
|
||||||
verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
height: Theme.blockHeight
|
|
||||||
spacing: Theme.moduleSpacing
|
|
||||||
|
|
||||||
Loader {
|
|
||||||
height: parent.height
|
|
||||||
source: bar.isWayland ? "Workspaces.qml" : "I3Workspaces.qml"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Loader {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
width: Math.max(0, Math.min(implicitWidth,
|
|
||||||
parent.width - leftModules.width - rightModules.width - Theme.blockHeight))
|
|
||||||
source: bar.isWayland ? "HyprlandTitle.qml" : "I3Title.qml"
|
|
||||||
}
|
|
||||||
|
|
||||||
Row {
|
|
||||||
id: rightModules
|
|
||||||
anchors {
|
|
||||||
right: parent.right
|
|
||||||
verticalCenter: parent.verticalCenter
|
|
||||||
rightMargin: Theme.moduleSpacing / 2
|
|
||||||
}
|
|
||||||
spacing: Theme.moduleSpacing
|
|
||||||
|
|
||||||
AudioBlock {
|
|
||||||
sink: bar.sink
|
|
||||||
source: bar.source
|
|
||||||
onDetailsRequested: anchorItem => detailsPopup.toggle("audio", anchorItem)
|
|
||||||
}
|
|
||||||
|
|
||||||
Network {
|
|
||||||
service: bar.hardware
|
|
||||||
onDetailsRequested: anchorItem => detailsPopup.toggle("network", anchorItem)
|
|
||||||
}
|
|
||||||
Backlight { service: bar.hardware }
|
|
||||||
|
|
||||||
BatteryBlock {
|
|
||||||
battery: bar.battery
|
|
||||||
onDetailsRequested: anchorItem => detailsPopup.toggle("battery", anchorItem)
|
|
||||||
}
|
|
||||||
|
|
||||||
Tray { barWindow: bar }
|
|
||||||
|
|
||||||
ClockBlock {
|
|
||||||
clock: clock
|
|
||||||
onDetailsRequested: anchorItem => detailsPopup.toggle("clock", anchorItem)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
import Quickshell.Services.UPower
|
|
||||||
|
|
||||||
Block {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
required property var battery
|
|
||||||
property int percentage: battery ? Math.round(battery.percentage * 100) : 0
|
|
||||||
signal detailsRequested(var anchorItem)
|
|
||||||
|
|
||||||
visible: battery && battery.ready && battery.isLaptopBattery
|
|
||||||
interactive: true
|
|
||||||
blockColor: percentage <= 15 && UPower.onBattery
|
|
||||||
? Theme.urgent : UPower.onBattery ? Theme.foreground : Theme.secondary
|
|
||||||
textColor: UPower.onBattery && percentage > 15
|
|
||||||
? Theme.foregroundDark : Theme.foreground
|
|
||||||
text: {
|
|
||||||
if (!UPower.onBattery)
|
|
||||||
return "\uf1e6 " + percentage + "%";
|
|
||||||
if (percentage <= 10) return "\uf244 " + percentage + "%";
|
|
||||||
if (percentage <= 35) return "\uf243 " + percentage + "%";
|
|
||||||
if (percentage <= 60) return "\uf242 " + percentage + "%";
|
|
||||||
if (percentage <= 85) return "\uf241 " + percentage + "%";
|
|
||||||
return "\uf240 " + percentage + "%";
|
|
||||||
}
|
|
||||||
onClicked: detailsRequested(root)
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
import Quickshell.Widgets
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
property color blockColor: Theme.primary
|
|
||||||
property color textColor: Theme.foreground
|
|
||||||
property bool interactive: false
|
|
||||||
property string text: ""
|
|
||||||
property string fontFamily: Theme.iconFontFamily
|
|
||||||
property string secondaryIcon: ""
|
|
||||||
property string secondaryText: ""
|
|
||||||
signal clicked(var mouse)
|
|
||||||
signal doubleClicked(var mouse)
|
|
||||||
signal wheel(var wheel)
|
|
||||||
|
|
||||||
implicitWidth: content.implicitWidth + Theme.contentPadding * 2
|
|
||||||
implicitHeight: Theme.blockHeight
|
|
||||||
color: blockColor
|
|
||||||
|
|
||||||
Row {
|
|
||||||
id: content
|
|
||||||
anchors.centerIn: parent
|
|
||||||
spacing: 7
|
|
||||||
|
|
||||||
Text {
|
|
||||||
text: root.text
|
|
||||||
color: root.textColor
|
|
||||||
font.family: root.fontFamily
|
|
||||||
font.pixelSize: Theme.fontSize
|
|
||||||
}
|
|
||||||
|
|
||||||
IconImage {
|
|
||||||
width: 18
|
|
||||||
height: 18
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
visible: root.secondaryIcon !== ""
|
|
||||||
source: root.secondaryIcon
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
visible: root.secondaryText !== ""
|
|
||||||
text: root.secondaryText
|
|
||||||
color: root.textColor
|
|
||||||
font.family: root.fontFamily
|
|
||||||
font.pixelSize: Theme.fontSize
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
enabled: root.interactive
|
|
||||||
acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton
|
|
||||||
cursorShape: Qt.PointingHandCursor
|
|
||||||
onClicked: mouse => root.clicked(mouse)
|
|
||||||
onDoubleClicked: mouse => root.doubleClicked(mouse)
|
|
||||||
onWheel: wheel => root.wheel(wheel)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
Block {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
required property var clock
|
|
||||||
property bool showSeconds: false
|
|
||||||
signal detailsRequested(var anchorItem)
|
|
||||||
|
|
||||||
function formattedTime() {
|
|
||||||
const date = clock.date;
|
|
||||||
const hour = date.getHours() % 12 || 12;
|
|
||||||
const minute = date.getMinutes().toString().padStart(2, "0");
|
|
||||||
const second = date.getSeconds().toString().padStart(2, "0");
|
|
||||||
return hour + ":" + minute + (showSeconds ? ":" + second : "");
|
|
||||||
}
|
|
||||||
|
|
||||||
interactive: true
|
|
||||||
text: formattedTime()
|
|
||||||
onClicked: detailsRequested(root)
|
|
||||||
onDoubleClicked: showSeconds = !showSeconds
|
|
||||||
}
|
|
||||||
@@ -1,386 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
import Quickshell
|
|
||||||
import Quickshell.Services.UPower
|
|
||||||
|
|
||||||
PopupWindow {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
property var hardware
|
|
||||||
property var sink
|
|
||||||
property var source
|
|
||||||
property var battery
|
|
||||||
property var clock
|
|
||||||
property var anchorItem: null
|
|
||||||
property string page: ""
|
|
||||||
|
|
||||||
function toggle(nextPage, item) {
|
|
||||||
if (visible && page === nextPage) {
|
|
||||||
visible = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
page = nextPage;
|
|
||||||
anchorItem = item;
|
|
||||||
if (page === "network")
|
|
||||||
hardware.refreshWifi();
|
|
||||||
anchor.updateAnchor();
|
|
||||||
visible = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function duration(seconds) {
|
|
||||||
if (seconds <= 0)
|
|
||||||
return "Calculating";
|
|
||||||
const hours = Math.floor(seconds / 3600);
|
|
||||||
const minutes = Math.floor((seconds % 3600) / 60);
|
|
||||||
return hours + "h " + minutes + "m";
|
|
||||||
}
|
|
||||||
|
|
||||||
function batteryState() {
|
|
||||||
switch (battery.state) {
|
|
||||||
case UPowerDeviceState.Charging: return "Charging";
|
|
||||||
case UPowerDeviceState.Discharging: return "Discharging";
|
|
||||||
case UPowerDeviceState.FullyCharged: return "Fully charged";
|
|
||||||
case UPowerDeviceState.Empty: return "Empty";
|
|
||||||
case UPowerDeviceState.PendingCharge: return "Waiting to charge";
|
|
||||||
case UPowerDeviceState.PendingDischarge: return "Waiting to discharge";
|
|
||||||
default: return "Unknown";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
visible: false
|
|
||||||
implicitWidth: Theme.popupWidth
|
|
||||||
implicitHeight: contentLoader.item
|
|
||||||
? contentLoader.item.implicitHeight + Theme.popupPadding * 2 : 100
|
|
||||||
color: "transparent"
|
|
||||||
|
|
||||||
anchor {
|
|
||||||
item: root.anchorItem
|
|
||||||
edges: Edges.Bottom | Edges.Right
|
|
||||||
gravity: Edges.Bottom | Edges.Left
|
|
||||||
margins.top: 4
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
anchors.fill: parent
|
|
||||||
color: Theme.popupBackground
|
|
||||||
|
|
||||||
Loader {
|
|
||||||
id: contentLoader
|
|
||||||
anchors {
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
top: parent.top
|
|
||||||
margins: Theme.popupPadding
|
|
||||||
}
|
|
||||||
sourceComponent: root.page === "clock" ? clockPage
|
|
||||||
: root.page === "audio" ? audioPage
|
|
||||||
: root.page === "network" ? networkPage
|
|
||||||
: batteryPage
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
anchors {
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
bottom: parent.bottom
|
|
||||||
}
|
|
||||||
height: Theme.activeLineWidth
|
|
||||||
color: Theme.accent
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Component {
|
|
||||||
id: clockPage
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: clockContent
|
|
||||||
property date now: root.clock.date
|
|
||||||
property int year: now.getFullYear()
|
|
||||||
property int month: now.getMonth()
|
|
||||||
property int firstDay: new Date(year, month, 1).getDay()
|
|
||||||
property int days: new Date(year, month + 1, 0).getDate()
|
|
||||||
|
|
||||||
implicitWidth: Theme.popupContentWidth
|
|
||||||
implicitHeight: 310
|
|
||||||
|
|
||||||
PopupHeader {
|
|
||||||
width: parent.width
|
|
||||||
text: Qt.formatDateTime(parent.now, "dddd, MMMM d")
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors {
|
|
||||||
horizontalCenter: parent.horizontalCenter
|
|
||||||
top: parent.top
|
|
||||||
topMargin: 40
|
|
||||||
}
|
|
||||||
text: Qt.formatDateTime(parent.now, "h:mm:ss AP")
|
|
||||||
color: Theme.foreground
|
|
||||||
font.family: Theme.fontFamily
|
|
||||||
font.pixelSize: Theme.fontClock
|
|
||||||
}
|
|
||||||
|
|
||||||
Row {
|
|
||||||
anchors {
|
|
||||||
left: parent.left
|
|
||||||
top: parent.top
|
|
||||||
topMargin: 86
|
|
||||||
}
|
|
||||||
spacing: 4
|
|
||||||
|
|
||||||
Repeater {
|
|
||||||
model: ["S", "M", "T", "W", "T", "F", "S"]
|
|
||||||
Text {
|
|
||||||
required property string modelData
|
|
||||||
width: 37
|
|
||||||
text: modelData
|
|
||||||
color: Theme.muted
|
|
||||||
font.family: Theme.fontFamily
|
|
||||||
horizontalAlignment: Text.AlignHCenter
|
|
||||||
font.bold: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Grid {
|
|
||||||
anchors {
|
|
||||||
left: parent.left
|
|
||||||
top: parent.top
|
|
||||||
topMargin: 112
|
|
||||||
}
|
|
||||||
columns: 7
|
|
||||||
spacing: 4
|
|
||||||
|
|
||||||
Repeater {
|
|
||||||
model: 42
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
required property int index
|
|
||||||
property int day: index - clockContent.firstDay + 1
|
|
||||||
property bool today: day === clockContent.now.getDate()
|
|
||||||
|
|
||||||
width: 37
|
|
||||||
height: 29
|
|
||||||
radius: 0
|
|
||||||
color: today ? Theme.primary : "transparent"
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
anchors {
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
bottom: parent.bottom
|
|
||||||
}
|
|
||||||
height: Theme.activeLineWidth
|
|
||||||
visible: parent.today
|
|
||||||
color: Theme.accent
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: parent.day > 0 && parent.day <= clockContent.days
|
|
||||||
? parent.day : ""
|
|
||||||
color: Theme.foreground
|
|
||||||
font.family: Theme.fontFamily
|
|
||||||
font.pixelSize: Theme.fontSmall
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Component {
|
|
||||||
id: audioPage
|
|
||||||
|
|
||||||
Column {
|
|
||||||
width: Theme.popupContentWidth
|
|
||||||
spacing: 12
|
|
||||||
|
|
||||||
PopupHeader {
|
|
||||||
width: parent.width
|
|
||||||
text: "Audio"
|
|
||||||
}
|
|
||||||
|
|
||||||
PopupSlider {
|
|
||||||
width: parent.width
|
|
||||||
label: "Output"
|
|
||||||
value: root.sink && root.sink.audio ? root.sink.audio.volume : 0
|
|
||||||
muted: root.sink && root.sink.audio ? root.sink.audio.muted : false
|
|
||||||
onValueRequested: value => {
|
|
||||||
if (root.sink && root.sink.audio)
|
|
||||||
root.sink.audio.volume = value;
|
|
||||||
}
|
|
||||||
onMuteRequested: {
|
|
||||||
if (root.sink && root.sink.audio)
|
|
||||||
root.sink.audio.muted = !root.sink.audio.muted;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PopupSlider {
|
|
||||||
width: parent.width
|
|
||||||
label: "Microphone"
|
|
||||||
value: root.source && root.source.audio ? root.source.audio.volume : 0
|
|
||||||
muted: root.source && root.source.audio ? root.source.audio.muted : false
|
|
||||||
onValueRequested: value => {
|
|
||||||
if (root.source && root.source.audio)
|
|
||||||
root.source.audio.volume = value;
|
|
||||||
}
|
|
||||||
onMuteRequested: {
|
|
||||||
if (root.source && root.source.audio)
|
|
||||||
root.source.audio.muted = !root.source.audio.muted;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Component {
|
|
||||||
id: networkPage
|
|
||||||
|
|
||||||
Column {
|
|
||||||
width: Theme.popupContentWidth
|
|
||||||
spacing: 10
|
|
||||||
|
|
||||||
PopupHeader {
|
|
||||||
width: parent.width
|
|
||||||
text: "Network"
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
text: "Connected to " + root.hardware.connection
|
|
||||||
color: Theme.foreground
|
|
||||||
font.family: Theme.fontFamily
|
|
||||||
font.pixelSize: Theme.fontBody
|
|
||||||
}
|
|
||||||
|
|
||||||
Column {
|
|
||||||
id: networks
|
|
||||||
width: parent.width
|
|
||||||
spacing: 5
|
|
||||||
|
|
||||||
Repeater {
|
|
||||||
model: root.hardware.wifiNetworks
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
required property var modelData
|
|
||||||
width: networks.width
|
|
||||||
height: 29
|
|
||||||
radius: 0
|
|
||||||
color: modelData.active ? Theme.primary : Theme.background
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
anchors {
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
bottom: parent.bottom
|
|
||||||
}
|
|
||||||
height: Theme.activeLineWidth
|
|
||||||
visible: parent.modelData.active
|
|
||||||
color: Theme.accent
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors {
|
|
||||||
left: parent.left
|
|
||||||
leftMargin: 9
|
|
||||||
verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
width: parent.width - 70
|
|
||||||
elide: Text.ElideRight
|
|
||||||
text: modelData.ssid
|
|
||||||
color: Theme.foreground
|
|
||||||
font.family: Theme.fontFamily
|
|
||||||
font.pixelSize: Theme.fontSmall
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors {
|
|
||||||
right: parent.right
|
|
||||||
rightMargin: 9
|
|
||||||
verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
text: modelData.signal + "%"
|
|
||||||
color: Theme.foreground
|
|
||||||
font.family: Theme.fontFamily
|
|
||||||
font.pixelSize: Theme.fontCaption
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
width: parent.width
|
|
||||||
height: 30
|
|
||||||
radius: 0
|
|
||||||
color: Theme.primary
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: "Open network settings"
|
|
||||||
color: Theme.foreground
|
|
||||||
font.family: Theme.fontFamily
|
|
||||||
font.pixelSize: Theme.fontCaption
|
|
||||||
}
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
cursorShape: Qt.PointingHandCursor
|
|
||||||
onClicked: Quickshell.execDetached(["nm-connection-editor"])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Component {
|
|
||||||
id: batteryPage
|
|
||||||
|
|
||||||
Column {
|
|
||||||
width: Theme.popupContentWidth
|
|
||||||
spacing: 12
|
|
||||||
|
|
||||||
PopupHeader {
|
|
||||||
width: parent.width
|
|
||||||
text: "Battery"
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
text: Math.round(root.battery.percentage * 100) + "% "
|
|
||||||
+ root.batteryState()
|
|
||||||
color: Theme.foreground
|
|
||||||
font.family: Theme.fontFamily
|
|
||||||
font.pixelSize: Theme.fontDisplay
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
width: parent.width
|
|
||||||
height: 8
|
|
||||||
radius: 0
|
|
||||||
color: Theme.track
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
width: parent.width * root.battery.percentage
|
|
||||||
height: parent.height
|
|
||||||
radius: 0
|
|
||||||
color: root.battery.percentage <= 0.15 ? Theme.urgent : Theme.primary
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
text: UPower.onBattery
|
|
||||||
? "Remaining: " + root.duration(root.battery.timeToEmpty)
|
|
||||||
: "Until full: " + root.duration(root.battery.timeToFull)
|
|
||||||
color: Theme.accent
|
|
||||||
font.family: Theme.fontFamily
|
|
||||||
font.pixelSize: Theme.fontBody
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
text: "Rate: " + Math.abs(root.battery.changeRate).toFixed(1) + " W"
|
|
||||||
+ (root.battery.healthSupported
|
|
||||||
? " Health: " + Math.round(root.battery.healthPercentage * 100) + "%"
|
|
||||||
: "")
|
|
||||||
color: Theme.foreground
|
|
||||||
font.family: Theme.fontFamily
|
|
||||||
font.pixelSize: Theme.fontSmall
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,130 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
import Quickshell
|
|
||||||
import Quickshell.Io
|
|
||||||
|
|
||||||
Scope {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
property string connection: "Disconnected"
|
|
||||||
property int brightness: -1
|
|
||||||
property var wifiNetworks: []
|
|
||||||
|
|
||||||
function setBrightness(change) {
|
|
||||||
Quickshell.execDetached(["brightnessctl", "set", change]);
|
|
||||||
}
|
|
||||||
|
|
||||||
function refreshNetwork() {
|
|
||||||
if (!networkQuery.running)
|
|
||||||
networkQuery.running = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function refreshWifi() {
|
|
||||||
if (!wifiQuery.running)
|
|
||||||
wifiQuery.running = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Process {
|
|
||||||
id: networkQuery
|
|
||||||
command: ["nmcli", "-t", "-f", "TYPE,NAME", "connection", "show", "--active"]
|
|
||||||
running: true
|
|
||||||
|
|
||||||
stdout: StdioCollector {
|
|
||||||
onStreamFinished: {
|
|
||||||
const lines = text.trim().split("\n");
|
|
||||||
for (let line of lines) {
|
|
||||||
const separator = line.indexOf(":");
|
|
||||||
const type = line.slice(0, separator);
|
|
||||||
if (type === "802-11-wireless" || type === "wifi") {
|
|
||||||
root.connection = line.slice(separator + 1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (let line of lines) {
|
|
||||||
const separator = line.indexOf(":");
|
|
||||||
const type = line.slice(0, separator);
|
|
||||||
if (type === "802-3-ethernet" || type === "ethernet") {
|
|
||||||
root.connection = line.slice(separator + 1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
root.connection = "Disconnected";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Process {
|
|
||||||
id: networkMonitor
|
|
||||||
command: ["nmcli", "monitor"]
|
|
||||||
running: true
|
|
||||||
|
|
||||||
stdout: SplitParser {
|
|
||||||
onRead: {
|
|
||||||
root.refreshNetwork();
|
|
||||||
if (root.wifiNetworks.length > 0)
|
|
||||||
root.refreshWifi();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onExited: networkRestart.start()
|
|
||||||
}
|
|
||||||
|
|
||||||
Timer {
|
|
||||||
id: networkRestart
|
|
||||||
interval: 1000
|
|
||||||
onTriggered: networkMonitor.running = true
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateBrightness() {
|
|
||||||
if (!brightnessFile.loaded || !maximumBrightnessFile.loaded)
|
|
||||||
return;
|
|
||||||
const current = parseInt(brightnessFile.text().trim());
|
|
||||||
const maximum = parseInt(maximumBrightnessFile.text().trim());
|
|
||||||
root.brightness = maximum > 0 && !isNaN(current)
|
|
||||||
? Math.round(current / maximum * 100) : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
FileView {
|
|
||||||
id: brightnessFile
|
|
||||||
path: "file:///sys/class/backlight/intel_backlight/brightness"
|
|
||||||
watchChanges: true
|
|
||||||
onFileChanged: reload()
|
|
||||||
onLoaded: root.updateBrightness()
|
|
||||||
}
|
|
||||||
|
|
||||||
FileView {
|
|
||||||
id: maximumBrightnessFile
|
|
||||||
path: "file:///sys/class/backlight/intel_backlight/max_brightness"
|
|
||||||
onLoaded: root.updateBrightness()
|
|
||||||
}
|
|
||||||
|
|
||||||
Process {
|
|
||||||
id: wifiQuery
|
|
||||||
command: ["nmcli", "-t", "-f", "IN-USE,SSID,SIGNAL", "device", "wifi", "list", "--rescan", "auto"]
|
|
||||||
|
|
||||||
stdout: StdioCollector {
|
|
||||||
onStreamFinished: {
|
|
||||||
const networks = [];
|
|
||||||
const seen = {};
|
|
||||||
for (let line of text.trim().split("\n")) {
|
|
||||||
const fields = line.split(":");
|
|
||||||
if (fields.length < 3)
|
|
||||||
continue;
|
|
||||||
const active = fields.shift() === "*";
|
|
||||||
const signal = parseInt(fields.pop());
|
|
||||||
const ssid = fields.join(":").replace(/\\:/g, ":");
|
|
||||||
if (!ssid || seen[ssid])
|
|
||||||
continue;
|
|
||||||
seen[ssid] = true;
|
|
||||||
networks.push({
|
|
||||||
"ssid": ssid,
|
|
||||||
"signal": signal,
|
|
||||||
"active": active
|
|
||||||
});
|
|
||||||
if (networks.length >= 8)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
root.wifiNetworks = networks;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
import Quickshell.Hyprland
|
|
||||||
|
|
||||||
Text {
|
|
||||||
elide: Text.ElideRight
|
|
||||||
horizontalAlignment: Text.AlignHCenter
|
|
||||||
text: Hyprland.activeToplevel ? Hyprland.activeToplevel.title : ""
|
|
||||||
color: Theme.foreground
|
|
||||||
font.family: Theme.fontFamily
|
|
||||||
font.pixelSize: Theme.fontSize
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
import Quickshell.I3
|
|
||||||
import Quickshell.Io
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
function focusedTitle(node) {
|
|
||||||
for (const child of (node.nodes || []).concat(node.floating_nodes || [])) {
|
|
||||||
const title = focusedTitle(child);
|
|
||||||
if (title)
|
|
||||||
return title;
|
|
||||||
}
|
|
||||||
return node.focused && node.type === "con" ? node.name || "" : "";
|
|
||||||
}
|
|
||||||
|
|
||||||
elide: Text.ElideRight
|
|
||||||
horizontalAlignment: Text.AlignHCenter
|
|
||||||
color: Theme.foreground
|
|
||||||
font.family: Theme.fontFamily
|
|
||||||
font.pixelSize: Theme.fontSize
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
target: I3
|
|
||||||
function onRawEvent(event) {
|
|
||||||
if ((event.type === "window" || event.type === "workspace") && !treeQuery.running)
|
|
||||||
treeQuery.running = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Process {
|
|
||||||
id: treeQuery
|
|
||||||
command: ["i3-msg", "-t", "get_tree"]
|
|
||||||
running: true
|
|
||||||
|
|
||||||
stdout: StdioCollector {
|
|
||||||
onStreamFinished: root.text = root.focusedTitle(JSON.parse(text))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
import Quickshell.I3
|
|
||||||
|
|
||||||
Row {
|
|
||||||
spacing: 0
|
|
||||||
|
|
||||||
Repeater {
|
|
||||||
model: I3.workspaces
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: workspaceButton
|
|
||||||
|
|
||||||
required property var modelData
|
|
||||||
property bool active: modelData.active
|
|
||||||
|
|
||||||
visible: modelData.number > 0
|
|
||||||
width: visible ? Theme.blockHeight + 2 : 0
|
|
||||||
height: parent.height
|
|
||||||
color: modelData.urgent ? Theme.urgent
|
|
||||||
: active ? Theme.primary : "transparent"
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
anchors {
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
bottom: parent.bottom
|
|
||||||
}
|
|
||||||
height: Theme.activeLineWidth
|
|
||||||
color: workspaceButton.active ? Theme.accent : "transparent"
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: modelData.number === 2 ? "\uf120"
|
|
||||||
: modelData.number === 13 ? "\uf001" : modelData.name
|
|
||||||
color: Theme.foreground
|
|
||||||
font.family: Theme.iconFontFamily
|
|
||||||
font.pixelSize: Theme.fontSize
|
|
||||||
}
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
cursorShape: Qt.PointingHandCursor
|
|
||||||
onClicked: workspaceButton.modelData.activate()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
import Quickshell
|
|
||||||
|
|
||||||
Block {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
required property var service
|
|
||||||
property bool connected: service.connection !== "Disconnected"
|
|
||||||
signal detailsRequested(var anchorItem)
|
|
||||||
|
|
||||||
blockColor: connected ? Theme.secondary : Theme.urgent
|
|
||||||
interactive: true
|
|
||||||
text: connected ? "\uf1eb " + service.connection : "Disconnected !"
|
|
||||||
onClicked: mouse => {
|
|
||||||
if (mouse.button === Qt.LeftButton)
|
|
||||||
detailsRequested(root);
|
|
||||||
else
|
|
||||||
Quickshell.execDetached(["nm-connection-editor"]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
property string text: ""
|
|
||||||
|
|
||||||
implicitHeight: Theme.blockHeight
|
|
||||||
color: Theme.primary
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors {
|
|
||||||
left: parent.left
|
|
||||||
leftMargin: Theme.contentPadding
|
|
||||||
verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
text: root.text
|
|
||||||
color: Theme.foreground
|
|
||||||
font.family: Theme.fontFamily
|
|
||||||
font.pixelSize: Theme.fontSize
|
|
||||||
font.bold: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
property string label: ""
|
|
||||||
property real value: 0
|
|
||||||
property bool muted: false
|
|
||||||
signal valueRequested(real value)
|
|
||||||
signal muteRequested()
|
|
||||||
|
|
||||||
implicitWidth: 280
|
|
||||||
implicitHeight: 58
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors.left: parent.left
|
|
||||||
text: root.label
|
|
||||||
color: Theme.foreground
|
|
||||||
font.family: Theme.fontFamily
|
|
||||||
font.pixelSize: Theme.fontBody
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
anchors {
|
|
||||||
right: parent.right
|
|
||||||
top: parent.top
|
|
||||||
}
|
|
||||||
width: 58
|
|
||||||
height: 24
|
|
||||||
radius: 0
|
|
||||||
color: root.muted ? Theme.urgent : Theme.primary
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: root.muted ? "MUTED" : Math.round(root.value * 100) + "%"
|
|
||||||
color: Theme.foreground
|
|
||||||
font.pixelSize: Theme.fontTiny
|
|
||||||
font.bold: true
|
|
||||||
}
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
cursorShape: Qt.PointingHandCursor
|
|
||||||
onClicked: root.muteRequested()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: track
|
|
||||||
anchors {
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
bottom: parent.bottom
|
|
||||||
}
|
|
||||||
height: 8
|
|
||||||
radius: 0
|
|
||||||
color: Theme.track
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
width: Math.min(parent.width, parent.width * root.value / 1.5)
|
|
||||||
height: parent.height
|
|
||||||
radius: 0
|
|
||||||
color: root.muted ? Theme.urgent : Theme.primary
|
|
||||||
}
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
cursorShape: Qt.PointingHandCursor
|
|
||||||
|
|
||||||
function updateValue(mouse) {
|
|
||||||
root.valueRequested(Math.max(0,
|
|
||||||
Math.min(1.5, mouse.x / width * 1.5)));
|
|
||||||
}
|
|
||||||
|
|
||||||
onPressed: mouse => updateValue(mouse)
|
|
||||||
onPositionChanged: mouse => {
|
|
||||||
if (pressed)
|
|
||||||
updateValue(mouse);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
pragma Singleton
|
|
||||||
|
|
||||||
import QtQuick
|
|
||||||
import Quickshell
|
|
||||||
|
|
||||||
Singleton {
|
|
||||||
readonly property color background: "#80000000"
|
|
||||||
readonly property color popupBackground: "#e0000000"
|
|
||||||
readonly property color primary: "#0288d1"
|
|
||||||
readonly property color secondary: "#2980b9"
|
|
||||||
readonly property color accent: "#b3e5fc"
|
|
||||||
readonly property color urgent: "#e91e63"
|
|
||||||
readonly property color foreground: "#ffffff"
|
|
||||||
readonly property color foregroundDark: "#000000"
|
|
||||||
readonly property color muted: "#7aa6da"
|
|
||||||
readonly property color track: "#40000000"
|
|
||||||
|
|
||||||
readonly property string fontFamily: "SF Pro Display, Helvetica, Arial, sans-serif"
|
|
||||||
readonly property string iconFontFamily: "SF Pro Display, Font Awesome 6 Free"
|
|
||||||
|
|
||||||
readonly property int barHeight: 32
|
|
||||||
readonly property int blockHeight: 32
|
|
||||||
readonly property int fontSize: 18
|
|
||||||
readonly property int fontTiny: 11
|
|
||||||
readonly property int fontCaption: 13
|
|
||||||
readonly property int fontSmall: 14
|
|
||||||
readonly property int fontBody: 15
|
|
||||||
readonly property int fontDisplay: 25
|
|
||||||
readonly property int fontClock: 30
|
|
||||||
readonly property int moduleSpacing: 8
|
|
||||||
readonly property int contentPadding: 10
|
|
||||||
readonly property int activeLineWidth: 3
|
|
||||||
readonly property int popupWidth: 320
|
|
||||||
readonly property int popupPadding: 12
|
|
||||||
readonly property int popupContentWidth: popupWidth - popupPadding * 2
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
import Quickshell.Services.SystemTray
|
|
||||||
import Quickshell.Widgets
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
required property var barWindow
|
|
||||||
|
|
||||||
visible: trayRepeater.count > 0
|
|
||||||
implicitWidth: trayItems.implicitWidth + Theme.contentPadding * 2
|
|
||||||
implicitHeight: Theme.blockHeight
|
|
||||||
color: Theme.primary
|
|
||||||
|
|
||||||
Row {
|
|
||||||
id: trayItems
|
|
||||||
anchors.centerIn: parent
|
|
||||||
spacing: Theme.contentPadding
|
|
||||||
|
|
||||||
Repeater {
|
|
||||||
id: trayRepeater
|
|
||||||
model: SystemTray.items
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: trayItem
|
|
||||||
|
|
||||||
required property var modelData
|
|
||||||
width: 26
|
|
||||||
height: 30
|
|
||||||
|
|
||||||
IconImage {
|
|
||||||
anchors {
|
|
||||||
fill: parent
|
|
||||||
margins: 3
|
|
||||||
}
|
|
||||||
source: trayItem.modelData.icon
|
|
||||||
opacity: trayMouse.containsMouse ? 1 : 0.82
|
|
||||||
|
|
||||||
Behavior on opacity {
|
|
||||||
NumberAnimation { duration: 120 }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
id: trayMouse
|
|
||||||
anchors.fill: parent
|
|
||||||
hoverEnabled: true
|
|
||||||
cursorShape: Qt.PointingHandCursor
|
|
||||||
acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton
|
|
||||||
onClicked: mouse => {
|
|
||||||
if (mouse.button === Qt.MiddleButton) {
|
|
||||||
trayItem.modelData.secondaryActivate();
|
|
||||||
} else if (mouse.button === Qt.RightButton || trayItem.modelData.onlyMenu) {
|
|
||||||
const point = mapToItem(root.barWindow.contentItem, 0, height);
|
|
||||||
trayItem.modelData.display(root.barWindow, point.x, point.y);
|
|
||||||
} else {
|
|
||||||
trayItem.modelData.activate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
onWheel: wheel => trayItem.modelData.scroll(
|
|
||||||
wheel.angleDelta.y, false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
import Quickshell
|
|
||||||
import Quickshell.Hyprland
|
|
||||||
|
|
||||||
Row {
|
|
||||||
spacing: 0
|
|
||||||
|
|
||||||
Repeater {
|
|
||||||
model: Hyprland.workspaces
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: workspaceButton
|
|
||||||
|
|
||||||
required property var modelData
|
|
||||||
property bool active: modelData.active
|
|
||||||
|
|
||||||
visible: modelData.id > 0
|
|
||||||
width: Theme.blockHeight + 2
|
|
||||||
height: parent.height
|
|
||||||
color: modelData.urgent ? Theme.urgent
|
|
||||||
: active ? Theme.primary : "transparent"
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
anchors {
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
bottom: parent.bottom
|
|
||||||
}
|
|
||||||
height: Theme.activeLineWidth
|
|
||||||
color: workspaceButton.active ? Theme.accent : "transparent"
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: modelData.id === 2 ? "\uf120"
|
|
||||||
: modelData.id === 13 ? "\uf001" : modelData.name
|
|
||||||
color: Theme.foreground
|
|
||||||
font.family: Theme.iconFontFamily
|
|
||||||
font.pixelSize: Theme.fontSize
|
|
||||||
}
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
cursorShape: Qt.PointingHandCursor
|
|
||||||
onClicked: Quickshell.execDetached([
|
|
||||||
"hyprctl",
|
|
||||||
"dispatch",
|
|
||||||
"hl.dsp.focus({ workspace = " + workspaceButton.modelData.id + " })"
|
|
||||||
])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<g fill="#ffffff">
|
|
||||||
<path d="M8 1C6.34 1 5 2.34 5 4v4c0 1.66 1.34 3 3 3 .36 0 .7-.07 1.02-.18.04-.45.23-.89.57-1.23.33-.33.77-.54 1.23-.58.11-.32.18-.66.18-1.01V4c0-1.66-1.34-3-3-3zm0 2c.55 0 1 .45 1 1v4c0 .55-.45 1-1 1s-1-.45-1-1V4c0-.55.45-1 1-1zM2 7v1.01c0 2.96 2.16 5.42 5 5.9V16h2v-2.09c.13-.02.25-.05.38-.08a2 2 0 0 1 .21-.24l.41-.42v-.34l-.41-.42a2 2 0 0 1-.15-.16A4.5 4.5 0 0 1 3.5 8.01V7z" opacity=".7"/>
|
|
||||||
<path d="M11 10a1 1 0 0 0-.71 1.71L11.59 13l-1.3 1.29a1 1 0 1 0 1.42 1.42L13 14.41l1.29 1.3a1 1 0 1 0 1.42-1.42L14.41 13l1.3-1.29a1 1 0 1 0-1.42-1.42L13 11.59l-1.29-1.3A1 1 0 0 0 11 10z"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 710 B |
@@ -1,3 +0,0 @@
|
|||||||
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M8 0C6.34 0 5 1.34 5 3v5c0 1.66 1.34 3 3 3s3-1.34 3-3V3c0-1.66-1.34-3-3-3zM2 6v2.01c0 2.96 2.16 5.43 5 5.91V16h2v-2.08c2.84-.48 5-2.94 5-5.91V6h-1.5v2.01c0 2.5-1.99 4.49-4.5 4.49s-4.5-1.99-4.5-4.49V6z" fill="#ffffff"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 321 B |
@@ -1,19 +0,0 @@
|
|||||||
import Quickshell
|
|
||||||
|
|
||||||
ShellRoot {
|
|
||||||
HardwareService {
|
|
||||||
id: hardwareService
|
|
||||||
}
|
|
||||||
|
|
||||||
Variants {
|
|
||||||
model: Quickshell.screens
|
|
||||||
|
|
||||||
Bar {
|
|
||||||
required property var modelData
|
|
||||||
screen: modelData
|
|
||||||
visible: !Quickshell.env("QUICKSHELL_BAR_SCREEN")
|
|
||||||
|| modelData.name === Quickshell.env("QUICKSHELL_BAR_SCREEN")
|
|
||||||
hardware: hardwareService
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
computer={{ .chezmoi.hostname }}
|
||||||
|
activation_bytes={{ pass "self-host/token/audible-activation-bytes" }}
|
||||||
|
AQUAAI_KEY={{ pass "self-host/token/aquaai" }}
|
||||||
|
TodoistToken={{ pass "self-host/token/todoist" }}
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
[Unit]
|
|
||||||
Description=Quickshell desktop bar
|
|
||||||
Documentation=https://quickshell.org/
|
|
||||||
After=graphical-session.target
|
|
||||||
PartOf=graphical-session.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
ExecStart=/usr/bin/qs -c bar --no-duplicate
|
|
||||||
Restart=on-failure
|
|
||||||
RestartSec=2
|
|
||||||
TimeoutStopSec=5
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=graphical-session.target
|
|
||||||
@@ -51,8 +51,7 @@ window#waybar.chromium {
|
|||||||
box-shadow: inset 0 -3px #B3E5FC;
|
box-shadow: inset 0 -3px #B3E5FC;
|
||||||
}
|
}
|
||||||
|
|
||||||
#workspaces button.focused,
|
#workspaces button.focused {
|
||||||
#workspaces button.active {
|
|
||||||
background-color: #0288D1;
|
background-color: #0288D1;
|
||||||
box-shadow: inset 0 -3px #B3E5FC;
|
box-shadow: inset 0 -3px #B3E5FC;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,8 +12,3 @@
|
|||||||
sort = -committerdate
|
sort = -committerdate
|
||||||
[push]
|
[push]
|
||||||
autoSetupRemote = true
|
autoSetupRemote = true
|
||||||
[filter "lfs"]
|
|
||||||
required = true
|
|
||||||
clean = git-lfs clean -- %f
|
|
||||||
smudge = git-lfs smudge -- %f
|
|
||||||
process = git-lfs filter-process
|
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
sh ~/.config/scripts/setup.sh -nr
|
||||||
|
|
||||||
|
# Load user settings from config file.
|
||||||
|
. ~/.config/settings.conf
|
||||||
|
|
||||||
|
if [[ $computer == 'w530' ]]; then
|
||||||
|
if [[ ! $DISPLAY && $XDG_VTNR -eq 1 ]]; then
|
||||||
|
exec startx
|
||||||
|
fi
|
||||||
|
fi
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
{{ if eq .chezmoi.os "darwin" -}}
|
|
||||||
# Initialize Homebrew on Apple Silicon or Intel Macs.
|
|
||||||
if [[ -x /opt/homebrew/bin/brew ]]; then
|
|
||||||
eval "$(/opt/homebrew/bin/brew shellenv)"
|
|
||||||
elif [[ -x /usr/local/bin/brew ]]; then
|
|
||||||
eval "$(/usr/local/bin/brew shellenv)"
|
|
||||||
fi
|
|
||||||
{{ else if eq .chezmoi.os "linux" -}}
|
|
||||||
if [[ -f "$HOME/.config/scripts/setup.sh" ]]; then
|
|
||||||
sh "$HOME/.config/scripts/setup.sh" -nr
|
|
||||||
fi
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
# Load user settings from config file.
|
|
||||||
if [[ -f "$HOME/.config/settings.conf" ]]; then
|
|
||||||
source "$HOME/.config/settings.conf"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{{ if eq .chezmoi.os "linux" -}}
|
|
||||||
if [[ $computer == 'w530' ]]; then
|
|
||||||
if [[ ! $DISPLAY && $XDG_VTNR -eq 1 ]]; then
|
|
||||||
exec startx
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
{{ end -}}
|
|
||||||
@@ -5,45 +5,24 @@ setopt PROMPT_SUBST
|
|||||||
PROMPT='%F{white}%n% @%m%f %F{blue}%~%f %F{red}${vcs_info_msg_0_}%f$ '
|
PROMPT='%F{white}%n% @%m%f %F{blue}%~%f %F{red}${vcs_info_msg_0_}%f$ '
|
||||||
|
|
||||||
setopt appendhistory autocd extendedglob nomatch notify
|
setopt appendhistory autocd extendedglob nomatch notify
|
||||||
setopt hist_ignore_all_dups hist_save_no_dups hist_find_no_dups
|
|
||||||
unsetopt beep
|
unsetopt beep
|
||||||
bindkey -e
|
bindkey -e
|
||||||
zstyle :compinstall filename '~/.zshrc'
|
zstyle :compinstall filename '~/.zshrc'
|
||||||
|
|
||||||
# Keep PATH entries unique when shell configuration is sourced again.
|
|
||||||
typeset -U path PATH
|
|
||||||
|
|
||||||
{{ if eq .chezmoi.os "darwin" -}}
|
|
||||||
# Load Homebrew completions before initializing completion support.
|
|
||||||
typeset -U fpath
|
|
||||||
if [[ -n "$HOMEBREW_PREFIX" && -d "$HOMEBREW_PREFIX/share/zsh/site-functions" ]]; then
|
|
||||||
fpath=("$HOMEBREW_PREFIX/share/zsh/site-functions" $fpath)
|
|
||||||
elif [[ -d /opt/homebrew/share/zsh/site-functions ]]; then
|
|
||||||
fpath=(/opt/homebrew/share/zsh/site-functions $fpath)
|
|
||||||
elif [[ -d /usr/local/share/zsh/site-functions ]]; then
|
|
||||||
fpath=(/usr/local/share/zsh/site-functions $fpath)
|
|
||||||
fi
|
|
||||||
{{ end -}}
|
|
||||||
|
|
||||||
autoload -Uz compinit
|
autoload -Uz compinit
|
||||||
compinit
|
compinit
|
||||||
|
|
||||||
HISTFILE=~/.zsh_history
|
HISTFILE=~/.zsh_history
|
||||||
HISTSIZE=100000
|
HISTSIZE=99999999
|
||||||
SAVEHIST=50000
|
SAVEHIST=99999999
|
||||||
|
|
||||||
if [[ -f "$HOME/.config/settings.conf" ]]; then
|
|
||||||
source "$HOME/.config/settings.conf"
|
source "$HOME/.config/settings.conf"
|
||||||
fi
|
|
||||||
|
|
||||||
# User scripts
|
|
||||||
path=("$HOME/bin" $path)
|
|
||||||
export PATH
|
|
||||||
|
|
||||||
# Text Editor
|
# Text Editor
|
||||||
export EDITOR='emacs -nw'
|
export EDITOR='emacs -nw'
|
||||||
alias emacs="${EDITOR}"
|
alias emacs="${EDITOR}"
|
||||||
alias e="${EDITOR}"
|
alias e="${EDITOR}"
|
||||||
|
export TERM=xterm
|
||||||
|
|
||||||
# Search
|
# Search
|
||||||
alias g='grep -Irn'
|
alias g='grep -Irn'
|
||||||
@@ -57,21 +36,16 @@ alias dote="${DOT_PROGRAM} edit --apply"
|
|||||||
alias dotu="${DOT_PROGRAM} update"
|
alias dotu="${DOT_PROGRAM} update"
|
||||||
|
|
||||||
# Other
|
# Other
|
||||||
{{ if eq .chezmoi.os "darwin" -}}
|
|
||||||
alias i='brew install'
|
|
||||||
alias d='brew'
|
|
||||||
{{ else -}}
|
|
||||||
alias i='sudo dnf install'
|
alias i='sudo dnf install'
|
||||||
alias d='sudo dnf'
|
alias d='sudo dnf'
|
||||||
{{ end -}}
|
alias u='sh ~/bin/update.sh'
|
||||||
alias u='bash ~/bin/update.sh'
|
|
||||||
alias h='cd ~/git/cacolglazier.com/ && hugo server'
|
alias h='cd ~/git/cacolglazier.com/ && hugo server'
|
||||||
|
|
||||||
# OpenCode
|
# OpenCode
|
||||||
path=("$HOME/.opencode/bin" $path)
|
export PATH="$HOME/.opencode/bin:$PATH"
|
||||||
OPENCODE='opencode'
|
OPENCODE='opencode'
|
||||||
alias o="${OPENCODE}"
|
alias o="${OPENCODE}"
|
||||||
alias oc="${OPENCODE} run --agent commit --model '{{ includeTemplate ".chezmoitemplates/models/small-brain" | trim }}' 'Create a commit.'"
|
alias oc="${OPENCODE} --agent commit run 'Create a commit.'"
|
||||||
alias ocr="${OPENCODE} --agent review --prompt 'Code review staged changes.'"
|
alias ocr="${OPENCODE} --agent review --prompt 'Code review staged changes.'"
|
||||||
alias or="${OPENCODE} --continue"
|
alias or="${OPENCODE} --continue"
|
||||||
|
|
||||||
@@ -102,14 +76,11 @@ export AQUAAI_RICH_FORMAT_MODE=false
|
|||||||
export AQUAAI_KEY
|
export AQUAAI_KEY
|
||||||
|
|
||||||
# Daisy build toolkit
|
# Daisy build toolkit
|
||||||
GCC_PATH="$HOME/dev/gcc-arm-none-eabi-10-2020-q4-major/bin"
|
GCC_PATH=~/dev/gcc-arm-none-eabi-10-2020-q4-major/bin
|
||||||
if [[ -d "$GCC_PATH" ]]; then
|
export PATH=$GCC_PATH:$PATH
|
||||||
path=("$GCC_PATH" $path)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# AM auto complete
|
# AM auto complete
|
||||||
if [[ -f "$HOME/.local/share/bash-completion/completions/am" ]]; then
|
|
||||||
autoload bashcompinit
|
autoload bashcompinit
|
||||||
bashcompinit
|
bashcompinit
|
||||||
source "$HOME/.local/share/bash-completion/completions/am"
|
source "/home/aqua/.local/share/bash-completion/completions/am"
|
||||||
fi
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
-----BEGIN PGP MESSAGE-----
|
|
||||||
|
|
||||||
hQGMA4qZwZB4gWrxAQv+IYT0PC4dEdl85V1geFnz+xd7nSSpOdyJ1/0QQQ23zOUw
|
|
||||||
c3sqMRNzzMcSQwHbBOk69QPbF2kW/2W3XsU7qCGnbownr/vaBSrnvx1UxDepd8E3
|
|
||||||
j1XO0n0o24xBXGZi3xnQBPIJCtjlgNvtREslFz3fgBT8M69gDGynuytn3ZlAM4ni
|
|
||||||
BmZjnZsz6JKZ76H+mNJ3n6jYZjCbqPVjKyWBiYDRkpVLHntz/OHQCcHfsHpr8CZ2
|
|
||||||
JgRlqMcwTJGtLVxxZx9eQ6KSkizQvPmy1weqC85NkKkuAENBCUCyh+IJSEpifSyF
|
|
||||||
ewvOljGDSZOjDL553x+POjVGbtK/U/n162La0kLBQQVJwDSRIIJyTu5/ZLWde12F
|
|
||||||
mZNObOq4JJzUBbKJtYqRFl51Po3hcWhcXxaDcay7i/MWEesEnsFaKnbCEhJ7FMUa
|
|
||||||
1+VUQySgU5j9ULxfeaqLYZ2LClA7AGatHt0q1J6UhFSHkBFcmZTjFrlQFjkL2XVu
|
|
||||||
qvptke90iaepRuMHqTUR0sBpAQT4/pqbDep1npJf11hOwf5ICOPRkJ2Y/iIjZKc7
|
|
||||||
+d8akX4RlCUfROqsXykZ+W5a+e8gWcsvLGAaeQxUHZ3goNAutrzux2ye9FcQRI3d
|
|
||||||
pTvu9m/PvoRpYRmx0YgB4VkWVX9Qd9ezderBZIfAcdBfWY8Z1BHPLFyOS/kYoqrv
|
|
||||||
U/yVkFsXGgOfxRAc+r8HhcCHfMLWXwCoLDmKCMYBPca4psl/oVec4KTkG3nNbaXf
|
|
||||||
sZ6zxnXv0WuazEIBZSRKSuaN8iQ50LUKh8oxoyzjqg0U/0LshYruanDVk28YXtnx
|
|
||||||
LTh3jlTAAx6s2VN/ZhJSbnyL2faLfnqwo50GeJQsAt1aI1PZmdbXSB5fthU+XTaW
|
|
||||||
RWjjMOZELZxkibUtlMchSnZP1gMYBP+rNuFy
|
|
||||||
=BfV6
|
|
||||||
-----END PGP MESSAGE-----
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
# Host entries are managed in a separately encrypted file.
|
|
||||||
Include ~/.ssh/config.private
|
|
||||||
@@ -7,6 +7,7 @@ Requires=pipewire.service
|
|||||||
WantedBy=default.target
|
WantedBy=default.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=oneshot
|
||||||
ExecStart=%h/git/audio/snapcast/bin/snapclient --player pipewire
|
RemainAfterExit=true
|
||||||
Restart=on-failure
|
ExecStart=%h/git/audio/snapcast/bin/snapclient
|
||||||
|
ExecStop=killall -q snapclient
|
||||||
Reference in New Issue
Block a user