keyboard: Pass the current view instead of level

This commit is contained in:
Dorota Czaplejewicz
2019-08-14 16:54:18 +00:00
parent b70afbe9eb
commit fc683de434
5 changed files with 115 additions and 65 deletions

View File

@ -64,14 +64,16 @@ 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_key_pressed (EekKey *key, static void on_key_pressed (EekKey *key, EekKeyboard *view,
EekGtkKeyboard *self, guint level);
static void on_key_released (EekKey *key,
EekGtkKeyboard *self); EekGtkKeyboard *self);
static void render_pressed_key (GtkWidget *widget, static void on_key_released (EekKey *key,
EekKey *key, guint level); EekKeyboard *view,
EekGtkKeyboard *self);
static void render_pressed_key (GtkWidget *widget, EekKeyboard *view,
EekKey *key);
static void render_locked_key (GtkWidget *widget, static void render_locked_key (GtkWidget *widget,
EekKey *key, guint level); EekKeyboard *view,
EekKey *key);
static void render_released_key (GtkWidget *widget, static void render_released_key (GtkWidget *widget,
EekKey *key); EekKey *key);
@ -112,18 +114,18 @@ eek_gtk_keyboard_real_draw (GtkWidget *self,
eek_renderer_render_keyboard (priv->renderer, cr); eek_renderer_render_keyboard (priv->renderer, cr);
uint level = priv->keyboard->level; EekKeyboard *view = priv->keyboard->views[priv->keyboard->level];
/* redraw pressed key */ /* redraw pressed key */
const GList *list = priv->keyboard->pressed_keys; const GList *list = priv->keyboard->pressed_keys;
for (const GList *head = list; head; head = g_list_next (head)) { for (const GList *head = list; head; head = g_list_next (head)) {
render_pressed_key (self, head->data, level); render_pressed_key (self, view, head->data);
} }
/* redraw locked key */ /* redraw locked key */
list = priv->keyboard->locked_keys; list = priv->keyboard->locked_keys;
for (const GList *head = list; head; head = g_list_next (head)) { for (const GList *head = list; head; head = g_list_next (head)) {
render_locked_key (self, ((EekModifierKey *)head->data)->key, level); render_locked_key (self, view, ((EekModifierKey *)head->data)->key);
} }
return FALSE; return FALSE;
@ -149,19 +151,20 @@ 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);
EekKey *key = eek_renderer_find_key_by_position (priv->renderer, x, y); EekKeyboard *view = level_keyboard_current(priv->keyboard);
EekKey *key = eek_renderer_find_key_by_position (priv->renderer, view, x, y);
if (key) { if (key) {
eek_keyboard_press_key(priv->keyboard, key, time); eek_keyboard_press_key(priv->keyboard, key, time);
guint level = priv->keyboard->level; on_key_pressed(key, view, self);
on_key_pressed(key, self, level);
} }
} }
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);
EekKey *key = eek_renderer_find_key_by_position (priv->renderer, x, y); EekKeyboard *view = level_keyboard_current(priv->keyboard);
EekKey *key = eek_renderer_find_key_by_position (priv->renderer, view, x, y);
GList *list, *head; GList *list, *head;
list = g_list_copy(priv->keyboard->pressed_keys); list = g_list_copy(priv->keyboard->pressed_keys);
@ -174,20 +177,19 @@ static void drag(EekGtkKeyboard *self,
found = TRUE; found = TRUE;
} else { } else {
eek_keyboard_release_key(priv->keyboard, EEK_KEY(head->data), time); eek_keyboard_release_key(priv->keyboard, EEK_KEY(head->data), time);
on_key_released(key, self); on_key_released(key, view, self);
} }
} }
g_list_free (list); g_list_free (list);
if (!found) { if (!found) {
eek_keyboard_press_key(priv->keyboard, key, time); eek_keyboard_press_key(priv->keyboard, key, time);
guint level = priv->keyboard->level; on_key_pressed(key, view, self);
on_key_pressed(key, self, level);
} }
} else { } else {
for (head = list; head; head = g_list_next (head)) { for (head = list; head; head = g_list_next (head)) {
eek_keyboard_release_key(priv->keyboard, EEK_KEY(head->data), time); eek_keyboard_release_key(priv->keyboard, EEK_KEY(head->data), time);
on_key_released(EEK_KEY(head->data), self); on_key_released(EEK_KEY(head->data), view, self);
} }
g_list_free (list); g_list_free (list);
} }
@ -196,11 +198,13 @@ 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);
GList *list = g_list_copy(priv->keyboard->pressed_keys); GList *list = g_list_copy(priv->keyboard->pressed_keys);
for (GList *head = list; head; head = g_list_next (head)) { for (GList *head = list; head; head = g_list_next (head)) {
EekKey *key = EEK_KEY(head->data); EekKey *key = EEK_KEY(head->data);
eek_keyboard_release_key(priv->keyboard, key, time); eek_keyboard_release_key(priv->keyboard, key, time);
on_key_released(key, self); on_key_released(key, view, self);
} }
g_list_free (list); g_list_free (list);
} }
@ -303,12 +307,12 @@ 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);
EekKey *key; EekKey *key = eek_renderer_find_key_by_position (priv->renderer,
view,
key = eek_renderer_find_key_by_position (priv->renderer, (gdouble)x,
(gdouble)x, (gdouble)y);
(gdouble)y);
if (key) { if (key) {
//struct squeek_symbol *symbol = eek_key_get_symbol_at_index(key, 0, priv->keyboard->level); //struct squeek_symbol *symbol = eek_key_get_symbol_at_index(key, 0, priv->keyboard->level);
const gchar *text = NULL; // FIXME const gchar *text = NULL; // FIXME
@ -449,8 +453,8 @@ eek_gtk_keyboard_new (LevelKeyboard *keyboard)
static void static void
render_pressed_key (GtkWidget *widget, render_pressed_key (GtkWidget *widget,
EekKey *key, EekKeyboard *view,
guint level) EekKey *key)
{ {
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);
@ -460,7 +464,7 @@ render_pressed_key (GtkWidget *widget,
GdkDrawingContext *context = gdk_window_begin_draw_frame (window, region); GdkDrawingContext *context = gdk_window_begin_draw_frame (window, region);
cairo_t *cr = gdk_drawing_context_get_cairo_context (context); cairo_t *cr = gdk_drawing_context_get_cairo_context (context);
eek_renderer_render_key (priv->renderer, cr, key, level, 1.0, TRUE); eek_renderer_render_key (priv->renderer, cr, view, key, 1.0, TRUE);
/* /*
eek_renderer_render_key (priv->renderer, cr, key, 1.5, TRUE); eek_renderer_render_key (priv->renderer, cr, key, 1.5, TRUE);
*/ */
@ -471,8 +475,8 @@ render_pressed_key (GtkWidget *widget,
static void static void
render_locked_key (GtkWidget *widget, render_locked_key (GtkWidget *widget,
EekKey *key, EekKeyboard *view,
guint level) EekKey *key)
{ {
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);
@ -482,7 +486,7 @@ render_locked_key (GtkWidget *widget,
GdkDrawingContext *context = gdk_window_begin_draw_frame (window, region); GdkDrawingContext *context = gdk_window_begin_draw_frame (window, region);
cairo_t *cr = gdk_drawing_context_get_cairo_context (context); cairo_t *cr = gdk_drawing_context_get_cairo_context (context);
eek_renderer_render_key (priv->renderer, cr, key, level, 1.0, TRUE); eek_renderer_render_key (priv->renderer, cr, view, key, 1.0, TRUE);
gdk_window_end_draw_frame (window, context); gdk_window_end_draw_frame (window, context);
@ -493,6 +497,7 @@ static void
render_released_key (GtkWidget *widget, render_released_key (GtkWidget *widget,
EekKey *key) EekKey *key)
{ {
(void)key;
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);
@ -510,8 +515,8 @@ render_released_key (GtkWidget *widget,
static void static void
on_key_pressed (EekKey *key, on_key_pressed (EekKey *key,
EekGtkKeyboard *self, EekKeyboard *view,
guint level) EekGtkKeyboard *self)
{ {
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
@ -519,7 +524,7 @@ on_key_pressed (EekKey *key,
if (!priv->renderer) if (!priv->renderer)
return; return;
render_pressed_key (GTK_WIDGET(self), key, level); render_pressed_key (GTK_WIDGET(self), view, key);
gtk_widget_queue_draw (GTK_WIDGET(self)); gtk_widget_queue_draw (GTK_WIDGET(self));
#if HAVE_LIBCANBERRA #if HAVE_LIBCANBERRA
@ -533,8 +538,10 @@ on_key_pressed (EekKey *key,
static void static void
on_key_released (EekKey *key, on_key_released (EekKey *key,
EekKeyboard *view,
EekGtkKeyboard *self) EekGtkKeyboard *self)
{ {
(void)view;
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
/* renderer may have not been set yet if the widget is a popup */ /* renderer may have not been set yet if the widget is a popup */

View File

@ -433,3 +433,36 @@ EekKeyboard *level_keyboard_current(LevelKeyboard *keyboard)
{ {
return keyboard->views[keyboard->level]; return keyboard->views[keyboard->level];
} }
struct GetSectionData {
const EekKey *key;
EekSection *section;
};
gint check_right_key(EekElement *element, gpointer user_data) {
EekKey *key = EEK_KEY(element);
struct GetSectionData *data = user_data;
if (key == data->key) {
return TRUE;
} else {
return FALSE;
}
}
void find_key_in_section(EekElement *element, gpointer user_data) {
EekSection *section = EEK_SECTION(element);
struct GetSectionData *data = user_data;
if (eek_container_find(EEK_CONTAINER(section), check_right_key, &data)) {
data->section = section;
}
}
EekSection *eek_keyboard_get_section(EekKeyboard *keyboard,
const EekKey *key) {
struct GetSectionData data = {
.key = key,
.section = NULL,
};
eek_container_foreach_child(EEK_CONTAINER(keyboard), find_key_in_section, &data);
return data.section;
}

View File

@ -155,11 +155,14 @@ void eek_keyboard_set_size
EekSection *eek_keyboard_create_section EekSection *eek_keyboard_create_section
(EekKeyboard *keyboard); (EekKeyboard *keyboard);
EekSection *eek_keyboard_get_section
(EekKeyboard *keyboard,
const EekKey *key);
EekKey *eek_keyboard_find_key_by_name EekKey *eek_keyboard_find_key_by_name
(LevelKeyboard *keyboard, (LevelKeyboard *keyboard,
const gchar *name); const gchar *name);
EekOutline *level_keyboard_get_outline EekOutline *level_keyboard_get_outline
(LevelKeyboard *keyboard, (LevelKeyboard *keyboard,
guint oref); guint oref);

View File

@ -78,18 +78,18 @@ extern void _eek_rounded_polygon (cairo_t *cr,
static void eek_renderer_real_render_key_label (EekRenderer *self, static void eek_renderer_real_render_key_label (EekRenderer *self,
PangoLayout *layout, PangoLayout *layout,
EekKey *key, guint level); EekKey *key);
static void invalidate (EekRenderer *renderer); static void invalidate (EekRenderer *renderer);
static void render_key (EekRenderer *self, static void render_key (EekRenderer *self,
cairo_t *cr, cairo_t *cr, EekKeyboard *view,
EekKey *key, guint level, EekKey *key,
gboolean active); gboolean active);
struct _CreateKeyboardSurfaceCallbackData { struct _CreateKeyboardSurfaceCallbackData {
cairo_t *cr; cairo_t *cr;
EekRenderer *renderer; EekRenderer *renderer;
uint level; EekKeyboard *view;
}; };
typedef struct _CreateKeyboardSurfaceCallbackData CreateKeyboardSurfaceCallbackData; typedef struct _CreateKeyboardSurfaceCallbackData CreateKeyboardSurfaceCallbackData;
@ -110,7 +110,7 @@ create_keyboard_surface_key_callback (EekElement *element,
bounds.width + 100, bounds.width + 100,
bounds.height + 100); bounds.height + 100);
cairo_clip (data->cr); cairo_clip (data->cr);
render_key (data->renderer, data->cr, EEK_KEY(element), data->level, FALSE); render_key (data->renderer, data->cr, data->view, EEK_KEY(element), FALSE);
cairo_restore (data->cr); cairo_restore (data->cr);
} }
@ -139,19 +139,21 @@ create_keyboard_surface_section_callback (EekElement *element,
} }
void void
render_keyboard_surface (EekRenderer *renderer) render_keyboard_surface (EekRenderer *renderer, EekKeyboard *view)
{ {
EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer); EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
EekBounds bounds; EekBounds bounds;
CreateKeyboardSurfaceCallbackData data;
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); eek_element_get_bounds (EEK_ELEMENT(level_keyboard_current(priv->keyboard)), &bounds);
data.cr = cairo_create (priv->keyboard_surface); CreateKeyboardSurfaceCallbackData data = {
data.renderer = renderer; .cr = cairo_create (priv->keyboard_surface),
.renderer = renderer,
.view = view,
};
/* Paint the background covering the entire widget area */ /* Paint the background covering the entire widget area */
gtk_render_background (priv->scontext, gtk_render_background (priv->scontext,
@ -173,7 +175,6 @@ render_keyboard_surface (EekRenderer *renderer)
foreground.blue, foreground.blue,
foreground.alpha); foreground.alpha);
data.level = priv->keyboard->level;
/* draw sections */ /* draw sections */
eek_container_foreach_child (EEK_CONTAINER(level_keyboard_current(priv->keyboard)), eek_container_foreach_child (EEK_CONTAINER(level_keyboard_current(priv->keyboard)),
create_keyboard_surface_section_callback, create_keyboard_surface_section_callback,
@ -214,8 +215,8 @@ render_key_outline (EekRenderer *renderer,
static void static void
render_key (EekRenderer *self, render_key (EekRenderer *self,
cairo_t *cr, cairo_t *cr,
EekKeyboard *view,
EekKey *key, EekKey *key,
guint level,
gboolean active) gboolean active)
{ {
EekRendererPrivate *priv = eek_renderer_get_instance_private (self); EekRendererPrivate *priv = eek_renderer_get_instance_private (self);
@ -259,7 +260,7 @@ render_key (EekRenderer *self,
cairo_paint (cr); cairo_paint (cr);
cairo_save (cr); cairo_save (cr);
eek_renderer_apply_transformation_for_key (self, cr, key, 1.0, FALSE); eek_renderer_apply_transformation_for_key (self, cr, view, key, 1.0, FALSE);
render_key_outline (self, cr, key, active); render_key_outline (self, cr, key, active);
cairo_restore (cr); cairo_restore (cr);
@ -311,7 +312,7 @@ render_key (EekRenderer *self,
/* render label */ /* render label */
layout = pango_cairo_create_layout (cr); layout = pango_cairo_create_layout (cr);
eek_renderer_real_render_key_label (self, layout, key, level); eek_renderer_real_render_key_label (self, layout, key);
pango_layout_get_extents (layout, NULL, &extents); pango_layout_get_extents (layout, NULL, &extents);
cairo_save (cr); cairo_save (cr);
@ -349,11 +350,12 @@ render_key (EekRenderer *self,
void void
eek_renderer_apply_transformation_for_key (EekRenderer *self, eek_renderer_apply_transformation_for_key (EekRenderer *self,
cairo_t *cr, cairo_t *cr,
EekKeyboard *view,
EekKey *key, EekKey *key,
gdouble scale, gdouble scale,
gboolean rotate) gboolean rotate)
{ {
EekElement *section; EekSection *section;
EekBounds bounds, rotated_bounds; EekBounds bounds, rotated_bounds;
gint angle; gint angle;
gdouble s; gdouble s;
@ -361,8 +363,8 @@ eek_renderer_apply_transformation_for_key (EekRenderer *self,
eek_renderer_get_key_bounds (self, key, &bounds, FALSE); eek_renderer_get_key_bounds (self, key, &bounds, FALSE);
eek_renderer_get_key_bounds (self, key, &rotated_bounds, TRUE); eek_renderer_get_key_bounds (self, key, &rotated_bounds, TRUE);
section = eek_element_get_parent (EEK_ELEMENT(key)); section = eek_keyboard_get_section(view, key);
angle = eek_section_get_angle (EEK_SECTION(section)); angle = eek_section_get_angle (section);
cairo_scale (cr, scale, scale); cairo_scale (cr, scale, scale);
if (rotate) { if (rotate) {
@ -378,8 +380,7 @@ eek_renderer_apply_transformation_for_key (EekRenderer *self,
static void static void
eek_renderer_real_render_key_label (EekRenderer *self, eek_renderer_real_render_key_label (EekRenderer *self,
PangoLayout *layout, PangoLayout *layout,
EekKey *key, EekKey *key)
guint level)
{ {
EekRendererPrivate *priv = eek_renderer_get_instance_private (self); EekRendererPrivate *priv = eek_renderer_get_instance_private (self);
struct squeek_symbol *symbol; struct squeek_symbol *symbol;
@ -435,12 +436,13 @@ eek_renderer_real_render_key_label (EekRenderer *self,
static void static void
eek_renderer_real_render_key_outline (EekRenderer *self, eek_renderer_real_render_key_outline (EekRenderer *self,
cairo_t *cr, cairo_t *cr,
EekKeyboard *view,
EekKey *key, EekKey *key,
gdouble scale, gdouble scale,
gboolean rotate) gboolean rotate)
{ {
cairo_save (cr); cairo_save (cr);
eek_renderer_apply_transformation_for_key (self, cr, key, scale, rotate); eek_renderer_apply_transformation_for_key (self, cr, view, key, scale, rotate);
render_key_outline (self, cr, key, eek_key_is_pressed (key) || eek_key_is_locked (key)); render_key_outline (self, cr, key, eek_key_is_pressed (key) || eek_key_is_locked (key));
cairo_restore (cr); cairo_restore (cr);
} }
@ -459,8 +461,8 @@ eek_renderer_real_render_key_outline (EekRenderer *self,
static void static void
eek_renderer_real_render_key (EekRenderer *self, eek_renderer_real_render_key (EekRenderer *self,
cairo_t *cr, cairo_t *cr,
EekKeyboard *view,
EekKey *key, EekKey *key,
guint level,
gdouble scale, gdouble scale,
gboolean rotate) gboolean rotate)
{ {
@ -476,8 +478,8 @@ eek_renderer_real_render_key (EekRenderer *self,
cairo_scale (cr, priv->scale, priv->scale); cairo_scale (cr, priv->scale, priv->scale);
cairo_translate (cr, bounds.x, bounds.y); cairo_translate (cr, bounds.x, bounds.y);
eek_renderer_apply_transformation_for_key (self, cr, key, scale, rotate); eek_renderer_apply_transformation_for_key (self, cr, view, key, scale, rotate);
render_key (self, cr, key, level, eek_key_is_pressed (key) || eek_key_is_locked (key)); render_key (self, cr, view, key, eek_key_is_pressed (key) || eek_key_is_locked (key));
cairo_restore (cr); cairo_restore (cr);
} }
@ -503,7 +505,7 @@ eek_renderer_real_render_keyboard (EekRenderer *self,
cairo_get_target (cr), 0, 0, cairo_get_target (cr), 0, 0,
priv->allocation_width, priv->allocation_height); priv->allocation_width, priv->allocation_height);
render_keyboard_surface (self); render_keyboard_surface (self, priv->keyboard->views[priv->keyboard->level]);
cairo_set_source_surface (cr, priv->keyboard_surface, 0.0, 0.0); cairo_set_source_surface (cr, priv->keyboard_surface, 0.0, 0.0);
source = cairo_get_source (cr); source = cairo_get_source (cr);
@ -846,6 +848,7 @@ eek_renderer_create_pango_layout (EekRenderer *renderer)
void void
eek_renderer_render_key_outline (EekRenderer *renderer, eek_renderer_render_key_outline (EekRenderer *renderer,
cairo_t *cr, cairo_t *cr,
EekKeyboard *view,
EekKey *key, EekKey *key,
gdouble scale, gdouble scale,
gboolean rotate) gboolean rotate)
@ -856,6 +859,7 @@ eek_renderer_render_key_outline (EekRenderer *renderer,
EEK_RENDERER_GET_CLASS(renderer)->render_key_outline (renderer, EEK_RENDERER_GET_CLASS(renderer)->render_key_outline (renderer,
cr, cr,
view,
key, key,
scale, scale,
rotate); rotate);
@ -898,8 +902,8 @@ eek_renderer_get_icon_surface (EekRenderer *renderer,
void void
eek_renderer_render_key (EekRenderer *renderer, eek_renderer_render_key (EekRenderer *renderer,
cairo_t *cr, cairo_t *cr,
EekKeyboard *view,
EekKey *key, EekKey *key,
guint level,
gdouble scale, gdouble scale,
gboolean rotate) gboolean rotate)
{ {
@ -908,7 +912,7 @@ eek_renderer_render_key (EekRenderer *renderer,
g_return_if_fail (scale >= 0.0); g_return_if_fail (scale >= 0.0);
EEK_RENDERER_GET_CLASS(renderer)-> EEK_RENDERER_GET_CLASS(renderer)->
render_key (renderer, cr, key, level, scale, rotate); render_key (renderer, cr, view, key, scale, rotate);
} }
void void
@ -1057,6 +1061,7 @@ find_key_by_position_section_callback (EekElement *element,
**/ **/
EekKey * EekKey *
eek_renderer_find_key_by_position (EekRenderer *renderer, eek_renderer_find_key_by_position (EekRenderer *renderer,
EekKeyboard *view,
gdouble x, gdouble x,
gdouble y) gdouble y)
{ {
@ -1066,7 +1071,7 @@ eek_renderer_find_key_by_position (EekRenderer *renderer,
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(level_keyboard_current(priv->keyboard)), &bounds); eek_element_get_bounds (EEK_ELEMENT(view), &bounds);
/* 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;
@ -1085,7 +1090,7 @@ eek_renderer_find_key_by_position (EekRenderer *renderer,
data.key = NULL; data.key = NULL;
data.renderer = renderer; data.renderer = renderer;
eek_container_find (EEK_CONTAINER(level_keyboard_current(priv->keyboard)), eek_container_find (EEK_CONTAINER(view),
find_key_by_position_section_callback, find_key_by_position_section_callback,
&data); &data);
return data.key; return data.key;

View File

@ -38,14 +38,15 @@ struct _EekRendererClass
void (* render_key_outline) (EekRenderer *self, void (* render_key_outline) (EekRenderer *self,
cairo_t *cr, cairo_t *cr,
EekKeyboard *view,
EekKey *key, EekKey *key,
gdouble scale, gdouble scale,
gboolean rotate); gboolean rotate);
void (* render_key) (EekRenderer *self, void (* render_key) (EekRenderer *self,
cairo_t *cr, cairo_t *cr,
EekKeyboard *view,
EekKey *key, EekKey *key,
guint level,
gdouble scale, gdouble scale,
gboolean rotate); gboolean rotate);
@ -90,14 +91,15 @@ void eek_renderer_render_key_label (EekRenderer *renderer,
void eek_renderer_render_key_outline void eek_renderer_render_key_outline
(EekRenderer *renderer, (EekRenderer *renderer,
cairo_t *cr, cairo_t *cr, EekKeyboard *view,
EekKey *key, EekKey *key,
gdouble scale, gdouble scale,
gboolean rotate); gboolean rotate);
void eek_renderer_render_key (EekRenderer *renderer, void eek_renderer_render_key (EekRenderer *renderer,
cairo_t *cr, cairo_t *cr,
EekKey *key, guint level, EekKeyboard *view,
EekKey *key,
gdouble scale, gdouble scale,
gboolean rotate); gboolean rotate);
@ -122,12 +124,12 @@ void eek_renderer_get_foreground_color
void eek_renderer_set_border_width (EekRenderer *renderer, void eek_renderer_set_border_width (EekRenderer *renderer,
gdouble border_width); gdouble border_width);
EekKey *eek_renderer_find_key_by_position EekKey *eek_renderer_find_key_by_position
(EekRenderer *renderer, (EekRenderer *renderer, EekKeyboard *view,
gdouble x, gdouble x,
gdouble y); gdouble y);
void eek_renderer_apply_transformation_for_key void eek_renderer_apply_transformation_for_key
(EekRenderer *renderer, (EekRenderer *renderer,
cairo_t *cr, cairo_t *cr, EekKeyboard *view,
EekKey *key, EekKey *key,
gdouble scale, gdouble scale,
gboolean rotate); gboolean rotate);