diff --git a/gtk/gtk.h b/gtk/gtk.h index 477cf4e496..651e8d6614 100644 --- a/gtk/gtk.h +++ b/gtk/gtk.h @@ -161,6 +161,7 @@ #include #include #include +#include #include #include #include diff --git a/gtk/gtknative.c b/gtk/gtknative.c new file mode 100644 index 0000000000..4f5feb0593 --- /dev/null +++ b/gtk/gtknative.c @@ -0,0 +1,142 @@ +/* + * Copyright © 2019 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.1 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 . + * + * Authors: Matthias Clasen + */ + +#include "config.h" + +#include "gtknativeprivate.h" +#include "gtkcssnodeprivate.h" +#include "gtkwidgetprivate.h" +#include "gdk/gdk-private.h" +#include "gtkprivate.h" +#include "gtkintl.h" + +/** + * SECTION:gtknative + * @Title: GtkNative + * @Short_description: Interface for widgets having surfaces + * @See_also: #GtkRoot + * + * #GtkNative is the interface implemented by all widgets that can provide + * a GdkSurface for widgets to render on. + * + * The obvious example of a #GtkNative is #GtkWindow. + */ + +G_DEFINE_INTERFACE (GtkNative, gtk_native, GTK_TYPE_WIDGET) + +static GskRenderer * +gtk_native_default_get_renderer (GtkNative *self) +{ + return NULL; +} + +static void +gtk_native_default_get_surface_transform (GtkNative *self, + int *x, + int *y) +{ + *x = 0; + *y = 0; +} + +static void +gtk_native_default_check_resize (GtkNative *self) +{ +} + +static void +gtk_native_default_init (GtkNativeInterface *iface) +{ + iface->get_renderer = gtk_native_default_get_renderer; + iface->get_surface_transform = gtk_native_default_get_surface_transform; + iface->check_resize = gtk_native_default_check_resize; +} + +/** + * gtk_native_get_surface: + * @self: a #GtkNative + * + * Returns the surface of this #GtkNative. + * + * Returns: the surface of @self + */ +GdkSurface * +gtk_native_get_surface (GtkNative *self) +{ + g_return_val_if_fail (GTK_IS_NATIVE (self), NULL); + + return GTK_NATIVE_GET_IFACE (self)->get_surface (self); +} + +/** + * gtk_native_get_renderer: + * @self: a #GtkNative + * + * Returns the renderer that is used for this #GtkNative. + * + * Returns: the renderer for @self + */ +GskRenderer * +gtk_native_get_renderer (GtkNative *self) +{ + g_return_val_if_fail (GTK_IS_NATIVE (self), NULL); + + return GTK_NATIVE_GET_IFACE (self)->get_renderer (self); +} + +void +gtk_native_get_surface_transform (GtkNative *self, + int *x, + int *y) +{ + g_return_if_fail (GTK_IS_NATIVE (self)); + g_return_if_fail (x != 0); + g_return_if_fail (y != 0); + + return GTK_NATIVE_GET_IFACE (self)->get_surface_transform (self, x, y); +} + +void +gtk_native_check_resize (GtkNative *self) +{ + g_return_if_fail (GTK_IS_NATIVE (self)); + + GTK_NATIVE_GET_IFACE (self)->check_resize (self); +} + +/** + * gtk_native_get_for_surface: + * @surface: a #GdkSurface + * + * Finds the GtkNative associated with the surface. + * + * Returns: (transfer none): the #GtkNative that is associated with @surface + */ +GtkWidget * +gtk_native_get_for_surface (GdkSurface *surface) +{ + GtkWidget *widget; + + widget = (GtkWidget *)gdk_surface_get_widget (surface); + + if (widget && GTK_IS_NATIVE (widget)) + return widget; + + return NULL; +} diff --git a/gtk/gtknative.h b/gtk/gtknative.h new file mode 100644 index 0000000000..bca65089e3 --- /dev/null +++ b/gtk/gtknative.h @@ -0,0 +1,72 @@ +/* + * Copyright © 2019 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.1 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 . + * + * Authors: Matthias Clasen + */ + +#ifndef __GTK_NATIVE_H__ +#define __GTK_NATIVE_H__ + +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +#define GTK_TYPE_NATIVE (gtk_native_get_type ()) + +GDK_AVAILABLE_IN_ALL +G_DECLARE_INTERFACE (GtkNative, gtk_native, GTK, NATIVE, GtkWidget) + +/** + * GtkNativeIface: + * + * The list of functions that must be implemented for the #GtkNative interface. + */ +struct _GtkNativeInterface +{ + /*< private >*/ + GTypeInterface g_iface; + + /*< public >*/ + GdkSurface * (* get_surface) (GtkNative *self); + GskRenderer * (* get_renderer) (GtkNative *self); + + void (* get_surface_transform) (GtkNative *self, + int *x, + int *y); + + void (* check_resize) (GtkNative *self); +}; + +GDK_AVAILABLE_IN_ALL +GtkWidget * gtk_native_get_for_surface (GdkSurface *surface); + +GDK_AVAILABLE_IN_ALL +void gtk_native_check_resize (GtkNative *self); + +GDK_AVAILABLE_IN_ALL +GdkSurface *gtk_native_get_surface (GtkNative *self); + +GDK_AVAILABLE_IN_ALL +GskRenderer *gtk_native_get_renderer (GtkNative *self); + +G_END_DECLS + +#endif /* __GTK_NATIVE_H__ */ diff --git a/gtk/gtknativeprivate.h b/gtk/gtknativeprivate.h new file mode 100644 index 0000000000..c6b62bd67b --- /dev/null +++ b/gtk/gtknativeprivate.h @@ -0,0 +1,14 @@ +#ifndef __GTK_NATIVE_PRIVATE_H__ +#define __GTK_NATIVE_PRIVATE_H__ + +#include "gtknative.h" + +G_BEGIN_DECLS + +void gtk_native_get_surface_transform (GtkNative *self, + int *x, + int *y); + +G_END_DECLS + +#endif /* __GTK_NATIVE_PRIVATE_H__ */ diff --git a/gtk/meson.build b/gtk/meson.build index 1075ccf725..bfb72d0db4 100644 --- a/gtk/meson.build +++ b/gtk/meson.build @@ -316,6 +316,7 @@ gtk_public_sources = files([ 'gtkrendernodepaintable.c', 'gtkrevealer.c', 'gtkroot.c', + 'gtknative.c', 'gtkroundedbox.c', 'gtkscale.c', 'gtkscalebutton.c',