/* * handle X11 events * here we handle key, mouse, repaint and window sizing events */ static void X11_HandleEvents(GF_VideoOutput *vout) { GF_Event evt; Window the_window; XComposeStatus state; X11VID(); unsigned char keybuf[32]; XEvent xevent; the_window = xWindow->fullscreen ? xWindow->full_wnd : xWindow->wnd; XSync(xWindow->display, False); while (X11_Pending(xWindow->display)) { XNextEvent(xWindow->display, &xevent); if (xevent.xany.window!=the_window) continue; switch (xevent.type) { /* * X11 window resized event * must inform GPAC */ case ConfigureNotify: if ((unsigned int) xevent.xconfigure.width != xWindow->w_width || (unsigned int) xevent.xconfigure.height != xWindow->w_height) { evt.type = GF_EVENT_SIZE; xWindow->w_width = evt.size.width = xevent.xconfigure.width; xWindow->w_height = evt.size.height = xevent.xconfigure.height; vout->on_event(vout->evt_cbk_hdl, &evt); } else { evt.type = GF_EVENT_MOVE; evt.move.x = xevent.xconfigure.x; evt.move.y = xevent.xconfigure.y; vout->on_event(vout->evt_cbk_hdl, &evt); } break; /* * Windows need repaint */ case Expose: if (xevent.xexpose.count > 0) break; evt.type = GF_EVENT_REFRESH; vout->on_event (vout->evt_cbk_hdl, &evt); break; /* Have we been requested to quit (or another client message?) */ case ClientMessage: if ( (xevent.xclient.format == 32) && (xevent.xclient.data.l[0] == xWindow->WM_DELETE_WINDOW) ) { evt.type = GF_EVENT_QUIT; vout->on_event(vout->evt_cbk_hdl, &evt); } break; case KeyPress: case KeyRelease: x11_translate_key(XKeycodeToKeysym (xWindow->display, xevent.xkey.keycode, 0), &evt.key); evt.type = (xevent.type ==KeyPress) ? GF_EVENT_KEYDOWN : GF_EVENT_KEYUP; vout->on_event (vout->evt_cbk_hdl, &evt); if (xevent.type ==KeyPress) { s32 len; len = XLookupString (&xevent.xkey, (char *) keybuf, sizeof(keybuf), NULL, &state); if ((len>0) && (len<5)) { utf8_to_ucs4 (& evt.character.unicode_char, len, keybuf); evt.type = GF_EVENT_TEXTINPUT; vout->on_event (vout->evt_cbk_hdl, &evt); } } break; case ButtonPress: if (!xWindow->fullscreen && !xWindow->has_focus) { xWindow->has_focus = 1; XSetInputFocus(xWindow->display, xWindow->wnd, RevertToParent, CurrentTime); } case ButtonRelease: // last_mouse_move = xevent.xbutton.time; evt.mouse.x = xevent.xbutton.x; evt.mouse.y = xevent.xbutton.y; evt.type = (xevent.type == ButtonRelease) ? GF_EVENT_MOUSEUP : GF_EVENT_MOUSEDOWN; switch (xevent.xbutton.button) { case Button1: evt.mouse.button = GF_MOUSE_LEFT; vout->on_event (vout->evt_cbk_hdl, &evt); break; case Button2: evt.mouse.button = GF_MOUSE_MIDDLE; vout->on_event (vout->evt_cbk_hdl, &evt); break; case Button3: evt.mouse.button = GF_MOUSE_RIGHT; vout->on_event (vout->evt_cbk_hdl, &evt); break; case Button4: evt.type = GF_EVENT_MOUSEWHEEL; evt.mouse.wheel_pos = FIX_ONE; vout->on_event(vout->evt_cbk_hdl, &evt); break; case Button5: evt.type = GF_EVENT_MOUSEWHEEL; evt.mouse.wheel_pos = -FIX_ONE; vout->on_event(vout->evt_cbk_hdl, &evt); break; } if (!xWindow->fullscreen && (xevent.type==ButtonPress) ) XSetInputFocus(xWindow->display, xWindow->wnd, RevertToNone, CurrentTime); break; case MotionNotify: evt.type = GF_EVENT_MOUSEMOVE; evt.mouse.x = xevent.xmotion.x; evt.mouse.y = xevent.xmotion.y; vout->on_event (vout->evt_cbk_hdl, &evt); break; case PropertyNotify: break; case MapNotify: break; case CirculateNotify: break; case UnmapNotify: break; case ReparentNotify: break; case FocusOut: if (!xWindow->fullscreen) xWindow->has_focus = 0; break; case FocusIn: if (!xWindow->fullscreen) xWindow->has_focus = 1; break; case DestroyNotify: evt.type = GF_EVENT_QUIT; vout->on_event(vout->evt_cbk_hdl, &evt); break; default: break; } } }
//----------------------------------------------------------------------------- void event_loop() { XEvent event; OSEventParameter data_button[4] = {0, 0, 0, 0}; OSEventParameter data_key[4] = {0, 0, 0, 0}; while (XPending(display)) { XNextEvent(display, &event); switch (event.type) { case ConfigureNotify: { window_x = event.xconfigure.x; window_y = event.xconfigure.y; window_width = event.xconfigure.width; window_height = event.xconfigure.height; break; } case ButtonPress: case ButtonRelease: { OSEventType oset_type = event.type == ButtonPress ? OSET_BUTTON_PRESS : OSET_BUTTON_RELEASE; data_button[0].int_value = event.xbutton.x; data_button[1].int_value = event.xbutton.y; switch (event.xbutton.button) { case Button1: { data_button[2].int_value = 0; push_event(oset_type, data_button[0], data_button[1], data_button[2], data_button[3]); break; } case Button2: { data_button[2].int_value = 1; push_event(oset_type, data_button[0], data_button[1], data_button[2], data_button[3]); break; } case Button3: { data_button[2].int_value = 2; push_event(oset_type, data_button[0], data_button[1], data_button[2], data_button[3]); break; } } break; } case MotionNotify: { push_event(OSET_MOTION_NOTIFY, data_button[0], data_button[1], data_button[2], data_button[3]); break; } case KeyPress: case KeyRelease: { char string[4] = {0, 0, 0, 0}; int32_t len = -1; KeySym key; len = XLookupString(&event.xkey, string, 4, &key, NULL); Key kc = x11_translate_key(key); // Check if any modifier key is pressed or released int32_t modifier_mask = 0; if (kc == KC_LSHIFT || kc == KC_RSHIFT) { (event.type == KeyPress) ? modifier_mask |= MK_SHIFT : modifier_mask &= ~MK_SHIFT; } else if (kc == KC_LCONTROL || kc == KC_RCONTROL) { (event.type == KeyPress) ? modifier_mask |= MK_CTRL : modifier_mask &= ~MK_CTRL; } else if (kc == KC_LALT || kc == KC_RALT) { (event.type == KeyPress) ? modifier_mask |= MK_ALT : modifier_mask &= ~MK_ALT; } OSEventType oset_type = event.type == KeyPress ? OSET_KEY_PRESS : OSET_KEY_RELEASE; data_key[0].int_value = ((int32_t)kc); data_key[1].int_value = modifier_mask; push_event(oset_type, data_key[0], data_key[1], data_key[2], data_key[3]); // // Text input part // if (event.type == KeyPress && len > 0) // { // //crownEvent.event_type = ET_TEXT; // //crownEvent.text.type = TET_TEXT_INPUT; // strncpy(keyboardEvent.text, string, 4); // if (mListener) // { // mListener->TextInput(keyboardEvent); // } // } break; } case KeymapNotify: { XRefreshKeyboardMapping(&event.xmapping); break; } default: { break; } } } }
void pump_events() { while (XPending(m_x11_display)) { XEvent event; XNextEvent(m_x11_display, &event); switch (event.type) { case ClientMessage: { if ((Atom)event.xclient.data.l[0] == m_wm_delete_message) { m_queue.push_exit_event(0); } break; } case ConfigureNotify: { m_queue.push_metrics_event(event.xconfigure.x, event.xconfigure.y, event.xconfigure.width, event.xconfigure.height); break; } case ButtonPress: case ButtonRelease: { MouseButton::Enum mb; switch (event.xbutton.button) { case Button1: mb = MouseButton::LEFT; break; case Button2: mb = MouseButton::MIDDLE; break; case Button3: mb = MouseButton::RIGHT; break; default: mb = MouseButton::NONE; break; } if (mb != MouseButton::NONE) { m_queue.push_mouse_event(event.xbutton.x, event.xbutton.y, mb, event.type == ButtonPress); } break; } case MotionNotify: { m_queue.push_mouse_event(event.xmotion.x, event.xmotion.y); break; } case KeyPress: case KeyRelease: { KeySym keysym = XLookupKeysym(&event.xkey, 0); KeyboardButton::Enum kb = x11_translate_key(keysym); // Check if any modifier key is pressed or released int32_t modifier_mask = 0; if (kb == KeyboardButton::LSHIFT || kb == KeyboardButton::RSHIFT) { (event.type == KeyPress) ? modifier_mask |= ModifierButton::SHIFT : modifier_mask &= ~ModifierButton::SHIFT; } else if (kb == KeyboardButton::LCONTROL || kb == KeyboardButton::RCONTROL) { (event.type == KeyPress) ? modifier_mask |= ModifierButton::CTRL : modifier_mask &= ~ModifierButton::CTRL; } else if (kb == KeyboardButton::LALT || kb == KeyboardButton::RALT) { (event.type == KeyPress) ? modifier_mask |= ModifierButton::ALT : modifier_mask &= ~ModifierButton::ALT; } m_queue.push_keyboard_event(modifier_mask, kb, event.type == KeyPress); break; } case KeymapNotify: { XRefreshKeyboardMapping(&event.xmapping); break; } default: { break; } } } }
void pump_events() { while (XPending(_x11_display)) { XEvent event; XNextEvent(_x11_display, &event); switch (event.type) { case ClientMessage: { if ((Atom)event.xclient.data.l[0] == _wm_delete_message) { _queue.push_exit_event(0); } break; } case ConfigureNotify: { _queue.push_metrics_event(event.xconfigure.x, event.xconfigure.y, event.xconfigure.width, event.xconfigure.height); break; } case ButtonPress: case ButtonRelease: { if (event.xbutton.button == Button4 || event.xbutton.button == Button5) { _queue.push_mouse_event(event.xbutton.x, event.xbutton.y, event.xbutton.button == Button4 ? 1.0f : -1.0f); break; } MouseButton::Enum mb; switch (event.xbutton.button) { case Button1: mb = MouseButton::LEFT; break; case Button2: mb = MouseButton::MIDDLE; break; case Button3: mb = MouseButton::RIGHT; break; default: mb = MouseButton::NONE; break; } if (mb != MouseButton::NONE) { _queue.push_mouse_event(event.xbutton.x, event.xbutton.y, mb, event.type == ButtonPress); } break; } case MotionNotify: { _queue.push_mouse_event(event.xmotion.x, event.xmotion.y); break; } case KeyPress: case KeyRelease: { KeySym keysym = XLookupKeysym(&event.xkey, 0); KeyboardButton::Enum kb = x11_translate_key(keysym); _queue.push_keyboard_event(kb, event.type == KeyPress); break; } case KeymapNotify: { XRefreshKeyboardMapping(&event.xmapping); break; } default: { break; } } } }