diff --git a/eek/eek-keyboard.c b/eek/eek-keyboard.c index 82c45be7..07790245 100644 --- a/eek/eek-keyboard.c +++ b/eek/eek-keyboard.c @@ -57,8 +57,3 @@ LevelKeyboard *level_keyboard_new(EekboardContextService *manager, struct squeek keyboard->manager = manager; return keyboard; } - -struct squeek_view *level_keyboard_current(LevelKeyboard *keyboard) -{ - return squeek_layout_get_current_view(keyboard->layout); -} diff --git a/eek/eek-keyboard.h b/eek/eek-keyboard.h index 05bf5330..ebf63351 100644 --- a/eek/eek-keyboard.h +++ b/eek/eek-keyboard.h @@ -49,7 +49,6 @@ typedef struct _LevelKeyboard LevelKeyboard; gchar * eek_keyboard_get_keymap (LevelKeyboard *keyboard); -struct squeek_view *level_keyboard_current(LevelKeyboard *keyboard); LevelKeyboard *level_keyboard_new(EekboardContextService *manager, struct squeek_layout *layout); void level_keyboard_deinit(LevelKeyboard *self); void level_keyboard_free(LevelKeyboard *self); diff --git a/eek/eek-renderer.c b/eek/eek-renderer.c index c5c0a0a3..2c30a062 100644 --- a/eek/eek-renderer.c +++ b/eek/eek-renderer.c @@ -42,14 +42,12 @@ typedef struct _EekRendererPrivate GtkStyleContext *view_context; // owned GtkStyleContext *button_context; // TODO: maybe move a copy to each button - gdouble border_width; + gdouble border_width; // FIXME: border of what? gdouble allocation_width; gdouble allocation_height; - gdouble scale; gint scale_factor; /* the outputs scale factor */ - gint origin_x; - gint origin_y; + struct transformation widget_to_layout; PangoFontDescription *font; // owned reference @@ -65,14 +63,6 @@ void eek_render_button (EekRenderer *self, cairo_t *cr, const struct squeek_button *button, gboolean pressed, gboolean locked); -struct _CreateKeyboardSurfaceCallbackData { - cairo_t *cr; - EekRenderer *renderer; - struct squeek_view *view; - struct squeek_row *row; -}; -typedef struct _CreateKeyboardSurfaceCallbackData CreateKeyboardSurfaceCallbackData; - static void render_outline (cairo_t *cr, GtkStyleContext *ctx, @@ -271,8 +261,8 @@ eek_renderer_render_keyboard (EekRenderer *self, priv->allocation_width, priv->allocation_height); cairo_save(cr); - cairo_translate (cr, priv->origin_x, priv->origin_y); - cairo_scale (cr, priv->scale, priv->scale); + cairo_translate (cr, priv->widget_to_layout.origin_x, priv->widget_to_layout.origin_y); + cairo_scale (cr, priv->widget_to_layout.scale, priv->widget_to_layout.scale); squeek_draw_layout_base_view(priv->keyboard->layout, self, cr); squeek_layout_draw_all_changed(priv->keyboard->layout, self, cr); @@ -403,7 +393,6 @@ eek_renderer_init (EekRenderer *self) priv->border_width = 1.0; priv->allocation_width = 0.0; priv->allocation_height = 0.0; - priv->scale = 1.0; priv->scale_factor = 1; priv->font = NULL; @@ -461,8 +450,6 @@ eek_renderer_set_allocation_size (EekRenderer *renderer, gdouble width, gdouble height) { - gdouble scale; - g_return_if_fail (EEK_IS_RENDERER(renderer)); g_return_if_fail (width > 0.0 && height > 0.0); @@ -471,19 +458,9 @@ eek_renderer_set_allocation_size (EekRenderer *renderer, priv->allocation_width = width; priv->allocation_height = height; - /* Calculate a scale factor to use when rendering the keyboard into the - available space. */ - EekBounds bounds = squeek_view_get_bounds (level_keyboard_current(priv->keyboard)); - - gdouble w = (bounds.x * 2) + bounds.width; - gdouble h = (bounds.y * 2) + bounds.height; - - scale = MIN(width / w, height / h); - - priv->scale = scale; - /* Set the rendering offset in widget coordinates to center the keyboard */ - priv->origin_x = (gint)floor((width - (scale * w)) / 2); - priv->origin_y = (gint)floor((height - (scale * h)) / 2); + priv->widget_to_layout = squeek_layout_calculate_transformation( + priv->keyboard->layout, + priv->allocation_width, priv->allocation_height); // This is where size-dependent surfaces would be released } @@ -574,10 +551,5 @@ eek_renderer_get_transformation (EekRenderer *renderer) { g_return_val_if_fail (EEK_IS_RENDERER(renderer), failed); EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer); - struct transformation ret = { - .origin_x = priv->origin_x, - .origin_y = priv->origin_y, - .scale = priv->scale, - }; - return ret; + return priv->widget_to_layout; } diff --git a/src/layout.h b/src/layout.h index 602ebf83..45748ecc 100644 --- a/src/layout.h +++ b/src/layout.h @@ -14,13 +14,8 @@ enum squeek_arrangement_kind { ARRANGEMENT_KIND_WIDE = 1, }; -struct squeek_view; struct squeek_layout; -int32_t squeek_row_get_angle(const struct squeek_row*); - -EekBounds squeek_row_get_bounds(const struct squeek_row*); - EekBounds squeek_button_get_bounds(const struct squeek_button*); const char *squeek_button_get_label(const struct squeek_button*); const char *squeek_button_get_icon_name(const struct squeek_button*); @@ -29,12 +24,12 @@ const char *squeek_button_get_outline_name(const struct squeek_button*); void squeek_button_print(const struct squeek_button* button); - -EekBounds squeek_view_get_bounds(const struct squeek_view*); +struct transformation squeek_layout_calculate_transformation( + const struct squeek_layout *layout, + double allocation_width, double allocation_size); void squeek_layout_place_contents(struct squeek_layout*); -struct squeek_view *squeek_layout_get_current_view(struct squeek_layout*); struct squeek_layout *squeek_load_layout(const char *name, uint32_t type); const char *squeek_layout_get_keymap(const struct squeek_layout*); diff --git a/src/layout.rs b/src/layout.rs index 1a40d824..d9b43235 100644 --- a/src/layout.rs +++ b/src/layout.rs @@ -129,29 +129,6 @@ pub mod c { // The following defined in Rust. TODO: wrap naked pointers to Rust data inside RefCells to prevent multiple writers - #[no_mangle] - pub extern "C" - fn squeek_view_get_bounds(view: *const ::layout::View) -> Bounds { - unsafe { &*view }.bounds.clone() - } - - #[no_mangle] - pub extern "C" - fn squeek_row_get_angle(row: *const ::layout::Row) -> i32 { - let row = unsafe { &*row }; - row.angle - } - - #[no_mangle] - pub extern "C" - fn squeek_row_get_bounds(row: *const ::layout::Row) -> Bounds { - let row = unsafe { &*row }; - match &row.bounds { - Some(bounds) => bounds.clone(), - None => panic!("Row doesn't have any bounds yet"), - } - } - #[no_mangle] pub extern "C" fn squeek_button_get_bounds(button: *const ::layout::Button) -> Bounds { @@ -207,16 +184,26 @@ pub mod c { println!("{:?}", button); } + /// Positions the layout within the available space #[no_mangle] pub extern "C" - fn squeek_layout_get_current_view(layout: *const Layout) -> *const View { + fn squeek_layout_calculate_transformation( + layout: *const Layout, + allocation_width: f64, + allocation_height: f64, + ) -> Transformation { let layout = unsafe { &*layout }; - let view_name = layout.current_view.clone(); - layout.views.get(&view_name) - .expect("Current view doesn't exist") - .as_ref() as *const View + let bounds = &layout.get_current_view().bounds; + let h_scale = allocation_width / bounds.width; + let v_scale = allocation_height / bounds.height; + let scale = if h_scale > v_scale { h_scale } else { v_scale }; + Transformation { + origin_x: allocation_width - (scale * bounds.width) / 2.0, + origin_y: allocation_height - (scale * bounds.height) / 2.0, + scale: scale, + } } - + #[no_mangle] pub extern "C" fn squeek_layout_get_keymap(layout: *const Layout) -> *const c_char {