-
Notifications
You must be signed in to change notification settings - Fork 51
/
Copy pathstartcask-wayland.cpp
112 lines (89 loc) · 3.71 KB
/
startcask-wayland.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
SPDX-FileCopyrightText: 2019 Aleix Pol Gonzalez <[email protected]>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include "debug.h"
#include "startcask.h"
#include <KConfig>
#include <KConfigGroup>
#include <QDBusConnection>
#include <QDBusInterface>
#include <QDBusArgument>
#include <signal.h>
#include <QCoreApplication>
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
qputenv("QT_QPA_PLATFORM", "eglfs");
qputenv("QT_WAYLAND_CLIENT_BUFFER_INTEGRATION", "wayland-egl");
qputenv("QT_QPA_ENABLE_TERMINAL_KEYBOARD", "1");
signal(SIGTERM, sigtermHandler);
signal(SIGINT, sigHandler);
createConfigDirectory();
setupCursor();
{
KConfig fonts(QStringLiteral("kcmfonts"));
KConfigGroup group = fonts.group(QStringLiteral("General"));
auto dpiSetting = group.readEntry("forceFontDPIWayland", 96);
auto dpi = dpiSetting == 0 ? 96 : dpiSetting;
qputenv("QT_WAYLAND_FORCE_DPI", QByteArray::number(dpi));
}
// Query whether org.freedesktop.locale1 is available. If it is, try to
// set XKB_DEFAULT_{MODEL,LAYOUT,VARIANT,OPTIONS} accordingly.
{
const QString locale1Service = QStringLiteral("org.freedesktop.locale1");
const QString locale1Path = QStringLiteral("/org/freedesktop/locale1");
QDBusMessage message =
QDBusMessage::createMethodCall(locale1Service, locale1Path, QStringLiteral("org.freedesktop.DBus.Properties"), QLatin1String("GetAll"));
message << locale1Service;
QDBusMessage resultMessage = QDBusConnection::systemBus().call(message);
if (resultMessage.type() == QDBusMessage::ReplyMessage) {
QVariantMap result;
QDBusArgument dbusArgument = resultMessage.arguments().at(0).value<QDBusArgument>();
while (!dbusArgument.atEnd()) {
dbusArgument >> result;
}
auto queryAndSet = [&](const QByteArray &var, const QString &value) {
const auto r = result.value(value).toString();
if (!r.isEmpty())
qputenv(var.constData(), r.toUtf8());
};
queryAndSet("XKB_DEFAULT_MODEL", QStringLiteral("X11Model"));
queryAndSet("XKB_DEFAULT_LAYOUT", QStringLiteral("X11Layout"));
queryAndSet("XKB_DEFAULT_VARIANT", QStringLiteral("X11Variant"));
queryAndSet("XKB_DEFAULT_OPTIONS", QStringLiteral("X11Options"));
} else {
qCWarning(CASK_STARTUP) << "not a reply org.freedesktop.locale1" << resultMessage;
}
}
runEnvironmentScripts();
if (!qEnvironmentVariableIsSet("DBUS_SESSION_BUS_ADDRESS")) {
out << "startcask session: Could not start D-Bus. Can you call qdbus?\n";
return 1;
}
setupCaskEnvironment();
runStartupConfig();
qputenv("PLASMA_USE_QT_SCALING", "1");
qputenv("GDK_SCALE", "1");
qputenv("GDK_DPI_SCALE", "1");
qputenv("XDG_SESSION_TYPE", "wayland");
auto oldSystemdEnvironment = getSystemdEnvironment();
if (!syncDBusEnvironment()) {
out << "Could not sync environment to dbus.\n";
return 1;
}
// We import systemd environment after we sync the dbus environment here.
// Otherwise it may leads to some unwanted order of applying environment
// variables (e.g. LANG and LC_*)
importSystemdEnvrionment();
if (!startCaskSession())
return 4;
// Anything after here is logout
// It is not called after shutdown/restart
waitForKonqi();
out << "startcask-wayland: Shutting down...\n";
out << "startplasmacompositor: Shutting down...\n";
cleanupPlasmaEnvironment(oldSystemdEnvironment);
out << "startplasmacompositor: Done.\n";
return 0;
}