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.
This commit is contained in:
Carlos Garnacho
2017-03-31 17:22:00 +02:00
parent f50875f8d0
commit ba92dceab2
3 changed files with 152 additions and 0 deletions

View File

@@ -513,6 +513,7 @@ gtk_private_h_sources = \
gtkplacessidebarprivate.h \
gtkplacesviewprivate.h \
gtkplacesviewrowprivate.h \
gtkpointerfocusprivate.h \
gtkpopoverprivate.h \
gtkprintoperation-private.h \
gtkprintutils.h \
@@ -832,6 +833,7 @@ gtk_base_c_sources = \
gtkprivatetypebuiltins.c \
gtkprogressbar.c \
gtkprogresstracker.c \
gtkpointerfocus.c \
gtkpopover.c \
gtkpopovermenu.c \
gtkradiobutton.c \

98
gtk/gtkpointerfocus.c Normal file
View File

@@ -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);
}

View File

@@ -0,0 +1,52 @@
/* 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/>.
*/
#ifndef _GTK_POINTER_FOCUS_PRIVATE_H_
#define _GTK_POINTER_FOCUS_PRIVATE_H_
#include <gtk/gtk.h>
typedef struct _GtkPointerFocus GtkPointerFocus;
struct _GtkPointerFocus
{
GdkDevice *device;
GdkEventSequence *sequence;
GtkWindow *toplevel;
GtkWidget *target; /* Unaffected by the implicit grab */
GtkWidget *grab_widget;
gdouble x, y; /* In toplevel coordinates */
};
GtkPointerFocus * gtk_pointer_focus_new (GtkWindow *toplevel,
GtkWidget *widget,
GdkDevice *device,
GdkEventSequence *sequence,
gdouble x,
gdouble y);
void gtk_pointer_focus_free (GtkPointerFocus *focus);
void gtk_pointer_focus_set_coordinates (GtkPointerFocus *focus,
gdouble x,
gdouble y);
void gtk_pointer_focus_set_target (GtkPointerFocus *focus,
GtkWidget *target);
GtkWidget * gtk_pointer_focus_get_target (GtkPointerFocus *focus);
void gtk_pointer_focus_repick_target (GtkPointerFocus *focus);
#endif /* _GTK_POINTER_FOCUS_PRIVATE_H_ */