Какой-либо менеджер окон имеет возможность перемещения/изменения размеров окна при помощи Модификатора + Сенсорная панель путем ответвления (не нажимающий) ни в какой части окна?
Я знаю, что большинство менеджеров окон способно к перемещению окна Высоким звуком + Щелчок левой кнопкой и изменение размеров Высоким звуком + Щелчок правой кнопкой. Это работает отлично с мышью. Но с сенсорной панелью это является более замысловатым, в нем должен удержать две кнопки: Высокий звук и кнопка для щелчка.
Идеально, я хотел бы переместить окно Высоким звуком + Сенсорная панель и изменить размер Супер + Сенсорная панель. Я имею в виду, я удержал бы Высокий звук, и только с ответвлением и шевелить моим пальцем, я хотел бы переместить окно. Какой-либо менеджер окон может сделать это? В противном случае там какой-либо взлом должен выполнить это?
В настоящее время я использую xfce4 с xfwm
. Было бы лучше, если я мог бы сделать это только с заменой xfwm
с другим wm
, или с использованием некоторой внешней утилиты сверху xfwm
.
Я думаю, что fusuma и после плагинов полезны.
https://github.com/iberianpig/fusuma-plugin-wmctrl https://github.com/iberianpig/fusuma-plugin-keypress
Я создал немного программы, которая вводит события нажатия мыши в X-сервер, когда нажатая кнопка Alt/Win и существует касание. Путь устройств события должен быть изменен для указания на клавиатуру и сенсорную панель соответственно (это работает на меня для 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);
}
}
}