void EventSenderProxy::mouseDown(unsigned button, WKEventModifiers wkModifiers) { // If the same mouse button is already in the down position don't // send another event as it may confuse Xvfb. unsigned gdkButton = eventSenderButtonToGDKButton(button); if (m_mouseButtonCurrentlyDown == gdkButton) return; m_mouseButtonCurrentlyDown = gdkButton; // Normally GDK will send both GDK_BUTTON_PRESS and GDK_2BUTTON_PRESS for // the second button press during double-clicks. WebKit GTK+ selectively // ignores the first GDK_BUTTON_PRESS of that pair using gdk_event_peek. // Since our events aren't ever going onto the GDK event queue, WebKit won't // be able to filter out the first GDK_BUTTON_PRESS, so we just don't send // it here. Eventually this code should probably figure out a way to get all // appropriate events onto the event queue and this work-around should be // removed. updateClickCountForButton(button); GdkEventType eventType; if (m_clickCount == 2) eventType = GDK_2BUTTON_PRESS; else if (m_clickCount == 3) eventType = GDK_3BUTTON_PRESS; else eventType = GDK_BUTTON_PRESS; GdkEvent* event = createMouseButtonEvent(eventType, button, wkModifiers); sendOrQueueEvent(event); }
void Application::processEvents(Context& context) { SDL_Event event; while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_KEYDOWN: case SDL_KEYUP: keyEvent(context, createKeyPressEvent(event.key)); break; case SDL_TEXTINPUT: textInputEvent(context, TextInputEvent(event.text.text)); break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: mouseButtonEvent(context, createMouseButtonEvent(event.button, video.getScreen().getClientHeight())); break; case SDL_MOUSEMOTION: mouseMotionEvent(context, createMouseMotionEvent(event.motion, video.getScreen().getClientHeight())); break; case SDL_MOUSEWHEEL: mouseWheelEvent(context, MouseWheelEvent(0, 0, event.wheel.x, event.wheel.y)); break; case SDL_QUIT: requestClose = true; break; default: break; } } }
void EventSenderProxy::mouseUp(unsigned button, WKEventModifiers wkModifiers) { m_clickButton = kWKEventMouseButtonNoButton; GdkEvent* event = createMouseButtonEvent(GDK_BUTTON_RELEASE, button, wkModifiers); sendOrQueueEvent(event); if (m_mouseButtonCurrentlyDown == event->button.button) m_mouseButtonCurrentlyDown = 0; m_clickPosition = m_position; m_clickTime = GDK_CURRENT_TIME; }
vector<EventPtr> SDLWindow::pollEvents() { SDL_Event sdlEvent; vector<EventPtr> events; int numEvents = 0; while (SDL_PollEvent(&sdlEvent)) { numEvents++; EventPtr pNewEvent; switch (sdlEvent.type) { case SDL_MOUSEMOTION: { pNewEvent = createMouseEvent(Event::CURSOR_MOTION, sdlEvent, MouseEvent::NO_BUTTON); CursorEventPtr pNewCursorEvent = boost::dynamic_pointer_cast<CursorEvent>(pNewEvent); if (!events.empty()) { CursorEventPtr pLastEvent = boost::dynamic_pointer_cast<CursorEvent>(events.back()); if (pLastEvent && *pNewCursorEvent == *pLastEvent) { pNewEvent = EventPtr(); } } } break; case SDL_MOUSEBUTTONDOWN: pNewEvent = createMouseButtonEvent(Event::CURSOR_DOWN, sdlEvent); break; case SDL_MOUSEBUTTONUP: pNewEvent = createMouseButtonEvent(Event::CURSOR_UP, sdlEvent); break; case SDL_JOYAXISMOTION: // pNewEvent = createAxisEvent(sdlEvent)); break; case SDL_JOYBUTTONDOWN: // pNewEvent = createButtonEvent(Event::BUTTON_DOWN, sdlEvent)); break; case SDL_JOYBUTTONUP: // pNewEvent = createButtonEvent(Event::BUTTON_UP, sdlEvent)); break; case SDL_KEYDOWN: pNewEvent = createKeyEvent(Event::KEY_DOWN, sdlEvent); break; case SDL_KEYUP: pNewEvent = createKeyEvent(Event::KEY_UP, sdlEvent); break; case SDL_QUIT: pNewEvent = EventPtr(new Event(Event::QUIT, Event::NONE)); break; case SDL_VIDEORESIZE: break; case SDL_SYSWMEVENT: { #if defined(HAVE_XI2_1) || defined(HAVE_XI2_2) SDL_SysWMmsg* pMsg = sdlEvent.syswm.msg; AVG_ASSERT(pMsg->subsystem == SDL_SYSWM_X11); if (m_pXIMTInputDevice) { m_pXIMTInputDevice->handleXIEvent(pMsg->event.xevent); } #endif } break; default: // Ignore unknown events. break; } if (pNewEvent) { events.push_back(pNewEvent); } } if (numEvents > 124) { AVG_TRACE(Logger::category::EVENTS, Logger::severity::WARNING, "SDL Event queue full, dropping events."); } return events; }