diff --git a/libguac/Makefile.am b/libguac/Makefile.am index 41bbc815..a0b2f5bd 100644 --- a/libguac/Makefile.am +++ b/libguac/Makefile.am @@ -48,3 +48,5 @@ libguac_la_SOURCES = src/client.c src/socket.c src/protocol.c src/client-handler libguac_la_LDFLAGS = -version-info 3:0:0 +EXTRA_DIST = LICENSE doc/Doxyfile + diff --git a/libguac/include/protocol.h b/libguac/include/protocol.h index 1c37a3af..24459a39 100644 --- a/libguac/include/protocol.h +++ b/libguac/include/protocol.h @@ -90,10 +90,68 @@ typedef enum guac_composite_mode { GUAC_COMP_IN = 0x4, /* 0100 */ GUAC_COMP_OUT = 0x8, /* 1000 */ GUAC_COMP_RATOP = 0x9, /* 1001 */ - GUAC_COMP_SRC = 0xC /* 1100 */ + GUAC_COMP_SRC = 0xC, /* 1100 */ + + /* Bitwise composite operations (binary) */ + + /* + * A: S' & D' + * B: S' & D + * C: S & D' + * D: S & D + * + * 0 = Active, 1 = Inactive + */ } guac_composite_mode; + +/** + * Default transfer functions. There is no current facility in the + * Guacamole protocol to define custom transfer functions. + */ +typedef enum guac_transfer_function { + + /* Constant functions */ /* ABCD */ + GUAC_TRANSFER_BINARY_BLACK = 0x0, /* 0000 */ + GUAC_TRANSFER_BINARY_WHITE = 0xF, /* 1111 */ + + /* Copy functions */ + GUAC_TRANSFER_BINARY_SRC = 0x3, /* 0011 */ + GUAC_TRANSFER_BINARY_DEST = 0x5, /* 0101 */ + GUAC_TRANSFER_BINARY_NSRC = 0xC, /* 1100 */ + GUAC_TRANSFER_BINARY_NDEST = 0xA, /* 1010 */ + + /* AND / NAND */ + GUAC_TRANSFER_BINARY_AND = 0x1, /* 0001 */ + GUAC_TRANSFER_BINARY_NAND = 0xE, /* 1110 */ + + /* OR / NOR */ + GUAC_TRANSFER_BINARY_OR = 0x7, /* 0111 */ + GUAC_TRANSFER_BINARY_NOR = 0x8, /* 1000 */ + + /* XOR / XNOR */ + GUAC_TRANSFER_BINARY_XOR = 0x6, /* 0110 */ + GUAC_TRANSFER_BINARY_XNOR = 0x9, /* 1001 */ + + /* AND / NAND with inverted source */ + GUAC_TRANSFER_BINARY_NSRC_AND = 0x4, /* 0100 */ + GUAC_TRANSFER_BINARY_NSRC_NAND = 0xB, /* 1011 */ + + /* OR / NOR with inverted source */ + GUAC_TRANSFER_BINARY_NSRC_OR = 0xD, /* 1101 */ + GUAC_TRANSFER_BINARY_NSRC_NOR = 0x2, /* 0010 */ + + /* AND / NAND with inverted destination */ + GUAC_TRANSFER_BINARY_NDEST_AND = 0x2, /* 0010 */ + GUAC_TRANSFER_BINARY_NDEST_NAND = 0xD, /* 1101 */ + + /* OR / NOR with inverted destination */ + GUAC_TRANSFER_BINARY_NDEST_OR = 0xB, /* 1011 */ + GUAC_TRANSFER_BINARY_NDEST_NOR = 0x4 /* 0100 */ + +} guac_transfer_function; + typedef struct guac_layer guac_layer; /** @@ -276,6 +334,30 @@ int guac_protocol_send_copy(guac_socket* socket, const guac_layer* srcl, int srcx, int srcy, int w, int h, guac_composite_mode mode, const guac_layer* dstl, int dstx, int dsty); +/** + * Sends a transfer instruction over the given guac_socket connection. + * + * If an error occurs sending the instruction, a non-zero value is + * returned, and guac_error is set appropriately. + * + * @param socket The guac_socket connection to use. + * @param srcl The source layer. + * @param srcx The X coordinate of the source rectangle. + * @param srcy The Y coordinate of the source rectangle. + * @param w The width of the source rectangle. + * @param h The height of the source rectangle. + * @param fn The transfer function to use. + * @param dstl The destination layer. + * @param dstx The X coordinate of the destination, where the source rectangle + * should be copied. + * @param dsty The Y coordinate of the destination, where the source rectangle + * should be copied. + * @return Zero on success, non-zero on error. + */ +int guac_protocol_send_transfer(guac_socket* socket, + const guac_layer* srcl, int srcx, int srcy, int w, int h, + guac_transfer_function fn, const guac_layer* dstl, int dstx, int dsty); + /** * Sends a rect instruction over the given guac_socket connection. * diff --git a/libguac/src/protocol.c b/libguac/src/protocol.c index 1075e46c..58e1d7f7 100644 --- a/libguac/src/protocol.c +++ b/libguac/src/protocol.c @@ -204,6 +204,33 @@ int guac_protocol_send_copy(guac_socket* socket, } +int guac_protocol_send_transfer(guac_socket* socket, + const guac_layer* srcl, int srcx, int srcy, int w, int h, + guac_transfer_function fn, const guac_layer* dstl, int dstx, int dsty) { + + return + guac_socket_write_string(socket, "8.transfer,") + || __guac_socket_write_length_int(socket, srcl->index) + || guac_socket_write_string(socket, ",") + || __guac_socket_write_length_int(socket, srcx) + || guac_socket_write_string(socket, ",") + || __guac_socket_write_length_int(socket, srcy) + || guac_socket_write_string(socket, ",") + || __guac_socket_write_length_int(socket, w) + || guac_socket_write_string(socket, ",") + || __guac_socket_write_length_int(socket, h) + || guac_socket_write_string(socket, ",") + || __guac_socket_write_length_int(socket, fn) + || guac_socket_write_string(socket, ",") + || __guac_socket_write_length_int(socket, dstl->index) + || guac_socket_write_string(socket, ",") + || __guac_socket_write_length_int(socket, dstx) + || guac_socket_write_string(socket, ",") + || __guac_socket_write_length_int(socket, dsty) + || guac_socket_write_string(socket, ";"); + +} + int guac_protocol_send_rect(guac_socket* socket, guac_composite_mode mode, const guac_layer* layer, int x, int y, int width, int height,