Một công cụ để có được kích thước cửa sổ


14

Tôi cần một công cụ để có được chiều rộng và chiều cao của một cửa sổ tùy ý.

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 trả lời:


6

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:

Công cụ GUI nhỏ để có được cả kích thước thực và kích thước thực của cửa sổ (được cập nhật động)

Như được giải thích thêm dưới đây trong "Giải thích", cả hai wmctrlxdotooltrả lại một cửa sổ hơi sai.

nhập mô tả hình ảnh ở đây

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.

Kịch bả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()

Cách sử dụng

  1. Tập lệnh cần xdotool để được cài đặt:

    sudo apt-get install xdotool
    
  2. 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

  3. 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
    
  4. 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 wmctrlxdotool) 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:

    nhập mô tả hình ảnh ở đây

  5. 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
    

Giải trình

Kích thước cửa sổ, vì nó được hiển thị bởi cả wmctrl và xdotool

... 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 -lGxdotool getwindowgeometrytrả 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)

Làm thế nào để có được kích thước chính xác, "thực"

Để 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ừ wmctrlxdotool, 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 wmctrlhiển thị kích thước 200x100, kích thước thực là 200x128.

Ghi chú

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.


Chúc mừng @ Jacob-vlijm, thật là một câu trả lời hay! Chỉ có hai điều: 1) Tôi đã thay thế getactivewindowbằng selectwindow, 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
Akronix

@Akronix Cảm ơn! Nghe có vẻ là một ý tưởng tuyệt vời, bạn có phiền nếu tôi chỉnh sửa nó thành câu trả lời không?
Jacob Vlijm

Chắc chắn @ jacob-vljim. Hãy thoải mái;)
Akronix

11

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

9

Tôi tìm thấy xwininfo -alltừ /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.


Tôi đã đăng một câu trả lời, nhưng không nhận thấy bạn đã tìm thấy xwininfo. Có lẽ bạn sẽ quan tâm đến kịch bản tôi đã viết - nó sử dụng xwininfonhưng với cửa sổ bật lên GUI, vui lòng xem tập lệnh bên dưới.
Sergiy Kolodyazhnyy

2

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.


2

xwininfo và những lợi thế của nó

Vấn đề lớn với wmctrlxdotoolđó 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 để xchọ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à:

  • nó đơn giản
  • nó được cài đặt theo mặc định
  • nó chỉ là văn bản - không có gì lạ mắt và bạn có thể lọc và tinh chỉnh nó khi cần thiết

Đưa xwininfo thêm một bước nữa - hiển thị các thuộc tính của một cửa sổ đang hoạt động

Tất nhiên nếu bạn có thiết bị đầu cuối mở 24/7 như tôi, đó xwininfolà 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.

nhập mô tả hình ảnh ở đây

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ừ dbusdịch vụ xwininfovà đư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 +xvà 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 $@

Sử dụng chỉ báo bảng trên cùng của Unity để biết thông tin.

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 xwininfomặc dù theo cách hơi khác nhau.

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.