diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gwin/gwin.c | 31 |
1 files changed, 26 insertions, 5 deletions
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); } |