首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调整和移动活动窗口X11

调整和移动活动窗口X11
EN

Stack Overflow用户
提问于 2021-12-19 15:04:00
回答 1查看 315关注 0票数 0

我试图(用python)为一个非平铺的WM写我自己的“贴图助手”,比如Xfce,MATE,ecc。此代码应将活动窗口放置在屏幕的中央、左侧或右侧。

我使用pyewmh库与X11交互。

当我试图调整大小和移动窗口时,它不能正常工作,我不知道为什么!

这是我的python代码:

代码语言:javascript
复制
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()

下一张图片显示了这个问题:

两个终端之间和右侧终端与屏幕边界之间有一定的空间。

我在设置正确的窗口高度方面也有问题。我用_NET_WM_STATE_MAXIMIZED_VERT的道具修复了它,但是当我试图用鼠标移动窗口时,它有点卡在Maximesed_Vert状态了。

EN

回答 1

Stack Overflow用户

发布于 2021-12-20 19:24:18

要使这样的脚本在不同的桌面环境(如XFCE、KDE、Gnome等)中正确工作是不容易的,因为这些DEs不同地装饰窗口。另外,CSD (客户端装饰)或不起作用。我认识一个人,他目前正在从事一个类似的项目,应该在几个DEs上工作。为了完成这项工作,他的程序收集了几个几何数据。请参见https://gitlab.com/corthbandt/shinglify/-/blob/main/ewmhbackend.go函数refresh()。

我还在python中编写了一个平铺助手,它在XFCE上工作得很好。也许你可以把它作为一个起点。我的脚本,除了平铺外,还可以同时调整并排窗口的大小.不幸的是,我不能像您一样使用EMWH-模块,因为这会在自动调整大小的过程中引起恼人的闪烁。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70551464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档