From ba92dceab2c94872977b19df01321162d76a4948 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Fri, 31 Mar 2017 17:22:00 +0200 Subject: 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. --- gtk/gtkpointerfocus.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 gtk/gtkpointerfocus.c (limited to 'gtk/gtkpointerfocus.c') 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 . + */ + +#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); +} -- cgit v1.2.1