เครื่องมือในการรับขนาดหน้าต่าง


14

ฉันต้องการเครื่องมือเพื่อรับความกว้างและความสูงของหน้าต่างโดยพลการ

เป็นการดีที่เครื่องมือนั้นจะลดขนาดของแถบเมนูของ Ubuntu

คำตอบ:


6

จากคำตอบของคุณเองฉันเข้าใจว่าคุณกำลังมองหาเครื่องมือ GUI ที่สะดวกดังนั้น:

เครื่องมือ GUI ขนาดเล็กเพื่อรับทั้งขนาดเน็ตและขนาดจริงของหน้าต่าง (อัพเดตแบบไดนามิก)

ตามที่อธิบายเพิ่มเติมด้านล่างใน "คำอธิบาย" ทั้งสองwmctrlและxdotoolส่งกลับ 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. สคริปต์จะเลือกหน้าต่างที่เพ่งความสนใจไปเพื่อแสดงหน้าต่างสุทธิแบบไดนามิก (เช่นในเอาต์พุตของทั้งสองwmctrlและxdotool) และขนาดหน้าต่างจริงรวมถึงการตกแต่ง ฯลฯ

    หากคุณปิดหน้าต่างเป้าหมายตัวบ่งชี้จะแสดงข้อความ:

    ป้อนคำอธิบายรูปภาพที่นี่

  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ไปทางซ้ายขวาด้านบนและด้านล่างของหน้าต่าง

กล่าวอีกนัยหนึ่งในกรณีนี้ถ้า a wmctrlแสดงขนาด 200x100 ของจริงขนาดคือ 200x128

บันทึก

ตามคำแนะนำของ OP ผู้ใช้ยังสามารถเลือกหน้าต่างหลังจากที่ตัวบ่งชี้เริ่มต้นโดยแทนที่:

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

โดย:

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

ในสคริปต์บรรทัดใดบรรทัดหนึ่งเหล่านี้สามารถไม่ใส่เครื่องหมายข้อคิดเห็น


Cheers @ Jacob-vlijm ช่างเป็นคำตอบที่ดีมาก! มีสองสิ่ง: 1) ฉันได้แทนที่getactivewindowด้วยselectwindowดังนั้นเมื่อสคริปต์ถูกเรียกใช้คุณเลือกด้วยเคอร์เซอร์หน้าต่างเพื่อรับส่วนข้อมูล ฉันพบว่าพฤติกรรมนี้สะดวกกว่ามาก 2) ฉันได้อัปโหลดรหัสเพื่อวางอูบุนตูดังนั้นการตั้งค่าง่ายกว่า: เพียงแค่ดาวน์โหลดและบันทึกเป็น getwindowsize.py
Akronix

@ Akronix ขอบคุณ! ดูเหมือนความคิดที่ดีคุณจะรังเกียจไหมถ้าฉันแก้ไขมันเป็นคำตอบ?
Jacob Vlijm

แน่นอน @ 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

ฉันพบxwininfo -allจาก/unix/14159/how-do-i-find-the-window-dimensions-and-position-accurately-including-decoration /unix/14159/how-do-i-find-the-window-dimensions-and-position-accurately-including-decoration

มันใช้งานได้ แต่ฉันยังคงเปิดรับโซลูชั่นที่สะดวกกว่า => เครื่องมือ GUI แบบเรียลไทม์


ฉันโพสต์คำตอบแล้ว แต่ไม่พบว่าคุณพบxwininfoแล้ว บางทีคุณอาจสนใจสคริปต์ที่ฉันเขียนxwininfoแต่ใช้กับป๊อปอัป GUI โปรดดูด้านล่าง
Sergiy Kolodyazhnyy

2

ลองได้:

xdotool search --name gnome-panel getwindowgeometry

สมมติว่า gnome-panel เป็นชื่อกระบวนการของแถบเครื่องมือของ Ubuntu แต่ใครจะรู้

(อาจต้องมีsudo apt-get install xdotool)

สำหรับสิ่ง GUI ที่ได้รับการปรับปรุงอย่างหนึ่งที่อาจต้องการปรับปรุงเพิ่มเติมเพื่อแสดงเพียงข้อมูลสำคัญที่ไม่จำเป็น:

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

มันจะเปลี่ยนตัวชี้เป็นกากบาท xprop จากนั้นคุณคลิกหน้าต่างและมันจะพิมพ์ข้อมูลของ xprop ในกล่องโต้ตอบ GTK


2

xwininfo และข้อดีของมัน

ปัญหาใหญ่ที่มีwmctrlและxdotoolเป็นที่เครื่องมือเหล่านั้นจะต้องมีการติดตั้ง - พวกเขาจะไม่ได้อยู่ในอูบุนตูโดยค่าเริ่มต้น 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 สำหรับข้อมูล

เมื่อเขียนคำตอบของฉันฉันรู้ว่านี่จะเป็นคุณสมบัติที่มีประโยชน์มากในการรวมเป็นหนึ่งในโครงการที่มีอยู่ของฉัน - ตัวบ่งชี้ Ayatana ตัวบ่งชี้นี้อนุญาตให้แสดงช่วงข้อมูลทั้งหมดเกี่ยวกับหน้าต่าง GUI ขณะนี้ยังอยู่ระหว่างการพัฒนา คุณลักษณะข้อมูลเรขาคณิตที่ได้รับการเพิ่มพื้นที่เก็บข้อมูล GitHubและอยู่ในทางเข้าPPA ส่วนตัวของฉัน และแน่นอนว่ามันใช้xwininfoในลักษณะที่แตกต่างกันเล็กน้อย

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.