通过修改器+触摸板移动/调整窗口任意部分的大小(不是单击,只是轻敲)

通过修改器+触摸板移动/调整窗口任意部分的大小(不是单击,只是轻敲)

Modifier是否有任何窗口管理器具有通过使用+ 触摸板,点击(而不是单击)窗口的任何部分来移动/调整窗口大小的功能?

我知道,大多数窗口管理器都能够通过Alt+ 左键单击来移动窗口,并通过Alt+ 右键单击​​来调整窗口大小。这在鼠标上完美运行。但是,使用触摸板时,它更复杂,因为它需要按住两个按钮:Alt和一个用于单击的按钮。

理想情况下,我想通过Alt+ 触摸板移动窗口,并通过Super+ 触摸板调整大小。我的意思是,我按住Alt,只需点击并移动手指,就可以移动窗口。任何窗口管理器都可以做到这一点吗?如果没有,有什么技巧可以实现这一点吗?

目前我正在使用 xfce4 和。如果我能用另一个替换或在其上使用一些外部实用程序来xfwm实现这一点,那将是最好的。xfwmwmxfwm

答案1

答案2

我创建了一个小程序,当按下 Alt/Win 按钮并发生触摸时,它会将鼠标单击事件注入 X 服务器。事件设备的路径应更改为分别指向键盘和触摸板(对我来说,它适用于event0event5,但在其他机器上它们可能不同)。应配置窗口管理器,Alt+LeftClick 为移动,Win+RightClick 为调整大小。以下是源代码:

#include <X11/extensions/XTest.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>

int main() {
    Display *display = XOpenDisplay(nullptr);

    int kfd = open("/dev/input/event0", O_RDONLY);
    int tfd = open("/dev/input/event5", O_RDONLY);
    int mfd = kfd;
    if (tfd>mfd) mfd = tfd;
    bool leftAltDown = false;
    bool leftWinDown = false;
    bool touch = false;
    bool leftClickStateOnServer = false;
    bool rightClickStateOnServer = false;
    for (;;) {
        fd_set readfds;
        FD_ZERO(&readfds);
        FD_SET(kfd, &readfds);
        FD_SET(tfd, &readfds);
        int e = select(mfd+1, &readfds, nullptr, nullptr, nullptr);
        if (e>=0) {
            if (FD_ISSET(kfd, &readfds)) {
                input_event e;
                if (read(kfd, &e, sizeof(e))==sizeof(e)) {
                    if (e.type==EV_KEY) {
                        if (e.code==56) leftAltDown = e.value;
                        if (e.code==125) leftWinDown = e.value;
                    }
                }
            }
            if (FD_ISSET(tfd, &readfds)) {
                input_event e;
                read(tfd, &e, sizeof(e));
                if (e.type==EV_KEY&&e.code==BTN_TOUCH) {
                    touch = e.value;
                }
            }
        }

        bool leftClick = leftAltDown&&touch;
        bool rightClick = leftWinDown&&touch;

        if (leftClickStateOnServer!=leftClick) {
            leftClickStateOnServer = leftClick;
            XTestFakeButtonEvent(display, Button1, leftClick, CurrentTime);
            XSync(display, false);
        }
        if (rightClickStateOnServer!=rightClick) {
            rightClickStateOnServer = rightClick;
            XTestFakeButtonEvent(display, Button3, rightClick, CurrentTime);
            XSync(display, false);
        }
    }
}

相关内容