Заранее извиняюсь за линукс, так уж получилось. Как вы помните, прошлый раз мне настроить кнопки на мыши не особо удалось — работало всё через раз, так что я всё же полез в исходники openbox (хорошие исходники) и нарыл как в X11 реализовать начало перемещения окна. А потом при помощи PALL MALL синего и такой-то матери было рождено следующее:
// move-window.c #include <stdio.h> #include <string.h> #include <X11/Xlib.h> #include <X11/X.h> // http://stackoverflow.com/questions/3909713/xlib-xgetwindowattributes-always-returns-1x1 Window get_toplevel_parent(Display* display, Window window) { Window parent; Window root; Window* children; unsigned int num_children; while (1) { XQueryTree(display, window, &root, &parent, &children, &num_children); if (children) { XFree(children); } if (window == root || parent == root) { return window; } else { window = parent; } } } int main(int argc, char* argv[]) { Display* display = XOpenDisplay(NULL); Window root = RootWindow(display, DefaultScreen(display)); // get active window Window active; int revert_to_return; XGetInputFocus(display, &active, &revert_to_return); // http://www.linux.org.ru/forum/development/613878 active = get_toplevel_parent(display, active); // get mouse position Window window_returned; unsigned int mask_return; int root_x, root_y, win_x, win_y; XQueryPointer(display, root, &window_returned, &window_returned, &root_x, &root_y, &win_x, &win_y, &mask_return); // http://standards.freedesktop.org/wm-spec/1.3/ar01s04.html#id2522561 XClientMessageEvent evt; memset(&evt, 0, sizeof(evt)); evt.type = ClientMessage; evt.window = active; evt.message_type = XInternAtom(display, "_NET_WM_MOVERESIZE", False); evt.format = 32; evt.data.l[0] = root_x; evt.data.l[1] = root_y; evt.data.l[2] = 10; // _NET_WM_MOVERESIZE_MOVE_KEYBOARD; // http://standards.freedesktop.org/wm-spec/1.3/ar01s03.html XSendEvent(display, root, False, (SubstructureNotifyMask|SubstructureRedirectMask), (XEvent*)&evt); XCloseDisplay(display); return 0; }
Рекомендую ознакомиться со ссылками на ЛОР и stackoverflow. Плохо тупо зделали, не могли как в Windows API. А ведь мне пока никто не объяснил чем таки плоха винда для обычного пользовтеля некодера геймера!
Вот ещё один исходник, для другой кнопочки:
// resize-window.cpp #include <stdio.h> #include <string.h> #include <X11/Xlib.h> #include <X11/X.h> // http://stackoverflow.com/questions/3909713/xlib-xgetwindowattributes-always-returns-1x1 Window get_toplevel_parent(Display* display, Window window) { Window parent; Window root; Window* children; unsigned int num_children; while (1) { XQueryTree(display, window, &root, &parent, &children, &num_children); if (children) { XFree(children); } if (window == root || parent == root) { return window; } else { window = parent; } } } int main(int argc, char* argv[]) { Display* display = XOpenDisplay(NULL); Window root = RootWindow(display, DefaultScreen(display)); // get active window Window active; int revert_to_return; XGetInputFocus(display, &active, &revert_to_return); active = get_toplevel_parent(display, active); // move mouse to the bottom border of the window XWindowAttributes windowattr; XGetWindowAttributes(display, active, &windowattr); XWarpPointer(display, None, active, 0, 0, 0, 0, windowattr.width, windowattr.height); // http://standards.freedesktop.org/wm-spec/1.3/ar01s04.html#id2522561 XClientMessageEvent evt; memset(&evt, 0, sizeof(evt)); evt.type = ClientMessage; evt.window = active; evt.message_type = XInternAtom(display, "_NET_WM_MOVERESIZE", False); evt.format = 32; evt.data.l[0] = windowattr.x + windowattr.width; evt.data.l[1] = windowattr.y + windowattr.height; evt.data.l[2] = 4; // _NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT // http://standards.freedesktop.org/wm-spec/1.3/ar01s03.html XSendEvent(display, root, False, (SubstructureNotifyMask|SubstructureRedirectMask), (XEvent*)&evt); XCloseDisplay(display); return 0; }
Как вы думаете, что происходило, когда я нажимал на кнопки мыши? Правильно, ничего не происходило. Ну второй исходник уводил указатель в правый нижний угол окна.
Я как только не извращался! Особенно мне понравилась идея с FIFO. В опенбоксовской сессии запускаем
while read /tmp/mouse.fifo do ./move-window done
А из btnx туда просто пишем. Своеобразная гальваническая развязка, хе-хе. И то блядь не работало!
Потом оказалось, что btnx вообще-то не единственный, и есть, например, easystroke. Вообще-то, оно для жестов, но можно создать жест из одного нажатия девятой кнопки мыши, и будет работать. Теперь я точно могу таскать окна и изменять их размеры, не прицеливаясь по заголовку и углам. У вендоблядей засран рабочий стол и кончилось место на диске H, у макоёбов dd копирует 1 мегабайт в секунду, пользователи KDE4 опять настраивают падающий док и кнопку закрытия окна по центру экрана, и лишь гуру консоли презрительно не пользуется компьютером вообще.
Пойду ещё чего-нибудь настрою.
Теперь я точно могу таскать окна и изменять их размеры, не прицеливаясь по заголовку и углам.Альт+ЛКМ или ПКМ плох из-за необходимости нажатия альта?
Серьёзно, с такими настройками я чувствую себя совершенно другим человеком!
Доступные тэги: <b>, <i>, <s>, <u>, <a href="">, <img src="" /> (загрузить), <pre>, <quote>
- themylogin › Самое дорогое в жизни 20 мая, 19:47
- potomushto › Am I not always be wanting this? (x8) 20 мая, 16:38
- anonymous › Написание «не» с различными частями речи 16 мая, 16:06
- anonymous › A Tragedy in the Air 15 мая, 18:24
- themylogin › Итоги 2011 15 мая, 12:10
- themylogin › На гелике езжу 13 мая, 16:24
- anonymous › Waking up at ten 13 мая, 13:16
- themylogin › Жук 12 мая, 11:55
- themylogin › Давайте шутки из твиттера продолжим развивать здесь 7 мая, 11:03
- anonymous › Шевченко лох 6 мая, 14:02

