Как стать автором
Поиск
Написать публикацию
Обновить

Безопасно делимся экраном на Hyprland

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров818

Мы все были в ситуации, когда нужно показать экран с множеством окон, и требуется несколько минут перед нажатием кнопки «Поделиться экраном», чтобы принять решение. Это нормально, особенно если ваша система — ваш второй (или даже первый) дом: с личными заметками, документами, паролями, чатами и так далее.

Далее мы настроим удобный рабочий процесс для такого случая. Однако эта настройка будет использовать новую функцию, встроенную в Hyprland и, скорее всего, отсутствующую в других DE/композиторах. Я продемонстрирую нашу конечную цель. Например, мой режим демонстрации экрана может выглядеть так:

Если вам нравятся мои обои, вы можете найти эти и много других отличных материалов в моём репозитории dotfiles на GitHub. Не забывайте: я обожаю ваши звёзды!

Разберём всё по шагам. Во-первых, вспомним, что в релизе Hyprland версии 0.50.0 было добавлено новое правило windowrulev2 с опцией noscreenshare. Это свежий релиз, и сейчас оно управляется только из конфигурационного файла, вот так:

windowrulev2 = noscreenshare, class:^(org.telegram.desktop|obsidian|discord)$

Эта опция предписывает Hyprland рисовать чёрный прямоугольник вместо содержимого окна (даже если это окно не в фокусе или на заднем плане). Это работает идеально и защищает нашу приватность. Но я обнаружил два неудобных случая: 1. Когда мы хотим сделать скриншот (в моём случае, с помощью flameshot), Hyprland интерпретирует это как попытку поделиться экраном и скрывает все приватные окна. 2. Иногда я хочу показать что-то из моего Obsidian, например, и лезть в конфиги в этот момент — не очень хорошо.

Управление опцией noscreenshare через CLI

Чтобы исправить этот опыт, напишем скрипт для управления правилом окна в конфиге. Если у вас нет времени, полная версия скрипта здесь. Скрипт будет комментировать или раскомментировать строку в конфигурационном файле с правилом и сохранять информацию о текущем состоянии правила в файле-маркере ~/.config/hypr/.screenshare_rule_disabled. Скрипт можно запустить с командой toggle, чтобы изменить состояние на противоположное:

#!/bin/bash

CONFIG_FILE="$HOME/.config/hypr/hyprland.conf"
STATE_FILE="$HOME/.config/hypr/.screenshare_rule_disabled"

toggle_rule() {
	# TODO
}

case ${1} in
    "toggle")
        toggle_rule
        ;;
esac

Напишем функцию toggle_rule. Мы будем использовать утилиту Linux sed (Stream Editor). Это один из самых мощных инструментов для обработки текста в Linux и Unix-системах. Он обычно используется для таких задач, как поиск и замена, преобразование текста и потоковое редактирование. Синтаксис sed, в общем виде, выглядит так:

sed [options] "script" [file...]

Нам нужна опция -i для редактирования файла на месте. Затем пишем скрипт. Сначала нам нужно найти строку с правилом noscreenshare, как в regex:

"/windowrolev2.*noscreenshare.*"

Мы начинаем с "/" для написания поискового запроса, нам нужно, чтобы строка начиналась с "windowrolev2", после чего ".*" для любого количества любых символов, между которыми "noscreenshare". Затем мы используем "/" для завершения поискового запроса и "s/" (substitute) для замены:

"/windowrulev2.*noscreenshare.*/s/^#//"

Наконец, мы используем регулярное выражение "^#" для поиска решётки в начале строки и заменяем её на ничто: "//". Полная команда выглядит так:

sed -i '/windowrulev2.*noscreenshare.*/s/^#//' "$CONFIG_FILE"

Затем используем sed для добавления решётки в начало строки аналогичным образом, в зависимости от наличия файла-маркера:

toggle_rule() {
    if [ -f "$STATE_FILE" ]; then
        sed -i '/windowrulev2.*noscreenshare.*/s/^#//' "$CONFIG_FILE"
        rm -f "$STATE_FILE"
        CLASS="on"
    else
        sed -i '/windowrulev2.*noscreenshare.*/s/^/#/' "$CONFIG_FILE"
        touch "$STATE_FILE"
        CLASS="of"
    fi
}

На последнем шаге скрипта мы вызываем эту функцию, если была дана опция toggle, и возвращаем json-подобную строку для waybar. Полный скрипт:

#!/bin/bash

CONFIG_FILE="$HOME/.config/hypr/hyprland.conf"
STATE_FILE="$HOME/.config/hypr/.screenshare_rule_disabled"

toggle_rule() {
    if [ -f "$STATE_FILE" ]; then
        sed -i '/windowrulev2.*noscreenshare.*/s/^#//' "$CONFIG_FILE"
        rm -f "$STATE_FILE"
        CLASS="on"
    else
        sed -i '/windowrulev2.*noscreenshare.*/s/^/#/' "$CONFIG_FILE"
        touch "$STATE_FILE"
        CLASS="off"
    fi
}

case ${1} in
    "toggle")
        toggle_rule
        ;;
    *)
        if [ -f "$STATE_FILE" ]; then
            CLASS="off"
        else
            CLASS="on"
        fi
        ;;
esac

echo "{\"class\": \"$CLASS\", \"alt\": \"$CLASS\"}"

Модуль Waybar

Чтобы использовать это удобно и мгновенно определять текущее состояние приватности, напишем модуль waybar:

"custom/noscreenshare": {
  "exec": "~/scripts/toggle_noscreenshare.sh",
  "on-click": "~/scripts/toggle_noscreenshare.sh toggle && pkill -SIGRTMIN+4 waybar",
  "signal": 4,
  "interval": "once",
  "return-type": "json",
  "format": "{icon}",
  "format-icons": {
    "off": "",
    "on": "󰗹"
  },
  "tooltip": false
},

Опишем, что здесь происходит. Чтобы получить значение для этого модуля, мы используем поле exec и указываем наш скрипт. Затем мы определяем, что произойдёт при клике на модуль в опции on-click: запуск скрипта с опцией toggle и отправка системного сигнала waybar. Это позволяет не перезагружать весь процесс waybar, а только этот модуль. Здесь очень важно синхронизировать значение signal и число в команде pkill -SIGRTMIN+4 waybar, и сделать это значение уникальным только для этого модуля waybar. Затем мы настраиваем однократный запуск нашего скрипта при старте waybar и определяем формат отображения (tooltip: false для отключения текста при наведении курсора). Я использую эти иконки nerdfonts для этого, но они не одинакового размера. Поэтому я тонко настраиваю отступы и добавляю некоторые стили:

#custom-noscreenshare {
  background: #1e1e2e;
  opacity: 0.7;
  padding: 0px 10px;
  margin: 5px 5px 3px 0px;
  border: 0px solid #181825;
  border-radius: 10px;
}

#custom-noscreenshare.on {
  font-size: 18px; 
  padding-right: 14px;
}

#custom-noscreenshare.off {
  font-size: 16px;
  padding-right: 16px;
  padding-left: 9px
}

После этого мы получаем удобный интерфейс для практичного контроля нашей приватности:

Читайте оригинал статьи на моём блоге. И подписывайтесь на Telegram канал.

Теги:
Хабы:
+1
Комментарии0

Публикации

Ближайшие события