मैं सजावट सहित खिड़की के आयाम और स्थिति को सही तरीके से कैसे पता करूं?


37

मैं एक छोटी स्क्रिप्ट में उपयोग के लिए एक खिड़की के आकार का पता लगाने की कोशिश कर रहा हूं। मेरी वर्तमान तकनीक wmctrl -lGआयामों का पता लगाने के लिए उपयोग कर रही है। हालाँकि, समस्या यह है:

यह जो x और y आंकड़े देता है, वे विंडो सजावट के शीर्ष बाईं ओर होते हैं, जबकि ऊँचाई और चौड़ाई केवल सामग्री क्षेत्र के लिए होती है। इसका मतलब यह है कि अगर खिड़की की सजावट 20px ऊंचाई और 2px चौड़ाई जोड़ती है, तो wmctrl एक खिड़की को 640x480 होने की सूचना देगा, भले ही यह स्क्रीन पर 660x482 हो। यह एक समस्या है क्योंकि मेरी स्क्रिप्ट का अगला चरण स्क्रीन को रिकॉर्ड करने के लिए ffmpeg को बताने के लिए उस क्षेत्र का उपयोग करना होगा। मैं अपने वर्तमान सेटअप से विंडो सजावट के आकार में हार्डकोडिंग से बचना चाहूंगा।

सूट क्या है या तो खिड़की की सजावट के आकार को प्राप्त करने के लिए एक विधि है, इसलिए मैं उन्हें 640x480 सामग्री क्षेत्र की स्थिति का पता लगाने के लिए उपयोग कर सकता हूं, या सीधे सामग्री क्षेत्र की स्थिति प्राप्त करने का एक तरीका है, न कि खिड़की सजावट का। ।


1
मैंने आरेख के लिए आंकड़े में ऊंचाई और चौड़ाई को मिलाया।
माचा


करीबी सवाल लेकिन अन्य बातें भी पूछते हैं: superuser.com/questions/164047/…
Ciro Santilli 中心 other other other 六四

जवाबों:


36

निम्न स्क्रिप्ट आपको विंडो के ऊपरी-बाएँ स्क्रीन सह-ऑर्ड और आकार (बिना किसी सजावट के) देगी। । । । xwininfo -id $(xdotool getactivewindow)आपके लिए पर्याप्त जानकारी है।


#!/bin/bash
# Get the coordinates of the active window's
#    top-left corner, and the window's size.
#    This excludes the window decoration.
  unset x y w h
  eval $(xwininfo -id $(xdotool getactivewindow) |
    sed -n -e "s/^ \+Absolute upper-left X: \+\([0-9]\+\).*/x=\1/p" \
           -e "s/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=\1/p" \
           -e "s/^ \+Width: \+\([0-9]\+\).*/w=\1/p" \
           -e "s/^ \+Height: \+\([0-9]\+\).*/h=\1/p" )
  echo -n "$x $y $w $h"
#

यह काम करने के लिए प्रकट होता है क्योंकि xdotool getactivewindowखिड़की प्रबंधक फ्रेम (जिसमें सजावट भी शामिल है) की विंडो आईडी को उसके अंदर निहित क्लाइंट विंडो के बजाय वापस लौटा देता है।
एडम स्पियर्स

2
नहीं, यह सजावट के बिना ज्यामिति लौटाता है , जो स्पष्ट रूप से वह नहीं है जो सवाल पूछा गया था। यदि आप सजावट को शामिल नहीं करना चाहते हैं, तो इसके लिए आसान तरीके हैं, उदाहरण के लिएxdotool getactivewindow getwindowgeometry
slinkp

1
यह मेरे लिए अच्छी तरह से काम नहीं करता है (यानी सजावट शामिल नहीं है)। यह उत्तर बेहतर है।
जन वारचोल

7

स्वीकृत उत्तर को पूरी विंडो प्राप्त करने के लिए बढ़ाया जा सकता है:

entire=false
x=0
y=0
w=0
h=0
b=0  # b for border
t=0  # t for title (or top)

# ... find out what user wants then 

eval $(xwininfo -id $(xdotool getactivewindow) |
  sed -n -e "s/^ \+Absolute upper-left X: \+\([0-9]\+\).*/x=\1/p" \
         -e "s/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=\1/p" \
         -e "s/^ \+Width: \+\([0-9]\+\).*/w=\1/p" \
         -e "s/^ \+Height: \+\([0-9]\+\).*/h=\1/p" \
         -e "s/^ \+Relative upper-left X: \+\([0-9]\+\).*/b=\1/p" \
         -e "s/^ \+Relative upper-left Y: \+\([0-9]\+\).*/t=\1/p" )
if [ "$entire" = true ]
then                     # if user wanted entire window, adjust x,y,w and h
    let x=$x-$b
    let y=$y-$t
    let w=$w+2*$b
    let h=$h+$t+$b
fi
echo "$w"x"$h" $x,$y

हालांकि यह आसान है, यह Ubuntu 14.04 में एकता पर काम नहीं करता है क्योंकि सापेक्ष जानकारी सभी 0. है। मैंने पूछा कि एकता में पूर्ण विंडो आयाम (सजावट सहित) प्राप्त करें और एक अच्छा जवाब मिला। इस प्रकार मैंने उस उत्तर का उपयोग किया है:

aw=$(xdotool getactivewindow)
eval $(xwininfo -id "$aw" |
      sed -n -e "s/^ \+Absolute upper-left X: \+\([0-9]\+\).*/x=\1/p" \
             -e "s/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=\1/p" \
             -e "s/^ \+Width: \+\([0-9]\+\).*/w=\1/p" \
             -e "s/^ \+Height: \+\([0-9]\+\).*/h=\1/p" )
if [ "$entire" = true ]
then
    extents=$(xprop _NET_FRAME_EXTENTS -id "$aw" | grep "NET_FRAME_EXTENTS" | cut -d '=' -f 2 | tr -d ' ')
    bl=$(echo $extents | cut -d ',' -f 1) # width of left border
    br=$(echo $extents | cut -d ',' -f 2) # width of right border
    t=$(echo $extents | cut -d ',' -f 3)  # height of title bar
    bb=$(echo $extents | cut -d ',' -f 4) # height of bottom border

    let x=$x-$bl
    let y=$y-$t
    let w=$w+$bl+$br
    let h=$h+$t+$bb
fi

यह दूसरी विधि यूनिटी और Xfce दोनों में काम करती है, और ग्नोम में भी काम करना चाहिए।


यूबीटी पर एकता के बाहर भी शीर्ष दृष्टिकोण गलत है क्योंकि यह बाएं, दाएं और नीचे की सीमाओं को मानता है, सभी एक ही चौड़ाई हैं, और इसकी कोई गारंटी नहीं है। दूसरा दृष्टिकोण बेहतर दिखता है।
एडम स्पियर्स

मैंने सिर्फ दूसरा तरीका चेक किया - यह केवल aw=`xdotool getactivewindow`xwininfo कॉल पर लटकने से बचने के लिए ऊपर जोड़ा गया। यह जानना बहुत अच्छा है क्योंकि मैं एकता पर स्विच करने पर विचार कर रहा हूं, जहां मैं सेगफॉल्टिंग के बिना चलने के लिए wmiface नहीं पा सकता हूं।
स्लैंकप

@slinkp, लापता awपरिभाषा को इंगित करने के लिए धन्यवाद । मैं उस पंक्ति को जोड़ने के लिए अब उत्तर को संपादित करूंगा।
कॉलिन कीनन

इस का दूसरा हिस्सा महान काम करता है! केवल मुझे Gnome 3 में जो बदलाव करना था, वह था टाइटलबार की ऊँचाई को न जोड़ना h। लगता है कि टाइटलबार पहले से ही ऊँचाई में शामिल है, जो वापस आता है xwininfo
जॉनी असमर

6

खिड़की का आकार और स्थिति प्राप्त करने का बहुत सरल तरीका:

xdotool getwindowfocus getwindowgeometry

3

स्पष्ट रूप से स्वीकृत उत्तर में खिड़की की सजावट शामिल नहीं है। उन लोगों के लिए अभी भी कैसे ज्यामिति पाने के लिए की तलाश में सहित , सभी सजावट इस सवाल के शीर्षक के अनुसार, आप उपयोग कर सकते हैं wmiface यह अन्य प्रश्न के अनुसार https://superuser.com/questions/164047/how-to-get-accurate-window -इनफॉर्मेशन-डायमेंशन-आदि-इन-लाइनक्स-एक्स । उदाहरण:

wmiface frameGeometry `wmiface activeWindow`

यह ज्यामिति और स्थिति की तुलना में शीर्ष बाएँ के सापेक्ष देता है:

650x437+0+1003

wmiface सभी linux distros के साथ नहीं आता है (मुझे मिंट या उबंटू पर इसे प्रदान करने वाला पैकेज नहीं मिला) लेकिन मैं इसे यहाँ के पैकेज से स्थापित करने में सक्षम था: http://kde-apps.org/content/show .php? सामग्री = 40,425

और यह न तो डॉक्स के साथ आता है और न ही --help, लेकिन README यहाँ है:

https://gitorious.org/wmiface/wmiface/source/ea941eeb2076124734f6a3d3079326c826b462d7:README


खेद है - मैं इस के लिए मेरे वोट दें अफसोस क्योंकि स्वीकार किए जाते हैं जवाब है उस पर मेरी टिप्पणी के अनुसार खिड़की सजावट शामिल हैं।
एडम स्पियर्स

काश कि यह सच होता, लेकिन दुर्भाग्य से वह टिप्पणी गलत है। वे सक्रिय विंडो आईडी के बारे में सहमत हैं: $ wmiface सक्रियWindow 6291772 $ xdotool getactivewindow 6291772 लेकिन वे ज्यामिति के बारे में सहमत नहीं हैं, और मैं उदाहरण के साथ पुष्टि कर सकता हूं। स्क्रीनरूलर कि wmiface में विंडो डेकोरेशन और xdotool शामिल नहीं है। इसे अपने लिए आजमाएं। $ Wmiface frameGeometry wmiface activeWindow570x434 + 870 + 31 $ xdotool getwindowgeometry xdotool getactivewindowविंडो 6,291,772 स्थिति: 878,77 (स्क्रीन: 0) ज्यामिति: 562x407
slinkp

क्षमा करें, आशा है कि आप समझ सकते हैं कि मेरा वहाँ क्या अर्थ था ... काश स्टैकओवरफ़्लो टिप्पणियों में ब्लॉक कोड नमूने की अनुमति देता।
३p:

3

Xdotool का उपयोग करना:

  • सबसे पहले आपको विंडो आईडी प्राप्त करने की आवश्यकता है:

sleep 3s && xdotool getactivewindow, आपकी खिड़की खोलने के लिए 3 सेकंड हैं

  • फिर आपको उपयोग करने की आवश्यकता है:
    1. उत्पादन में जानकारी प्राप्त करने के लिए इसका उपयोग करें: xdotool getwindowgeometry $WINDOW_ID
    2. या यदि आप शेल पैरामीटर का उपयोग करना चाहते हैं: xdotool getwindowgeometry -shell $WINDOW_ID

0

इस पृष्ठ पर उत्तरों का संयोजन मैंने इसका उपयोग किया:

$ sleep 3 && xdotool getwindowfocus getwindowgeometry

Window 88080400
  Position: 4565,2345 (screen: 0)
  Geometry: 1186x885

वन-लाइनर चलाएं और फिर 3 सेकंड के भीतर उस विंडो पर क्लिक करें जिसके लिए आप स्थिति और ज्यामिति चाहते हैं।

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