File: sessionapplication.cpp

package info (click to toggle)
ukui-session-manager 4.0.0.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,176 kB
  • sloc: cpp: 9,043; xml: 102; python: 24; sh: 15; makefile: 15
file content (195 lines) | stat: -rw-r--r-- 6,613 bytes parent folder | download
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;
}