Ich frage mich, ob es eine Möglichkeit gibt, die Auswirkungen der Tastenkombinationen für Strg-Alt-Tasten in Unity mithilfe von Terminalbefehlen zu erzielen. Ich möchte einen Befehl, der ein GUI-Fenster auf die Hälfte der Bildschirmgröße einstellt, entweder links oder rechts ausgerichtet.
Als Hintergrund schreibe ich ein Skript, das nach dem Anmelden ausgeführt wird. Mit Zenity wird gefragt, ob ich meine Entwicklungsumgebung (GVim und IPython nebeneinander) öffnen möchte oder nicht. Ich habe versucht, zwei gleich große Fenster für diese Programme zu erzielen, indem set lines= columns=
ich in meinem .gvimrc
und c.IPythonWidget.width =
und c.IPythonWidget.height =
in meinem ipython_qtconsole_config.py
. Mit diesem Ansatz sind jedoch Probleme verbunden.
Antworten:
Worauf du stoßen wirst
Wenn Sie eine Anwendung zum ersten Mal aufrufen und ihr Fenster anschließend an einer bestimmten Position und Größe platzieren möchten, ist die Zeit zwischen dem Aufrufen der Anwendung und dem tatsächlichen Erscheinen des Fensters nicht vorhersehbar. Wenn Ihr System belegt ist, kann es erheblich länger dauern als im Leerlauf.
Sie benötigen eine "intelligente" Methode, um sicherzustellen, dass die Positionierung / Größenänderung (unmittelbar) nach dem Erscheinen des Fensters erfolgt .
Skript zum Aufrufen einer Anwendung, warten Sie, bis sie angezeigt wird, und positionieren Sie sie auf dem Bildschirm
Mit dem folgenden Skript können Sie eine Anwendung aufrufen und die Position und Größe festlegen, auf der sie mit dem Befehl angezeigt werden soll:
Einige Beispiele:
So rufen Sie
gnome-terminal
das Fenster auf, ändern die Größe auf 50% und platzieren es auf der rechten Hälfte:Um anzurufen
gedit
, platzieren Sie das Fenster auf der linken Seite und rufengnome-terminal
Sie an, platzieren Sie es auf der rechten Seite (stellen Sie diev-size
46% ein, um etwas Platz zwischen den Fenstern zu schaffen):Um Inkscape aufzurufen, platzieren Sie das zugehörige Fenster im linken / oberen Viertel des Bildschirms:
Das Skript und wie man es benutzt
Installieren Sie beide
xdotool
undwmctrl
. Ich habe beides verwendet, da das Ändern der Größe mitwmctrl
(speziell) einige Besonderheiten verursachen kannUnity
.setwindow
(ohne Erweiterung) in~/bin
. Erstellen Sie ggf. das Verzeichnis.~bin
, führen Sie Folgendes aus:source ~/.profile
Teste das Skript mit dem Befehl (zB)
Mit anderen Worten:
Wenn alles funktioniert, verwenden Sie den Befehl, wo immer Sie ihn benötigen.
Das Drehbuch
Was es macht
Wenn das Skript aufgerufen wird, geschieht Folgendes:
wmctrl -lp
)ps -ef ww
indem die PID des Fensters mit der PID der Anwendung verglichen wird).Geringes Problem
Wenn Sie in Unity ein Fenster mit
wmctrl
oder (neu) positionieren und (in der Größe neu)xdotool
anpassen, bleibt der Rand des Fensters immer klein, es sei denn, Sie setzen ihn auf 100%. Sie können das im Bild (3) oben sehen; Während dasinkscape
Fenster aufx
Position 0 gestellt wurde, sehen Sie immer noch einen kleinen Abstand zwischen dem Unity Launcher und deminkscape
Fenster.quelle
wmctrl
installiert, wird der Befehl:wmctrl -lG | grep <windowname>
wird Ihnen eine Ausgabe wie:0x03600e4f 0 723 197 1114 563 jacob-System-Product-Name dimkeyboard.sh (~/Bureaublad) - gedit
. In dieser Ausgabe werden in der 3. bis 6. Spalte die Abmessungen x, y, Breite, Breite und Höhe angezeigt.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> Es lehnt ab , diesen Code zu formatieren. </ Edit>Der eigentliche Befehl, den Sie wollen, ist so etwas wie
Dadurch nimmt das aktuelle Fenster die Hälfte des Bildschirms ein (ändern Sie
$HALF
die Abmessungen Ihres Bildschirms) und rastet auf der linken Seite ein. Zum Einrasten nach rechts verwenden SieSie können auch damit spielen
wmctrl
, um die ID der Fenster zu ermitteln, an denen Sie interessiert sind, anstatt sie zu verwenden:ACTIVE:
. Ich kann da allerdings nicht helfen, da das von den jeweiligen Fenstern abhängt. Schauen Sie sichman wmctrl
nach mehr um.Ich habe ein Skript dafür geschrieben. Ich verwende Unity nicht und kann daher nicht garantieren, dass es damit funktioniert, aber ich sehe keinen Grund, warum nicht. Es muss
wmctrl
,xdpyinfo
unddisper
installiert werden:Speichern Sie dann das unten stehende Skript als
~/bin/snap_windows.sh
, machen Sie es mit ausführbarchmod a+x ~/bin/snap_windows.sh
und Sie können es ausführenRechts einrasten. Verwenden
l
für die linke Seite keine Argumente, um das Fenster zu maximieren. Beachten Sie, dass es im aktuellen Fenster ausgeführt wird, sodass Sie ihm eine Verknüpfung zuweisen müssen, wenn es auf einem anderen Computer als dem Terminal ausgeführt werden soll.Das Skript ist etwas komplizierter als gewünscht, da ich es sowohl für Einzel- als auch für Doppelmonitor-Setups geschrieben habe.
quelle
Sie können dies mit tun
xdotool
.Zum Installieren können
xdotool
Sie Folgendes ausführen:Um dann einen Ctrl+ Alt+ <keypad_key>Tastendruck an das Terminalfenster zu senden
X
, können Sie Folgendes ausführen:* <Tastatur_Tastenwert> = Wert der Tastaturtaste in der folgenden Liste
Um ein GUI-Programm auszuführen und den Tastendruck an sein
X
Fenster zu senden (das in diesem Fall zum Zeitpunkt derxdotool
Befehlsausführung das aktive Fenster ist ), können Sie Folgendes ausführen:* <Befehl> = Befehl, der das Fenster öffnet, an das Sie den Tastendruck senden möchten; <delay> = Wartezeit in Millisekunden vor dem Senden des Tastenanschlags; <keypad_key_value> = Wert der Tastaturtaste in der Liste unten
Beachten Sie, dass Sie den Befehl, den Sie ausgeben, in den meisten Fällen als eigenständigen Prozess ausführen müssen (z. B. indem Sie ihn
nohup <command> &
anstelle des<command>
obigen Beispielsxdotool
ausführen ). Anderenfalls wird er erst ausgeführt, wenn<command>
die Ausführung abgeschlossen ist.Außerdem müssen Sie eine Verzögerung einstellen, da andernfalls der Tastenanschlag gesendet wird, bevor das Zielfenster vollständig geladen ist
X
(eine Verzögerung500ms
sollte dies tun).Mögliche Werte für
<keypad_key_value>
sind:90
87
88
89
83
84
85
79
80
81
Um den Wert einer beliebigen Taste auf der Tastatur innerhalb der
X
Umgebung herauszufinden, kann man als Faustregelxev
die Taste ausführen und drücken, um ihren Wert im Terminal auszugeben.quelle
Ich habe eine Anwendung namens Worksets (auf Github ) für Unity erstellt, mit der Sie dies auf einfache Weise über eine grafische Benutzeroberfläche tun können - Es ist kostenlos und Open Source.
Es ist im Grunde ein Wrapper für die hier als Antworten aufgeführten Lösungen wmctrl und xdotool und bietet eine einfache Möglichkeit, solche Einstellungen schnell vorzunehmen und zu speichern.
quelle
Ich habe nicht die rep kommentieren direkt auf Jacob Vlijm ausgezeichneten Beitrag, aber ich modifizierte , um das Skript eine Anwendung mit Argumenten zu ermöglichen , beginnen (erforderlich verwenden
setwindow
mitgedit --new-window
). Veränderung:zu:
quelle
Ich habe mit Terdons Skript von oben herumgespielt und einige neue Dinge hinzugefügt (die Möglichkeit, den Monitor auszuwählen und die Höhe für jeden Monitor festzulegen ). Es wäre erweiterbar, um mehr Monitore hinzuzufügen, denke ich. Hoffentlich finden es andere nützlich.
Grundlegende Syntax:
Wo prog_name ist, als was auch immer Sie diesen Code gespeichert haben; monitor ist die Monitornummer, z. B. 1 oder 2; l / r / m ist links oder rechts oder max; und Fenstername ist der Name (oder ein Bruchteil seines Namens) des Zielfensters.
Z.B:
Bash-Skript
quelle