static XkbDescPtr get_xkb (ClutterKeymapX11 *keymap_x11) { ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (keymap_x11->backend); if (keymap_x11->max_keycode == 0) XDisplayKeycodes (backend_x11->xdpy, &keymap_x11->min_keycode, &keymap_x11->max_keycode); if (keymap_x11->xkb_desc == NULL) { int flags = XkbKeySymsMask | XkbKeyTypesMask | XkbModifierMapMask | XkbVirtualModsMask; keymap_x11->xkb_desc = XkbGetMap (backend_x11->xdpy, flags, XkbUseCoreKbd); if (G_UNLIKELY (keymap_x11->xkb_desc == NULL)) { g_error ("Failed to get the keymap from XKB"); return NULL; } flags = XkbGroupNamesMask | XkbVirtualModNamesMask; XkbGetNames (backend_x11->xdpy, flags, keymap_x11->xkb_desc); update_modmap (backend_x11->xdpy, keymap_x11); } else if (keymap_x11->xkb_map_serial != backend_x11->keymap_serial) { int flags = XkbKeySymsMask | XkbKeyTypesMask | XkbModifierMapMask | XkbVirtualModsMask; CLUTTER_NOTE (BACKEND, "Updating XKB keymap"); XkbGetUpdatedMap (backend_x11->xdpy, flags, keymap_x11->xkb_desc); flags = XkbGroupNamesMask | XkbVirtualModNamesMask; XkbGetNames (backend_x11->xdpy, flags, keymap_x11->xkb_desc); update_modmap (backend_x11->xdpy, keymap_x11); keymap_x11->xkb_map_serial = backend_x11->keymap_serial; } if (keymap_x11->num_lock_mask == 0) keymap_x11->num_lock_mask = XkbKeysymToModifiers (backend_x11->xdpy, XK_Num_Lock); if (keymap_x11->scroll_lock_mask == 0) keymap_x11->scroll_lock_mask = XkbKeysymToModifiers (backend_x11->xdpy, XK_Scroll_Lock); return keymap_x11->xkb_desc; }
void handle_event(XEvent *ev) { switch(ev->type){ CASE_EVENT(MapRequest) handle_map_request(&(ev->xmaprequest)); break; CASE_EVENT(ConfigureRequest) handle_configure_request(&(ev->xconfigurerequest)); break; CASE_EVENT(UnmapNotify) handle_unmap_notify(&(ev->xunmap)); break; CASE_EVENT(DestroyNotify) handle_destroy_notify(&(ev->xdestroywindow)); break; CASE_EVENT(ClientMessage) handle_client_message(&(ev->xclient)); break; CASE_EVENT(PropertyNotify) handle_property(&(ev->xproperty)); break; CASE_EVENT(FocusIn) handle_focus_in(&(ev->xfocus)); break; CASE_EVENT(FocusOut) handle_focus_out(&(ev->xfocus)); break; CASE_EVENT(EnterNotify) handle_enter_window(ev); break; CASE_EVENT(Expose) handle_expose(&(ev->xexpose)); break; CASE_EVENT(KeyPress) assert(wglobal.input_handler!=NULL); assert(wglobal.input_handler->keyboard!=NULL); wglobal.input_handler->keyboard(ev); break; CASE_EVENT(KeyRelease) assert(wglobal.input_handler!=NULL); assert(wglobal.input_handler->keyboard!=NULL); wglobal.input_handler->keyboard(ev); break; CASE_EVENT(ButtonPress) assert(wglobal.input_handler!=NULL); if(wglobal.input_handler->pointer!=NULL) wglobal.input_handler->pointer(ev); break; CASE_EVENT(ColormapNotify) handle_colormap_notify(&(ev->xcolormap)); break; CASE_EVENT(MappingNotify) XRefreshKeyboardMapping(&(ev->xmapping)); update_modmap(); break; CASE_EVENT(SelectionClear) clear_selection(); break; CASE_EVENT(SelectionNotify) receive_selection(&(ev->xselection)); break; CASE_EVENT(SelectionRequest) send_selection(&(ev->xselectionrequest)); break; } }