blob: bf0da8736abfb7342274bb9fc2410851553c3429 [file] [log] [blame]
/*
* 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 GUAC_TERMINAL_SCROLLBAR_H
#define GUAC_TERMINAL_SCROLLBAR_H
#include "config.h"
#include <guacamole/client.h>
#include <guacamole/layer.h>
/**
* The width of the scrollbar, in pixels.
*/
#define GUAC_TERMINAL_SCROLLBAR_WIDTH 16
/**
* The number of pixels between the draggable handle of the scrollbar and the
* boundary of the containing layer.
*/
#define GUAC_TERMINAL_SCROLLBAR_PADDING 2
/**
* The minimum height of the draggable handle of the scrollbar, in pixels.
*/
#define GUAC_TERMINAL_SCROLLBAR_MIN_HEIGHT 64
/**
* The state of all scrollbar components, describing all variable aspects of
* the scrollbar's appearance.
*/
typedef struct guac_terminal_scrollbar_render_state {
/**
* The current X-coordinate of the upper-left corner of the scrollbar's
* handle. This value will be relative to the scrollbar's containing layer.
*/
int handle_x;
/**
* The current Y-coordinate of the upper-left corner of the scrollbar's
* handle. This value will be relative to the scrollbar's containing layer.
*/
int handle_y;
/**
* The width of the scrollbar's handle.
*/
int handle_width;
/**
* The height of the scrollbar's handle.
*/
int handle_height;
/**
* The current X-coordinate of the upper-left corner of the scrollbar's
* containing layer.
*/
int container_x;
/**
* The current Y-coordinate of the upper-left corner of the scrollbar's
* containing layer.
*/
int container_y;
/**
* The width of the scrollbar's containing layer.
*/
int container_width;
/**
* The height of the scrollbar's containing layer.
*/
int container_height;
} guac_terminal_scrollbar_render_state;
typedef struct guac_terminal_scrollbar guac_terminal_scrollbar;
/**
* Handler which is called whenever the scrollbar value changes outside a call
* to guac_terminal_scrollbar_set_value().
*/
typedef void guac_terminal_scrollbar_scroll_handler(
guac_terminal_scrollbar* scrollbar, int value);
/**
* A scrollbar, made up of a containing layer and inner draggable handle. The
* position of the handle within the layer represents the value of the
* scrollbar.
*/
struct guac_terminal_scrollbar {
/**
* The client associated with this scrollbar.
*/
guac_client* client;
/**
* The layer containing the scrollbar.
*/
const guac_layer* parent;
/**
* The width of the parent layer, in pixels.
*/
int parent_width;
/**
* The height of the parent layer, in pixels.
*/
int parent_height;
/**
* The scrollbar itself.
*/
guac_layer* container;
/**
* The draggable handle within the scrollbar, representing the current
* scroll value.
*/
guac_layer* handle;
/**
* The minimum scroll value.
*/
int min;
/**
* The maximum scroll value.
*/
int max;
/**
* The size of the visible area, in the same units as min and max.
*/
int visible_area;
/**
* The current scroll value.
*/
int value;
/**
* The current state of all variable, visible parts of the scrollbar.
*/
guac_terminal_scrollbar_render_state render_state;
/**
* Whether the scrollbar handle is currently being dragged.
*/
int dragging_handle;
/**
* The offset of the Y location of the mouse pointer when the dragging
* began, relative to the top of the scrollbar handle. If dragging is not
* in progress, this value is undefined.
*/
int drag_offset_y;
/**
* The current Y location of the mouse pointer if dragging is in progress.
* If dragging is not in progress, this value is undefined.
*/
int drag_current_y;
/**
* The function to call when the scrollbar handle is being dragged, and
* the new scrollbar value needs to be handled and assigned.
*/
guac_terminal_scrollbar_scroll_handler* scroll_handler;
/**
* Arbitrary reference to data related to this scrollbar.
*/
void* data;
};
/**
* Allocates a new scrollbar, associating that scrollbar with the given client
* and parent layer. The dimensions of the parent layer dictate the initial
* position of the scrollbar. Currently, the scrollbar is always anchored to
* the right edge of the parent layer.
*
* This will cause instructions to be written to the client's socket, but the
* client's socket will not be automatically flushed.
*
* @param client
* The client to associate with the new scrollbar.
*
* @param parent
* The layer which will contain the newly-allocated scrollbar.
*
* @param parent_width
* The width of the parent layer, in pixels.
*
* @param parent_height
* The height of the parent layer, in pixels.
*
* @param visible_area
* The amount of scrollable data that can be shown within the parent layer
* at any given time. This value uses the same units as min, max, and the
* current scroll value.
*
* @return
* A newly allocated scrollbar.
*/
guac_terminal_scrollbar* guac_terminal_scrollbar_alloc(guac_client* client,
const guac_layer* parent, int parent_width, int parent_height,
int visible_area);
/**
* Frees the given scrollbar.
*
* @param scrollbar
* The scrollbar to free.
*/
void guac_terminal_scrollbar_free(guac_terminal_scrollbar* scrollbar);
/**
* Flushes the render state of the given scrollbar, updating the remote display
* accordingly.
*
* This may cause instructions to be written to the client's socket, but the
* client's socket will not be automatically flushed.
*
* @param scrollbar
* The scrollbar whose render state is to be flushed.
*/
void guac_terminal_scrollbar_flush(guac_terminal_scrollbar* scrollbar);
/**
* Forces a complete redraw / resync of scrollbar state for the given user that
* has just joined the connection, sending the necessary instructions to
* completely recreate and redraw the scrollbar rendering over the given
* socket.
*
* @param scrollbar
* The scrollbar to sync to the given user.
*
* @param user
* The user that has just joined the connection.
*
* @param socket
* The socket over which any necessary instructions should be sent.
*/
void guac_terminal_scrollbar_dup(guac_terminal_scrollbar* scrollbar,
guac_user* user, guac_socket* socket);
/**
* Sets the minimum and maximum allowed scroll values of the given scrollbar
* to the given values. If necessary, the current value of the scrollbar will
* be adjusted to fit within the new bounds.
*
* This may cause instructions to be written to the client's socket, but the
* client's socket will not be automatically flushed.
*
* @param scrollbar
* The scrollbar whose bounds are changing.
*
* @param min
* The new minimum value of the scrollbar.
*
* @param max
* The new maximum value of the scrollbar.
*/
void guac_terminal_scrollbar_set_bounds(guac_terminal_scrollbar* scrollbar,
int min, int max);
/**
* Sets the current value of the given scrollbar. If the value specified does
* not fall within the scrollbar's defined minimum and maximum values, the
* value will be adjusted to fit.
*
* This may cause instructions to be written to the client's socket, but the
* client's socket will not be automatically flushed.
*
* @param scrollbar
* The scrollbar whose value is changing.
*
* @param value
* The value to assign to the scrollbar. If the value if out of bounds, it
* will be automatically adjusted to fit.
*/
void guac_terminal_scrollbar_set_value(guac_terminal_scrollbar* scrollbar,
int value);
/**
* Notifies the scrollbar that the parent layer has been resized, and that the
* scrollbar may need to be repositioned or resized accordingly.
*
* This may cause instructions to be written to the client's socket, but the
* client's socket will not be automatically flushed.
*
* @param scrollbar
* The scrollbar whose parent layer has been resized.
*
* @param parent_width
* The new width of the parent layer, in pixels.
*
* @param parent_height
* The new height of the parent layer, in pixels.
*
* @param visible_area
* The amount of scrollable data that can be shown within the parent layer
* at any given time. This value uses the same units as min, max, and the
* current scroll value.
*/
void guac_terminal_scrollbar_parent_resized(guac_terminal_scrollbar* scrollbar,
int parent_width, int parent_height, int visible_area);
/**
* Notifies the scrollbar of the current mouse state, allowing it to update
* itself with respect to button state and dragging.
*
* @param scrollbar
* The scrollbar to notify of the current mouse state.
*
* @param x
* The X coordinate of the mouse pointer.
*
* @param y
* The Y coordinate of the mouse pointer.
*
* @param mask
* The button mask, where the Nth bit of the button mask represents the
* pressed state of the Nth mouse button, where button 0 is the left
* mouse button, button 1 is the middle button, etc.
*
* @return
* Zero if the mouse event was not handled by the scrollbar, non-zero
* otherwise.
*/
int guac_terminal_scrollbar_handle_mouse(guac_terminal_scrollbar* scrollbar,
int x, int y, int mask);
#endif