[英]Python Resize and Move Active Window X11
我正在嘗試(在 python 中)為非平鋪 WM 編寫我自己的“平鋪助手”,例如 Xfce、MATE、ecc。 此代碼應將活動的 windows 放在屏幕的中央、左側或右側。
我正在使用pyewmh
lib 與 X11 進行交互。
當我嘗試調整大小並移動 window 時,它無法正常工作,我不知道為什么!
這是我的 python 代碼:
import argparse
from contextlib import contextmanager
from typing import Any, Dict, Optional, Tuple, Union, Callable # noqa
from ewmh import
# wm manager
ewmh = EWMH()
# get desktop size and real desktop sizes
w, h = ewmh.getDesktopGeometry()
xr, yr, wr, hr = ewmh.getWorkArea()[:4]
def main():
print("Desktop Geometry: ", w, h)
print("Desktop WorkArea:", xr, yr, wr, hr)
# execute user selected tiling operation
options[args.mode]()
ewmh.display.flush()
def __edit_window(win=None, x=None, y=None, w=None, h=None):
if win is None:
win = ewmh.getActiveWindow()
ewmh.setMoveResizeWindow(
win,
x=x,
y=y,
w=w,
h=h
)
if h is None:
ewmh.setWmState(win, 1, '_NET_WM_STATE_MAXIMIZED_VERT')
print(f"New Window {win} pos: ({x}, {y}), New Window size: ({w}, {h})")
def tile_left():
"""
Tile window to the left part of the screen.
-m tile_left
"""
print(f"Left Tiling Window")
__edit_window(x=0, y=0, w=int(wr/2)) # w or wr ??
def tile_right():
"""
Tile window to the right part of the screen.
-m tile_right
"""
print(f"Tiling Right Window")
__edit_window(x=int(wr/2), y=0, w=int(wr / 2)) # w or wr ??
def centering_window():
"""
Centers the active window.
-m center
Used with --noresize the active window is not resized when centered
"""
print(f"Centering Window")
win = ewmh.getActiveWindow()
win_size = get_window_size(win)
# disable maximised_vert
ewmh.setWmState(win, 0, '_NET_WM_STATE_MAXIMIZED_VERT')
if args.noresize:
# centering windows without resize dims
print('\t with NoResize mode')
__edit_window(win, x=int((wr - win_size.width) / 2), y=int((hr - win_size.height) / 2), w=win_size.width, h=win_size.height) # w or wr ??
else:
# centering windows and resize dims
print('\t with Resize mode')
__edit_window(x=(xr + 50), y=(yr + 50), w=(wr - 100), h=(hr - 100)) # w or wr ??
def get_window_size(window):
"""Returns window size object"""
# get window dims
win_size = window.get_geometry()
print(f"Window pos: ({win_size.x}, {win_size.y}) Window size: ({win_size.width}, {win_size.height})")
return win_size
if __name__ == '__main__':
# define selectable options
# type: Dict[str, Callable[[None], None]]
options = {
'center': centering_window, # center window
'tile_left': tile_left, # tiling window to the left
'tile_right': tile_right, # tiling window to the right
}
# init argument parser
parser = argparse.ArgumentParser(description='My awesome python tiling assistant !')
# arguments
parser.add_argument(
'-m',
'--mode',
type=str,
choices=options.keys(),
required=True,
help='Choose how to tile the active window'
)
parser.add_argument(
'--noresize',
action='store_true',
help='Center window without resize it'
)
args = parser.parse_args()
main()
2 個終端之間以及右終端和屏幕邊框之間有一些空間。
我也無法設置正確的 window 高度。 我使用_NET_WM_STATE_MAXIMIZED_VERT
修復了它,但是當我嘗試用鼠標移動 window 時,它有點卡在 Maximesed_Vert 狀態。
讓這樣的腳本在不同的桌面環境 (DE)(如 XFCE、KDE、Gnome 等)上正常工作並不容易,因為這些 DE 對 windows 的裝飾不同。 CSD(客戶端裝飾)與否也有所不同。 我知道有人目前正在從事一個類似的項目,該項目應該在幾個 DE 上工作。 他的程序收集了幾個幾何數據來完成這項工作。 請參閱https://gitlab.com/corthbandt/shinglify/-/blob/main/ewmhbackend.go function 刷新。
我還在 python xpytile中編寫了一個平鋪助手,它在 XFCE 上運行良好。 也許您可以以此為起點。 除了平鋪之外,我的腳本還可以同時調整 windows 的大小。 不幸的是,我無法像您一樣使用 EMWH 模塊,因為這會在自動調整大小時導致煩人的閃爍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.