जवाबों:
आपके अपने जवाब से, मुझे समझ में आया कि आप एक सुविधाजनक 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()
स्क्रिप्ट को xdotool स्थापित करने की आवश्यकता है:
sudo apt-get install xdotool
स्क्रिप्ट को एक खाली फ़ाइल में कॉपी करें, इसे इस रूप में सहेजें getwindowsize.py
कमांड द्वारा टर्मिनल विंडो से टेस्ट रन करें:
python3 /path/to/getwindowsize.py
स्क्रिप्ट उठाता ध्यान केंद्रित खिड़की गतिशील शुद्ध windowsize दिखाने के लिए (दोनों के उत्पादन में के रूप में wmctrl
और xdotool
) और वास्तविक विंडो आकार, सज्जाकार आदि सहित
यदि आप लक्षित विंडो बंद करते हैं, तो संकेतक एक संदेश दिखाता है:
यदि सभी ठीक काम करते हैं, तो इसे शॉर्टकट कुंजी में जोड़ें: चुनें: सिस्टम सेटिंग्स> "कीबोर्ड"> "शॉर्टकट"> "कस्टम शॉर्टकट"। "+" पर क्लिक करें और कमांड जोड़ें:
python3 /path/to/getwindowsize.py
... थोड़ा गलत है
आपने जिक्र किया:
आदर्श रूप से, यह उपकरण उबंटू के मेनू बार के आकार को घटा देगा
पूरी कहानी यह है कि दोनों wmctrl -lG
और xdotool getwindowgeometry
मेनू बार के बिना खिड़की के आकार को वापस करते हैं, या, जैसा कि इस उत्तर में बताया गया है :
क्या हो रहा है कि wmctrl सजावट के अंदर खिड़की की ज्यामिति को वापस कर रहा है (अर्थात शीर्षक बार और सीमाओं को शामिल नहीं करता है)
जानकारी को सही ढंग से प्राप्त करने के लिए, हम चला सकते हैं
xprop -id <window_id> | grep FRAME
यह आउटपुट की तरह होगा:
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0
यहाँ हम मूल्यों हम से आउटपुट के रूप में खिड़की के आकार को जोड़ने के लिए, की जरूरत है पाने के wmctrl
और xdotool
, बाईं ओर, दाएँ और खिड़की के नीचे।
दूसरे शब्दों में, इस मामले में, यदि wmctrl
200x100 का आकार दिखाता है, तो वास्तविक आकार 200x128 है।
जैसा कि ओपी ने सुझाव दिया है, उपयोगकर्ता संकेतक शुरू करने के बाद एक विंडो चुन सकता है , प्रतिस्थापित करके:
window = get(["xdotool", "getactivewindow"])
द्वारा:
window = get(["xdotool", "selectwindow"])
स्क्रिप्ट में, इन पंक्तियों में से किसी एक को अनइंस्टॉल किया जा सकता है।
आप 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
मैंने /unix/14159/how-do-i-find-the-window-dimensions-and-position-accurately-including-decorationxwininfo -all
से पाया ।
यह काम करता है लेकिन मैं अभी भी अधिक सुविधाजनक समाधानों के लिए खुला हूं => एक वास्तविक समय जीयूआई उपकरण।
xwininfo
पहले ही पाया है । शायद आपको मेरे द्वारा लिखी गई स्क्रिप्ट में दिलचस्पी होगी - यह उपयोग करता है xwininfo
लेकिन जीयूआई पॉपअप के साथ, कृपया इसे नीचे देखें।
एक कोशिश कर सकता है:
xdotool search --name gnome-panel getwindowgeometry
गनोम-पैनल मान लेना ubuntu के टूलबार की प्रक्रिया का नाम है, लेकिन कौन जानता है।
(की आवश्यकता हो सकती है sudo apt-get install xdotool
)
GUI की एक कामचलाऊ चीज़ के लिए जिसे कोई और सुधारना चाहता है, बस नंगे अनिवार्य को प्रदर्शित करने के लिए:
zenity --text-info --filename=<(xprop)
यह पॉइंटर को xprop के क्रॉस में बदल देगा, फिर आप विंडो पर क्लिक करते हैं, और यह जीटीपी डायलॉग में xprop की जानकारी प्रिंट करेगा।
साथ बड़ी समस्या wmctrl
और xdotool
- कि उन उपकरणों को स्थापित करने की जरूरत है वे डिफ़ॉल्ट रूप से Ubuntu पर नहीं कर रहे हैं । हालांकि, उबंटू के साथ जहाज xwininfo
। यह एक सरल उपकरण है जो उपयोगकर्ता द्वारा चयनित विंडो के बारे में जानकारी प्रदान करता है।
टर्मिनल में सरल उपयोग टाइप करना होगा xwininfo | awk '/Width/||/Height/'
(नोटिस जो awk
आउटपुट को फ़िल्टर करने के लिए उपयोग किया जाता है), और जब आपका कर्सर आपके द्वारा पसंद किए गए x
किसी भी GUI विंडो को चुनने के लिए बदलता है और यह इसकी जानकारी प्रदर्शित करेगा। उदाहरण के लिए:
$ xwininfo | awk '/Width/||/Height/'
Width: 602
Height: 398
तो फायदे हैं:
बेशक अगर आपके पास टर्मिनल खुला है जैसे कि मैं 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
थोड़ा अलग तरीके से उपयोग करता है।
getactivewindow
हैselectwindow
, इसलिए जब स्क्रिप्ट लॉन्च की जाती है , तो आप आयामों को प्राप्त करने के लिए कर्सर को खिड़की के साथ चुनते हैं। मुझे यह व्यवहार अधिक सुविधाजनक लगता है। 2) मैंने ubuntu पेस्ट करने के लिए कोड अपलोड किया है , इसलिए इसे सेट करना आसान है: बस डाउनलोड करें और getwindowsize.py