Czy mogę ustawić Hot Corners do uruchamiania niestandardowych poleceń w Unity?

13

Naprawdę lubię Hot Corners. :-)

Czy w jakiś sposób można uruchomić niestandardowe polecenie w gorącym rogu, jak pokazano poniżej?

wprowadź opis zdjęcia tutaj

orschiro
źródło
Nie sądzę, że jest to możliwe w szczególności w przypadku hotcornerów (przynajmniej nie w sposób, w jaki używa ich Unity), ale możliwe jest uruchamianie skryptów, gdy mysz zostanie umieszczona w określonym obszarze ekranu. Na przykład zobacz askubuntu.com/a/758307/295286 , sekcja Mysz nad akcją. Zajrzę bardziej do hotcornerów, ale jeśli te się nie sprawdzą, czy niestandardowy skrypt jest OK?
Sergiy Kolodyazhnyy
Wiele monitorów czy pojedynczy?
Jacob Vlijm
Cześć orschiro, wysłano. Podaj, czy wszystko jest jasne (czy nie).
Jacob Vlijm
Hej, widzę, że jest tu więcej hotcornerów niż w mojej odpowiedzi. Ile wolisz
Jacob Vlijm
2
@JacobVlijm, Serg, Zobacz moją odpowiedź.
wjandrea

Odpowiedzi:

10

CCSM

  1. Zainstaluj CompizConfig Settings Manager (CCSM). Uruchom w terminalu:

    sudo apt-get install compizconfig-settings-manager
  2. Otwórz CCSM.

  3. Idź do „Poleceń”
  4. Wpisz żądane polecenie w jednym z gniazd. Na przykład:

    Zrzut ekranu CCSM - polecenie

  5. Przejdź do zakładki „Wiązania krawędzi”

  6. Kliknij „Brak” i ustaw żądany gorący narożnik (lub krawędź), który odpowiada właśnie ustawionemu poleceniu

    Zrzut ekranu CCSM - gorące rogi

  7. Przesuń mysz do rogu

  8. Teraz twoje polecenie jest uruchomione!

    Zrzut ekranu CCSM - polecenie uruchomione

Potwierdzono pracę w dniu 14.04.

wjandrea
źródło
Najłatwiejsze ze wszystkich proponowanych rozwiązań. Jeśli polecenie jest lepiej realizowane przez skrypt, to po prostu spraw, aby polecenie compiz wskazywało na ten skrypt lub po prostu nazwa skryptu, jeśli skrypt znajduje się w folderze bin w $ PATH. Jedynym możliwym minusem jest to, że unity / compiz jest znane z tego, że losowo „traci” polecenia ustawione przez użytkownika, tj. Te, które nie są zintegrowane. Jak zintegrować polecenie użytkownika wykracza poza zakres tego pytania.
doug
@wjandrea W końcu jest zaimplementowany. Compiz nie chce mnie zadziwić. Dobra odpowiedź, najbardziej pasująca do tego, czego szuka OP. + 1'ed
Sergiy Kolodyazhnyy
Niestety masz rację, haha. Tak, dokładnie o to, o co poprosił OP.
Jacob Vlijm,
Pomogłeś mi kilka razy dzięki edycjom i odpowiedziom. Mają „ciasteczko”, jak zwykł mawiać ole'Serg ... rzeczywiście ma ich pół tuzina :)
WinEunuuchs2Unix
6

Niestandardowe polecenia

Jeśli używasz Unity i masz zainstalowany ccsm, odpowiedź wjandrea jest oczywiście twoją odpowiedzią. Jeśli nie , lub do zastosowania w innych dystrybucjach, przydatna może być lekka alternatywa.

Za pomocą poniższego skryptu możesz ustawić dowolne polecenie, specyficzne dla każdego z twoich hotcornerów.

Jako przykład wykonałem następującą konfigurację:

  • Lewy górny Brak akcji
  • Prawy górny bieg Gedit
  • Dolny lewy Brak działania
  • Na dole po prawej Uruchom terminal gnome

Oczywiście możesz także sprawić, aby polecenia uruchamiały zewnętrzne skrypty.

Ponadto możesz ustawić rozmiar gorącego rogu w linii:

cornersize = 10

Po prostu zmień wartość (piksele). Skrypt ustawia (kwadratowe) obszary do wyzwalania poleceń:

wprowadź opis zdjęcia tutaj

Scenariusz

#!/usr/bin/env python3
import subprocess
import time

cornersize = 20

commands = [
    None,
    "gedit",
    None,
    "gnome-terminal",
    ]

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8").strip()

def get_pos():
    return [int(s.split(":")[1]) for s in get(["xdotool", "getmouselocation"]).split()[:2]]

scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2
res = [int(n) for n in scrdata[resindex].split("+")[0].split("x")]

match1 = None

while True:
    time.sleep(1)
    xy = get_pos()
    x = xy[0]; y = xy[1]
    test = [
        [x < cornersize, y < cornersize],
        [x > res[0]-cornersize, y < cornersize],
        [x < cornersize, y > res[1]-cornersize],
        [x > res[0]-cornersize, y > res[1]-cornersize],
        ]
    match2 = [i for i, p in enumerate(test) if all(p)]
    if match2 != match1:
        if match2:
            cmd = commands[match2[0]]
            if cmd:
                subprocess.Popen(["/bin/bash", "-c", cmd])
    match1 = match2

Ustawiać

  1. Skrypt potrzebuje xdotool

    sudo apt install xdotool
  2. Skopiuj skrypt do pustego pliku, zapisz i jako hotcorners2.py
  3. W nagłówku skryptu ustaw swoje polecenia (pamiętaj o cudzysłowach)

    commands = [
        None,
        "gedit",
        None,
        "gnome-terminal",
    ]

    (następnie górny lewy / prawy, dolny lewy / prawy)

  4. Testuj - uruchom skrypt:

    python3 /path/to/hotcorners2.py
  5. Jeśli wszystko działa poprawnie, dodaj do Startup Applications: Dash> Startup Applications> Add. Dodaj polecenie:

    /bin/bash -c "sleep 5 && python3 /path/to/hotcorners2.py"

Notatki

  • Skrypt działa obecnie na (pierwszym) ekranie. Można go łatwo edytować, aby obsługiwać wiele ekranów, a nawet robić różne rzeczy na różnych ekranach.
  • Jeśli kilka osób to lubi, możemy dodać GUI i PPA dla wygodnego użytkowania i łatwej instalacji.

EDYTOWAĆ

Jeśli użyjemy nieco bardziej zaawansowanych metod obliczeniowych, możemy użyć promienia zamiast kwadratowego obszaru do uruchomienia poleceń (dzięki dobrym starym @pythagoras):

wprowadź opis zdjęcia tutaj

Mała różnica, ale dla zabawy:

Scenariusz

#!/usr/bin/env python3
import subprocess
import math
import time

# set distance (hotcorner sensitivity)
radius = 20

# top-left, top-right, bottom-left, bottom-right
commands = [
    None,
    "gedit",
    None,
    "gnome-terminal",
    ]

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8").strip()

def get_pos():
    return [int(s.split(":")[1]) for s in get(["xdotool", "getmouselocation"]).split()[:2]]

# get the resolution
scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2
res = [int(n) for n in scrdata[resindex].split("+")[0].split("x")]
# list the corners, could be more elegant no doubt
corners = [[0, 0], [res[0], 0], [0, res[1]], [res[0], res[1]]]

match1 = None

while True:
    time.sleep(1)
    pos = get_pos()
    # get the current difference from the mousepointer to each of the corner (radius)
    diff = [int(math.sqrt(sum([(c[i]-pos[i])**2 for i, n in enumerate(res)])))\
            for c in corners]
    # see if any of the corners is "approached" within the radius
    match2 = [diff.index(n) for n in diff if n < radius]
    # if so, and the corresponding command is not set to None, run it.
    if all([match2 != match1, match2]):
        cmd = commands[match2[0]]
        if cmd:
            subprocess.Popen(["/bin/bash", "-c", cmd])
    match1 = match2

Stosowanie

Jest prawie taki sam. Ustaw swoje polecenia i promień wyzwalania w sekcji head skryptu.

Jacob Vlijm
źródło
5

UWAGA:

Odpowiedź wjandrea jest najbardziej odpowiednią odpowiedzią dla kogoś, kto używa domyślnego Ubuntu lub Ubuntu Kylin (lub ma compiz jako menedżera wyświetlania), dzięki czemu zyskuje moje uznanie i szacunek. Poniższa odpowiedź może być wykorzystana również w Unity, ale prawdopodobnie byłaby nieco zbędna. Jednak w środowiskach stacjonarnych, które nie mają funkcji compiz, można użyć wskaźnika przedstawionego poniżej. Przetestowałem go krótko w Lubuntu 16.04 VM, więc wiem, że tam działa i uczyniłem go kompatybilnym z Kylin 14.04. W przypadku komputerów stacjonarnych GNOME i MATE musisz najpierw włączyć obsługę AppIndicators, aby użyć dowolnego wskaźnika.

Wprowadzenie

Wdrożyłem, indicator-edgerktóry pozwala na uruchamianie poleceń zdefiniowanych przez użytkownika na podstawie położenia myszy w dowolnym miejscu wzdłuż 4 krawędzi ekranu. Oryginalna wersja została wykonana w ciągu jednego dnia, w ciągu około 7 godzin, więc jest dość minimalistyczna, ale działa.

wprowadź opis zdjęcia tutaj

Wskaźnik jest kontrolowany przez ~/.edger-commands.jsonplik, oczywiście w jsonformacie. Może być zapisany ręcznie przez użytkownika lub ustawiony za pomocą DEFINE COMMANDSopcji wskaźnika . Opcja włączania / wyłączania wyzwalania jest zapamiętywana i zapisywana automatycznie do pliku dla wygody użytkownika. Przykładowy plik konfiguracyjny wyglądałby tak:

{
    "right": "gnome-terminal",
    "top": "firefox",
    "left": "",
    "bottom": "gnome-screenshot",
    "enabled": true
}

Zanotuj "left"wpis w pliku. Ta krawędź jest nieustawiona, ale ze względu na jsonskładnię wymaga tam pustego łańcucha, tzn "". Cudzysłowów .

Gdy wskaźnik wykryje, że użytkownik umieścił mysz wzdłuż dowolnej krawędzi (z marginesem ~ 3 pikseli), wskaźnik wyśle ​​powiadomienie bąbelkowe i uruchomi odpowiednie polecenie (jeśli zdefiniowano). Aktywacja wyzwalacza nie powtórzy się, chyba że użytkownik odsunie mysz od krawędzi.

wprowadź opis zdjęcia tutaj

Jak widać na powyższym zrzucie ekranu, wskaźnik ma również wyniki debugowania w wierszu poleceń. Jeśli znajdziesz jakieś błędy, uruchom je z poziomu terminala, dowiedz się, jaki błąd występuje i prześlij odpowiedni raport o błędach na stronie problemów GitHub projektu .

Obecnie nie ma obsługi narożników (tylko krawędzie) i został on stworzony do konfiguracji z jednym monitorem (oczywiście nie można pokryć wszystkich baz w ciągu 7 godzin od utworzenia), ale te funkcje mogą być dostępne w przyszłości.

Instalacja i kod źródłowy

Kod źródłowy jest dostępny na stronie GitHub projektów lub przez Launchpad . Instalacja odbywa się za pomocą następujących poleceń w terminalu:

sudo add-apt-repository ppa:1047481448-2/sergkolo
sudo apt-get update
sudo apt-get install indicator-edger
Sergiy Kolodyazhnyy
źródło