guac_terminal_scrollbar* guac_terminal_scrollbar_alloc(guac_client* client, const guac_layer* parent, int parent_width, int parent_height, int visible_area) { /* Allocate scrollbar */ guac_terminal_scrollbar* scrollbar = malloc(sizeof(guac_terminal_scrollbar)); /* Associate client */ scrollbar->client = client; /* Init default min/max and value */ scrollbar->min = 0; scrollbar->max = 0; scrollbar->value = 0; /* Init parent data */ scrollbar->parent = parent; scrollbar->parent_width = 0; scrollbar->parent_height = 0; scrollbar->visible_area = 0; /* Init handle render state */ scrollbar->render_state.handle_x = 0; scrollbar->render_state.handle_y = 0; scrollbar->render_state.handle_width = 0; scrollbar->render_state.handle_height = 0; /* Init container render state */ scrollbar->render_state.container_x = 0; scrollbar->render_state.container_y = 0; scrollbar->render_state.container_width = 0; scrollbar->render_state.container_height = 0; /* Allocate and init layers */ scrollbar->container = guac_client_alloc_layer(client); scrollbar->handle = guac_client_alloc_layer(client); /* Init mouse event state tracking */ scrollbar->dragging_handle = 0; /* Reposition and resize to fit parent */ guac_terminal_scrollbar_parent_resized(scrollbar, parent_width, parent_height, visible_area); return scrollbar; }
void test_layer_pool() { guac_client* client; int i; int seen[GUAC_BUFFER_POOL_INITIAL_SIZE] = {0}; guac_layer* layer; /* Get client */ client = guac_client_alloc(); CU_ASSERT_PTR_NOT_NULL_FATAL(client); /* Fill pool */ for (i=0; i<GUAC_BUFFER_POOL_INITIAL_SIZE; i++) { /* Allocate and throw away a buffer (should not disturb layer alloc) */ CU_ASSERT_PTR_NOT_NULL_FATAL(guac_client_alloc_buffer(client)); layer = guac_client_alloc_layer(client); /* Index should be within pool size */ CU_ASSERT_PTR_NOT_NULL_FATAL(layer); CU_ASSERT_FATAL(layer->index > 0); CU_ASSERT_FATAL(layer->index <= GUAC_BUFFER_POOL_INITIAL_SIZE); /* This should be a layer we have not seen yet */ CU_ASSERT_FALSE(seen[layer->index - 1]); seen[layer->index - 1] = 1; guac_client_free_layer(client, layer); } /* Now that pool is filled, we should get a previously seen layer */ layer = guac_client_alloc_layer(client); CU_ASSERT_FATAL(layer->index > 0); CU_ASSERT_FATAL(layer->index <= GUAC_BUFFER_POOL_INITIAL_SIZE); CU_ASSERT_TRUE(seen[layer->index - 1]); /* Free client */ guac_client_free(client); }
guac_common_display_layer* guac_common_display_alloc_layer( guac_common_display* display, int width, int height) { guac_layer* layer; guac_common_surface* surface; /* Allocate Guacamole layer */ layer = guac_client_alloc_layer(display->client); /* Allocate corresponding surface */ surface = guac_common_surface_alloc(display->client, display->client->socket, layer, width, height); /* Add layer and surface to list */ return guac_common_display_add_layer(&display->layers, layer, surface); }
guac_terminal_display* guac_terminal_display_alloc(guac_client* client, const char* font_name, int font_size, int dpi, int foreground, int background) { PangoFontMap* font_map; PangoFont* font; PangoFontMetrics* metrics; PangoContext* context; /* Allocate display */ guac_terminal_display* display = malloc(sizeof(guac_terminal_display)); display->client = client; /* Create default surface */ display->display_layer = guac_client_alloc_layer(client); display->select_layer = guac_client_alloc_layer(client); display->display_surface = guac_common_surface_alloc(client, 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 */ display->font_desc = pango_font_description_new(); pango_font_description_set_family(display->font_desc, font_name); pango_font_description_set_weight(display->font_desc, PANGO_WEIGHT_NORMAL); pango_font_description_set_size(display->font_desc, font_size * PANGO_SCALE * dpi / 96); font_map = pango_cairo_font_map_get_default(); context = pango_font_map_create_context(font_map); font = pango_font_map_load_font(font_map, context, display->font_desc); if (font == NULL) { guac_client_abort(display->client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Unable to get font \"%s\"", font_name); return NULL; } metrics = pango_font_get_metrics(font, NULL); if (metrics == NULL) { guac_client_abort(display->client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Unable to get font metrics for font \"%s\"", font_name); return NULL; } display->default_foreground = display->glyph_foreground = foreground; display->default_background = display->glyph_background = background; /* Calculate character dimensions */ display->char_width = pango_font_metrics_get_approximate_digit_width(metrics) / PANGO_SCALE; display->char_height = (pango_font_metrics_get_descent(metrics) + pango_font_metrics_get_ascent(metrics)) / PANGO_SCALE; /* Initially empty */ display->width = 0; display->height = 0; display->operations = NULL; /* Initially nothing selected */ display->text_selected = display->selection_committed = false; return display; }