4

私はPythonでUbuntuLinux用のアンチRSI/タイピングブレークプログラムを書いています。「キーボードをロック」して、「ロックを解除」するまですべてのキー押下が無視されるようにしたいと思います。ユーザーにタイピングの休憩を強制できるようにしたいと思います。

プログラムが後でキーボードをリリースするまで(0.1秒→10秒後)、キーボードを(ほぼ瞬時に)「オフ」にするプログラム的な方法が必要です。「キーボードをオフにした」間は、どのウィンドウやウィンドウマネージャーなどにもキーを押さないでください。できれば、画面に同じコンテンツが表示されることをお勧めします。このプログラムがフォアフォントになく、フォーカスがない場合でも、キーボードをロックする必要があります。

一部のプログラムはすでにこれを行うことができます(例:Work Rave)

Linux / X11でこれを行うにはどうすればよいですか?(Pythonで推奨)

4

3 に答える 3

4

これに基づいて私が思いついたコードは次のとおりです。

class KeyboardLocker:

    def __init__(self, serio=0):
        self._on = False
        self.serio = serio

    def on(self):
        return self._on

    def write_value(self,path, value):
        with open(path, "a") as f:
            f.write(value)

    def toggle(self):
        if self.on():
            self.turn_off()
        else:
            self.turn_on()

    def description(self):
        path = '/sys/devices/platform/i8042/serio%d/description' % (self.serio,)
        with open(path, "r") as f:
            description = f.read()
        return description

    def turn_on(self):
        try:
            self.write_value('/sys/devices/platform/i8042/serio%d/bind_mode' % (self.serio,),
                            'auto')
        except IOError, e:
            self._on = False
            raise
        else:
            self._on = True
        return self.on()

    def turn_off(self):
        try:
            self.write_value('/sys/devices/platform/i8042/serio%d/bind_mode' % (self.serio,),
                            'manual')
            self.write_value('/sys/devices/platform/i8042/serio%d/drvctl' % (self.serio,),
                            'psmouse')
        except IOError, e:
            self._on = True
            raise
        else:
            self._on = False
        return self.on()

if __name__ == "__main__":
    kl = KeyboardLocker(serio=0)

    device = kl.description()
    print "We got a lock on", device

    proceed = raw_input("Do you want to proceed? (y/n)").lower().startswith("y")
    import sys
    if not proceed: sys.exit(1)

    kl.turn_off()

    import time
    wait = 5
    print "Sleeping few seconds...", wait
    time.sleep(wait)
    print "Voila!"

    kl.turn_on()

    raw_input("Does it work now?")

Linux Mint 12、X11、HPラップトップ、Gnomeでテスト済み。それが重要かどうかはわかりませんが:)

UPDATEパスを変更するオプション(「serio0」や「serio1」など)を追加しました。そして、説明を印刷します。私にとって、serio0は私に与えました:i8042 KBD port、おそらく「KBD」が含まれている場合、それは正しいです、続行します。そうでない場合、私はあなたに保証を与えません:)

于 2012-05-24T15:41:53.143 に答える
2

これを行うための標準的な方法は、入力を取得することです。このため、ウィンドウが実際に表示されている必要はありません。通常、入力専用ウィンドウでうまくいきます。ただし、ユーザーに何らかのフィードバックを提供する必要があります。ユーザーの入力が機能しなくなった理由です。これをフォーカスグラブとして実行すると、プログラムがクラッシュしてもシステムが応答しなくなることがないという利点があります。

ところで:私は、ユーザーを強制的に中断すると思います。おそらく、重要な操作の途中で、大規模なノーゴーです!私はそれらのプログラムの目的を理解していませんでした。ユーザーは画面のアイドリングの前に座り、おそらく考えを失います。ちょうど私の2セント。

于 2012-05-26T20:55:43.877 に答える
1

これは、xinputを使用したシェルスクリプトで簡単に実行できます。

 #!/bin/sh

 do_it() {
     # need error checking there. We should also restrict which device gets
     # deactivated, by checking other properties.
     keyboard_ids="$(xinput list | sed -rn 's/.*id=([0-9]+).*slave\s+keyboard.*/\1/p')"

     for keyboard_id in $keyboard_ids; do
         # 121 is "Device Active".
         # use xinput watch-props $device_id to see some properties.
         xinput set-int-prop $keyboard_id 121 8 $1;
     done;
 }
 # you maybe don't want to exit in case of failure there.
 do_it 0 ; sleep 5; do_it 1

このロジックはPythonで簡単に書き換えることができます。xinputのインストールに問題がある場合は、xinputのソースをフェッチし、python-xlibなどのライブラリを使用してPythonで再実装することをお勧めします。

于 2012-05-24T20:43:07.673 に答える