From 902a49af9deccdd5d500e9e2a5b27c49c3960b82 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 28 May 2019 23:41:56 -0400 Subject: [PATCH] surface: Add coordinate translation We maintain offsets for popups, so we can translate coordinates between surfaces that are attached directly or indirectly to the same toplevel. Add an api for that. --- gdk/gdksurface.c | 38 ++++++++++++++++++++++++++++++++++++++ gdk/gdksurface.h | 6 ++++++ 2 files changed, 44 insertions(+) diff --git a/gdk/gdksurface.c b/gdk/gdksurface.c index b3f0c64223..fc30d532d9 100644 --- a/gdk/gdksurface.c +++ b/gdk/gdksurface.c @@ -4076,3 +4076,41 @@ gdk_surface_handle_event (GdkEvent *event) return handled; } + +gboolean +gdk_surface_translate_coordinates (GdkSurface *from, + GdkSurface *to, + double *x, + double *y) +{ + int x1, y1, x2, y2; + GdkSurface *f, *t; + + x1 = 0; + y1 = 0; + f = from; + while (f->parent) + { + x1 += f->x; + y1 += f->y; + f = f->parent; + } + + x2 = 0; + y2 = 0; + t = to; + while (t->parent) + { + x2 += t->x; + y2 += t->y; + t = t->parent; + } + + if (f != t) + return FALSE; + + *x += x1 - x2; + *y += y1 - y2; + + return TRUE; +} diff --git a/gdk/gdksurface.h b/gdk/gdksurface.h index b02d40192a..acca090683 100644 --- a/gdk/gdksurface.h +++ b/gdk/gdksurface.h @@ -557,6 +557,12 @@ gint gdk_surface_get_origin (GdkSurface *surface, gint *x, gint *y); GDK_AVAILABLE_IN_ALL +gboolean gdk_surface_translate_coordinates (GdkSurface *from, + GdkSurface *to, + double *x, + double *y); + +GDK_AVAILABLE_IN_ALL void gdk_surface_get_frame_extents (GdkSurface *surface, GdkRectangle *rect);