Jawaban:
Dari jawaban Anda sendiri, saya mengerti Anda sedang mencari alat GUI yang nyaman, jadi:
Seperti dijelaskan lebih lanjut di bawah dalam "Penjelasan", keduanya wmctrl
dan xdotool
mengembalikan ukuran jendela yang sedikit salah.
Skrip (indikator) di bawah ini akan menunjukkan ukuran "nyata" dan ukuran bersih sebuah jendela di panel.
#!/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()
Skrip membutuhkan xdotool untuk diinstal:
sudo apt-get install xdotool
Salin skrip ke file kosong, simpan sebagai getwindowsize.py
Tes-jalankan skrip dari jendela terminal dengan perintah:
python3 /path/to/getwindowsize.py
Script mengambil jendela yang difokuskan untuk secara dinamis menunjukkan ukuran jendela net (seperti dalam output keduanya wmctrl
dan xdotool
) dan ukuran jendela nyata , termasuk dekorator dll.
Jika Anda menutup jendela yang ditargetkan, indikator menampilkan pesan:
Jika semua berfungsi dengan baik, tambahkan ke tombol pintasan: pilih: Pengaturan Sistem> "Keyboard"> "Pintasan"> "Pintasan Khusus". Klik "+" dan tambahkan perintah:
python3 /path/to/getwindowsize.py
... sedikit salah
Anda menyebutkan:
Idealnya, alat itu akan mengurangi ukuran bilah menu Ubuntu
Kisah lengkapnya adalah keduanya wmctrl -lG
dan xdotool getwindowgeometry
mengembalikan ukuran jendela tanpa bilah menu, atau, seperti yang dijelaskan dalam jawaban ini :
Apa yang terjadi adalah wmctrl mengembalikan geometri jendela di dalam dekorasi (mis. Tidak termasuk bilah judul dan batas)
Untuk mendapatkan informasi dengan benar, kita dapat menjalankan
xprop -id <window_id> | grep FRAME
Ini akan menampilkan seperti:
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0
Di sini kita mendapatkan nilai-nilai yang perlu kita tambahkan ke ukuran jendela, sebagai keluaran dari wmctrl
dan xdotool
, ke kiri, kanan, atas dan bawah jendela.
Dengan kata lain, dalam hal ini, jika a wmctrl
menunjukkan ukuran 200x100, ukuran sebenarnya adalah 200x128.
Seperti yang disarankan oleh OP, pengguna juga dapat memilih jendela setelah indikator dimulai, dengan mengganti:
window = get(["xdotool", "getactivewindow"])
oleh:
window = get(["xdotool", "selectwindow"])
Dalam skrip, salah satu dari baris ini dapat dihapus komentar.
Anda dapat menggunakan wmctrl -lG
untuk mendapatkan daftar semua jendela yang terbuka, dalam tabel dengan format:
<window ID> <desktop ID> <x-coordinate> <y-coordinate> <width> <height> <client machine> <window title>
Contoh output dapat terlihat seperti ini:
$ 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
Saya menemukan xwininfo -all
dari /unix/14159/how-do-i-find-the-window-dimensions-and-position-accurately-including-decoration .
Itu berfungsi tetapi saya masih terbuka untuk solusi yang lebih nyaman => alat GUI real-time.
xwininfo
. Mungkin Anda akan tertarik dengan skrip yang saya tulis - menggunakan xwininfo
tetapi dengan popup GUI, silakan lihat di bawah ini.
Seseorang dapat mencoba:
xdotool search --name gnome-panel getwindowgeometry
Dengan asumsi gnome-panel adalah nama proses dari toolbar ubuntu, tetapi siapa yang tahu.
(mungkin memerlukan a sudo apt-get install xdotool
)
Untuk hal GUI improvisasi yang mungkin ingin lebih ditingkatkan sehingga hanya menampilkan hal-hal penting:
zenity --text-info --filename=<(xprop)
Ini akan mengubah pointer ke salib xprop, lalu Anda mengklik jendela, dan itu akan mencetak info xprop dalam dialog GTK.
Masalah besar dengan wmctrl
dan xdotool
adalah bahwa alat-alat itu perlu diinstal - mereka tidak pada Ubuntu secara default . Namun, Ubuntu disertakan bersama xwininfo
. Ini adalah alat sederhana yang menyediakan informasi tentang jendela yang dipilih pengguna.
Penggunaan sederhana akan mengetik xwininfo | awk '/Width/||/Height/'
(pemberitahuan yang awk
digunakan untuk memfilter output) di terminal, dan ketika kursor Anda berubah untuk x
memilih jendela GUI yang Anda suka dan itu akan menampilkan info. Sebagai contoh:
$ xwininfo | awk '/Width/||/Height/'
Width: 602
Height: 398
Jadi kelebihannya adalah:
Tentu saja jika Anda memiliki terminal terbuka 24/7 seperti yang saya lakukan, xwininfo
itulah yang Anda butuhkan. Beberapa pengguna mungkin lebih suka memiliki pintasan keyboard. Skrip di bawah ini (yang dimaksudkan untuk terikat pada pintasan keyboard) memungkinkan Anda untuk menampilkan sembulan grafis dengan informasi tentang jendela yang sedang aktif. Seperti yang dapat dilihat pada tangkapan layar, ini menampilkan judul jendela, informasi lebar dan tinggi.
Di bawah tenda ini tidak melakukan sesuatu yang spektakuler. Ini menggunakan informasi dari dbus
layanan dan xwininfo
dan membuatnya menjadi popup sederhana. Kode sumber di bawah ini. Ingat, aturan skrip standar berlaku: memastikan memiliki izin yang dapat dieksekusi dengan chmod +x
dan ketika mengikat ke pintasan keyboard Anda memberikan path lengkap ke file skrip sebagai perintah.
#!/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 $@
Ketika menulis jawaban saya, saya menyadari bahwa ini akan menjadi fitur yang sangat berguna untuk dimasukkan ke dalam salah satu proyek saya yang ada - Indikator Ayatana. Indikator ini memungkinkan menampilkan seluruh jajaran informasi tentang jendela GUI. Saat ini masih dalam pengembangan aktif. Fitur info geometri telah ditambahkan ke repositori github dan sedang dalam perjalanan ke PPA pribadi saya . Dan tentu saja, ia menggunakan xwininfo
meskipun dengan cara yang sedikit berbeda.
getactivewindow
denganselectwindow
, jadi ketika skrip diluncurkan Anda memilih dengan kursor jendela untuk mendapatkan dimensi. Saya menemukan perilaku ini jauh lebih nyaman. 2) Saya telah mengunggah kode untuk menempelkan ubuntu , jadi lebih mudah untuk mengatur: Cukup unduh dan simpan sebagai getwindowsize.py