aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/wnd/wndclass/svcwndhold.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/api/wnd/wndclass/svcwndhold.cpp')
-rw-r--r--Src/Wasabi/api/wnd/wndclass/svcwndhold.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/Src/Wasabi/api/wnd/wndclass/svcwndhold.cpp b/Src/Wasabi/api/wnd/wndclass/svcwndhold.cpp
new file mode 100644
index 00000000..9620ce4d
--- /dev/null
+++ b/Src/Wasabi/api/wnd/wndclass/svcwndhold.cpp
@@ -0,0 +1,53 @@
+#include <precomp.h>
+
+#include "svcwndhold.h"
+
+#include <bfc/common.h>
+
+#include <api/service/svcs/svc_wndcreate.h>
+
+#include <api/wnd/wndclass/blankwnd.h>
+
+ServiceWndHolder::ServiceWndHolder(ifc_window *_child, svc_windowCreate *_svc) :
+ child(NULL), svc(NULL)
+ {
+ setChild(_child, _svc);
+}
+
+ServiceWndHolder::~ServiceWndHolder()
+{
+ if (svc != NULL)
+ {
+ svc->destroyWindow(child);
+ if (!svc->refcount())
+ WASABI_API_SVC->service_release(svc);
+ } else {
+ delete static_cast<BaseWnd*>(child);
+ }
+}
+
+int ServiceWndHolder::setChild(ifc_window *_child, svc_windowCreate *_svc)
+{
+ if (child == _child && svc == _svc) return 0;
+
+ if (child != NULL) {
+ if (svc != NULL) {
+ svc->destroyWindow(child);
+ if (!svc->refcount())
+ WASABI_API_SVC->service_release(svc);
+ svc = NULL;
+ } else {
+ delete static_cast<BaseWnd*>(child);
+ }
+ child = NULL;
+ }
+
+ child = _child;
+ svc = _svc;
+
+ return 1;
+}
+
+ifc_window *ServiceWndHolder::rootwndholder_getRootWnd() {
+ return child ? child : SERVICEWNDHOLDER_PARENT::rootwndholder_getRootWnd();
+}