Ich benötige ein Werkzeug, um die Breite und Höhe eines beliebigen Fensters zu ermitteln.
Idealerweise würde dieses Tool die Größe der Ubuntu-Menüleiste reduzieren.
quelle
Ich benötige ein Werkzeug, um die Breite und Höhe eines beliebigen Fensters zu ermitteln.
Idealerweise würde dieses Tool die Größe der Ubuntu-Menüleiste reduzieren.
Aus Ihrer eigenen Antwort geht hervor, dass Sie nach einem praktischen GUI-Tool suchen.
Wie weiter unten in "Erläuterung" erläutert, geben beide wmctrl
und xdotool
eine etwas falsche Fenstergröße zurück.
Das Skript (Indikator) unten zeigt sowohl die "echte" Größe als auch die Nettogröße eines Fensters im Panel an.
#!/usr/bin/env python3
import signal
import gi
gi.require_version('AppIndicator3', '0.1')
gi.require_version('Gtk', '3.0')
import subprocess
from gi.repository import Gtk, AppIndicator3, GObject
import time
from threading import Thread
def get(cmd):
try:
return subprocess.check_output(cmd).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
# ---
# uncomment either one of two the lines below; the first one will let the user
# pick a window *after* the indicator started, the second one will pick the
# currently active window
# ---
window = get(["xdotool", "selectwindow"])
# window = get(["xdotool", "getactivewindow"])
class Indicator():
def __init__(self):
self.app = 'test123'
iconpath = "unity-display-panel"
self.indicator = AppIndicator3.Indicator.new(
self.app, iconpath,
AppIndicator3.IndicatorCategory.OTHER)
self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
self.indicator.set_menu(self.create_menu())
self.indicator.set_label(" ...Starting up", self.app)
# the thread:
self.update = Thread(target=self.show_seconds)
# daemonize the thread to make the indicator stopable
self.update.setDaemon(True)
self.update.start()
def create_menu(self):
menu = Gtk.Menu()
# separator
menu_sep = Gtk.SeparatorMenuItem()
menu.append(menu_sep)
# quit
item_quit = Gtk.MenuItem('Quit')
item_quit.connect('activate', self.stop)
menu.append(item_quit)
menu.show_all()
return menu
def show_seconds(self):
sizes1 = None
while True:
time.sleep(1)
sizes2 = self.getsize(window)
if sizes2 != sizes1:
GObject.idle_add(
self.indicator.set_label,
sizes2, self.app,
priority=GObject.PRIORITY_DEFAULT
)
sizes1 = sizes2
def getsize(self, window):
try:
nettsize = [int(n) for n in get([
"xdotool", "getwindowgeometry", window
]).splitlines()[-1].split()[-1].split("x")]
except AttributeError:
subprocess.Popen(["notify-send", "Missing data", "window "+window+\
" does not exist\n(terminating)"])
self.stop()
else:
add = [l for l in get(["xprop", "-id", window]).splitlines() if "FRAME" in l][0].split()
add = [int(n.replace(",", "")) for n in add[-4:]]
xadd = add[0]+add[1]; yadd = add[2]+add[3]
totalsize = [str(s) for s in [nettsize[0]+add[0]+add[1], nettsize[1]+add[2]+add[3]]]
displ_sizes = ["x".join(geo) for geo in [[str(s) for s in nettsize], totalsize]]
string = " "+displ_sizes[0]+" / "+displ_sizes[1]
return string+((25-len(string))*" ")
def stop(self, *args):
Gtk.main_quit()
Indicator()
GObject.threads_init()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
Für das Skript muss xdotool installiert sein:
sudo apt-get install xdotool
Kopieren Sie das Skript in eine leere Datei und speichern Sie es unter getwindowsize.py
Führen Sie das Skript von einem Terminalfenster aus mit dem folgenden Befehl aus:
python3 /path/to/getwindowsize.py
Das Skript wählt das fokussierte Fenster aus , um die Nettofenstergröße (wie in der Ausgabe von wmctrl
und xdotool
) und die tatsächliche Fenstergröße einschließlich Dekoratoren usw. dynamisch anzuzeigen.
Wenn Sie das Zielfenster schließen, zeigt der Indikator eine Meldung an:
Wenn alles funktioniert, fügen Sie es einer Tastenkombination hinzu: Wählen Sie: Systemeinstellungen> "Tastatur"> "Tastenkombinationen"> "Benutzerdefinierte Tastenkombinationen". Klicken Sie auf das "+" und fügen Sie den Befehl hinzu:
python3 /path/to/getwindowsize.py
... ist etwas falsch
Du erwähnst:
Idealerweise würde dieses Tool die Größe der Ubuntu-Menüleiste reduzieren
Die ganze Geschichte ist, dass beide wmctrl -lG
und xdotool getwindowgeometry
die Größe des Fensters ohne Menüleiste zurückgeben, oder, wie es in dieser Antwort erklärt wird :
Was passiert ist, dass wmctrl die Geometrie des Fensters innerhalb der Dekorationen zurückgibt (dh ohne Titelleiste und Rahmen)
Um die Informationen korrekt abzurufen, können wir ausführen
xprop -id <window_id> | grep FRAME
Dies wird wie folgt ausgegeben:
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0
Hier erhalten wir die Werte, die wir zur Fenstergröße hinzufügen müssen, als Ausgabe von wmctrl
und xdotool
links, rechts, oben und unten im Fenster.
Mit anderen Worten, wenn in diesem Fall a wmctrl
eine Größe von 200 x 100 anzeigt , ist die tatsächliche Größe 200 x 128.
Wie von OP vorgeschlagen, kann der Benutzer auch nach dem Start des Indikators ein Fenster auswählen , indem er Folgendes ersetzt:
window = get(["xdotool", "getactivewindow"])
durch:
window = get(["xdotool", "selectwindow"])
In dem Skript kann eine dieser Zeilen nicht kommentiert werden.
getactivewindow
durch ersetzt.selectwindow
Wenn das Skript gestartet wird, wählen Sie mit dem Cursor das Fenster aus, aus dem die Dimensionen abgerufen werden sollen. Ich finde dieses Verhalten viel praktischer. 2) Ich habe den Code zum Einfügen von Ubuntu hochgeladen , damit es einfacher einzurichten ist: Einfach herunterladen und als getwindowsize.pyMit können
wmctrl -lG
Sie eine Liste aller geöffneten Fenster in einer Tabelle im folgenden Format abrufen:Eine Beispielausgabe könnte folgendermaßen aussehen:
quelle
Ich fand
xwininfo -all
von /unix/14159/how-do-i-find-the-window-dimensions-and-position genau- einschließlich-decoration .Es funktioniert, aber ich bin immer noch offen für bequemere Lösungen => ein Echtzeit-GUI-Tool.
quelle
xwininfo
bereits gefunden haben . Vielleicht interessiert Sie das Skript, das ich geschrieben habe - es wird verwendet,xwininfo
aber mit einem GUI-Popup, siehe unten.Man könnte versuchen:
Angenommen, Gnome-Panel ist der Prozessname der Ubuntu-Symbolleiste, aber wer weiß.
(erfordert möglicherweise a
sudo apt-get install xdotool
)Für eine improvisierte GUI-Sache, die man weiter verbessern möchte, um nur das Nötigste anzuzeigen:
Es ändert den Zeiger auf das Kreuz von xprop, dann klicken Sie auf das Fenster und es werden die Informationen von xprop in einem GTK-Dialogfeld gedruckt.
quelle
xwininfo und seine Vorteile
Das große Problem mit
wmctrl
undxdotool
ist, dass diese Tools installiert werden müssen - sie sind standardmäßig nicht auf Ubuntu . Ubuntu wird jedoch mit ausgeliefertxwininfo
. Es ist ein einfaches Tool, das Informationen zum vom Benutzer ausgewählten Fenster bereitstellt.Die einfache Verwendung wäre, im Terminal einzugeben
xwininfo | awk '/Width/||/Height/'
(Hinweis,awk
der zum Filtern der Ausgabe verwendet wird), und wenn sich Ihr Cursor ändert,x
um ein beliebiges GUI-Fenster auszuwählen, das Ihnen gefällt, werden dessen Informationen angezeigt. Beispielsweise:Die Vorteile sind also:
Xwininfo noch einen Schritt weiter - Eigenschaften eines aktiven Fensters anzeigen
Natürlich
xwininfo
ist alles, was Sie brauchen, wenn Sie ein Terminal haben, das wie ich rund um die Uhr geöffnet ist. Einige Benutzer bevorzugen möglicherweise eine Tastenkombination. Mit dem folgenden Skript (das an eine Tastenkombination gebunden sein soll) können Sie ein grafisches Popup mit Informationen zu Ihrem derzeit aktiven Fenster anzeigen. Wie auf dem Screenshot zu sehen ist, werden Fenstertitel, Breiten- und Höheninformationen angezeigt.Unter der Haube macht das nichts besonders Spektakuläres. Es verwendet Informationen aus dem
dbus
Servicexwininfo
und fügt sie in ein einfaches Popup ein. Der Quellcode ist unten. Denken Sie daran, dass die Standardregeln für die Skripterstellung gelten: Stellen Sie sicher, dass sie über ausführbare Berechtigungen verfügenchmod +x
und dass Sie beim Binden an eine Tastenkombination den vollständigen Pfad zur Skriptdatei als Befehl angeben.Informationen finden Sie in der Anzeige auf der Oberseite von Unity.
Als ich meine Antwort schrieb, wurde mir klar, dass dies eine sehr nützliche Funktion ist, die ich in eines meiner bestehenden Projekte integrieren kann - den Ayatana-Indikator. Dieser Indikator ermöglicht die Anzeige einer ganzen Reihe von Informationen zu GUI-Fenstern. Derzeit ist noch in der aktiven Entwicklung. Die Geometrie-Info-Funktion wurde dem Github-Repository hinzugefügt und ist auf dem Weg in meine persönliche PPA . Und natürlich wird es
xwininfo
zwar auf etwas andere Art und Weise verwendet.quelle