如何根据是否连接了鼠标来切换触摸板?


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启用或禁用触摸板。解决该问题的唯一其他解决方案是一个名为touchpad-indicator的程序,它有一点缺陷。当我感觉到我的笔记本在连接鼠标的情况下睡着了,而没有唤醒它时,我必须搜索最近的鼠标来连接/断开它,以便启用触摸板。简而言之,我希望在唤醒时重新检查事实。
mekkanizer 2014年

欢迎来到Ask Ubuntu!请编辑您的问题以添加额外的信息,它很难阅读且容易在评论中遗漏。
terdon 2014年

首先,您应该解释一下您正在“尝试使其守护进程”,以及您打算如何做到这一点。然后,xinput需要一个正在运行的X服务器,并且大多数作为守护程序来运行东西的方法都不了解X,也无法连接到X。第三,为什么要始终解释要执行的操作的主要原因通常是解决方案某人正在尝试申请的申请实际上并不是完成申请的方式,您最终会提出错误的问题,通常称为XY问题
terdon 2014年

@terdon返回寻找解决方案时,xinput的(可能是)什么是模拟物:1.可以在后台运行2.可以启用/禁用设备?
mekkanizer 2014年

1
评论已删除。在Ask Ubuntu上保持友善不是可选的。请友好一点。粗鲁的评论将被删除,而不会发出警告。
赛斯2014年

Answers:


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的类似物,则可以在守护程序的脚本中使用它,并可以启用/禁用设备...好吧,我将使用它。
mekkanizer 2014年

1
@mekkanizer这实际上并不是最好的方法。一种更干净的方法是使用udev规则并将必需的X凭据导出到它们。您可以根据需要进行调查。
terdon 2014年

谢谢,会的。如果我可以正常工作,我会写回(或发布答案)
mekkanizer

10

好的,我为此制定了udev规则,就像@terdon所说的,这是一种更干净的方法

因此,由于有了本指南,我在/etc/udev/rules.d/中创建了一个“ touchpad_toggle.rules”文件(需要root用户访问权限),并用两行填充:

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"

不要忘记用您的用户名替换“用户名”!

这些外壳程序脚本的内容只是我问题中脚本的question割版本。示例-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,但没有循环),就像他在回答中告诉您的那样,进行会话自动启动。

就是这样,但是我必须添加一件事:

如果您有Synaptics触摸板(我有Elantech,所以它不适合我),则可以/usr/bin/synclient TouchpadOff=0分别用简单的命令和1 替换脚本(在RUN + =之后写入的路径)。


只是一个nitpick,因为您需要以root权限以udev任何方式创建规则,所以最好将文件保存在主目录之外的其他位置。例如:/usr/local/bin/opt/touchpad-toggle/bin/

@丹拒绝了。与用户设置有关的所有内容最好放在主目录中。不幸的是,每次刮除/分区时,udev规则,登录管理器设置和其他一些东西注定会被复制回/ *,除非您当然要还原快照。因此,在/ home /中存储更多的东西只是方便。因此,您的建议没有任何价值
mekkanizer

但是,既然将它作为udev规则添加了,这是否意味着它可以为任何用户运行,无论是谁记录了它?
Dan

我没有检查,因为我从未在共享PC上使用Linux。无论如何,任何对这个整洁的udev规则感到恼火的用户都不感兴趣。如果他们是如此敏感,则可以自己安装
mekkanizer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.