Compare commits

..
21 Commits
Author SHA1 Message Date
pyrschtjag d9c9bf546b test_version 2026-07-11 16:41:17 +04:00
pyrschtjag f0106699b9 feat: refactor script 2026-04-30 17:27:04 +04:00
pyrschtjag 5b8821f5a2 fix: label on all monitors 2026-04-30 17:26:29 +04:00
pyrschtjag 8f5a286b79 feat: added steam-app window rule 2026-04-30 17:25:45 +04:00
pyrschtjag 8f7e191a84 fix: coordinates secondary monitor 2026-04-30 17:25:13 +04:00
pyrschtjag 74ebd86694 feat: disable force accel for moust 2026-04-30 17:24:26 +04:00
pyrschtjag a30fb7394e fix: sleep for eww daemon 2026-04-30 17:23:44 +04:00
pyrschtjag 032378ca59 feat: added thick border for resize mode 2026-04-30 17:22:42 +04:00
pyrschtjag f728bb1392 feat: added tray to secondary monitor 2026-04-30 17:21:33 +04:00
pyrschtjag b43b71b8d2 docs: updated dependencies 2026-04-21 15:53:14 +04:00
pyrschtjag d8e090d656 feat: added hyprlock 2026-04-21 15:52:35 +04:00
pyrschtjag 7952915c47 feat: added hypridle 2026-04-21 15:52:25 +04:00
pyrschtjag 9608642c84 refactor: fixed paths to subdir with configs 2026-04-21 15:52:04 +04:00
pyrschtjag 2581c8a411 refactor: move hyprland configs to subdir 2026-04-21 15:51:00 +04:00
pyrschtjag c0d27247fd docs: updated readme 2026-04-21 13:55:49 +04:00
pyrschtjag 3e5a1f97f8 feat: added hyprland config 2026-04-21 13:44:28 +04:00
pyrschtjag 1a18f1e261 fix: spotify class name 2026-04-21 13:43:39 +04:00
pyrschtjag a98fa33b63 feat: switch to pw-mon fow pipewire 2026-04-21 13:42:59 +04:00
pyrschtjag f91c71461b misc: changed background-image 2026-04-21 13:42:03 +04:00
pyrschtjag 1e46c33b7b feat: added cliphist-rofi-img 2026-04-21 13:40:50 +04:00
pyrschtjag 41a55741f4 feat: added clipboard rasi 2026-04-21 13:40:35 +04:00
25 changed files with 540 additions and 140 deletions
+13 -13
View File
@@ -48,23 +48,23 @@
## Зависимости ## Зависимости
Установите необходимые пакеты через ваш менеджер пакетов: `eww` доступен только в `AUR`:
```Bash ```Bash
# core & ipc yay -S eww
eww socat
# audio & input
pactl python-evdev
# telemetry (nvidia)
nvidia-smi
``` ```
## Инициализация `dunst`, `rofi`, `hyprland`:
```Bash
pacman -S dunst rofi hyprland
```
Для корректной инициализации слоев используйте open-many в конфиге Hyprland: Зависимости для `eww`:
```Bash
pacman -S xorg-xrand jq xdg-desktop-portal-gtk hyprpolkitagent hyprlock hypridle python-dbus python-evdev python-gobject libnotify wl-clipboard cliphist socat
```
```Conf Для корректной работы `python-evdev` добавляет своего пользователя в группу `input`:
exec-once = eww daemon && eww open-many bar_0 bar_1 wallpaper_0 wallpaper_1 ```Bash
usermoad -aG input $USER
``` ```
+5 -4
View File
@@ -138,12 +138,13 @@
(statswidget :reveal_state s_rev :reveal_var s_var) (statswidget :reveal_state s_rev :reveal_var s_var)
(volumewidget :reveal_state v_rev :reveal_var v_var)))) (volumewidget :reveal_state v_rev :reveal_var v_var))))
;; дополнительный бар (без трея) ;; дополнительный бар
(defwidget side_bar [mon_key t_rev t_var s_rev s_var v_rev v_var] (defwidget side_bar [mon_key t_rev t_var s_rev s_var v_rev v_var]
(centerbox :class "bar-inner" (centerbox :class "bar-inner"
(box :halign "start" (workspaces :ws_data {ws_data[mon_key]})) (box :halign "start" (workspaces :ws_data {ws_data[mon_key]}))
(box :halign "center" (timewidget :reveal_state t_rev :reveal_var t_var)) (box :halign "center" (timewidget :reveal_state t_rev :reveal_var t_var))
(box :halign "end" :space-evenly false (box :halign "end" :space-evenly false
(tray_dynamic)
(kb_widget) (kb_widget)
(statswidget :reveal_state s_rev :reveal_var s_var) (statswidget :reveal_state s_rev :reveal_var s_var)
(volumewidget :reveal_state v_rev :reveal_var v_var)))) (volumewidget :reveal_state v_rev :reveal_var v_var))))
@@ -171,8 +172,8 @@
;; обои ;; обои
(defwindow wallpaper_0 :monitor 0 :stacking "bg" :focusable false (defwindow wallpaper_0 :monitor 0 :stacking "bg" :focusable false
:geometry (geometry :width "100%" :height "100%") :geometry (geometry :width "100%" :height "100%")
(box :style "background-image: url('/home/pyrschtjag/Pictures/wallhaven-x1lr3l.jpg'); background-size: cover;")) (box :style "background-image: url('/home/pyrschtjag/Pictures/wallhaven-0wl9jp.jpg'); background-size: cover;"))
(defwindow wallpaper_1 :monitor 1 :stacking "bg" :focusable false (defwindow wallpaper_1 :monitor 1 :stacking "bg" :focusable false
:geometry (geometry :width "100%" :height "100%") :geometry (geometry :width "100%" :height "100%")
(box :style "background-image: url('/home/pyrschtjag/Pictures/wallhaven-7jj86e.jpg'); background-size: cover;")) (box :style "background-image: url('/home/pyrschtjag/Pictures/wallhaven-1jygr3.jpg'); background-size: cover;"))
+3 -3
View File
@@ -27,11 +27,11 @@ class VolumeMonitor:
def run(self): def run(self):
self.push_update() self.push_update()
proc = subprocess.Popen(["pactl", "subscribe"], stdout=subprocess.PIPE, text=True) proc = subprocess.Popen(["pw-mon"], stdout=subprocess.PIPE, text=True, stderr=subprocess.DEVNULL)
for line in proc.stdout: for line in proc.stdout:
if "sink" in line or "server" in line: if "changed" in line:
self.push_update() self.push_update()
if __name__ == "__main__": if __name__ == "__main__":
VolumeMonitor().run() VolumeMonitor().run()
+114 -118
View File
@@ -1,10 +1,9 @@
#!/usr/bin/env python3
import asyncio
import json import json
import subprocess
import os import os
import sys import sys
import socket
import threading
import time
class UnifiedWorkspaceManager: class UnifiedWorkspaceManager:
def __init__(self): def __init__(self):
@@ -16,11 +15,8 @@ class UnifiedWorkspaceManager:
self.monitors_cache = {} self.monitors_cache = {}
self.load_icon_configuration() self.load_icon_configuration()
self.clients_refresh()
self.monitors_refresh()
def load_icon_configuration(self): def load_icon_configuration(self):
# тянем иконки из конфига
config_path = os.path.join(self.script_directory, "workspaces_map.json") config_path = os.path.join(self.script_directory, "workspaces_map.json")
try: try:
with open(config_path, 'r') as file: with open(config_path, 'r') as file:
@@ -28,53 +24,59 @@ class UnifiedWorkspaceManager:
except: except:
self.icon_map = {"default": "", "no-icon": ""} self.icon_map = {"default": "", "no-icon": ""}
def monitors_refresh(self): async def monitors_refresh(self):
# обновляем инфу по мониторам
try: try:
raw = subprocess.check_output(["hyprctl", "-j", "monitors"], stderr=subprocess.DEVNULL) proc = await asyncio.create_subprocess_exec(
monitors = json.loads(raw) "hyprctl", "-j", "monitors",
self.monitors_cache = { stdout=asyncio.subprocess.PIPE,
m['name']: { stderr=asyncio.subprocess.DEVNULL
"id": m['id'], )
"active_workspace_id": m['activeWorkspace']['id'], stdout, _ = await proc.communicate()
"focused": m.get('focused', False) if proc.returncode == 0:
} for m in monitors monitors = json.loads(stdout.decode())
} self.monitors_cache = {
m['name']: {
"id": m['id'],
"active_workspace_id": m['activeWorkspace']['id'],
"focused": m.get('focused', False)
} for m in monitors
}
except: except:
self.monitors_cache = {} self.monitors_cache = {}
def clients_refresh(self): async def clients_refresh(self):
# полный сброс и пересборка кэша окон
try: try:
raw = subprocess.check_output(["hyprctl", "-j", "clients"], stderr=subprocess.DEVNULL) proc = await asyncio.create_subprocess_exec(
clients = json.loads(raw) "hyprctl", "-j", "clients",
self.clients_cache = { stdout=asyncio.subprocess.PIPE,
c['address'].strip().replace('0x', ''): { stderr=asyncio.subprocess.DEVNULL
"class": c['class'], )
"workspace_id": c['workspace']['id'], stdout, _ = await proc.communicate()
"monitor_id": c['monitor'] if proc.returncode == 0:
} for c in clients clients = json.loads(stdout.decode())
} self.clients_cache = {
c['address'].strip().replace('0x', ''): {
"class": c['class'],
"workspace_id": c['workspace']['id'],
"monitor_id": c['monitor']
} for c in clients
}
except: except:
self.clients_cache = {} self.clients_cache = {}
def get_current_state_json(self): def get_current_state_json(self):
# собираем финальный json
try: try:
output = {} output = {}
for mon_name, mon_data in self.monitors_cache.items(): for mon_name, mon_data in self.monitors_cache.items():
m_id = mon_data["id"] m_id = mon_data["id"]
active_id = mon_data["active_workspace_id"] active_id = mon_data["active_workspace_id"]
focused = mon_data["focused"] focused = mon_data["focused"]
# готовим 10 слотов
workspaces = { workspaces = {
str(i): {"exists": False, "active": False, "focused": False, "urgent": False, "icons": []} str(i): {"exists": False, "active": False, "focused": False, "urgent": False, "icons": []}
for i in range(1, 11) for i in range(1, 11)
} }
# раскидываем окна по воркспейсам
for addr, client in self.clients_cache.items(): for addr, client in self.clients_cache.items():
if client['monitor_id'] == m_id: if client['monitor_id'] == m_id:
ws_id = str(client['workspace_id']) ws_id = str(client['workspace_id'])
@@ -88,12 +90,10 @@ class UnifiedWorkspaceManager:
if icon not in slot["icons"]: if icon not in slot["icons"]:
slot["icons"].append(icon) slot["icons"].append(icon)
# помечаем текущий активный воркспейс
curr_ws = str(active_id) curr_ws = str(active_id)
if curr_ws in workspaces: if curr_ws in workspaces:
workspaces[curr_ws].update({"active": True, "focused": focused, "exists": True}) workspaces[curr_ws].update({"active": True, "focused": focused, "exists": True})
# рисуем no-icon
for ws in workspaces.values(): for ws in workspaces.values():
if ws["exists"] and not ws["icons"]: if ws["exists"] and not ws["icons"]:
ws["icons"] = [self.icon_map.get("no-icon", "")] ws["icons"] = [self.icon_map.get("no-icon", "")]
@@ -105,109 +105,105 @@ class UnifiedWorkspaceManager:
return "{}" return "{}"
def push_update(self): def push_update(self):
# отдаём json в stdout при изменении
current = self.get_current_state_json() current = self.get_current_state_json()
if current != self.last_sent_json: if current != self.last_sent_json:
self.last_sent_json = current self.last_sent_json = current
sys.stdout.write(current + '\n') sys.stdout.write(current + '\n')
sys.stdout.flush() sys.stdout.flush()
def update_client(self, window_address): async def update_client(self, window_address):
# обновляем окно
try: try:
clean_addr = window_address.replace('0x', '') clean_addr = window_address.replace('0x', '')
search_addr = f"0x{clean_addr}" search_addr = f"0x{clean_addr}"
raw = subprocess.check_output(["hyprctl", "-j", "clients"], stderr=subprocess.DEVNULL) proc = await asyncio.create_subprocess_exec(
clients = json.loads(raw) "hyprctl", "-j", "clients",
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.DEVNULL
)
stdout, _ = await proc.communicate()
target = next((c for c in clients if c['address'] == search_addr), None) if proc.returncode == 0:
clients = json.loads(stdout.decode())
if target: target = next((c for c in clients if c['address'] == search_addr), None)
self.clients_cache[clean_addr] = {
"class": target.get('class', 'unknown'),
"workspace_id": target['workspace']['id'],
"monitor_id": target['monitor']
}
else:
self.clients_cache.pop(clean_addr, None)
if target:
self.clients_cache[clean_addr] = {
"class": target.get('class', 'unknown'),
"workspace_id": target['workspace']['id'],
"monitor_id": target['monitor']
}
return
self.clients_cache.pop(clean_addr, None)
except: except:
# если что-то отвалилось, то просто пересобираем всё await self.clients_refresh()
self.clients_refresh()
def run(self): async def run(self):
await self.clients_refresh()
await self.monitors_refresh()
self.push_update() self.push_update()
def event_socket_listener(): signature = os.environ.get('HYPRLAND_INSTANCE_SIGNATURE')
# слушаем сокет хайпера socket_path = f"/run/user/{os.getuid()}/hypr/{signature}/.socket2.sock"
signature = os.environ.get('HYPRLAND_INSTANCE_SIGNATURE')
socket_path = f"/run/user/{os.getuid()}/hypr/{signature}/.socket2.sock"
while True: while True:
try: try:
with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: reader, writer = await asyncio.open_unix_connection(socket_path)
sock.connect(socket_path)
buf = "" while True:
while True: line_bytes = await reader.readline()
data = sock.recv(4096).decode('utf-8', errors='ignore') if not line_bytes:
if not data: break break
buf += data
line = line_bytes.decode('utf-8', errors='ignore').strip()
if '\n' in buf: if ">>" not in line:
lines = buf.split('\n') continue
buf = lines.pop()
event, args = line.split('>>')
trigger = False trigger = False
for line in lines:
if ">>" not in line: continue if event in ["openwindow", "movewindow"]:
event, args = line.split('>>') addr = args.split(',')[0].replace('0x', '')
await self.update_client(addr)
# ивенты с окнами trigger = True
if event in ["openwindow", "movewindow"]:
addr = args.split(',')[0].replace('0x', '') elif event == "closewindow":
self.update_client(addr) addr = args.replace('0x', '')
trigger = True self.clients_cache.pop(addr, None)
self.urgent_window_addresses.discard(addr)
elif event == "closewindow": trigger = True
addr = args.replace('0x', '')
self.clients_cache.pop(addr, None)
self.urgent_window_addresses.discard(addr)
trigger = True
# ивенты с мониторами elif event in ["workspace", "workspacev2", "monitoradded", "monitorremoved"]:
elif event in ["workspace", "workspacev2", "monitoradded", "monitorremoved"]: await self.monitors_refresh()
self.monitors_refresh() trigger = True
trigger = True
elif event in ["focusedmon", "focusedmonv2"]: elif event in ["focusedmon", "focusedmonv2"]:
mon_name = args.split(',')[0] mon_name = args.split(',')[0]
for name in self.monitors_cache: for name in self.monitors_cache:
self.monitors_cache[name]["focused"] = (name == mon_name) self.monitors_cache[name]["focused"] = (name == mon_name)
trigger = True trigger = True
# алерты elif event == "urgent":
elif event == "urgent": self.urgent_window_addresses.add(args.replace('0x', ''))
self.urgent_window_addresses.add(args.replace('0x', '')) trigger = True
trigger = True
elif event in ["activewindow", "activewindowv2"]:
elif event in ["activewindow", "activewindowv2"]: addr = args.split(',')[0].replace('0x', '')
addr = args.split(',')[0].replace('0x', '') if addr in self.urgent_window_addresses:
if addr in self.urgent_window_addresses: self.urgent_window_addresses.remove(addr)
self.urgent_window_addresses.remove(addr) trigger = True
trigger = True
if trigger: if trigger:
self.push_update() self.push_update()
except:
time.sleep(2) # реконнект, если хайпер отвалился except (asyncio.CancelledError, KeyboardInterrupt):
break
# слушаем поток в фоне except Exception as e:
threading.Thread(target=event_socket_listener, daemon=True).start() await asyncio.sleep(2)
try:
while True: time.sleep(100)
except KeyboardInterrupt: sys.exit(0)
if __name__ == "__main__": if __name__ == "__main__":
UnifiedWorkspaceManager().run() try:
asyncio.run(UnifiedWorkspaceManager().run())
except KeyboardInterrupt:
sys.exit(0)
+2 -2
View File
@@ -4,9 +4,9 @@
"firefox": "", "firefox": "",
"code-oss": "󰨞", "code-oss": "󰨞",
"org.telegram.desktop": "", "org.telegram.desktop": "",
"kitty": "", "foot": "",
"steam": "", "steam": "",
"spotify": "", "Spotify": "",
"discord": "󰙯", "discord": "󰙯",
"no-icon": "", "no-icon": "",
"default": "" "default": ""
+29
View File
@@ -0,0 +1,29 @@
animations {
enabled = yes
# NAME, X0, Y0, X1, Y1
bezier = easeOutQuint, 0.23, 1, 0.32, 1
bezier = easeInOutCubic, 0.65, 0.05, 0.36, 1
bezier = linear, 0, 0, 1, 1
bezier = almostLinear, 0.5, 0.5, 0.75, 1
bezier = quick, 0.15, 0, 0.1, 1
# NAME, ONOFF, SPEED, CURVE, [STYLE]
animation = global, 1, 10, default
animation = border, 1, 5.39, easeOutQuint
animation = windows, 1, 4.79, easeOutQuint
animation = windowsIn, 1, 4.1, easeOutQuint, popin 87%
animation = windowsOut, 1, 1.49, linear, popin 87%
animation = fadeIn, 1, 1.73, almostLinear
animation = fadeOut, 1, 1.46, almostLinear
animation = fade, 1, 3.03, quick
animation = layers, 1, 3.81, easeOutQuint
animation = layersIn, 1, 4, easeOutQuint, fade
animation = layersOut, 1, 1.5, linear, fade
animation = fadeLayersIn, 1, 1.79, almostLinear
animation = fadeLayersOut, 1, 1.39, almostLinear
animation = workspaces, 1, 1.94, almostLinear, fade
animation = workspacesIn, 1, 1.21, almostLinear, fade
animation = workspacesOut, 1, 1.94, almostLinear, fade
animation = zoomFactor, 1, 7, quick
}
+87
View File
@@ -0,0 +1,87 @@
# basic
bind = $mainMod, return, exec, $terminal
bind = $mainMod SHIFT, Q, killactive,
bind = $mainMod SHIFT, X, exec, command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch exit
bind = $mainMod, E, exec, $fileManager
bind = $mainMod, M, togglefloating,
bind = $mainMod, F, fullscreen, 0
bind = $mainMod, D, exec, $menu
bind = $mainMod, P, pseudo,
bind = $mainMod, J, layoutmsg, togglesplit
bind = $mainMod, V, exec, rofi -modi clipboard:~/.config/rofi/cliphist-rofi-img -show clipboard -show-icons -theme ~/.config/rofi/clipboard.rasi
bind = , Print, exec, AREA=$(slurp) && grim -g "$AREA" - | wl-copy && notify-send -u low "Screenshot" "Captured: $AREA"
bind = SUPER, Print, exec, ACTIVE_CLASS=$(hyprctl activewindow -j | jq -r '.class') && hyprctl -j activewindow | jq -r '"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"' | grim -g - - | wl-copy && notify-send -u low "Screenshot" "Captured: $ACTIVE_CLASS"
bind = CTRL, Print, exec, MONITOR=$(hyprctl monitors -j | jq -r '.[] | select(.focused) | .name') && grim -o "$MONITOR" - | wl-copy && notify-send -u low "Screenshot" "Captured: $MONITOR"
# movefocus
bind = $mainMod, left, movefocus, l
bind = $mainMod, right, movefocus, r
bind = $mainMod, up, movefocus, u
bind = $mainMod, down, movefocus, d
# movewindow
bind = $mainMod SHIFT, left, movewindow, l
bind = $mainMod SHIFT, right, movewindow, r
bind = $mainMod SHIFT, up, movewindow, u
bind = $mainMod SHIFT, down, movewindow, d
# workspace
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
# movetoworkspace
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
# scratchpad
bind = $mainMod, S, togglespecialworkspace, scratchpad
bind = $mainMod SHIFT, S, movetoworkspace, special:scratchpad
bind = $mainMod CTRL, S, movetoworkspace, e+0
# movewindow / resizewindow
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow
# multimedia
bindel = $mainMod, F7, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
bindel = $mainMod, F8, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
bindel = $mainMod, F8, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
bindel = $mainMod, F9, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
# playerctl
bindl = $mainMod, F10, exec, playerctl previous
bindl = $mainMod, F11, exec, playerctl play-pause
bindl = $mainMod, F12, exec, playerctl next
# resize mode
bind = $mainMod, R, exec, hyprctl keyword general:col.active_border "rgb(e3a1d2)" ; hyprctl keyword general:border_size 5
bind = $mainMod, R, submap, resize
submap = resize
binde = , right, resizeactive, 20 0
binde = , left, resizeactive, -20 0
binde = , up, resizeactive, 0 -20
binde = , down, resizeactive, 0 20
bind = , escape, exec, hyprctl keyword general:col.active_border "rgb(a8afe1)" ; hyprctl keyword general:border_size 1
bind = , escape, submap, reset
bind = , return, exec, hyprctl keyword general:col.active_border "rgb(a8afe1)" ; hyprctl keyword general:border_size 1
bind = , return, submap, reset
submap = reset
bind = $mainMod, L, exec, loginctl lock-session
+20
View File
@@ -0,0 +1,20 @@
decoration {
rounding = 12
rounding_power = 2
active_opacity = 1.0
inactive_opacity = 0.8
shadow {
enabled = true
range = 4
render_power = 3
color = rgba(00000066)
}
blur {
enabled = true
size = 3
passes = 2
vibrancy = 0.1696
}
}
+4
View File
@@ -0,0 +1,4 @@
dwindle {
pseudotile = true
preserve_split = true
}
+5
View File
@@ -0,0 +1,5 @@
env = XCURSOR_THEME,Bibata-Modern-Classic
env = XCURSOR_SIZE,24
env = LIBVA_DRIVER_NAME,nvidia
env = __GLX_VENDOR_LIBRARY_NAME,nvidia
env = NVD_BACKEND,direct
+9
View File
@@ -0,0 +1,9 @@
exec-once = xrandr --output HDMI-A-1 --primary
exec-once = wl-paste --type text --watch cliphist store
exec-once = wl-paste --type image --watch cliphist store
exec-once = systemctl --user start hyprpolkitagent
exec-once = gsettings set org.gnome.desktop.interface gtk-theme "Adwaita-dark"
exec-once = gsettings set org.gnome.desktop.interface color-scheme "prefer-dark"
exec-once = eww daemon && sleep 1 && eww open-many bar_0 bar_1 wallpaper_0 wallpaper_1
exec-once = hypridle --grace 15
exec-once = python3 /home/pyrschtjag/Documents/.ntfy-notify/ntfy-notify.py
+10
View File
@@ -0,0 +1,10 @@
general {
gaps_in = 4
gaps_out = 42,6,6,6
border_size = 1
col.active_border = rgb(a8afe1)
col.inactive_border = rgba(363a4fcc)
resize_on_border = false
allow_tearing = false
layout = dwindle
}
+10
View File
@@ -0,0 +1,10 @@
input {
kb_layout = us,ru
kb_variant =
kb_model =
kb_options = grp:win_space_toggle
kb_rules =
follow_mouse = 1
sensitivity = 0
force_no_accel = true
}
+3
View File
@@ -0,0 +1,3 @@
master {
new_status = master
}
+4
View File
@@ -0,0 +1,4 @@
misc {
force_default_wallpaper = -1
disable_hyprland_logo = true
}
+2
View File
@@ -0,0 +1,2 @@
monitor = HDMI-A-1, 1920x1080@60, 0x0, 1
monitor = DVI-I-1, 1600x900@60, 1920x120, 1
+4
View File
@@ -0,0 +1,4 @@
$mainMod = SUPER
$terminal = foot
//$fileManager = kitty mc
$menu = rofi -show drun
+60
View File
@@ -0,0 +1,60 @@
windowrule {
name = suppress-maximize-events
match:class = .*
suppress_event = maximize
}
windowrule {
name = fix-xwayland-drags
match:class = ^$
match:title = ^$
match:xwayland = true
match:float = true
match:fullscreen = false
match:pin = false
no_focus = true
}
windowrule {
name = move-hyprland-run
match:class = hyprland-run
move = 20 monitor_h-120
float = yes
}
windowrule {
name = scratchpad
match:workspace = name:special:scratchpad
border_color = rgb(a8afe1) rgba(3dd8ffb9)
}
windowrule {
name = telegram-media-viewer
match:class = ^(org.telegram.desktop|telegramdesktop)$
match:title = ^(Media viewer)$
fullscreen = on
fullscreen_state = 2
}
windowrule {
name = firefox-youtube
match:class = ^(firefox)$
match:title = .*(YouTube — Mozilla Firefox)$
opacity = 1.0 override 1.0 override 1.0 override
}
windowrule {
name = firefox-picture-in-picture
match:class = ^(firefox)$
match:title = ^(Picture-in-Picture)$
opacity = 1.0 override 1.0 override 1.0 override
float = true
}
windowrule {
name = steam-app
match:class = ^(steam_app_)(.*)
fullscreen = on
fullscreen_state = 2
monitor = HDMI-A-1
}
+10
View File
@@ -0,0 +1,10 @@
workspace = 1, monitor:HDMI-A-1
workspace = 2, monitor:HDMI-A-1
workspace = 3, monitor:HDMI-A-1
workspace = 4, monitor:HDMI-A-1
workspace = 5, monitor:HDMI-A-1
workspace = 6, monitor:HDMI-A-1
workspace = 7, monitor:HDMI-A-1
workspace = 8, monitor:DVI-I-1
workspace = 9, monitor:DVI-I-1
workspace = 10, monitor:DVI-I-1
+24
View File
@@ -0,0 +1,24 @@
general {
lock_cmd = pidof hyprlock || hyprlock
before_sleep_cmd = loginctl lock-session
after_sleep_cmd = hyprctl dispatch dpms on
ignore_dbus_inhibit = false
ignore_wayland_inhibit = false
ignore_systemd_inhibit = false
}
listener {
timeout = 300
on-timeout = loginctl lock-session
}
listener {
timeout = 360
on-timeout = hyprctl dispatch dpms off
on-resume = hyprctl dispatch dpms on
}
listener {
timeout = 600
on-timeout = systemctl suspend
}
+14
View File
@@ -0,0 +1,14 @@
source = ~/.config/hypr/config/monitors.conf
source = ~/.config/hypr/config/workspaces.conf
source = ~/.config/hypr/config/programs.conf
source = ~/.config/hypr/config/exec.conf
source = ~/.config/hypr/config/env.conf
source = ~/.config/hypr/config/general.conf
source = ~/.config/hypr/config/decoration.conf
source = ~/.config/hypr/config/animations.conf
//source = ~/.config/hypr/config/dwindle.conf
source = ~/.config/hypr/config/master.conf
source = ~/.config/hypr/config/misc.conf
source = ~/.config/hypr/config/input.conf
source = ~/.config/hypr/config/bind.conf
source = ~/.config/hypr/config/windowrule.conf
+40
View File
@@ -0,0 +1,40 @@
general {
hide_cursor = true
ignore_empty_input = true
}
background {
monitor =
path = screenshot
blur_passes = 2
blur_size = 5
}
input-field {
monitor =
size = 250, 60
outline_thickness = 2
dots_size = 0.2
dots_spacing = 0.2
dots_center = true
outer_color = rgba(168, 175, 225, 0.5)
inner_color = rgba(30, 30, 46, 0.5)
font_color = rgb(202, 211, 245)
fade_on_empty = true
placeholder_text = <i>Password...</i>
hide_input = false
position = 0, -154
halign = center
valign = center
}
label {
monitor =
text = $TIME
color = rgba(202, 211, 245, 0.8)
font_size = 94
font_family = Noto Sans Bold
position = 0, 0
halign = center
valign = center
}
+20
View File
@@ -0,0 +1,20 @@
#!/bin/bash
MONITOR_NAME="DVI-I-1"
WIDTH=1920
HEIGHT=120
WIDHT_FIXED=$((WIDTH+10))
hyprctl keyword monitor "$MONITOR_NAME, 1600x900@60, ${WIDHT_FIXED}x${HEIGHT}, 1" && eww reload
notify-send -t 1500 "$MONITOR_NAME: Game Mode" "Monitor moved to ${WIDHT_FIXED}x${HEIGHT}"
if [[ "$1" == *"="* ]]; then
VAR=$1
shift
env "$VAR" "$@"
else
"$@"
fi
hyprctl -- keyword monitor "$MONITOR_NAME, 1600x900@60, ${WIDTH}x${HEIGHT}, 1" && eww reload
notify-send -t 1500 "$MONITOR_NAME: Desktop Mode" "Monitor returned to ${WIDTH}x${HEIGHT}"
+26
View File
@@ -0,0 +1,26 @@
@import "config.rasi"
configuration {
modi: "clipboard:~/.config/rofi/cliphist-rofi-img";
show-icons: true;
display-clipboard: "󰅍 Clipboard";
}
element {
orientation: horizontal;
spacing: 15px;
padding: 8px 12px;
children: [ element-text, element-icon ];
}
element-icon {
size: 42px;
expand: false;
horizontal-align: 1.0;
}
element-text {
vertical-align: 0.5;
expand: true;
horizontal-align: 0.0;
}
+22
View File
@@ -0,0 +1,22 @@
#!/usr/bin/env bash
tmp_dir="/tmp/cliphist"
rm -rf "$tmp_dir"
if [[ -n "$1" ]]; then
cliphist decode <<<"$1" | wl-copy
exit
fi
mkdir -p "$tmp_dir"
read -r -d '' prog <<EOF
/^[0-9]+\s<meta http-equiv=/ { next }
match(\$0, /^([0-9]+)\s(\[\[\s)?binary.*(jpg|jpeg|png|bmp)/, grp) {
system("echo " grp[1] "\\\\\t | cliphist decode >$tmp_dir/"grp[1]"."grp[3])
print \$0"\0icon\x1f$tmp_dir/"grp[1]"."grp[3]
next
}
1
EOF
cliphist list | gawk "$prog"