40
43
upstart_app_launch_app_failed_observer_t failureCallback = nullptr;
48
* @brief toShortAppIdIfPossible
49
* @param appId - any string that you think is an appId
50
* @return if a valid appId was input, a shortened appId is returned, else returns the input string unaltered
52
QString toShortAppIdIfPossible(const QString &appId) {
53
gchar *package, *application;
54
if (upstart_app_launch_app_id_parse(appId.toLatin1().constData(), &package, &application, nullptr)) {
55
// is long appId, so assemble its short appId
56
QString shortAppId = QString("%1_%2").arg(package).arg(application);
66
* @brief toLongAppIdIfPossible
67
* @param shortAppId - any string that you think is a short appId
68
* @return if valid short appId was input, the corresponding long appId is returned. If a long appId was
69
* entered, it is returned unchanged. Anything else is also returned unchanged.
71
QString toLongAppIdIfPossible(const QString &shortAppId) {
72
if (upstart_app_launch_app_id_parse(shortAppId.toLatin1().constData(), nullptr, nullptr, nullptr)) {
73
// then we got a long appId after all, just return it
76
// try to parse the string in the form "$package_$application"
77
QRegExp shortAppIdMask("[a-z0-9][a-z0-9+.-]+_[a-zA-Z0-9+.-]+");
78
if (!shortAppIdMask.exactMatch(shortAppId)) {
79
// input string not a short appId, so just return it unchanged
83
// ask upstart for the long appId corresponding to this short appId
84
QStringList parts = shortAppId.split("_");
86
longAppId = upstart_app_launch_triplet_to_app_id(parts.first().toLatin1().constData(),
87
parts.last().toLatin1().constData(),
89
if (longAppId == nullptr) {
90
// was unable to construct a long appId from the short appId, return input unchanged
93
QString appId(longAppId);
43
102
ApplicationController::ApplicationController()
44
103
: unitymir::ApplicationController(),
45
104
impl(new Private())
47
106
impl->preStartCallback = [](const gchar * appId, gpointer userData) {
48
107
auto thiz = static_cast<ApplicationController*>(userData);
49
Q_EMIT(thiz->applicationAboutToBeStarted(appId));
108
Q_EMIT(thiz->applicationAboutToBeStarted(toShortAppIdIfPossible(appId)));
52
111
impl->startedCallback = [](const gchar * appId, gpointer userData) {
53
112
auto thiz = static_cast<ApplicationController*>(userData);
54
Q_EMIT(thiz->applicationStarted(appId));
113
Q_EMIT(thiz->applicationStarted(toShortAppIdIfPossible(appId)));
57
116
impl->stopCallback = [](const gchar * appId, gpointer userData) {
58
117
auto thiz = static_cast<ApplicationController*>(userData);
59
Q_EMIT(thiz->applicationStopped(appId));
118
Q_EMIT(thiz->applicationStopped(toShortAppIdIfPossible(appId)));
62
121
impl->focusCallback = [](const gchar * appId, gpointer userData) {
63
122
auto thiz = static_cast<ApplicationController*>(userData);
64
Q_EMIT(thiz->applicationFocusRequest(appId));
123
Q_EMIT(thiz->applicationFocusRequest(toShortAppIdIfPossible(appId)));
67
126
impl->resumeCallback = [](const gchar * appId, gpointer userData) {
68
127
auto thiz = static_cast<ApplicationController*>(userData);
69
Q_EMIT(thiz->applicationResumeRequest(appId));
128
Q_EMIT(thiz->applicationResumeRequest(toShortAppIdIfPossible(appId)));
72
131
impl->failureCallback = [](const gchar * appId, upstart_app_launch_app_failed_t failureType, gpointer userData) {
110
169
bool ApplicationController::appIdHasProcessId(pid_t pid, const QString& appId)
112
return upstart_app_launch_pid_in_app_id(pid, appId.toLatin1().constData());
171
return upstart_app_launch_pid_in_app_id(pid, toLongAppIdIfPossible(appId).toLatin1().constData());
115
174
bool ApplicationController::stopApplicationWithAppId(const QString& appId)
117
auto result = upstart_app_launch_stop_application(appId.toLatin1().constData());
176
auto result = upstart_app_launch_stop_application(toLongAppIdIfPossible(appId).toLatin1().constData());
118
177
DLOG_IF(!result, "ApplicationController::stopApplicationWithAppId appId='%s' FAILED", qPrintable(appId));
201
QFileInfo ApplicationController::findDesktopFileForAppId(const QString &appId) const
203
DLOG("ApplicationController::desktopFilePathForAppId (appId='%s')", qPrintable(appId));
205
// Search for the correct desktop file using a simple heuristic
207
QString helper = toLongAppIdIfPossible(appId);
212
helper = helper.replace(dashPos, 1, '/');
215
desktopFile = QStandardPaths::locate(QStandardPaths::ApplicationsLocation, QString("%1.desktop").arg(helper));
216
if (!desktopFile.isEmpty()) return desktopFile;
218
dashPos = helper.indexOf("-");
219
} while (dashPos != -1);
142
224
} // namespace upstart
143
225
} // namespace unitymir