libeek: use eek_container_find_by_position() in button event handler of EekGtkKeyboard

This commit is contained in:
Daiki Ueno
2010-06-17 11:23:01 +09:00
parent 2877170d2f
commit 6ba0a734d9
6 changed files with 148 additions and 143 deletions

View File

@ -234,80 +234,34 @@ on_gtk_expose_event (GtkWidget *widget,
return TRUE;
}
struct _FkbeCallbackData
{
EekKey *key;
gint x, y;
};
typedef struct _FkbeCallbackData FkbeCallbackData;
static gint
compare_element_by_location (EekElement *element, gpointer user_data)
{
EekBounds bounds;
FkbeCallbackData *data = user_data;
eek_element_get_bounds (element, &bounds);
if (bounds.x <= data->x && bounds.y <= data->y &&
data->x <= (bounds.x + bounds.width) &&
data->y <= (bounds.y + bounds.height))
return 0;
return -1;
}
static EekKey *
find_key_by_location (EekKeyboard *keyboard, gint x, gint y)
{
EekBounds bounds;
FkbeCallbackData data;
EekElement *element;
eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds);
data.x = x - bounds.x;
data.y = y - bounds.y;
element = eek_container_find (EEK_CONTAINER(keyboard),
compare_element_by_location,
&data);
if (element) {
eek_element_get_bounds (element, &bounds);
data.x -= bounds.x;
data.y -= bounds.y;
element = eek_container_find (EEK_CONTAINER(element),
compare_element_by_location,
&data);
return EEK_KEY(element);
}
return NULL;
}
static gboolean
on_gtk_button_press_event (GtkWidget *widget,
GdkEventButton *event,
gpointer user_data)
on_gtk_button_event (GtkWidget *widget,
GdkEventButton *event,
gpointer user_data)
{
EekKeyboard *keyboard = user_data;
EekKey *key;
EekElement *keyboard = user_data, *section, *key;
EekBounds bounds;
gdouble x, y;
key = find_key_by_location (keyboard, event->x, event->y);
if (key) {
g_signal_emit_by_name (keyboard, "key-pressed", key);
return TRUE;
}
return FALSE;
}
static gboolean
on_gtk_button_release_event (GtkWidget *widget,
GdkEventButton *event,
gpointer user_data)
{
EekKeyboard *keyboard = user_data;
EekKey *key;
key = find_key_by_location (keyboard, event->x, event->y);
if (key) {
g_signal_emit_by_name (keyboard, "key-released", key);
return TRUE;
x = (gdouble)event->x;
y = (gdouble)event->y;
section = eek_container_find_by_position (EEK_CONTAINER(keyboard), x, y);
if (section) {
eek_element_get_bounds (keyboard, &bounds);
x -= bounds.x;
y -= bounds.y;
key = eek_container_find_by_position (EEK_CONTAINER(section), x, y);
if (key)
switch (event->type) {
case GDK_BUTTON_PRESS:
g_signal_emit_by_name (keyboard, "key-pressed", key);
return TRUE;
case GDK_BUTTON_RELEASE:
g_signal_emit_by_name (keyboard, "key-released", key);
return TRUE;
default:
return FALSE;
}
}
return FALSE;
}
@ -329,9 +283,9 @@ eek_gtk_keyboard_get_widget (EekGtkKeyboard *keyboard)
g_signal_connect (priv->widget, "expose_event",
G_CALLBACK (on_gtk_expose_event), keyboard);
g_signal_connect (priv->widget, "button-press-event",
G_CALLBACK (on_gtk_button_press_event), keyboard);
G_CALLBACK (on_gtk_button_event), keyboard);
g_signal_connect (priv->widget, "button-release-event",
G_CALLBACK (on_gtk_button_release_event), keyboard);
G_CALLBACK (on_gtk_button_event), keyboard);
eek_keyboard_realize (EEK_KEYBOARD(keyboard));
}
return priv->widget;