Modifier是否有任何窗口管理器具有通过使用+ 触摸板,点击(而不是单击)窗口的任何部分来移动/调整窗口大小的功能?
我知道,大多数窗口管理器都能够通过Alt+ 左键单击来移动窗口,并通过Alt+ 右键单击来调整窗口大小。这在鼠标上完美运行。但是,使用触摸板时,它更复杂,因为它需要按住两个按钮:Alt和一个用于单击的按钮。
理想情况下,我想通过Alt+ 触摸板移动窗口,并通过Super+ 触摸板调整大小。我的意思是,我按住Alt,只需点击并移动手指,就可以移动窗口。任何窗口管理器都可以做到这一点吗?如果没有,有什么技巧可以实现这一点吗?
目前我正在使用 xfce4 和。如果我能用另一个替换或在其上使用一些外部实用程序来xfwm
实现这一点,那将是最好的。xfwm
wm
xfwm
答案1
答案2
我创建了一个小程序,当按下 Alt/Win 按钮并发生触摸时,它会将鼠标单击事件注入 X 服务器。事件设备的路径应更改为分别指向键盘和触摸板(对我来说,它适用于event0
和event5
,但在其他机器上它们可能不同)。应配置窗口管理器,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);
}
}
}