[PATCH v2 weston 2/6] xwayland: add simple xcb-cursor hook based on libXcursor

Kristian Høgsberg hoegsberg at gmail.com
Mon Jul 16 09:06:40 PDT 2012


On Mon, Jul 16, 2012 at 05:32:23PM +0300, Tiago Vignatti wrote:
> It's in fact based on the core of libXcursor, which doesn't bring any Xlib
> dependency.
> 
> Signed-off-by: Tiago Vignatti <tiago.vignatti at intel.com>
> ---
> v2: no file split; removed a bunch of xcb dependencies; style nit-picking
> fixed.

Looks good, thanks.
Kristian

>  configure.ac                  |    2 +-
>  src/xwayland/window-manager.c |   77 +++++++++++++++++++++++++++++++++++++++--
>  src/xwayland/xwayland.h       |    3 +-
>  3 files changed, 78 insertions(+), 4 deletions(-)
> 
> diff --git a/configure.ac b/configure.ac
> index 6945652..6c27cd4 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -42,7 +42,7 @@ AC_ARG_ENABLE(xwayland, [  --enable-xwayland],,
>  	      enable_xwayland=yes)
>  AM_CONDITIONAL(ENABLE_XWAYLAND, test x$enable_xwayland = xyes)
>  if test x$enable_xwayland = xyes; then
> -  PKG_CHECK_MODULES([XWAYLAND], xcb xcb-xfixes cairo-xcb)
> +  PKG_CHECK_MODULES([XWAYLAND], xcb xcb-xfixes xcursor cairo-xcb)
>    AC_DEFINE([BUILD_XWAYLAND], [1], [Build the X server launcher])
>  
>    AC_ARG_WITH(xserver-path, AS_HELP_STRING([--with-xserver-path=PATH],
> diff --git a/src/xwayland/window-manager.c b/src/xwayland/window-manager.c
> index b922e9b..738e8a2 100644
> --- a/src/xwayland/window-manager.c
> +++ b/src/xwayland/window-manager.c
> @@ -31,6 +31,7 @@
>  #include <errno.h>
>  #include <unistd.h>
>  #include <signal.h>
> +#include <X11/Xcursor/Xcursor.h>
>  
>  #include "xwayland.h"
>  
> @@ -140,6 +141,77 @@ get_atom_name(xcb_connection_t *c, xcb_atom_t atom)
>  	return buffer;
>  }
>  
> +static xcb_cursor_t
> +xcb_cursor_image_load_cursor(struct weston_wm *wm, const XcursorImage *img)
> +{
> +	xcb_connection_t *c = wm->conn;
> +	xcb_screen_iterator_t s = xcb_setup_roots_iterator(xcb_get_setup(c));
> +	xcb_screen_t *screen = s.data;
> +	xcb_gcontext_t gc;
> +	xcb_pixmap_t pix;
> +	xcb_render_picture_t pic;
> +	xcb_cursor_t cursor;
> +	int stride = img->width * 4;
> +
> +	pix = xcb_generate_id(c);
> +	xcb_create_pixmap(c, 32, pix, screen->root, img->width, img->height);
> +
> +	pic = xcb_generate_id(c);
> +	xcb_render_create_picture(c, pic, pix, wm->render_format_depth_32.id,
> +				  0, 0);
> +
> +	gc = xcb_generate_id(c);
> +	xcb_create_gc(c, gc, pix, 0, 0);
> +
> +	xcb_put_image(c, XCB_IMAGE_FORMAT_Z_PIXMAP, pix, gc,
> +		      img->width, img->height, 0, 0, 0, 32,
> +		      stride * img->height, (uint8_t *) img->pixels);
> +	xcb_free_gc(c, gc);
> +
> +	cursor = xcb_generate_id(c);
> +	xcb_render_create_cursor(c, cursor, pic, img->xhot, img->yhot);
> +
> +	xcb_render_free_picture(c, pic);
> +	xcb_free_pixmap(c, pix);
> +
> +	return cursor;
> +}
> +
> +static xcb_cursor_t
> +xcb_cursor_images_load_cursor(struct weston_wm *wm, const XcursorImages *images)
> +{
> +	/* TODO: treat animated cursors as well */
> +	if (images->nimage != 1)
> +		return -1;
> +
> +	return xcb_cursor_image_load_cursor(wm, images->images[0]);
> +}
> +
> +static xcb_cursor_t
> +xcb_cursor_library_load_cursor(struct weston_wm *wm, const char *file)
> +{
> +	xcb_cursor_t cursor;
> +	XcursorImages *images;
> +	char *v = NULL;
> +	int size = 0;
> +
> +	if (!file)
> +		return 0;
> +
> +	v = getenv ("XCURSOR_SIZE");
> +	if (v)
> +		size = atoi(v);
> +
> +	if (!size)
> +		size = 32;
> +
> +	images = XcursorLibraryLoadImages (file, NULL, size);
> +	cursor = xcb_cursor_images_load_cursor (wm, images);
> +	XcursorImagesDestroy (images);
> +
> +	return cursor;
> +}
> +
>  void
>  dump_property(struct weston_wm *wm,
>  	      xcb_atom_t property, xcb_get_property_reply_t *reply)
> @@ -528,7 +600,7 @@ weston_wm_handle_map_request(struct weston_wm *wm, xcb_generic_event_t *event)
>  		cairo_xcb_surface_create_with_xrender_format(wm->conn,
>  							     wm->screen,
>  							     window->frame_id,
> -							     &wm->render_format,
> +							     &wm->render_format_depth_24,
>  							     width, height);
>  
>  	hash_table_insert(wm->window_hash, window->frame_id, window);
> @@ -1085,7 +1157,8 @@ wxs_wm_get_resources(struct weston_wm *wm)
>  
>  	free(xfixes_reply);
>  
> -	wm->render_format = *(find_depth(wm->conn, 24));
> +	wm->render_format_depth_24 = *(find_depth(wm->conn, 24));
> +	wm->render_format_depth_32 = *(find_depth(wm->conn, 32));
>  }
>  
>  static void
> diff --git a/src/xwayland/xwayland.h b/src/xwayland/xwayland.h
> index 438b7be..c912214 100644
> --- a/src/xwayland/xwayland.h
> +++ b/src/xwayland/xwayland.h
> @@ -58,7 +58,8 @@ struct weston_wm {
>  	xcb_window_t wm_window;
>  	struct weston_wm_window *focus_window;
>  	struct theme *theme;
> -	xcb_render_pictforminfo_t render_format;
> +	xcb_render_pictforminfo_t render_format_depth_24;
> +	xcb_render_pictforminfo_t render_format_depth_32;
>  	struct wl_listener activate_listener;
>  
>  	xcb_window_t selection_window;
> -- 
> 1.7.9.5
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list