summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2017-11-19 16:18:28 -0500
committerDaniel Boles <dboles@src.gnome.org>2017-11-22 19:11:31 +0000
commitf301b7874e8c95d0ef141906bc482176f636ae3c (patch)
tree0d1424aaa3d812d914bcad5d83b7934fd9e3586d
parent19670f9fe6a32ba75a0514aad0702410c918e9e7 (diff)
downloadgtk+-f301b7874e8c95d0ef141906bc482176f636ae3c.tar.gz
emoji chooser: handle right-click
Whereever we handle long-press for touch, it makes sense to handle right-click as a faster alternative for mouse-based interaction. This commit makes right-click work to bring up the variation selector for Emojis.
-rw-r--r--gtk/gtkemojichooser.c84
1 files changed, 63 insertions, 21 deletions
diff --git a/gtk/gtkemojichooser.c b/gtk/gtkemojichooser.c
index defc528708..65d2ef15a4 100644
--- a/gtk/gtkemojichooser.c
+++ b/gtk/gtkemojichooser.c
@@ -28,6 +28,7 @@
#include "gtkstack.h"
#include "gtklabel.h"
#include "gtkgesturelongpress.h"
+#include "gtkgesturemultipress.h"
#include "gtkpopover.h"
#include "gtkscrolledwindow.h"
#include "gtkeventbox.h"
@@ -62,9 +63,12 @@ struct _GtkEmojiChooser
EmojiSection symbols;
EmojiSection flags;
- GtkGesture *recent_press;
- GtkGesture *people_press;
- GtkGesture *body_press;
+ GtkGesture *recent_long_press;
+ GtkGesture *recent_multi_press;
+ GtkGesture *people_long_press;
+ GtkGesture *people_multi_press;
+ GtkGesture *body_long_press;
+ GtkGesture *body_multi_press;
GVariant *data;
@@ -92,9 +96,12 @@ gtk_emoji_chooser_finalize (GObject *object)
g_variant_unref (chooser->data);
g_object_unref (chooser->settings);
- g_clear_object (&chooser->recent_press);
- g_clear_object (&chooser->people_press);
- g_clear_object (&chooser->body_press);
+ g_clear_object (&chooser->recent_long_press);
+ g_clear_object (&chooser->recent_multi_press);
+ g_clear_object (&chooser->people_long_press);
+ g_clear_object (&chooser->people_multi_press);
+ g_clear_object (&chooser->body_long_press);
+ g_clear_object (&chooser->body_multi_press);
G_OBJECT_CLASS (gtk_emoji_chooser_parent_class)->finalize (object);
}
@@ -219,12 +226,9 @@ emoji_activated (GtkFlowBox *box,
}
static void
-long_pressed_cb (GtkGesture *gesture,
- double x,
- double y,
- gpointer data)
+show_variations (GtkEmojiChooser *chooser,
+ GtkWidget *child)
{
- GtkWidget *child;
GtkWidget *popover;
GtkWidget *view;
GtkWidget *box;
@@ -235,8 +239,6 @@ long_pressed_cb (GtkGesture *gesture,
gboolean has_variations;
gunichar modifier;
- box = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
- child = GTK_WIDGET (gtk_flow_box_get_child_at_pos (GTK_FLOW_BOX (box), x, y));
if (!child)
return;
@@ -295,6 +297,37 @@ update_hover (GtkWidget *widget,
}
static void
+long_pressed_cb (GtkGesture *gesture,
+ double x,
+ double y,
+ gpointer data)
+{
+ GtkEmojiChooser *chooser = data;
+ GtkWidget *box;
+ GtkWidget *child;
+
+ box = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
+ child = GTK_WIDGET (gtk_flow_box_get_child_at_pos (GTK_FLOW_BOX (box), x, y));
+ show_variations (chooser, child);
+}
+
+static void
+pressed_cb (GtkGesture *gesture,
+ int n_press,
+ double x,
+ double y,
+ gpointer data)
+{
+ GtkEmojiChooser *chooser = data;
+ GtkWidget *box;
+ GtkWidget *child;
+
+ box = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
+ child = GTK_WIDGET (gtk_flow_box_get_child_at_pos (GTK_FLOW_BOX (box), x, y));
+ show_variations (chooser, child);
+}
+
+static void
add_emoji (GtkWidget *box,
gboolean prepend,
GVariant *item,
@@ -566,14 +599,23 @@ gtk_emoji_chooser_init (GtkEmojiChooser *chooser)
gtk_widget_init_template (GTK_WIDGET (chooser));
- chooser->recent_press = gtk_gesture_long_press_new (chooser->recent.box);
- g_signal_connect (chooser->recent_press, "pressed", G_CALLBACK (long_pressed_cb), chooser);
-
- chooser->people_press = gtk_gesture_long_press_new (chooser->people.box);
- g_signal_connect (chooser->people_press, "pressed", G_CALLBACK (long_pressed_cb), chooser);
-
- chooser->body_press = gtk_gesture_long_press_new (chooser->body.box);
- g_signal_connect (chooser->body_press, "pressed", G_CALLBACK (long_pressed_cb), chooser);
+ chooser->recent_long_press = gtk_gesture_long_press_new (chooser->recent.box);
+ g_signal_connect (chooser->recent_long_press, "pressed", G_CALLBACK (long_pressed_cb), chooser);
+ chooser->recent_multi_press = gtk_gesture_multi_press_new (chooser->recent.box);
+ gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (chooser->recent_multi_press), GDK_BUTTON_SECONDARY);
+ g_signal_connect (chooser->recent_multi_press, "pressed", G_CALLBACK (pressed_cb), chooser);
+
+ chooser->people_long_press = gtk_gesture_long_press_new (chooser->people.box);
+ g_signal_connect (chooser->people_long_press, "pressed", G_CALLBACK (long_pressed_cb), chooser);
+ chooser->people_multi_press = gtk_gesture_multi_press_new (chooser->people.box);
+ gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (chooser->people_multi_press), GDK_BUTTON_SECONDARY);
+ g_signal_connect (chooser->people_multi_press, "pressed", G_CALLBACK (pressed_cb), chooser);
+
+ chooser->body_long_press = gtk_gesture_long_press_new (chooser->body.box);
+ g_signal_connect (chooser->body_long_press, "pressed", G_CALLBACK (long_pressed_cb), chooser);
+ chooser->body_multi_press = gtk_gesture_multi_press_new (chooser->body.box);
+ gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (chooser->body_multi_press), GDK_BUTTON_SECONDARY);
+ g_signal_connect (chooser->body_multi_press, "pressed", G_CALLBACK (pressed_cb), chooser);
adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (chooser->scrolled_window));
g_signal_connect (adj, "value-changed", G_CALLBACK (adj_value_changed), chooser);