8#ifndef QT_NO_SESSIONMANAGER
10#include <QtCore/qvarlengtharray.h>
11#include <qpa/qwindowsysteminterface.h>
13#include <qguiapplication.h>
16#include <qplatformdefs.h>
17#include <qsocketnotifier.h>
18#include <X11/SM/SMlib.h>
23using namespace Qt::StringLiterals;
56 int num_vals, SmPropValue *vals);
58 int saveType, Bool shutdown ,
int interactStyle, Bool fast);
82 int num_vals, SmPropValue *vals)
86 prop.name =
const_cast<
char*>(name);
87 prop.type =
const_cast<
char*>(type);
88 prop.num_vals = num_vals;
96 names[0] =
const_cast<
char*>(name);
103 QByteArray v = value.toUtf8();
105 prop.length = v.size();
106 prop.value = (SmPointer)
const_cast<
char *>(v.constData());
107 sm_setProperty(name.toLatin1().data(), SmARRAY8, 1, &prop);
112 SmPropValue *prop =
new SmPropValue[value.size()];
114 QList<QByteArray> vl;
115 vl.reserve(value.size());
116 for (QStringList::ConstIterator it = value.begin(); it != value.end(); ++it) {
117 prop[count].length = (*it).size();
118 vl.append((*it).toUtf8());
119 prop[count].value = (
char*)vl.constLast().data();
122 sm_setProperty(name.toLatin1().data(), SmLISTofARRAY8, count, prop);
134 int saveType, Bool shutdown ,
int interactStyle, Bool )
162 gettimeofday(&tv,
nullptr);
163 sm->setSessionKey(QString::number(qulonglong(tv.tv_sec)) +
165 QString::number(qulonglong(tv.tv_usec)));
167 QStringList arguments = QCoreApplication::arguments();
168 QString argument0 = arguments.isEmpty() ? QCoreApplication::applicationFilePath()
172 sm_setProperty(QString::fromLatin1(SmProgram), argument0);
174 struct passwd *entryPtr =
nullptr;
175#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) && (_POSIX_THREAD_SAFE_FUNCTIONS - 0
> 0
)
176 QVarLengthArray<
char, 1024> buf(qMax<
long>(sysconf(_SC_GETPW_R_SIZE_MAX), 1024L));
178 while (getpwuid_r(geteuid(), &entry, buf.data(), buf.size(), &entryPtr) == ERANGE) {
179 if (buf.size() >= 32768) {
181 static char badusername[] =
"";
183 entry.pw_name = badusername;
188 buf.resize(buf.size() * 2);
191 entryPtr = getpwuid(geteuid());
194 sm_setProperty(QString::fromLatin1(SmUserID), QString::fromLocal8Bit(entryPtr->pw_name));
198 restart << argument0 <<
"-session"_L1 << sm->sessionId() + u'_' + sm->sessionKey();
200 QFileInfo fi(QCoreApplication::applicationFilePath());
201 if (qAppName().compare(fi.fileName(), Qt::CaseInsensitive) != 0)
202 restart <<
"-name"_L1 << qAppName();
203 sm->setRestartCommand(restart);
205 sm->setDiscardCommand(discard);
241 sm_setProperty(QString::fromLatin1(SmRestartCommand), sm->restartCommand());
242 sm_setProperty(QString::fromLatin1(SmDiscardCommand), sm->discardCommand());
246 prop.length =
sizeof(
int);
247 int value = sm->restartHint();
248 prop.value = (SmPointer) &value;
261 QWindowSystemInterface::handleApplicationTermination<QWindowSystemInterface::SynchronousDelivery>();
299 IceProcessMessages(SmcGetIceConnection(
smcConnection),
nullptr,
nullptr);
307 , m_eventLoop(
nullptr)
311 char* myId =
nullptr;
312 QByteArray b_id = id.toLatin1();
313 char* prevId = b_id.data();
317 cb.save_yourself.client_data = (SmPointer)
this;
319 cb.die.client_data = (SmPointer)
this;
321 cb.save_complete.client_data = (SmPointer)
this;
323 cb.shutdown_cancelled.client_data = (SmPointer)
this;
326 if (!qEnvironmentVariableIsSet(
"SESSION_MANAGER"))
330 SmcSaveYourselfProcMask |
332 SmcSaveCompleteProcMask |
333 SmcShutdownCancelledProcMask,
339 setSessionId(QString::fromLatin1(myId));
342 QString error = QString::fromLocal8Bit(cerror);
344 qWarning(
"Qt: Session management error: %s", qPrintable(error));
346 sm_receiver =
new QSmSocketReceiver(IceConnectionNumber(SmcGetIceConnection(smcConnection)));
378 QEventLoop eventLoop;
379 m_eventLoop = &eventLoop;
381 m_eventLoop =
nullptr;
408 QEventLoop eventLoop;
409 m_eventLoop = &eventLoop;
411 m_eventLoop =
nullptr;
440 sm_setProperty(name, value);
445 sm_setProperty(name, value);
463#include "qxcbsessionmanager.moc"
QXcbSessionManager(const QString &id, const QString &key)
void requestPhase2() override
bool isPhase2() const override
void setManagerProperty(const QString &name, const QString &value) override
bool allowsInteraction() override
virtual ~QXcbSessionManager()
bool allowsErrorInteraction() override
static bool sm_isshutdown
static void sm_setProperty(const char *name, const char *type, int num_vals, SmPropValue *vals)
static void sm_saveYourselfPhase2Callback(SmcConn smcConn, SmPointer clientData)
static void sm_saveYourselfCallback(SmcConn smcConn, SmPointer clientData, int saveType, Bool shutdown, int interactStyle, Bool fast)
static void sm_dieCallback(SmcConn smcConn, SmPointer clientData)
static SmcConn smcConnection
static void sm_saveCompleteCallback(SmcConn smcConn, SmPointer clientData)
bool qt_sm_blockUserInput
static void sm_setProperty(const QString &name, const QString &value)
static void resetSmState()
static bool sm_waitingForInteraction
static void sm_shutdownCancelledCallback(SmcConn smcConn, SmPointer clientData)
static void sm_performSaveYourself(QXcbSessionManager *)
static bool sm_interactionActive
static int sm_interactStyle
static QSmSocketReceiver * sm_receiver
static void sm_interactCallback(SmcConn smcConn, SmPointer clientData)
unsigned int shutdown_in_progress
unsigned int save_yourself_in_progress