summaryrefslogtreecommitdiff
path: root/raveos-hyprland-theme/theme-data/hypr
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-hyprland-theme/theme-data/hypr')
-rw-r--r--raveos-hyprland-theme/theme-data/hypr/dms/colors.conf22
-rw-r--r--raveos-hyprland-theme/theme-data/hypr/dms/cursor.conf6
-rw-r--r--raveos-hyprland-theme/theme-data/hypr/dms/layout.conf11
-rw-r--r--raveos-hyprland-theme/theme-data/hypr/dms/windowrules.conf0
-rw-r--r--raveos-hyprland-theme/theme-data/hypr/hyprland.conf154
-rw-r--r--raveos-hyprland-theme/theme-data/hypr/monitors.conf5
-rwxr-xr-xraveos-hyprland-theme/theme-data/hypr/scripts/alt-tab.sh273
-rwxr-xr-xraveos-hyprland-theme/theme-data/hypr/scripts/raveos-monitor-setup.sh100
-rw-r--r--raveos-hyprland-theme/theme-data/hypr/workspaces.conf2
9 files changed, 573 insertions, 0 deletions
diff --git a/raveos-hyprland-theme/theme-data/hypr/dms/colors.conf b/raveos-hyprland-theme/theme-data/hypr/dms/colors.conf
new file mode 100644
index 0000000..16adcd2
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/hypr/dms/colors.conf
@@ -0,0 +1,22 @@
+$primary = rgb(3d7839)
+$outline = rgb(8a9386)
+$error = rgb(f44336)
+
+general {
+ col.active_border = $primary
+ col.inactive_border = $outline
+}
+
+group {
+ col.border_active = $primary
+ col.border_inactive = $outline
+ col.border_locked_active = $error
+ col.border_locked_inactive = $outline
+
+ groupbar {
+ col.active = $primary
+ col.inactive = $outline
+ col.locked_active = $error
+ col.locked_inactive = $outline
+ }
+}
diff --git a/raveos-hyprland-theme/theme-data/hypr/dms/cursor.conf b/raveos-hyprland-theme/theme-data/hypr/dms/cursor.conf
new file mode 100644
index 0000000..1054579
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/hypr/dms/cursor.conf
@@ -0,0 +1,6 @@
+# Auto-generated by DMS - do not edit manually
+
+env = HYPRCURSOR_THEME,default
+env = XCURSOR_THEME,default
+env = HYPRCURSOR_SIZE,24
+env = XCURSOR_SIZE,24
diff --git a/raveos-hyprland-theme/theme-data/hypr/dms/layout.conf b/raveos-hyprland-theme/theme-data/hypr/dms/layout.conf
new file mode 100644
index 0000000..b9a8ad9
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/hypr/dms/layout.conf
@@ -0,0 +1,11 @@
+# Auto-generated by DMS - do not edit manually
+
+general {
+ gaps_in = 4
+ gaps_out = 4
+ border_size = 2
+}
+
+decoration {
+ rounding = 12
+}
diff --git a/raveos-hyprland-theme/theme-data/hypr/dms/windowrules.conf b/raveos-hyprland-theme/theme-data/hypr/dms/windowrules.conf
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/hypr/dms/windowrules.conf
diff --git a/raveos-hyprland-theme/theme-data/hypr/hyprland.conf b/raveos-hyprland-theme/theme-data/hypr/hyprland.conf
new file mode 100644
index 0000000..efdfc7d
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/hypr/hyprland.conf
@@ -0,0 +1,154 @@
+source = ./dms/colors.conf
+
+#
+# ALT TAB#
+#
+bind = SUPER, TAB, exec, hyprswitch gui --mod-key super_l --key tab --close mod-key-release --sort-recent --filter-current-monitor
+
+#
+# MONITORS#
+#
+source = ./monitors.conf
+source = ./workspaces.conf
+
+#
+# MY PROGRAMS#
+#
+$terminal = kitty
+$fileManager = Thunar
+
+#
+# AUTOSTART & ENVIRONMENT#
+#
+exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
+exec-once = dbus-update-activation-environment --systemd --all
+exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
+exec-once = gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'
+exec-once = bash -c "wl-paste --watch cliphist store &"
+exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
+exec-once = sleep 1 && dms run --config ~/.config/dms/
+exec-once = sleep 3 && dms ipc call wallpaper set "/usr/share/backgrounds/raveos/raveos-main-bg.jpeg"
+exec-once = sleep 1 && /usr/lib/pam_kwallet_init
+exec-once = /usr/lib/mate-polkit/polkit-mate-authentication-agent-1
+
+# Theme & VM Fixes
+env = XCURSOR_SIZE,24
+env = HYPRCURSOR_SIZE,24
+env = WLR_NO_HARDWARE_CURSORS,1
+env = WLR_RENDERER_ALLOW_SOFTWARE,1
+env = XDG_CURRENT_DESKTOP,Hyprland
+env = XDG_SESSION_TYPE,wayland
+env = XDG_SESSION_DESKTOP,Hyprland
+env = GDK_BACKEND,wayland
+env = QT_QPA_PLATFORM,wayland
+env = QT_QPA_PLATFORMTHEME,qt6ct
+env = QT_AUTO_SCREEN_SCALE_FACTOR,1
+env = QT_WAYLAND_DISABLE_WINDOWDECORATION,1
+env = QT_STYLE_OVERRIDE,kvantum
+
+#
+# LOOK AND FEEL#
+#
+general {
+ gaps_in = 5
+ gaps_out = 2
+ border_size = 2
+ col.active_border = $primary
+ col.inactive_border = $outline
+ resize_on_border = true
+ layout = dwindle
+}
+
+decoration {
+ rounding = 11
+ active_opacity = 1.0
+ inactive_opacity = 1.0
+ shadow {
+ enabled = false
+ }
+ blur {
+ enabled = true
+ size = 3
+ passes = 1
+ vibrancy = 0.1696
+ }
+}
+
+animations {
+ enabled = yes
+ bezier = easeOutQuint,0.23,1,0.32,1
+ animation = global, 1, 10, default
+ animation = windows, 1, 4.79, easeOutQuint
+ animation = layers, 1, 3.81, easeOutQuint
+ animation = workspaces, 1, 1.94, almostLinear, fade
+}
+
+dwindle {
+ pseudotile = true
+ preserve_split = true
+}
+
+master {
+ new_status = master
+}
+
+misc {
+ force_default_wallpaper = 0
+ disable_hyprland_logo = true
+}
+
+input {
+ kb_layout = gb
+ follow_mouse = 1
+ numlock_by_default = true
+}
+
+cursor {
+ no_warps = true
+}
+
+#
+# KEYBINDINGS#
+#
+$mainMod = SUPER
+bind = $mainMod, Q, killactive,
+bind = $mainMod, M, exit,
+bind = $mainMod, E, exec, nautilus
+bind = $mainMod, V, togglefloating,
+bind = $mainMod, P, pseudo,
+bind = $mainMod, J, togglesplit,
+bind = $mainMod, Return, exec, $terminal
+
+# Move focus with mainMod + arrow keys
+bind = $mainMod, left, movefocus, l
+bind = $mainMod, right, movefocus, r
+bind = $mainMod, up, movefocus, u
+bind = $mainMod, down, movefocus, d
+
+# Switch workspaces with mainMod + [1-9]
+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
+
+# Move active window to a workspace with mainMod + SHIFT + [0-9]
+bind = $mainMod SHIFT, 1, movetoworkspace, 1
+bind = $mainMod SHIFT, 2, movetoworkspace, 2
+
+# Shell Binds
+bind = SUPER, SUPER_L, exec, dms ipc call spotlight toggle
+bind = $mainMod, V, exec, dms ipc call clipboard toggle
+bind = $mainMod, comma, exec, dms ipc call settings toggle
+bind = $mainMod, N, exec, dms ipc call notifications toggle
+bind = $mainMod SHIFT, N, exec, dms ipc call notepad toggle
+bind = $mainMod, Y, exec, dms ipc call wallpaper next
+
+# Move/resize windows with mainMod + LMB/RMB and dragging
+bindm = $mainMod, mouse:272, movewindow
+bindm = $mainMod, mouse:273, resizewindow
+
+# Source remaining DMS configs
+source = ./dms/cursor.conf
+source = ./dms/layout.conf
+source = ./dms/windowrules.conf
diff --git a/raveos-hyprland-theme/theme-data/hypr/monitors.conf b/raveos-hyprland-theme/theme-data/hypr/monitors.conf
new file mode 100644
index 0000000..12d095a
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/hypr/monitors.conf
@@ -0,0 +1,5 @@
+# Auto-generated by raveos-monitor-setup
+# Run raveos-monitor-setup to reconfigure monitors
+# Format: monitor=NAME, RESxRES@HZ, POSxPOS, SCALE
+
+monitor=,preferred,auto,1
diff --git a/raveos-hyprland-theme/theme-data/hypr/scripts/alt-tab.sh b/raveos-hyprland-theme/theme-data/hypr/scripts/alt-tab.sh
new file mode 100755
index 0000000..0a40f9d
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/hypr/scripts/alt-tab.sh
@@ -0,0 +1,273 @@
+#!/bin/bash
+
+STATE_DIR="/tmp/hypr-alt-tab"
+STATE_FILE="$STATE_DIR/state"
+TIME_FILE="$STATE_DIR/last_press"
+CURRENT_INDEX_FILE="$STATE_DIR/current_index"
+WINDOW_LIST_FILE="$STATE_DIR/window_list"
+
+# Cooldown in seconds (time within which presses count as "continuous")
+COOLDOWN=0.8
+
+# Create state directory if it doesn't exist
+mkdir -p "$STATE_DIR"
+
+# Parse arguments
+same_type=false
+reverse=false
+visible_only=false
+
+for arg in "$@"; do
+ case $arg in
+ --same) same_type=true ;;
+ --reverse) reverse=true ;;
+ --visible) visible_only=true ;;
+ esac
+done
+
+# Function to get window class
+get_window_class() {
+ local window="$1"
+ hyprctl clients -j | jq -r --arg addr "$window" '.[] | select(.address == $addr) | .class'
+}
+
+# Function to get window title
+get_window_title() {
+ local window="$1"
+ hyprctl clients -j | jq -r --arg addr "$window" '.[] | select(.address == $addr) | .title'
+}
+
+# Function to get window workspace ID
+get_window_workspace() {
+ local window="$1"
+ hyprctl clients -j | jq -r --arg addr "$window" '.[] | select(.address == $addr) | .workspace.id'
+}
+
+# Function to get active workspaces (visible on monitors)
+get_active_workspaces() {
+ hyprctl monitors -j | jq -r '.[].activeWorkspace.id'
+}
+
+# Function to get all windows sorted by focus history (most recent first)
+get_windows_by_focus() {
+ hyprctl clients -j | jq -r 'sort_by(-.focusHistoryID) | .[].address'
+}
+
+# Function to get visible windows (on active workspaces)
+get_visible_windows() {
+ # Get all active workspace IDs
+ mapfile -t active_workspaces < <(get_active_workspaces)
+
+ if [[ ${#active_workspaces[@]} -eq 0 ]]; then
+ return
+ fi
+
+ # Convert active workspaces to JSON array for jq query
+ local workspaces_json="["
+ for ws in "${active_workspaces[@]}"; do
+ workspaces_json+="$ws,"
+ done
+ workspaces_json="${workspaces_json%,}]"
+
+ # Get windows in active workspaces, sorted by focus history
+ hyprctl clients -j | jq -r --argjson workspaces "$workspaces_json" '
+ [.[] | select(.workspace.id as $ws | $workspaces | index($ws))]
+ | sort_by(-.focusHistoryID)
+ | .[].address
+ '
+}
+
+# Function to get windows filtered by type (same class or title pattern)
+get_same_type_windows() {
+ local current_window="$1"
+ local current_class=$(get_window_class "$current_window")
+ local current_title=$(get_window_title "$current_window")
+
+ # Get all windows with same class
+ hyprctl clients -j | jq -r --arg class "$current_class" \
+ '.[] | select(.class == $class) | .address'
+}
+
+# Function to get currently focused window
+get_focused_window() {
+ hyprctl activewindow -j | jq -r '.address'
+}
+
+# Function to check if window exists
+window_exists() {
+ local window="$1"
+ [[ -n "$window" ]] && hyprctl clients -j | jq -r '.[].address' | grep -q "^${window}$"
+}
+
+# Function to validate and refresh window list
+validate_window_list() {
+ local windows=("$@")
+ local valid_windows=()
+
+ for window in "${windows[@]}"; do
+ if window_exists "$window"; then
+ valid_windows+=("$window")
+ fi
+ done
+
+ printf '%s\n' "${valid_windows[@]}"
+}
+
+# Get currently focused window
+current_focused=$(get_focused_window)
+
+# Get appropriate window list based on mode
+if [[ "$visible_only" == "true" ]]; then
+ # Get only windows in active workspaces (visible on monitors)
+ echo "Switching between visible windows only" >&2
+ mapfile -t windows < <(get_visible_windows)
+
+ # If no visible windows, fall back to all windows
+ if [[ ${#windows[@]} -eq 0 ]]; then
+ echo "No visible windows found, falling back to all windows" >&2
+ mapfile -t windows < <(get_windows_by_focus)
+ fi
+
+ # Apply same-type filter if requested
+ if [[ "$same_type" == "true" ]] && [[ -n "$current_focused" ]]; then
+ # Get windows of the same type as current (from visible windows)
+ mapfile -t same_type_windows < <(get_same_type_windows "$current_focused")
+
+ # Filter visible windows to only include same-type windows
+ local filtered_windows=()
+ for visible_window in "${windows[@]}"; do
+ for same_window in "${same_type_windows[@]}"; do
+ if [[ "$visible_window" == "$same_window" ]]; then
+ filtered_windows+=("$visible_window")
+ break
+ fi
+ done
+ done
+
+ # If filtered list has windows, use it
+ if [[ ${#filtered_windows[@]} -gt 0 ]]; then
+ windows=("${filtered_windows[@]}")
+ else
+ echo "No visible windows of same type, using all visible windows" >&2
+ fi
+ fi
+elif [[ "$same_type" == "true" ]] && [[ -n "$current_focused" ]]; then
+ # Get windows of the same type as current (from all windows)
+ mapfile -t windows < <(get_same_type_windows "$current_focused")
+
+ # If no same-type windows or only current window, fall back to all windows
+ if [[ ${#windows[@]} -le 1 ]]; then
+ echo "No other windows of same type found, switching to all windows" >&2
+ mapfile -t windows < <(get_windows_by_focus)
+ fi
+else
+ # Get all windows
+ mapfile -t windows < <(get_windows_by_focus)
+fi
+
+# Validate windows still exist
+mapfile -t windows < <(validate_window_list "${windows[@]}")
+
+# Exit if no windows or only one window
+if [[ ${#windows[@]} -le 1 ]]; then
+ echo "Not enough windows to switch" >&2
+ exit 0
+fi
+
+# Get current time
+current_time=$(date +%s.%N)
+
+# Read last press time
+last_press=0
+[[ -f "$TIME_FILE" ]] && last_press=$(<"$TIME_FILE")
+
+# Calculate time difference
+time_diff=$(echo "$current_time - $last_press" | bc -l 2>/dev/null || echo "1")
+
+# Check if we're continuing the Alt+Tab session
+continuing_session=false
+if (( $(echo "$time_diff <= $COOLDOWN" | bc -l 2>/dev/null || echo "0") )); then
+ continuing_session=true
+fi
+
+# Find current window index in the list
+current_index=-1
+for i in "${!windows[@]}"; do
+ if [[ "${windows[$i]}" == "$current_focused" ]]; then
+ current_index=$i
+ break
+ fi
+done
+
+# If current window not in filtered list, start from beginning
+if [[ $current_index -eq -1 ]]; then
+ current_index=0
+fi
+
+# Calculate target index
+if [[ "$continuing_session" == "true" ]] && [[ -f "$CURRENT_INDEX_FILE" ]] && [[ -f "$WINDOW_LIST_FILE" ]]; then
+ # Read saved state
+ saved_index=$(<"$CURRENT_INDEX_FILE")
+ mapfile -t saved_windows < "$WINDOW_LIST_FILE"
+
+ # Check if saved windows match current windows
+ same_list=true
+ if [[ ${#windows[@]} -ne ${#saved_windows[@]} ]]; then
+ same_list=false
+ else
+ for i in "${!windows[@]}"; do
+ if [[ "${windows[$i]}" != "${saved_windows[$i]}" ]]; then
+ same_list=false
+ break
+ fi
+ done
+ fi
+
+ if [[ "$same_list" == "true" ]]; then
+ if [[ "$reverse" == "true" ]]; then
+ target_index=$(( (saved_index - 1 + ${#windows[@]}) % ${#windows[@]} ))
+ else
+ target_index=$(( (saved_index + 1) % ${#windows[@]} ))
+ fi
+ else
+ # List changed, recalculate from current
+ if [[ "$reverse" == "true" ]]; then
+ target_index=$(( (current_index - 1 + ${#windows[@]}) % ${#windows[@]} ))
+ else
+ target_index=$(( (current_index + 1) % ${#windows[@]} ))
+ fi
+ fi
+else
+ # Start new session - move from current window
+ if [[ "$reverse" == "true" ]]; then
+ target_index=$(( (current_index - 1 + ${#windows[@]}) % ${#windows[@]} ))
+ else
+ target_index=$(( (current_index + 1) % ${#windows[@]} ))
+ fi
+fi
+
+# Save state
+echo "$current_time" > "$TIME_FILE"
+echo "$target_index" > "$CURRENT_INDEX_FILE"
+printf '%s\n' "${windows[@]}" > "$WINDOW_LIST_FILE"
+
+# Focus the target window
+target_window="${windows[$target_index]}"
+if window_exists "$target_window"; then
+ echo "Switching to window: $target_window (Class: $(get_window_class "$target_window"), Workspace: $(get_window_workspace "$target_window"))" >&2
+ hyprctl dispatch focuswindow "address:$target_window"
+ hyprctl dispatch bringactivetotop
+fi
+
+# Visual feedback: dim inactive windows temporarily
+hyprctl keyword decoration:dim_inactive true 2>/dev/null
+
+# Clear any existing reset timer
+[[ -f "$STATE_DIR/dim_timer" ]] && kill "$(<"$STATE_DIR/dim_timer")" 2>/dev/null || true
+
+# Start timer to reset dimming
+(
+ sleep 1.2
+ hyprctl keyword decoration:dim_inactive false 2>/dev/null
+) &
+echo $! > "$STATE_DIR/dim_timer"
diff --git a/raveos-hyprland-theme/theme-data/hypr/scripts/raveos-monitor-setup.sh b/raveos-hyprland-theme/theme-data/hypr/scripts/raveos-monitor-setup.sh
new file mode 100755
index 0000000..2790ee4
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/hypr/scripts/raveos-monitor-setup.sh
@@ -0,0 +1,100 @@
+#!/bin/bash
+# raveos-monitor-setup - Auto-detect monitors and generate Hyprland config
+# Sets each monitor to max resolution at 60Hz
+#
+# Usage: raveos-monitor-setup.sh [--hypr-dir PATH]
+# Default hypr dir: ~/.config/hypr
+
+HYPR_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/hypr"
+
+# Parse arguments
+while [[ $# -gt 0 ]]; do
+ case "$1" in
+ --hypr-dir) HYPR_DIR="$2"; shift 2 ;;
+ *) shift ;;
+ esac
+done
+
+MONITORS_CONF="$HYPR_DIR/monitors.conf"
+WORKSPACES_CONF="$HYPR_DIR/workspaces.conf"
+
+# Find connected monitors via DRM sysfs
+declare -a MON_NAMES
+declare -a MON_RESOLUTIONS
+declare -a MON_WIDTHS
+
+for card_output in /sys/class/drm/card*-*; do
+ [[ ! -d "$card_output" ]] && continue
+
+ status=$(cat "$card_output/status" 2>/dev/null)
+ [[ "$status" != "connected" ]] && continue
+
+ # Get output name: card0-DP-1 → DP-1, card1-HDMI-A-1 → HDMI-A-1
+ raw_name=$(basename "$card_output")
+ name="${raw_name#card*-}"
+
+ # Get available modes (first line = highest resolution)
+ modes_file="$card_output/modes"
+ if [[ -f "$modes_file" ]]; then
+ max_mode=$(head -1 "$modes_file")
+ if [[ -n "$max_mode" ]]; then
+ # Extract width from resolution (e.g., 2560x1440 → 2560)
+ width="${max_mode%%x*}"
+ MON_NAMES+=("$name")
+ MON_RESOLUTIONS+=("$max_mode")
+ MON_WIDTHS+=("$width")
+ fi
+ fi
+done
+
+# If no monitors found, use fallback
+if [[ ${#MON_NAMES[@]} -eq 0 ]]; then
+ cat > "$MONITORS_CONF" << 'EOF'
+# Auto-generated by raveos-monitor-setup
+# No monitors detected - using fallback
+monitor=,preferred,auto,1
+EOF
+ cat > "$WORKSPACES_CONF" << 'EOF'
+# Auto-generated by raveos-monitor-setup
+# No monitors detected
+EOF
+ echo "No monitors detected, using fallback config"
+ exit 0
+fi
+
+# Generate monitors.conf
+cat > "$MONITORS_CONF" << 'EOF'
+# Auto-generated by raveos-monitor-setup
+# Run raveos-monitor-setup.sh to reconfigure monitors
+EOF
+
+pos_x=0
+for ((i=0; i<${#MON_NAMES[@]}; i++)); do
+ echo "monitor=${MON_NAMES[$i]}, ${MON_RESOLUTIONS[$i]}@60, ${pos_x}x0, 1" >> "$MONITORS_CONF"
+ pos_x=$((pos_x + MON_WIDTHS[i]))
+done
+
+# Generate workspaces.conf - distribute 10 workspaces across monitors
+cat > "$WORKSPACES_CONF" << 'EOF'
+# Auto-generated by raveos-monitor-setup
+EOF
+
+num_monitors=${#MON_NAMES[@]}
+ws_per_mon=$((10 / num_monitors))
+remaining=$((10 % num_monitors))
+
+ws=1
+for ((i=0; i<num_monitors; i++)); do
+ count=$ws_per_mon
+ [[ $i -lt $remaining ]] && ((count++))
+
+ for ((j=0; j<count; j++)); do
+ echo "workspace=$ws, monitor:${MON_NAMES[$i]}, persistent:1" >> "$WORKSPACES_CONF"
+ ((ws++))
+ done
+done
+
+echo "Monitor setup complete: ${#MON_NAMES[@]} monitor(s) configured"
+for ((i=0; i<${#MON_NAMES[@]}; i++)); do
+ echo " ${MON_NAMES[$i]}: ${MON_RESOLUTIONS[$i]}@60"
+done
diff --git a/raveos-hyprland-theme/theme-data/hypr/workspaces.conf b/raveos-hyprland-theme/theme-data/hypr/workspaces.conf
new file mode 100644
index 0000000..328ed03
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/hypr/workspaces.conf
@@ -0,0 +1,2 @@
+# Auto-generated by raveos-monitor-setup
+# Workspace assignments are configured automatically based on connected monitors