keyboard: Pass the current view instead of level
This commit is contained in:
@ -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,10 +307,10 @@ 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) {
|
||||||
@ -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 */
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user