Antworten:
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.
Mit können wmctrl -lG
Sie eine Liste aller geöffneten Fenster in einer Tabelle im folgenden Format abrufen:
<window ID> <desktop ID> <x-coordinate> <y-coordinate> <width> <height> <client machine> <window title>
Eine Beispielausgabe könnte folgendermaßen aussehen:
$ wmctrl -lG
0x02a00002 0 -2020 -1180 1920 1080 MyHostName XdndCollectionWindowImp
0x02a00005 0 0 24 61 1056 MyHostName unity-launcher
0x02a00008 0 0 0 1920 24 MyHostName unity-panel
0x02a0000b 0 -1241 -728 1141 628 MyHostName unity-dash
0x02a0000c 0 -420 -300 320 200 MyHostName Hud
0x03a0000a 0 0 0 1920 1080 MyHostName Desktop
0x0400001d 0 61 24 1859 1056 MyHostName application development - A tool to get window dimensions - Ask Ubuntu - Mozilla Firefox
0x04200084 0 61 52 999 745 MyHostName Untitled Document 1 - gedit
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.
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:
xdotool search --name gnome-panel getwindowgeometry
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:
zenity --text-info --filename=<(xprop)
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.
Das große Problem mit wmctrl
und xdotool
ist, dass diese Tools installiert werden müssen - sie sind standardmäßig nicht auf Ubuntu . Ubuntu wird jedoch mit ausgeliefert xwininfo
. 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:
$ xwininfo | awk '/Width/||/Height/'
Width: 602
Height: 398
Die Vorteile sind also:
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
Service xwininfo
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ügen chmod +x
und dass Sie beim Binden an eine Tastenkombination den vollständigen Pfad zur Skriptdatei als Befehl angeben.
#!/bin/bash
get_active_window()
{
qdbus org.ayatana.bamf \
/org/ayatana/bamf/matcher \
org.ayatana.bamf.matcher.ActiveWindow
}
get_active_name()
{
qdbus org.ayatana.bamf $1 \
org.ayatana.bamf.view.Name
}
main()
{
active_window=$(get_active_window)
active_xid=$( awk -F '/' '{print $NF}' <<< "$active_window" )
echo $active_xid
active_title=$(get_active_name $active_window)
dimensions=$(xwininfo -id "$active_xid" | awk '/Width/||/Height/')
text="$active_title\n""$dimensions"
zenity --info --text "$text" --width=200 --height=200
}
main $@
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.
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.py