Add pretty user switcher

This adds a user switcher borrowing elements from the lock screen and log out dialog.
It will be used instead of KRunner as main UI for switching sessions. The sessions runner
will stay there for the time being.

CHANGLOG: The main user switcher UI has been completely re-designed

REVIEW: 124585
wilder-5.14
Kai Uwe Broulik 10 years ago
parent 3453aa8aa0
commit fe97f42724
  1. 1
      ksmserver/CMakeLists.txt
  2. 1
      ksmserver/org.kde.KSMServerInterface.xml
  3. 13
      ksmserver/server.cpp
  4. 2
      ksmserver/server.h
  5. 118
      ksmserver/switchuserdialog.cpp
  6. 46
      ksmserver/switchuserdialog.h

@ -14,6 +14,7 @@ set(ksmserver_KDEINIT_SRCS
main.cpp
server.cpp
shutdowndlg.cpp
switchuserdialog.cpp
legacy.cpp
startup.cpp
shutdown.cpp

@ -38,6 +38,7 @@
<method name="restoreSubSession">
<arg type="s" direction="in"/>
</method>
<method name="openSwitchUserDialog" />
<signal name="subSessionClosed"/>
<signal name="subSessionCloseCanceled"/>
<signal name="subSessionOpened"/>

@ -91,6 +91,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <klauncher_interface.h>
#include <qstandardpaths.h>
#include "switchuserdialog.h"
KSMServer* the_server = 0;
KSMServer* KSMServer::self()
@ -1080,3 +1082,14 @@ void KSMServer::rebootWithoutConfirmation()
{
shutdown(KWorkSpace::ShutdownConfirmNo, KWorkSpace::ShutdownTypeReboot, KWorkSpace::ShutdownModeDefault);
}
void KSMServer::openSwitchUserDialog()
{
KDisplayManager dm;
if (!dm.isSwitchable()) {
return;
}
QScopedPointer<KSMSwitchUserDialog> dlg(new KSMSwitchUserDialog(&dm));
dlg->exec();
}

@ -217,6 +217,8 @@ private:
QStringList saveOnly = QStringList() );
void restoreSubSession( const QString &name );
void openSwitchUserDialog();
Q_SIGNALS:
void subSessionClosed();
void subSessionCloseCanceled();

@ -0,0 +1,118 @@
/*
* Copyright 2015 Kai Uwe Broulik <kde@privat.broulik.de>
*
* 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 "switchuserdialog.h"
#include <kdisplaymanager.h>
#include <QApplication>
#include <QDebug>
#include <QDesktopWidget>
#include <QEventLoop>
#include <QQuickItem>
#include <QQmlContext>
#include <QQmlEngine>
#include <QX11Info>
#include <QScreen>
#include <QStandardItemModel>
#include <QStandardPaths>
#include <KPackage/Package>
#include <KPackage/PackageLoader>
#include <KConfigGroup>
#include <KLocalizedString>
#include <KSharedConfig>
#include <KWindowSystem>
#include <KUser>
#include <KDeclarative/KDeclarative>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
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();
}

@ -0,0 +1,46 @@
/*
* Copyright 2015 Kai Uwe Broulik <kde@privat.broulik.de>
*
* 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/>.
*/
#ifndef SWITCHUSERDIALOG_H
#define SWITCHUSERDIALOG_H
#include <QQuickView>
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
Loading…
Cancel
Save