Bagaimana saya bisa mengganti touchpad tergantung pada apakah mouse terhubung?

10

Saya ingin agar touchpad saya dinonaktifkan secara otomatis ketika mouse eksternal terhubung dan diaktifkan ketika tidak ada mouse. Saya sudah mencoba menggunakan touchpad-indicatortetapi itu gagal dalam kasus-kasus ketika komputer telah ditidurkan dengan mouse yang terhubung dan terbangun dengan mouse terputus.

Saya telah mencoba membuat skrip berikut menjadi daemon untuk menyelesaikan masalah ini, tetapi saya tidak dapat membuatnya berfungsi:

#!/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

Saya mencoba start-stop-daemon -S -x ./myscript.sh -b

dan setsid ./myscript.sh >/dev/null 2>&1 < /dev/null &

dan nohup ./myscript 0<&- &>/dev/null & bahkan./myscript.sh &

Semua ini mengembalikan beberapa angka 4 digit, yang, saya kira, harus PID dari proses yang dimulai tetapi ketika saya meluncurkan lxtask tidak ada proses dengan PID ini , bahkan jika saya mencentang "lihat semua proses". Dan, tentu saja, itu tidak berhasil!

mekkanizer
sumber
@terdon Saya mencoba membuat daemon menonton mouse usb yang terhubung dan meminta xinput untuk mengaktifkan atau menonaktifkan touchpad. Satu-satunya solusi lain untuk masalah ini, sebuah program yang disebut touchpad-indicator, memiliki sedikit kekurangan. Ketika saya menulis notebook saya tertidur dengan mouse terhubung dan bangun tanpa, saya harus mencari mouse terdekat untuk menghubungkan / melepaskannya sehingga touchpad saya akan diaktifkan. Singkatnya, saya ingin fakta itu diperiksa ulang saat bangun tidur.
mekkanizer
Selamat Datang di Tanya Ubuntu! Harap edit pertanyaan Anda untuk menambahkan info tambahan, sulit dibaca dan mudah terlewatkan dalam komentar.
terdon
Pertama-tama Anda harus menjelaskan bahwa Anda "mencoba untuk mengubah bentuknya" dan bagaimana tepatnya Anda melakukannya. Kemudian, xinputmemerlukan server X yang berjalan, dan sebagian besar metode menjalankan hal-hal seperti daemon tidak memiliki pengetahuan atau kemampuan untuk terhubung ke X. Ketiga, dan alasan utama mengapa Anda harus selalu menjelaskan apa yang Anda coba lakukan adalah solusi yang sangat sering bahwa seseorang berusaha menerapkannya sebenarnya bukanlah cara untuk menyelesaikannya dan Anda akhirnya mengajukan pertanyaan yang salah, umumnya dikenal sebagai masalah XY .
terdon
@terdon Kembali ke mencari solusi, apa analog (mungkin?) analog dari xinput yang: 1. Dapat berjalan di latar 2. Dapat mengaktifkan / menonaktifkan perangkat?
mekkanizer
1
komentar dihapus . Bersikap baik pada Tanya Ubuntu bukan opsional. Tolong bersikap yang baik. Komentar kasar akan dihapus tanpa peringatan.
Seth

Jawaban:

10

Skrip dasar yang Anda butuhkan hanyalah:

#!/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

Script di atas akan mengaktifkan trackpad tergantung pada apakah mouse terhubung. Saat diluncurkan, ini akan berjalan selamanya dan akan memeriksa mouse setiap detik, menonaktifkan atau mengaktifkan touchpad sesuai.

Sekarang, simpan skrip sebagai ~/touchpad.sh, buat skrip tersebut dapat dieksekusi ( chmod +x ~/touchpad.sh) dan tambahkan ke program startup sesi GUI Anda. Anda belum menentukan lingkungan desktop mana yang Anda gunakan, tetapi karena Anda menyebutkan lxtask, saya akan menganggap Anda menggunakan LXDE. Bagaimanapun, berikut adalah instruksi untuk keduanya LXDEdan Unity:

  1. Tambahkan skrip ke file autostart LXDE

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

    Pastikan Anda mengganti "PROFIL" dengan nama sebenarnya dari profil LXDE Anda, Anda dapat mengetahui apa itu dengan menjalankan ls ~/.config/lxsession/.

  2. Tambahkan skrip ke file autostart Unity

    Buka Startup Applications(cari di dashboard untuk "Startup")

    masukkan deskripsi gambar di sini

    Klik "Tambah" dan kemudian tempel jalur ke skrip Anda di bidang perintah:

    masukkan deskripsi gambar di sini

terdon
sumber
Saya tidak menggunakan loop karena ketika saya googled tentang menjalankan skrip di latar belakang, semua orang menyarankan untuk tidak menggunakan loop. Jika itu satu-satunya solusi dan tidak ada analog xinput yang BISA digunakan dalam skrip untuk daemon dan BISA mengaktifkan / menonaktifkan perangkat ... ok, saya akan menggunakannya.
mekkanizer
1
@mekkanizer ini sebenarnya bukan cara terbaik . Cara yang jauh lebih bersih adalah dengan menggunakan aturan udev dan mengekspor kredensial X yang diperlukan kepada mereka. Anda dapat melihatnya jika Anda mau.
terdon
Terima kasih, akan lakukan. Jika saya membuatnya bekerja, saya akan menulis kembali (atau mengirim jawaban)
mekkanizer
10

Oke, saya sudah membuat aturan udev untuk itu, dan itu, seperti @terdon katakan, cara yang jauh lebih bersih

Jadi, berkat panduan ini , saya membuat file "touchpad_toggle.rules" di /etc/udev/rules.d/ (memerlukan akses root) dan mengisinya dengan dua baris:

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"

Jangan lupa ganti "nama pengguna" dengan nama pengguna Anda!

Isi skrip shell aktif dan nonaktif ini hanya versi kastrasi dari skrip dalam pertanyaan saya. Contoh - 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

Anda harus menggunakan xinput untuk mengaktifkan $ TID di on.sh

Dan jangan lupa untuk menambahkan skrip dalam pertanyaan saya (atau yang @terdon sarankan, tetapi tanpa loop) ke sesi autostart seperti yang dia katakan pada Anda dalam jawabannya.

Itu dia, tapi saya harus menambahkan satu hal:

Jika Anda memiliki panel sentuh Synaptics (saya punya Elantech, jadi tidak cocok untuk saya), Anda dapat mengganti skrip Anda (jalur yang Anda tulis setelah RUN + =) dengan perintah sederhana /usr/bin/synclient TouchpadOff=0dan masing-masing 1

mekkanizer
sumber
hanya sebuah nitpick, karena Anda memerlukan akses root untuk membuat udevaturan apa pun, mungkin lebih baik menyimpan file di tempat lain selain direktori home. Misalnya: /usr/local/binatau /opt/touchpad-toggle/bin/.
Dan
@Dan ditolak. Segala sesuatu yang terkait dengan pengaturan pengguna sebaiknya berada di direktori home. Sayangnya, aturan udev, pengaturan login manager dan beberapa hal lainnya ditakdirkan untuk disalin kembali ke / * setiap kali Anda memo / partisi, kecuali jika Anda mengembalikan snapshot tentu saja. Jadi memiliki lebih banyak barang disimpan di / rumah / hanya kenyamanan. Jadi, saran Anda tidak memiliki nilai
mekkanizer
Tapi karena itu ditambahkan sebagai aturan udev, bukankah itu berarti akan berjalan untuk pengguna mana pun, tidak peduli siapa yang telah login?
Dan
Saya tidak memeriksa, karena saya tidak pernah menggunakan Linux pada PC bersama. Ngomong-ngomong, pengguna mana pun yang kesal dengan aturan udev yang rapi ini bukan minat saya. Jika mereka sangat sensitif, mereka bisa mendapatkan instalasi mereka sendiri
mekkanizer