summaryrefslogtreecommitdiff
path: root/gtk/gtkpointerfocus.c
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2017-03-31 17:22:00 +0200
committerCarlos Garnacho <carlosg@gnome.org>2017-05-25 16:25:58 +0200
commitba92dceab2c94872977b19df01321162d76a4948 (patch)
tree422d67c9f1ddb3a7f35df984356cad50c567c840 /gtk/gtkpointerfocus.c
parentf50875f8d06b175e3dd3ca5232475897e4e757cf (diff)
downloadgtk+-ba92dceab2c94872977b19df01321162d76a4948.tar.gz
gtk: Introduce GtkPointerFocus
These objects (tied to a toplevel) track the focus of a pointer/touchpoint. The info in these basically consists of current toplevel coordinates and the current target widget.
Diffstat (limited to 'gtk/gtkpointerfocus.c')
-rw-r--r--gtk/gtkpointerfocus.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/gtk/gtkpointerfocus.c b/gtk/gtkpointerfocus.c
new file mode 100644
index 0000000000..7c522a0dd0
--- /dev/null
+++ b/gtk/gtkpointerfocus.c
@@ -0,0 +1,98 @@
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 2017 - Red Hat Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "gtkpointerfocusprivate.h"
+#include "gtkprivate.h"
+
+static void
+target_destroyed (gpointer data,
+ GObject *object_location)
+{
+ GtkPointerFocus *focus = data;
+
+ focus->target = NULL;
+ gtk_pointer_focus_repick_target (focus);
+}
+
+GtkPointerFocus *
+gtk_pointer_focus_new (GtkWindow *toplevel,
+ GtkWidget *widget,
+ GdkDevice *device,
+ GdkEventSequence *sequence,
+ gdouble x,
+ gdouble y)
+{
+ GtkPointerFocus *focus;
+
+ focus = g_new0 (GtkPointerFocus, 1);
+ focus->toplevel = toplevel;
+ focus->device = device;
+ focus->sequence = sequence;
+ gtk_pointer_focus_set_target (focus, widget);
+ gtk_pointer_focus_set_coordinates (focus, x, y);
+
+ return focus;
+}
+
+void
+gtk_pointer_focus_free (GtkPointerFocus *focus)
+{
+ gtk_pointer_focus_set_target (focus, NULL);
+ gtk_pointer_focus_set_implicit_grab (focus, NULL);
+ g_free (focus);
+}
+
+void
+gtk_pointer_focus_set_target (GtkPointerFocus *focus,
+ GtkWidget *target)
+{
+ if (focus->target == target)
+ return;
+
+ if (focus->target)
+ g_object_weak_unref (G_OBJECT (focus->target), target_destroyed, focus);
+
+ focus->target = target;
+
+ if (focus->target)
+ g_object_weak_ref (G_OBJECT (focus->target), target_destroyed, focus);
+}
+
+GtkWidget *
+gtk_pointer_focus_get_target (GtkPointerFocus *focus)
+{
+ return focus->target;
+}
+
+void
+gtk_pointer_focus_set_coordinates (GtkPointerFocus *focus,
+ gdouble x,
+ gdouble y)
+{
+ focus->x = x;
+ focus->y = y;
+}
+
+void
+gtk_pointer_focus_repick_target (GtkPointerFocus *focus)
+{
+ GtkWidget *target;
+
+ target = _gtk_toplevel_pick (focus->toplevel, focus->x, focus->y,
+ NULL, NULL);
+ gtk_pointer_focus_set_target (focus, target);
+}