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