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)
|
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;
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
12
src/layout.h
12
src/layout.h
@ -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
|
||||||
|
|||||||
@ -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>>,
|
||||||
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user