ウィンドウの寸法を取得するツール


回答:


6

あなた自身の答えから、あなたが便利なGUIツールを探していることを理解しています。

ウィンドウのネットサイズと実際のサイズの両方を取得するための小さなGUIツール(動的に更新されます)

「説明」でさらに説明するように、両方ともわずかに誤ったウィンドウサイズwmctrlxdotool返します。

ここに画像の説明を入力してください

以下のスクリプト(インジケーター)は、パネルのウィンドウの「実際の」サイズとネットサイズの両方を表示します。

スクリプト

#!/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 -lGし、xdotool getwindowgeometryそれが中で説明されているように、メニューバーなしでウィンドウのサイズを返す、またはこの回答

何が起こっているのかは、wmctrlが装飾内のウィンドウのジオメトリを返していることです(つまり、タイトルバーと境界線は含まれていません)。

正しい「実際の」サイズを取得する方法

情報を正しく取得するために、次を実行できます

xprop -id <window_id> | grep FRAME

これは次のように出力されます:

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

ここで、wmctrlおよびからの出力として、ウィンドウのサイズに追加する必要がある値を、ウィンドウのxdotool左、右、上、および下に取得します。

つまり、この場合、wmctrlaが200x100のサイズを示す場合、実際のサイズは200x128です。

注意

OPで提案されているように、ユーザーはインジケータを開始したにウィンドウを選択することもできます。

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

沿って:

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

スクリプトでは、これらの行のいずれかをコメント解除できます。


@ Jacob-vlijm、ありがとうございます!ただ2つのこと:1)私はに置き換えましgetactivewindowselectwindow。そのため、スクリプトを起動するときに、カーソルを使用してディメンションを取得するウィンドウを選択します。この振る舞いのほうがずっと便利だと思います。2)私はUbuntuのを貼り付けコードをアップロードしたことがセットアップする方が簡単ですので、:ちょうどダウンロードを保存getwindowsize.pyなど
Akronix

@Akronixありがとう!素晴らしいアイデアのように聞こえますが、それを答えに編集してもいいですか?
ジェイコブVlijm 16

確かに@ jacob-vljim。お気軽に;)
Akronix

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

9

/unix/14159/how-do-i-find-the-window-dimensions-and-position-accurately-include-decorationxwininfo -allから見つけました。

それは動作しますが、私はまだより便利な解決策を開いています=>リアルタイムGUIツール。


私は答えを投稿しましたが、あなたがxwininfoすでに見つけたことに気づきませんでした。おそらく、あなたが書いたスクリプトに興味があるでしょう-それは使用しますxwininfoが、GUIポップアップで、以下をご覧ください。
セルギーKolodyazhnyy 16

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とその利点

大きな問題wmctrlxdotoolこれらのツールをインストールする必要があるということである- 彼らは、デフォルトではUbuntuではありません。ただし、Ubuntuにはが付属していxwininfoます。これは、ユーザーが選択したウィンドウに関する情報を提供するシンプルなツールです。

簡単な使用法は、ターミナルに入力(出力のフィルタリングに使用されるxwininfo | awk '/Width/||/Height/'ことに注意awk)し、カーソルを変更しxて好きなGUIウィンドウを選択すると、その情報が表示されることです。例えば:

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

利点は次のとおりです。

  • それは単純だ
  • デフォルトでインストールされます
  • それは単なるテキストです-派手なものはなく、必要に応じてフィルタリングして調整できます

xwininfoをさらに一歩進める-アクティブウィンドウのプロパティを表示する

もちろん、私のように24時間年中無休でターミナルを開いている場合は、 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のトップパネルインジケーターを使用して情報を取得します。

私の答えを書くとき、これは私の既存のプロジェクトの1つであるAyatanaインディケーターに組み込むのに非常に便利な機能であることに気付きました。このインジケータにより、GUIウィンドウに関するすべての情報を表示できます。現在、まだ活発に開発中です。ジオメトリ情報機能がgithubリポジトリに追加されており、私の個人的なPPAの途中です。そしてもちろん、xwininfo少し異なる方法で使用します。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.