我遇到了一个越来越严重的问题,以至于我觉得彻底放弃 Ubuntu 并尝试其他方法可能更容易。我有一台运行 Ubuntu 12.04 的 HP PC。当我用鼠标左键单击时,有时会出现双击(大概 50% 的时间)。
到目前为止,这导致:随机发送未完成的电子邮件,在写电子邮件时随机突出显示和删除我不想删除的内容(非常令人沮丧),随机删除两个浏览器选项卡而不是一个(多次),并且(在某种意义上最烦人的)当尝试在桌面上移动窗口或从终端窗口剪切粘贴时,最终用户体验非常非常令人沮丧。谢天谢地Alt——F7但我不想必须学习我使用的每个程序以及操作系统的键盘快捷键(不能复制粘贴对我来说是一个巨大的损失)。
我不是唯一遇到这个问题的人,但谷歌搜索表明,这个问题可能有多种原因;我在网上读到的所有修复方法都对我不起作用。让我把所有方法都讲一遍,包括对其他人有用但对我不起作用的修复方法。哦——我有一只惠普光电鼠标。
这不是鼠标坏了。我在我的系统上试过两个鼠标——都出现了问题。这两个鼠标在我家的笔记本电脑上都运行良好,笔记本电脑也运行着 Ubuntu 12.04。
我的
/etc/X11/xorg.conf
只有几行长,并且没有“InputDevice”部分。我没有安装 hald 或者 hal 包。
它大约在一周前开始的,似乎没有好转或恶化。
无奈之下我只能升级到 12.10,但问题并没有得到解决,而且我现在运行的发行版不是 LTS(因此对我来说并不理想 :-\ )
但这使得我的系统很难使用。
可能的重要更新:我尝试使用 xev 进行一些调查。在我看来,这些鼠标的连接似乎有问题——这种情况常见吗?我可以按住鼠标按钮,然后得到(鼠标单击)(暂停)(鼠标释放)(非常非常短的暂停)(鼠标单击)(暂停)(鼠标释放)(非常非常短的暂停)(鼠标单击)等。我想知道其他操作系统是否会说“您无法在 0.05 秒内释放然后再次单击,所以这一定是个故障,我假设按钮从未被释放过”。我可以告诉 Ubuntu 忽略释放然后重新单击的几乎即时事件吗??
这看起来是鼠标出了问题。也许我应该找个新一点的鼠标?我只试过很旧的鼠标 :-\
答案1
好的,在受影响的机器上使用 xev 进行大量测试,并在不同系统上切换不同鼠标后,我相信我已经解决了这个问题。当然,YMMV。
我的解决方案:这是一只坏掉的鼠标。
更准确地说,单击时激活的连接器有点旧或者脏了或者其他什么的,有时,按住按钮时,会建立连接,然后暂时断开,然后再次建立连接,从而导致双击。
反对意见:但是当我将鼠标插入我的 Windows 机器时,它工作正常!
反对者:将以下伪代码行放入驱动程序或操作系统中不是很简单吗:“如果用户在 0.05 秒内松开鼠标然后再次单击,那么这可能是一个脏连接器,所以我们就忽略它吧”。因此,如果您将鼠标切换到另一台运行另一个操作系统和/或在不同硬件上使用另一个驱动程序的计算机(即使使用相同的操作系统,您也可能使用不同的硬件,对吗?),您是否有可能得到不同的结果?
反对意见:但我试过另一只旧鼠标,它也出现了同样的问题!
反驳:同一家公司生产的两只旧鼠标竟然会以同样的方式损坏,真是太神奇了,不是吗?而您却从未注意到,因为您试用的第二只旧鼠标在插入不同的硬件时没有出现任何问题(参见上一个反驳)。
如果你实在不相信你的鼠标坏了,那就测试一下:
$ xev
然后找到具有黑色背景的方块,单击它,并观察输出。您是否总是听到一声干净的“咔嗒”声,而没有其他声音?我经常听到干净的咔嗒声,但偶尔会听到“弹跳”(单击、取消单击、单击)。也许更好:
$ xev | grep ButtonRelease
现在将鼠标放在带有黑色轮廓的方块上(或该窗口中的任意位置),然后单击并取消单击 20 次。每次释放按钮时,您都应该看到一条“ButtonRelease”线,否则永远不会出现。我偶尔会在单击时看到一条线。
噩梦结束了。
答案2
禅与鼠标维护。似乎许多人在单击鼠标时遇到双击鼠标的问题。鼠标按钮是一个微动开关。事实上,开关触点会弹起。它们实际上不是弹起而是摩擦。我们无论如何都称之为弹起。出于某种原因,程序员在这方面失败了。在读取之前,应应用足够长的等待循环以使触点稳定下来。毫无缘由地,在一个样本中,我的解决方案是在开关触点上放置一个电容器。我使用 0.1uF 电容没有特别的原因,只是因为我有一个尺寸很小的电容,可以很好地放入鼠标内。我没有对停留时间、时间常数或决策水平进行任何花哨的分析来找到最佳值。无论如何,各种型号都会有不同的参数。
我已经使用这个修改有一段时间了,到目前为止问题还没有再次出现。
要应用此 mod,请找一个可以放入鼠标外壳的小尺寸电容器。我使用 0.1uF,因为我有一个,这个值很不错,但其他值可能也可以,但不要太大或太小。太大或太小是实验的问题。太大可能会影响预期的双击,太小则达不到预期的效果。我将电容器的一只脚焊接在一个方便的位置,在该位置,它不会与鼠标内部结构发生冲突,在电路板的铜面上,焊接到 0 伏平面(如果您愿意,也可以是地平面),我将电容器的另一只脚用一根细线连接到活动开关。我使用了带有短脚的回收元件。新元件的脚可能足够长,可以到达需要的地方。您需要一把合适的细尖烙铁来完成这项工作。
如果您不了解电容器。0.1uF 电容器可能被指定为 0.1uF 或 104 或 100nF,或者有棕色、黑色和黄色的色带。表面贴装类型也是一个不错的选择。用几根细线将其连接起来。可以将其粘在电路板连接面上。
我有一个 B 计划,下次或者当前计划最终失败时我可能会尝试。将微动开关换成 spst PCB 安装触觉薄膜开关应该可以解决问题。这是键盘和小键盘中使用的开关类型,不会出现这个问题。它的占用空间与微动开关完全不同。有一个 7 毫米高的开关,其高度与现有微动开关相同。较小的开关需要间隔到正确的高度。将支脚弯曲成与开关主体垂直的角度,并将其粘到电路板上,使执行器与微动开关执行器所占的位置对齐。鼠标按钮必须击中正确的位置。用一些细线将开关触点连接起来,理论上一切都应该没问题。
答案3
xserver-xorg-input-evdev
我已经为 Ubuntu 14.10打了补丁。我使用了http://blog.guntram.de/?p=16(补丁可以找到这里和这里) 和 Debian 打包手册。
以下是我关于构建包的笔记。
#!/bin/bash
# http://blog.guntram.de/?p=16
#
apt-get build-dep xserver-xorg-input-evdev
dquilt="quilt --quiltrc=${HOME}/.quiltrc-dpkg"
wget --output-document=evdev-debounce.patch http://blog.guntram.de/?ddownload=20
apt-get source xserver-xorg-input-evdev
cd xserver-xorg-input-evdev-*
$dquilt new debounce.patch
$dquilt add include/evdev-properties.h src/Makefile.am src/debounce.c src/evdev.c src/evdev.h src/debounce.c
patch -p1 <../evdev-debounce.patch
$dquilt refresh
$dquilt header -e
debuild -us -uc -b
cd ..
sudo dpkg -i xserver-xorg-input-evdev_*.deb
- 好消息:它成功了。
- 坏消息:它并不总是有用。我的鼠标按钮接触不良,需要 200 毫秒的延迟,这使我无法双击。另一个弹跳鼠标开始正常工作。
编辑:感谢@MatijaNalis,补丁获取步骤可以是:
wget https://aur.archlinux.org/packages/xf/xf86-input-evdev-debounce/xf86-input-evdev-debounce.tar.gz
tar xzf xf86-input-evdev-debounce.tar.gz
# ...
patch -p1 < ../xf86-input-evdev-debounce/debounce.patch
答案4
我遇到了一个问题,即单击两次额外的按钮。由于我已经将其映射到xbindkeys
(请参阅如何为所有鼠标按钮分配动作?有关更多信息)我的解决方案是更改以下~/.xbindkeysrc
条目:
"if [ ! -e /dev/shm/button ]; then touch /dev/shm/button; /usr/bin/xte 'keydown Control_L' 'key Page_Down' 'keyup Control_L'; sleep 0.2; rm /dev/shm/button; fi"
b:7
这将为每次按下按钮创建一个“锁定文件” /dev/shm/
(我希望它位于 RAM 中),并在 0.2 秒后将其删除。并且命令xte
应在鼠标单击时执行,并且不应在 0.2 秒内执行两次。
(只是想分享我的解决方案,以防有人想复制它或修复它。)