问题描述
我在带有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));