keyboard: Remove references

This commit is contained in:
Dorota Czaplejewicz
2019-08-16 15:44:22 +00:00
parent a7e7e8fb74
commit f479a36dbe
14 changed files with 148 additions and 93 deletions

View File

@ -62,10 +62,10 @@ typedef struct _EekGtkKeyboardPrivate
G_DEFINE_TYPE_WITH_PRIVATE (EekGtkKeyboard, eek_gtk_keyboard, GTK_TYPE_DRAWING_AREA) 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); EekGtkKeyboard *self);
static void on_button_released (struct squeek_button *button, static void on_button_released (struct squeek_button *button,
EekKeyboard *view, struct squeek_view *view,
EekGtkKeyboard *self); EekGtkKeyboard *self);
static void render_pressed_button (GtkWidget *widget, struct button_place *place); static void render_pressed_button (GtkWidget *widget, struct button_place *place);
static void render_locked_button (GtkWidget *widget, 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); 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 */ /* redraw pressed key */
const GList *list = priv->keyboard->pressed_buttons; const GList *list = priv->keyboard->pressed_buttons;
@ -155,7 +155,7 @@ static void depress(EekGtkKeyboard *self,
gdouble x, gdouble y, guint32 time) gdouble x, gdouble y, guint32 time)
{ {
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); 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); struct squeek_button *button = eek_renderer_find_button_by_position (priv->renderer, view, x, y);
if (button) { if (button) {
@ -167,7 +167,7 @@ static void depress(EekGtkKeyboard *self,
static void drag(EekGtkKeyboard *self, static void drag(EekGtkKeyboard *self,
gdouble x, gdouble y, guint32 time) { gdouble x, gdouble y, guint32 time) {
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); 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); struct squeek_button *button = eek_renderer_find_button_by_position (priv->renderer, view, x, y);
GList *list, *head; GList *list, *head;
@ -202,7 +202,7 @@ static void drag(EekGtkKeyboard *self,
static void release(EekGtkKeyboard *self, guint32 time) { static void release(EekGtkKeyboard *self, guint32 time) {
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); 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); GList *list = g_list_copy(priv->keyboard->pressed_buttons);
for (GList *head = list; head; head = g_list_next (head)) { 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); EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget);
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); 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, struct squeek_button *button = eek_renderer_find_button_by_position (priv->renderer,
view, view,
@ -516,7 +516,7 @@ render_released_button (GtkWidget *widget,
static void static void
on_button_pressed (struct squeek_button *button, on_button_pressed (struct squeek_button *button,
EekKeyboard *view, struct squeek_view *view,
EekGtkKeyboard *self) EekGtkKeyboard *self)
{ {
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
@ -546,7 +546,7 @@ on_button_pressed (struct squeek_button *button,
static void static void
on_button_released (struct squeek_button *button, on_button_released (struct squeek_button *button,
EekKeyboard *view, struct squeek_view *view,
EekGtkKeyboard *self) EekGtkKeyboard *self)
{ {
(void)view; (void)view;

View File

@ -281,7 +281,7 @@ void level_keyboard_init(LevelKeyboard *self) {
self->outline_array = g_array_new (FALSE, TRUE, sizeof (EekOutline)); 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); LevelKeyboard *keyboard = g_new0(LevelKeyboard, 1);
level_keyboard_init(keyboard); level_keyboard_init(keyboard);
for (uint i = 0; i < 4; i++) { for (uint i = 0; i < 4; i++) {
@ -405,7 +405,7 @@ eek_keyboard_get_keymap(LevelKeyboard *keyboard)
return keymap; return keymap;
} }
EekKeyboard *level_keyboard_current(LevelKeyboard *keyboard) struct squeek_view *level_keyboard_current(LevelKeyboard *keyboard)
{ {
return keyboard->views[keyboard->level]; return keyboard->views[keyboard->level];
} }
@ -416,8 +416,7 @@ struct GetRowData {
struct squeek_key *needle; struct squeek_key *needle;
}; };
void find_button_in_row(gpointer item, gpointer user_data) { void find_button_in_row(struct squeek_row *row, gpointer user_data) {
struct squeek_row *row = item;
struct GetRowData *data = user_data; struct GetRowData *data = user_data;
if (data->row) { if (data->row) {
return; 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 squeek_button *button) {
struct GetRowData data = { struct GetRowData data = {
.button = button, .button = button,
.row = NULL, .row = NULL,
}; };
eek_keyboard_foreach(keyboard, find_button_in_row, &data); squeek_view_foreach(view, find_button_in_row, &data);
return data.row; return data.row;
} }
void find_key_in_row(gpointer item, gpointer user_data) { void find_key_in_row(struct squeek_row *row, gpointer user_data) {
struct squeek_row *row = item;
struct GetRowData *data = user_data; struct GetRowData *data = user_data;
if (data->button) { if (data->button) {
return; return;
@ -451,14 +449,14 @@ void find_key_in_row(gpointer item, gpointer user_data) {
// TODO: return multiple // 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 squeek_key *key) {
struct GetRowData data = { struct GetRowData data = {
.row = NULL, .row = NULL,
.button = NULL, .button = NULL,
.needle = key, .needle = key,
}; };
eek_keyboard_foreach(keyboard, find_key_in_row, &data); squeek_view_foreach(view, find_key_in_row, &data);
struct button_place ret = { struct button_place ret = {
.row = data.row, .row = data.row,
.button = data.button, .button = data.button,

View File

@ -57,6 +57,8 @@ struct _EekKeyboard
GPtrArray *rows; // struct squeek_row* GPtrArray *rows; // struct squeek_row*
}; };
typedef struct _EekKeyboard EekKeyboard;
/** /**
* EekKeyboardClass: * EekKeyboardClass:
* @create_section: virtual function for creating a section * @create_section: virtual function for creating a section
@ -103,7 +105,7 @@ typedef struct _EekModifierKey EekModifierKey;
/// Keyboard state holder /// Keyboard state holder
struct _LevelKeyboard { struct _LevelKeyboard {
EekKeyboard *views[4]; struct squeek_view *views[4];
guint level; guint level;
struct xkb_keymap *keymap; struct xkb_keymap *keymap;
int keymap_fd; // keymap formatted as XKB string int keymap_fd; // keymap formatted as XKB string
@ -133,7 +135,7 @@ void eek_keyboard_set_size
gdouble width, gdouble width,
gdouble height); 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 *button);
struct squeek_button *eek_keyboard_find_button_by_name(LevelKeyboard *keyboard, struct squeek_button *eek_keyboard_find_button_by_name(LevelKeyboard *keyboard,
const gchar *name); const gchar *name);
@ -144,7 +146,7 @@ struct button_place {
struct squeek_button *button; 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); struct squeek_key *key);
EekOutline *level_keyboard_get_outline EekOutline *level_keyboard_get_outline
@ -165,8 +167,8 @@ void eek_keyboard_foreach (EekKeyboard *keyboard,
GFunc func, GFunc func,
gpointer user_data); gpointer user_data);
EekKeyboard *level_keyboard_current(LevelKeyboard *keyboard); struct squeek_view *level_keyboard_current(LevelKeyboard *keyboard);
LevelKeyboard *level_keyboard_new(EekboardContextService *manager, EekKeyboard *views[4], GHashTable *name_button_hash); LevelKeyboard *level_keyboard_new(EekboardContextService *manager, struct squeek_view *views[], GHashTable *name_button_hash);
void level_keyboard_deinit(LevelKeyboard *self); void level_keyboard_deinit(LevelKeyboard *self);
void level_keyboard_free(LevelKeyboard *self); void level_keyboard_free(LevelKeyboard *self);

View File

@ -56,11 +56,10 @@ struct place_data {
}; };
static void 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 place_data *data = (struct place_data*)user_data;
struct squeek_row *row = item;
EekBounds row_bounds = { EekBounds row_bounds = {
.x = 0, .x = 0,
.y = 0, .y = 0,
@ -79,16 +78,15 @@ row_placer(gpointer item, gpointer user_data)
} }
static void static void
row_counter(gpointer item, gpointer user_data) { row_counter(struct squeek_row *row, gpointer user_data) {
double *total_height = user_data; double *total_height = user_data;
struct squeek_row *row = item;
EekBounds row_bounds = squeek_row_get_bounds(row); EekBounds row_bounds = squeek_row_get_bounds(row);
*total_height += row_bounds.height + row_spacing; *total_height += row_bounds.height + row_spacing;
} }
void void
eek_layout_place_rows(LevelKeyboard *keyboard, EekKeyboard *level) eek_layout_place_rows(LevelKeyboard *keyboard, struct squeek_view *level)
{ {
/* Order rows */ /* Order rows */
// This needs to be done after outlines, because outlines define key sizes // 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. // 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 // TODO: calculate max line width beforehand for button centering. Leave keyboard centering to the renderer later
EekBounds keyboard_bounds = {0}; EekBounds view_bounds = squeek_view_get_bounds(level);
eek_element_get_bounds(EEK_ELEMENT(level), &keyboard_bounds);
struct place_data placer_data = { struct place_data placer_data = {
.desired_width = keyboard_bounds.width, .desired_width = view_bounds.width,
.current_offset = 0, .current_offset = 0,
.keyboard = keyboard, .keyboard = keyboard,
}; };
eek_keyboard_foreach(level, row_placer, &placer_data); squeek_view_foreach(level, row_placer, &placer_data);
double total_height = 0; double total_height = 0;
eek_keyboard_foreach(level, row_counter, &total_height); squeek_view_foreach(level, row_counter, &total_height);
keyboard_bounds.height = total_height; view_bounds.height = total_height;
eek_element_set_bounds(EEK_ELEMENT(level), &keyboard_bounds); squeek_view_set_bounds(level, view_bounds);
} }
void void

View File

@ -27,6 +27,7 @@
#include <glib-object.h> #include <glib-object.h>
#include "eek-types.h" #include "eek-types.h"
#include "src/layout.h"
G_BEGIN_DECLS G_BEGIN_DECLS
@ -55,7 +56,7 @@ struct _EekLayoutClass
GType eek_layout_get_type (void) G_GNUC_CONST; 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); void eek_layout_update_layout(LevelKeyboard *keyboard);

View File

@ -86,7 +86,7 @@ static void render_button (EekRenderer *self,
struct _CreateKeyboardSurfaceCallbackData { struct _CreateKeyboardSurfaceCallbackData {
cairo_t *cr; cairo_t *cr;
EekRenderer *renderer; EekRenderer *renderer;
EekKeyboard *view; struct squeek_view *view;
struct squeek_row *row; struct squeek_row *row;
}; };
typedef struct _CreateKeyboardSurfaceCallbackData CreateKeyboardSurfaceCallbackData; typedef struct _CreateKeyboardSurfaceCallbackData CreateKeyboardSurfaceCallbackData;
@ -117,11 +117,11 @@ create_keyboard_surface_button_callback (struct squeek_button *button,
} }
static void static void
create_keyboard_surface_row_callback (gpointer item, create_keyboard_surface_row_callback (struct squeek_row *row,
gpointer user_data) gpointer user_data)
{ {
CreateKeyboardSurfaceCallbackData *data = user_data; CreateKeyboardSurfaceCallbackData *data = user_data;
struct squeek_row *row = item;
EekBounds bounds = squeek_row_get_bounds(row); EekBounds bounds = squeek_row_get_bounds(row);
cairo_save (data->cr); cairo_save (data->cr);
@ -137,16 +137,15 @@ create_keyboard_surface_row_callback (gpointer item,
cairo_restore (data->cr); cairo_restore (data->cr);
} }
void static void
render_keyboard_surface (EekRenderer *renderer, EekKeyboard *view) render_keyboard_surface (EekRenderer *renderer, struct squeek_view *view)
{ {
EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer); EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
EekBounds bounds;
EekColor foreground; EekColor foreground;
eek_renderer_get_foreground_color (renderer, priv->scontext, &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 = { CreateKeyboardSurfaceCallbackData data = {
.cr = cairo_create (priv->keyboard_surface), .cr = cairo_create (priv->keyboard_surface),
@ -175,7 +174,7 @@ render_keyboard_surface (EekRenderer *renderer, EekKeyboard *view)
foreground.alpha); foreground.alpha);
/* draw rows */ /* draw rows */
eek_keyboard_foreach(level_keyboard_current(priv->keyboard), squeek_view_foreach(level_keyboard_current(priv->keyboard),
create_keyboard_surface_row_callback, create_keyboard_surface_row_callback,
&data); &data);
cairo_restore (data.cr); cairo_restore (data.cr);
@ -687,7 +686,6 @@ eek_renderer_set_allocation_size (EekRenderer *renderer,
gdouble width, gdouble width,
gdouble height) gdouble height)
{ {
EekBounds bounds;
gdouble scale; gdouble scale;
g_return_if_fail (EEK_IS_RENDERER(renderer)); 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 /* Calculate a scale factor to use when rendering the keyboard into the
available space. */ 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 w = (bounds.x * 2) + bounds.width;
gdouble h = (bounds.y * 2) + bounds.height; gdouble h = (bounds.y * 2) + bounds.height;
@ -719,13 +717,11 @@ eek_renderer_get_size (EekRenderer *renderer,
gdouble *width, gdouble *width,
gdouble *height) gdouble *height)
{ {
EekBounds bounds;
g_return_if_fail (EEK_IS_RENDERER(renderer)); g_return_if_fail (EEK_IS_RENDERER(renderer));
EekRendererPrivate *priv = eek_renderer_get_instance_private (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) if (width)
*width = bounds.width; *width = bounds.width;
if (height) if (height)
@ -738,7 +734,6 @@ eek_renderer_get_button_bounds (EekRenderer *renderer,
EekBounds *bounds, EekBounds *bounds,
gboolean rotate) gboolean rotate)
{ {
EekBounds keyboard_bounds;
gint angle = 0; gint angle = 0;
EekPoint points[4], min, max; 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 button_bounds = squeek_button_get_bounds(place->button);
EekBounds row_bounds = squeek_row_get_bounds (place->row); EekBounds row_bounds = squeek_row_get_bounds (place->row);
eek_element_get_bounds (EEK_ELEMENT(level_keyboard_current(priv->keyboard)), EekBounds view_bounds = squeek_view_get_bounds (level_keyboard_current(priv->keyboard));
&keyboard_bounds);
if (!rotate) { if (!rotate) {
button_bounds.x += keyboard_bounds.x + row_bounds.x; button_bounds.x += view_bounds.x + row_bounds.x;
button_bounds.y += keyboard_bounds.y + row_bounds.y; button_bounds.y += view_bounds.y + row_bounds.y;
*bounds = button_bounds; *bounds = button_bounds;
return; return;
} }
@ -785,8 +779,8 @@ eek_renderer_get_button_bounds (EekRenderer *renderer,
if (points[i].y > max.y) if (points[i].y > max.y)
max.y = points[i].y; max.y = points[i].y;
} }
bounds->x = keyboard_bounds.x + row_bounds.x + min.x; bounds->x = view_bounds.x + row_bounds.x + min.x;
bounds->y = keyboard_bounds.y + row_bounds.y + min.y; bounds->y = view_bounds.y + row_bounds.y + min.y;
bounds->width = (max.x - min.x); bounds->width = (max.x - min.x);
bounds->height = (max.y - min.y); bounds->height = (max.y - min.y);
} }
@ -975,10 +969,9 @@ eek_are_bounds_inside (EekBounds bounds, EekPoint point, EekPoint origin, int32_
} }
static void static void
find_button_by_position_row_callback (gpointer item, find_button_by_position_row_callback (struct squeek_row *row,
gpointer user_data) gpointer user_data)
{ {
struct squeek_row *row = item;
FindKeyByPositionCallbackData *data = user_data; FindKeyByPositionCallbackData *data = user_data;
if (data->button) { if (data->button) {
return; return;
@ -997,17 +990,16 @@ find_button_by_position_row_callback (gpointer item,
**/ **/
struct squeek_button * struct squeek_button *
eek_renderer_find_button_by_position (EekRenderer *renderer, eek_renderer_find_button_by_position (EekRenderer *renderer,
EekKeyboard *view, struct squeek_view *view,
gdouble x, gdouble x,
gdouble y) gdouble y)
{ {
EekBounds bounds;
FindKeyByPositionCallbackData data; FindKeyByPositionCallbackData data;
g_return_val_if_fail (EEK_IS_RENDERER(renderer), NULL); g_return_val_if_fail (EEK_IS_RENDERER(renderer), NULL);
EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer); 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 */ /* Transform from widget coordinates to keyboard coordinates */
x = (x - priv->origin_x)/priv->scale - bounds.x; 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.origin.y = 0;
data.button = NULL; data.button = NULL;
eek_keyboard_foreach (view, find_button_by_position_row_callback, squeek_view_foreach (view, find_button_by_position_row_callback,
&data); &data);
return data.button; return data.button;
} }

View File

@ -103,7 +103,7 @@ void eek_renderer_get_foreground_color
EekColor *color); EekColor *color);
void eek_renderer_set_border_width (EekRenderer *renderer, void eek_renderer_set_border_width (EekRenderer *renderer,
gdouble border_width); 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 x,
gdouble y); gdouble y);
void eek_renderer_apply_transformation_for_button void eek_renderer_apply_transformation_for_button

View File

@ -134,7 +134,6 @@ typedef enum
#define EEK_INVALID_KEYCODE (0) #define EEK_INVALID_KEYCODE (0)
typedef struct _EekElement EekElement; typedef struct _EekElement EekElement;
typedef struct _EekKeyboard EekKeyboard;
typedef struct _EekSymbol EekSymbol; typedef struct _EekSymbol EekSymbol;
typedef struct _EekText EekText; typedef struct _EekText EekText;
typedef struct _EekTheme EekTheme; typedef struct _EekTheme EekTheme;
@ -192,12 +191,6 @@ GType eek_bounds_get_type (void) G_GNUC_CONST;
EekBounds *eek_bounds_copy (const EekBounds *bounds); EekBounds *eek_bounds_copy (const EekBounds *bounds);
void eek_bounds_free (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: * EekOutline:
* @corner_radius: radius of corners of rounded polygon * @corner_radius: radius of corners of rounded polygon

View File

@ -66,7 +66,7 @@ static GList *parse_prerequisites
(const gchar *path, (const gchar *path,
GError **error); GError **error);
static gboolean parse_geometry (const gchar *path, 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); GError **error);
static gboolean parse_symbols_with_prerequisites static gboolean parse_symbols_with_prerequisites
(const gchar *keyboards_dir, (const gchar *keyboards_dir,
@ -231,7 +231,7 @@ struct _GeometryParseData {
GSList *element_stack; GSList *element_stack;
EekBounds bounds; EekBounds bounds;
EekKeyboard **views; struct squeek_view **views;
guint view_idx; guint view_idx;
struct squeek_row *row; struct squeek_row *row;
gint num_rows; gint num_rows;
@ -254,7 +254,7 @@ struct _GeometryParseData {
typedef struct _GeometryParseData GeometryParseData; typedef struct _GeometryParseData GeometryParseData;
static 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); GeometryParseData *data = g_slice_new0 (GeometryParseData);
@ -367,20 +367,18 @@ geometry_start_element_callback (GMarkupParseContext *pcontext,
if (g_strcmp0 (element_name, "view") == 0) { if (g_strcmp0 (element_name, "view") == 0) {
/* Create an empty keyboard to which geometry and symbols /* Create an empty keyboard to which geometry and symbols
information are applied. */ information are applied. */
EekKeyboard *view = g_object_new (EEK_TYPE_KEYBOARD, NULL); struct squeek_view *view = squeek_view_new(data->bounds);
eek_element_set_bounds (EEK_ELEMENT(view), &data->bounds);
data->views[data->view_idx] = view; data->views[data->view_idx] = view;
} }
if (g_strcmp0 (element_name, "section") == 0) { 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, attribute = get_attribute (attribute_names, attribute_values,
"angle"); "angle");
if (attribute != NULL) { if (attribute != NULL) {
gint angle;
angle = strtol (attribute, NULL, 10); 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; goto out;
} }
@ -634,7 +632,7 @@ struct _SymbolsParseData {
GString *text; GString *text;
LevelKeyboard *keyboard; LevelKeyboard *keyboard;
EekKeyboard *view; struct squeek_view *view;
gchar *label; gchar *label;
gchar *icon; gchar *icon;
@ -884,7 +882,7 @@ eek_xml_layout_real_create_keyboard (EekLayout *self,
g_free, g_free,
NULL); NULL);
// One view for each level // One view for each level
EekKeyboard *views[4] = {0}; struct squeek_view *views[4] = {0};
GError *error = NULL; GError *error = NULL;
retval = parse_geometry (path, views, outline_array, name_button_hash, &error); retval = parse_geometry (path, views, outline_array, name_button_hash, &error);
@ -1119,7 +1117,7 @@ eek_xml_keyboard_desc_free (EekXmlKeyboardDesc *desc)
} }
static gboolean 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; GeometryParseData *data;
GMarkupParseContext *pcontext; GMarkupParseContext *pcontext;

View File

@ -73,7 +73,7 @@ struct _EekboardContextServiceClass {
GObjectClass parent_class; GObjectClass parent_class;
/*< public >*/ /*< public >*/
EekKeyboard *(*create_keyboard) (EekboardContextService *self, struct squeek_view *(*create_keyboard) (EekboardContextService *self,
const gchar *keyboard_type); const gchar *keyboard_type);
void (*show_keyboard) (EekboardContextService *self); void (*show_keyboard) (EekboardContextService *self);
void (*hide_keyboard) (EekboardContextService *self); void (*hide_keyboard) (EekboardContextService *self);

View File

@ -8,6 +8,7 @@
struct squeek_button; struct squeek_button;
struct squeek_row; struct squeek_row;
struct squeek_view;
struct squeek_row *squeek_row_new(int32_t angle); struct squeek_row *squeek_row_new(int32_t angle);
struct squeek_button *squeek_row_create_button (struct squeek_row *row, 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); 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); void squeek_row_place_buttons(struct squeek_row *row, LevelKeyboard *keyboard);
#endif #endif

View File

@ -42,18 +42,69 @@ pub mod c {
} }
type ButtonCallback = unsafe extern "C" fn(button: *mut ::layout::Button, data: *mut UserData); 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 // The following defined in Rust. TODO: wrap naked pointers to Rust data inside RefCells to prevent multiple writers
#[no_mangle] #[no_mangle]
pub extern "C" pub extern "C"
fn squeek_row_new(angle: i32) -> *mut ::layout::Row { fn squeek_view_new(bounds: Bounds) -> *mut ::layout::View {
Box::into_raw(Box::new(::layout::Row { Box::into_raw(Box::new(::layout::View {
buttons: Vec::new(), rows: Vec::new(),
angle: angle, bounds: bounds,
bounds: None,
})) }))
} }
#[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 /// Places a button into the row and returns a reference to it
#[no_mangle] #[no_mangle]
@ -416,6 +467,13 @@ pub struct Row {
} }
impl 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>) { fn place_buttons_with_sizes(&mut self, outlines: Vec<c::Bounds>) {
let max_height = outlines.iter().map( let max_height = outlines.iter().map(
|bounds| FloatOrd(bounds.height) |bounds| FloatOrd(bounds.height)
@ -457,3 +515,8 @@ impl Row {
}); });
} }
} }
pub struct View {
bounds: c::Bounds,
rows: Vec<Box<Row>>,
}

View File

@ -142,10 +142,9 @@ set_geometry (ServerContextService *context)
LevelKeyboard *keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context)); LevelKeyboard *keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context));
GdkRectangle rect; GdkRectangle rect;
EekBounds bounds;
gdk_monitor_get_geometry (monitor, &rect); 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))) { if (eekboard_context_service_get_fullscreen (EEKBOARD_CONTEXT_SERVICE(context))) {
gint width = rect.width; gint width = rect.width;

View File

@ -24,11 +24,11 @@
static void static void
test_create (void) test_create (void)
{ {
EekKeyboard *keyboard; EekBounds bounds = {0};
struct squeek_view *view = squeek_view_new(bounds);
struct squeek_button *button0, *button1; struct squeek_button *button0, *button1;
keyboard = g_object_new (EEK_TYPE_KEYBOARD, NULL); struct squeek_row *row = squeek_view_create_row (view, 0);
struct squeek_row *row = eek_keyboard_real_create_row (keyboard);
g_assert (row); g_assert (row);
button0 = squeek_row_create_button (row, 1, 0); button0 = squeek_row_create_button (row, 1, 0);
g_assert (button0); g_assert (button0);