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 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
|
/*
* Copyright (C) 2023, KylinSoft Co., Ltd.
* 2014 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#include "sessionapplication.h"
#include "modulemanager.h"
#include "idleadbusdaptor.h"
#include "idlewatcher.h"
#include <QDebug>
#include <QMediaPlayer>
#include <QDesktopWidget>
#include "../tools/ukuipower.h"
#include <QProcess>
extern "C" {
#include <X11/Xatom.h>
#include <X11/Xlib.h>
}
#define SESSION_DEFAULT_SETTINGS "org.ukui.session"
#define SESSION_DEFAULT_SETTINGS_PATH "/org/ukui/desktop/session/"
#define QT5_UKUI_STYLE "org.ukui.style"
#define PERIPHERALS_MOUSE "org.ukui.peripherals-mouse"
#define PERIPHERALS_MOUSE_PATH "/org/ukui/desktop/peripherals/mouse/"
#define MOUSE_KEY "cursor-size"
#define MOUSE_THEME "cursor-theme"
#define XSETTINGS_PLUGIN_SCHEMA "org.ukui.SettingsDaemon.plugins.xsettings"
#define SCALING_FACTOR_KEY "scaling-factor"
#define FONT_RENDERING_SCHEMAS "org.ukui.font-rendering"
#define FONT_REENDERING_PATH "/org/ukui/desktop/font-rendering/"
#define DPI_KEY "dpi"
QByteArray typeConver(int i)
{
QString str = QString::number(i);
QByteArray byte;
byte.append(str);
return byte;
}
void SessionApplication::initialEnvironment()
{
SystemdProvider *sysProvider = new SystemdProvider();
if (gsettings_usable) {
if (sysProvider->canAction(UkuiPower::PowerHibernate)) {
gs->set("canhibernate", true);
} else {
gs->set("canhibernate", false);
}
//在打开关机管理界面后通过物理按键的方式关机/重启
//将导致win-key-release键值为true
//造成大部分热键和组合键失效
//所以在登录进来时恢复默认值
gs->reset("win-key-release");
}
//检查qt主题是否安装
const QByteArray qt_style(QT5_UKUI_STYLE);
QByteArray QT_QPA_PLATFORMTHEME;
if (QGSettings::isSchemaInstalled(qt_style)) {
QT_QPA_PLATFORMTHEME = "ukui";
} else {
QT_QPA_PLATFORMTHEME = "gtk2";
}
qputenv("XDG_CURRENT_DESKTOP", "UKUI");
qputenv("QT_QPA_PLATFORMTHEME", QT_QPA_PLATFORMTHEME);
qputenv("GTK_MODULES","ukuireload-gtk-module");
// qputenv("QT_QPA_PLATFORM", "xcb");
QString xdg_session_type = qgetenv("XDG_SESSION_TYPE");
// if (xdg_session_type == "wayland") {
// QProcess::startDetached("dbus-update-activation-environment", QStringList() << "--systemd" << "DISPLAY" << "QT_QPA_PLATFORM");
// }
qDebug() << "usd save-param process start";
QString user_name = qgetenv("USER");
QProcess::startDetached("save-param", QStringList() << "-u" << user_name );
//restart user's gvfs-daemon.service
//QProcess::startDetached("systemctl", QStringList() << "--user" << "restart" << "gvfs-daemon.service");
}
void SessionApplication::updateIdleDelay()
{
if (gsettings_usable) {
const int idle = gs->get("idle-delay").toInt() * 60;
if (lastIdleTime == idle ) {
return;
}
mIdleWatcher->reset(idle);
}
}
void SessionApplication::registerDBus()
{
QDBusConnection dbus = QDBusConnection::sessionBus();
if (!dbus.isConnected()) {
qDebug() << "Fatal DBus Error";
QProcess *a = new QProcess(this);
a->setProcessChannelMode(QProcess::ForwardedChannels);
//这种启动方式是否就是在d-bus服务被杀死的情况下session启动两次的原因
a->start("dbus-launch", QStringList() << "--exit-with-session" << "ukui-session");
a->waitForFinished(-1);
if (a->exitCode()) {
qWarning() << "exited with code" << a->exitCode();
}
}
m_sessionManagerContext = new SessionManagerDBusContext(modman);
if (!dbus.registerService(QStringLiteral("org.gnome.SessionManager"))) {
qCritical() << "Can't register org.gnome.SessionManager, there is already a session manager!";
}
if (!dbus.registerObject(("/org/gnome/SessionManager"), m_sessionManagerContext)) {
qCritical() << "Can't register object, there is already an object registered at "
<< "/org/gnome/SessionManager";
}
//idle-delay固定设置为1,不再被更改
lastIdleTime = 1 * 60;
const QByteArray screensaverID("org.ukui.screensaver");
if (QGSettings::isSchemaInstalled(screensaverID) && gsettings_usable) {
int idleNum = gs->get("idle-delay").toInt();
//兼容旧机制,避免升级出现异常
if (idleNum != 1) {
QGSettings *screensaverGs = new QGSettings(screensaverID);
screensaverGs->set("idle-delay",idleNum);
gs->reset("idle-delay");
delete screensaverGs;
}
}
mIdleWatcher = new IdleWatcher(lastIdleTime);
new IdleDBusAdaptor(mIdleWatcher);
if (!dbus.registerObject("/org/gnome/SessionManager/Presence", mIdleWatcher)) {
qCritical() << "Cant' register object, there is already an object registered at "
<< "org/gnome/SessionManager/Presence";
}
}
SessionApplication::SessionApplication(int &argc, char* *argv) : QApplication(argc, argv)
{
const QByteArray id(SESSION_DEFAULT_SETTINGS);
if (QGSettings::isSchemaInstalled(id)) {
gsettings_usable = true;
gs = new QGSettings(SESSION_DEFAULT_SETTINGS, SESSION_DEFAULT_SETTINGS_PATH, this);
} else {
qWarning() << "Failed to get default value from gsettings, set gsettings_usable to false!";
gsettings_usable = false;
}
initialEnvironment();
modman = new ModuleManager();
registerDBus();
// Wait until the event loop starts
// QTimer::singleShot(0, this, SLOT(startup()));
}
SessionApplication::~SessionApplication()
{
delete modman;
delete mIdleWatcher;
delete gs;
}
bool SessionApplication::startup()
{
modman->startup();
return true;
}
|