Gtkmm - Проблемы с Gdk::Window::pointer_grab

Я программирую игру 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?


person Petike    schedule 12.02.2010    source источник
comment
Я не уверен, что Gtkmm — правильный инструмент для создания шутера — возможно, вам стоит использовать игровой инструментарий?   -  person ptomato    schedule 22.01.2011
comment
Какую версию gtkmm вы используете?   -  person fnc12    schedule 22.04.2015


Ответы (1)


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

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

person Allen Taylor    schedule 21.01.2011