Pencere boyutlarını almak için bir araç


14

Keyfi bir pencerenin genişliğini ve yüksekliğini almak için bir araca ihtiyacım var.

İdeal olarak, bu araç Ubuntu'nun menü çubuğunun boyutunu düşecektir.

Yanıtlar:


6

Kendi cevabınızdan, uygun bir GUI aracı aradığınızı anlıyorum, bu yüzden:

Bir pencerenin hem net boyutunu hem de gerçek boyutunu elde etmek için küçük GUI aracı (dinamik olarak güncellenir)

Aşağıda "Açıklama" bölümünde açıklandığı gibi, her ikisi de wmctrlve xdotoolbiraz yanlış bir pencere boyutu döndürür.

resim açıklamasını buraya girin

Aşağıdaki komut dosyası (gösterge) paneldeki bir pencerenin hem "gerçek" boyutunu hem de net boyutunu gösterecektir.

Senaryo

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

Nasıl kullanılır

  1. Betiğin yüklenmesi için xdotool gerekir:

    sudo apt-get install xdotool
    
  2. Komut dosyasını boş bir dosyaya kopyalayın, getwindowsize.py

  3. Komut dosyası ile komut dosyasını bir terminal penceresinden test edin:

    python3 /path/to/getwindowsize.py
    
  4. Komut alır odaklanmış pencere (her ikisi çıkışında olduğu gibi dinamik net windowsizeyi göstermek wmctrlve xdotool) ve gerçek dekoratör vb dahil pencere boyutu,

    Hedeflenen pencereyi kapatırsanız, gösterge bir mesaj gösterir:

    resim açıklamasını buraya girin

  5. Her şey yolunda giderse bir kısayol tuşuna ekleyin: şunu seçin: Sistem Ayarları> "Klavye"> "Kısayollar"> "Özel Kısayollar". "+" İşaretini tıklayın ve şu komutu ekleyin:

    python3 /path/to/getwindowsize.py
    

açıklama

Hem wmctrl hem de xdotool tarafından gösterildiği gibi pencere boyutu

... biraz yanlış

Demek istedin ki:

İdeal olarak, bu araç Ubuntu'nun menü çubuğunun boyutunu düşürebilir

Hikayenin tamamı, her ikisinin de wmctrl -lGve xdotool getwindowgeometrymenü çubuğu olmadan pencerenin boyutunu döndürmesi veya bu cevapta açıklandığı gibi :

Wmctrl pencerenin süslemelerin içindeki geometrisini geri döndürüyor (başlık çubuğu ve kenarlıklar dahil değil)

Doğru, "gerçek" boyut nasıl elde edilir

Bilgileri doğru bir şekilde almak için

xprop -id <window_id> | grep FRAME

Bu çıktı:

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

Burada biz den çıktı olarak, pencerenin büyüklüğüne eklemek gereken değerleri almak wmctrlve xdotoolpenceresinin sağ, üst ve alt, sol,.

Başka bir deyişle, bu durumda, a wmctrl200x100 boyutundaysa, gerçek boyut 200x128'dir.

Not

OP tarafından önerildiği gibi, kullanıcı gösterge başlatıldıktan sonra aşağıdakileri değiştirerek bir pencere seçebilir :

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

tarafından:

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

Komut dosyasında, bu satırlardan biri önerilmeyebilir.


Şerefe @ Jacob-vlijm, böyle güzel bir cevap! Sadece iki şey: Ben yerini ettik 1) getactivewindowtarafından selectwindow, bu nedenle komut başlatıldığında imleçle gelen boyutlarını almak için pencereyi seçin. Bu davranışı çok daha uygun buluyorum. 2) Ubuntu'yu yapıştırmak için kod yükledim , bu yüzden kurulumu daha kolay: Sadece indirin ve getwindowsize.py olarak kaydedin
Akronix

@Akronix Teşekkürler! kulağa harika bir fikir gibi geliyor, cevabı düzenleyebilsem sorun olur mu?
Jacob Vlijm

Elbette @ jacob-vljim. Çekinmeyin;)
Akronix

11

Şu wmctrl -lGformattaki bir tabloda tüm açık pencerelerin bir listesini almak için kullanabilirsiniz :

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

Örnek bir çıktı şöyle görünebilir:

$ 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

Biri deneyebilir:

xdotool search --name gnome-panel getwindowgeometry

GNOME panelinin ubuntu araç çubuğunun işlem adı olduğunu varsayar, ama kim bilir.

(a gerekebilir sudo apt-get install xdotool)

Kişinin daha da geliştirmek isteyebileceği doğaçlama bir GUI şey için, sadece çıplak temelleri görüntülemek için:

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

İşaretçiyi xprop çarpı olarak değiştirir, ardından pencereyi tıklarsınız ve xprop bilgilerini bir GTK iletişim kutusunda yazdırır.


2

xwininfo ve avantajları

En büyük sorun wmctrlve xdotoolbu araçların yüklenmesi gerekiyor - varsayılan olarak Ubuntu'da değiller . Ancak Ubuntu ile birlikte gelir xwininfo. Kullanıcı tarafından seçilen pencere hakkında bilgi sağlayan basit bir araçtır.

Basit kullanım terminalde yazmak (çıktıyı filtrelemek için kullanılan xwininfo | awk '/Width/||/Height/'uyarı awk) ve imleciniz xistediğiniz herhangi bir GUI penceresini seçmek için değiştiğinde ve bilgilerini görüntüleyecektir. Örneğin:

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

Yani avantajları:

  • basit
  • varsayılan olarak kurulur
  • sadece metin - hiçbir şey fantezi ve gerektiği gibi filtreleyebilir ve düzenleyebilirsiniz

Xwininfo'yu bir adım daha ileri götürmek - etkin pencerenin özelliklerini görüntülemek

Tabii ki benim gibi 7/24 açık terminaliniz varsa, xwininfoihtiyacınız olan tek şey budur. Bazı kullanıcılar klavye kısayoluna sahip olmayı tercih edebilir. Aşağıdaki komut dosyası (klavye kısayoluna bağlı olması amaçlanmıştır), o anda etkin pencereniz hakkında bilgi içeren grafiksel bir açılır pencere görüntülemenize olanak tanır. Ekran görüntüsünde görülebileceği gibi, pencere başlığı, genişlik ve yükseklik bilgilerini görüntüler.

resim açıklamasını buraya girin

Kaputun altında bu özellikle muhteşem bir şey yapmaz. dbusHizmetten gelen bilgileri kullanır xwininfove basit açılır pencereye koyar. Kaynak kodu aşağıdadır. Unutmayın, standart komut dosyası yazma kuralları geçerlidir: chmod +xklavye kısayoluyla çalıştırılabilir izinlere sahip olduğundan emin olun ve komut dosyası dosyasına komut olarak tam yol verin.

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

Bilgi için Unity'nin üst panel göstergesini kullanma.

Cevabımı yazarken, bunun mevcut projelerimden biri olan Ayatana Göstergesi'ne dahil etmek için çok yararlı bir özellik olacağını fark ettim. Bu gösterge, GUI pencereleri hakkında tüm bilgilerin gösterilmesini sağlar. Halen aktif geliştirme aşamasındadır. Github deposuna geometri bilgisi özelliği eklendi ve kişisel PPA'ma geliyor . Ve elbette, xwininfobiraz farklı bir şekilde olsa da kullanır .

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.