static void handle_event( XEvent *event ) { uint button; XKeyEvent kev; switch( event->type - dga.ev_base ) { case ButtonPress: button = ((XDGAButtonEvent*)event)->button; if( button < 4) /* 1..3 */ mouse_but_event( kMouseEvent_Down1 << (button-1) ); break; case ButtonRelease: button = ((XDGAButtonEvent*)event)->button; if( button < 4) mouse_but_event( kMouseEvent_Up1 << (button-1) ); break; case MotionNotify: mouse_move( ((XDGAMotionEvent*)event)->dx, ((XDGAMotionEvent*)event)->dy ); break; case KeyPress: case KeyRelease: XDGAKeyEventToXKeyEvent( (XDGAKeyEvent*)event, &kev ); kev.type = event->type - dga.ev_base; x11_key_event( &kev ); break; } }
static inline void prepare_key_event( gii_input *inp, gii_event *giiev, int keycode, XDGAEvent *dgaev) { xdga_priv *priv = XDGA_PRIV(inp); XComposeStatus compose_status; XKeyEvent xkeyev; KeySym xsym; giiev->any.size = sizeof(gii_key_event); giiev->any.origin = priv->origin[XDGA_DEV_KEY]; giiev->key.button = keycode - 8; XDGAKeyEventToXKeyEvent((XDGAKeyEvent*)dgaev, &xkeyev); XLookupString(&xkeyev, NULL, 0, &xsym, &compose_status); giiev->key.sym = basic_trans(xsym, 0); giiev->key.label = basic_trans(XLookupKeysym(&xkeyev, 0), 1); /* _gii_xev_trans( &xkeyev, &giiev.key, &compose_status, 0, &oldcode_dummy ); */ }
ACTION kbd_interface_routine(PLAYER *player, int edit_mode) { XEvent evnt; ACTION act = ACT_NONE; int evnt_count; ACTION (*process_key_fun)(PLAYER *, XKeyEvent *); #ifdef USE_MOUSE ACTION (*process_button_fun)(PLAYER *, XButtonEvent *); #endif /* evnt_count = XPending(disp); */ evnt_count = XEventsQueued(disp, QueuedAfterReading); process_key_fun = edit_mode ? process_key_event_edit : process_key_event; #ifdef USE_MOUSE process_button_fun = edit_mode ? process_button_event_edit : process_button_event; #endif while (--evnt_count >= 0) { XNextEvent(disp, &evnt); #ifdef USE_XDGA if (dgaModeCurrent >= 0) { if (evnt.type == (dgaEventBase + KeyPress)) { if (act == ACT_NONE) { XKeyEvent xk; XDGAKeyEventToXKeyEvent((XDGAKeyEvent *) &evnt, &xk); act = (*process_key_fun)(player, &xk); } } # ifdef USE_MOUSE else if (MouseInUse && evnt.type == (dgaEventBase + ButtonPress)) { if (act == ACT_NONE) { XButtonEvent xb; ConvertXDGAButtonEventToXButtonEvent((XDGAButtonEvent *) &evnt, &xb); act = (*process_button_fun)(player, &xb); } } # endif } else #endif if (evnt.type == KeyPress) { if (act == ACT_NONE && !XFilterEvent(&evnt, wnd)) act = (*process_key_fun)(player, (XKeyEvent *)&evnt); } # ifdef USE_MOUSE else if (MouseInUse && evnt.type == ButtonPress) { if (act == ACT_NONE && !XFilterEvent(&evnt, wnd)) { XButtonEvent *bevnt = (XButtonEvent *)&evnt; if (bevnt->button == 1 && game.level == ScoresLevel) { act = process_top_screen_coordinate(bevnt->x, bevnt->y); } else act = (*process_button_fun)(player, bevnt); } } #endif else if (process_nonkey_event(player, &evnt)) { act = ACT_QUIT; break; } } return act; }
/* _xdga2_handle_input: * Handles DGA events pending from queue. */ static void _xdga2_handle_input(void) { int i, events, events_queued; static XDGAEvent event[DGA_MAX_EVENTS + 1]; XDGAEvent *cur_event; XKeyEvent key; int dx, dy, dz = 0; static int mouse_buttons = 0; if (_xwin.display == 0) return; XSync(_xwin.display, False); /* How much events are available in the queue. */ events = events_queued = XEventsQueued(_xwin.display, QueuedAlready); if (events <= 0) return; /* Limit amount of events we read at once. */ if (events > DGA_MAX_EVENTS) events = DGA_MAX_EVENTS; /* Read pending events. */ for (i = 0; i < events; i++) XNextEvent(_xwin.display, (XEvent *)&event[i]); /* see xwin.c */ if (events_queued > events && event[i - 1].type == dga_event_base+KeyRelease) { XNextEvent(_xwin.display, (XEvent *)&event[i]); events++; } /* Process all events. */ for (i = 0; i < events; i++) { /* see xwin.c */ if (event[i].type == dga_event_base+KeyRelease && (i + 1) < events) { if (event[i + 1].type == dga_event_base+KeyPress) { if (event[i].xkey.keycode == event[i + 1].xkey.keycode && event[i].xkey.time == event[i + 1].xkey.time) continue; } } cur_event = &event[i]; switch (cur_event->type - dga_event_base) { case KeyPress: XDGAKeyEventToXKeyEvent(&cur_event->xkey, &key); key.type -= dga_event_base; _xwin_keyboard_handler(&key, TRUE); break; case KeyRelease: XDGAKeyEventToXKeyEvent(&cur_event->xkey, &key); key.type -= dga_event_base; _xwin_keyboard_handler(&key, TRUE); break; case ButtonPress: if (cur_event->xbutton.button == Button1) mouse_buttons |= 1; else if (cur_event->xbutton.button == Button3) mouse_buttons |= 2; else if (cur_event->xbutton.button == Button2) mouse_buttons |= 4; else if (cur_event->xbutton.button == Button4) dz = 1; else if (cur_event->xbutton.button == Button5) dz = -1; if (_xwin_mouse_interrupt) (*_xwin_mouse_interrupt)(0, 0, dz, 0, mouse_buttons); break; case ButtonRelease: if (cur_event->xbutton.button == Button1) mouse_buttons &= ~1; else if (cur_event->xbutton.button == Button3) mouse_buttons &= ~2; else if (cur_event->xbutton.button == Button2) mouse_buttons &= ~4; if (_xwin_mouse_interrupt) (*_xwin_mouse_interrupt)(0, 0, 0, 0, mouse_buttons); break; case MotionNotify: dx = cur_event->xmotion.dx; dy = cur_event->xmotion.dy; if (((dx != 0) || (dy != 0)) && _xwin_mouse_interrupt) { (*_xwin_mouse_interrupt)(dx, dy, 0, 0, mouse_buttons); } break; default: break; } } }