keyboard: Remove references
This commit is contained in:
		@ -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;
 | 
			
		||||
 | 
			
		||||
@ -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,
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -27,6 +27,7 @@
 | 
			
		||||
 | 
			
		||||
#include <glib-object.h>
 | 
			
		||||
#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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										12
									
								
								src/layout.h
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								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
 | 
			
		||||
 | 
			
		||||
@ -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<c::Bounds>) {
 | 
			
		||||
        let max_height = outlines.iter().map(
 | 
			
		||||
            |bounds| FloatOrd(bounds.height)
 | 
			
		||||
@ -457,3 +515,8 @@ impl Row {
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub struct View {
 | 
			
		||||
    bounds: c::Bounds,
 | 
			
		||||
    rows: Vec<Box<Row>>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user