LINUX.ORG.RU

Сообщения awpe

 

Xlib Xinput2 XIWarpPointer Xinerama глюки

Доброго времени суток,

итак есть два монитора, работает xinerama, общее разрешение 2820*1440, слева 900*1440, справа 1920*1200, тот что 1920*1200 - основной экран.

При помощи XInput2 получаю ID виртуального мастера (masterPtrDevId) для указателя плюс ID реального устройства(slavePtrDevId) который к этому мастеру подключен.

Средствами xlib создаю окно, вешаю на него пассивную прослушку кликов с устройства slavePtrDevId.

При обнаружении клика (кнопку мыши отпустили) хочу передвинуть курсор в фиксированую позицию.

Двигаем средствами XInput:

XWarpPointer(ctx->xDpy, None, ctx->rootW, 0, 0, 0, 0, 100, 100);

Всё двигается как и ожидалось.

Создаём второе мастер устройство, привязываем к нему вторую мышку, работаем уже с этим новым мастером отслеживая привязаную к нему мышку.

Двигаем средствами XInput2:

XIWarpPointer (ctx->xDpy,
               ctx->masterPtrDevId,
               None,
               ctx->rootW,
               0.0,   0.0,
               0,     0,
               100.0, 100.0);

И облом... Не то чтобы совсем - курсор второго виртуального мастера двигается, но не в 100, 100 общего рута, который размером 2820*1440, т.е. в левый не основной монитор размером 900*1440, а в 1000, 100 или в 100, 100 второго монитора который указан как основной и размером 1920*1200, при этом, стоит на пиксель подвинуть мышь и она таки «доскакивает» до 100, 100 левого монитора, вообще любое событие этой мыши(клики, колёсико) доводит её до нужного места. То же самое поведение даже если не создавать второго мастера, т.е. обе мыши к одному мастеру привязаны.

xprop -root -tree показывает что рут только один xwininfo по пустой области обоих моников (xmonad-пустая область это рут) показывают одно и то же окно.

Я не правильно понял документацию на XIWarpPointer или пора писать разрабам?

 , , ,

awpe
()

Xlib, как правильно послать клик мышкой в окно

Доброго времени суток,

есть id окна, есть координаты, нужно в это окно послать клик мышкой по данным координатам.

Создаю своё окно, указываю ему в параметрах

event_mask=ButtonPressMask

А при вызове createWindow указываю маску CWEventMask.

Далее отслеживаю события в своём окне, при событии ButtonPress посылаю сигнал клика в другое окно:

case ButtonPress: xEvent.xbutton.window = targetWindowId;

xEvent.type = ButtonPress; XSendEvent (d, targetWindowId, False, ButtonPressMask, &xEvent);

nanosleep(&clickDelay, NULL);

xEvent.type = ButtonRelease; XSendEvent (d, targetWindowId, False, ButtonReleaseMask, &xEvent);

Проблемы: - Разным окнам задержка в clickDelay нужна разная, кому то меньше кому то больше. - Для некоторых окон пришлось использовать XWarpPointer, ждать и только потом клик слать. - Но некоторым окнам и этого было мало, пришлось MotionEvent посылать. - И всё равно остались окна, которым по барабану. - Так же есть окна, например netbeans, в которых элементы меню работают хорошо, а поле редактора либо вообще не принимает клик, либо в одном и том же месте.

Вопросы: - Как правильно послать клик мышкой окну с известным id? - Если провести по окну приложения, которое не в фокусе курсором, то там где курсор попадает на элементы меню, эти элементы реагируют, а если я в своём окне отлавливаю MotionNotify, и пересылаю его другому окну, то они не подсвечаиваются, хотя xev показывает что все события отлично доходят, почему так?

 , ,

awpe
()

GTK можно ли получить доступ к виджету в другом приложении?

Доброго времени суток,

Если запустить приложение написаное с GTK, то команда

xwininfo -tree -root

выведет для этого приложения кучу окон, с разными координатами и размерами. Как я понял при программировании на gtk можно «лепить» своё приложение из объектов, называемых виджетами, каждый из них по сути - дочернее окно для приложения.

Вопрос - при каждом запуске приложения id этих виджетовых окон меняются, можно ли при помощи GTK получить доступ к списку этих виджетов в уже работающем приложении (т.е. из своей программы), они же наверняка внутри приложения имеют свои имена, которые не меняются при каждом запуске, типа ПАНЕЛЬ1 или КНОПКА2 ?

Просто если они для иксов как окна, то можно получить изображение виджета отдельно от окна?

 , , ,

awpe
()

Что быстрее (XGetImage+XPutImage) VS XCopyArea VS (XShmGetImage + XShmPutImage) VS GTK+?

Доброго времени суток.

Написал программу, которая содержимое одного окна отображает в другом. Допустим у меня есть Xlib'ный тип Window, есть переменные этого типа, SrcWin и TrgWin, для удобства у обоих один и тот же размер (683*752), который никогда не изменится, одна глубина изображения. SrcWin это окно какого то реального приложения.

Программа раз в 40мс копирует изображение из SrcWin в TrgWin, с помощью XGetImage и XPutImage, на i5-3337U программа берёт почти 20% процессорного времени, процесс Xorg загружает проц примерно на столько же.

Программа работает как ожидалось, однако меня сильно напрягает высокая нагрузка на процессор.

Три вопроса: 1) Альтернативы, указанные в названии темы, могут значительно снизить нагрузку на процессор? Просто было бы здорово, не копировать данные, а отображать буфер пикселей одного окна в соответствующий буфер другого (скопировать значение указателя на область памяти с изображением которое надо отобразить).

2) Читал, что в некоторых тулкитах типа QT, есть такая штука как window-damage event, которую я понимаю как событие, которое появляется, если хотя бы один пиксель был в окне изменён, правильно ли я понимаю суть этого события, и есть ли аналог в Xlib? А то подход, когда надо гонять данные туда сюда каждые 40мс, даже если ничего не поменялось, не выглядит как лучшее решение данной задачи.

3) Может кто в курсе, как работает window-switcher(alt+tab) в KDE? Он ведь отображает содержимое окон в реальном времени, ну или во всяком случае оперативно реагирует на изменения окон которые он отрисовывает, и при этом не напрягает процессор.

 , , , ,

awpe
()

RSS подписка на новые темы