[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Странная проблема



> а) не переключаться в системную консоль. Единственное зачем мне это
> бывает нужно делать, это если какая-нибудь графическая программа
> (например файрфокс) начинает не просто тормозить, а блокировать весь
> X-сервер, тогда зайти и прибить.

А она прямо все Иксы блокирует, или просто захватывает на себя ввод?

Во втором случае, вероятно, ее совершенно ни к чему было бы прибивать, когда можно просто освободиться от захвата.  Для этого даже сочетание клавиш назначено из коробки: <C-A-kp-divide>, где <kp-divide> — это косая черта, которая на цифровой клавиатурке.

Только сам механизм по-умолчанию отключен, ибо именно на захвате ввода работают иксовые блокировщики экрана.  Но его можно временно включить, а потом как-нибудь выключить.  Например, таким костылем:

#!/bin/bash
# xkb-ungrab --- release keyboard block

# Force ungrab is mapped to <C-A-kp-divide> by default, while killing
# grabbing client - to <C-A-kp-multiply>.  Yet they have no use until
# underlying machinery is explicitly allowed by turning on
# 'grab:break_actions' option.  It must not be turned on however,
# since it allows to trespass screen lockers with ease (most of them)
# or at least to crash user session (SDDM).

hash setxkbmap xdotool xkbcomp fgrep || exit 1

xkbmap-save ()
{
    declare -g -A xkbmap
    while IFS+=':' read key value; do
        xkbmap[$key]=$value
    done < \
         <(setxkbmap -query)
}

xkbmap-restore ()
{
    local -a opts
    for o in rules model layout variant; do
        opts+=("-$o" "${xkbmap[$o]}")
    done
    opts+=(-option '' -option "${xkbmap[options]}")
    setxkbmap "${opts[@]}"
}

[[ $DISPLAY ]] || DISPLAY=':0'
export DISPLAY

xkbmap-save
setxkbmap -option 'grab:break_actions'
xdotool key 'XF86Ungrab' # 'XF86ClearGrab' to kill client that grabbed kbd
xkbmap-restore
if [[ -f "$HOME/.xkb" && -d "$HOME/.xkb.d/" ]]; then
   xkbcomp -I"$HOME/.xkb.d" "$HOME/.xkb" "$DISPLAY"
fi

fgrep -q 'xfree86(grab_break)' < <(xkbcomp "$DISPLAY" -) \
    && printf >&2 $"Something went wrong: FORCE UNGRAB IS STILL ALLOWED\n"
Оно хотя и редко бывает нужно, но узнать, нет ли более чистого решения, было бы весьма интересно.  Таким мог быть, к примеру, вызов блокировщика экрана через тот же механизм, что и снятие захвата.

Reply to: