Zastanawiam się, czy jest jakiś sposób na uzyskanie efektu skrótu Ctrl-Alt-Keypad w Unity za pomocą poleceń terminalu? Chcę polecenia, które ustawia okno GUI na połowę wielkości ekranu, wyrównane do lewej lub prawej strony.
Jako tło piszę skrypt, który działa po zalogowaniu. Używa Zenity, aby zapytać, czy chcę otworzyć moje środowisko programistyczne (GVim i IPython obok siebie). Mam stara się osiągnąć dwa równej wielkości okna dla tych programów za pomocą set lines= columns=
w moim .gvimrc
i c.IPythonWidget.width =
i c.IPythonWidget.height =
w moim ipython_qtconsole_config.py
. Istnieją jednak problemy związane z tym podejściem.
Odpowiedzi:
Na co wpadniesz
Jeśli chcesz najpierw wywołać aplikację, a następnie umieścić jej okno na określonej pozycji i rozmiarze, czas między wywołaniem aplikacji a momentem, w którym okno faktycznie się pojawi , jest nieprzewidywalny. Jeśli twój system jest zajęty, może być znacznie dłuższy niż w przypadku bezczynności.
Potrzebujesz „inteligentnego” sposobu, aby upewnić się, że pozycjonowanie / zmiana rozmiaru jest wykonywana (natychmiast) po pojawieniu się okna .
Skrypt wywołuje aplikację, czeka na jej pojawienie się i ustawia na ekranie
Za pomocą poniższego skryptu możesz wywołać aplikację i ustawić za pomocą polecenia pozycję i rozmiar:
Kilka przykładów:
Aby wywołać
gnome-terminal
i zmienić rozmiar okna do 50% i umieścić je w prawej połowie:Aby zadzwonić
gedit
, umieść okno po lewej stronie i zadzwońgnome-terminal
, ustaw je po prawej stronie (ustawiającv-size
46%, aby dać mu trochę przestrzeni między oknami):Aby wywołać Inkscape, umieść jego okno w lewej / górnej ćwiartce ekranu:
Skrypt i jak go używać
zainstaluj zarówno
xdotool
iwmctrl
. Użyłem obu, ponieważ zmiana rozmiaru za pomocąwmctrl
może powodować pewne osobliwości (szczególnie)Unity
.setwindow
(bez rozszerzenia) w~/bin
; w razie potrzeby utwórz katalog.~bin
, uruchom:source ~/.profile
Uruchom skrypt z poleceniem (np.)
Innymi słowy:
Jeśli wszystko działa poprawnie, użyj polecenia wszędzie tam, gdzie jest to potrzebne.
Scenariusz
Co to robi
Po wywołaniu skryptu:
wmctrl -lp
)ps -ef ww
, porównując pid okna z pid aplikacji)Mniejszy problem
W Unity, gdy (re) pozycjonujesz i (re) zmieniasz okno za pomocą jednego
wmctrl
lub drugiegoxdotool
, okno zawsze zachowuje mały margines do granic ekranu, chyba że ustawisz je na 100%. Możesz to zobaczyć na obrazku (3) powyżej; podczas gdyinkscape
okno zostało umieszczone wx
pozycji 0, nadal możesz zobaczyć niewielki marge między Unity Launcher ainkscape
oknem.źródło
wmctrl
zainstalowany, polecenie:wmctrl -lG | grep <windowname>
pokaże wyjście jak:0x03600e4f 0 723 197 1114 563 jacob-System-Product-Name dimkeyboard.sh (~/Bureaublad) - gedit
. Na tym wyjściu kolumna od 3 do 6 pokazuje wymiary, x, y, szerokość, szerokość, wysokość.appAndParams = sys.argv[1] app = appAndParams[0].split(' ', 1)[0] get = lambda x: subprocess.check_output(["/bin/bash", "-c",x]).decode("utf-8") ws1 = get("wmctrl -lp"); t = 0 subprocess.Popen(["/bin/bash", "-c", appAndParams])
</pre> <edit> odmawia sformatowania tego kodu. </edit>Właściwe polecenie, które chcesz, to coś w rodzaju
To sprawi, że bieżące okno zajmie połowę ekranu (zmień
$HALF
wymiary ekranu) i przyciągnie do lewej strony. Aby przyciągnąć w prawo, użyjMożesz także pobawić
wmctrl
się identyfikatorem okien, które Cię interesują, zamiast ich używać:ACTIVE:
. Nie mogę jednak pomóc, ponieważ zależy to od okien, o których mowa. Zobaczman wmctrl
więcej.Napisałem do tego skrypt. Nie używam Unity, więc nie mogę zagwarantować, że będzie z nim współpracować, ale nie widzę powodu, dla którego miałbym tego nie robić. Potrzebuje
wmctrl
,xdpyinfo
adisper
które mają być zainstalowane:Następnie zapisz poniższy skrypt jako
~/bin/snap_windows.sh
, wykonaj go za pomocąchmod a+x ~/bin/snap_windows.sh
i możesz uruchomićAby przyciągnąć do prawej strony. Użyj
l
dla lewej strony i bez argumentów, aby zmaksymalizować okno. Zauważ, że działa w bieżącym oknie, więc musisz przypisać do niego skrót, jeśli chcesz, aby działał tylko na terminalu.Skrypt jest nieco bardziej skomplikowany niż to, o co prosisz, ponieważ napisałem go, aby działał zarówno w konfiguracji z jednym, jak i z dwoma monitorami.
źródło
Możesz to zrobić za pomocą
xdotool
.Aby zainstalować
xdotool
, możesz uruchomić:Następnie, aby wysłać naciśnięcie klawisza Ctrl+ Alt+ <keypad_key>do
X
okna terminala , możesz uruchomić:* <wartość_klucza_ klawiatury> = wartość klawisza na liście poniżej
Aby uruchomić program GUI i wysłać naciśnięcie klawisza do jego
X
okna (które w tym przypadku jest aktywnym oknem w momenciexdotool
wykonywania polecenia), możesz uruchomić:* <polecenie> = polecenie otwierające okno, do którego chcesz wysłać naciśnięcie klawisza; <opóźnienie> = czas oczekiwania w milisekundach przed wysłaniem klawisza; <wartość_klucza> = wartość klawisza na poniższej liście
Zauważ, że w większości przypadków będziesz musiał uruchomić polecenie, które wydajesz jako proces autonomiczny (np. Uruchamiając
nohup <command> &
zamiast<command>
w powyższym przykładzie), w przeciwnym raziexdotool
nie zostanie uruchomione, dopóki<command>
wykonanie nie zostanie zakończone.Musisz także ustawić pewne opóźnienie, w przeciwnym razie naciśnięcie klawisza zostanie wysłane, zanim okno docelowe zostanie w pełni załadowane
X
(opóźnienie500ms
powinno wystarczyć ).Możliwe wartości
<keypad_key_value>
to:90
87
88
89
83
84
85
79
80
81
Zgodnie z ogólną zasadą, aby znaleźć wartość dowolnego klawisza na klawiaturze w
X
środowisku, można uruchomićxev
i nacisnąć ten klawisz, aby wypisać jego wartość w terminalu.źródło
Stworzyłem aplikację o nazwie Worksets (na github ) dla Unity, która pozwala to zrobić z łatwością za pomocą graficznego interfejsu użytkownika - To bezpłatne i otwarte oprogramowanie.
Jest to po prostu opakowanie dla rozwiązań wmctrl i xdotool wymienionych jako odpowiedzi tutaj i zapewnia łatwy sposób szybkiego tworzenia i zapisywania takich ustawień.
źródło
Nie mam przedstawiciela, który mógłby komentować bezpośrednio doskonałego posta Jacoba Vlijma, ale zmodyfikowałem skrypt, aby umożliwić uruchomienie aplikacji z argumentami (konieczne do użycia
setwindow
zgedit --new-window
). Zmiana:do:
źródło
I bawił się skryptu Terdon jest z góry i dodano kilka nowych rzeczy (możliwość wyboru monitora i ustawić wysokość dla każdego monitora). Myślę, że można by go rozszerzyć, dodając więcej monitorów. Mam nadzieję, że inni uznają to za przydatne.
Podstawowa składnia:
Gdzie nazwa_programu jest tym, czym zapisałeś ten kod; monitor to numer monitora, np. 1 lub 2; l / r / m jest lewy, prawy lub maksymalny; a nazwa_okna to nazwa (lub ułamek jej nazwy) okna docelowego.
Na przykład:
Skrypt Bash
źródło