Utilice una tecla modificadora para modificar la asociación de archivos

Utilice una tecla modificadora para modificar la asociación de archivos

Al mirar una película en una computadora portátil, debería desactivar inteligentemente su pantalla:

  • Si no hay ninguna pantalla externa conectada, no la desactive.
  • Si se utiliza una tecla modificadora para abrir la película, no la desactive.
  • Si se conecta una pantalla externa y no se utiliza ningún modificador, desactive la pantalla del portátil.
  • Cuando se cierre el reproductor multimedia, restaure la pantalla de la computadora portátil.

He escrito el siguiente 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 la pantalla del portátil, VGA1 la pantalla externa. El script se utiliza asociando archivos de película ~/.local/share/applications/mimeapps.listcon el siguiente archivo de escritorio:

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

¿Puede sugerir una forma de modificar el script o el archivo del escritorio, o cualquier otra forma de buscar una tecla modificadora? La única restricción es que se debe utilizar una sola acción para abrir la película.

Respuesta1

No parece haber una solución estándar. Sin embargo, no es difícil utilizar Xlib y Xkb directamente.

Crea un archivo 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 );
}

y compilarlo con -lX11, por ejemplo

make LDLIBS="-lX11" getmodkey

El código de estado de salida del programa sería 0si se presionara la tecla Shift; 1de lo contrario. Para probar un modificador diferente, ajuste la (r.mods & keymask)condición (la máscara para Shift es 1).

Entonces, este programa debería ser fácil de integrar,

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

información relacionada