[Xcb] [PATCH 11/19] Xephyr: use xcb for event handling

Ian Osgood iano at quirkster.com
Wed Oct 20 10:50:17 PDT 2010


On Oct 20, 2010, at 10:11 AM, Julien Cristau wrote:

> No event compression though.
> 
> Reviewed-by: Mikhail Gusarov <dottedmag at dottedmag.net>
> Signed-off-by: Julien Cristau <jcristau at debian.org>
> ---
> hw/kdrive/ephyr/hostx.c |   83 ++++++++++++++++++++++++++++------------------
> 1 files changed, 50 insertions(+), 33 deletions(-)
> 
> diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c
> index 98a0a11..f6f7b9a 100644
> --- a/hw/kdrive/ephyr/hostx.c
> +++ b/hw/kdrive/ephyr/hostx.c
> @@ -989,26 +989,23 @@ out:
> int
> hostx_get_event(EphyrHostXEvent *ev)
> {
> -  XEvent      xev;
> +  xcb_generic_event_t *xev;
>   static int  grabbed_screen = -1;
>   static xcb_key_symbols_t *keysyms;
> 
>   if (!keysyms)
> 	  keysyms = xcb_key_symbols_alloc(HostX.conn);
> 
> -  if (XPending(HostX.dpy))
> +  xev = xcb_poll_for_event(HostX.conn);
> +  if (xev)
>     {
> -      XNextEvent(HostX.dpy, &xev);
> -
> -      switch (xev.type) 
> +      switch (xev->response_type)

I think you want "switch (xev->response_type & 0x7f)" to mask off the client event flag. There is a macro for that in one of the utility headers.

> 	{
> -	case Expose:
> -	  /* Not so great event compression, but works ok */
> -	  while (XCheckTypedWindowEvent(HostX.dpy, xev.xexpose.window,
> -					Expose, &xev));
> +	case XCB_EXPOSE:
> 	  {
> +	    xcb_expose_event_t *expose = (xcb_expose_event_t *)xev;
> 	    struct EphyrHostScreen *host_screen =
> -                host_screen_from_window (xev.xexpose.window);
> +                host_screen_from_window (expose->window);
>             if (host_screen)
>               {
>                 hostx_paint_rect (host_screen->info, 0, 0, 0, 0,
> @@ -1019,56 +1016,71 @@ hostx_get_event(EphyrHostXEvent *ev)
>               {
>                 EPHYR_LOG_ERROR ("failed to get host screen\n");
>                 ev->type = EPHYR_EV_EXPOSE;
> -                ev->data.expose.window = xev.xexpose.window;
> +                ev->data.expose.window = expose->window;
> +		free(xev);
>                 return 1;
>               }
> 	  }
> +	  free(xev);
> 	  return 0;
> 
> -	case MotionNotify:
> +	case XCB_MOTION_NOTIFY:
> 	  {
> +	    xcb_motion_notify_event_t *motion = (xcb_motion_notify_event_t *)xev;
> 	    struct EphyrHostScreen *host_screen =
> -                host_screen_from_window (xev.xmotion.window);
> +                host_screen_from_window (motion->event);
> 
> 	    ev->type = EPHYR_EV_MOUSE_MOTION;
> -	    ev->data.mouse_motion.x = xev.xmotion.x;
> -	    ev->data.mouse_motion.y = xev.xmotion.y;
> -	    ev->data.mouse_motion.window = xev.xmotion.window;
> +	    ev->data.mouse_motion.x = motion->event_x;
> +	    ev->data.mouse_motion.y = motion->event_y;
> +	    ev->data.mouse_motion.window = motion->event;
> 	    ev->data.mouse_motion.screen = (host_screen ? host_screen->mynum : -1);
> 	  }
> +	  free(xev);
> 	  return 1;
> 
> -	case ButtonPress:
> +	case XCB_BUTTON_PRESS:
> +	  {
> +	  xcb_button_press_event_t *button = (xcb_button_press_event_t *)xev;
> 	  ev->type = EPHYR_EV_MOUSE_PRESS;
> -	  ev->key_state = xev.xkey.state;
> +	  ev->key_state = button->state;
> 	  /* 
> 	   * This is a bit hacky. will break for button 5 ( defined as 0x10 )
>            * Check KD_BUTTON defines in kdrive.h 
> 	   */
> -	  ev->data.mouse_down.button_num = 1<<(xev.xbutton.button-1);
> +	  ev->data.mouse_down.button_num = 1<<(button->detail-1);
> +	  free(xev);
> 	  return 1;
> +	  }
> 
> -	case ButtonRelease:
> +	case XCB_BUTTON_RELEASE:
> +	  {
> +	  xcb_button_release_event_t *button = (xcb_button_release_event_t *)xev;
> 	  ev->type = EPHYR_EV_MOUSE_RELEASE;
> -	  ev->key_state = xev.xkey.state;
> -	  ev->data.mouse_up.button_num = 1<<(xev.xbutton.button-1);
> +	  ev->key_state = button->state;
> +	  ev->data.mouse_up.button_num = 1<<(button->detail-1);
> +	  free(xev);
> 	  return 1;
> +	  }
> 
> -	case KeyPress:
> +	case XCB_KEY_PRESS:
> 	  {
> +	    xcb_key_press_event_t *key = (xcb_key_press_event_t *)xev;
> 	    ev->type = EPHYR_EV_KEY_PRESS;
> -	    ev->key_state = xev.xkey.state;
> -	    ev->data.key_down.scancode = xev.xkey.keycode;  
> +	    ev->key_state = key->state;
> +	    ev->data.key_down.scancode = key->detail;
> +	    free(xev);
> 	    return 1;
> 	  }
> -	case KeyRelease:
> -
> -	  if ((xcb_key_symbols_get_keysym(keysyms,xev.xkey.keycode,0) == XK_Shift_L
> -	       || xcb_key_symbols_get_keysym(keysyms,xev.xkey.keycode,0) == XK_Shift_R)
> -	      && (xev.xkey.state & XCB_MOD_MASK_CONTROL))
> +	case XCB_KEY_RELEASE:
> +	  {
> +	  xcb_key_release_event_t *key = (xcb_key_release_event_t *)xev;
> +	  if ((xcb_key_symbols_get_keysym(keysyms,key->detail,0) == XK_Shift_L
> +	       || xcb_key_symbols_get_keysym(keysyms,key->detail,0) == XK_Shift_R)
> +	      && (key->state & XCB_MOD_MASK_CONTROL))
> 	    {
> 	      struct EphyrHostScreen *host_screen =
> -                  host_screen_from_window (xev.xexpose.window);
> +                  host_screen_from_window (key->event);
> 
> 	      if (grabbed_screen != -1)
> 		{
> @@ -1126,15 +1138,20 @@ hostx_get_event(EphyrHostXEvent *ev)
>            * kdrive all togeather. 
>  	   */
> 	  ev->type = EPHYR_EV_KEY_RELEASE;
> -	  ev->key_state = xev.xkey.state;
> -	  ev->data.key_up.scancode = xev.xkey.keycode;
> +	  ev->key_state = key->state;
> +	  ev->data.key_up.scancode = key->detail;
> +	  free(xev);
> 	  return 1;
> +	  }
> 
> 	default:
> 	  break;
> 
> 	}
> +    } else {
> +      xcb_flush(HostX.conn);
>     }
> +  free(xev);
>   return 0;
> }
> 
> -- 
> 1.7.1


In some of the other patches I saw references to "xlib" in some comments.  You probably want to grep for obsolete terminology like that.

Ian




More information about the Xcb mailing list