На самом деле это проект уровня не выше начинающего сисадмина, а "управляющий модуль" на elisp.
Вкратце: отслеживает активность юзера (мышь-клавиатура), если пользователь слишком засиживается, то блокируется именно клавиатура и мышь (не монитор!), перейти на другую виртуальную консоль- нельзя, Ctrl+Shift+Backspace вам тоже не поможет Не привязан ни к какому DE, но при этом elisp > Emacs. Если интересно, могу опубликовать "код". Ну, быдлокод т. е.
Ультимативный Блокировщик Экрана (;))
Модератор: Модераторы разделов
- Bizdelnick
- Модератор
- Сообщения: 20793
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Ультимативный Блокировщик Экрана
Выкладывайте, а интересно или нет — потом станет ясно. ☺
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Ультимативный Блокировщик Экрана
То, что на elisp, каждый сам легко сможет сделать на шелл (но если кому-то будет нужно..). Тут важно другое, а именно утилиты и конфиги, нужные, чтобы это работало:
0. xprintidle
1. https://github.com/muennich/physlock
2. https://github.com/leonnnn/pyxtrlock
3. /etc/X11/xorg.conf:
4*. zenity
Остальное не так интересно: что-то в цикле проверяет xprintidle, и в зависимости от значения счетчика блокирует (pyxtrlock + physlock) или не блокирует ввод. Есть пара тонкостей в алгоритме, думаю можно сделать куда красивее, можно не использовать столько сторонних утилит, но я не программист. Остальное добавлю позже.
0. xprintidle
1. https://github.com/muennich/physlock
2. https://github.com/leonnnn/pyxtrlock
3. /etc/X11/xorg.conf:
Код: Выделить всё
Section "Serverflags"
Option "DontZap" "yes"
# Disable Ctrl-Alt_backspace
EndSection
4*. zenity
Остальное не так интересно: что-то в цикле проверяет xprintidle, и в зависимости от значения счетчика блокирует (pyxtrlock + physlock) или не блокирует ввод. Есть пара тонкостей в алгоритме, думаю можно сделать куда красивее, можно не использовать столько сторонних утилит, но я не программист. Остальное добавлю позже.
Re: Ультимативный Блокировщик Экрана
Небольшой комментарий на тему: А зачем все это нужно? Долго сидение за монитором- в одной позе- приводит к проблемам с осанкой, туннельному синдрому и даже к проблемам со зрением. А я как раз из числа любителей посидеть столько, сколько нужно для дела)) И тут выясняется, что комп на Linux очень не просто полностью заблокировать: всегда остаются виртуальные консоли, завершение X-сессии и может быть даже что-то еще. На Reddit`е утверждали, что это вообще невозможно, я решил с ними поспорить- и вот результат.
Re: Ультимативный Блокировщик Экрана
my-break-timer.el
locker.sh
Ну и дополнительно требуется подкорректировать код модуля pyxtrlock, но там тривиальный python и вообще ничего интересного (иначе по вводу пароля он разблокирует экран, а этого-то и не нужно!)
Код: Выделить всё
(defun my-break-timer (session idle)
"Simple typing break control module, screen (keyboard) locker not included,
as it is quite difficult to do correctly. Also requied utility 'xprintidle' (https://launchpad.net/ubuntu/+source/xprintidle)"
(defvar session-time nil)
(defvar idle-time nil)
;; Детектируемое время простоя, сек. Рекомендованное значение- от 10 секунд до ..
(defvar start-time nil)
(defvar n-staus nil)
(defvar main-timer nil)
(setq start-time (string-to-number (format-time-string "%s")))
(setq session-time (* session 60)) ;; min > sec
(setq idle-time idle)
(setq n-status 1)
(setq BREAK_TIMER_T session-time)
(defun break-timer-action ()
(async-shell-command "~/locker.sh"))
(defun printidle ()
(/ (string-to-number (shell-command-to-string "xprintidle")) 1000))
(defun main-loop ()
(let ((time0 (- session-time (- (string-to-number (format-time-string "%s")) start-time)))) ;; время сессии - (текущее время [Unix_time] - время старта [Unix_time]), секунды.
(when (> (printidle) idle-time)
(setq start-time (+ start-time idle-time))) ;; смещаем временное окно "вперед"
(when (and (< time0 60) (= n-status 1))
(async-shell-command "notify-send -u critical -i dialog-warning \"До перерыва меньше минуты.\"")
(setq n-status (+ 1 n-status))) ;; блокировка на одно оповещение, а то может задолбать))
(when (< time0 0)
(break-timer-action)
(setq start-time (string-to-number (format-time-string "%s")))
(setq n-status 1))
(when (< time0 BREAK_TIMER_T)
(setq BREAK_TIMER_T (*
(/ time0 (* 60 15)) ;; целочисленное (!) деление,
(* 60 15))) ;; результат с кратностью 15 (мин) для отображения в mode line
(force-mode-line-update))
))
(defun modeline-break-t ()
"Generate mode line text"
(let ((output nil))
(setq output (concat " [~ "(format "%s" (/ BREAK_TIMER_T 60)) " 2B] "))))
(defun my-break-timer-off ()
"Stop typing break timer!"
(interactive)
(cancel-timer main-timer))
(defun break-now ()
"Сделать перерыв СЕЙЧАС"
(interactive)
(setq start-time (- start-time session-time)))
(setq main-timer
(run-at-time 3 idle-time 'main-loop))
;; End module
)
locker.sh
Код: Выделить всё
#!/bin/sh
if [ -z "$1" ]
then b=15
echo "Error: no arg. Use default value."
else b="$1"
fi
if (("$1" > 20))
then echo "Error: very long timeout"
exit 1
fi
let time=$b*60 # min > sec
ti=0
i=2
# LOCK
physlock -lsd
(pyxtrlock &)
# WAIT
while (( ti <= time ))
do sleep $i
((ti += i))
echo $((ti * 100 / time - 1))
done | zenity --progress --title="Перерыв $b минут." --height=100 --cancel-label="" --ok-label="*" --text="ТЕКСТ\n" --percentage=0 --auto-close
# UNLOCK
physlock -L
killall pyxtrlock
exit 0
Ну и дополнительно требуется подкорректировать код модуля pyxtrlock, но там тривиальный python и вообще ничего интересного (иначе по вводу пароля он разблокирует экран, а этого-то и не нужно!)