From f479a36dbec03344062fc8505751ce302f2b1f66 Mon Sep 17 00:00:00 2001 From: Dorota Czaplejewicz Date: Fri, 16 Aug 2019 15:44:22 +0000 Subject: [PATCH] keyboard: Remove references --- eek/eek-gtk-keyboard.c | 18 +++---- eek/eek-keyboard.c | 18 ++++--- eek/eek-keyboard.h | 12 +++-- eek/eek-layout.c | 21 ++++----- eek/eek-layout.h | 3 +- eek/eek-renderer.c | 44 +++++++---------- eek/eek-renderer.h | 2 +- eek/eek-types.h | 7 --- eek/eek-xml-layout.c | 20 ++++---- eekboard/eekboard-context-service.h | 2 +- src/layout.h | 12 +++++ src/layout.rs | 73 +++++++++++++++++++++++++++-- src/server-context-service.c | 3 +- tests/eek-simple-test.c | 6 +-- 14 files changed, 148 insertions(+), 93 deletions(-) diff --git a/eek/eek-gtk-keyboard.c b/eek/eek-gtk-keyboard.c index 053bf727..507a1dc6 100644 --- a/eek/eek-gtk-keyboard.c +++ b/eek/eek-gtk-keyboard.c @@ -62,10 +62,10 @@ typedef struct _EekGtkKeyboardPrivate G_DEFINE_TYPE_WITH_PRIVATE (EekGtkKeyboard, eek_gtk_keyboard, GTK_TYPE_DRAWING_AREA) -static void on_button_pressed (struct squeek_button *button, EekKeyboard *view, +static void on_button_pressed (struct squeek_button *button, struct squeek_view *view, EekGtkKeyboard *self); static void on_button_released (struct squeek_button *button, - EekKeyboard *view, + struct squeek_view *view, EekGtkKeyboard *self); static void render_pressed_button (GtkWidget *widget, struct button_place *place); static void render_locked_button (GtkWidget *widget, @@ -110,7 +110,7 @@ eek_gtk_keyboard_real_draw (GtkWidget *self, eek_renderer_render_keyboard (priv->renderer, cr); - EekKeyboard *view = priv->keyboard->views[priv->keyboard->level]; + struct squeek_view *view = priv->keyboard->views[priv->keyboard->level]; /* redraw pressed key */ const GList *list = priv->keyboard->pressed_buttons; @@ -155,7 +155,7 @@ static void depress(EekGtkKeyboard *self, gdouble x, gdouble y, guint32 time) { EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); - EekKeyboard *view = level_keyboard_current(priv->keyboard); + struct squeek_view *view = level_keyboard_current(priv->keyboard); struct squeek_button *button = eek_renderer_find_button_by_position (priv->renderer, view, x, y); if (button) { @@ -167,7 +167,7 @@ static void depress(EekGtkKeyboard *self, static void drag(EekGtkKeyboard *self, gdouble x, gdouble y, guint32 time) { EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); - EekKeyboard *view = level_keyboard_current(priv->keyboard); + struct squeek_view *view = level_keyboard_current(priv->keyboard); struct squeek_button *button = eek_renderer_find_button_by_position (priv->renderer, view, x, y); GList *list, *head; @@ -202,7 +202,7 @@ static void drag(EekGtkKeyboard *self, static void release(EekGtkKeyboard *self, guint32 time) { EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); - EekKeyboard *view = level_keyboard_current(priv->keyboard); + struct squeek_view *view = level_keyboard_current(priv->keyboard); GList *list = g_list_copy(priv->keyboard->pressed_buttons); for (GList *head = list; head; head = g_list_next (head)) { @@ -311,7 +311,7 @@ eek_gtk_keyboard_real_query_tooltip (GtkWidget *widget, { EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget); EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); - EekKeyboard *view = level_keyboard_current(priv->keyboard); + struct squeek_view *view = level_keyboard_current(priv->keyboard); struct squeek_button *button = eek_renderer_find_button_by_position (priv->renderer, view, @@ -516,7 +516,7 @@ render_released_button (GtkWidget *widget, static void on_button_pressed (struct squeek_button *button, - EekKeyboard *view, + struct squeek_view *view, EekGtkKeyboard *self) { EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); @@ -546,7 +546,7 @@ on_button_pressed (struct squeek_button *button, static void on_button_released (struct squeek_button *button, - EekKeyboard *view, + struct squeek_view *view, EekGtkKeyboard *self) { (void)view; diff --git a/eek/eek-keyboard.c b/eek/eek-keyboard.c index 0b57214e..e1d711b0 100644 --- a/eek/eek-keyboard.c +++ b/eek/eek-keyboard.c @@ -281,7 +281,7 @@ void level_keyboard_init(LevelKeyboard *self) { self->outline_array = g_array_new (FALSE, TRUE, sizeof (EekOutline)); } -LevelKeyboard *level_keyboard_new(EekboardContextService *manager, EekKeyboard *views[4], GHashTable *name_button_hash) { +LevelKeyboard *level_keyboard_new(EekboardContextService *manager, struct squeek_view *views[4], GHashTable *name_button_hash) { LevelKeyboard *keyboard = g_new0(LevelKeyboard, 1); level_keyboard_init(keyboard); for (uint i = 0; i < 4; i++) { @@ -405,7 +405,7 @@ eek_keyboard_get_keymap(LevelKeyboard *keyboard) return keymap; } -EekKeyboard *level_keyboard_current(LevelKeyboard *keyboard) +struct squeek_view *level_keyboard_current(LevelKeyboard *keyboard) { return keyboard->views[keyboard->level]; } @@ -416,8 +416,7 @@ struct GetRowData { struct squeek_key *needle; }; -void find_button_in_row(gpointer item, gpointer user_data) { - struct squeek_row *row = item; +void find_button_in_row(struct squeek_row *row, gpointer user_data) { struct GetRowData *data = user_data; if (data->row) { return; @@ -427,18 +426,17 @@ void find_button_in_row(gpointer item, gpointer user_data) { } } -struct squeek_row *eek_keyboard_get_row(EekKeyboard *keyboard, +struct squeek_row *eek_keyboard_get_row(struct squeek_view *view, struct squeek_button *button) { struct GetRowData data = { .button = button, .row = NULL, }; - eek_keyboard_foreach(keyboard, find_button_in_row, &data); + squeek_view_foreach(view, find_button_in_row, &data); return data.row; } -void find_key_in_row(gpointer item, gpointer user_data) { - struct squeek_row *row = item; +void find_key_in_row(struct squeek_row *row, gpointer user_data) { struct GetRowData *data = user_data; if (data->button) { return; @@ -451,14 +449,14 @@ void find_key_in_row(gpointer item, gpointer user_data) { // TODO: return multiple -struct button_place eek_keyboard_get_button_by_state(EekKeyboard *keyboard, +struct button_place eek_keyboard_get_button_by_state(struct squeek_view *view, struct squeek_key *key) { struct GetRowData data = { .row = NULL, .button = NULL, .needle = key, }; - eek_keyboard_foreach(keyboard, find_key_in_row, &data); + squeek_view_foreach(view, find_key_in_row, &data); struct button_place ret = { .row = data.row, .button = data.button, diff --git a/eek/eek-keyboard.h b/eek/eek-keyboard.h index c3e6d234..def34888 100644 --- a/eek/eek-keyboard.h +++ b/eek/eek-keyboard.h @@ -57,6 +57,8 @@ struct _EekKeyboard GPtrArray *rows; // struct squeek_row* }; +typedef struct _EekKeyboard EekKeyboard; + /** * EekKeyboardClass: * @create_section: virtual function for creating a section @@ -103,7 +105,7 @@ typedef struct _EekModifierKey EekModifierKey; /// Keyboard state holder struct _LevelKeyboard { - EekKeyboard *views[4]; + struct squeek_view *views[4]; guint level; struct xkb_keymap *keymap; int keymap_fd; // keymap formatted as XKB string @@ -133,7 +135,7 @@ void eek_keyboard_set_size gdouble width, gdouble height); -struct squeek_row *eek_keyboard_get_row(EekKeyboard *keyboard, +struct squeek_row *eek_keyboard_get_row(struct squeek_view *view, struct squeek_button *button); struct squeek_button *eek_keyboard_find_button_by_name(LevelKeyboard *keyboard, const gchar *name); @@ -144,7 +146,7 @@ struct button_place { struct squeek_button *button; }; -struct button_place eek_keyboard_get_button_by_state(EekKeyboard *keyboard, +struct button_place eek_keyboard_get_button_by_state(struct squeek_view *view, struct squeek_key *key); EekOutline *level_keyboard_get_outline @@ -165,8 +167,8 @@ void eek_keyboard_foreach (EekKeyboard *keyboard, GFunc func, gpointer user_data); -EekKeyboard *level_keyboard_current(LevelKeyboard *keyboard); -LevelKeyboard *level_keyboard_new(EekboardContextService *manager, EekKeyboard *views[4], GHashTable *name_button_hash); +struct squeek_view *level_keyboard_current(LevelKeyboard *keyboard); +LevelKeyboard *level_keyboard_new(EekboardContextService *manager, struct squeek_view *views[], GHashTable *name_button_hash); void level_keyboard_deinit(LevelKeyboard *self); void level_keyboard_free(LevelKeyboard *self); diff --git a/eek/eek-layout.c b/eek/eek-layout.c index e83086d0..af27e885 100644 --- a/eek/eek-layout.c +++ b/eek/eek-layout.c @@ -56,11 +56,10 @@ struct place_data { }; static void -row_placer(gpointer item, gpointer user_data) +row_placer(struct squeek_row *row, gpointer user_data) { struct place_data *data = (struct place_data*)user_data; - struct squeek_row *row = item; EekBounds row_bounds = { .x = 0, .y = 0, @@ -79,16 +78,15 @@ row_placer(gpointer item, gpointer user_data) } static void -row_counter(gpointer item, gpointer user_data) { +row_counter(struct squeek_row *row, gpointer user_data) { double *total_height = user_data; - struct squeek_row *row = item; EekBounds row_bounds = squeek_row_get_bounds(row); *total_height += row_bounds.height + row_spacing; } void -eek_layout_place_rows(LevelKeyboard *keyboard, EekKeyboard *level) +eek_layout_place_rows(LevelKeyboard *keyboard, struct squeek_view *level) { /* Order rows */ // This needs to be done after outlines, because outlines define key sizes @@ -96,20 +94,19 @@ eek_layout_place_rows(LevelKeyboard *keyboard, EekKeyboard *level) // The keyboard width is given by the user via screen size. The height will be given dynamically. // TODO: calculate max line width beforehand for button centering. Leave keyboard centering to the renderer later - EekBounds keyboard_bounds = {0}; - eek_element_get_bounds(EEK_ELEMENT(level), &keyboard_bounds); + EekBounds view_bounds = squeek_view_get_bounds(level); struct place_data placer_data = { - .desired_width = keyboard_bounds.width, + .desired_width = view_bounds.width, .current_offset = 0, .keyboard = keyboard, }; - eek_keyboard_foreach(level, row_placer, &placer_data); + squeek_view_foreach(level, row_placer, &placer_data); double total_height = 0; - eek_keyboard_foreach(level, row_counter, &total_height); - keyboard_bounds.height = total_height; - eek_element_set_bounds(EEK_ELEMENT(level), &keyboard_bounds); + squeek_view_foreach(level, row_counter, &total_height); + view_bounds.height = total_height; + squeek_view_set_bounds(level, view_bounds); } void diff --git a/eek/eek-layout.h b/eek/eek-layout.h index fb98abaf..83c4976a 100644 --- a/eek/eek-layout.h +++ b/eek/eek-layout.h @@ -27,6 +27,7 @@ #include #include "eek-types.h" +#include "src/layout.h" G_BEGIN_DECLS @@ -55,7 +56,7 @@ struct _EekLayoutClass GType eek_layout_get_type (void) G_GNUC_CONST; -void eek_layout_place_rows(LevelKeyboard *keyboard, EekKeyboard *level); +void eek_layout_place_rows(LevelKeyboard *keyboard, struct squeek_view *level); void eek_layout_update_layout(LevelKeyboard *keyboard); diff --git a/eek/eek-renderer.c b/eek/eek-renderer.c index fac2ced7..28ef1daf 100644 --- a/eek/eek-renderer.c +++ b/eek/eek-renderer.c @@ -86,7 +86,7 @@ static void render_button (EekRenderer *self, struct _CreateKeyboardSurfaceCallbackData { cairo_t *cr; EekRenderer *renderer; - EekKeyboard *view; + struct squeek_view *view; struct squeek_row *row; }; typedef struct _CreateKeyboardSurfaceCallbackData CreateKeyboardSurfaceCallbackData; @@ -117,11 +117,11 @@ create_keyboard_surface_button_callback (struct squeek_button *button, } static void -create_keyboard_surface_row_callback (gpointer item, +create_keyboard_surface_row_callback (struct squeek_row *row, gpointer user_data) { CreateKeyboardSurfaceCallbackData *data = user_data; - struct squeek_row *row = item; + EekBounds bounds = squeek_row_get_bounds(row); cairo_save (data->cr); @@ -137,16 +137,15 @@ create_keyboard_surface_row_callback (gpointer item, cairo_restore (data->cr); } -void -render_keyboard_surface (EekRenderer *renderer, EekKeyboard *view) +static void +render_keyboard_surface (EekRenderer *renderer, struct squeek_view *view) { EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer); - EekBounds bounds; EekColor foreground; eek_renderer_get_foreground_color (renderer, priv->scontext, &foreground); - eek_element_get_bounds (EEK_ELEMENT(level_keyboard_current(priv->keyboard)), &bounds); + EekBounds bounds = squeek_view_get_bounds (level_keyboard_current(priv->keyboard)); CreateKeyboardSurfaceCallbackData data = { .cr = cairo_create (priv->keyboard_surface), @@ -175,7 +174,7 @@ render_keyboard_surface (EekRenderer *renderer, EekKeyboard *view) foreground.alpha); /* draw rows */ - eek_keyboard_foreach(level_keyboard_current(priv->keyboard), + squeek_view_foreach(level_keyboard_current(priv->keyboard), create_keyboard_surface_row_callback, &data); cairo_restore (data.cr); @@ -687,7 +686,6 @@ eek_renderer_set_allocation_size (EekRenderer *renderer, gdouble width, gdouble height) { - EekBounds bounds; gdouble scale; g_return_if_fail (EEK_IS_RENDERER(renderer)); @@ -700,7 +698,7 @@ eek_renderer_set_allocation_size (EekRenderer *renderer, /* Calculate a scale factor to use when rendering the keyboard into the available space. */ - eek_element_get_bounds (EEK_ELEMENT(level_keyboard_current(priv->keyboard)), &bounds); + 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; @@ -719,13 +717,11 @@ eek_renderer_get_size (EekRenderer *renderer, gdouble *width, gdouble *height) { - EekBounds bounds; - g_return_if_fail (EEK_IS_RENDERER(renderer)); EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer); - eek_element_get_bounds (EEK_ELEMENT(level_keyboard_current(priv->keyboard)), &bounds); + EekBounds bounds = squeek_view_get_bounds (level_keyboard_current(priv->keyboard)); if (width) *width = bounds.width; if (height) @@ -738,7 +734,6 @@ eek_renderer_get_button_bounds (EekRenderer *renderer, EekBounds *bounds, gboolean rotate) { - EekBounds keyboard_bounds; gint angle = 0; EekPoint points[4], min, max; @@ -750,12 +745,11 @@ eek_renderer_get_button_bounds (EekRenderer *renderer, EekBounds button_bounds = squeek_button_get_bounds(place->button); EekBounds row_bounds = squeek_row_get_bounds (place->row); - eek_element_get_bounds (EEK_ELEMENT(level_keyboard_current(priv->keyboard)), - &keyboard_bounds); + EekBounds view_bounds = squeek_view_get_bounds (level_keyboard_current(priv->keyboard)); if (!rotate) { - button_bounds.x += keyboard_bounds.x + row_bounds.x; - button_bounds.y += keyboard_bounds.y + row_bounds.y; + button_bounds.x += view_bounds.x + row_bounds.x; + button_bounds.y += view_bounds.y + row_bounds.y; *bounds = button_bounds; return; } @@ -785,8 +779,8 @@ eek_renderer_get_button_bounds (EekRenderer *renderer, if (points[i].y > max.y) max.y = points[i].y; } - bounds->x = keyboard_bounds.x + row_bounds.x + min.x; - bounds->y = keyboard_bounds.y + row_bounds.y + min.y; + bounds->x = view_bounds.x + row_bounds.x + min.x; + bounds->y = view_bounds.y + row_bounds.y + min.y; bounds->width = (max.x - min.x); bounds->height = (max.y - min.y); } @@ -975,10 +969,9 @@ eek_are_bounds_inside (EekBounds bounds, EekPoint point, EekPoint origin, int32_ } static void -find_button_by_position_row_callback (gpointer item, +find_button_by_position_row_callback (struct squeek_row *row, gpointer user_data) { - struct squeek_row *row = item; FindKeyByPositionCallbackData *data = user_data; if (data->button) { return; @@ -997,17 +990,16 @@ find_button_by_position_row_callback (gpointer item, **/ struct squeek_button * eek_renderer_find_button_by_position (EekRenderer *renderer, - EekKeyboard *view, + struct squeek_view *view, gdouble x, gdouble y) { - EekBounds bounds; FindKeyByPositionCallbackData data; g_return_val_if_fail (EEK_IS_RENDERER(renderer), NULL); EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer); - eek_element_get_bounds (EEK_ELEMENT(view), &bounds); + EekBounds bounds = squeek_view_get_bounds (view); /* Transform from widget coordinates to keyboard coordinates */ x = (x - priv->origin_x)/priv->scale - bounds.x; @@ -1025,7 +1017,7 @@ eek_renderer_find_button_by_position (EekRenderer *renderer, data.origin.y = 0; data.button = NULL; - eek_keyboard_foreach (view, find_button_by_position_row_callback, + squeek_view_foreach (view, find_button_by_position_row_callback, &data); return data.button; } diff --git a/eek/eek-renderer.h b/eek/eek-renderer.h index 0f94e397..4a72e763 100644 --- a/eek/eek-renderer.h +++ b/eek/eek-renderer.h @@ -103,7 +103,7 @@ void eek_renderer_get_foreground_color EekColor *color); void eek_renderer_set_border_width (EekRenderer *renderer, gdouble border_width); -struct squeek_button *eek_renderer_find_button_by_position(EekRenderer *renderer, EekKeyboard *view, +struct squeek_button *eek_renderer_find_button_by_position(EekRenderer *renderer, struct squeek_view *view, gdouble x, gdouble y); void eek_renderer_apply_transformation_for_button diff --git a/eek/eek-types.h b/eek/eek-types.h index c848e0a1..1d37dfc2 100644 --- a/eek/eek-types.h +++ b/eek/eek-types.h @@ -134,7 +134,6 @@ typedef enum #define EEK_INVALID_KEYCODE (0) typedef struct _EekElement EekElement; -typedef struct _EekKeyboard EekKeyboard; typedef struct _EekSymbol EekSymbol; typedef struct _EekText EekText; typedef struct _EekTheme EekTheme; @@ -192,12 +191,6 @@ GType eek_bounds_get_type (void) G_GNUC_CONST; EekBounds *eek_bounds_copy (const EekBounds *bounds); void eek_bounds_free (EekBounds *bounds); -G_INLINE_FUNC gdouble -eek_bounds_long_side (EekBounds *bounds) -{ - return bounds->width > bounds->height ? bounds->width : bounds->height; -} - /** * EekOutline: * @corner_radius: radius of corners of rounded polygon diff --git a/eek/eek-xml-layout.c b/eek/eek-xml-layout.c index 634a59b1..5dacce55 100644 --- a/eek/eek-xml-layout.c +++ b/eek/eek-xml-layout.c @@ -66,7 +66,7 @@ static GList *parse_prerequisites (const gchar *path, GError **error); static gboolean parse_geometry (const gchar *path, - EekKeyboard **views, GArray *outline_array, GHashTable *name_button_hash, + struct squeek_view **views, GArray *outline_array, GHashTable *name_button_hash, GError **error); static gboolean parse_symbols_with_prerequisites (const gchar *keyboards_dir, @@ -231,7 +231,7 @@ struct _GeometryParseData { GSList *element_stack; EekBounds bounds; - EekKeyboard **views; + struct squeek_view **views; guint view_idx; struct squeek_row *row; gint num_rows; @@ -254,7 +254,7 @@ struct _GeometryParseData { typedef struct _GeometryParseData GeometryParseData; static GeometryParseData * -geometry_parse_data_new (EekKeyboard **views, GHashTable *name_button_hash, GArray *outline_array) +geometry_parse_data_new (struct squeek_view **views, GHashTable *name_button_hash, GArray *outline_array) { GeometryParseData *data = g_slice_new0 (GeometryParseData); @@ -367,20 +367,18 @@ geometry_start_element_callback (GMarkupParseContext *pcontext, if (g_strcmp0 (element_name, "view") == 0) { /* Create an empty keyboard to which geometry and symbols information are applied. */ - EekKeyboard *view = g_object_new (EEK_TYPE_KEYBOARD, NULL); - eek_element_set_bounds (EEK_ELEMENT(view), &data->bounds); + struct squeek_view *view = squeek_view_new(data->bounds); data->views[data->view_idx] = view; } if (g_strcmp0 (element_name, "section") == 0) { - data->row = eek_keyboard_real_create_row(data->views[data->view_idx]); + gint angle = 0; attribute = get_attribute (attribute_names, attribute_values, "angle"); if (attribute != NULL) { - gint angle; angle = strtol (attribute, NULL, 10); - squeek_row_set_angle (data->row, angle); } + data->row = squeek_view_create_row(data->views[data->view_idx], angle); goto out; } @@ -634,7 +632,7 @@ struct _SymbolsParseData { GString *text; LevelKeyboard *keyboard; - EekKeyboard *view; + struct squeek_view *view; gchar *label; gchar *icon; @@ -884,7 +882,7 @@ eek_xml_layout_real_create_keyboard (EekLayout *self, g_free, NULL); // One view for each level - EekKeyboard *views[4] = {0}; + struct squeek_view *views[4] = {0}; GError *error = NULL; retval = parse_geometry (path, views, outline_array, name_button_hash, &error); @@ -1119,7 +1117,7 @@ eek_xml_keyboard_desc_free (EekXmlKeyboardDesc *desc) } static gboolean -parse_geometry (const gchar *path, EekKeyboard **views, GArray *outline_array, GHashTable *name_button_hash, GError **error) +parse_geometry (const gchar *path, struct squeek_view **views, GArray *outline_array, GHashTable *name_button_hash, GError **error) { GeometryParseData *data; GMarkupParseContext *pcontext; diff --git a/eekboard/eekboard-context-service.h b/eekboard/eekboard-context-service.h index 014f0dbc..1e89f780 100644 --- a/eekboard/eekboard-context-service.h +++ b/eekboard/eekboard-context-service.h @@ -73,7 +73,7 @@ struct _EekboardContextServiceClass { GObjectClass parent_class; /*< public >*/ - EekKeyboard *(*create_keyboard) (EekboardContextService *self, + struct squeek_view *(*create_keyboard) (EekboardContextService *self, const gchar *keyboard_type); void (*show_keyboard) (EekboardContextService *self); void (*hide_keyboard) (EekboardContextService *self); diff --git a/src/layout.h b/src/layout.h index 3f6e752e..89949fb2 100644 --- a/src/layout.h +++ b/src/layout.h @@ -8,6 +8,7 @@ struct squeek_button; struct squeek_row; +struct squeek_view; struct squeek_row *squeek_row_new(int32_t angle); struct squeek_button *squeek_row_create_button (struct squeek_row *row, @@ -57,5 +58,16 @@ uint32_t *squeek_button_has_key(const struct squeek_button* button, void squeek_button_print(const struct squeek_button* button); +struct squeek_view *squeek_view_new(EekBounds bounds); +struct squeek_row *squeek_view_create_row(struct squeek_view *, int32_t angle); +EekBounds squeek_view_get_bounds(const struct squeek_view*); +void squeek_view_set_bounds(const struct squeek_view*, EekBounds bounds); + +typedef void (*RowCallback) (struct squeek_row *row, gpointer user_data); +void squeek_view_foreach(struct squeek_view*, + RowCallback callback, + gpointer user_data); + + void squeek_row_place_buttons(struct squeek_row *row, LevelKeyboard *keyboard); #endif diff --git a/src/layout.rs b/src/layout.rs index db695a8e..0c19d45b 100644 --- a/src/layout.rs +++ b/src/layout.rs @@ -42,18 +42,69 @@ pub mod c { } type ButtonCallback = unsafe extern "C" fn(button: *mut ::layout::Button, data: *mut UserData); + type RowCallback = unsafe extern "C" fn(row: *mut ::layout::Row, data: *mut UserData); // 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_row_new(angle: i32) -> *mut ::layout::Row { - Box::into_raw(Box::new(::layout::Row { - buttons: Vec::new(), - angle: angle, - bounds: None, + fn squeek_view_new(bounds: Bounds) -> *mut ::layout::View { + Box::into_raw(Box::new(::layout::View { + rows: Vec::new(), + bounds: bounds, })) } + + #[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_view_set_bounds(view: *mut ::layout::View, bounds: Bounds) { + unsafe { &mut *view }.bounds = bounds; + } + + /// Places a row into the view and returns a reference to it + #[no_mangle] + pub extern "C" + fn squeek_view_create_row( + view: *mut ::layout::View, + angle: i32, + ) -> *mut ::layout::Row { + let view = unsafe { &mut *view }; + + view.rows.push(Box::new(::layout::Row::new(angle))); + // Return the reference directly instead of a Box, it's not on the stack + // It will live as long as the Vec + let last_idx = view.rows.len() - 1; + // Caution: Box can't be returned directly, + // so returning a reference to its innards + view.rows[last_idx].as_mut() as *mut ::layout::Row + } + + #[no_mangle] + pub extern "C" + fn squeek_view_foreach( + view: *mut ::layout::View, + callback: RowCallback, + data: *mut UserData, + ) { + let view = unsafe { &mut *view }; + for row in view.rows.iter_mut() { + let row = row.as_mut() as *mut ::layout::Row; + unsafe { callback(row, data) }; + } + } + + + #[no_mangle] + pub extern "C" + fn squeek_row_new(angle: i32) -> *mut ::layout::Row { + Box::into_raw(Box::new(::layout::Row::new(angle))) + } /// Places a button into the row and returns a reference to it #[no_mangle] @@ -416,6 +467,13 @@ pub struct Row { } impl Row { + fn new(angle: i32) -> Row { + Row { + buttons: Vec::new(), + angle: angle, + bounds: None, + } + } fn place_buttons_with_sizes(&mut self, outlines: Vec) { let max_height = outlines.iter().map( |bounds| FloatOrd(bounds.height) @@ -457,3 +515,8 @@ impl Row { }); } } + +pub struct View { + bounds: c::Bounds, + rows: Vec>, +} diff --git a/src/server-context-service.c b/src/server-context-service.c index 67b7ced6..b3df5c64 100644 --- a/src/server-context-service.c +++ b/src/server-context-service.c @@ -142,10 +142,9 @@ set_geometry (ServerContextService *context) LevelKeyboard *keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context)); GdkRectangle rect; - EekBounds bounds; gdk_monitor_get_geometry (monitor, &rect); - eek_element_get_bounds (EEK_ELEMENT(level_keyboard_current(keyboard)), &bounds); + EekBounds bounds = squeek_view_get_bounds (level_keyboard_current(keyboard)); if (eekboard_context_service_get_fullscreen (EEKBOARD_CONTEXT_SERVICE(context))) { gint width = rect.width; diff --git a/tests/eek-simple-test.c b/tests/eek-simple-test.c index 03d2df85..33f2a151 100644 --- a/tests/eek-simple-test.c +++ b/tests/eek-simple-test.c @@ -24,11 +24,11 @@ static void test_create (void) { - EekKeyboard *keyboard; + EekBounds bounds = {0}; + struct squeek_view *view = squeek_view_new(bounds); struct squeek_button *button0, *button1; - keyboard = g_object_new (EEK_TYPE_KEYBOARD, NULL); - struct squeek_row *row = eek_keyboard_real_create_row (keyboard); + struct squeek_row *row = squeek_view_create_row (view, 0); g_assert (row); button0 = squeek_row_create_button (row, 1, 0); g_assert (button0);