/** The client message event handler. * \param ev The event. */ static void event_handle_clientmessage(xcb_client_message_event_t *ev) { /* check for startup notification messages */ if(sn_xcb_display_process_event(globalconf.sndisplay, (xcb_generic_event_t *) ev)) return; if(ev->type == WM_CHANGE_STATE) { client_t *c; if((c = client_getbywin(ev->window)) && ev->format == 32 && ev->data.data32[0] == XCB_ICCCM_WM_STATE_ICONIC) { lua_State *L = globalconf_get_lua_State(); luaA_object_push(L, c); client_set_minimized(L, -1, true); lua_pop(L, 1); } } else if(ev->type == _XEMBED) xembed_process_client_message(ev); else if(ev->type == _NET_SYSTEM_TRAY_OPCODE) systray_process_client_message(ev); else ewmh_process_client_message(ev); }
/** * Process X11 events in the main-loop (gui-thread) of the application. */ static gboolean main_loop_x11_event_handler ( xcb_generic_event_t *ev, G_GNUC_UNUSED gpointer data ) { if ( ev == NULL ) { int status = xcb_connection_has_error ( xcb->connection ); fprintf ( stderr, "The XCB connection to X server had a fatal error: %d\n", status ); g_main_loop_quit ( main_loop ); return G_SOURCE_REMOVE; } uint8_t type = ev->response_type & ~0x80; if ( type == xkb.first_event ) { switch ( ev->pad0 ) { case XCB_XKB_MAP_NOTIFY: xkb_state_unref ( xkb.state ); xkb_keymap_unref ( xkb.keymap ); xkb.keymap = xkb_x11_keymap_new_from_device ( xkb.context, xcb->connection, xkb.device_id, 0 ); xkb.state = xkb_x11_state_new_from_device ( xkb.keymap, xcb->connection, xkb.device_id ); break; case XCB_XKB_STATE_NOTIFY: { xcb_xkb_state_notify_event_t *ksne = (xcb_xkb_state_notify_event_t *) ev; xkb_state_update_mask ( xkb.state, ksne->baseMods, ksne->latchedMods, ksne->lockedMods, ksne->baseGroup, ksne->latchedGroup, ksne->lockedGroup ); break; } } return G_SOURCE_CONTINUE; } RofiViewState *state = rofi_view_get_active (); if ( xcb->sndisplay != NULL ) { sn_xcb_display_process_event ( xcb->sndisplay, ev ); } if ( state != NULL ) { rofi_view_itterrate ( state, ev, &xkb ); if ( rofi_view_get_completed ( state ) ) { // This menu is done. rofi_view_finalize ( state ); // cleanup if ( rofi_view_get_active () == NULL ) { teardown ( pfd ); g_main_loop_quit ( main_loop ); } } } return G_SOURCE_CONTINUE; }