Secure screenshooter protocol.
This commit is contained in:
committed by
Kristian Høgsberg
parent
2d7ab82d74
commit
56456d6578
+5
-4
@@ -8,7 +8,8 @@ noinst_PROGRAMS = \
|
|||||||
|
|
||||||
libexec_PROGRAMS = \
|
libexec_PROGRAMS = \
|
||||||
$(desktop_shell) \
|
$(desktop_shell) \
|
||||||
$(tablet_shell)
|
$(tablet_shell) \
|
||||||
|
$(screenshooter)
|
||||||
|
|
||||||
if BUILD_SIMPLE_CLIENTS
|
if BUILD_SIMPLE_CLIENTS
|
||||||
simple_clients_programs = \
|
simple_clients_programs = \
|
||||||
@@ -31,7 +32,6 @@ terminal = weston-terminal
|
|||||||
|
|
||||||
clients_programs = \
|
clients_programs = \
|
||||||
flower \
|
flower \
|
||||||
screenshot \
|
|
||||||
image \
|
image \
|
||||||
dnd \
|
dnd \
|
||||||
smoke \
|
smoke \
|
||||||
@@ -42,6 +42,7 @@ clients_programs = \
|
|||||||
|
|
||||||
desktop_shell = weston-desktop-shell
|
desktop_shell = weston-desktop-shell
|
||||||
tablet_shell = weston-tablet-shell
|
tablet_shell = weston-tablet-shell
|
||||||
|
screenshooter = weston-screenshooter
|
||||||
|
|
||||||
noinst_LIBRARIES = libtoytoolkit.a
|
noinst_LIBRARIES = libtoytoolkit.a
|
||||||
|
|
||||||
@@ -65,8 +66,8 @@ toolkit_libs = \
|
|||||||
flower_SOURCES = flower.c
|
flower_SOURCES = flower.c
|
||||||
flower_LDADD = $(toolkit_libs)
|
flower_LDADD = $(toolkit_libs)
|
||||||
|
|
||||||
screenshot_SOURCES = screenshot.c screenshooter-protocol.c
|
weston_screenshooter_SOURCES = screenshot.c screenshooter-protocol.c
|
||||||
screenshot_LDADD = $(toolkit_libs)
|
weston_screenshooter_LDADD = $(toolkit_libs)
|
||||||
|
|
||||||
weston_terminal_SOURCES = terminal.c
|
weston_terminal_SOURCES = terminal.c
|
||||||
weston_terminal_LDADD = $(toolkit_libs) -lutil
|
weston_terminal_LDADD = $(toolkit_libs) -lutil
|
||||||
|
|||||||
+39
-1
@@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <linux/input.h>
|
||||||
|
|
||||||
#include "compositor.h"
|
#include "compositor.h"
|
||||||
#include "screenshooter-server-protocol.h"
|
#include "screenshooter-server-protocol.h"
|
||||||
@@ -30,6 +31,8 @@ struct screenshooter {
|
|||||||
struct wl_object base;
|
struct wl_object base;
|
||||||
struct weston_compositor *ec;
|
struct weston_compositor *ec;
|
||||||
struct wl_global *global;
|
struct wl_global *global;
|
||||||
|
struct wl_client *client;
|
||||||
|
struct weston_process screenshooter_process;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -81,8 +84,40 @@ static void
|
|||||||
bind_shooter(struct wl_client *client,
|
bind_shooter(struct wl_client *client,
|
||||||
void *data, uint32_t version, uint32_t id)
|
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);
|
&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 *
|
struct screenshooter *
|
||||||
@@ -98,10 +133,13 @@ screenshooter_create(struct weston_compositor *ec)
|
|||||||
shooter->base.implementation =
|
shooter->base.implementation =
|
||||||
(void(**)(void)) &screenshooter_implementation;
|
(void(**)(void)) &screenshooter_implementation;
|
||||||
shooter->ec = ec;
|
shooter->ec = ec;
|
||||||
|
shooter->client = NULL;
|
||||||
|
|
||||||
shooter->global = wl_display_add_global(ec->wl_display,
|
shooter->global = wl_display_add_global(ec->wl_display,
|
||||||
&screenshooter_interface,
|
&screenshooter_interface,
|
||||||
shooter, bind_shooter);
|
shooter, bind_shooter);
|
||||||
|
weston_compositor_add_binding(ec, KEY_S, 0, 0, MODIFIER_SUPER,
|
||||||
|
screenshooter_binding, shooter);
|
||||||
|
|
||||||
return shooter;
|
return shooter;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user