GUAC-1389: Redraw / resync terminal contents.

This commit is contained in:
Michael Jumper 2016-03-14 15:15:32 -07:00
parent 60dec61c51
commit a14e0fa3fb
3 changed files with 42 additions and 5 deletions

View File

@ -845,6 +845,18 @@ void guac_terminal_display_flush(guac_terminal_display* display) {
} }
void guac_terminal_display_dup(guac_terminal_display* display, guac_user* user,
guac_socket* socket) {
/* Create default surface */
guac_common_surface_dup(display->display_surface, user, socket);
/* Select layer is a child of the display layer */
guac_protocol_send_move(socket, display->select_layer,
display->display_layer, 0, 0, 0);
}
void guac_terminal_display_commit_select(guac_terminal_display* display) { void guac_terminal_display_commit_select(guac_terminal_display* display) {
display->selection_committed = true; display->selection_committed = true;
} }

View File

@ -333,6 +333,23 @@ void guac_terminal_display_resize(guac_terminal_display* display, int width, int
*/ */
void guac_terminal_display_flush(guac_terminal_display* display); void guac_terminal_display_flush(guac_terminal_display* display);
/**
* Initializes and syncs the current terminal display state for the given user
* that has just joined the connection, sending the necessary instructions to
* completely recreate and redraw the terminal rendering over the given socket.
*
* @param display
* The terminal display 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_display_dup(guac_terminal_display* display, guac_user* user,
guac_socket* socket);
/** /**
* Draws the text selection rectangle from the given coordinates to the given end coordinates. * Draws the text selection rectangle from the given coordinates to the given end coordinates.
*/ */

View File

@ -200,6 +200,10 @@ void guac_terminal_reset(guac_terminal* term) {
* @param terminal * @param terminal
* The terminal whose background should be painted or repainted. * The terminal whose background should be painted or repainted.
* *
* @param socket
* The socket over which instructions required to paint / repaint the
* terminal background should be send.
*
* @param width * @param width
* The width of the background to draw, in pixels. * The width of the background to draw, in pixels.
* *
@ -207,11 +211,9 @@ void guac_terminal_reset(guac_terminal* term) {
* The height of the background to draw, in pixels. * The height of the background to draw, in pixels.
*/ */
static void guac_terminal_paint_background(guac_terminal* terminal, static void guac_terminal_paint_background(guac_terminal* terminal,
int width, int height) { guac_socket* socket, int width, int height) {
guac_terminal_display* display = terminal->term_display; guac_terminal_display* display = terminal->term_display;
guac_client* client = display->client;
guac_socket* socket = client->socket;
/* Get background color */ /* Get background color */
const guac_terminal_color* color = const guac_terminal_color* color =
@ -371,7 +373,7 @@ guac_terminal* guac_terminal_create(guac_client* client,
pthread_mutex_init(&(term->lock), NULL); pthread_mutex_init(&(term->lock), NULL);
/* Size display */ /* Size display */
guac_terminal_paint_background(term, width, height); guac_terminal_paint_background(term, client->socket, width, height);
guac_terminal_display_resize(term->term_display, guac_terminal_display_resize(term->term_display,
term->term_width, term->term_height); term->term_width, term->term_height);
@ -1369,7 +1371,7 @@ int guac_terminal_resize(guac_terminal* terminal, int width, int height) {
/* Resize default layer to given pixel dimensions */ /* Resize default layer to given pixel dimensions */
guac_common_surface_resize(terminal->display->default_surface, width, height); guac_common_surface_resize(terminal->display->default_surface, width, height);
guac_terminal_paint_background(terminal, width, height); guac_terminal_paint_background(terminal, client->socket, width, height);
/* Notify scrollbar of resize */ /* Notify scrollbar of resize */
guac_terminal_scrollbar_parent_resized(terminal->scrollbar, width, height, rows); guac_terminal_scrollbar_parent_resized(terminal->scrollbar, width, height, rows);
@ -1910,7 +1912,13 @@ 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_display_dup(term->term_display, user, socket);
guac_terminal_scrollbar_dup(term->scrollbar, user, socket); guac_terminal_scrollbar_dup(term->scrollbar, user, socket);
/* Paint background for joining user */
guac_common_surface* default_surface = term->display->default_surface;
guac_terminal_paint_background(term, socket, default_surface->width,
default_surface->height);
} }