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)
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;

View File

@ -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,

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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>>,
}

View File

@ -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;

View File

@ -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);