diff --git a/eek/eek-renderer.c b/eek/eek-renderer.c index eeb7cc3d4593ff0200a3c2b60c9ee34716bf8a8e..677a9c15a5a415cb6352a0ca1896c188f291e302 100644 --- a/eek/eek-renderer.c +++ b/eek/eek-renderer.c @@ -147,12 +147,11 @@ create_keyboard_surface_section_callback (EekElement *element, cairo_restore (data->cr); } -static cairo_surface_t * -create_keyboard_surface (EekRenderer *renderer) +void +render_keyboard_surface (EekRenderer *renderer) { EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer); EekBounds bounds; - cairo_surface_t *keyboard_surface; CreateKeyboardSurfaceCallbackData data; EekColor foreground, background; @@ -165,14 +164,7 @@ create_keyboard_surface (EekRenderer *renderer) eek_element_get_bounds (EEK_ELEMENT(priv->keyboard), &bounds); - /* Create a surface that encompasses the dimensions of the keyboard as well - as the margin around the edge. */ - keyboard_surface = cairo_image_surface_create ( - CAIRO_FORMAT_ARGB32, - ceil(((bounds.x * 2) + bounds.width) * priv->scale), - ceil(((bounds.y * 2) + bounds.height) * priv->scale)); - - data.cr = cairo_create (keyboard_surface); + data.cr = cairo_create (priv->keyboard_surface); data.renderer = renderer; cairo_translate (data.cr, bounds.x * priv->scale, bounds.y * priv->scale); @@ -196,8 +188,6 @@ create_keyboard_surface (EekRenderer *renderer) create_keyboard_surface_section_callback, &data); cairo_destroy (data.cr); - - return keyboard_surface; } static void @@ -706,8 +696,14 @@ eek_renderer_real_render_keyboard (EekRenderer *self, g_return_if_fail (priv->allocation_width > 0.0); g_return_if_fail (priv->allocation_height > 0.0); - if (!priv->keyboard_surface) - priv->keyboard_surface = create_keyboard_surface (self); + if (priv->keyboard_surface) + cairo_surface_destroy (priv->keyboard_surface); + + priv->keyboard_surface = cairo_surface_create_for_rectangle ( + cairo_get_target (cr), 0, 0, + priv->allocation_width, priv->allocation_height); + + render_keyboard_surface (self); cairo_set_source_surface (cr, priv->keyboard_surface, 0.0, 0.0); source = cairo_get_source (cr); diff --git a/src/server-context-service.c b/src/server-context-service.c index b3e1d6cc70166265a47b27b4fa77dfba06fc3f3f..54328bfb786554d3bb68903451e251ce1d80b4b5 100644 --- a/src/server-context-service.c +++ b/src/server-context-service.c @@ -75,6 +75,9 @@ on_destroy (GtkWidget *widget, gpointer user_data) eekboard_context_service_destroy (EEKBOARD_CONTEXT_SERVICE (context)); } +static void +make_widget (ServerContextService *context); + static void on_notify_keyboard (GObject *object, GParamSpec *spec, @@ -94,6 +97,9 @@ on_notify_keyboard (GObject *object, keyboard); /* Recreate the keyboard widget to keep in sync with the keymap. */ + if (context->window) + make_widget(context); + gboolean visible; g_object_get (context, "visible", &visible, NULL); @@ -232,7 +238,11 @@ make_widget (ServerContextService *context) EekKeyboard *keyboard; EekTheme *theme; - g_return_if_fail (!context->widget); + if (context->widget) { + gtk_widget_destroy(context->widget); + context->widget = NULL; + } + theme = eek_theme_new ("resource:///sm/puri/squeekboard/style.css", NULL, NULL); @@ -257,12 +267,8 @@ server_context_service_real_show_keyboard (EekboardContextService *_context) if (!context->window) make_window (context); - if (context->widget) { - gtk_widget_destroy(context->widget); - context->widget = NULL; - } - - make_widget (context); + if (!context->widget) + make_widget (context); EEKBOARD_CONTEXT_SERVICE_CLASS (server_context_service_parent_class)-> show_keyboard (_context);