Linux: Verhindert, dass die Tastatur unter X eingeschaltet wird

548
Rena

Ich versuche einen Key zu binden (using xbindkeys), um meine Monitore unter X ein- / auszuschalten. Bisher habe ich den Key an dieses Skript gebunden:

#!/bin/bash MOUSE="Logitech USB-PS/2 Optical Mouse"  if [[ ! -z $(xset q | grep "Monitor is On") ]]; then logger "Turning off display" xinput disable "$MOUSE" xset s 2 2 xset dpms force off else logger "Turning on display" xinput enable "$MOUSE" xset s 3600 3600 xset dpms force on fi 

Dies funktioniert fast perfekt: Wenn der Bildschirm eingeschaltet ist, wird die Maus deaktiviert (um ein versehentliches Aufwecken zu verhindern), die Ausblendzeit wird auf 2 Sekunden eingestellt (nur für den Fall, dass etwas aufgeweckt wird), und der Bildschirm wird ausgeschaltet. Wenn es deaktiviert ist, werden die vorherigen Einstellungen wiederhergestellt und der Bildschirm wird wieder eingeschaltet.

Leider scheint dies nicht zu funktionieren, wenn es tatsächlich an eine Taste gebunden ist: Es glaubt immer, der Bildschirm sei eingeschaltet. Ich vermute, das liegt daran, dass sie durch Drücken der Taste wieder eingeschaltet werden und dann das Skript ausgeführt wird, das sie wieder abschaltet.

Ich kann keine Möglichkeit finden, zu verhindern, dass der Bildschirm beim Tastendruck automatisch eingeschaltet wird, es sei denn, die Tastatur wird vollständig deaktiviert (dies würde das Wiedereinschalten erschweren).

Eine noch bessere Lösung wäre, wenn ich jedes Mal ein Skript ausführen könnte, wenn der Bildschirm ein- / ausgeschaltet wird. Dann kann ich den Bildschirm immer noch einschalten, indem Sie eine beliebige Taste drücken, nicht nur die, die an dieses Skript gebunden ist.

4
IIRC X11 macht drei Ereignisse pro Tastendruck verfügbar: Tastendruck, Tastendruck (möglicherweise wiederholt) und Tastendruck. Stellen Sie sicher, dass Ihr Skript nicht von mehr als einem dieser Skripts aufgerufen wird. a CVn vor 9 Jahren 0

2 Antworten auf die Frage

2
holytrousers

Das Skript wird sofort ausgeführt, nachdem Sie die gebundene Taste gedrückt haben. Der Bildschirm wird jedoch erst wieder aktiviert, wenn Sie ihn freigeben.

Sie können dies durch Eingabe testen

xset dpms force off 

in Ihrem Terminal und gedrückt halten Enter.

Der Bildschirm bleibt ausgeschaltet, bis Sie die Taste loslassen, und schaltet sich sofort wieder ein.

Eine einfache Problemumgehung besteht darin, eine kleine Verzögerung hinzuzufügen, um den xsetBefehl auszuführen, nachdem der Schlüssel freigegeben wurde ( sleepz. B. mit dem Befehl).

1
Toby Speight

Etwas, das ich getan habe, ist zu verwenden xscreensaver(nur den Bildschirm leer zu machen, keine Grafik-Hacks auszuführen) und dann mit folgendem Befehl zu sehen xscreensaver-command -watch:

 -watch Prints a line each time the screensaver changes state: when the screen blanks, locks, unblanks, or when the running hack is changed. This option never returns; it is intended for use by shell scripts that want to react to the screensaver in some way. An example of its output would be: BLANK Fri Nov 5 01:57:22 1999 RUN 34 RUN 79 RUN 16 LOCK Fri Nov 5 01:57:22 1999 RUN 76 RUN 12 UNBLANK Fri Nov 5 02:05:59 1999 

Die Manpage enthält ein Beispiel, das einen Blick wert ist.

Leider besteht Stock xscreensaverdarauf, dass die DPMS-Einstellungen von Zeit zu Zeit auf ihre eigenen Werte gesetzt werden. Ich habe einen Patch eingereicht , um das zu stoppen, aber Jwz lehnte es ab. Sie finden den Patch möglicherweise hilfreich - oder kompilieren Sie einfach xscreensaver mit --without-dpms-ext.

Alternativ kann es sinnvoll sein, den xscreensaverCode auf Hinweise zu überprüfen, wie man seinen eigenen Beobachter schreibt.