Câu trả lời:
Từ câu trả lời của riêng bạn, tôi hiểu rằng bạn đang tìm kiếm một công cụ GUI thuận tiện, vì vậy:
Như được giải thích thêm dưới đây trong "Giải thích", cả hai wmctrl
và xdotool
trả lại một cửa sổ hơi sai.
Kịch bản (chỉ báo) bên dưới sẽ hiển thị cả kích thước "thực" và kích thước thực của cửa sổ trong bảng điều khiển.
#!/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()
Tập lệnh cần xdotool để được cài đặt:
sudo apt-get install xdotool
Sao chép tập lệnh vào một tập tin trống, lưu nó dưới dạng getwindowsize.py
Kiểm tra- chạy tập lệnh từ cửa sổ đầu cuối bằng lệnh:
python3 /path/to/getwindowsize.py
Kịch bản chọn cửa sổ tập trung để tự động hiển thị kích thước cửa sổ ròng (như ở đầu ra của cả hai wmctrl
và xdotool
) và kích thước cửa sổ thực , bao gồm cả trang trí, v.v.
Nếu bạn đóng cửa sổ được nhắm mục tiêu, chỉ báo sẽ hiển thị một thông báo:
Nếu tất cả đều hoạt động tốt, hãy thêm nó vào một phím tắt: chọn: Cài đặt hệ thống> "Bàn phím"> "Phím tắt"> "Phím tắt tùy chỉnh". Nhấp vào "+" và thêm lệnh:
python3 /path/to/getwindowsize.py
... hơi sai
Bạn đề cập đến:
Lý tưởng nhất là công cụ đó sẽ khấu trừ kích thước của thanh menu của Ubuntu
Câu chuyện hoàn chỉnh là cả hai wmctrl -lG
và xdotool getwindowgeometry
trả về kích thước của cửa sổ mà không có thanh menu, hoặc, như được giải thích trong câu trả lời này :
Điều gì đang xảy ra là wmctrl đang trả về hình dạng của cửa sổ bên trong các trang trí (nghĩa là không bao gồm thanh tiêu đề và đường viền)
Để có được thông tin chính xác, chúng ta có thể chạy
xprop -id <window_id> | grep FRAME
Điều này sẽ xuất ra như:
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0
Ở đây chúng tôi nhận được các giá trị chúng tôi cần thêm vào kích thước của cửa sổ, như đầu ra từ wmctrl
và xdotool
, bên trái, bên phải, trên cùng và dưới cùng của cửa sổ.
Nói cách khác, trong trường hợp này, nếu a wmctrl
hiển thị kích thước 200x100, kích thước thực là 200x128.
Theo đề xuất của OP, người dùng cũng có thể chọn một cửa sổ sau khi chỉ báo được bắt đầu, bằng cách thay thế:
window = get(["xdotool", "getactivewindow"])
bởi:
window = get(["xdotool", "selectwindow"])
Trong kịch bản, một trong những dòng này có thể không bị thiếu.
Bạn có thể sử dụng wmctrl -lG
để lấy danh sách tất cả các cửa sổ đang mở, trong một bảng có định dạng:
<window ID> <desktop ID> <x-coordinate> <y-coordinate> <width> <height> <client machine> <window title>
Một ví dụ đầu ra có thể trông như thế này:
$ 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
Tôi tìm thấy xwininfo -all
từ /unix/14159/how-do-i-find-the-window-dimensions-and-poseition-accurantly-including-decor .
Nó hoạt động nhưng tôi vẫn mở cho các giải pháp thuận tiện hơn => một công cụ GUI thời gian thực.
xwininfo
. Có lẽ bạn sẽ quan tâm đến kịch bản tôi đã viết - nó sử dụng xwininfo
nhưng với cửa sổ bật lên GUI, vui lòng xem tập lệnh bên dưới.
Người ta có thể thử:
xdotool search --name gnome-panel getwindowgeometry
Giả sử bảng điều khiển gnome là tên quy trình của thanh công cụ của Ubuntu, nhưng ai biết được.
(có thể yêu cầu một sudo apt-get install xdotool
)
Đối với một GUI GUI ngẫu hứng mà người ta có thể muốn cải thiện hơn nữa để chỉ hiển thị các yếu tố cần thiết:
zenity --text-info --filename=<(xprop)
Nó sẽ thay đổi con trỏ thành chữ thập của xprop, sau đó bạn nhấp vào cửa sổ và nó sẽ in thông tin của xprop trong hộp thoại GTK.
Vấn đề lớn với wmctrl
và xdotool
đó là những công cụ đó cần được cài đặt - chúng không có trên Ubuntu theo mặc định . Tuy nhiên, Ubuntu vận chuyển với xwininfo
. Nó là một công cụ đơn giản cung cấp thông tin về cửa sổ do người dùng chọn.
Cách sử dụng đơn giản sẽ là nhập xwininfo | awk '/Width/||/Height/'
(thông báo awk
được sử dụng để lọc đầu ra) trong thiết bị đầu cuối và khi con trỏ của bạn thay đổi để x
chọn bất kỳ cửa sổ GUI nào bạn muốn và nó sẽ hiển thị thông tin của nó. Ví dụ:
$ xwininfo | awk '/Width/||/Height/'
Width: 602
Height: 398
Vì vậy, những lợi thế là:
Tất nhiên nếu bạn có thiết bị đầu cuối mở 24/7 như tôi, đó xwininfo
là tất cả những gì bạn cần. Một số người dùng có thể thích có một phím tắt. Kịch bản bên dưới (được dự định gắn với phím tắt) cho phép bạn hiển thị cửa sổ bật lên đồ họa với thông tin về cửa sổ hiện đang hoạt động của bạn. Như có thể thấy trong ảnh chụp màn hình, nó hiển thị thông tin cửa sổ, chiều rộng và chiều cao.
Dưới mui xe này không làm gì đặc biệt ngoạn mục. Nó sử dụng thông tin từ dbus
dịch vụ xwininfo
và đưa nó vào cửa sổ bật lên đơn giản. Mã nguồn dưới đây. Hãy nhớ rằng, các quy tắc kịch bản tiêu chuẩn được áp dụng: đảm bảo nó có quyền thực thi với chmod +x
và khi liên kết với phím tắt, bạn cung cấp đường dẫn đầy đủ đến tệp tập lệnh dưới dạng lệnh.
#!/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 $@
Khi viết câu trả lời của mình, tôi đã nhận ra rằng đây sẽ là một tính năng rất hữu ích để kết hợp vào một trong những dự án hiện có của tôi - Chỉ số Ayatana. Chỉ báo này cho phép hiển thị toàn bộ phạm vi thông tin về các cửa sổ GUI. Hiện tại vẫn đang được phát triển tích cực. Tính năng thông tin hình học đã được thêm vào kho github và đang trên đường vào PPA cá nhân của tôi . Và tất nhiên, nó sử dụng xwininfo
mặc dù theo cách hơi khác nhau.
getactivewindow
bằngselectwindow
, vì vậy khi tập lệnh được khởi chạy, bạn chọn bằng con trỏ cửa sổ để lấy kích thước. Tôi thấy hành vi này thuận tiện hơn nhiều. 2) Tôi đã tải lên mã để dán Ubuntu , vì vậy việc cài đặt dễ dàng hơn: Chỉ cần tải xuống và lưu dưới dạng getwindowsize.py