mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-29 06:51:10 +00:00
933a0e5a98
Rename things so they make more sense. The dest/source naming got a bit unclear when we added background into the mix. Now we're going for: source_rect - the texture region to display texture_rect - dimensions of the subsurface showing the texture background_rect - dimensions of the background subsurface bounds - union of texture_rect and background_rect Also use this opportunity to add some api docs.
161 lines
5.7 KiB
C
161 lines
5.7 KiB
C
#include <gtk/gtk.h>
|
|
#include "gdk/gdksurfaceprivate.h"
|
|
#include "gdk/gdksubsurfaceprivate.h"
|
|
#include "gdk/gdkdebugprivate.h"
|
|
|
|
#ifdef GDK_WINDOWING_WAYLAND
|
|
#include "gdk/wayland/gdkwayland.h"
|
|
#endif
|
|
|
|
#define TEXTURE_RECT(t) \
|
|
GRAPHENE_RECT_INIT (0, 0, \
|
|
gdk_texture_get_width (t), \
|
|
gdk_texture_get_height (t))
|
|
|
|
static void
|
|
test_subsurface_basics (void)
|
|
{
|
|
GdkSurface *surface;
|
|
GdkSubsurface *sub;
|
|
GdkTexture *texture;
|
|
graphene_rect_t rect;
|
|
|
|
#ifdef GDK_WINDOWING_WAYLAND
|
|
if (!GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default ()))
|
|
#endif
|
|
{
|
|
g_test_skip ("No subsurface support");
|
|
return;
|
|
}
|
|
|
|
surface = gdk_surface_new_toplevel (gdk_display_get_default ());
|
|
|
|
g_assert_true (surface->subsurfaces_below == NULL);
|
|
g_assert_true (surface->subsurfaces_above == NULL);
|
|
|
|
sub = gdk_surface_create_subsurface (surface);
|
|
|
|
g_assert_true (gdk_subsurface_get_parent (sub) == surface);
|
|
|
|
g_assert_null (gdk_subsurface_get_texture (sub));
|
|
g_assert_false (gdk_subsurface_is_above_parent (sub));
|
|
g_assert_true (gdk_subsurface_get_transform (sub) == GDK_TEXTURE_TRANSFORM_NORMAL);
|
|
|
|
texture = gdk_texture_new_from_resource ("/org/gtk/libgtk/icons/16x16/actions/media-eject.png");
|
|
gdk_subsurface_attach (sub, texture, &TEXTURE_RECT (texture), &GRAPHENE_RECT_INIT (0, 0, 10, 10), GDK_TEXTURE_TRANSFORM_90, &GRAPHENE_RECT_INIT (0, 0, 20, 20), TRUE, NULL);
|
|
|
|
g_assert_true (gdk_subsurface_get_texture (sub) == texture);
|
|
g_assert_true (gdk_subsurface_is_above_parent (sub));
|
|
g_assert_true (gdk_subsurface_get_transform (sub) == GDK_TEXTURE_TRANSFORM_90);
|
|
gdk_subsurface_get_source_rect (sub, &rect);
|
|
g_assert_true (graphene_rect_equal (&rect, &TEXTURE_RECT (texture)));
|
|
gdk_subsurface_get_texture_rect (sub, &rect);
|
|
g_assert_true (graphene_rect_equal (&rect, &GRAPHENE_RECT_INIT (0, 0, 10, 10)));
|
|
gdk_subsurface_get_background_rect (sub, &rect);
|
|
g_assert_true (graphene_rect_equal (&rect, &GRAPHENE_RECT_INIT (0, 0, 20, 20)));
|
|
|
|
g_object_unref (sub);
|
|
g_object_unref (texture);
|
|
gdk_surface_destroy (surface);
|
|
}
|
|
|
|
static void
|
|
test_subsurface_stacking (void)
|
|
{
|
|
GdkSurface *surface;
|
|
GdkSubsurface *sub0, *sub1, *sub2;
|
|
GdkTexture *texture;
|
|
|
|
#ifdef GDK_WINDOWING_WAYLAND
|
|
if (!GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default ()))
|
|
#endif
|
|
{
|
|
g_test_skip ("No subsurface support");
|
|
return;
|
|
}
|
|
|
|
surface = gdk_surface_new_toplevel (gdk_display_get_default ());
|
|
|
|
g_assert_true (surface->subsurfaces_below == NULL);
|
|
g_assert_true (surface->subsurfaces_above == NULL);
|
|
|
|
sub0 = gdk_surface_create_subsurface (surface);
|
|
sub1 = gdk_surface_create_subsurface (surface);
|
|
sub2 = gdk_surface_create_subsurface (surface);
|
|
|
|
g_assert_true (gdk_surface_get_n_subsurfaces (surface) == 3);
|
|
g_assert_true (gdk_surface_get_subsurface (surface, 0) == sub0);
|
|
g_assert_true (gdk_surface_get_subsurface (surface, 1) == sub1);
|
|
g_assert_true (gdk_surface_get_subsurface (surface, 2) == sub2);
|
|
|
|
texture = gdk_texture_new_from_resource ("/org/gtk/libgtk/icons/16x16/actions/media-eject.png");
|
|
|
|
gdk_subsurface_attach (sub0, texture, &TEXTURE_RECT (texture), &GRAPHENE_RECT_INIT (0, 0, 10, 10), GDK_TEXTURE_TRANSFORM_NORMAL, NULL, TRUE, NULL);
|
|
gdk_subsurface_attach (sub1, texture, &TEXTURE_RECT (texture), &GRAPHENE_RECT_INIT (0, 0, 10, 10), GDK_TEXTURE_TRANSFORM_NORMAL, NULL, TRUE, NULL);
|
|
gdk_subsurface_attach (sub2, texture, &TEXTURE_RECT (texture), &GRAPHENE_RECT_INIT (0, 0, 10, 10), GDK_TEXTURE_TRANSFORM_NORMAL, NULL, TRUE, NULL);
|
|
|
|
g_assert_true (surface->subsurfaces_above == sub2);
|
|
g_assert_true (sub2->sibling_below == NULL);
|
|
g_assert_true (sub2->sibling_above == sub1);
|
|
g_assert_true (sub2->above_parent);
|
|
g_assert_true (sub1->sibling_below == sub2);
|
|
g_assert_true (sub1->sibling_above == sub0);
|
|
g_assert_true (sub1->above_parent);
|
|
g_assert_true (sub0->sibling_below == sub1);
|
|
g_assert_true (sub0->sibling_above == NULL);
|
|
g_assert_true (sub0->above_parent);
|
|
|
|
gdk_subsurface_detach (sub1);
|
|
|
|
g_assert_true (surface->subsurfaces_above == sub2);
|
|
g_assert_true (sub2->sibling_below == NULL);
|
|
g_assert_true (sub2->sibling_above == sub0);
|
|
g_assert_true (sub2->above_parent);
|
|
g_assert_true (sub0->sibling_below == sub2);
|
|
g_assert_true (sub0->sibling_above == NULL);
|
|
g_assert_true (sub0->above_parent);
|
|
|
|
gdk_subsurface_attach (sub2, texture, &TEXTURE_RECT (texture), &GRAPHENE_RECT_INIT (0, 0, 10, 10), GDK_TEXTURE_TRANSFORM_NORMAL, NULL, FALSE, NULL);
|
|
|
|
g_assert_true (surface->subsurfaces_above == sub0);
|
|
g_assert_true (sub0->sibling_below == NULL);
|
|
g_assert_true (sub0->sibling_above == NULL);
|
|
g_assert_true (sub0->above_parent);
|
|
|
|
g_assert_true (surface->subsurfaces_below == sub2);
|
|
g_assert_true (sub2->sibling_below == NULL);
|
|
g_assert_true (sub2->sibling_above == NULL);
|
|
g_assert_false (sub2->above_parent);
|
|
|
|
gdk_subsurface_attach (sub1, texture, &TEXTURE_RECT (texture), &GRAPHENE_RECT_INIT (0, 0, 10, 10), GDK_TEXTURE_TRANSFORM_NORMAL, NULL, TRUE, sub2);
|
|
|
|
g_assert_true (surface->subsurfaces_below == sub1);
|
|
g_assert_true (sub1->sibling_above == NULL);
|
|
g_assert_true (sub1->sibling_below == sub2);
|
|
g_assert_false (sub1->above_parent);
|
|
g_assert_true (sub2->sibling_above == sub1);
|
|
g_assert_true (sub2->sibling_below == NULL);
|
|
g_assert_false (sub2->above_parent);
|
|
|
|
g_object_unref (sub0);
|
|
g_object_unref (sub1);
|
|
g_object_unref (sub2);
|
|
|
|
g_object_unref (texture);
|
|
|
|
gdk_surface_destroy (surface);
|
|
}
|
|
|
|
int
|
|
main (int argc, char *argv[])
|
|
{
|
|
gtk_test_init (&argc, &argv, NULL);
|
|
|
|
gdk_display_set_debug_flags (gdk_display_get_default (), GDK_DEBUG_FORCE_OFFLOAD);
|
|
|
|
g_test_add_func ("/subsurface/basics", test_subsurface_basics);
|
|
g_test_add_func ("/subsurface/stacking", test_subsurface_stacking);
|
|
|
|
return g_test_run ();
|
|
}
|