खिड़की के आयाम प्राप्त करने का एक उपकरण


14

मुझे एक मनमानी खिड़की की चौड़ाई और ऊंचाई प्राप्त करने के लिए एक उपकरण की आवश्यकता है।

आदर्श रूप से, यह उपकरण उबंटू के मेनू बार के आकार को घटा देगा।

जवाबों:


6

आपके अपने जवाब से, मुझे समझ में आया कि आप एक सुविधाजनक GUI टूल की तलाश कर रहे हैं, इसलिए:

शुद्ध GUI उपकरण दोनों शुद्ध आकार और एक खिड़की के वास्तविक आकार (गतिशील रूप से अद्यतन) प्राप्त करने के लिए

जैसा कि नीचे "स्पष्टीकरण" में आगे बताया गया है, दोनों wmctrlऔर xdotoolथोड़ी सी गलत विंडो वापस करते हैं।

यहां छवि विवरण दर्ज करें

नीचे दी गई स्क्रिप्ट (संकेतक) पैनल में "वास्तविक" आकार और एक खिड़की के शुद्ध आकार दोनों को दिखाएगी।

लिपी

#!/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 दिखाने के लिए (दोनों के उत्पादन में के रूप में wmctrlऔर xdotool) और वास्तविक विंडो आकार, सज्जाकार आदि सहित

    यदि आप लक्षित विंडो बंद करते हैं, तो संकेतक एक संदेश दिखाता है:

    यहां छवि विवरण दर्ज करें

  5. यदि सभी ठीक काम करते हैं, तो इसे शॉर्टकट कुंजी में जोड़ें: चुनें: सिस्टम सेटिंग्स> "कीबोर्ड"> "शॉर्टकट"> "कस्टम शॉर्टकट"। "+" पर क्लिक करें और कमांड जोड़ें:

    python3 /path/to/getwindowsize.py
    

व्याख्या

खिड़की का आकार, जैसा कि यह wmctrl और xdotool दोनों द्वारा प्रदर्शित किया गया है

... थोड़ा गलत है

आपने जिक्र किया:

आदर्श रूप से, यह उपकरण उबंटू के मेनू बार के आकार को घटा देगा

पूरी कहानी यह है कि दोनों wmctrl -lGऔर xdotool getwindowgeometryमेनू बार के बिना खिड़की के आकार को वापस करते हैं, या, जैसा कि इस उत्तर में बताया गया है :

क्या हो रहा है कि wmctrl सजावट के अंदर खिड़की की ज्यामिति को वापस कर रहा है (अर्थात शीर्षक बार और सीमाओं को शामिल नहीं करता है)

सही, "वास्तविक" आकार कैसे प्राप्त करें

जानकारी को सही ढंग से प्राप्त करने के लिए, हम चला सकते हैं

xprop -id <window_id> | grep FRAME

यह आउटपुट की तरह होगा:

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

यहाँ हम मूल्यों हम से आउटपुट के रूप में खिड़की के आकार को जोड़ने के लिए, की जरूरत है पाने के wmctrlऔर xdotool, बाईं ओर, दाएँ और खिड़की के नीचे।

दूसरे शब्दों में, इस मामले में, यदि wmctrl200x100 का आकार दिखाता है, तो वास्तविक आकार 200x128 है।

ध्यान दें

जैसा कि ओपी ने सुझाव दिया है, उपयोगकर्ता संकेतक शुरू करने के बाद एक विंडो चुन सकता है , प्रतिस्थापित करके:

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

द्वारा:

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

स्क्रिप्ट में, इन पंक्तियों में से किसी एक को अनइंस्टॉल किया जा सकता है।


चीयर्स @ याकूब- vlijm, इतना अच्छा जवाब! बस दो चीजें: 1) मैंने बदल दिया getactivewindowहै selectwindow, इसलिए जब स्क्रिप्ट लॉन्च की जाती है , तो आप आयामों को प्राप्त करने के लिए कर्सर को खिड़की के साथ चुनते हैं। मुझे यह व्यवहार अधिक सुविधाजनक लगता है। 2) मैंने ubuntu पेस्ट करने के लिए कोड अपलोड किया है , इसलिए इसे सेट करना आसान है: बस डाउनलोड करें और getwindowsize.py
Akronix

@Akronix धन्यवाद! यदि आप इसे उत्तर में संपादित करते हैं, तो एक महान विचार की तरह लगता है?
जैकब व्लिजम

ज़रूर @ जकोब- vljim बेझिझक;)
अक्रोनिक्स

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-including-decorationxwininfo -all से पाया ।

यह काम करता है लेकिन मैं अभी भी अधिक सुविधाजनक समाधानों के लिए खुला हूं => एक वास्तविक समय जीयूआई उपकरण।


मैंने एक उत्तर पोस्ट किया है, लेकिन ध्यान नहीं दिया है कि आपने xwininfoपहले ही पाया है । शायद आपको मेरे द्वारा लिखी गई स्क्रिप्ट में दिलचस्पी होगी - यह उपयोग करता है xwininfoलेकिन जीयूआई पॉपअप के साथ, कृपया इसे नीचे देखें।
सर्गी कोलोडियाज़नी 12

2

एक कोशिश कर सकता है:

xdotool search --name gnome-panel getwindowgeometry

गनोम-पैनल मान लेना ubuntu के टूलबार की प्रक्रिया का नाम है, लेकिन कौन जानता है।

(की आवश्यकता हो सकती है sudo apt-get install xdotool)

GUI की एक कामचलाऊ चीज़ के लिए जिसे कोई और सुधारना चाहता है, बस नंगे अनिवार्य को प्रदर्शित करने के लिए:

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

यह पॉइंटर को xprop के क्रॉस में बदल देगा, फिर आप विंडो पर क्लिक करते हैं, और यह जीटीपी डायलॉग में xprop की जानकारी प्रिंट करेगा।


2

xwininfo और इसके फायदे

साथ बड़ी समस्या wmctrlऔर xdotool- कि उन उपकरणों को स्थापित करने की जरूरत है वे डिफ़ॉल्ट रूप से Ubuntu पर नहीं कर रहे हैं । हालांकि, उबंटू के साथ जहाज xwininfo। यह एक सरल उपकरण है जो उपयोगकर्ता द्वारा चयनित विंडो के बारे में जानकारी प्रदान करता है।

टर्मिनल में सरल उपयोग टाइप करना होगा xwininfo | awk '/Width/||/Height/'(नोटिस जो awkआउटपुट को फ़िल्टर करने के लिए उपयोग किया जाता है), और जब आपका कर्सर आपके द्वारा पसंद किए गए xकिसी भी GUI विंडो को चुनने के लिए बदलता है और यह इसकी जानकारी प्रदर्शित करेगा। उदाहरण के लिए:

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

तो फायदे हैं:

  • यह आसान है
  • यह डिफ़ॉल्ट रूप से स्थापित है
  • यह सिर्फ पाठ है - कुछ भी फैंसी नहीं है और आप इसे आवश्यकतानुसार फ़िल्टर और ट्विक कर सकते हैं

Xwininfo को एक कदम आगे ले जाना - एक सक्रिय विंडो के गुणों को प्रदर्शित करना

बेशक अगर आपके पास टर्मिनल खुला है जैसे कि मैं 24/7 करता हूं, तो 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 $@

जानकारी के लिए एकता के शीर्ष पैनल संकेतक का उपयोग करना।

अपना उत्तर लिखते समय, मैंने महसूस किया है कि यह मेरी मौजूदा परियोजनाओं में से एक - आयतन संकेतक में शामिल करने के लिए एक बहुत ही उपयोगी सुविधा होगी। यह संकेतक GUI विंडो के बारे में पूरी जानकारी दिखाने की अनुमति देता है। वर्तमान में अभी भी सक्रिय विकास के अधीन है। ज्योमेट्री रिपॉजिटरी में जियोमेट्री इंफो फीचर को जोड़ा गया है और यह मेरे व्यक्तिगत पीपीए में है । और हां, यह xwininfoथोड़ा अलग तरीके से उपयोग करता है।

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.