diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2017-03-31 17:22:00 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2017-05-25 16:25:58 +0200 |
commit | ba92dceab2c94872977b19df01321162d76a4948 (patch) | |
tree | 422d67c9f1ddb3a7f35df984356cad50c567c840 /gtk/gtkpointerfocus.c | |
parent | f50875f8d06b175e3dd3ca5232475897e4e757cf (diff) | |
download | gtk+-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.c | 98 |
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); +} |