當前位置: 首頁>>技術教程>>正文


如何在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/zh-tw/article/11710.html,未經允許,請勿轉載。