level: Make keyboard the only source of level data
This commit is contained in:
@ -64,13 +64,13 @@ 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,
|
||||||
EekGtkKeyboard *self);
|
EekGtkKeyboard *self, guint level);
|
||||||
static void on_key_released (EekKey *key,
|
static void on_key_released (EekKey *key,
|
||||||
EekGtkKeyboard *self);
|
EekGtkKeyboard *self);
|
||||||
static void render_pressed_key (GtkWidget *widget,
|
static void render_pressed_key (GtkWidget *widget,
|
||||||
EekKey *key);
|
EekKey *key, guint level);
|
||||||
static void render_locked_key (GtkWidget *widget,
|
static void render_locked_key (GtkWidget *widget,
|
||||||
EekKey *key);
|
EekKey *key, guint level);
|
||||||
static void render_released_key (GtkWidget *widget,
|
static void render_released_key (GtkWidget *widget,
|
||||||
EekKey *key);
|
EekKey *key);
|
||||||
|
|
||||||
@ -113,17 +113,19 @@ eek_gtk_keyboard_real_draw (GtkWidget *self,
|
|||||||
|
|
||||||
eek_renderer_render_keyboard (priv->renderer, cr);
|
eek_renderer_render_keyboard (priv->renderer, cr);
|
||||||
|
|
||||||
|
uint level = eek_element_get_level(EEK_ELEMENT(priv->keyboard));
|
||||||
|
|
||||||
/* redraw pressed key */
|
/* redraw pressed key */
|
||||||
list = eek_keyboard_get_pressed_keys (priv->keyboard);
|
list = eek_keyboard_get_pressed_keys (priv->keyboard);
|
||||||
for (head = list; head; head = g_list_next (head)) {
|
for (head = list; head; head = g_list_next (head)) {
|
||||||
render_pressed_key (self, head->data);
|
render_pressed_key (self, head->data, level);
|
||||||
}
|
}
|
||||||
g_list_free (list);
|
g_list_free (list);
|
||||||
|
|
||||||
/* redraw locked key */
|
/* redraw locked key */
|
||||||
list = eek_keyboard_get_locked_keys (priv->keyboard);
|
list = eek_keyboard_get_locked_keys (priv->keyboard);
|
||||||
for (head = list; head; head = g_list_next (head)) {
|
for (head = list; head; head = g_list_next (head)) {
|
||||||
render_locked_key (self, ((EekModifierKey *)head->data)->key);
|
render_locked_key (self, ((EekModifierKey *)head->data)->key, level);
|
||||||
}
|
}
|
||||||
g_list_free (list);
|
g_list_free (list);
|
||||||
|
|
||||||
@ -154,7 +156,8 @@ static void depress(EekGtkKeyboard *self,
|
|||||||
|
|
||||||
if (key) {
|
if (key) {
|
||||||
eek_keyboard_press_key(priv->keyboard, key, time);
|
eek_keyboard_press_key(priv->keyboard, key, time);
|
||||||
on_key_pressed(key, self);
|
guint level = eek_element_get_level(EEK_ELEMENT(priv->keyboard));
|
||||||
|
on_key_pressed(key, self, level);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,7 +184,8 @@ static void drag(EekGtkKeyboard *self,
|
|||||||
|
|
||||||
if (!found) {
|
if (!found) {
|
||||||
eek_keyboard_press_key(priv->keyboard, key, time);
|
eek_keyboard_press_key(priv->keyboard, key, time);
|
||||||
on_key_pressed(key, self);
|
guint level = eek_element_get_level(EEK_ELEMENT(priv->keyboard));
|
||||||
|
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)) {
|
||||||
@ -473,7 +477,8 @@ magnify_bounds (GtkWidget *self,
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
render_pressed_key (GtkWidget *widget,
|
render_pressed_key (GtkWidget *widget,
|
||||||
EekKey *key)
|
EekKey *key,
|
||||||
|
guint level)
|
||||||
{
|
{
|
||||||
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);
|
||||||
@ -483,7 +488,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, 1.0, TRUE);
|
eek_renderer_render_key (priv->renderer, cr, key, level, 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);
|
||||||
*/
|
*/
|
||||||
@ -494,7 +499,8 @@ render_pressed_key (GtkWidget *widget,
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
render_locked_key (GtkWidget *widget,
|
render_locked_key (GtkWidget *widget,
|
||||||
EekKey *key)
|
EekKey *key,
|
||||||
|
guint level)
|
||||||
{
|
{
|
||||||
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);
|
||||||
@ -504,7 +510,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, 1.0, TRUE);
|
eek_renderer_render_key (priv->renderer, cr, key, level, 1.0, TRUE);
|
||||||
|
|
||||||
gdk_window_end_draw_frame (window, context);
|
gdk_window_end_draw_frame (window, context);
|
||||||
|
|
||||||
@ -532,7 +538,8 @@ render_released_key (GtkWidget *widget,
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
on_key_pressed (EekKey *key,
|
on_key_pressed (EekKey *key,
|
||||||
EekGtkKeyboard *self)
|
EekGtkKeyboard *self,
|
||||||
|
guint level)
|
||||||
{
|
{
|
||||||
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
||||||
|
|
||||||
@ -540,7 +547,7 @@ on_key_pressed (EekKey *key,
|
|||||||
if (!priv->renderer)
|
if (!priv->renderer)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
render_pressed_key (GTK_WIDGET(self), key);
|
render_pressed_key (GTK_WIDGET(self), key, level);
|
||||||
gtk_widget_queue_draw (GTK_WIDGET(self));
|
gtk_widget_queue_draw (GTK_WIDGET(self));
|
||||||
|
|
||||||
#if HAVE_LIBCANBERRA
|
#if HAVE_LIBCANBERRA
|
||||||
|
|||||||
@ -67,7 +67,7 @@ EekSymbol *eek_key_get_symbol_with_fallback
|
|||||||
gint fallback_level);
|
gint fallback_level);
|
||||||
struct squeek_symbol *eek_key_get_symbol_at_index (EekKey *key,
|
struct squeek_symbol *eek_key_get_symbol_at_index (EekKey *key,
|
||||||
gint group,
|
gint group,
|
||||||
gint level,
|
gint level,
|
||||||
guint fallback_group,
|
guint fallback_group,
|
||||||
guint fallback_level);
|
guint fallback_level);
|
||||||
|
|
||||||
|
|||||||
@ -301,7 +301,9 @@ void eek_keyboard_press_key(EekKeyboard *keyboard, EekKey *key, guint32 timestam
|
|||||||
eek_key_set_pressed(key, TRUE);
|
eek_key_set_pressed(key, TRUE);
|
||||||
priv->pressed_keys = g_list_prepend (priv->pressed_keys, key);
|
priv->pressed_keys = g_list_prepend (priv->pressed_keys, key);
|
||||||
|
|
||||||
EekSymbol *symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
|
struct squeek_symbol *symbol = eek_key_get_symbol_at_index(
|
||||||
|
key, 0, eek_element_get_level (EEK_ELEMENT(keyboard)), 0, 0
|
||||||
|
);
|
||||||
if (!symbol)
|
if (!symbol)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -332,10 +334,9 @@ void eek_keyboard_release_key( EekKeyboard *keyboard,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EekSymbol *symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
|
struct squeek_symbol *symbol = eek_key_get_symbol_at_index(
|
||||||
if (!symbol)
|
key, 0, eek_element_get_level (EEK_ELEMENT(keyboard)), 0, 0
|
||||||
return;
|
);
|
||||||
|
|
||||||
if (!symbol)
|
if (!symbol)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@ -79,12 +79,12 @@ 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);
|
EekKey *key, guint level);
|
||||||
|
|
||||||
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,
|
||||||
EekKey *key,
|
EekKey *key, guint level,
|
||||||
gboolean active);
|
gboolean active);
|
||||||
static void on_symbol_index_changed (EekKeyboard *keyboard,
|
static void on_symbol_index_changed (EekKeyboard *keyboard,
|
||||||
gint group,
|
gint group,
|
||||||
@ -94,6 +94,7 @@ static void on_symbol_index_changed (EekKeyboard *keyboard,
|
|||||||
struct _CreateKeyboardSurfaceCallbackData {
|
struct _CreateKeyboardSurfaceCallbackData {
|
||||||
cairo_t *cr;
|
cairo_t *cr;
|
||||||
EekRenderer *renderer;
|
EekRenderer *renderer;
|
||||||
|
uint level;
|
||||||
};
|
};
|
||||||
typedef struct _CreateKeyboardSurfaceCallbackData CreateKeyboardSurfaceCallbackData;
|
typedef struct _CreateKeyboardSurfaceCallbackData CreateKeyboardSurfaceCallbackData;
|
||||||
|
|
||||||
@ -114,7 +115,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), FALSE);
|
render_key (data->renderer, data->cr, EEK_KEY(element), data->level, FALSE);
|
||||||
|
|
||||||
cairo_restore (data->cr);
|
cairo_restore (data->cr);
|
||||||
}
|
}
|
||||||
@ -177,6 +178,7 @@ render_keyboard_surface (EekRenderer *renderer)
|
|||||||
foreground.blue,
|
foreground.blue,
|
||||||
foreground.alpha);
|
foreground.alpha);
|
||||||
|
|
||||||
|
data.level = eek_element_get_level(EEK_ELEMENT(priv->keyboard));
|
||||||
/* draw sections */
|
/* draw sections */
|
||||||
eek_container_foreach_child (EEK_CONTAINER(priv->keyboard),
|
eek_container_foreach_child (EEK_CONTAINER(priv->keyboard),
|
||||||
create_keyboard_surface_section_callback,
|
create_keyboard_surface_section_callback,
|
||||||
@ -218,6 +220,7 @@ static void
|
|||||||
render_key (EekRenderer *self,
|
render_key (EekRenderer *self,
|
||||||
cairo_t *cr,
|
cairo_t *cr,
|
||||||
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);
|
||||||
@ -225,7 +228,7 @@ render_key (EekRenderer *self,
|
|||||||
cairo_surface_t *outline_surface;
|
cairo_surface_t *outline_surface;
|
||||||
EekBounds bounds;
|
EekBounds bounds;
|
||||||
guint oref;
|
guint oref;
|
||||||
EekSymbol *symbol;
|
struct squeek_symbol *symbol;
|
||||||
GHashTable *outline_surface_cache;
|
GHashTable *outline_surface_cache;
|
||||||
PangoLayout *layout;
|
PangoLayout *layout;
|
||||||
PangoRectangle extents = { 0, };
|
PangoRectangle extents = { 0, };
|
||||||
@ -277,12 +280,7 @@ render_key (EekRenderer *self,
|
|||||||
|
|
||||||
eek_renderer_get_foreground_color (self, priv->key_context, &foreground);
|
eek_renderer_get_foreground_color (self, priv->key_context, &foreground);
|
||||||
/* render icon (if any) */
|
/* render icon (if any) */
|
||||||
|
symbol = eek_key_get_symbol_at_index (key, 0, level, 0, 0);
|
||||||
EekSection *section = EEK_SECTION(eek_element_get_parent(EEK_ELEMENT(key)));
|
|
||||||
gint group = eek_element_get_group(EEK_ELEMENT(section));
|
|
||||||
gint level = eek_element_get_level(EEK_ELEMENT(section));
|
|
||||||
|
|
||||||
symbol = eek_key_get_symbol_at_index (key, group, level, 0, 0);
|
|
||||||
if (!symbol)
|
if (!symbol)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -318,7 +316,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);
|
eek_renderer_real_render_key_label (self, layout, key, level);
|
||||||
pango_layout_get_extents (layout, NULL, &extents);
|
pango_layout_get_extents (layout, NULL, &extents);
|
||||||
|
|
||||||
cairo_save (cr);
|
cairo_save (cr);
|
||||||
@ -385,17 +383,18 @@ 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);
|
||||||
EekSymbol *symbol;
|
struct squeek_symbol *symbol;
|
||||||
const gchar *label;
|
const gchar *label;
|
||||||
EekBounds bounds;
|
EekBounds bounds;
|
||||||
PangoFontDescription *font;
|
PangoFontDescription *font;
|
||||||
PangoLayoutLine *line;
|
PangoLayoutLine *line;
|
||||||
gdouble scale;
|
gdouble scale;
|
||||||
|
|
||||||
symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
|
symbol = eek_key_get_symbol_at_index(key, 0, level, 0, 0);
|
||||||
if (!symbol)
|
if (!symbol)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -466,6 +465,7 @@ static void
|
|||||||
eek_renderer_real_render_key (EekRenderer *self,
|
eek_renderer_real_render_key (EekRenderer *self,
|
||||||
cairo_t *cr,
|
cairo_t *cr,
|
||||||
EekKey *key,
|
EekKey *key,
|
||||||
|
guint level,
|
||||||
gdouble scale,
|
gdouble scale,
|
||||||
gboolean rotate)
|
gboolean rotate)
|
||||||
{
|
{
|
||||||
@ -482,7 +482,7 @@ eek_renderer_real_render_key (EekRenderer *self,
|
|||||||
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, key, scale, rotate);
|
||||||
render_key (self, cr, key, eek_key_is_pressed (key) || eek_key_is_locked (key));
|
render_key (self, cr, key, level, eek_key_is_pressed (key) || eek_key_is_locked (key));
|
||||||
cairo_restore (cr);
|
cairo_restore (cr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -942,6 +942,7 @@ void
|
|||||||
eek_renderer_render_key (EekRenderer *renderer,
|
eek_renderer_render_key (EekRenderer *renderer,
|
||||||
cairo_t *cr,
|
cairo_t *cr,
|
||||||
EekKey *key,
|
EekKey *key,
|
||||||
|
guint level,
|
||||||
gdouble scale,
|
gdouble scale,
|
||||||
gboolean rotate)
|
gboolean rotate)
|
||||||
{
|
{
|
||||||
@ -950,7 +951,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, scale, rotate);
|
render_key (renderer, cr, key, level, scale, rotate);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@ -44,6 +44,7 @@ struct _EekRendererClass
|
|||||||
void (* render_key) (EekRenderer *self,
|
void (* render_key) (EekRenderer *self,
|
||||||
cairo_t *cr,
|
cairo_t *cr,
|
||||||
EekKey *key,
|
EekKey *key,
|
||||||
|
guint level,
|
||||||
gdouble scale,
|
gdouble scale,
|
||||||
gboolean rotate);
|
gboolean rotate);
|
||||||
|
|
||||||
@ -95,7 +96,7 @@ void eek_renderer_render_key_outline
|
|||||||
|
|
||||||
void eek_renderer_render_key (EekRenderer *renderer,
|
void eek_renderer_render_key (EekRenderer *renderer,
|
||||||
cairo_t *cr,
|
cairo_t *cr,
|
||||||
EekKey *key,
|
EekKey *key, guint level,
|
||||||
gdouble scale,
|
gdouble scale,
|
||||||
gboolean rotate);
|
gboolean rotate);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user