summaryrefslogtreecommitdiff
path: root/src/mdecoratorframe.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mdecoratorframe.cpp')
-rw-r--r--src/mdecoratorframe.cpp148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/mdecoratorframe.cpp b/src/mdecoratorframe.cpp
new file mode 100644
index 0000000..d9c4746
--- /dev/null
+++ b/src/mdecoratorframe.cpp
@@ -0,0 +1,148 @@
+/***************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (directui@nokia.com)
+**
+** This file is part of mcompositor.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at directui@nokia.com.
+**
+** This library is free software; you can redistribute it and/or
+** modify it under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation
+** and appearing in the file LICENSE.LGPL included in the packaging
+** of this file.
+**
+****************************************************************************/
+
+#include "mdecoratorframe.h"
+#include "mcompositewindow.h"
+#include "mtexturepixmapitem.h"
+
+#include <mrmiclient.h>
+#include <QX11Info>
+
+#include <X11/Xutil.h>
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Xmd.h>
+
+MDecoratorFrame *MDecoratorFrame::d = 0;
+
+MDecoratorFrame *MDecoratorFrame::instance()
+{
+ if (!d)
+ d = new MDecoratorFrame();
+ return d;
+}
+
+MDecoratorFrame::MDecoratorFrame(QObject *p)
+ : QObject(p),
+ decorator_window(0),
+ decorator_item(0)
+{
+ /*!
+ * Excute decorator process here.
+ */
+
+ remote_decorator = new MRmiClient(".mabstractdecorator", this);
+}
+
+Qt::HANDLE MDecoratorFrame::managedWindow() const
+{
+ return client;
+}
+
+Qt::HANDLE MDecoratorFrame::winId() const
+{
+ return decorator_window;
+}
+
+void MDecoratorFrame::lower()
+{
+ if (decorator_item)
+ decorator_item->setVisible(false);
+}
+
+void MDecoratorFrame::raise()
+{
+ if (decorator_item)
+ decorator_item->setVisible(true);
+}
+
+void MDecoratorFrame::setManagedWindow(Qt::HANDLE window)
+{
+ Display *dpy = QX11Info::display();
+
+ if (client == window)
+ return;
+ client = window;
+
+ if (!decorator_item)
+ return;
+
+ // TODO: Make this dynamic based on decorator dimensions.
+ MCompositeWindow *w = MCompositeWindow::compositeWindow(window);
+ if (w && w->needDecoration()) {
+ XWindowAttributes a;
+ if (!XGetWindowAttributes(dpy, decorator_window, &a)) {
+ qWarning("%s: invalid window 0x%lx", __func__, decorator_window);
+ return;
+ }
+ QRegion d = QRegion(a.x, a.y, a.width, a.height);
+ QRect r = (d - QRegion(a.x, a.y, a.width, 65)).boundingRect();
+ XMoveResizeWindow(dpy, window, r.x(), r.y(), r.width(), r.height());
+ }
+
+ qulonglong winid = client;
+ remote_decorator->invoke("MAbstractDecorator",
+ "RemoteSetManagedWinId", winid);
+ if (w)
+ connect(w, SIGNAL(destroyed()), SLOT(destroyClient()));
+}
+
+void MDecoratorFrame::setDecoratorWindow(Qt::HANDLE window)
+{
+ decorator_window = window;
+ XMapWindow(QX11Info::display(), window);
+}
+
+void MDecoratorFrame::setDecoratorItem(MCompositeWindow *window)
+{
+ decorator_item = window;
+ decorator_item->setIsDecorator(true);
+ connect(decorator_item, SIGNAL(destroyed()), SLOT(destroyDecorator()));
+
+ MTexturePixmapItem *item = (MTexturePixmapItem *) window;
+ if (!decorator_window)
+ setDecoratorWindow(item->window());
+}
+
+MCompositeWindow *MDecoratorFrame::decoratorItem() const
+{
+ return decorator_item;
+}
+
+void MDecoratorFrame::destroyDecorator()
+{
+ decorator_item = 0;
+ decorator_window = 0;
+}
+
+void MDecoratorFrame::destroyClient()
+{
+ client = 0;
+}
+
+void MDecoratorFrame::visualizeDecorator(bool visible)
+{
+ if (decorator_item)
+ decorator_item->setVisible(visible);
+}
+
+void MDecoratorFrame::activate()
+{
+ remote_decorator->invoke("MAbstractDecorator", "RemoteActivateWindow");
+}