Esempio n. 1
0
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;
	}
}
Esempio n. 2
0
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 );
			*/
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
/* _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;
      }
   }
}