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,19 +42,70 @@ 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]
|
||||
pub extern "C"
|
||||
@ -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