マウスが接続されているかどうかに応じて、タッチパッドを切り替えるにはどうすればよいですか?


10

外部マウスが接続されている場合はタッチパッドを自動的に無効にし、外部マウスがない場合は有効にします。使用してみましたtouchpad-indicatorが、マウスを接続した状態でコンピューターをスリープ状態にし、マウスを外した状態でコンピューターをスリープ解除すると失敗します。

この問題を解決するために、次のスクリプトをデーモンにしようとしましたが、機能しません。

#!/bin/bash

declare -i TID
declare -i MID
TID=`xinput list | grep -Eo 'Touchpad\s*id\=[0-9]{1,2}' | grep -Eo '[0-9]{1,2}'`
MID=`xinput list | grep -Eo 'Mouse\s*id\=[0-9]{1,2}' | grep -Eo '[0-9]{1,2}'`
if [ $MID -gt 0 ]
then
    xinput disable $TID
else
    xinput enable $TID
fi

私は試した start-stop-daemon -S -x ./myscript.sh -b

そして setsid ./myscript.sh >/dev/null 2>&1 < /dev/null &

そしてnohup ./myscript 0<&- &>/dev/null & さらに./myscript.sh &

これらはすべて、4桁の数値を返します。これは、開始されたプロセスのPIDと思われますが、lxtaskを起動すると、「すべてのプロセスを表示」にチェックマークを付けても、このPIDを持つプロセスはありません。そしてもちろん、それは機能しません!


@terdon Imは、接続されたUSBマウスを監視するデーモンを作成し、タッチパッドを有効または無効にするようにxinputに要求しようとしています。この問題に対する他の唯一の解決策であるタッチパッドインジケーターと呼ばれるプログラムには、少し欠陥があります。マウスを接続した状態でノートブックをスリープ状態にしてスリープ状態にした場合、最も近いマウスを検索して接続/切断し、タッチパッドを有効にする必要があります。要するに、目が覚めたら再確認してほしい。
mekkanizer 2014年

Ask Ubuntuへようこそ!質問を編集して追加情報を追加してください。読みづらく、コメントを見逃すのは簡単です。
terdon 2014年

まず第一に、あなたはあなたが「それをデーモン化しようとしている」ことと、それについてあなたがどれほど正確に進んでいるのかを説明するべきです。次に、xinput実行中のXサーバーが必要であり、デーモンとしてものを実行するほとんどの方法には、Xに接続するための知識または機能がない。誰かが申請しようとしていることは実際にはそれを成し遂げる方法ではなく、一般的にXY問題として知られている間違った質問をすることになります。
terdon 2014年

@terdonソリューションの検索に戻りますが、xinputの(可能ですか?)アナログは次のどれですか。1.バックグラウンドで実行できます2.デバイスを有効/無効にできますか?
mekkanizer 2014年

1
コメントを削除しました。Ask Ubuntuでいいことはオプションではありません。よろしくお願いします。失礼なコメントは警告なしに削除されます。
セス

回答:


10

必要な基本的なスクリプトは次のとおりです。

#!/usr/bin/env bash

## Get the touchpad id. The -P means perl regular expressions (for \K)
## the -i makes it case insensitive (better portability) and the -o
## means print only the matched portion. The \K discards anything matched
## before it so this command will print the numeric id only.
TID=$(xinput list | grep -iPo 'touchpad.*id=\K\d+')

## Run every second
while :
do
   ## Disable the touchpad if there is a mouse connected
   ## and enable it if there is none.
    xinput list | grep -iq mouse &&  xinput disable "$TID" || xinput enable "$TID" 
    ## wait one second to avoind spamming your CPU
    sleep 1
done

上記のスクリプトは、マウスが接続されているかどうかに応じてトラックパッドを切り替えます。起動すると永久に実行され、毎秒マウスをチェックし、それに応じてタッチパッドを無効または有効にします。

次に、スクリプトをとして保存し、~/touchpad.sh実行可能(chmod +x ~/touchpad.sh)にして、GUIセッションスタートアッププログラムに追加します。使用しているデスクトップ環境を指定していませんが、あなたが言及しているlxtaskので、使用していると想定しますLXDE。いずれの場合もLXDE、との両方の手順は次のとおりですUnity

  1. LXDEの自動起動ファイルにスクリプトを追加します

    echo "@$HOME/touchpad.sh" >> ~/.config/lxsession/PROFILE/autostart file

    "PROFILE"を実際のLXDEプロファイルの名前に置き換えてください。を実行すると、その内容を確認できますls ~/.config/lxsession/

  2. Unityの自動起動ファイルにスクリプトを追加する

    開くStartup Applications(ダッシュボードで「スタートアップ」を検索)

    ここに画像の説明を入力してください

    [追加]をクリックし、スクリプトへのパスをコマンドフィールドに貼り付けます。

    ここに画像の説明を入力してください


バックグラウンドでスクリプトを実行することについてググると、誰もがループを使用しないように提案したので、私はループを使用しませんでした。それが唯一の解決策であり、デーモンのスクリプトで使用できるxinputの類似物がなく、デバイスを有効/無効にできる場合は... OK、それを使用します。
mekkanizer 14年

1
@mekkanizerこれは、それ自体としては本当に最良の方法ではありません。よりクリーンな方法は、udevルールを使用し、必要なX認証情報をそれらにエクスポートすることです。必要に応じてそれを調べることができます。
terdon 2014年

ありがとうございます。動作するようになったら、返信します(または回答を投稿します)
mekkanizer '23 / 03/14

10

さて、私はそれのためにudevルールを作りました、そしてそれは、@ terdonが言ったように、はるかにきれいな方法です

そこで、このガイドのおかげで、/ etc / udev / rules.d /(ルートアクセスが必要)に「touchpad_toggle.rules」ファイルを作成し、次の2行で埋めました。

SUBSYSTEM=="input", KERNEL=="mouse[0-9]*", ACTION=="add", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/username/.Xauthority", RUN+="/home/username/on.sh"
SUBSYSTEM=="input", KERNEL=="mouse[0-9]*", ACTION=="remove", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/username/.Xauthority", RUN+="/home/username/off.sh"

「username」を自分のユーザー名に置き換えることを忘れないでください!

これらのオンとオフのシェルスクリプトの内容は、私の質問のスクリプトの去勢バージョンです。例-off.sh:

#!/bin/bash

declare -i TID
TID=`xinput list | grep -Eo 'Touchpad\s*id\=[0-9]{1,2}' | grep -Eo '[0-9]{1,2}'`
xinput disable $TID

on.shでxinput enable $ TIDを使用する必要があります

そして、私の質問にスクリプト(または@terdonが提案したものですが、ループなしで)をセッションの自動開始に追加して、彼が答えで言ったのを忘れないでください。

それだけですが、1つ追加する必要があります。

Synapticsタッチパッドを使用している場合(私はElantechを持っているので、私には適していません)、スクリプト(RUN + =の後に書き込むパス)を/usr/bin/synclient TouchpadOff=0それぞれ単純なコマンドと1に置き換えることができます。


ちょっとしたヒントです。udevルールを作成するにはルートアクセスが必要なため、ホームディレクトリ以外の場所にファイルを保存することをお勧めします。例:/usr/local/binまたは/opt/touchpad-toggle/bin/
ダン

@ダンは辞退しました。ユーザー設定に関連するすべてのものは、ホームディレクトリにある方が適切です。残念ながら、もちろんスナップショットを復元しない限り、udevのルール、ログインマネージャーの設定、その他いくつかのことは、/パーティションをスクラップするたびに/ *にコピーされる運命にあります。そのため、/ home /に格納するものを増やすことは便利です。だから、あなたのアドバイスは価値がありません
mekkanizer

しかし、それはudevルールとして追加されたので、誰がログに記録したかに関係なく、すべてのユーザーに対して実行されることを意味しませんか?
Dan

共有PCでLinuxを使用したことがないので、確認しませんでした。とにかく、このきちんとしたudevルールにイライラするユーザーは、私の興味の対象ではありません。彼らがそれほど敏感であるならば、彼らは彼ら自身のインスタレーションを手に入れることができます
mekkanizer '18
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.