#!/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()
您可以使用
wmctrl -lG
以下格式在表格中获取所有打开的窗口的列表:示例输出可能如下所示:
我
xwininfo -all
从https://unix.stackexchange.com/questions/14159/how-do-i-find-the-window-dimensions-and-position-accurately-including-decoration找到。它确实有效,但我仍然愿意接受更方便的解决方案 => 一个实时 GUI 工具。
根据您自己的回答,我了解到您正在寻找一个方便的 GUI 工具,因此:
用于获取窗口的净大小和实际大小的小型 GUI 工具(动态更新)
正如下面“解释”中进一步解释的那样,两者都
wmctrl
返回xdotool
一个稍微不正确的窗口大小。下面的脚本(指标)将显示面板中窗口的“实际”大小和净大小。
剧本
如何使用
该脚本需要安装 xdotool:
将脚本复制到一个空文件中,另存为
getwindowsize.py
测试 - 通过以下命令从终端窗口运行脚本:
该脚本选择焦点窗口以动态显示净窗口大小(如 和 的输出)和
wmctrl
实际窗口大小,包括装饰器等。xdotool
如果您关闭目标窗口,指示器会显示一条消息:
如果一切正常,请将其添加到快捷键:选择:系统设置>“键盘”>“快捷方式”>“自定义快捷方式”。单击“+”并添加命令:
解释
窗口大小,由 wmctrl 和 xdotool 显示
...有点不正确
你提到:
理想情况下,该工具会减少 Ubuntu 菜单栏的大小
完整的故事是两者都
wmctrl -lG
返回xdotool getwindowgeometry
没有菜单栏的窗口大小,或者,正如在这个答案中所解释的那样:发生的事情是 wmctrl 正在返回装饰内窗口的几何形状(即不包括标题栏和边框)
如何获得正确的“真实”尺寸
为了正确获取信息,我们可以运行
这将输出如下:
在这里,我们得到我们需要添加到窗口大小的值,作为输出
wmctrl
和xdotool
,到窗口的左侧、右侧、顶部和底部。换句话说,在这种情况下,如果 a
wmctrl
显示大小为 200x100,则实际大小为 200x128。笔记
正如 OP 所建议的,用户还可以在指标启动后选择一个窗口,方法是替换:
经过:
在脚本中,这些行中的任何一行都可以取消注释。
可以尝试:
假设 gnome-panel 是 ubuntu 工具栏的进程名,但谁知道呢。
(可能需要一个
sudo apt-get install xdotool
)对于一个可能想要进一步改进的即兴 GUI 事物,以便仅显示基本要素:
它会将指针更改为 xprop 的十字,然后单击窗口,它将在 GTK 对话框中打印 xprop 的信息。
xwininfo及其优势
wmctrl
最大的问题xdotool
是需要安装这些工具 -默认情况下它们不在 Ubuntu 上。但是,Ubuntu 附带xwininfo
. 它是一个简单的工具,提供有关用户选择的窗口的信息。简单的用法是在终端中输入
xwininfo | awk '/Width/||/Height/'
(注意awk
用于过滤输出),当您的光标更改为x
选择您喜欢的任何 GUI 窗口时,它将显示其信息。例如:所以优点是:
让 xwininfo 更进一步——显示活动窗口的属性
当然,如果您像我一样拥有 24/7 全天候开放的终端,这
xwininfo
就是您所需要的。一些用户可能更喜欢使用键盘快捷键。下面的脚本(旨在绑定到键盘快捷键)允许您显示一个图形弹出窗口,其中包含有关当前活动窗口的信息。从截图中可以看出,它显示了窗口标题、宽度和高度信息。在引擎盖下,这并没有做任何特别壮观的事情。它使用来自
dbus
服务的信息xwininfo
并将其放入简单的弹出窗口中。源代码如下。请记住,标准脚本规则适用:确保它具有可执行权限,chmod +x
并且在绑定到键盘快捷键时,您将脚本文件的完整路径作为命令提供。使用 Unity 的顶部面板指示器获取信息。
在写我的答案时,我意识到这将是一个非常有用的功能,可以合并到我现有的项目之一 - Ayatana 指标中。该指示器允许显示有关 GUI 窗口的全部信息。目前仍在积极开发中。几何信息功能已添加到github 存储库中,并且正在进入我的个人 PPA中。当然,它的使用
xwininfo
方式虽然略有不同。