Wmctrl विंडो मूव कमांड में विचलन का क्या कारण है


13

Wmctrl के बारे में

के साथ wmctrl(डिफ़ॉल्ट रूप से स्थापित नहीं), हम विंडोज़ पर जानकारी प्राप्त कर सकते हैं, उनकी आईडी, उनकी ज्यामिति, वे जिस पीआईडी ​​से संबंधित हैं आदि। हम कई कमांड के साथ विंडोज़ को स्थानांतरित या आकार भी दे सकते हैं । हालाँकि, कुछ मामलों में, इसका व्यवहार तर्कसंगत नहीं है। मेरा सवाल खिड़कियों को हिलाने से है wmctrl:

सूचना हासिल करना

जब मैं कमांड चलाता हूं:

wmctrl -lG

मुझे नीचे दिए गए चित्र में विंडो के बारे में (एओ) निम्नलिखित जानकारी मिलती है:

0x04200085  0 746  443  468  205  jacob-System-Product-Name Niet-opgeslagen document 1 - gedit

कॉलम 3-5 में, ज्यामिति की जानकारी हमें x / y निर्देशांक और चौड़ाई / ऊंचाई बताती है।

खिड़की को हिलाना / बदलना

जब मैं इन निर्देशांक को एक विंडो wmctrlको स्थानांतरित / आकार देने के लिए कमांड में रखता हूं , तो इसे कुछ भी नहीं करना चाहिए, क्योंकि निर्देशांक अपरिवर्तित हैं:

wmctrl -ir 0x04200085 -e 0,746,443,468,205

विचलन

हालाँकि, नीचे दी गई तस्वीरें विंडो को नीचे की ओर ले जाती हैं (28px सटीक होना)। मैंने इसका कारण यह माना कि कार्य क्षेत्र (स्क्रीन माइनस पैनल ऊंचाई) के साथ गणना की गई wmctrl विंडो चाल कमान है , जबकि कमांड की गणना कुल स्क्रीन आकार के साथ की जाती है । फिर भी 4px अभी भी अस्पष्टीकृत है (पैनल 24px उच्च है)।wmctrl -lG

हालाँकि विचलन को लिपियों में बहुत अच्छी तरह से मुआवजा दिया जा सकता है, यह तथ्य कि मुझे समझ में नहीं आता कि कारण संतोषजनक नहीं है, इसलिए सवाल यह है:

वास्तव में इस विचलन का कारण क्या है?


खिड़की के आउटपुट में सटीक निर्देशांक के साथ एक खिड़की को हिलाना wmctrl -lGनहीं चाहिए, लेकिन यह होता है

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

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


मेरा "फजी" समाधान वर्तमान निर्देशांक को बचाने के लिए था, उन निर्देशांक में जाने के लिए, नए निर्देशांक प्राप्त करने के लिए, मतभेदों को प्राप्त करने के लिए सहेजे गए निर्देशांक को घटाएं। फिर अंतर को मूल निर्देशांक पर लागू करें और समायोजित निर्देशांक में स्थानांतरित करें। यह जितना लगता है उससे कहीं ज्यादा आसान है।
विनयुनुच्स

जवाबों:


18

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

(कुछ कमांड आउटपुट लाइनों को हटाया गया: xdotoolस्थापित नहीं किया जा सकता है)

$ wmctrl -lG
0x04000040  0 702  23   900  950  KMatrix dave@KMatrix: test – Konsole

$ xdotool getwindowgeometry 0x04000040
Window 67108928
  Position: 702,23 (screen: 0)
  Geometry: 900x950

अगली कमांड ब्याज की खिड़की के लिए संकेत देती है और मूल विंडो लौटाती है जिसमें सभी सजावट शामिल हैं और उपयोग में विंडो थीम के आधार पर भिन्न होती है।

$ xdotool selectwindow
25166060

$ xdotool getwindowgeometry 0x18000ec
Window 25166060
  Position: 700,0 (screen: 0)
  Geometry: 904x977

जैसा कि आप देख सकते हैं, यह एक अलग खिड़की है; X स्थिति 2px से बाईं ओर (702-2) से शुरू होती है और कुल चौड़ाई 4px (900 + 2 + 2) से बड़ी होती है क्योंकि दाहिनी सीमा भी 2px है। वाई अधिक है (शीर्ष सीमा के ऊपर, यदि कोई हो, और शीर्षक पट्टी); ऊँचाई उस बड़े पैमाने के कारण और नीचे की सीमा से अधिक है।

wmctrl पेरेंट विंडो को चाइल्ड विंडो की वांछित [X, Y] स्थिति में ले जाता है; चौड़ाई और ऊंचाई बच्चे पर सही ढंग से लागू होती है, जैसा कि नीचे "पहले और बाद" में दिखाया गया है।

$ wmctrl -lG
0x04000040  0 702  23   900  950  KMatrix dave@KMatrix: test – Konsole

$ xdotool getwindowgeometry 0x18000ec   # (PARENT)
Window 25166060
  Position: 700,0 (screen: 0)
  Geometry: 904x977

$ xdotool getwindowgeometry 0x04000040  # (CHILD)
Window 67108928
  Position: 702,23 (screen: 0)
  Geometry: 900x950

$ wmctrl -ir 0x04000040 -e 0,702,23,900,950   # <----- "MOVE/RESIZE" *****

$ wmctrl -lG
0x04000040  0 704  46   900  950  KMatrix dave@KMatrix: test – Konsole

$ xdotool getwindowgeometry 0x18000ec   # (PARENT)
Window 25166060
  Position: 702,23 (screen: 0)    <----- Desired [X,Y] applied to parent
  Geometry: 904x977

$ xdotool getwindowgeometry 0x04000040  # (CHILD)
Window 67108928
  Position: 704,46 (screen: 0)
  Geometry: 900x950               <----- Desired [W,H] applied to child

संपादित करें: अतिरिक्त जानकारी।

डेस्कटॉप ज्यामिति, Viewport और Workarea

$ wmctrl -d    # (KDE)
0  * DG: 1680x1050  VP: 0,0  WA: 0,0 1680x1015  Desktop 1
$ xdotool -v
xdotool version 3.20140217.1

https://github.com/jordansissel/xdotool

टिप्पणी में पुन: @Sneetsher टिप

$ xprop | grep FRAME
_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 2, 2, 23, 4
_NET_FRAME_EXTENTS(CARDINAL) = 2, 2, 23, 4

यह एक उत्कृष्ट उत्तर की तरह लग रहा है! मैं आज रात इसके विवरण पर गौर करूंगा।
जैकब व्लिजम

मेरी समझ के लिए, का उत्पादन xdotool selectwindowहै 25166060, लेकिन करने के लिए कदम क्या है 0x18000ec? मैंने हेक्साडेसिमल से रूपांतरण की कोशिश की, लेकिन ऐसा नहीं है।
जैकब व्लिजम

xdotool getwindowgeometry 0x18000ec25166060 (पैरेंट) की दशमलव विंडो आईडी रिटर्न से आउटपुट । मैं सिर्फ 0x18000ec का हेक्स मान इनपुट करता हूं यह दिखाने के लिए कि यह 0x04000040 (बच्चा) नहीं था। वैसे, मैंने इस उम्मीद में आसान नंबरों के साथ पूरे परीक्षण को फिर से चलाया कि आप नहीं देख रहे थे। यदि आप किसी चीज़ के बीच में थे, तो पिछला संपादन संशोधन देखें।
Daxx

2
@JacobVlijm, xpropसजावट पैडिंग दिखाती है: _KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6और _NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6। यह जाँच करने में मदद कर सकता है।
user.dz

क्या यह संभव है कि xdotool selectwindowकमांड केडीई और एकता पर अलग तरह से व्यवहार करे? xdotool selectwindowकमांड का आउटपुट ठीक उसी विंडो (-id) को संदर्भित करता है और (इस प्रकार) xdotool getwindowgeometryउसी डेटा को आउटपुट करता है wmctrl -lGxpropआदेश तथापि, के रूप में @Sneetsher शो ने सुझाव दिया _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0है, जो वास्तव में क्या मैं मैन्युअल रूप से मापा जाता है, और साबित करता है आपका जवाब का सार सही है, और यह मेरे सवाल का सही जवाब है। मैं आपकी पूर्णता से प्रभावित हूं। धन्यवाद!
जैकब व्लिजम

0

मुझे भी यही समस्या थी और मैं वर्कअराउंड ढूंढ सकता था।


परिस्थिति

मेरी स्थिति Compate स्थापित के साथ मेट 16.04 पर आधारित है (जो gtk विंडो मैनेजर को सक्रिय करता है)

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


विश्लेषण

सेटिंग्स (कॉम्पिज़) में विंडो सजावट को चालू और बंद करके समस्या को चालू और बंद किया जा सकता है।


वैकल्पिक हल

एक विशेष खिड़की के लिए अजगर का उपयोग करके खिड़की की सजावट को चालू और बंद किया जा सकता है (कीबाइंडिंग का उपयोग करके इसे सक्रिय उपयोग करने के लिए सुविधाजनक है)।

#!/usr/bin/python
from gtk.gdk import *
import gtk.gdk
import time
import sys

w = gtk.gdk.get_default_root_window().get_screen().get_active_window()
w.set_decorations(0) #use 1 to turn on decorations
window_process_all_updates()
gtk.gdk.flush()

फिर आप खिड़की की सजावट को बंद कर सकते हैं, खिड़की को स्थानांतरित कर सकते हैं, और खिड़की की सजावट को चालू कर सकते हैं।

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