diff --git a/src/protocols/ball/Makefile.am b/src/protocols/ball/Makefile.am index c2d379de..d3ce7a52 100644 --- a/src/protocols/ball/Makefile.am +++ b/src/protocols/ball/Makefile.am @@ -5,6 +5,8 @@ AM_FLAGS = -Werror -Wall -pedantic lib_LTLIBRARIES = libguac-client-ball.la +noinst_HEADERS = ball.h + libguac_client_ball_la_SOURCES = \ ball.c diff --git a/src/protocols/ball/ball.c b/src/protocols/ball/ball.c index f8867561..dde8faec 100644 --- a/src/protocols/ball/ball.c +++ b/src/protocols/ball/ball.c @@ -17,7 +17,10 @@ * under the License. */ +#include "ball.h" + #include +#include #include #include #include @@ -30,6 +33,10 @@ int ball_join_handler(guac_user* user, int argc, char** argv) { /* Get client associated with user */ guac_client* client = user->client; + + /* Get ball layer from client data */ + ball_client_data* data = (ball_client_data*) client->data; + guac_layer* ball = data->ball; /* Get user-specific socket */ guac_socket* socket = user->socket; @@ -46,6 +53,18 @@ int ball_join_handler(guac_user* user, int argc, char** argv) { GUAC_COMP_OVER, GUAC_DEFAULT_LAYER, 0x80, 0x80, 0x80, 0xFF); + /* Set up ball layer */ + guac_protocol_send_size(socket, ball, 128, 128); + + /* Prepare a curve which covers the entire layer */ + guac_protocol_send_rect(socket, ball, + 0, 0, 128, 128); + + /* Fill curve with solid color */ + guac_protocol_send_cfill(socket, + GUAC_COMP_OVER, ball, + 0x00, 0x80, 0x80, 0xFF); + /* Mark end-of-frame */ guac_protocol_send_sync(socket, client->last_sent_timestamp); @@ -57,13 +76,39 @@ int ball_join_handler(guac_user* user, int argc, char** argv) { } +int ball_free_handler(guac_client* client) { + + ball_client_data* data = (ball_client_data*) client->data; + + /* Free client-level ball layer */ + guac_client_free_layer(client, data->ball); + + /* Free client-specific data */ + free(data); + + /* Data successfully freed */ + return 0; + +} + + int guac_client_init(guac_client* client) { + /* Allocate storage for client-specific data */ + ball_client_data* data = malloc(sizeof(ball_client_data)); + + /* Set up client data and handlers */ + client->data = data; + + /* Allocate layer at the client level */ + data->ball = guac_client_alloc_layer(client); + /* This example does not implement any arguments */ client->args = TUTORIAL_ARGS; /* Client-level handlers */ client->join_handler = ball_join_handler; + client->free_handler = ball_free_handler; return 0; diff --git a/src/protocols/ball/ball.h b/src/protocols/ball/ball.h new file mode 100644 index 00000000..451e83ca --- /dev/null +++ b/src/protocols/ball/ball.h @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef BALL_H +#define BALL_H + +#include + +typedef struct ball_client_data { + + guac_layer* ball; + +} ball_client_data; + +#endif