Use uma chave modificadora para modificar a associação de arquivos

Use uma chave modificadora para modificar a associação de arquivos

Ao assistir a um filme em um laptop, ele deve desabilitar sua tela de maneira inteligente:

  • Se nenhuma tela externa estiver conectada, não desative.
  • Se uma tecla modificadora for usada para abrir o filme, não desative.
  • Se uma tela externa estiver conectada e nenhum modificador for usado, desative a tela do laptop.
  • Quando o media player sair, restaure a tela do laptop.

Eu escrevi o seguinte script:

#!/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 representa a tela do laptop, VGA1 a tela externa. O script é usado associando arquivos de filme ~/.local/share/applications/mimeapps.listao seguinte arquivo da área de trabalho:

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

Você pode sugerir uma maneira de modificar o script ou o arquivo da área de trabalho, ou qualquer outra maneira de verificar uma chave modificadora - a única restrição é que uma única ação deve ser usada para abrir o filme.

Responder1

Parece não haver solução pronta para uso. No entanto, não é difícil usar Xlib e Xkb diretamente.

Crie um arquivo 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 );
}

e compilá-lo com -lX11, por exemplo

make LDLIBS="-lX11" getmodkey

O código de status de saída do programa seria 0se a tecla Shift fosse pressionada, 1caso contrário. Para testar um modificador diferente, ajuste a (r.mods & keymask)condição (a máscara para Shift é 1).

Então, este programa deve ser fácil de integrar,

if getmodkey; then 
  echo "shift!"
else
  echo "no shift"
fi

informação relacionada