corona/ has been renamed to app/

pull/1/head
Johan Smith Agudelo Rodriguez 8 years ago
parent 615c038b8d
commit a29378943b

@ -14,7 +14,8 @@ include(KDEPackageAppTemplates)
set(lattedock-app_SRCS
../liblattedock/dock.cpp
abstractinterface.cpp
windowinfowrap.cpp
abstractwindowinterface.cpp
xwindowinterface.cpp
visibilitymanager.cpp
nowdockconfigview.cpp

@ -1,11 +1,10 @@
#ifndef VISIBILITYMANAGER_H
#define VISIBILITYMANAGER_H
#include <QObject>
#include "../liblattedock/dock.h"
#include "abstractinterface.h"
#include "plasmaquick/containmentview.h"
#include "../liblattedock/dock.h"
#include <QObject>
#include <QTimer>
#include <Plasma/Containment>
@ -13,90 +12,46 @@
class VisibilityManager : public QObject {
Q_OBJECT
Q_PROPERTY(bool disableHiding READ disableHiding WRITE setDisableHiding NOTIFY disableHidingChanged)
//Q_PROPERTY(bool immutable READ immutable WRITE setImmutable NOTIFY immutableChanged)
Q_PROPERTY(bool isAutoHidden READ isAutoHidden WRITE setIsAutoHidden NOTIFY isAutoHiddenChanged)
Q_PROPERTY(bool isDockWindowType READ isDockWindowType WRITE setIsDockWindowType NOTIFY isDockWindowTypeChanged)
Q_PROPERTY(bool isHovered READ isHovered NOTIFY isHoveredChanged)
Q_PROPERTY(bool windowInAttention READ windowInAttention WRITE setWindowInAttention NOTIFY windowInAttentionChanged)
Q_PROPERTY(Latte::Dock::Visibility panelVisibility READ panelVisibility WRITE setPanelVisibility NOTIFY panelVisibilityChanged)
Q_PROPERTY(Latte::Dock::Visibility mode READ mode WRITE setMode NOTIFY modeChanged)
Q_PROPERTY(bool isHidden READ isHidden WRITE isHidden NOTIFY isHiddenChanged)
Q_PROPERTY(bool containsMouse READ containsMouse NOTIFY containsMouseChanged)
Q_PROPERTY(int timerShow READ timerShow WRITE setTimerShow NOTIFY timerShowChanged)
Q_PROPERTY(int timerHide READ timerHide WRITE setTimerHide NOTIFY timerHideChanged)
public:
explicit VisibilityManager(PlasmaQuick::ContainmentView *view);
~VisibilityManager();
bool disableHiding() const;
void setDisableHiding(bool state);
virtual ~VisibilityManager();
bool isAutoHidden() const;
void setIsAutoHidden(bool state);
Latte::Dock::Visibility mode() const;
void setMode(Latte::Dock::Visibility mode);
bool isDockWindowType() const;
void setIsDockWindowType(bool state);
bool isHidden() const;
void setHidden(bool isHidden);
bool isHovered() const;
bool containsMouse() const;
bool windowInAttention() const;
int timerShow() const;
void setTimerShow(int msec);
Latte::Dock::Visibility panelVisibility() const;
void setContainment(Plasma::Containment *contaiment);
void setMaskArea(QRect area);
void setPanelVisibility(Latte::Dock::Visibility state);
int timerHide() const;
void setTimerHide(int msec);
public slots:
Q_INVOKABLE void initialize();
Q_INVOKABLE void showNormal();
Q_INVOKABLE void showOnTop();
Q_INVOKABLE void showOnTopCheck();
Q_INVOKABLE void showOnBottom();
bool event(QEvent *event);
void setWindowInAttention(bool state);
void updateVisibilityFlags();
/**
* @brief updateDockGeometry, the window geometry in absolute coordinates.
*/
void updateDockGeometry(QRect &geometry);
Q_SIGNALS:
void disableHidingChanged();
void isAutoHiddenChanged();
void isDockWindowTypeChanged();
void isHoveredChanged();
void mustBeLowered(); //are used to triger the sliding animations from the qml part
void mustBeRaised();
void mustBeRaisedImmediately();
void panelVisibilityChanged();
void windowInAttentionChanged();
signals:
void mustBeShown();
void mustBeHide();
private Q_SLOTS:
void activeWindowChanged();
//void compositingChanged();
void updateState();
void initWindow();
void setIsHovered(bool state);
//void screenChanged(QScreen *screen);
//void setScreenGeometry(QRect geometry);
//void updateWindowPosition();
void modeChanged();
void isHiddenChanged();
void containsMouseChanged();
void timerShowChanged();
void timerHideChanged();
private:
bool m_disableHiding;
bool m_isAutoHidden;
bool m_isDockWindowType;
bool m_isHovered;
//second pass of the initialization
bool m_secondInitPass;
bool m_windowIsInAttention;
int m_childrenLength;
QRect m_maskArea;
QTimer m_initTimer;
QTimer m_updateStateTimer;
Plasma::Containment *m_containment;
PlasmaQuick::ContainmentView *m_view;
NowDock::AbstractInterface *m_interface;
Latte::Dock::Visibility m_panelVisibility;
VisibilityManagerPrivate *const d;
};
#endif
#endif // VISIBILITYMANAGER_H

@ -1,361 +1,124 @@
#include "xwindowinterface.h"
#include <QDebug>
#include <QtX11Extras/QX11Info>
#include <KWindowInfo>
#include <KWindowSystem>
#include <NETWM>
namespace NowDock {
namespace Latte {
XWindowInterface::XWindowInterface(QQuickWindow *parent) :
AbstractInterface(parent),
m_demandsAttention(0)
XWindowInterface::XWindowInterface(QQuickWindow *const view, QObject *parent)
: AbstractWindowInterface(view, parent)
{
m_activeWindow = KWindowSystem::activeWindow();
Q_ASSERT(view != nullptr);
connect(KWindowSystem::self(), SIGNAL(activeWindowChanged(WId)), this, SLOT(activeWindowChanged(WId)));
connect(KWindowSystem::self(), SIGNAL(windowChanged(WId, NET::Properties, NET::Properties2)), this, SLOT(windowChanged(WId, NET::Properties, NET::Properties2)));
connect(KWindowSystem::self(), SIGNAL(windowRemoved(WId)), this, SLOT(windowRemoved(WId)));
connect(KWindowSystem::self(), &KWindowSystem::activeWindowChanged
, this, &AbstractWindowInterface::activeWindowChanged);
connect(KWindowSystem::self()
, static_cast<void (KWindowSystem::*)(WId, NET::Properties, NET::Properties2)>
(&KWindowSystem::windowChanged)
, this, &XWindowInterface::windowChangedProxy);
connect(KWindowSystem::self(), &KWindowSystem::windowAdded, [this](WId wid) {
if (std::find(m_windows.cbegin(), m_windows.cend(), wid) != m_windows.cend()) {
m_windows.push_back(wid);
}
emit windowAdded(wid);
});
connect(KWindowSystem::self(), &KWindowSystem::windowAdded, [this](WId wid) {
m_windows.remove(wid);
emit windowRemoved(wid);
});
connect(this, SIGNAL(dockNumberChanged(uint)), this, SLOT(dockNumberChanged(uint)));
connect(KWindowSystem::self(), &KWindowSystem::currentDesktopChanged
, this, &AbstractWindowInterface::currentDesktopChanged);
}
XWindowInterface::~XWindowInterface()
{
}
void XWindowInterface::dockNumberChanged(unsigned int no)
{
if (no == 1) {
m_dockWindow->setFlags(Qt::Tool | Qt::WindowDoesNotAcceptFocus | Qt::FramelessWindowHint);
}
}
void XWindowInterface::setDockToAllDesktops()
void XWindowInterface::setDockDefaultFlags()
{
KWindowSystem::setOnAllDesktops(m_dockWindow->winId(), true);
NETWinInfo winfo(QX11Info::connection()
, static_cast<xcb_window_t>(m_view->winId())
, static_cast<xcb_window_t>(m_view->winId())
, 0, 0);
winfo.setAllowedActions(NET::ActionChangeDesktop);
KWindowSystem::setType(m_view->winId(), NET::Dock);
KWindowSystem::setOnAllDesktops(m_view->winId(), true);
}
void XWindowInterface::setDockDefaultFlags(bool dock)
WId XWindowInterface::activeWindow() const
{
//Notice: the Qt::Tool flag even though it works perfectly for a single Now Dock
//it creates a strange situation when there are two and more Now Dock's
//in that case it is used only for the first created Now Dock
m_isDockWindowType = dock;
if ((m_dockNumber == 1) && (!m_isDockWindowType)) {
m_dockWindow->setFlags(Qt::Tool | Qt::WindowDoesNotAcceptFocus | Qt::FramelessWindowHint);
} else {
KWindowSystem::setType(m_dockWindow->winId(), NET::Dock);
KWindowSystem::setState(m_dockWindow->winId(), NET::SkipTaskbar | NET::SkipPager);
}
return KWindowSystem::self()->activeWindow();
}
void XWindowInterface::showDockOnTop()
const std::list<WId> &XWindowInterface::windows()
{
//this is the only way in order to not break the case of two and more NowDocks
//there is a small issue that the pop ups from locked plasmoids are opened
//on the maximum thickness
//qDebug() << "Docknumber:" << m_dockNumber;
if (m_isDockWindowType) {
return;
}
if (m_dockNumber != 1) {
KWindowSystem::setType(m_dockWindow->winId(), NET::Dock);
}
KWindowSystem::clearState(m_dockWindow->winId(), NET::KeepBelow);
KWindowSystem::setState(m_dockWindow->winId(), NET::KeepAbove);
return m_windows;
}
void XWindowInterface::showDockAsNormal()
WindowInfoWrap XWindowInterface::requestInfoActive()
{
// qDebug() << "reached make normal...";
if (m_isDockWindowType) {
return;
}
if (m_dockNumber != 1) {
m_dockWindow->setFlags(Qt::Tool | Qt::WindowDoesNotAcceptFocus | Qt::FramelessWindowHint);
}
KWindowSystem::clearState(m_dockWindow->winId(), NET::KeepAbove);
KWindowSystem::clearState(m_dockWindow->winId(), NET::KeepBelow);
}
void XWindowInterface::showDockOnBottom()
{
// qDebug() << "reached make bottom...";
if (m_isDockWindowType) {
return;
}
if (m_dockNumber != 1) {
m_dockWindow->setFlags(Qt::Tool | Qt::WindowDoesNotAcceptFocus | Qt::FramelessWindowHint);
}
KWindowSystem::clearState(m_dockWindow->winId(), NET::KeepAbove);
KWindowSystem::setState(m_dockWindow->winId(), NET::KeepBelow);
return requestInfo(KWindowSystem::activeWindow());
}
bool XWindowInterface::isDesktop(WId id) const
WindowInfoWrap XWindowInterface::requestInfo(WId wid)
{
KWindowInfo info(id, NET::WMWindowType);
if (!info.valid()) {
return false;
}
const KWindowInfo winfo{wid, NET::WMDesktop | NET::WMFrameExtents | NET::WMWindowType | NET::WMState};
NET::WindowType type = info.windowType(NET::DesktopMask | NET::DockMask | NET::DialogMask);
return type == NET::Desktop;
}
bool XWindowInterface::isDialog(WId id) const
{
KWindowInfo info(id, NET::WMWindowType);
WindowInfoWrap winfoWrap;
if (!info.valid()) {
return false;
}
NET::WindowType type = info.windowType(NET::DesktopMask | NET::DockMask | NET::DialogMask);
return type == NET::Dialog;
}
bool XWindowInterface::isMaximized(WId id) const
{
KWindowInfo info(id, NET::WMState);
if (!info.valid()) {
return false;
}
return (info.hasState(NET::Max));
}
bool XWindowInterface::isNormal(WId id) const
{
return (!isOnBottom(id) && !isOnTop(id));
}
bool XWindowInterface::isOnBottom(WId id) const
{
KWindowInfo info(id, NET::WMState);
if (!info.valid()) {
return false;
}
return (info.hasState(NET::KeepBelow));
}
bool XWindowInterface::isOnTop(WId id) const
{
KWindowInfo info(id, NET::WMState);
if (!info.valid()) {
return false;
}
return (info.hasState(NET::KeepAbove));
}
bool XWindowInterface::activeIsDialog() const
{
return isDialog(m_activeWindow);
}
bool XWindowInterface::activeIsMaximized() const
{
return isMaximized(m_activeWindow);
}
bool XWindowInterface::desktopIsActive() const
{
return isDesktop(m_activeWindow);
}
bool XWindowInterface::dockIsOnTop() const
{
return isOnTop(m_dockWindow->winId());
}
bool XWindowInterface::dockInNormalState() const
{
return isNormal(m_dockWindow->winId());
}
bool XWindowInterface::dockIsBelow() const
{
return isOnBottom(m_dockWindow->winId());
}
bool XWindowInterface::dockIntersectsActiveWindow() const
{
KWindowInfo activeInfo(m_activeWindow, NET::WMGeometry);
if (activeInfo.valid()) {
QRect maskSize;
if (!m_maskArea.isNull()) {
maskSize = QRect(m_dockWindow->x() + m_maskArea.x(), m_dockWindow->y() + m_maskArea.y(), m_maskArea.width(), m_maskArea.height());
} else {
maskSize = QRect(m_dockWindow->x(), m_dockWindow->y(), m_dockWindow->width(), m_dockWindow->height());
}
if (!winfo.valid() || !isValidWindow(winfo))
return winfoWrap;
return maskSize.intersects(activeInfo.geometry());
} else {
winfoWrap.setIsValid(true);
winfoWrap.setWid(wid);
winfoWrap.setIsActive(KWindowSystem::activeWindow() == wid);
winfoWrap.setIsMinimized(winfo.hasState(NET::Hidden));
winfoWrap.setIsMaximized(winfo.hasState(NET::Max));
winfoWrap.setIsFullscreen(winfo.hasState(NET::FullScreen));
winfoWrap.setIsOnCurrentDesktop(winfo.isOnCurrentDesktop());
winfoWrap.setGeometry(winfo.geometry());
return winfoWrap;
}
bool XWindowInterface::isValidWindow(const KWindowInfo &winfo)
{
const auto winType = winfo.windowType(NET::DesktopMask | NET::DockMask
| NET::MenuMask | NET::SplashMask
| NET::NormalMask);
if (winType == -1 || (winType & NET::Desktop) || (winType & NET::Menu)
|| (winType & NET::Dock) || (winType & NET::Splash)) {
return false;
}
}
bool XWindowInterface::dockIsCovered(bool totally) const
{
int currentDockPos = -1;
QList<WId> windows = KWindowSystem::stackingOrder();
int size = windows.count();
for (int i = size - 1; i >= 0; --i) {
WId window = windows.at(i);
if (window == m_dockWindow->winId()) {
currentDockPos = i;
break;
}
}
if (currentDockPos >= 0) {
QRect maskSize;
if (!m_maskArea.isNull()) {
maskSize = QRect(m_dockWindow->x() + m_maskArea.x(), m_dockWindow->y() + m_maskArea.y(), m_maskArea.width(), m_maskArea.height());
} else {
maskSize = QRect(m_dockWindow->x(), m_dockWindow->y(), m_dockWindow->width(), m_dockWindow->height());
}
WId transient = 0;
if (m_dockWindow->transientParent()) {
transient = m_dockWindow->transientParent()->winId();
}
for (int j = size - 1; j > currentDockPos; --j) {
WId window = windows.at(j);
KWindowInfo info(window, NET::WMState | NET::XAWMState | NET::WMGeometry);
if (info.valid() && !isDesktop(window) && transient != window && !info.isMinimized()) {
if (totally) {
QRect winGeometry = info.geometry();
if ((maskSize.left() >= winGeometry.left()) && (maskSize.top() >= winGeometry.top())
&& (maskSize.right() <= winGeometry.right()) && (maskSize.bottom() <= winGeometry.bottom())) {
return true;
}
} else {
if (maskSize.intersects(info.geometry())) {
return true;
}
}
}
}
}
return false;
return true;
}
bool XWindowInterface::dockIsCovering() const
void XWindowInterface::windowChangedProxy(WId wid, NET::Properties prop1, NET::Properties2 prop2)
{
int currentDockPos = -1;
QList<WId> windows = KWindowSystem::stackingOrder();
int size = windows.count();
for (int i = size - 1; i >= 0; --i) {
WId window = windows.at(i);
if (window == m_dockWindow->winId()) {
currentDockPos = i;
break;
}
}
if (currentDockPos >= 0) {
QRect maskSize;
if (!m_maskArea.isNull()) {
maskSize = QRect(m_dockWindow->x() + m_maskArea.x(), m_dockWindow->y() + m_maskArea.y(), m_maskArea.width(), m_maskArea.height());
} else {
maskSize = QRect(m_dockWindow->x(), m_dockWindow->y(), m_dockWindow->width(), m_dockWindow->height());
}
//! if the dock changed is ignored
if (wid == m_view->winId())
return;
WId transient = 0;
//! ignore when, eg: the user presses a key
if (prop1 == 0 && prop2 == NET::WM2UserTime)
return;
if (m_dockWindow->transientParent()) {
transient = m_dockWindow->transientParent()->winId();
}
if (prop1 && !(prop1 & NET::WMState || prop1 & NET::WMGeometry || prop1 & NET::ActiveWindow))
return;
for (int j = currentDockPos - 1; j >= 0; --j) {
WId window = windows.at(j);
KWindowInfo info(window, NET::WMState | NET::XAWMState | NET::WMGeometry);
if (info.valid() && !isDesktop(window) && transient != window && !info.isMinimized() && maskSize.intersects(info.geometry())) {
return true;
}
}
}
return false;
}
/*
* SLOTS
*/
void XWindowInterface::activeWindowChanged(WId win)
{
m_activeWindow = win;
emit AbstractInterface::activeWindowChanged();
}
void XWindowInterface::windowChanged(WId id, NET::Properties properties, NET::Properties2 properties2)
{
KWindowInfo info(id, NET::WMState | NET::CloseWindow);
if (info.valid()) {
if ((m_demandsAttention == 0) && info.hasState(NET::DemandsAttention)) {
m_demandsAttention = id;
emit windowInAttention(true);
} else if ((m_demandsAttention == id) && !info.hasState(NET::DemandsAttention)) {
m_demandsAttention = 0;
emit windowInAttention(false);
}
}
// emit AbstractInterface::windowChanged();
if (id == m_activeWindow) {
emit AbstractInterface::activeWindowChanged();
}
emit windowChanged(requestInfo(wid));
}
void XWindowInterface::windowRemoved(WId id)
{
if (id == m_demandsAttention) {
m_demandsAttention = 0;
emit AbstractInterface::windowInAttention(false);
}
}
}

@ -1,59 +1,36 @@
#ifndef XWINDOWINTERFACE_H
#ifndef XWINDOWINTERFACE_H
#define XWINDOWINTERFACE_H
#include <QObject>
#include <KWindowInfo>
#include "abstractinterface.h"
#include "abstractwindowinterface.h"
namespace NowDock {
namespace Latte {
class XWindowInterface : public AbstractInterface {
class XWindowInterface : public AbstractWindowInterface {
Q_OBJECT
public:
explicit XWindowInterface(QQuickWindow *parent);
~XWindowInterface();
XWindowInterface(QQuickWindow *const view, QObject *parent);
virtual ~XWindowInterface();
bool activeIsDialog() const;
bool activeIsMaximized() const;
bool dockIntersectsActiveWindow() const;
bool desktopIsActive() const;
bool dockIsCovered(bool totally = false) const;
bool dockIsCovering() const;
bool dockIsOnTop() const;
bool dockInNormalState() const;
bool dockIsBelow() const;
void setDockDefaultFlags() override;
void setDockDefaultFlags(bool dock = false);
void setDockToAllDesktops();
void setDockToAlwaysVisible();
void showDockAsNormal();
void showDockOnBottom();
void showDockOnTop();
private Q_SLOTS:
void activeWindowChanged(WId win);
void dockNumberChanged(unsigned int no);
void windowChanged(WId id, NET::Properties properties, NET::Properties2 properties2);
void windowRemoved(WId id);
WId activeWindow() const override;
WindowInfoWrap requestInfo(WId wid) override;
WindowInfoWrap requestInfoActive() override;
const std::list<WId> &windows() override;
private:
WId m_activeWindow;
WId m_demandsAttention;
bool isDesktop(WId id) const;
bool isDialog(WId id) const;
bool isMaximized(WId id) const;
bool isNormal(WId id) const;
bool isOnBottom(WId id) const;
bool isOnTop(WId id) const;
bool isValidWindow(const KWindowInfo &winfo);
void windowChangedProxy(WId wid, NET::Properties prop1, NET::Properties2 prop2);
};
}
#endif
#endif // XWINDOWINTERFACE_H

@ -1,48 +0,0 @@
include(KDEInstallDirs)
include(KDECMakeSettings)
#include(KDECompilerSettings NO_POLICY_SCOPE)
#include(ECMPackageConfigHelpers)
include(CMakePackageConfigHelpers)
include(WriteBasicConfigVersionFile)
include(CheckIncludeFiles)
include(ECMOptionalAddSubdirectory)
include(ECMQtDeclareLoggingCategory)
include(KDEPackageAppTemplates)
set(lattedock-app_SRCS
../liblattedock/dock.cpp
abstractwindowinterface.cpp
xwindowinterface.cpp
windowinfowrap.cpp
visibilitymanager.cpp
nowdockconfigview.cpp
nowdockview.cpp
packageplugins/shell/nowdockpackage.cpp
nowdockcorona.cpp
main.cpp
)
#add_subdirectory(packageplugins)
add_executable(latte-dock ${lattedock-app_SRCS})
target_link_libraries(
latte-dock
Qt5::Widgets
Qt5::Quick
Qt5::Qml
KF5::I18n
KF5::CoreAddons
KF5::XmlGui
KF5::PlasmaQuick
KF5::Plasma
KF5::QuickAddons
KF5::DBusAddons
KF5::Notifications
)
install(TARGETS latte-dock ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
#even if hidden, the desktop file is needed anyways for kdbusservice::unique
install(FILES latte-dock.desktop DESTINATION ${KDE_INSTALL_APPDIR})

@ -1,225 +0,0 @@
/*
* Copyright 2014 Bhushan Shah <bhush94@gmail.com>
* Copyright 2014 Marco Martin <notmart@gmail.com>
*
* 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) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
*
* 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 <http://www.gnu.org/licenses/>
*/
#include "nowdockcorona.h"
#include "nowdockview.h"
//#include "visibilitymanager.h"
#include "packageplugins/shell/nowdockpackage.h"
#include <QAction>
#include <QScreen>
#include <QDebug>
#include <KActionCollection>
#include <KPluginMetaData>
#include <Plasma>
#include <Plasma/Corona>
#include <Plasma/Containment>
#include <KLocalizedString>
#include <KPackage/Package>
#include <KPackage/PackageLoader>
NowDockCorona::NowDockCorona(QObject *parent)
: Plasma::Corona(parent)
{
KPackage::Package package(new NowDockPackage(this));
if (!package.isValid()) {
qWarning() << staticMetaObject.className()
<< "the package" << package.metadata().rawData() << "is invalid!";
return;
} else {
qDebug() << staticMetaObject.className()
<< "the package" << package.metadata().rawData() << "is valid!";
}
setKPackage(package);
qmlRegisterTypes();
connect(this, &Corona::containmentAdded, this, &NowDockCorona::addDock);
loadLayout();
/*QAction *addDock = actions()->add<QAction>(QStringLiteral("add dock"));
connect(addDock, &QAction::triggered, this, &NowDockCorona::loadDefaultLayout);
addDock->setText(i18n("Add New Dock"));
addDock->setAutoRepeat(true);
addDock->setStatusTip(tr("Adds a new dock in the environment"));
addDock->setVisible(true);
addDock->setEnabled(true);
addDock->setIcon(QIcon::fromTheme(QStringLiteral("object-locked")));
addDock->setData(Plasma::Types::ControlAction);
addDock->setShortcut(QKeySequence(QStringLiteral("alt+d, l")));
addDock->setShortcutContext(Qt::ApplicationShortcut);*/
}
NowDockCorona::~NowDockCorona()
{
for (auto c : m_containments)
c->deleteLater();
qDebug() << "deleted" << this;
}
int NowDockCorona::numScreens() const
{
return qGuiApp->screens().count();
}
QRect NowDockCorona::screenGeometry(int id) const
{
const auto screens = qGuiApp->screens();
if (id >= 0 && id < screens.count()) {
return screens[id]->geometry();
}
return qGuiApp->primaryScreen()->geometry();
}
QRegion NowDockCorona::availableScreenRegion(int id) const
{
const auto screens = qGuiApp->screens();
if (id >= 0 && id < screens.count()) {
return screens[id]->geometry();
}
return qGuiApp->primaryScreen()->availableGeometry();
}
QRect NowDockCorona::availableScreenRect(int id) const
{
const auto screens = qGuiApp->screens();
if (id >= 0 && id < screens.count()) {
return screens[id]->availableGeometry();
}
return qGuiApp->primaryScreen()->availableGeometry();
}
QList<Plasma::Types::Location> NowDockCorona::freeEdges(int screen) const
{
using Plasma::Types;
QList<Types::Location> edges{Types::TopEdge, Types::BottomEdge
, Types::LeftEdge, Types::RightEdge};
for (const NowDockView *cont : m_containments) {
if (cont && cont->containment()->screen() == screen)
edges.removeOne(cont->location());
}
return edges;
}
int NowDockCorona::screenForContainment(const Plasma::Containment *containment) const
{
for (auto *view : m_containments) {
if (view && view->containment() && view->containment()->id() == containment->id())
if (view->screen())
return qGuiApp->screens().indexOf(view->screen());
}
return -1;
}
void NowDockCorona::addDock(Plasma::Containment *containment)
{
if (!containment || !containment->kPackage().isValid()) {
qWarning() << "the requested containment plugin can not be located or loaded";
return;
}
qWarning() << "Adding dock for container...";
auto dockView = new NowDockView(this);
dockView->init();
dockView->setContainment(containment);
dockView->show();
//dockView->showNormal();
m_containments.push_back(dockView);
}
void NowDockCorona::loadDefaultLayout()
{
qDebug() << "loading default layout";
//! Settting mutable for create a containment
setImmutability(Plasma::Types::Mutable);
QVariantList args;
auto defaultContainment = createContainmentDelayed("org.kde.latte.containment", args);
//auto defaultContainment = createContainmentDelayed("org.kde.panel", args);
defaultContainment->setContainmentType(Plasma::Types::PanelContainment);
defaultContainment->init();
if (!defaultContainment || !defaultContainment->kPackage().isValid()) {
qWarning() << "the requested containment plugin can not be located or loaded";
return;
}
auto config = defaultContainment->config();
config.writeEntry("dock", "initial");
// config.writeEntry("alignment", (int)Dock::Center);
// config.deleteEntry("wallpaperplugin");
switch (containments().size()) {
case 1:
defaultContainment->setLocation(Plasma::Types::LeftEdge);
break;
case 2:
defaultContainment->setLocation(Plasma::Types::RightEdge);
break;
case 3:
defaultContainment->setLocation(Plasma::Types::TopEdge);
break;
default:
defaultContainment->setLocation(Plasma::Types::BottomEdge);
break;
}
auto cfg = defaultContainment->config();
defaultContainment->save(cfg);
addDock(defaultContainment);
defaultContainment->createApplet(QStringLiteral("org.kde.store.nowdock.plasmoid"));
defaultContainment->createApplet(QStringLiteral("org.kde.plasma.analogclock"));
}
inline void NowDockCorona::qmlRegisterTypes() const
{
constexpr auto uri = "org.kde.nowdock.shell";
constexpr auto vMajor = 0;
constexpr auto vMinor = 2;
// qmlRegisterUncreatableType<Candil::Dock>(uri, vMajor, vMinor, "Dock", "class Dock uncreatable");
// qmlRegisterUncreatableType<Candil::VisibilityManager>(uri, vMajor, vMinor, "VisibilityManager", "class VisibilityManager uncreatable");
// qmlRegisterUncreatableType<NowDockView>(uri, vMajor, vMinor, "DockView", "class DockView uncreatable");
qmlRegisterType<QScreen>();
}

@ -1,57 +0,0 @@
#ifndef VISIBILITYMANAGER_H
#define VISIBILITYMANAGER_H
#include "plasmaquick/containmentview.h"
#include "../liblattedock/dock.h"
#include <QObject>
#include <QTimer>
#include <Plasma/Containment>
class VisibilityManager : public QObject {
Q_OBJECT
Q_PROPERTY(Latte::Dock::Visibility mode READ mode WRITE setMode NOTIFY modeChanged)
Q_PROPERTY(bool isHidden READ isHidden WRITE isHidden NOTIFY isHiddenChanged)
Q_PROPERTY(bool containsMouse READ containsMouse NOTIFY containsMouseChanged)
Q_PROPERTY(int timerShow READ timerShow WRITE setTimerShow NOTIFY timerShowChanged)
Q_PROPERTY(int timerHide READ timerHide WRITE setTimerHide NOTIFY timerHideChanged)
public:
explicit VisibilityManager(PlasmaQuick::ContainmentView *view);
virtual ~VisibilityManager();
Latte::Dock::Visibility mode() const;
void setMode(Latte::Dock::Visibility mode);
bool isHidden() const;
void setHidden(bool isHidden);
bool containsMouse() const;
int timerShow() const;
void setTimerShow(int msec);
int timerHide() const;
void setTimerHide(int msec);
/**
* @brief updateDockGeometry, the window geometry in absolute coordinates.
*/
void updateDockGeometry(QRect &geometry);
signals:
void mustBeShown();
void mustBeHide();
void modeChanged();
void isHiddenChanged();
void containsMouseChanged();
void timerShowChanged();
void timerHideChanged();
private:
VisibilityManagerPrivate *const d;
};
#endif // VISIBILITYMANAGER_H

@ -1,124 +0,0 @@
#include "xwindowinterface.h"
#include <QtX11Extras/QX11Info>
#include <KWindowSystem>
#include <NETWM>
namespace Latte {
XWindowInterface::XWindowInterface(QQuickWindow *const view, QObject *parent)
: AbstractWindowInterface(view, parent)
{
Q_ASSERT(view != nullptr);
connect(KWindowSystem::self(), &KWindowSystem::activeWindowChanged
, this, &AbstractWindowInterface::activeWindowChanged);
connect(KWindowSystem::self()
, static_cast<void (KWindowSystem::*)(WId, NET::Properties, NET::Properties2)>
(&KWindowSystem::windowChanged)
, this, &XWindowInterface::windowChangedProxy);
connect(KWindowSystem::self(), &KWindowSystem::windowAdded, [this](WId wid) {
if (std::find(m_windows.cbegin(), m_windows.cend(), wid) != m_windows.cend()) {
m_windows.push_back(wid);
}
emit windowAdded(wid);
});
connect(KWindowSystem::self(), &KWindowSystem::windowAdded, [this](WId wid) {
m_windows.remove(wid);
emit windowRemoved(wid);
});
connect(KWindowSystem::self(), &KWindowSystem::currentDesktopChanged
, this, &AbstractWindowInterface::currentDesktopChanged);
}
XWindowInterface::~XWindowInterface()
{
}
void XWindowInterface::setDockDefaultFlags()
{
NETWinInfo winfo(QX11Info::connection()
, static_cast<xcb_window_t>(m_view->winId())
, static_cast<xcb_window_t>(m_view->winId())
, 0, 0);
winfo.setAllowedActions(NET::ActionChangeDesktop);
KWindowSystem::setType(m_view->winId(), NET::Dock);
KWindowSystem::setOnAllDesktops(m_view->winId(), true);
}
WId XWindowInterface::activeWindow() const
{
return KWindowSystem::self()->activeWindow();
}
const std::list<WId> &XWindowInterface::windows()
{
return m_windows;
}
WindowInfoWrap XWindowInterface::requestInfoActive()
{
return requestInfo(KWindowSystem::activeWindow());
}
WindowInfoWrap XWindowInterface::requestInfo(WId wid)
{
const KWindowInfo winfo{wid, NET::WMDesktop | NET::WMFrameExtents | NET::WMWindowType | NET::WMState};
WindowInfoWrap winfoWrap;
if (!winfo.valid() || !isValidWindow(winfo))
return winfoWrap;
winfoWrap.setIsValid(true);
winfoWrap.setWid(wid);
winfoWrap.setIsActive(KWindowSystem::activeWindow() == wid);
winfoWrap.setIsMinimized(winfo.hasState(NET::Hidden));
winfoWrap.setIsMaximized(winfo.hasState(NET::Max));
winfoWrap.setIsFullscreen(winfo.hasState(NET::FullScreen));
winfoWrap.setIsOnCurrentDesktop(winfo.isOnCurrentDesktop());
winfoWrap.setGeometry(winfo.geometry());
return winfoWrap;
}
bool XWindowInterface::isValidWindow(const KWindowInfo &winfo)
{
const auto winType = winfo.windowType(NET::DesktopMask | NET::DockMask
| NET::MenuMask | NET::SplashMask
| NET::NormalMask);
if (winType == -1 || (winType & NET::Desktop) || (winType & NET::Menu)
|| (winType & NET::Dock) || (winType & NET::Splash)) {
return false;
}
return true;
}
void XWindowInterface::windowChangedProxy(WId wid, NET::Properties prop1, NET::Properties2 prop2)
{
//! if the dock changed is ignored
if (wid == m_view->winId())
return;
//! ignore when, eg: the user presses a key
if (prop1 == 0 && prop2 == NET::WM2UserTime)
return;
if (prop1 && !(prop1 & NET::WMState || prop1 & NET::WMGeometry || prop1 & NET::ActiveWindow))
return;
emit windowChanged(requestInfo(wid));
}
}

@ -1,37 +0,0 @@
#ifndef XWINDOWINTERFACE_H
#define XWINDOWINTERFACE_H
#include <QObject>
#include <KWindowInfo>
#include "abstractwindowinterface.h"
namespace Latte {
class XWindowInterface : public AbstractWindowInterface {
Q_OBJECT
public:
XWindowInterface(QQuickWindow *const view, QObject *parent);
virtual ~XWindowInterface();
void setDockDefaultFlags() override;
WId activeWindow() const override;
WindowInfoWrap requestInfo(WId wid) override;
WindowInfoWrap requestInfoActive() override;
const std::list<WId> &windows() override;
private:
bool isValidWindow(const KWindowInfo &winfo);
void windowChangedProxy(WId wid, NET::Properties prop1, NET::Properties2 prop2);
};
}
#endif // XWINDOWINTERFACE_H
Loading…
Cancel
Save