获取窗口尺寸的工具


Answers:


6

根据您自己的回答,我了解您正在寻找一种便捷的GUI工具,因此:

小型GUI工具,可同时获取窗口的净大小和实际大小(动态更新)

正如在“说明”下面进一步说明,无论是wmctrlxdotool返回一个稍微不正确windowsize。

在此处输入图片说明

下面的脚本(指示器)将在面板中显示窗口的“实际”大小和净大小。

剧本

#!/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()

如何使用

  1. 该脚本需要安装xdotool:

    sudo apt-get install xdotool
    
  2. 将脚本复制到一个空文件中,另存为 getwindowsize.py

  3. 通过以下命令从终端窗口中测试脚本:

    python3 /path/to/getwindowsize.py
    
  4. 脚本采聚焦窗口动态地显示净windowsize(如在两者的输出wmctrlxdotool)与实际的窗口大小,包括装饰等

    如果关闭目标窗口,指示器将显示一条消息:

    在此处输入图片说明

  5. 如果一切正常,请将其添加到快捷键:选择:“系统设置”>“键盘”>“快捷方式”>“自定义快捷方式”。单击“ +”并添加命令:

    python3 /path/to/getwindowsize.py
    

说明

由wmctrl和xdotool显示的窗口大小

...有点不正确

您提到:

理想情况下,该工具可以减少Ubuntu菜单栏的大小

完整的故事是,无论wmctrl -lGxdotool getwindowgeometry返回窗口的大小没有菜单栏,或者,因为它是在解释这个答案

发生的情况是wmctrl返回装饰内的窗口的几何形状(即不包括标题栏和边框)

如何获得正确的“真实”尺寸

为了正确获取信息,我们可以运行

xprop -id <window_id> | grep FRAME

输出结果如下:

_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0

在这里,我们获得了需要添加到窗口大小的值,作为从wmctrlxdotool到窗口左,右,顶部和底部的输出。

换句话说,在这种情况下,如果a wmctrl显示的尺寸为200x100 ,则实际尺寸为200x128。

注意

作为由OP建议的,用户还可以选择一个窗口之后的指示符开始,通过替换:

window = get(["xdotool", "getactivewindow"])

通过:

window = get(["xdotool", "selectwindow"])

在脚本中,这些行之一都可以取消注释。


干杯@ Jacob-vlijm,这么好的答案!仅有两件事:1)我已替换getactivewindowselectwindow,因此启动脚本时,您可以使用光标选择要获取尺寸的窗口。我发现此行为更加方便。2)我已经上传了粘贴ubuntu的代码,因此设置起来更容易:只需下载并另存为getwindowsize.py
Akronix

@Akronix谢谢!听起来是个好主意,如果我将它编辑成答案,您介意吗?
雅各布·弗利姆

当然@ jacob-vljim 随意;)
Akronix '16

11

您可以使用wmctrl -lG以下格式获取所有打开的窗口的列表:

<window ID> <desktop ID> <x-coordinate> <y-coordinate> <width> <height> <client machine> <window title>

输出示例如下所示:

$ 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


2

一个可以尝试:

xdotool search --name gnome-panel getwindowgeometry

假设gnome-panel是ubuntu工具栏的进程名称,但谁知道呢。

(可能需要sudo apt-get install xdotool

对于一个临时的GUI,可能需要进一步改进,以便仅显示基本要点:

zenity --text-info --filename=<(xprop)

它将更改指向xprop十字的指针,然后单击窗口,它将在GTK对话框中打印xprop的信息。


2

xwininfo及其优势

与大的问题wmctrl,并xdotool为这些工具需要安装的- 他们不是在Ubuntu默认。但是,Ubuntu附带xwininfo。这是一个简单的工具,可提供有关用户选择的窗口的信息。

简单的用法是在终端中键入xwininfo | awk '/Width/||/Height/'awk用于过滤输出的通知),当光标更改为x选择所需的任何GUI窗口时,它将显示其信息。例如:

$ xwininfo | awk '/Width/||/Height/'                
  Width: 602
  Height: 398

因此,优点是:

  • 很简单
  • 它是默认安装的
  • 这只是文字-没什么花哨的,您可以根据需要进行过滤和调整

使xwininfo更进一步-显示活动窗口的属性

当然,如果您像我一样拥有24/7的开放终端,这 xwininfo就是您所需要的。一些用户可能更喜欢使用键盘快捷键。下面的脚本(旨在与键盘快捷键绑定)使您可以显示图形弹出窗口,其中包含有关当前活动窗口的信息。从屏幕截图中可以看到,它显示了窗口标题,宽度和高度信息。

在此处输入图片说明

在引擎盖下,这并没有做任何特别壮观的事情。它使用来自dbus服务的信息xwininfo,并将其放入简单的弹出窗口。源代码如下。请记住,标准的脚本规则适用:确保它具有的可执行权限,chmod +x并且在绑定至键盘快捷键时,您可以作为命令提供脚本文件的完整路径。

#!/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 $@

使用Unity的顶部面板指示器获取信息。

在写我的答案时,我已经意识到,将其整合到我现有的项目之一-Ayatana指标中将是非常有用的功能。该指示器允许显示有关GUI窗口的全部信息。目前仍在积极发展中。几何信息功能已添加到github存储库中,并且正在进入我的个人PPA。当然,xwininfo虽然使用方式略有不同,但使用方式不同。

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.