Используйте ключ-модификатор для изменения ассоциации файлов

При просмотре фильма на ноутбуке он должен хитро отключить свой экран:

  • Если внешний экран не подключен, не отключайте.
  • Если для открытия фильма используется ключ-модификатор, не отключайте его.
  • Если внешний экран подключен и модификатор не используется, отключите экран ноутбука.
  • Когда медиаплеер выйдет, восстановите экран ноутбука.

Я написал следующий скрипт:

#!/bin/bash
if [ "$(cat /sys/class/drm/card0-VGA-1/status)" = connected ]
then
  xrandr --output eDP1 --off
  vlc "$1"
  while [ "$(pidof vlc)" > 0 ]
  do
    sleep 1
  done
  xrandr --output eDP1 --auto --below VGA1
else
  vlc "$1"
fi

eDP1 представляет собой экран ноутбука, VGA1 - внешний экран. Сценарий используется для связывания файлов фильмов в ~/.local/share/applications/mimeapps.list со следующим файлом рабочего стола:

[Desktop Entry]
Name=VLC
Comment=
Exec=path/to/the/above/script
Icon=vlc
Terminal=false
Type=Application
StartupNotify=true

Можете ли вы предложить способ изменения сценария или файла рабочего стола или любой другой способ проверки наличия ключа-модификатора - единственное ограничение заключается в том, что для открытия фильма нужно использовать одно действие.

1 ответ

Решение

Кажется, нет готового решения. Тем не менее, нетрудно использовать Xlib и Xkb напрямую.

Создать файл getmodkey.c:

#include <X11/Xlib.h>
#include <stdio.h>
#include <X11/XKBlib.h>

int main() {
    XkbStateRec r;
    Display* d = XOpenDisplay(NULL);
    XkbGetState(d, XkbUseCoreKbd, &r);
    printf("mod: 0x%x\n", r.mods);
    XCloseDisplay(d);
    return !( r.mods & 1 );
}

и скомпилировать -lX11, например

make LDLIBS="-lX11" getmodkey

Код состояния выхода из программы будет 0 если была нажата клавиша Shift, 1 иначе. Чтобы проверить другой модификатор, настройте (r.mods & keymask) условие (маска для Shift - 1).

Тогда эта программа должна легко интегрироваться,

if getmodkey; then 
  echo "shift!"
else
  echo "no shift"
fi
Другие вопросы по тегам