GUAC-1389: Redraw / resync scrollbar state when a new user joins a terminal session.
This commit is contained in:
parent
e750ca9499
commit
60dec61c51
@ -89,6 +89,142 @@ void guac_terminal_scrollbar_free(guac_terminal_scrollbar* scrollbar) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moves the main scrollbar layer to the position indicated within the given
|
||||||
|
* scrollbar render state, sending any necessary Guacamole instructions over
|
||||||
|
* the given socket.
|
||||||
|
*
|
||||||
|
* @param scrollbar
|
||||||
|
* The scrollbar to reposition.
|
||||||
|
*
|
||||||
|
* @param state
|
||||||
|
* The guac_terminal_scrollbar_render_state describing the new scrollbar
|
||||||
|
* position.
|
||||||
|
*
|
||||||
|
* @param socket
|
||||||
|
* The guac_socket over which any instructions necessary to perform the
|
||||||
|
* render operation should be sent.
|
||||||
|
*/
|
||||||
|
static void guac_terminal_scrollbar_move_container(
|
||||||
|
guac_terminal_scrollbar* scrollbar,
|
||||||
|
guac_terminal_scrollbar_render_state* state,
|
||||||
|
guac_socket* socket) {
|
||||||
|
|
||||||
|
/* Send scrollbar position */
|
||||||
|
guac_protocol_send_move(socket,
|
||||||
|
scrollbar->container, scrollbar->parent,
|
||||||
|
state->container_x,
|
||||||
|
state->container_y,
|
||||||
|
0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resizes and redraws the main scrollbar layer according to the given
|
||||||
|
* scrollbar render state, sending any necessary Guacamole instructions over
|
||||||
|
* the given socket.
|
||||||
|
*
|
||||||
|
* @param scrollbar
|
||||||
|
* The scrollbar to resize and redraw.
|
||||||
|
*
|
||||||
|
* @param state
|
||||||
|
* The guac_terminal_scrollbar_render_state describing the new scrollbar
|
||||||
|
* size and appearance.
|
||||||
|
*
|
||||||
|
* @param socket
|
||||||
|
* The guac_socket over which any instructions necessary to perform the
|
||||||
|
* render operation should be sent.
|
||||||
|
*/
|
||||||
|
static void guac_terminal_scrollbar_draw_container(
|
||||||
|
guac_terminal_scrollbar* scrollbar,
|
||||||
|
guac_terminal_scrollbar_render_state* state,
|
||||||
|
guac_socket* socket) {
|
||||||
|
|
||||||
|
/* Set container size */
|
||||||
|
guac_protocol_send_size(socket, scrollbar->container,
|
||||||
|
state->container_width,
|
||||||
|
state->container_height);
|
||||||
|
|
||||||
|
/* Fill container with solid color */
|
||||||
|
guac_protocol_send_rect(socket, scrollbar->container, 0, 0,
|
||||||
|
state->container_width,
|
||||||
|
state->container_height);
|
||||||
|
|
||||||
|
guac_protocol_send_cfill(socket, GUAC_COMP_SRC, scrollbar->container,
|
||||||
|
0x80, 0x80, 0x80, 0x40);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moves the handle layer of the scrollbar to the position indicated within the
|
||||||
|
* given scrollbar render state, sending any necessary Guacamole instructions
|
||||||
|
* over the given socket. The handle is the portion of the scrollbar that
|
||||||
|
* indicates the current scroll value and which the user can click and drag to
|
||||||
|
* change the value.
|
||||||
|
*
|
||||||
|
* @param scrollbar
|
||||||
|
* The scrollbar associated with the handle being repositioned.
|
||||||
|
*
|
||||||
|
* @param state
|
||||||
|
* The guac_terminal_scrollbar_render_state describing the new scrollbar
|
||||||
|
* handle position.
|
||||||
|
*
|
||||||
|
* @param socket
|
||||||
|
* The guac_socket over which any instructions necessary to perform the
|
||||||
|
* render operation should be sent.
|
||||||
|
*/
|
||||||
|
static void guac_terminal_scrollbar_move_handle(
|
||||||
|
guac_terminal_scrollbar* scrollbar,
|
||||||
|
guac_terminal_scrollbar_render_state* state,
|
||||||
|
guac_socket* socket) {
|
||||||
|
|
||||||
|
/* Send handle position */
|
||||||
|
guac_protocol_send_move(socket,
|
||||||
|
scrollbar->handle, scrollbar->container,
|
||||||
|
state->handle_x,
|
||||||
|
state->handle_y,
|
||||||
|
0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resizes and redraws the handle layer of the scrollbar according to the given
|
||||||
|
* scrollbar render state, sending any necessary Guacamole instructions over
|
||||||
|
* the given socket. The handle is the portion of the scrollbar that indicates
|
||||||
|
* the current scroll value and which the user can click and drag to change the
|
||||||
|
* value.
|
||||||
|
*
|
||||||
|
* @param scrollbar
|
||||||
|
* The scrollbar associated with the handle being resized and redrawn.
|
||||||
|
*
|
||||||
|
* @param state
|
||||||
|
* The guac_terminal_scrollbar_render_state describing the new scrollbar
|
||||||
|
* handle size and appearance.
|
||||||
|
*
|
||||||
|
* @param socket
|
||||||
|
* The guac_socket over which any instructions necessary to perform the
|
||||||
|
* render operation should be sent.
|
||||||
|
*/
|
||||||
|
static void guac_terminal_scrollbar_draw_handle(
|
||||||
|
guac_terminal_scrollbar* scrollbar,
|
||||||
|
guac_terminal_scrollbar_render_state* state,
|
||||||
|
guac_socket* socket) {
|
||||||
|
|
||||||
|
/* Set handle size */
|
||||||
|
guac_protocol_send_size(socket, scrollbar->handle,
|
||||||
|
state->handle_width,
|
||||||
|
state->handle_height);
|
||||||
|
|
||||||
|
/* Fill handle with solid color */
|
||||||
|
guac_protocol_send_rect(socket, scrollbar->handle, 0, 0,
|
||||||
|
state->handle_width,
|
||||||
|
state->handle_height);
|
||||||
|
|
||||||
|
guac_protocol_send_cfill(socket, GUAC_COMP_SRC, scrollbar->handle,
|
||||||
|
0xA0, 0xA0, 0xA0, 0x8F);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculates the state of the scroll bar, given its minimum, maximum, current
|
* Calculates the state of the scroll bar, given its minimum, maximum, current
|
||||||
* values, and the state of any dragging operation. The resulting render state
|
* values, and the state of any dragging operation. The resulting render state
|
||||||
@ -199,6 +335,22 @@ static void calculate_state(guac_terminal_scrollbar* scrollbar,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void guac_terminal_scrollbar_dup(guac_terminal_scrollbar* scrollbar,
|
||||||
|
guac_user* user, guac_socket* socket) {
|
||||||
|
|
||||||
|
/* Get old state */
|
||||||
|
guac_terminal_scrollbar_render_state* state = &scrollbar->render_state;
|
||||||
|
|
||||||
|
/* Send scrollbar container */
|
||||||
|
guac_terminal_scrollbar_draw_container(scrollbar, state, socket);
|
||||||
|
guac_terminal_scrollbar_move_container(scrollbar, state, socket);
|
||||||
|
|
||||||
|
/* Send handle */
|
||||||
|
guac_terminal_scrollbar_draw_handle(scrollbar, state, socket);
|
||||||
|
guac_terminal_scrollbar_move_handle(scrollbar, state, socket);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void guac_terminal_scrollbar_flush(guac_terminal_scrollbar* scrollbar) {
|
void guac_terminal_scrollbar_flush(guac_terminal_scrollbar* scrollbar) {
|
||||||
|
|
||||||
guac_socket* socket = scrollbar->client->socket;
|
guac_socket* socket = scrollbar->client->socket;
|
||||||
@ -219,63 +371,25 @@ void guac_terminal_scrollbar_flush(guac_terminal_scrollbar* scrollbar) {
|
|||||||
/* Reposition container if moved */
|
/* Reposition container if moved */
|
||||||
if (old_state->container_x != new_state.container_x
|
if (old_state->container_x != new_state.container_x
|
||||||
|| old_state->container_y != new_state.container_y) {
|
|| old_state->container_y != new_state.container_y) {
|
||||||
|
guac_terminal_scrollbar_move_container(scrollbar, &new_state, socket);
|
||||||
guac_protocol_send_move(socket,
|
|
||||||
scrollbar->container, scrollbar->parent,
|
|
||||||
new_state.container_x,
|
|
||||||
new_state.container_y,
|
|
||||||
0);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Resize and redraw container if size changed */
|
/* Resize and redraw container if size changed */
|
||||||
if (old_state->container_width != new_state.container_width
|
if (old_state->container_width != new_state.container_width
|
||||||
|| old_state->container_height != new_state.container_height) {
|
|| old_state->container_height != new_state.container_height) {
|
||||||
|
guac_terminal_scrollbar_draw_container(scrollbar, &new_state, socket);
|
||||||
/* Set new size */
|
|
||||||
guac_protocol_send_size(socket, scrollbar->container,
|
|
||||||
new_state.container_width,
|
|
||||||
new_state.container_height);
|
|
||||||
|
|
||||||
/* Fill container with solid color */
|
|
||||||
guac_protocol_send_rect(socket, scrollbar->container, 0, 0,
|
|
||||||
new_state.container_width,
|
|
||||||
new_state.container_height);
|
|
||||||
|
|
||||||
guac_protocol_send_cfill(socket, GUAC_COMP_SRC, scrollbar->container,
|
|
||||||
0x80, 0x80, 0x80, 0x40);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reposition handle if moved */
|
/* Reposition handle if moved */
|
||||||
if (old_state->handle_x != new_state.handle_x
|
if (old_state->handle_x != new_state.handle_x
|
||||||
|| old_state->handle_y != new_state.handle_y) {
|
|| old_state->handle_y != new_state.handle_y) {
|
||||||
|
guac_terminal_scrollbar_move_handle(scrollbar, &new_state, socket);
|
||||||
guac_protocol_send_move(socket,
|
|
||||||
scrollbar->handle, scrollbar->container,
|
|
||||||
new_state.handle_x,
|
|
||||||
new_state.handle_y,
|
|
||||||
0);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Resize and redraw handle if size changed */
|
/* Resize and redraw handle if size changed */
|
||||||
if (old_state->handle_width != new_state.handle_width
|
if (old_state->handle_width != new_state.handle_width
|
||||||
|| old_state->handle_height != new_state.handle_height) {
|
|| old_state->handle_height != new_state.handle_height) {
|
||||||
|
guac_terminal_scrollbar_draw_handle(scrollbar, &new_state, socket);
|
||||||
/* Send new size */
|
|
||||||
guac_protocol_send_size(socket, scrollbar->handle,
|
|
||||||
new_state.handle_width,
|
|
||||||
new_state.handle_height);
|
|
||||||
|
|
||||||
/* Fill and stroke handle with solid color */
|
|
||||||
guac_protocol_send_rect(socket, scrollbar->handle, 0, 0,
|
|
||||||
new_state.handle_width,
|
|
||||||
new_state.handle_height);
|
|
||||||
|
|
||||||
guac_protocol_send_cfill(socket, GUAC_COMP_SRC, scrollbar->handle,
|
|
||||||
0xA0, 0xA0, 0xA0, 0x8F);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Store current render state */
|
/* Store current render state */
|
||||||
|
@ -252,6 +252,24 @@ void guac_terminal_scrollbar_free(guac_terminal_scrollbar* scrollbar);
|
|||||||
*/
|
*/
|
||||||
void guac_terminal_scrollbar_flush(guac_terminal_scrollbar* scrollbar);
|
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
|
* 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
|
* to the given values. If necessary, the current value of the scrollbar will
|
||||||
|
@ -1910,6 +1910,7 @@ void guac_terminal_add_user(guac_terminal* term, guac_user* user,
|
|||||||
|
|
||||||
/* Synchronize display state with new user */
|
/* Synchronize display state with new user */
|
||||||
guac_common_display_dup(term->display, user, socket);
|
guac_common_display_dup(term->display, user, socket);
|
||||||
|
guac_terminal_scrollbar_dup(term->scrollbar, user, socket);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user