Gtkmm - проблемы "Gdk :: Window :: pointer_grab" - PullRequest
0 голосов
/ 12 февраля 2010

Я программирую игру FPS (шутер от первого лица), используя "Gtkmm" в качестве оконного менеджера, и я хотел бы сделать "мышиный взгляд". Поэтому мне нужно «схватить» указатель мыши, чтобы перенаправить все события движения мыши в окно моего приложения.

Кажется, есть три перегруженные функции для этой работы, и я выбрал самую простую для начала:

Gdk::GrabStatus Gdk::Window::pointer_grab(bool owner_events, Gdk::EventMask event_mask, guint32 timestamp)

Я пытался применить эту функцию в своем приложении, но пока у меня были «плохие результаты» - он не делает то, что мне нужно, он работает «иначе» в «Windows», чем в «Linux», и т.д ...

Итак, я напишу, что я сделал до сих пор, но сначала, какова моя цель: "Я хочу, чтобы мое приложение было в окне, и я хочу, чтобы мышь выглядела мышью даже когда я покидаю окно с указателем мыши ".

Итак, давайте перейдем к параметрам функции:
-> bool owner_events: когда я установил для него значение «true», я получал события только тогда, когда был внутри окна, но (что еще хуже), когда я устанавливал его в «false» Я не получил никаких событий - поэтому я установил его в true (лучший вариант :-))
-> Gdk :: EventMask event_mask: должны быть те события, которые я хочу перехватить. На данный момент меня интересуют только события движения мыши, поэтому я поставил туда только "Gdk :: POINTER_MOTION_MASK"
-> guint32 timestamp: этого я тоже не понимаю, но когда я поставил там чистый "0", состояние захвата было в порядке, таким образом, "GRAB_SUCCESS" (когда я пытался установите его на 1, 2 или любой другой номер, он вернул "GRAB_INVALID_TIME" в качестве статуса захвата) - поэтому я установил его на "0"

И теперь, когда я запускаю его в Linux, он, хотя и захватывает указатель, и когда я щелкаю где-то за пределами окна, он не реагирует (таким образом, мое окно всегда остается наверху, что и есть «я хочу»), но проблема в том, что приложение не перехватывает какие-либо события или ловит его только тогда, когда я нахожусь в окне (когда я установил owner_events в true ).

А в Windows все еще хуже: когда я щелкаю где-то за пределами окна, он переключает меня в область, в которой я щелкнул - так же, как и "без захвата".

Может кто-нибудь сказать мне, что я делаю не так, или привести небольшой пример использования захвата в Gtkmm?

1 Ответ

1 голос
/ 21 января 2011

Для event_mask вы должны включить Gdk :: ENTER_NOTIFY_MASK и Gdk :: BUTTON_RELEASE_MASK, чтобы вы могли убрать точку, когда она либо снова входит в окно, либо когда кнопка отпущена.

Для отметки времени передайте элемент GdkEvent ... :: time или Gdk :: CURRENT_TIME.

...