Опубликовано 1 июня 2011, 15:03

Заранее извиняюсь за линукс, так уж получилось. Как вы помните, прошлый раз мне настроить кнопки на мыши не особо удалось — работало всё через раз, так что я всё же полез в исходники 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 опять настраивают падающий док и кнопку закрытия окна по центру экрана, и лишь гуру консоли презрительно не пользуется компьютером вообще.

Пойду ещё чего-нибудь настрою.

Комментарии (2)
ReDetection
5 июня 2011, 14:42
S Q #1
Теперь я точно могу таскать окна и изменять их размеры, не прицеливаясь по заголовку и углам.
Альт+ЛКМ или ПКМ плох из-за необходимости нажатия альта?
<quote>Теперь я точно могу таскать окна и изменять их размеры, не прицеливаясь по заголовку и углам.</quote>Альт+ЛКМ или ПКМ плох из-за необходимости нажатия альта?
themylogin
5 июня 2011, 14:47
S Q #2
Да. + я про них знал, но не помнил

Серьёзно, с такими настройками я чувствую себя совершенно другим человеком!
Да. + я про них знал, но не помнил Серьёзно, с такими настройками я чувствую себя совершенно другим человеком!
Добавить комментарий
Войдите через  Доступные тэги: <b>, <i>, <s>, <u>, <a href="">, <img src="" /> (загрузить), <pre>, <quote>
Теги
1nsk C++ E-Business GNU/GPL-софт HTML/CSS ICQ KDE last.fm Linux Linuxnsk Live Lyceum game Microsoft Motivator MySQL P2P Party PHP Python Qt SEO Sibnet thelogin.ru Timelapse Web 2.0 Webstream Windows Wireless А я говорил! Авто Админ Аниме Атмосфера Безобразие Бизнес Блоги Боты Бред Быт Велосипед Весна Вечер Взлом Винил Винтаж Вконтакте Вода Воспоминания Гетто Гламур Гопота Горский Графити Грузовик Дача Двор Девушки Деньги Дизайн Домофон Драки Еда Железо Животные Затулинка Зима Игрушки Игры Идея Интересно Интернет Исследование История Казань Карикатура Квартира Класс Компьютеры Коромшук Коты КПК Кран Красиво Криминал Крыша Курение Лето Литература Лицей НГТУ Лохи Магнитофоны Маркса Мат Математика Машинный перевод Мегафон Менты Метро Мечты Мифы Мне стыдно Мобайл Можга МТС Музыка Мультикасса Мультики Мы помним Надписи Наука НГТУ Недвижимость Непоняятно Новосибирск Носители Ноутбуки Ночь Обидно Обман Образование Общественный транспорт Омск Опечатки Орфография Осень Парк Периферия Пиратство Плохо Погода Поезд Помойка Праздники Презрение Природа Провайдеры Программирование Протест Пьянки Радиотехника Растения Реклама Религия и вера Ретро Рисунок Руины Рэп Салют Серверы Сервис Сериалы Скринкаст Скриншоты Смешно СМИ Снег Собаки Совет Софт Спам Спасём Россию Спецтранспорт Стоп-ляп Страх Стройка Студяга Танцы ТВ Трамваи Транс Транспорт Уважаю Ужас Умный дом Утро Филдрепорты Философия Форум ФПМИ Хикки Хостинг Цитатник Школа 208 ЭГ Эксперимент Юго-Западный
Twitter 01-06-2011
themylogin Sergey Mordvinov
@electrovantuz еле языком ворочаю!
themylogin Sergey Mordvinov
Хочу купить диск Do Not Be Surprised What Is Happening - Crossroads, и блядь где мне его купить? Везде можно только скачать. Ёбаные пираты.
themylogin Sergey Mordvinov
@vas3k ВАСЯ ПЛЕЕР НЕ ОТКРЫВАЕТСЯ
themylogin Sergey Mordvinov
Ах да, вырубал всем свет, теперь знаю где мой пакетник. Ну и часы на магнитофоне я выставлял сегодня. Хоть не на микроволновке. Роисся!
themylogin Sergey Mordvinov
@electrovantuz ещё раз запахнет - КАК УЕБУ СУКА
themylogin Sergey Mordvinov
В соседней хате пацан включил плиту и ушёл. Пожарные лазили через мой балкон. Только блядь пол помыл :-!
Lorem Ipsum
В соседней хате пацан включил плиту и ушёл. Пожарные лазили через мой балкон. Только блядь пол помыл :-!
themylogin Sergey Mordvinov
Бабка достань нам плиз рабочий дюп,для перфект ворлд на фришке пвпвп,в подполье жука должно,быть или на лолчитс.
themylogin Sergey Mordvinov
http://www.radioscanner.ru/forum/topic40946.html хорошая радиостанция, надо съездить пофотать)))
themylogin Sergey Mordvinov
А ведь мне пока никто не объяснил чем таки плоха винда для обычного пользовтеля некодера геймера