Jak mogę wyłączyć dowolne domyślne gesty wielodotykowe w Unity?

22

Używam niestandardowej konfiguracji gestów wielodotykowych Touchégg w Ubuntu 11.04 z Magic Trackpad. Ponieważ domyślne gesty (takie jak stuknięcie 3-palcem i przeciągnięcie, aby przesunąć okna, stuknięcie 4 palcem, aby odsłonić kreskę itp.) Są najwyraźniej zakodowane w Unity, nie jestem w stanie przypisać do nich żadnych niestandardowych akcji Touchégg i niektórych domyślnych gesty (których nie zamierzam często używać, jeśli w ogóle) od czasu do czasu mieszają się z moimi podobnymi, niestandardowymi i uruchamiane przez przypadek.

Czy istnieje praktyczny sposób (poza poprawieniem źródła uTouch), aby wyłączyć niektóre domyślne gesty? Jeśli nie, wskaż fragmenty kodu (być może w graal?), W których zdefiniowane są domyślne gesty, a pomoc w dostosowaniu również będzie mile widziana.

mgunes
źródło
1
Czy możesz po prostu odinstalować utouch i zachować touchégg?
desgua,
1
Touchégg korzysta z utouch-geis, więc nie, w żadnym praktycznym sensie.
mgunes
Podejrzewam, że możesz skonfigurować te działania w /etc/ginn/wishes.xml (jestem na telefonie komórkowym, nie mogę teraz testować)
desgua

Odpowiedzi:

16

Aktualizacja odpowiedzi Domster dla Ubuntu 12.10.

Kod źródłowy Unity oczywiście się zmienił, więc oto jak to osiągnąć w Unity 6.8.0. Kroki pobierania kodu źródłowego Unity są takie same jak poprzednio (skopiuję i wkleję fragment kodu domstera):

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

W tym momencie plik do edycji jest tylko /tmp/unity/unity-6.8.0/plugins/unityshell/src/unityshell.cpp.

Znajdź metodę UnityScreen::InitGesturesSupport()(wiersz 3368 dla Unity 6.8.0).

Następnie skomentuj wszystkie linie zaczynające się od gest_sub_launcher, aby wyglądało to tak:

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

Ponownie zbuduj Unity zgodnie z instrukcjami domstera:

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

Et voila ponownie! Wyloguj się i zaloguj ponownie.

dgraziotin
źródło
jak to działałoby w obecnej jedności 7.2.1?
plopp
Ta odpowiedź jest nadal w 100% poprawna dla Unity 7.2.2 (więc zakładam, że jest również ważna dla 7.2.1). Teraz buduję, zaktualizuję to, co się stanie ponownie. dotknąć, kiedy skończę i uruchomię ponownie.
Endofag
1
Gdzieś pomiędzy Trusty i Xenial, ustawienia wyłączające gesty Unity zostały dodane do dconf, wymienione poniżej com.canonical.unity.gestures. Jeśli może być również dostępny w Wily, ale nie sądzę; Jestem tylko pewien, że nie jest dostępny w Trusty i jest w Xenial.
Kevin
Ubuntu 16: dpkg-buildpackage -us -uc -nckończy pracę z błędami. 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
Matt
11

Okazuje się, że łatanie unitypakietu nie jest trudne do całkowitego wyłączenia obsługi wielu dotknięć i gestów. Oto instrukcje krok po kroku dotyczące łatania unity-4.24.0.

W wierszu polecenia wprowadź:

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

W tym miejscu skomentuj następujące 2 wiersze w pliku /tmp/unity/unity-4.24.0/plugins/unityshell/src/unityshell.cpp:

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

i następujące 4 linie w pliku /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));

Kod źródłowy jest C++włączony, więc komentowanie wiersza odbywa się poprzez dodanie //na początku wiersza. Na przykład linia

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

staje się

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

Wróć do wiersza poleceń i wprowadź:

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

Gotowe!

Teraz, jeśli się wylogujesz i zalogujesz ponownie, gesty powinny działać normalnie. Potrójne dotknięcie działa w moim systemie domyślnie jako kliknięcie środkowym kliknięciem, bez potrzeby dotykania. Ale zarówno touchegg, jak i ginn działają teraz dobrze, aby zdefiniować niestandardowe gesty dla aplikacji.

domster
źródło
3

Aby to zrobić w najnowszej jedności (5.18.0) w 12.04, musisz skomentować nieco inne linie kodu.

We wtyczkach / 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));

We wtyczkach / unityshell / src / unityshell.cpp:

// geis_adapter_.Run();
// gesture_engine_.reset(new GestureEngine(screen));
stefanix
źródło
2

Druga próba

dinegri sugerują, że „[t] o niepełnosprawnymi trzy gesty, to [jest] konieczne [do] zainstalowano ccsm, [], a następnie wyłączyć«Jednostka MT uchwyty»znany również jako«kocha»Uchwyty” tutaj .

Ale pozostawiają nam jeszcze gesty czterema palcami.

Pierwsza próba

Plik konfiguracyjny dla utouch to /etc/ginn/wishes.xml. Możesz więc edytować ten plik i usunąć (lub skomentować) działania, których nie chcesz. Wtedy Touchégg wykonałby swoją pracę bez konfliktów.

Odniesienie

PS: Nie mogłem odtworzyć twojego problemu tutaj, aby przetestować rozwiązanie. Przepraszam za to.

desgua
źródło
To plik konfiguracyjny dla ginn, który jest aplikatorem gestów, którego funkcjonalność pokrywa się z funkcją Touchégga. Modyfikacje pliku konfiguracyjnego byłyby skuteczne tylko wtedy, gdy uruchomiony jest demon ginn, a ponieważ używam Touchégga, normalnie tak nie jest. Mając na uwadze możliwość używania ginn zamiast Touchégg, próbowałem zastąpić niektóre domyślne gesty Unity, komentując je w pliku konfiguracyjnym ginn i uruchamiając ginn, ale to nie działa.
mgunes
Zaktualizowałem odpowiedź.
desgua
4
Wyłączenie wtyczki uchwytów usunie jedynie wizualną dostępność przeciągania; nie wyłączy nawet gestu stuknięcia i przeciągnięcia trzema palcami (których i tak nie chcę specjalnie wyłączać), nie mówiąc już o pozostałych.
mgunes
Nawiasem mówiąc, mam już wyłączoną, ponieważ z powodu błędu # 754000 muszę symulować kliknięcie środkowym przyciskiem za pomocą Touchégga, a wyświetlanie uchwytów za każdym razem, gdy wykonuję stuknięcie trzema palcami, jest bardzo dezorientujące.
mgunes
2

Wyłącz standardowe gesty dotykowe w następujący sposób:

sudo apt install dconf-editor
dconf-editor

W menu po lewej stronie kliknij, aby

com > canonical > unity > gestures

i wyłącz 3 podstawowe gesty tam pokazane. Działa to 16.04.3.

alex
źródło
Zdecydowanie najlepsza i najprostsza odpowiedź dla użytkowników Ubuntu 16.04, którzy chętnie instalują wersję dconf z graficznym interfejsem użytkownika.
GrayedFox
1

Zbudowaliśmy terminal kiosku oparty na Ubuntu, ale gesty wielodotykowe ujawniły system operacyjny, więc musieliśmy się go jakoś pozbyć.

Było to urządzenie z ekranem dotykowym Samsung, które xinputzidentyfikowało moduł dotykowy jako AFO TCM10J 40V.

Aby wyłączyć gesty wielodotykowe w systemie Ubuntu 14.04, metoda jest zasadniczo taka sama, jak domster opisany powyżej, z tym wyjątkiem, że musisz znaleźć komentarz w następującym wierszu w /tmp/unity/unity-4.24.0/plugins/unityshell/src/Launcher.cpp

// InitGestureEngine();
ElvinAtombender
źródło
Hmm, to chyba nie działało. touchegg i ginn nadal nie zgłaszają żadnych danych dla gestów mniejszych niż 4 palce, a ustawienie „Przewijanie dwoma palcami” w ustawieniach systemowego touchpada nadal ma pierwszeństwo ...
Jeff Ward
1

Zauważ, że dpkg-buildpackage może otrzymać liczbę zadań jako argument, co pozwala na użycie wszystkich rdzeni procesora w następujący sposób:

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

(Powinien to być komentarz do odpowiedzi dgraziotin, ale nie mogę zamieszczać komentarzy.)

Andrej Repiský
źródło
Bardzo pomaga Zbyt długo trzeba czekać, aż jedno nitkowanie zakończy się.
Orient