aboutsummaryrefslogtreecommitdiffstats
path: root/src/gwin/gcontainer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gwin/gcontainer.c')
-rw-r--r--src/gwin/gcontainer.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/gwin/gcontainer.c b/src/gwin/gcontainer.c
new file mode 100644
index 00000000..98281183
--- /dev/null
+++ b/src/gwin/gcontainer.c
@@ -0,0 +1,71 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ * http://ugfx.org/license.html
+ */
+
+#include "gfx.h"
+
+#if GFX_USE_GWIN && GWIN_NEED_CONTAINERS
+
+#include "src/gwin/class_gwin.h"
+
+void _gcontainerInit(void)
+{
+}
+
+void _gcontainerDeinit(void)
+{
+}
+
+GHandle _gcontainerCreate(GDisplay *g, GContainerObject *pgc, const GWidgetInit *pInit, const gcontainerVMT *vmt) {
+ if (!(pgc = (GContainerObject *)_gwidgetCreate(g, (GWidgetObject *)pgc, pInit, &vmt->gw)))
+ return 0;
+
+ pgc->g.flags |= GWIN_FLG_CONTAINER;
+
+ return &pgc->g;
+}
+
+void _gcontainerDestroy(GHandle gh) {
+ GHandle child;
+
+ while((child = gwinGetFirstChild(gh)))
+ gwinDestroy(child);
+ _gwidgetDestroy(gh);
+}
+
+void _gwinRecurse(GHandle gh, bool_t (*fn)(GHandle gh)) {
+ if (fn(gh) && (gh->flags & GWIN_FLG_CONTAINER)) {
+ // Apply to this windows children
+ for(gh = gwinGetFirstChild(gh); gh; gh = gwinGetSibling(gh)) {
+ // Only recurse when we have to. Otherwise apply it directly
+ if ((gh->flags & GWIN_FLG_CONTAINER))
+ _gwinRecurse(gh, fn);
+ else
+ fn(gh);
+ }
+ }
+}
+
+GHandle gwinGetFirstChild(GHandle gh) {
+ GHandle child;
+
+ for(child = gwinGetNextWindow(0); child; child = gwinGetNextWindow(child))
+ if (child->parent == gh)
+ return child;
+ return 0;
+}
+
+GHandle gwinGetSibling(GHandle gh) {
+ GHandle child;
+
+ for(child = gwinGetNextWindow(gh), gh = gh->parent; child; child = gwinGetNextWindow(child))
+ if (child->parent == gh)
+ return child;
+ return 0;
+}
+
+#endif /* GFX_USE_GWIN && GWIN_NEED_CONTAINERS */
+/** @} */