void OSNacl::handle_event(const pp::InputEvent& p_event) { int type = p_event.GetType(); switch (type) { case PP_INPUTEVENT_TYPE_MOUSEDOWN: case PP_INPUTEVENT_TYPE_MOUSEUP: case PP_INPUTEVENT_TYPE_WHEEL: { InputEvent event; event.ID=++event_id; event.type = InputEvent::MOUSE_BUTTON; event.device=0; pp::MouseInputEvent mevent(p_event); if (type == PP_INPUTEVENT_TYPE_WHEEL) { pp::WheelInputEvent wevent(p_event);; float ticks = wevent.GetTicks().y(); if (ticks == 0) break; // whut? event.mouse_button.pressed = true; event.mouse_button.button_index = ticks > 0 ? BUTTON_WHEEL_UP : BUTTON_WHEEL_DOWN; event.mouse_button.doubleclick = false; } else { event.mouse_button.pressed = (type == PP_INPUTEVENT_TYPE_MOUSEDOWN); event.mouse_button.button_index = mouse_button(mevent.GetButton()); event.mouse_button.doubleclick = (mevent.GetClickCount() % 2) == 0; mouse_mask &= ~(1<< (event.mouse_button.button_index - 1)); mouse_mask |= (event.mouse_button.pressed << (event.mouse_button.button_index - 1)); }; pp::Point pos = mevent.GetPosition(); event.mouse_button.button_mask = mouse_mask; event.mouse_button.global_x = pos.x(); event.mouse_button.x = pos.x(); event.mouse_button.global_y = pos.y(); event.mouse_button.y = pos.y(); event.mouse_button.pointer_index = 0; event.mouse_button.mod = modifier(p_event.GetModifiers()); queue_event(event); } break; case PP_INPUTEVENT_TYPE_MOUSEMOVE: { pp::MouseInputEvent mevent(p_event); pp::Point pos = mevent.GetPosition(); InputEvent event; event.ID=++event_id; event.type = InputEvent::MOUSE_MOTION; event.mouse_motion.pointer_index = 0; event.mouse_motion.global_x = pos.x(); event.mouse_motion.global_y = pos.y(); event.mouse_motion.x = pos.x(); event.mouse_motion.y = pos.y(); event.mouse_motion.button_mask = mouse_mask; event.mouse_motion.mod = modifier(p_event.GetModifiers()); event.mouse_motion.relative_x = pos.x() - mouse_last_x; event.mouse_motion.relative_y = pos.y() - mouse_last_y; mouse_last_x = pos.x(); mouse_last_y = pos.y(); queue_event(event); } break; case PP_INPUTEVENT_TYPE_RAWKEYDOWN: case PP_INPUTEVENT_TYPE_KEYDOWN: case PP_INPUTEVENT_TYPE_KEYUP: { pp::KeyboardInputEvent kevent(p_event); bool is_char; uint32_t key = godot_key(kevent.GetKeyCode(), is_char); if (type != PP_INPUTEVENT_TYPE_KEYUP && is_char) { last_scancode = key; break; }; InputEvent event; event.ID=++event_id; event.type = InputEvent::KEY; event.key.pressed = (type != PP_INPUTEVENT_TYPE_KEYUP); event.key.scancode = key; event.key.unicode = key; event.key.echo = p_event.GetModifiers() & PP_INPUTEVENT_MODIFIER_ISAUTOREPEAT; event.key.mod = modifier(p_event.GetModifiers()); queue_event(event); } break; case PP_INPUTEVENT_TYPE_CHAR: { pp::KeyboardInputEvent kevent(p_event); InputEvent event; event.ID = ++event_id; event.type = InputEvent::KEY; event.key.pressed = true; event.key.scancode = last_scancode; event.key.unicode = kevent.GetCharacterText().AsString().c_str()[0]; event.key.mod = modifier(p_event.GetModifiers()); event.key.echo = p_event.GetModifiers() & PP_INPUTEVENT_MODIFIER_ISAUTOREPEAT; queue_event(event); } break; /* case NPEventType_Minimize: { minimized = p_event->u.minimize.value == 1; } break; case NPEventType_Focus: { if (p_event->u.focus.value == 1) { main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN); } else { main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT); }; } break; */ default: ; }; };