From 7643d61c7e1ce1a7c8fd4c8b212ea13a55aa1066 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Thu, 2 Jan 2014 12:17:08 -0800 Subject: [PATCH] Add pointer cursor. --- src/protocols/vnc/Makefile.am | 2 + src/protocols/vnc/pointer_cursor.c | 92 ++++++++++++++++++++++++++++++ src/protocols/vnc/pointer_cursor.h | 64 +++++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 src/protocols/vnc/pointer_cursor.c create mode 100644 src/protocols/vnc/pointer_cursor.h diff --git a/src/protocols/vnc/Makefile.am b/src/protocols/vnc/Makefile.am index 9268a7f4..68ff953d 100644 --- a/src/protocols/vnc/Makefile.am +++ b/src/protocols/vnc/Makefile.am @@ -32,6 +32,7 @@ libguac_client_vnc_la_SOURCES = \ convert.c \ dot_cursor.c \ guac_handlers.c \ + pointer_cursor.c \ vnc_handlers.c noinst_HEADERS = \ @@ -39,6 +40,7 @@ noinst_HEADERS = \ convert.h \ dot_cursor.h \ guac_handlers.h \ + pointer_cursor.h \ vnc_handlers.h # Optional PulseAudio support diff --git a/src/protocols/vnc/pointer_cursor.c b/src/protocols/vnc/pointer_cursor.c new file mode 100644 index 00000000..7c549a7f --- /dev/null +++ b/src/protocols/vnc/pointer_cursor.c @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2013 Glyptodon LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "config.h" + +#include +#include +#include +#include + +/* Macros for prettying up the embedded image. */ +#define X 0x00,0x00,0x00,0xFF +#define O 0xFF,0xFF,0xFF,0xFF +#define _ 0x00,0x00,0x00,0x00 + +/* Dimensions */ +const int guac_vnc_pointer_cursor_width = 11; +const int guac_vnc_pointer_cursor_height = 16; + +/* Format */ +const cairo_format_t guac_vnc_pointer_cursor_format = CAIRO_FORMAT_ARGB32; +const int guac_vnc_pointer_cursor_stride = 44; + +/* Embedded pointer graphic */ +unsigned char guac_vnc_pointer_cursor[] = { + + O,_,_,_,_,_,_,_,_,_,_, + O,O,_,_,_,_,_,_,_,_,_, + O,X,O,_,_,_,_,_,_,_,_, + O,X,X,O,_,_,_,_,_,_,_, + O,X,X,X,O,_,_,_,_,_,_, + O,X,X,X,X,O,_,_,_,_,_, + O,X,X,X,X,X,O,_,_,_,_, + O,X,X,X,X,X,X,O,_,_,_, + O,X,X,X,X,X,X,X,O,_,_, + O,X,X,X,X,X,X,X,X,O,_, + O,X,X,X,X,X,O,O,O,O,O, + O,X,X,O,X,X,O,_,_,_,_, + O,X,O,_,O,X,X,O,_,_,_, + O,O,_,_,O,X,X,O,_,_,_, + O,_,_,_,_,O,X,X,O,_,_, + _,_,_,_,_,O,O,O,O,_,_ + +}; + +void guac_vnc_set_pointer_cursor(guac_client* client) { + + guac_socket* socket = client->socket; + + /* Draw to buffer */ + guac_layer* cursor = guac_client_alloc_buffer(client); + + cairo_surface_t* graphic = cairo_image_surface_create_for_data( + guac_vnc_pointer_cursor, + guac_vnc_pointer_cursor_format, + guac_vnc_pointer_cursor_width, + guac_vnc_pointer_cursor_height, + guac_vnc_pointer_cursor_stride); + + guac_protocol_send_png(socket, GUAC_COMP_SRC, cursor, 0, 0, graphic); + cairo_surface_destroy(graphic); + + /* Set cursor */ + guac_protocol_send_cursor(socket, 0, 0, cursor, + 0, 0, + guac_vnc_pointer_cursor_width, + guac_vnc_pointer_cursor_height); + + /* Free buffer */ + guac_client_free_buffer(client, cursor); + +} + diff --git a/src/protocols/vnc/pointer_cursor.h b/src/protocols/vnc/pointer_cursor.h new file mode 100644 index 00000000..040c182a --- /dev/null +++ b/src/protocols/vnc/pointer_cursor.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2013 Glyptodon LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef _GUAC_VNC_POINTER_CURSOR_H +#define _GUAC_VNC_POINTER_CURSOR_H + +#include "config.h" + +#include +#include + +/** + * Width of the embedded mouse cursor graphic. + */ +extern const int guac_vnc_pointer_cursor_width; + +/** + * Height of the embedded mouse cursor graphic. + */ +extern const int guac_vnc_pointer_cursor_height; + +/** + * Number of bytes in each row of the embedded mouse cursor graphic. + */ +extern const int guac_vnc_pointer_cursor_stride; + +/** + * The Cairo grapic format of the mouse cursor graphic. + */ +extern const cairo_format_t guac_vnc_pointer_cursor_format; + +/** + * Embedded mouse cursor graphic. + */ +extern unsigned char guac_vnc_pointer_cursor[]; + +/** + * Set the cursor of the remote display to the embedded cursor graphic. + * + * @param client The guac_client to send the cursor to. + */ +void guac_vnc_set_pointer_cursor(guac_client* client); + +#endif