[PATCH v2] Secure screenshooter protocol.

Kristian Hoegsberg hoegsberg at gmail.com
Sat Mar 24 11:46:59 PDT 2012


On Fri, Mar 23, 2012 at 04:42:04PM -0600, Scott Moreau wrote:

Thanks, that looks good.
Kristian

> ---
> 
> Changed in this version:  s/screenshot/screenshooter/
> 
>  clients/Makefile.am |    9 +++++----
>  src/screenshooter.c |   40 +++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 44 insertions(+), 5 deletions(-)
> 
> diff --git a/clients/Makefile.am b/clients/Makefile.am
> index eab8939..dd11382 100644
> --- a/clients/Makefile.am
> +++ b/clients/Makefile.am
> @@ -8,7 +8,8 @@ noinst_PROGRAMS =				\
>  
>  libexec_PROGRAMS =				\
>  	$(desktop_shell)			\
> -	$(tablet_shell)
> +	$(tablet_shell)				\
> +	$(screenshooter)
>  
>  if BUILD_SIMPLE_CLIENTS
>  simple_clients_programs =			\
> @@ -31,7 +32,6 @@ terminal = weston-terminal
>  
>  clients_programs =				\
>  	flower					\
> -	screenshot				\
>  	image					\
>  	dnd					\
>  	smoke					\
> @@ -42,6 +42,7 @@ clients_programs =				\
>  
>  desktop_shell = weston-desktop-shell
>  tablet_shell = weston-tablet-shell
> +screenshooter = weston-screenshooter
>  
>  noinst_LIBRARIES = libtoytoolkit.a
>  
> @@ -65,8 +66,8 @@ toolkit_libs =						\
>  flower_SOURCES = flower.c
>  flower_LDADD = $(toolkit_libs)
>  
> -screenshot_SOURCES = screenshot.c screenshooter-protocol.c
> -screenshot_LDADD = $(toolkit_libs)
> +weston_screenshooter_SOURCES = screenshot.c screenshooter-protocol.c
> +weston_screenshooter_LDADD = $(toolkit_libs)
>  
>  weston_terminal_SOURCES = terminal.c
>  weston_terminal_LDADD = $(toolkit_libs) -lutil
> diff --git a/src/screenshooter.c b/src/screenshooter.c
> index 080427b..6748645 100644
> --- a/src/screenshooter.c
> +++ b/src/screenshooter.c
> @@ -22,6 +22,7 @@
>  
>  #include <stdlib.h>
>  #include <string.h>
> +#include <linux/input.h>
>  
>  #include "compositor.h"
>  #include "screenshooter-server-protocol.h"
> @@ -30,6 +31,8 @@ struct screenshooter {
>  	struct wl_object base;
>  	struct weston_compositor *ec;
>  	struct wl_global *global;
> +	struct wl_client *client;
> +	struct weston_process screenshooter_process;
>  };
>  
>  static void
> @@ -81,8 +84,40 @@ static void
>  bind_shooter(struct wl_client *client,
>  	     void *data, uint32_t version, uint32_t id)
>  {
> -	wl_client_add_object(client, &screenshooter_interface,
> +	struct screenshooter *shooter = data;
> +	struct wl_resource *resource;
> +
> +	resource = wl_client_add_object(client, &screenshooter_interface,
>  			     &screenshooter_implementation, id, data);
> +
> +	if (client != shooter->client) {
> +		wl_resource_post_error(resource, WL_DISPLAY_ERROR_INVALID_OBJECT,
> +				       "screenshooter failed: permission denied");
> +		wl_resource_destroy(resource, 0);
> +	}
> +}
> +
> +static void
> +screenshooter_sigchld(struct weston_process *process, int status)
> +{
> +	struct screenshooter *shooter =
> +		container_of(process, struct screenshooter, screenshooter_process);
> +
> +	shooter->client = NULL;
> +}
> +
> +static void
> +screenshooter_binding(struct wl_input_device *device, uint32_t time,
> +		 uint32_t key, uint32_t button, uint32_t axis,
> +		 int32_t state, void *data)
> +{
> +	struct screenshooter *shooter = data;
> +	const char *screenshooter_exe = LIBEXECDIR "/weston-screenshooter";
> +
> +	if (!shooter->client)
> +		shooter->client = weston_client_launch(shooter->ec,
> +					&shooter->screenshooter_process,
> +					screenshooter_exe, screenshooter_sigchld);
>  }
>  
>  struct screenshooter *
> @@ -98,10 +133,13 @@ screenshooter_create(struct weston_compositor *ec)
>  	shooter->base.implementation =
>  		(void(**)(void)) &screenshooter_implementation;
>  	shooter->ec = ec;
> +	shooter->client = NULL;
>  
>  	shooter->global = wl_display_add_global(ec->wl_display,
>  						&screenshooter_interface,
>  						shooter, bind_shooter);
> +	weston_compositor_add_binding(ec, KEY_S, 0, 0, MODIFIER_SUPER,
> +					screenshooter_binding, shooter);
>  
>  	return shooter;
>  }
> -- 
> 1.7.4.1
> 
> _______________________________________________
> 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