From 9f5d14cf5d17ac0b2b16943da4a1347f695d109b Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Sun, 5 Jan 2014 00:46:36 +0100 Subject: [PATCH] fixed gwinDestroy() and added gwinGetAbsoluteCoordinates() --- include/gwin/gwin.h | 11 +++++++++++ src/gwin/gwin.c | 31 ++++++++++++++++++++++++++----- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/include/gwin/gwin.h b/include/gwin/gwin.h index 194173e0..9d3d1dbc 100644 --- a/include/gwin/gwin.h +++ b/include/gwin/gwin.h @@ -336,6 +336,17 @@ extern "C" { */ bool_t gwinGetEnabled(GHandle gh); + /** + * @brief Get absolute coordinates of a window + * + * @param[in] gh The window + * @param[out] x The absolut x coordinate + * @param[out] y The absolut y coordinate + * + * @api + */ + void gwinGetAbsoluteCoordinates(GHandle gh, coord_t *x, coord_t *y); + /** * @brief Move a window * diff --git a/src/gwin/gwin.c b/src/gwin/gwin.c index 5c164444..1ec8280c 100644 --- a/src/gwin/gwin.c +++ b/src/gwin/gwin.c @@ -181,11 +181,16 @@ GHandle gwinGWindowCreate(GDisplay *g, GWindowObject *pgw, const GWindowInit *pI void gwinDestroy(GHandle gh) { #if GWIN_NEED_HIERARCHY - // kill your children as long as you have any - while (gh->child) { - GHandle tmp = gh->child; - gh->child = gh->child->sibling; - gwinDestroy(tmp); + // fix hierarchy structure + if (gh->parent->child == gh) { + // we are the first child + gh->parent->child = gh->sibling; + } else { + // find our predecessor + GHandle tmp = gh->parent->child; + while (tmp->sibling != gh) + tmp = tmp->sibling; + tmp->sibling = gh->sibling; } #endif @@ -269,6 +274,22 @@ bool_t gwinGetEnabled(GHandle gh) { #endif } +void gwinGetAbsoluteCoordinates(GHandle gh, coord_t *x, coord_t *y) { + #if GWIN_NEED_HIERARCHY + GHandle tmp; + + // sum up all relative coordinates up to the root parent + for (*x = 0, *y = 0, tmp = gh; tmp; tmp = tmp->parent) { + *x += tmp->x; + *y += tmp->y; + } + + #else + *x = gh->x; + *y = gh->y; + #endif +} + void gwinMove(GHandle gh, coord_t x, coord_t y) { _gwm_redim(gh, x, y, gh->width, gh->height); }