From ab2775a45a8a0c316dc57d9c1ec2ea59c495de49 Mon Sep 17 00:00:00 2001 From: Kai Uwe Broulik Date: Sat, 14 Nov 2015 12:39:45 +0100 Subject: [PATCH] Don't enforce URL to be local file Trash:/ for instance is a valid drop location but not a local file. CHANGELOG: Dropping elements onto an icon widget pointing to Trash now works --- applets/icon/plugin/icon_p.cpp | 6 +- ksmserver/switchuserdialog.cpp | 118 +++++++++++++++++++++++++++++++++ ksmserver/switchuserdialog.h | 46 +++++++++++++ 3 files changed, 165 insertions(+), 5 deletions(-) create mode 100644 ksmserver/switchuserdialog.cpp create mode 100644 ksmserver/switchuserdialog.h diff --git a/applets/icon/plugin/icon_p.cpp b/applets/icon/plugin/icon_p.cpp index bf1e4351a..e1e173d6b 100644 --- a/applets/icon/plugin/icon_p.cpp +++ b/applets/icon/plugin/icon_p.cpp @@ -109,10 +109,6 @@ bool IconPrivate::processDrop(QObject *dropEvent) { Q_ASSERT(dropEvent); - if (!m_url.isLocalFile()) { - return false; - } - // DeclarativeDropEvent and co aren't public const QObject *mimeData = qvariant_cast(dropEvent->property("mimeData")); Q_ASSERT(mimeData); @@ -135,7 +131,7 @@ bool IconPrivate::processDrop(QObject *dropEvent) const QString stringUrl = m_url.toLocalFile(); QMimeDatabase db; - const QMimeType mimeType = db.mimeTypeForFile(stringUrl); + const QMimeType mimeType = db.mimeTypeForUrl(m_url); if (KDesktopFile::isDesktopFile(stringUrl)) { const KDesktopFile desktopFile(stringUrl); diff --git a/ksmserver/switchuserdialog.cpp b/ksmserver/switchuserdialog.cpp new file mode 100644 index 000000000..26d67102c --- /dev/null +++ b/ksmserver/switchuserdialog.cpp @@ -0,0 +1,118 @@ +/* + * Copyright 2015 Kai Uwe Broulik + * + * 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 . + */ + +#include "switchuserdialog.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +KSMSwitchUserDialog::KSMSwitchUserDialog(KDisplayManager *dm, QWindow *parent) + : QQuickView(parent) + , m_displayManager(dm) +{ + setClearBeforeRendering(true); + setColor(QColor(Qt::transparent)); + setFlags(Qt::FramelessWindowHint | Qt::BypassWindowManagerHint); + + QPoint globalPosition(QCursor::pos()); + foreach (QScreen *s, QGuiApplication::screens()) { + if (s->geometry().contains(globalPosition)) { + setScreen(s); + break; + } + } + + // Qt doesn't set this on unmanaged windows + //FIXME: or does it? + XChangeProperty( QX11Info::display(), winId(), + XInternAtom( QX11Info::display(), "WM_WINDOW_ROLE", False ), XA_STRING, 8, PropModeReplace, + (unsigned char *)"logoutdialog", strlen( "logoutdialog" )); + + + rootContext()->setContextProperty(QStringLiteral("screenGeometry"), screen()->geometry()); + + setModality(Qt::ApplicationModal); + + KDeclarative::KDeclarative kdeclarative; + kdeclarative.setDeclarativeEngine(engine()); + //kdeclarative.initialize(); + kdeclarative.setupBindings(); + + KPackage::Package package = KPackage::PackageLoader::self()->loadPackage("Plasma/LookAndFeel"); + KConfigGroup cg(KSharedConfig::openConfig("kdeglobals"), "KDE"); + const QString packageName = cg.readEntry("LookAndFeelPackage", QString()); + if (!packageName.isEmpty()) { + package.setPath(packageName); + } + + const QString fileName = package.filePath("userswitchermainscript"); + + if (QFile::exists(fileName)) { + setSource(QUrl::fromLocalFile(fileName)); + } else { + qWarning() << "Couldn't find a theme for the Switch User dialog" << fileName; + return; + } + + setPosition(screen()->virtualGeometry().center().x() - width() / 2, + screen()->virtualGeometry().center().y() - height() / 2); + + if (!errors().isEmpty()) { + qWarning() << errors(); + } + + connect(rootObject(), SIGNAL(dismissed()), this, SIGNAL(dismissed())); + + show(); + requestActivate(); + + KWindowSystem::setState(winId(), NET::SkipTaskbar | NET::SkipPager); +} + +void KSMSwitchUserDialog::exec() +{ + QEventLoop loop; + connect(this, &KSMSwitchUserDialog::dismissed, &loop, &QEventLoop::quit); + loop.exec(); +} diff --git a/ksmserver/switchuserdialog.h b/ksmserver/switchuserdialog.h new file mode 100644 index 000000000..091a1a45a --- /dev/null +++ b/ksmserver/switchuserdialog.h @@ -0,0 +1,46 @@ +/* + * Copyright 2015 Kai Uwe Broulik + * + * 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 . + */ + +#ifndef SWITCHUSERDIALOG_H +#define SWITCHUSERDIALOG_H + +#include + +class KDisplayManager; + +class KSMSwitchUserDialog : public QQuickView +{ + Q_OBJECT + +public: + explicit KSMSwitchUserDialog(KDisplayManager *dm, QWindow *parent = nullptr); + virtual ~KSMSwitchUserDialog() = default; + + void exec(); + +signals: + void dismissed(); + +private: + KDisplayManager *m_displayManager = nullptr; + +}; + +#endif // SWITCHUSERDIALOG_H