Saya membutuhkan alat untuk mendapatkan lebar dan tinggi jendela yang berubah-ubah.
Idealnya, alat itu akan mengurangi ukuran bilah menu Ubuntu.
sumber
Saya membutuhkan alat untuk mendapatkan lebar dan tinggi jendela yang berubah-ubah.
Idealnya, alat itu akan mengurangi ukuran bilah menu Ubuntu.
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.
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.pyAnda dapat menggunakan
wmctrl -lG
untuk mendapatkan daftar semua jendela yang terbuka, dalam tabel dengan format:Contoh output dapat terlihat seperti ini:
sumber
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.
sumber
xwininfo
. Mungkin Anda akan tertarik dengan skrip yang saya tulis - menggunakanxwininfo
tetapi dengan popup GUI, silakan lihat di bawah ini.Seseorang dapat mencoba:
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:
Ini akan mengubah pointer ke salib xprop, lalu Anda mengklik jendela, dan itu akan mencetak info xprop dalam dialog GTK.
sumber
xwininfo dan kelebihannya
Masalah besar dengan
wmctrl
danxdotool
adalah bahwa alat-alat itu perlu diinstal - mereka tidak pada Ubuntu secara default . Namun, Ubuntu disertakan bersamaxwininfo
. Ini adalah alat sederhana yang menyediakan informasi tentang jendela yang dipilih pengguna.Penggunaan sederhana akan mengetik
xwininfo | awk '/Width/||/Height/'
(pemberitahuan yangawk
digunakan untuk memfilter output) di terminal, dan ketika kursor Anda berubah untukx
memilih jendela GUI yang Anda suka dan itu akan menampilkan info. Sebagai contoh:Jadi kelebihannya adalah:
Mengambil xwininfo satu langkah lebih jauh - menampilkan properti dari jendela yang aktif
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 danxwininfo
dan membuatnya menjadi popup sederhana. Kode sumber di bawah ini. Ingat, aturan skrip standar berlaku: memastikan memiliki izin yang dapat dieksekusi denganchmod +x
dan ketika mengikat ke pintasan keyboard Anda memberikan path lengkap ke file skrip sebagai perintah.Menggunakan indikator panel atas Unity untuk informasi.
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.sumber