Merge branch 'touch' into 'squeekboard'
Touch support See merge request Librem5/squeekboard!9
This commit is contained in:
@ -67,7 +67,6 @@ struct _EekGtkKeyboardPrivate
|
|||||||
EekTheme *theme;
|
EekTheme *theme;
|
||||||
};
|
};
|
||||||
|
|
||||||
static EekColor * color_from_gdk_color (GdkColor *gdk_color);
|
|
||||||
static void on_key_pressed (EekKey *key,
|
static void on_key_pressed (EekKey *key,
|
||||||
EekGtkKeyboard *self);
|
EekGtkKeyboard *self);
|
||||||
static void on_key_released (EekKey *key,
|
static void on_key_released (EekKey *key,
|
||||||
@ -78,8 +77,6 @@ static void on_key_locked (EekKeyboard *keyboard,
|
|||||||
static void on_key_unlocked (EekKeyboard *keyboard,
|
static void on_key_unlocked (EekKeyboard *keyboard,
|
||||||
EekKey *key,
|
EekKey *key,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
static void on_key_cancelled (EekKey *key,
|
|
||||||
EekGtkKeyboard *self);
|
|
||||||
static void on_symbol_index_changed (EekKeyboard *keyboard,
|
static void on_symbol_index_changed (EekKeyboard *keyboard,
|
||||||
gint group,
|
gint group,
|
||||||
gint level,
|
gint level,
|
||||||
@ -162,62 +159,21 @@ eek_gtk_keyboard_real_size_allocate (GtkWidget *self,
|
|||||||
size_allocate (self, allocation);
|
size_allocate (self, allocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static void depress(EekGtkKeyboard *self,
|
||||||
eek_gtk_keyboard_real_button_press_event (GtkWidget *self,
|
gdouble x, gdouble y, guint32 time) {
|
||||||
GdkEventButton *event)
|
|
||||||
{
|
|
||||||
if (event->type != GDK_BUTTON_PRESS
|
|
||||||
|| event->button != 1) {
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
|
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
|
||||||
EekKey *key;
|
EekKey *key = eek_renderer_find_key_by_position (priv->renderer, x, y);
|
||||||
|
|
||||||
key = eek_renderer_find_key_by_position (priv->renderer,
|
|
||||||
(gdouble)event->x,
|
|
||||||
(gdouble)event->y);
|
|
||||||
if (key) {
|
if (key) {
|
||||||
eek_keyboard_press_key(priv->keyboard, key, event->time);
|
eek_keyboard_press_key(priv->keyboard, key, time);
|
||||||
on_key_pressed(key, EEK_GTK_KEYBOARD(self));
|
on_key_pressed(key, self);
|
||||||
}
|
}
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: this belongs more in gtk_keyboard, with a way to find out which key to re-render
|
static void drag(EekGtkKeyboard *self,
|
||||||
static gboolean
|
gdouble x, gdouble y, guint32 time) {
|
||||||
eek_gtk_keyboard_real_button_release_event (GtkWidget *self,
|
|
||||||
GdkEventButton *event)
|
|
||||||
{
|
|
||||||
if (event->type != GDK_BUTTON_RELEASE
|
|
||||||
|| event->button != 1) {
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
|
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
|
||||||
|
EekKey *key = eek_renderer_find_key_by_position (priv->renderer, x, y);
|
||||||
|
|
||||||
GList *list = eek_keyboard_get_pressed_keys (priv->keyboard);
|
|
||||||
for (GList *head = list; head; head = g_list_next (head)) {
|
|
||||||
EekKey *key = EEK_KEY(head->data);
|
|
||||||
eek_keyboard_release_key(priv->keyboard, key, event->time);
|
|
||||||
on_key_released(key, EEK_GTK_KEYBOARD(self));
|
|
||||||
}
|
|
||||||
g_list_free (list);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
eek_gtk_keyboard_real_motion_notify_event (GtkWidget *self,
|
|
||||||
GdkEventMotion *event)
|
|
||||||
{
|
|
||||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
|
|
||||||
EekKey *key;
|
|
||||||
|
|
||||||
if (event->state == 0)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
key = eek_renderer_find_key_by_position (priv->renderer,
|
|
||||||
(gdouble)event->x,
|
|
||||||
(gdouble)event->y);
|
|
||||||
if (key) {
|
if (key) {
|
||||||
GList *list, *head;
|
GList *list, *head;
|
||||||
gboolean found = FALSE;
|
gboolean found = FALSE;
|
||||||
@ -227,20 +183,94 @@ eek_gtk_keyboard_real_motion_notify_event (GtkWidget *self,
|
|||||||
if (head->data == key)
|
if (head->data == key)
|
||||||
found = TRUE;
|
found = TRUE;
|
||||||
else {
|
else {
|
||||||
eek_keyboard_release_key(priv->keyboard, head->data, event->time);
|
eek_keyboard_release_key(priv->keyboard, EEK_KEY(head->data), time);
|
||||||
on_key_released(key, EEK_GTK_KEYBOARD(self));
|
on_key_released(key, self);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_list_free (list);
|
g_list_free (list);
|
||||||
|
|
||||||
if (!found) {
|
if (!found) {
|
||||||
eek_keyboard_press_key(priv->keyboard, key, event->time);
|
eek_keyboard_press_key(priv->keyboard, key, time);
|
||||||
on_key_pressed(key, EEK_GTK_KEYBOARD(self));
|
on_key_pressed(key, self);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void release(EekGtkKeyboard *self, guint32 time) {
|
||||||
|
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
|
||||||
|
|
||||||
|
GList *list = eek_keyboard_get_pressed_keys (priv->keyboard);
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
g_list_free (list);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
eek_gtk_keyboard_real_button_press_event (GtkWidget *self,
|
||||||
|
GdkEventButton *event)
|
||||||
|
{
|
||||||
|
if (event->type == GDK_BUTTON_PRESS && event->button == 1) {
|
||||||
|
depress(EEK_GTK_KEYBOARD(self), event->x, event->y, event->time);
|
||||||
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: this belongs more in gtk_keyboard, with a way to find out which key to re-render
|
||||||
|
static gboolean
|
||||||
|
eek_gtk_keyboard_real_button_release_event (GtkWidget *self,
|
||||||
|
GdkEventButton *event)
|
||||||
|
{
|
||||||
|
if (event->type == GDK_BUTTON_RELEASE && event->button == 1) {
|
||||||
|
// TODO: can the event have different coords than the previous move event?
|
||||||
|
release(EEK_GTK_KEYBOARD(self), event->time);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
eek_gtk_keyboard_real_motion_notify_event (GtkWidget *self,
|
||||||
|
GdkEventMotion *event)
|
||||||
|
{
|
||||||
|
if (event->state & GDK_BUTTON1_MASK) {
|
||||||
|
drag(EEK_GTK_KEYBOARD(self), event->x, event->y, event->time);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only one touch stream at a time allowed. Others will be completely ignored.
|
||||||
|
static gboolean
|
||||||
|
handle_touch_event (GtkWidget *widget,
|
||||||
|
GdkEventTouch *event) {
|
||||||
|
EekGtkKeyboard *self = EEK_GTK_KEYBOARD(widget);
|
||||||
|
if (event->type == GDK_TOUCH_BEGIN) {
|
||||||
|
if (self->sequence) {
|
||||||
|
// Ignore second and following touch points
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
self->sequence = event->sequence;
|
||||||
|
depress(self, event->x, event->y, event->time);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self->sequence != event->sequence) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event->type == GDK_TOUCH_UPDATE) {
|
||||||
|
drag(self, event->x, event->y, event->time);
|
||||||
|
}
|
||||||
|
if (event->type == GDK_TOUCH_END || event->type == GDK_TOUCH_CANCEL) {
|
||||||
|
// TODO: can the event have different coords than the previous update event?
|
||||||
|
release(self, event->time);
|
||||||
|
self->sequence = NULL;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
eek_gtk_keyboard_real_unmap (GtkWidget *self)
|
eek_gtk_keyboard_real_unmap (GtkWidget *self)
|
||||||
{
|
{
|
||||||
@ -392,6 +422,7 @@ eek_gtk_keyboard_class_init (EekGtkKeyboardClass *klass)
|
|||||||
eek_gtk_keyboard_real_motion_notify_event;
|
eek_gtk_keyboard_real_motion_notify_event;
|
||||||
widget_class->query_tooltip =
|
widget_class->query_tooltip =
|
||||||
eek_gtk_keyboard_real_query_tooltip;
|
eek_gtk_keyboard_real_query_tooltip;
|
||||||
|
widget_class->touch_event = handle_touch_event;
|
||||||
|
|
||||||
gobject_class->set_property = eek_gtk_keyboard_set_property;
|
gobject_class->set_property = eek_gtk_keyboard_set_property;
|
||||||
gobject_class->dispose = eek_gtk_keyboard_dispose;
|
gobject_class->dispose = eek_gtk_keyboard_dispose;
|
||||||
@ -566,19 +597,6 @@ on_key_released (EekKey *key,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
on_key_cancelled (EekKey *key,
|
|
||||||
EekGtkKeyboard *self)
|
|
||||||
{
|
|
||||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
|
|
||||||
|
|
||||||
/* renderer may have not been set yet if the widget is a popup */
|
|
||||||
if (!priv->renderer)
|
|
||||||
return;
|
|
||||||
|
|
||||||
render_released_key (GTK_WIDGET(self), key);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_key_locked (EekKeyboard *keyboard,
|
on_key_locked (EekKeyboard *keyboard,
|
||||||
EekKey *key,
|
EekKey *key,
|
||||||
|
|||||||
@ -47,6 +47,8 @@ struct _EekGtkKeyboard
|
|||||||
/*< private >*/
|
/*< private >*/
|
||||||
GtkDrawingArea parent;
|
GtkDrawingArea parent;
|
||||||
|
|
||||||
|
GdkEventSequence *sequence; // unowned reference
|
||||||
|
|
||||||
EekGtkKeyboardPrivate *priv;
|
EekGtkKeyboardPrivate *priv;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user