如何在Unity中禁用任意默认的多点触摸手势?


22

我在带有Magic Trackpad的Ubuntu 11.04中使用了自定义的Touchégg多点触摸手势设置。由于默认手势(例如三指轻击和拖动以移动窗口,四指轻击以显示破折号等)显然已在Unity中进行了硬编码,因此我无法为它们分配任何自定义Touchégg动作,并且某些默认手势(我根本不打算使用很多手势)有时会与我的自定义分配的手势混在一起,并被意外触发。

有没有一种实用的方法(无需调整uTouch源代码)来禁用某些默认手势?如果不是这样,则指向定义默认手势的代码部分的指针(也许在grail中吗?)以及对调整的帮助也将受到赞赏。


1
您能卸载utouch并保持touchégg吗?
desgua 2011年

1
Touchégg使用了utouch-geis,所以没有,从任何遥远的实际意义上讲都是如此。
2011年

我怀疑您可以在/etc/ginn/wishes.xml中配置这些操作(我在移动设备上,目前无法测试)
desgua 2011年

Answers:


16

Ubuntu 12.10的domster答案的更新。

Unity源代码显然已更改,因此以下是在Unity 6.8.0中实现相同功能的方法。下载Unity源代码的步骤与之前相同(我将复制并粘贴domster的代码段):

sudo apt-get build-dep unity
cd /tmp  #It can be done somewhere else, feel free to change the base location.
mkdir unity
cd unity
apt-get source unity

此时,要编辑的文件仅为/tmp/unity/unity-6.8.0/plugins/unityshell/src/unityshell.cpp

查找方法UnityScreen::InitGesturesSupport()(Unity 6.8.0的第3368行)。

然后,注释所有以gesture_sub_launcher开头的行,使其看起来像:

void UnityScreen::InitGesturesSupport()
{
  std::unique_ptr<nux::GestureBroker> gesture_broker(new UnityGestureBroker);
  wt->GetWindowCompositor().SetGestureBroker(std::move(gesture_broker));
  /*
  gestures_sub_launcher_.reset(new nux::GesturesSubscription);
  gestures_sub_launcher_->SetGestureClasses(nux::DRAG_GESTURE);
  gestures_sub_launcher_->SetNumTouches(4);
  gestures_sub_launcher_->SetWindowId(GDK_ROOT_WINDOW());
  gestures_sub_launcher_->Activate();

  gestures_sub_dash_.reset(new nux::GesturesSubscription);
  gestures_sub_dash_->SetGestureClasses(nux::TAP_GESTURE);
  gestures_sub_dash_->SetNumTouches(4);
  gestures_sub_dash_->SetWindowId(GDK_ROOT_WINDOW());
  gestures_sub_dash_->Activate();

  gestures_sub_windows_.reset(new nux::GesturesSubscription);
  gestures_sub_windows_->SetGestureClasses(nux::TOUCH_GESTURE
                                         | nux::DRAG_GESTURE
                                         | nux::PINCH_GESTURE);
  gestures_sub_windows_->SetNumTouches(3);
  gestures_sub_windows_->SetWindowId(GDK_ROOT_WINDOW());
  gestures_sub_windows_->Activate();
  */
}

再次按照domster的说明重新构建Unity:

cd /tmp/unity/unity-6.8.0
dpkg-buildpackage -us -uc -nc
cd ..
sudo dpkg -i *deb

再次瞧瞧!注销并重新登录。


在当前的7.2.1中如何工作?
plopp 2014年

这个答案对于Unity 7.2.2仍然是100%有效的(所以我假设它对于7.2.1也同样有效)。我现在正在构建,将更新最新情况。完成操作并重新启动后,请触摸touchegg。
Endophage

1
在Trusty和Xenial之间的某个时间,已将禁用Unity手势的设置添加到dconf中,列在下com.canonical.unity.gestures。如果在Wily中也可以使用,但我认为不是。我只肯定它在Trusty中不可用,而在Xenial中可用。
凯文(Kevin)

Ubuntu 16:dpkg-buildpackage -us -uc -nc错误退出。error: debian/rules build gave error exit status 2... The X server was not able to run in time ....recipe for target 'tests/CMakeFiles/run-test-switcher-controller-slow-headless' failed
马特

11

事实证明,unity为完全禁用其对多点触摸和手势的处理而对补丁打补丁并不难。以下是有关修补的分步说明unity-4.24.0

在命令行中,输入:

sudo apt-get build-dep unity
cd /tmp  #It can be done somewhere else, feel free to change the base location.
mkdir unity
cd unity
apt-get source unity

此时,注释掉文件中的以下两行 /tmp/unity/unity-4.24.0/plugins/unityshell/src/unityshell.cpp

GeisAdapter::Default()->Run();
gestureEngine = new GestureEngine(screen);

以及文件中的以下4行/tmp/unity/unity-4.24.0/plugins/unityshell/src/Launcher.cpp

GeisAdapter& adapter = *(GeisAdapter::Default());
adapter.drag_start.connect(sigc::mem_fun(this, &Launcher::OnDragStart));
adapter.drag_update.connect(sigc::mem_fun(this, &Launcher::OnDragUpdate));
adapter.drag_finish.connect(sigc::mem_fun(this, &Launcher::OnDragFinish));

源代码在中C++,因此通过//在行的开头添加注释来注释一行。例如,线

GeisAdapter::Default()->Run();

变成

//GeisAdapter::Default()->Run(); .

返回命令行,输入:

cd unity-4.24.0
dpkg-buildpackage -us -uc -nc
cd ..
sudo dpkg -i *deb

瞧!

现在,如果您注销并重新登录,手势应该可以正常工作。默认情况下,三次轻击可在我的系统上用作中键,而无需touchegg。但是touchegg和ginn现在都可以很好地为您的应用程序定义自定义手势。


3

要在12.04版的最新版本(5.18.0)上执行此操作,必须注释掉稍有不同的代码行。

在plugins / unityshell / src / Launcher.cpp中:

// GeisAdapter& adapter = GeisAdapter::Instance();
// adapter.drag_start.connect(sigc::mem_fun(this, &Launcher::OnDragStart));
// adapter.drag_update.connect(sigc::mem_fun(this, &Launcher::OnDragUpdate));
// adapter.drag_finish.connect(sigc::mem_fun(this, &Launcher::OnDragFinish));

在plugins / unityshell / src / unityshell.cpp中:

// geis_adapter_.Run();
// gesture_engine_.reset(new GestureEngine(screen));

2

第二次尝试

dinegri建议“[T] o禁用三个动作,它[是]必需[转]已经安装CCSM,[然后]禁用‘单位MT拉手’也被称为‘爱的把手’” 这里

但这还剩下四个手指手势。

第一次尝试

utouch的配置文件是/etc/ginn/wishes.xml。因此,您可以编辑此文件并删除(或添加注释)不需要的操作。这样,Touchégg就能做到无冲突。

参考

PS:我无法在这里重现您的问题来测试解决方案。对此我感到抱歉。


那是ginn的配置文件,这是一个手势注入器,其功能与Touchégg的功能重叠。仅当ginn守护程序正在运行时,对其配置文件的修改才会生效,由于我使用的是Touchégg,因此通常不会。考虑到可以使用ginn而不是Touchégg,我尝试通过在ginn配置文件中将它们注释掉并运行ginn来覆盖一些默认的Unity手势,但这是行不通的。
mgunes,2011年

我已经更新了答案。
desgua 2011年

4
禁用handles插件只会删除拖动的视觉效果。它甚至都不会禁用三指点击和拖动手势(无论如何我都不希望禁用它),更不用说其他了。
mgunes,2011年

顺便说一句,我已经禁用了它,因为由于错误#754000,我需要使用Touchégg模拟中间按钮的单击,并且每次执行三指轻击时让手柄出现会非常令人迷惑。
2011年

2

禁用标准触摸手势,如下所示:

sudo apt install dconf-editor
dconf-editor

在左侧菜单中,单击

com > canonical > unity > gestures

并禁用此处显示的3种基本手势。这适用于16.04.3。


到目前为止,对于愿意安装GUI版本的dconf的16.04 Ubuntu用户而言,这是最好,最直接的答案。
GrayedFox

1

我们已经构建了一个基于Ubuntu的信息亭终端,但是多点触摸手势可以显示操作系统,因此我们不得不以某种方式摆脱它。

这是三星的触摸屏设备,xinput标识的触摸模块为AFO TCM10J 40V。

要在Ubuntu 14.04上禁用多点触控手势,该方法与上述domster基本相同,除了必须在以下内容的第1行找到注释。 /tmp/unity/unity-4.24.0/plugins/unityshell/src/Launcher.cpp

// InitGestureEngine();

嗯,这似乎不适合我。touchegg和ginn仍然不会报告少于4个手指的手势的任何数据,并且系统触摸板设置中的“两个手指滚动”设置仍然优先...
Jeff Ward

1

请注意,可以给dpkg-buildpackage作业数作为参数,这使您可以像这样使用所有CPU内核:

dpkg-buildpackage -us -uc -nc -j$(($(nproc)))

(这应该是对dgraziotin的回答的评论,但我不能发表评论。)


很有帮助。等待单线程制造完成太长时间。
东方
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.