当前位置: 首页>>技术教程>>正文


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

, , , ,

问题描述

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

是否有一种实用的方法(无需微调uTouch源代码)来禁用某些默认手势?如果不是,则将指向代码部分的指针(也许在grail中?),这些指针定义了默认手势,并且有助于进行调整。

最佳思路

Ubuntu 12.10的domster answer更新。

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();
  */
}

Re-build再次遵循domster的说明:

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

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

次佳思路

事实证明,修补unity包并不难,因为它完全禁用了对multi-touches和手势的处理。这是修补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);

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

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现在都可以很好地为您的应用程序定义自定义手势。

第三种思路

要在12.04版的最新统一版本(5.18.0)上执行此操作,您必须使用comment-out稍有不同的代码行。

在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));

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/11710.html,未经允许,请勿转载。