LINUX.ORG.RU

XSendEvent эмуляция кнопок мыши

 


0

1

Нашёл в гугле как эмулировать кнопки, эмулирую пкм пресс и тащу окно за заголовок - тащится. Делаю тоже самое, но с кутешным скролбаром - не тянет. В хроме страницу за скролбар таким образом прокручивает, но вот начать выделение не получается. Код примерно такой:

            XEvent event;
            memset(&event, 0x00, sizeof(event));

            event.type = ButtonPress;
            event.xbutton.button = Button1;
            event.xbutton.same_screen = True;

            XQueryPointer(display, RootWindow(display, DefaultScreen(display)), &event.xbutton.root, &event.xbutton.window, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);

            event.xbutton.subwindow = event.xbutton.window;
            while(event.xbutton.subwindow)
            {
                event.xbutton.window = event.xbutton.subwindow;
                XQueryPointer(display, event.xbutton.window, &event.xbutton.root, &event.xbutton.subwindow, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
            }

            
            if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0)
                fprintf(stderr, "Error\n");
            XFlush(display);

В чем проблема?

В чем проблема?

Проблема может быть в том, что в структуре event в X11 есть поле send_event. Если это поле 0, то сообщение пришло от самого X-сервера, а если не ноль, то от другого приложения. Так вот некоторые приложения (а их список мне неизвестен, но они точно есть) не принимают сообщений от других приложений, а только от сервера. Просто проверяют это поле и отсеивают. Делает ли так Qt или Chrome, я не знаю точно - надо исходники смотреть. Ты мог именно на это нарваться: какие-то приложения нормально отработают, а какие-то нет.

XTEST решает. Но при помощи XTEST нельзя направить сообщение любому окну по его id (окну, которое, например, не имеет фокуса ввода). Это можно сделать только при помощи XSendEvent. Сообщения от XTEST получит активное окно.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Ну там memset, поэтому send_event в нуле. У икстест беда с фокусом. Я пилю управление мышкой с клавы по горячим клавишам, кое-какими костылями запилил вменяемую езду курсора, но вот с кнопками запара. Мб запилить простенький драйверок для иксов %)

vova7890 ★★★ ()
Ответ на: комментарий от vova7890

Ну там memset, поэтому send_event в нуле

Э-э-э, где?

У икстест беда с фокусом. Я пилю управление мышкой с клавы по горячим клавишам, кое-какими костылями запилил вменяемую езду курсора, но вот с кнопками запара. Мб запилить простенький драйверок для иксов %)

А какая беда с фокусом? Если ты что-то делаешь в окне мышкой, то окно же становится активным. Ты разве что-то делаешь мышкой в нективном приложении? Ну так сделай нужное окно активным (автоматически) и сделай там мышкой все свои дела? Или что я не понимаю в этой теме?

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от vova7890

Еще посмотри xte и synergy. Тоже XTEST используют.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Э-э-э, где?

а, я не так понял. Это send_event в приложениях должен быть 0

А какая беда с фокусом?

ну, к примеру я наведу на пустую область в неактивном окне и нажму лкм - должен перекинуться фокус. Тут нужно смотреть, окно под курсором активно или нет, если нет - передать ему фокус. Надо попробовать.

vova7890 ★★★ ()
Ответ на: комментарий от vova7890

а, я не так понял. Это send_event в приложениях должен быть 0

Ага, да. Если X server от реальной мышки отсылал Event, то к X-клиенту оно придет с флагом send_event=0. А если какой-то другой X-клиент попробовал XSendEvent направить к окну другого приложения, то это приложение получит Event с ненулевым флагом. Почему некоторые приложения (или тулкиты) отсеивают, я не знаю. Предположу, что из-за каких-то своих представлениях о безопасности. Вот дали возможность определить, от кого событие, так каждый им воспользовался в меру своего понимания. Спецификация не запрещает. Тем самым затруднив работу готового механизма. Поэтому и имеем XTEST.

Zubok ★★★★★ ()
Ответ на: комментарий от vova7890

Самый простой способ, если прокатит - буду юзать на первых парах. Спасибо

Как хак прокатит. Там у него в коде только какая-то его библиотека используется liboverride, которая там же на страничке. Но библиотеку без нее можно без труда написать. Да, тогда XPeekEvent тоже надо сделать. Не только XNextEvent.

Zubok ★★★★★ ()
Ответ на: комментарий от vova7890

ну, к примеру я наведу на пустую область в неактивном окне и нажму лкм - должен перекинуться фокус. Тут нужно смотреть, окно под курсором активно или нет, если нет - передать ему фокус. Надо попробовать.

Так ему оконный менеджер передаст фокус. Он не различает, что за событие к нему пришло: реальное или фейковое. Сделает так, как в реальной жизни делает.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от vova7890

Самый простой способ, если прокатит - буду юзать на первых парах. Спасибо

Самый простой - это XTEST. Вон там выше ссылка с простой программой. Я даже попробовал сейчас. Пять минут - и уже можно двигаться. Запустил из терминала программку, которая перемещает указатель в верхний угол (там неактивное приложение), потом виртуально жму PointerButton на нем - неактивное приложение получает фокус. Потом возвращаюсь в терминал и там жму виртуальную вставку из буфера (третья кнопка мыши) - вставилось заранее скопированная строка.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Да, спасибо. Сделал в конечном итоге либой xdo. Теперь все таскается :)

vova7890 ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.