GUAC-803: Move display into separate layer, always size default layer perfectly.

This commit is contained in:
Michael Jumper 2014-06-02 18:31:38 -07:00
parent 37037b6f8b
commit 569f4adbac
3 changed files with 41 additions and 15 deletions

View File

@ -246,7 +246,7 @@ int __guac_terminal_set(guac_terminal_display* display, int row, int col, int co
pango_cairo_show_layout(cairo, layout); pango_cairo_show_layout(cairo, layout);
/* Draw */ /* Draw */
guac_common_surface_draw(display->default_surface, guac_common_surface_draw(display->display_surface,
display->char_width * col, display->char_width * col,
display->char_height * row, display->char_height * row,
surface); surface);
@ -274,8 +274,14 @@ guac_terminal_display* guac_terminal_display_alloc(guac_client* client,
display->client = client; display->client = client;
/* Create default surface */ /* Create default surface */
display->default_surface = guac_common_surface_alloc(client->socket, GUAC_DEFAULT_LAYER, 0, 0); display->display_layer = guac_client_alloc_layer(client);
display->select_layer = guac_client_alloc_layer(client); display->select_layer = guac_client_alloc_layer(client);
display->display_surface = guac_common_surface_alloc(client->socket,
display->display_layer, 0, 0);
/* Select layer is a child of the display layer */
guac_protocol_send_move(client->socket, display->select_layer,
display->display_layer, 0, 0, 0);
/* Get font */ /* Get font */
display->font_desc = pango_font_description_new(); display->font_desc = pango_font_description_new();
@ -516,7 +522,7 @@ void guac_terminal_display_resize(guac_terminal_display* display, int width, int
/* Send display size */ /* Send display size */
guac_common_surface_resize( guac_common_surface_resize(
display->default_surface, display->display_surface,
display->char_width * width, display->char_width * width,
display->char_height * height); display->char_height * height);
@ -636,13 +642,13 @@ void __guac_terminal_display_flush_copy(guac_terminal_display* display) {
/* Send copy */ /* Send copy */
guac_common_surface_copy( guac_common_surface_copy(
display->default_surface, display->display_surface,
current->column * display->char_width, current->column * display->char_width,
current->row * display->char_height, current->row * display->char_height,
rect_width * display->char_width, rect_width * display->char_width,
rect_height * display->char_height, rect_height * display->char_height,
display->default_surface, display->display_surface,
col * display->char_width, col * display->char_width,
row * display->char_height); row * display->char_height);
@ -771,7 +777,7 @@ void __guac_terminal_display_flush_clear(guac_terminal_display* display) {
/* Send rect */ /* Send rect */
guac_common_surface_rect( guac_common_surface_rect(
display->default_surface, display->display_surface,
col * display->char_width, col * display->char_width,
row * display->char_height, row * display->char_height,
rect_width * display->char_width, rect_width * display->char_width,
@ -835,7 +841,7 @@ void guac_terminal_display_flush(guac_terminal_display* display) {
__guac_terminal_display_flush_set(display); __guac_terminal_display_flush_set(display);
/* Flush surface */ /* Flush surface */
guac_common_surface_flush(display->default_surface); guac_common_surface_flush(display->display_surface);
} }

View File

@ -150,12 +150,17 @@ typedef struct guac_terminal_display {
int glyph_background; int glyph_background;
/** /**
* The display. * The surface containing the actual terminal.
*/ */
guac_common_surface* default_surface; guac_common_surface* display_surface;
/** /**
* Layer above default layer which highlights selected text. * Layer which contains the actual terminal.
*/
guac_layer* display_layer;
/**
* Sub-layer of display layer which highlights selected text.
*/ */
guac_layer* select_layer; guac_layer* select_layer;

View File

@ -245,6 +245,8 @@ 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_protocol_send_size(term->display->client->socket,
GUAC_DEFAULT_LAYER, width, height);
guac_terminal_display_resize(term->display, guac_terminal_display_resize(term->display,
term->term_width, term->term_height); term->term_width, term->term_height);
@ -1117,14 +1119,21 @@ static void __guac_terminal_resize(guac_terminal* term, int width, int height) {
int guac_terminal_resize(guac_terminal* terminal, int width, int height) { int guac_terminal_resize(guac_terminal* terminal, int width, int height) {
/* Calculate dimensions */ guac_terminal_display* display = terminal->display;
int rows = height / terminal->display->char_height; guac_client* client = display->client;
int columns = width / terminal->display->char_width; guac_socket* socket = client->socket;
/* If size has changed */ /* Calculate dimensions */
int rows = height / display->char_height;
int columns = width / display->char_width;
/* Resize default layer to given pixel dimensions */
guac_protocol_send_size(socket, GUAC_DEFAULT_LAYER, width, height);
/* Resize terminal if row/column dimensions have changed */
if (columns != terminal->term_width || rows != terminal->term_height) { if (columns != terminal->term_width || rows != terminal->term_height) {
guac_client_log(terminal->client, GUAC_LOG_DEBUG, guac_client_log(client, GUAC_LOG_DEBUG,
"Resizing terminal to %ix%i", rows, columns); "Resizing terminal to %ix%i", rows, columns);
/* Resize terminal */ /* Resize terminal */
@ -1136,6 +1145,12 @@ int guac_terminal_resize(guac_terminal* terminal, int width, int height) {
guac_terminal_flush(terminal); guac_terminal_flush(terminal);
} }
/* If terminal size hasn't changed, still need to flush */
else {
guac_protocol_send_sync(socket, client->last_sent_timestamp);
guac_socket_flush(socket);
}
return 0; return 0;
} }