Ультимативный Блокировщик Экрана (;))

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Аватара пользователя
rl0ad
Сообщения: 123
ОС: Leap 42.1

Ультимативный Блокировщик Экрана

Сообщение rl0ad » 29.03.2016 15:55

На самом деле это проект уровня не выше начинающего сисадмина, а "управляющий модуль" на elisp.
Вкратце: отслеживает активность юзера (мышь-клавиатура), если пользователь слишком засиживается, то блокируется именно клавиатура и мышь (не монитор!), перейти на другую виртуальную консоль- нельзя, Ctrl+Shift+Backspace вам тоже не поможет ;) Не привязан ни к какому DE, но при этом elisp > Emacs. Если интересно, могу опубликовать "код". Ну, быдлокод т. е.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15765
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Ультимативный Блокировщик Экрана

Сообщение Bizdelnick » 29.03.2016 16:21

Выкладывайте, а интересно или нет — потом станет ясно. ☺
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
rl0ad
Сообщения: 123
ОС: Leap 42.1

Re: Ультимативный Блокировщик Экрана

Сообщение rl0ad » 29.03.2016 16:42

То, что на elisp, каждый сам легко сможет сделать на шелл (но если кому-то будет нужно..). Тут важно другое, а именно утилиты и конфиги, нужные, чтобы это работало:
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) или не блокирует ввод. Есть пара тонкостей в алгоритме, думаю можно сделать куда красивее, можно не использовать столько сторонних утилит, но я не программист. Остальное добавлю позже.
Спасибо сказали:

Аватара пользователя
rl0ad
Сообщения: 123
ОС: Leap 42.1

Re: Ультимативный Блокировщик Экрана

Сообщение rl0ad » 29.03.2016 17:00

Небольшой комментарий на тему: А зачем все это нужно? Долго сидение за монитором- в одной позе- приводит к проблемам с осанкой, туннельному синдрому и даже к проблемам со зрением. А я как раз из числа любителей посидеть столько, сколько нужно для дела)) И тут выясняется, что комп на Linux очень не просто полностью заблокировать: всегда остаются виртуальные консоли, завершение X-сессии и может быть даже что-то еще. На Reddit`е утверждали, что это вообще невозможно, я решил с ними поспорить- и вот результат.
Спасибо сказали:

Аватара пользователя
rl0ad
Сообщения: 123
ОС: Leap 42.1

Re: Ультимативный Блокировщик Экрана

Сообщение rl0ad » 29.03.2016 22:00

my-break-timer.el

Код: Выделить всё

(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 и вообще ничего интересного (иначе по вводу пароля он разблокирует экран, а этого-то и не нужно!)
Спасибо сказали: