From 5007a1906298214e502125c0cf8b95bf9da23329 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Tue, 13 Aug 2013 09:20:18 +0200 Subject: [PATCH] Add a ScreenEdgeItem to reserve a screen edge from QML Usage: ScreenEdgeItem { edge: ScreenEdgeItem.LeftEdge onActivated: doSomething() } --- CMakeLists.txt | 1 + scripting/screenedgeitem.cpp | 91 +++++++++++++++++++++++++++++ scripting/screenedgeitem.h | 108 +++++++++++++++++++++++++++++++++++ scripting/scripting.cpp | 2 + 4 files changed, 202 insertions(+) create mode 100644 scripting/screenedgeitem.cpp create mode 100644 scripting/screenedgeitem.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 1543a448b5..11daea2bb1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -156,6 +156,7 @@ if(KWIN_BUILD_SCRIPTING) scripting/timer.cpp scripting/scripting_model.cpp scripting/dbuscall.cpp + scripting/screenedgeitem.cpp ) endif() diff --git a/scripting/screenedgeitem.cpp b/scripting/screenedgeitem.cpp new file mode 100644 index 0000000000..61d0b4d190 --- /dev/null +++ b/scripting/screenedgeitem.cpp @@ -0,0 +1,91 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2013 Martin Gräßlin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ +#include "screenedgeitem.h" +#include +#ifdef KWIN_BUILD_SCREENEDGES +#include "screenedge.h" +#endif + +namespace KWin +{ + +ScreenEdgeItem::ScreenEdgeItem(QObject* parent) + : QObject(parent) + , m_enabled(true) + , m_edge(NoEdge) +{ +} + +ScreenEdgeItem::~ScreenEdgeItem() +{ +} + +void ScreenEdgeItem::setEnabled(bool enabled) +{ + if (m_enabled == enabled) { + return; + } + disableEdge(); + m_enabled = enabled; + enableEdge(); + emit enabledChanged(); +} + +void ScreenEdgeItem::setEdge(Edge edge) +{ + if (m_edge == edge) { + return; + } + disableEdge(); + m_edge = edge; + enableEdge(); + emit edgeChanged(); +} + +void ScreenEdgeItem::enableEdge() +{ + if (!m_enabled || m_edge == NoEdge) { + return; + } +#ifdef KWIN_BUILD_SCREENEDGES + ScreenEdges::self()->reserve(static_cast(m_edge), this, "borderActivated"); +#endif +} + +void ScreenEdgeItem::disableEdge() +{ + if (!m_enabled || m_edge == NoEdge) { + return; + } +#ifdef KWIN_BUILD_SCREENEDGES + ScreenEdges::self()->unreserve(static_cast(m_edge), this); +#endif +} + +bool ScreenEdgeItem::borderActivated(ElectricBorder edge) +{ + if (edge != static_cast(m_edge) || !m_enabled) { + return false; + } + emit activated(); + return true; +} + +} // namespace diff --git a/scripting/screenedgeitem.h b/scripting/screenedgeitem.h new file mode 100644 index 0000000000..f9984d500c --- /dev/null +++ b/scripting/screenedgeitem.h @@ -0,0 +1,108 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2013 Martin Gräßlin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ +#ifndef KWIN_SCREENEDGEITEM_H +#define KWIN_SCREENEDGEITEM_H + +#include +#include + +namespace KWin +{ + +/** + * @brief Qml export for reserving a Screen Edge. + * + * The edge is controlled by the @c enabled property and the @c edge + * property. If the edge is enabled and gets triggered the @link activated() + * signal gets emitted. + * + * Example usage: + * @code + * ScreenEdgeItem { + * edge: ScreenEdgeItem.LeftEdge + * onActivated: doSomething() + * } + * @endcode + * + */ +class ScreenEdgeItem : public QObject +{ + Q_OBJECT + Q_ENUMS(Edge) + /** + * @brief Whether the edge is currently enabled, that is reserved. Default value is @c true. + * + */ + Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged) + /** + * @brief Which of the screen edges is to be reserved. Default value is @c NoEdge. + * + */ + Q_PROPERTY(Edge edge READ edge WRITE setEdge NOTIFY edgeChanged) +public: + enum Edge { + TopEdge, + TopRightEdge, + RightEdge, + BottomRightEdge, + BottomEdge, + BottomLeftEdge, + LeftEdge, + TopLeftEdge, + EDGE_COUNT, + NoEdge + }; + explicit ScreenEdgeItem(QObject *parent = 0); + virtual ~ScreenEdgeItem(); + bool isEnabled() const; + Edge edge() const; + +public Q_SLOTS: + void setEnabled(bool enabled); + void setEdge(Edge edge); + +Q_SIGNALS: + void enabledChanged(); + void edgeChanged(); + + void activated(); + +private Q_SLOTS: + bool borderActivated(ElectricBorder edge); +private: + void enableEdge(); + void disableEdge(); + bool m_enabled; + Edge m_edge; +}; + +inline bool ScreenEdgeItem::isEnabled() const +{ + return m_enabled; +} + +inline ScreenEdgeItem::Edge ScreenEdgeItem::edge() const +{ + return m_edge; +} + +} // namespace KWin + +#endif // KWIN_SCREENEDGEITEM_H diff --git a/scripting/scripting.cpp b/scripting/scripting.cpp index 0951a7a6d9..2fc528a648 100644 --- a/scripting/scripting.cpp +++ b/scripting/scripting.cpp @@ -25,6 +25,7 @@ along with this program. If not, see . #include "meta.h" #include "scriptingutils.h" #include "workspace_wrapper.h" +#include "screenedgeitem.h" #include "scripting_model.h" #include "../client.h" #include "../thumbnailitem.h" @@ -549,6 +550,7 @@ void KWin::DeclarativeScript::run() qmlRegisterType("org.kde.kwin", 2, 0, "DesktopThumbnailItem"); qmlRegisterType("org.kde.kwin", 2, 0, "ThumbnailItem"); qmlRegisterType("org.kde.kwin", 2, 0, "DBusCall"); + qmlRegisterType("org.kde.kwin", 2, 0, "ScreenEdgeItem"); qmlRegisterType(); qmlRegisterType("org.kde.kwin", 2, 0, "ClientModel"); qmlRegisterType("org.kde.kwin", 2, 0, "ClientModelByScreen");