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

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

我正在使用自定义触摸使用 Magic Trackpad 在 Ubuntu 11.04 中设置多点触控手势。由于默认手势(例如,用 3 根手指点击并拖动以移动窗口,用 4 根手指点击以显示仪表板等)显然是在 Unity 中硬编码的,因此我无法为它们分配任何自定义 Touchégg 操作,并且某些默认手势(我并不打算经常使用,甚至根本不打算使用)偶尔会与我分配的类似自定义手势混淆并被意外触发。

有没有一种实用的方法(无需调整 uTouch 源代码)来禁用某些默认手势?如果没有,请提供指向代码部分(也许在 grail 中?)的指针,其中定义了默认手势,并且也希望提供调整方面的帮助。

答案1

更新多姆斯特答案适用于 Ubuntu 12.10。

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

又来了!注销并重新登录。

答案2

事实证明,修补该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

此时注释掉文件中如下2行 /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 中的最新 Unity (5.18.0) 上执行此操作,您必须注释掉略有不同的代码行。

在插件/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));

在插件/unityshell/src/unityshell.cpp中:

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

答案4

禁用标准触摸手势如下:

sudo apt install dconf-editor
dconf-editor

在左侧菜单中点击

com > canonical > unity > gestures

并禁用那里显示的 3 个基本手势。这适用于 16.04.3。

相关内容