Verwenden Sie eine Modifikatortaste, um die Dateizuordnung zu ändern

Verwenden Sie eine Modifikatortaste, um die Dateizuordnung zu ändern

Beim Ansehen eines Films auf einem Laptop sollte dieser seinen Bildschirm geschickt deaktivieren:

  • Wenn kein externer Bildschirm angeschlossen ist, nicht deaktivieren.
  • Wenn zum Öffnen des Films eine Sondertaste verwendet wird, nicht deaktivieren.
  • Wenn ein externer Bildschirm angeschlossen ist und kein Modifikator verwendet wird, deaktivieren Sie den Laptop-Bildschirm.
  • Wenn der Media Player beendet wird, stellen Sie den Laptop-Bildschirm wieder her.

Ich habe das folgende Skript geschrieben:

#!/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 stellt den Laptop-Bildschirm dar, VGA1 den externen Bildschirm. Das Skript wird verwendet, indem Filmdateien ~/.local/share/applications/mimeapps.listmit der folgenden Desktop-Datei verknüpft werden:

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

Können Sie eine Möglichkeit vorschlagen, das Skript oder die Desktopdatei zu ändern, oder eine andere Möglichkeit, nach einer Modifikatortaste zu suchen? Die einzige Einschränkung besteht darin, dass zum Öffnen des Films eine einzelne Aktion verwendet werden muss.

Antwort1

Es scheint keine Standardlösung zu geben. Es ist jedoch nicht schwierig, Xlib und Xkb direkt zu verwenden.

Erstellen Sie eine Datei 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 );
}

und kompilieren Sie es mit -lX11, zum Beispiel

make LDLIBS="-lX11" getmodkey

Der Exit-Statuscode des Programms wäre, 0wenn die Umschalttaste gedrückt wurde, 1andernfalls. Um auf einen anderen Modifikator zu testen, passen Sie die (r.mods & keymask)Bedingung an (die Maske für Umschalt ist 1).

Dann sollte dieses Programm einfach zu integrieren sein,

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

verwandte Informationen