Я программирую игру 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: этого я тоже не понимаю, но когда я поставил чистый "0", статус захвата был в порядке, поэтому "GRAB_SUCCESS" (когда я пытался установить его на 1, 2 или любое другое число, он возвращал " GRAB_INVALID_TIME" в качестве статуса захвата) - поэтому я установил его на "0"
И теперь, когда я запускаю его в Linux, он хотя и захватывает указатель, и когда я нажимаю где-то за пределами окна, он не реагирует (таким образом, мое окно остается всегда наверху, что «я хочу»), но проблема заключается в том, что приложение не перехватывает какие-либо события или перехватывает их только тогда, когда я нахожусь внутри окна (когда я устанавливаю owner_events в true).
А в винде еще хуже: когда кликаю где-то за пределами окна, меня переключает в ту область, где я кликнул - так что это то же самое, что и "без захвата".
Может ли кто-нибудь сказать мне, что я делаю неправильно, или привести небольшой пример использования захвата в Gtkmm?