Alat untuk mendapatkan dimensi jendela

14

Saya membutuhkan alat untuk mendapatkan lebar dan tinggi jendela yang berubah-ubah.

Idealnya, alat itu akan mengurangi ukuran bilah menu Ubuntu.

Akronix
sumber

Jawaban:

6

Dari jawaban Anda sendiri, saya mengerti Anda sedang mencari alat GUI yang nyaman, jadi:

Alat GUI kecil untuk mendapatkan ukuran bersih dan ukuran sebenarnya dari sebuah jendela (diperbarui secara dinamis)

Seperti dijelaskan lebih lanjut di bawah dalam "Penjelasan", keduanya wmctrldan xdotoolmengembalikan ukuran jendela yang sedikit salah.

masukkan deskripsi gambar di sini

Skrip (indikator) di bawah ini akan menunjukkan ukuran "nyata" dan ukuran bersih sebuah jendela di panel.

Naskah

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

Cara Penggunaan

  1. Skrip membutuhkan xdotool untuk diinstal:

    sudo apt-get install xdotool
    
  2. Salin skrip ke file kosong, simpan sebagai getwindowsize.py

  3. Tes-jalankan skrip dari jendela terminal dengan perintah:

    python3 /path/to/getwindowsize.py
    
  4. Script mengambil jendela yang difokuskan untuk secara dinamis menunjukkan ukuran jendela net (seperti dalam output keduanya wmctrldan xdotool) dan ukuran jendela nyata , termasuk dekorator dll.

    Jika Anda menutup jendela yang ditargetkan, indikator menampilkan pesan:

    masukkan deskripsi gambar di sini

  5. Jika semua berfungsi dengan baik, tambahkan ke tombol pintasan: pilih: Pengaturan Sistem> "Keyboard"> "Pintasan"> "Pintasan Khusus". Klik "+" dan tambahkan perintah:

    python3 /path/to/getwindowsize.py
    

Penjelasan

Ukuran jendela, seperti yang ditampilkan oleh wmctrl dan xdotool

... sedikit salah

Anda menyebutkan:

Idealnya, alat itu akan mengurangi ukuran bilah menu Ubuntu

Kisah lengkapnya adalah keduanya wmctrl -lGdan xdotool getwindowgeometrymengembalikan ukuran jendela tanpa bilah menu, atau, seperti yang dijelaskan dalam jawaban ini :

Apa yang terjadi adalah wmctrl mengembalikan geometri jendela di dalam dekorasi (mis. Tidak termasuk bilah judul dan batas)

Cara mendapatkan ukuran "nyata" yang benar

Untuk mendapatkan informasi dengan benar, kita dapat menjalankan

xprop -id <window_id> | grep FRAME

Ini akan menampilkan seperti:

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

Di sini kita mendapatkan nilai-nilai yang perlu kita tambahkan ke ukuran jendela, sebagai keluaran dari wmctrldan xdotool, ke kiri, kanan, atas dan bawah jendela.

Dengan kata lain, dalam hal ini, jika a wmctrlmenunjukkan ukuran 200x100, ukuran sebenarnya adalah 200x128.

Catatan

Seperti yang disarankan oleh OP, pengguna juga dapat memilih jendela setelah indikator dimulai, dengan mengganti:

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

oleh:

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

Dalam skrip, salah satu dari baris ini dapat dihapus komentar.

Yakub Vlijm
sumber
Cheers @ Jacob-vlijm, jawaban yang bagus! Hanya dua hal: 1) Saya sudah diganti getactivewindowdengan selectwindow, jadi ketika skrip diluncurkan Anda memilih dengan kursor jendela untuk mendapatkan dimensi. Saya menemukan perilaku ini jauh lebih nyaman. 2) Saya telah mengunggah kode untuk menempelkan ubuntu , jadi lebih mudah untuk mengatur: Cukup unduh dan simpan sebagai getwindowsize.py
Akronix
@ Akronix Terima kasih! kedengarannya seperti ide yang bagus, apakah Anda keberatan jika saya mengeditnya menjadi jawaban?
Jacob Vlijm
Tentu @ jacob-vljim. Merasa bebas;)
Akronix
11

Anda dapat menggunakan wmctrl -lGuntuk mendapatkan daftar semua jendela yang terbuka, dalam tabel dengan format:

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

Contoh output dapat terlihat seperti ini:

$ 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
Komandan Byte
sumber
2

Seseorang dapat mencoba:

xdotool search --name gnome-panel getwindowgeometry

Dengan asumsi gnome-panel adalah nama proses dari toolbar ubuntu, tetapi siapa yang tahu.

(mungkin memerlukan a sudo apt-get install xdotool)

Untuk hal GUI improvisasi yang mungkin ingin lebih ditingkatkan sehingga hanya menampilkan hal-hal penting:

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

Ini akan mengubah pointer ke salib xprop, lalu Anda mengklik jendela, dan itu akan mencetak info xprop dalam dialog GTK.

El Guesto
sumber
2

xwininfo dan kelebihannya

Masalah besar dengan wmctrldan xdotooladalah bahwa alat-alat itu perlu diinstal - mereka tidak pada Ubuntu secara default . Namun, Ubuntu disertakan bersama xwininfo. Ini adalah alat sederhana yang menyediakan informasi tentang jendela yang dipilih pengguna.

Penggunaan sederhana akan mengetik xwininfo | awk '/Width/||/Height/'(pemberitahuan yang awkdigunakan untuk memfilter output) di terminal, dan ketika kursor Anda berubah untuk xmemilih jendela GUI yang Anda suka dan itu akan menampilkan info. Sebagai contoh:

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

Jadi kelebihannya adalah:

  • itu sederhana
  • itu diinstal secara default
  • itu hanya teks - tidak ada yang mewah dan Anda dapat menyaring dan mengubah sesuai kebutuhan

Mengambil xwininfo satu langkah lebih jauh - menampilkan properti dari jendela yang aktif

Tentu saja jika Anda memiliki terminal terbuka 24/7 seperti yang saya lakukan, xwininfoitulah yang Anda butuhkan. Beberapa pengguna mungkin lebih suka memiliki pintasan keyboard. Skrip di bawah ini (yang dimaksudkan untuk terikat pada pintasan keyboard) memungkinkan Anda untuk menampilkan sembulan grafis dengan informasi tentang jendela yang sedang aktif. Seperti yang dapat dilihat pada tangkapan layar, ini menampilkan judul jendela, informasi lebar dan tinggi.

masukkan deskripsi gambar di sini

Di bawah tenda ini tidak melakukan sesuatu yang spektakuler. Ini menggunakan informasi dari dbuslayanan dan xwininfodan membuatnya menjadi popup sederhana. Kode sumber di bawah ini. Ingat, aturan skrip standar berlaku: memastikan memiliki izin yang dapat dieksekusi dengan chmod +xdan ketika mengikat ke pintasan keyboard Anda memberikan path lengkap ke file skrip sebagai perintah.

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

Menggunakan indikator panel atas Unity untuk informasi.

Ketika menulis jawaban saya, saya menyadari bahwa ini akan menjadi fitur yang sangat berguna untuk dimasukkan ke dalam salah satu proyek saya yang ada - Indikator Ayatana. Indikator ini memungkinkan menampilkan seluruh jajaran informasi tentang jendela GUI. Saat ini masih dalam pengembangan aktif. Fitur info geometri telah ditambahkan ke repositori github dan sedang dalam perjalanan ke PPA pribadi saya . Dan tentu saja, ia menggunakan xwininfomeskipun dengan cara yang sedikit berbeda.

masukkan deskripsi gambar di sini

Sergiy Kolodyazhnyy
sumber