libeek: make EekGtkKeyboard handle button events
This commit is contained in:
@ -234,6 +234,84 @@ 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)
|
||||
{
|
||||
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-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;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
eek_gtk_keyboard_get_widget (EekGtkKeyboard *keyboard)
|
||||
{
|
||||
@ -243,8 +321,17 @@ eek_gtk_keyboard_get_widget (EekGtkKeyboard *keyboard)
|
||||
if (!priv->widget) {
|
||||
priv->widget = gtk_drawing_area_new ();
|
||||
g_object_ref_sink (priv->widget);
|
||||
gtk_widget_set_events (priv->widget,
|
||||
GDK_EXPOSURE_MASK |
|
||||
GDK_KEY_PRESS_MASK |
|
||||
GDK_BUTTON_PRESS_MASK |
|
||||
GDK_BUTTON_RELEASE_MASK);
|
||||
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_signal_connect (priv->widget, "button-release-event",
|
||||
G_CALLBACK (on_gtk_button_release_event), keyboard);
|
||||
eek_keyboard_realize (EEK_KEYBOARD(keyboard));
|
||||
}
|
||||
return priv->widget;
|
||||
|
||||
@ -511,7 +511,6 @@ set_xkb_component_names (EekXklLayout *layout, XklConfigRec *config)
|
||||
XkbComponentNamesRec names;
|
||||
gboolean success = FALSE;
|
||||
|
||||
#define DEBUG 1
|
||||
#if DEBUG
|
||||
if (config->layouts) {
|
||||
gint i;
|
||||
|
||||
@ -202,8 +202,8 @@ on_changed (EekLayout *layout, gpointer user_data)
|
||||
GtkWidget *vbox, *widget;
|
||||
|
||||
vbox = gtk_widget_get_parent (eekboard->widget);
|
||||
gtk_widget_hide (eekboard->widget);
|
||||
gtk_widget_destroy (eekboard->widget);
|
||||
/* gtk_widget_destroy() seems not usable for GtkClutterEmbed */
|
||||
gtk_container_remove (GTK_CONTAINER(vbox), eekboard->widget);
|
||||
|
||||
g_object_unref (eekboard->keyboard);
|
||||
widget = create_widget (eekboard, eekboard->width, eekboard->height);
|
||||
|
||||
Reference in New Issue
Block a user