Làm cách nào để chuyển bàn di chuột tùy thuộc vào việc chuột có được kết nối không?


10

Tôi muốn tự động tắt bàn di chuột khi chuột ngoài được kết nối và bật khi không có. Tôi đã thử sử dụng touchpad-indicatornhưng điều đó không thành công trong trường hợp máy tính đã được đưa vào chế độ ngủ với một con chuột được kết nối và bị đánh thức khi con chuột bị ngắt kết nối.

Tôi đã cố gắng biến đoạn script sau thành daemon để giải quyết vấn đề này nhưng tôi không thể làm cho nó hoạt động được:

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

Tôi đã thử start-stop-daemon -S -x ./myscript.sh -b

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

nohup ./myscript 0<&- &>/dev/null & thậm chí./myscript.sh &

Tất cả những thứ này trả về một số gồm 4 chữ số, theo tôi đoán, nó phải là PID của quá trình bắt đầu nhưng khi tôi khởi chạy lxtask thì không có quy trình nào với bộ PID này , ngay cả khi tôi đánh dấu vào "xem tất cả các quy trình". Và, tất nhiên, nó không hoạt động!


@terdon Tôi đang cố gắng tạo một daemon xem chuột usb được kết nối và yêu cầu xinput bật hoặc tắt bàn di chuột. Giải pháp duy nhất khác cho vấn đề này, một chương trình gọi là touchpad-chỉ báo, có một lỗ hổng nhỏ. Khi tôi sen máy tính xách tay của tôi ngủ với chuột được kết nối và đánh thức nó mà không có, tôi phải tìm kiếm con chuột gần nhất để kết nối / ngắt kết nối để bàn di chuột của tôi được kích hoạt. Nói tóm lại, tôi muốn thực tế của nó sẽ được kiểm tra lại khi thức dậy.
mekkanizer

Chào mừng bạn đến hỏi Ubuntu! Vui lòng chỉnh sửa câu hỏi của bạn để thêm thông tin, rất khó đọc và dễ bỏ lỡ trong các bình luận.
terdon

Trước hết, bạn nên giải thích rằng bạn đang "cố gắng tạo ra nó" và chính xác là bạn đang làm gì về điều đó. Sau đó, xinputcần một máy chủ X đang chạy và hầu hết các phương thức chạy công cụ như daemon không có kiến ​​thức hoặc khả năng kết nối với X. Thứ ba, và lý do chính tại sao bạn phải luôn giải thích những gì bạn đang cố gắng làm đó là giải pháp rất thường xuyên rằng ai đó đang cố gắng áp dụng không thực sự là cách để hoàn thành nó và cuối cùng bạn hỏi sai câu hỏi, thường được gọi là vấn đề XY .
terdon

@terdon Quay lại tìm kiếm giải pháp, sự tương tự (có thể là gì) của xinput đó là: 1. Có thể chạy trong nền 2. Có thể bật / tắt thiết bị không?
mekkanizer

1
ý kiến ​​loại bỏ . Trở nên tốt đẹp trên Ask Ubuntu không phải là tùy chọn. Hãy tử tế. Bình luận thô lỗ sẽ được gỡ bỏ mà không có cảnh báo.
Seth

Câu trả lời:


10

Kịch bản cơ bản bạn cần chỉ đơn giản là:

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

Tập lệnh ở trên sẽ chuyển bàn di chuột tùy thuộc vào việc chuột có được kết nối hay không. Khi được khởi chạy, nó sẽ chạy mãi mãi và sẽ kiểm tra chuột mỗi giây, vô hiệu hóa hoặc kích hoạt bàn di chuột phù hợp.

Bây giờ, hãy lưu tập lệnh dưới dạng ~/touchpad.sh, làm cho nó có thể thực thi được ( chmod +x ~/touchpad.sh) và thêm nó vào các chương trình khởi động phiên GUI của bạn. Bạn chưa chỉ định môi trường máy tính để bàn nào bạn đang sử dụng nhưng vì bạn đã đề cập lxtask, tôi sẽ cho rằng bạn đang sử dụng LXDE. Trong mọi trường hợp, đây là hướng dẫn cho cả hai LXDEUnity:

  1. Thêm tập lệnh vào tập tin tự khởi động của LXDE

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

    Đảm bảo bạn thay thế "HỒ SƠ" bằng tên thật của hồ sơ LXDE , bạn có thể tìm hiểu xem nó là gì bằng cách chạy ls ~/.config/lxsession/.

  2. Thêm tập lệnh vào tập tin tự khởi động của Unity

    Mở Startup Applications(tìm kiếm trong bảng điều khiển cho "Khởi động")

    nhập mô tả hình ảnh ở đây

    Nhấp vào "Thêm" và sau đó dán đường dẫn đến tập lệnh của bạn trong trường lệnh:

    nhập mô tả hình ảnh ở đây


Tôi đã không sử dụng một vòng lặp bởi vì khi tôi hiểu về việc chạy các tập lệnh ở chế độ nền, mọi người đều đề nghị không sử dụng các vòng lặp. Nếu đó là giải pháp duy nhất và không có tương tự xinput có thể được sử dụng trong tập lệnh cho trình nền và CÓ THỂ bật / tắt thiết bị ... ok, tôi sẽ sử dụng nó.
mekkanizer

1
@mekkanizer đây không thực sự là cách tốt nhất như vậy. Một cách sạch sẽ hơn nhiều là sử dụng các quy tắc udev và xuất các thông tin X cần thiết cho chúng. Bạn có thể nhìn vào đó nếu bạn muốn.
terdon

Cảm ơn sẽ làm. Nếu tôi làm cho nó hoạt động, tôi sẽ viết lại (hoặc gửi câu trả lời)
mekkanizer

10

Được rồi, tôi đã thực hiện một quy tắc udev cho nó, và nó, như @terdon nói, một cách sạch sẽ hơn nhiều

Vì vậy, nhờ có hướng dẫn này , tôi đã tạo một tệp "touchpad_toggle.rules" trong /etc/udev/rules.d/ (yêu cầu quyền truy cập root) và điền vào đó hai dòng:

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"

Đừng quên thay thế "tên người dùng" bằng tên người dùng của bạn!

Nội dung của các kịch bản shell bật và tắt này chỉ là phiên bản được đúc của tập lệnh trong câu hỏi của tôi. Ví dụ - 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

Bạn sẽ phải sử dụng xinput kích hoạt $ TID trong on.sh

Và đừng quên thêm tập lệnh trong câu hỏi của tôi (hoặc một @terdon đã đề xuất, nhưng không có vòng lặp) để tự động khởi động phiên như anh ấy đã nói với bạn trong câu trả lời của mình.

Đó là nó, nhưng tôi phải thêm một điều:

Nếu bạn có bàn di chuột Synaptics (tôi có Elantech, vì vậy nó không phù hợp với tôi), bạn có thể thay thế tập lệnh của mình (đường dẫn mà bạn viết sau RUN + =) bằng lệnh đơn giản /usr/bin/synclient TouchpadOff=0và 1 tương ứng


chỉ là một nitpick, vì bạn cần quyền truy cập root để tạo udevquy tắc theo bất kỳ cách nào, tốt hơn là nên lưu tệp ở nơi nào khác ngoài thư mục chính. Ví dụ: /usr/local/binhoặc /opt/touchpad-toggle/bin/.
Dan

@Dan từ chối. Tất cả mọi thứ liên quan đến cài đặt người dùng tốt hơn là trong thư mục nhà. Thật không may, các quy tắc udev, cài đặt quản lý đăng nhập và một vài thứ khác được mệnh được sao chép lại / * mỗi lần bạn phế liệu / phân vùng, trừ khi bạn khôi phục lại một bản chụp của khóa học. Vì vậy, có nhiều thứ được lưu trữ trong / nhà / chỉ là sự tiện lợi. Vì vậy, lời khuyên của bạn không có giá trị
mekkanizer 16/12/17

Nhưng vì nó được thêm vào như một quy tắc udev, điều đó có nghĩa là nó sẽ chạy cho bất kỳ người dùng nào, bất kể ai đã đăng nhập nó?
Dan

Tôi đã không kiểm tra, vì tôi chưa bao giờ sử dụng Linux trên các PC được chia sẻ. Dù sao, bất kỳ người dùng nào bị kích thích bởi quy tắc udev gọn gàng này không phải là mối quan tâm của tôi. Nếu chúng quá nhạy cảm, chúng có thể tự cài đặt
mekkanizer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.