Yanıtlar:
Kendi cevabınızdan, uygun bir GUI aracı aradığınızı anlıyorum, bu yüzden:
Aşağıda "Açıklama" bölümünde açıklandığı gibi, her ikisi de wmctrl
ve xdotool
biraz yanlış bir pencere boyutu döndürür.
Aşağıdaki komut dosyası (gösterge) paneldeki bir pencerenin hem "gerçek" boyutunu hem de net boyutunu gösterecektir.
#!/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()
Betiğin yüklenmesi için xdotool gerekir:
sudo apt-get install xdotool
Komut dosyasını boş bir dosyaya kopyalayın, getwindowsize.py
Komut dosyası ile komut dosyasını bir terminal penceresinden test edin:
python3 /path/to/getwindowsize.py
Komut alır odaklanmış pencere (her ikisi çıkışında olduğu gibi dinamik net windowsizeyi göstermek wmctrl
ve xdotool
) ve gerçek dekoratör vb dahil pencere boyutu,
Hedeflenen pencereyi kapatırsanız, gösterge bir mesaj gösterir:
Her şey yolunda giderse bir kısayol tuşuna ekleyin: şunu seçin: Sistem Ayarları> "Klavye"> "Kısayollar"> "Özel Kısayollar". "+" İşaretini tıklayın ve şu komutu ekleyin:
python3 /path/to/getwindowsize.py
... biraz yanlış
Demek istedin ki:
İdeal olarak, bu araç Ubuntu'nun menü çubuğunun boyutunu düşürebilir
Hikayenin tamamı, her ikisinin de wmctrl -lG
ve xdotool getwindowgeometry
menü çubuğu olmadan pencerenin boyutunu döndürmesi veya bu cevapta açıklandığı gibi :
Wmctrl pencerenin süslemelerin içindeki geometrisini geri döndürüyor (başlık çubuğu ve kenarlıklar dahil değil)
Bilgileri doğru bir şekilde almak için
xprop -id <window_id> | grep FRAME
Bu çıktı:
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0
Burada biz den çıktı olarak, pencerenin büyüklüğüne eklemek gereken değerleri almak wmctrl
ve xdotool
penceresinin sağ, üst ve alt, sol,.
Başka bir deyişle, bu durumda, a wmctrl
200x100 boyutundaysa, gerçek boyut 200x128'dir.
OP tarafından önerildiği gibi, kullanıcı gösterge başlatıldıktan sonra aşağıdakileri değiştirerek bir pencere seçebilir :
window = get(["xdotool", "getactivewindow"])
tarafından:
window = get(["xdotool", "selectwindow"])
Komut dosyasında, bu satırlardan biri önerilmeyebilir.
Şu wmctrl -lG
formattaki bir tabloda tüm açık pencerelerin bir listesini almak için kullanabilirsiniz :
<window ID> <desktop ID> <x-coordinate> <y-coordinate> <width> <height> <client machine> <window title>
Örnek bir çıktı şöyle görünebilir:
$ 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
Bulduğum xwininfo -all
gelen /unix/14159/how-do-i-find-the-window-dimensions-and-position-accurately-including-decoration .
Çalışıyor ama hala daha uygun çözümlere açıkım => gerçek zamanlı bir GUI aracı.
xwininfo
zaten bulduğunuzu fark etmedim . Belki yazdığım senaryo ile ilgilenirsiniz - kullanır xwininfo
ama bir GUI açılır penceresi ile, lütfen aşağıya bakın.
Biri deneyebilir:
xdotool search --name gnome-panel getwindowgeometry
GNOME panelinin ubuntu araç çubuğunun işlem adı olduğunu varsayar, ama kim bilir.
(a gerekebilir sudo apt-get install xdotool
)
Kişinin daha da geliştirmek isteyebileceği doğaçlama bir GUI şey için, sadece çıplak temelleri görüntülemek için:
zenity --text-info --filename=<(xprop)
İşaretçiyi xprop çarpı olarak değiştirir, ardından pencereyi tıklarsınız ve xprop bilgilerini bir GTK iletişim kutusunda yazdırır.
En büyük sorun wmctrl
ve xdotool
bu araçların yüklenmesi gerekiyor - varsayılan olarak Ubuntu'da değiller . Ancak Ubuntu ile birlikte gelir xwininfo
. Kullanıcı tarafından seçilen pencere hakkında bilgi sağlayan basit bir araçtır.
Basit kullanım terminalde yazmak (çıktıyı filtrelemek için kullanılan xwininfo | awk '/Width/||/Height/'
uyarı awk
) ve imleciniz x
istediğiniz herhangi bir GUI penceresini seçmek için değiştiğinde ve bilgilerini görüntüleyecektir. Örneğin:
$ xwininfo | awk '/Width/||/Height/'
Width: 602
Height: 398
Yani avantajları:
Tabii ki benim gibi 7/24 açık terminaliniz varsa, xwininfo
ihtiyacınız olan tek şey budur. Bazı kullanıcılar klavye kısayoluna sahip olmayı tercih edebilir. Aşağıdaki komut dosyası (klavye kısayoluna bağlı olması amaçlanmıştır), o anda etkin pencereniz hakkında bilgi içeren grafiksel bir açılır pencere görüntülemenize olanak tanır. Ekran görüntüsünde görülebileceği gibi, pencere başlığı, genişlik ve yükseklik bilgilerini görüntüler.
Kaputun altında bu özellikle muhteşem bir şey yapmaz. dbus
Hizmetten gelen bilgileri kullanır xwininfo
ve basit açılır pencereye koyar. Kaynak kodu aşağıdadır. Unutmayın, standart komut dosyası yazma kuralları geçerlidir: chmod +x
klavye kısayoluyla çalıştırılabilir izinlere sahip olduğundan emin olun ve komut dosyası dosyasına komut olarak tam yol verin.
#!/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 $@
Cevabımı yazarken, bunun mevcut projelerimden biri olan Ayatana Göstergesi'ne dahil etmek için çok yararlı bir özellik olacağını fark ettim. Bu gösterge, GUI pencereleri hakkında tüm bilgilerin gösterilmesini sağlar. Halen aktif geliştirme aşamasındadır. Github deposuna geometri bilgisi özelliği eklendi ve kişisel PPA'ma geliyor . Ve elbette, xwininfo
biraz farklı bir şekilde olsa da kullanır .
getactivewindow
tarafındanselectwindow
, bu nedenle komut başlatıldığında imleçle gelen boyutlarını almak için pencereyi seçin. Bu davranışı çok daha uygun buluyorum. 2) Ubuntu'yu yapıştırmak için kod yükledim , bu yüzden kurulumu daha kolay: Sadece indirin ve getwindowsize.py olarak kaydedin