web-dev-qa-db-ja.com

wmctrlウィンドウの移動コマンドの偏差の原因

Wmctrlについて

wmctrl(デフォルトではインストールされません)を使用すると、ウィンドウ、ID、ジオメトリ、所属するPIDなどの情報を取得できます。また、moveまたはresize複数のコマンドがあるウィンドウ。ただし、いくつかの点で、その動作は論理的ではないようです。私の質問はmoving windows by wmctrlについてです:

情報の取得

コマンドを実行すると:

wmctrl -lG

下の写真のウィンドウに関する次の情報を取得します(a.o.):

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

列3-5のジオメトリ情報は、x/y座標と幅/高さを示しています。

ウィンドウの移動/サイズ変更

これらの座標をwmctrlコマンドでmove/resizeウィンドウに配置すると、座標は変更されないため、何も実行されません。

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

偏差

ただし、下の図は、ウィンドウが下に移動していることを示しています(正確には28px)。理由は、wmctrlウィンドウの移動コマンドが作業領域(画面からパネルの高さ)で計算され、wmctrl -lGコマンドが計算されたためだと思いました合計画面サイズで。しかし、それでも4pxは説明されていません(パネルの高さは24pxです)。

逸脱はスクリプトで十分に補正できますが、原因が理解できないという事実は満足のいくものではないため、質問は次のとおりです。

この逸脱の正確な原因は何ですか?


wmctrl -lGの出力で正確な座標を持つウィンドウを移動すると、ウィンドウは移動しませんが、移動します

enter image description here

enter image description here

10
Jacob Vlijm

何が起こっているのかというと、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位置は左から2ピクセル(702-2)で始まり、右の境界も2ピクセルなので、合計幅は4ピクセル(900 + 2 + 2)大きくなります。 Yは高くなっています(上部の境界線(存在する場合)、およびタイトルバーの上)。そのすべてに加えて下の境界線のため、高さが大きくなります。

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

編集:追加情報。

デスクトップジオメトリ、ビューポート、ワークエリア

$ 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
15
Daxx

同じ問題があり、回避策を見つけることができました。


状況

私の状況はCompizがインストールされたMate 16.04に基づいています(これはgtkウィンドウマネージャをアクティブにします)

キーバインドに接続されたスクリプトを使用して、定義済みの場所にウィンドウを配置しています。最大化オプションを使用していない場合、このスクリプトは失敗します。


分析

この問題は、設定(compiz)のウィンドウ装飾をオンまたはオフにすることでオンとオフを切り替えることができます。


Workaround

ウィンドウ装飾は、特定のウィンドウに対してpythonを使用してオンおよびオフにできます(キーバインディングを使用すると、アクティブウィンドウを使用すると便利です)。

#!/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()

その後、ウィンドウ装飾をオフにし、ウィンドウを移動し、ウィンドウ装飾をオンにすることができます。

0