aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/gwin/gwin.h11
-rw-r--r--src/gwin/gwin.c31
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
@@ -337,6 +337,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
*
* @param[in] gh The 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);
}