A partir de sua própria resposta, eu entendo que você está procurando uma ferramenta GUI conveniente, então:
Ferramenta GUI pequena para obter o tamanho da rede e o tamanho real de uma janela (atualizada dinamicamente)
Conforme explicado abaixo em "Explicação", tanto wmctrl
quanto xdotool
retornam um windowsize ligeiramente incorreto.
Oscript(indicador)abaixomostraráotamanho"real" e o tamanho da rede de uma janela no painel.
O script
#!/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()
Como usar
-
O script precisa do xdotool para ser instalado:
sudo apt-get install xdotool
-
Copie o script em um arquivo vazio, salve-o como
getwindowsize.py
-
Teste- execute o script a partir de uma janela de terminal pelo comando:
python3 /path/to/getwindowsize.py
-
O script seleciona a janela focada para mostrar dinamicamente o windowsize da rede (como na saída de
wmctrl
exdotool
) e o real tamanho da janela, incluindo decoradores, etc.Se você fechar a janela segmentada, o indicador mostrará uma mensagem:
Setudofuncionarbem,adicione-oaumatecladeatalho:escolha:Configuraçõesdosistema>"Teclado" > "Atalhos" > "Atalhos personalizados". Clique no botão "+" e adicione o comando:
python3 /path/to/getwindowsize.py
Explicação
O tamanho da janela, como é exibido por wmctrl e xdotool
... está ligeiramente incorreto
Você menciona:
Idealmente, essa ferramenta deduziria o tamanho da barra de menus do Ubuntu
A história completa é que wmctrl -lG
e xdotool getwindowgeometry
retornam o tamanho da janela sem a barra de menus, ou, como é explicado em esta resposta :
O que está acontecendo é que o wmctrl está retornando a geometria da janela dentro das decorações (ou seja, sem incluir a barra de título e as bordas)
Como obter o tamanho "real" correto
Para obter as informações corretamente, podemos executar
xprop -id <window_id> | grep FRAME
Isso será exibido como:
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0
Aqui, obtemos os valores que precisamos adicionar ao tamanho da janela, como saída de wmctrl
e xdotool
, à esquerda, à direita, na parte superior e inferior da janela.
Em outras palavras, nesse caso, se um wmctrl
mostrar um tamanho de 200x100, o tamanho real será 200x128.
Nota
Como sugerido por OP, o usuário também pode escolher uma janela após o indicador foi iniciado, substituindo:
window = get(["xdotool", "getactivewindow"])
por:
window = get(["xdotool", "selectwindow"])
No script, qualquer uma dessas linhas pode ser descomentada.