on xenial help sign in
Handle short appIds in launcher data
08b3c3bMichael Terry
debian/control+1
@@ -20,6 +20,7 @@ Build-Depends: cmake,
20 libqt5xmlpatterns5-dev,
20 libqt5xmlpatterns5-dev,
21 libunity-api-dev (>= 7.80.6),
21 libunity-api-dev (>= 7.80.6),
22 libunity-mir-dev,
22 libunity-mir-dev,
23+ libupstart-app-launch2-dev,
23 libusermetricsoutput1-dev,
24 libusermetricsoutput1-dev,
24 libxcb1-dev,
25 libxcb1-dev,
25 pkg-config,
26 pkg-config,
plugins/Unity/Launcher/CMakeLists.txt+6−2
@@ -2,6 +2,7 @@ include(FindPkgConfig)
2pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=3)
2pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=3)
3pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=1)
3pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=1)
4pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
4pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
5+pkg_check_modules(UPSTART_APP_LAUNCH REQUIRED upstart-app-launch-2)
5
6
6add_definitions(-DSM_BUSNAME=systemBus)
7add_definitions(-DSM_BUSNAME=systemBus)
7
8
@@ -9,6 +10,7 @@ include_directories(
9 ${CMAKE_CURRENT_SOURCE_DIR}
10 ${CMAKE_CURRENT_SOURCE_DIR}
10 ${CMAKE_SOURCE_DIR}/plugins/AccountsService
11 ${CMAKE_SOURCE_DIR}/plugins/AccountsService
11 ${GSETTINGS_QT_INCLUDE_DIRS}
12 ${GSETTINGS_QT_INCLUDE_DIRS}
13+ ${UPSTART_APP_LAUNCH_INCLUDE_DIRS}
12)
14)
13
15
14set(QMLLAUNCHERPLUGIN_SRC
16set(QMLLAUNCHERPLUGIN_SRC
@@ -28,8 +30,10 @@ add_library(UnityLauncher-qml MODULE
28 ${QMLLAUNCHERPLUGIN_SRC}
30 ${QMLLAUNCHERPLUGIN_SRC}
29 )
31 )
30
32
31−target_link_libraries(UnityLauncher-qml ${GSETTINGS_QT_LDFLAGS})
33+target_link_libraries(UnityLauncher-qml
32−
34+ ${GSETTINGS_QT_LDFLAGS}
35+ ${UPSTART_APP_LAUNCH_LDFLAGS}
36+)
33qt5_use_modules(UnityLauncher-qml DBus Qml)
37qt5_use_modules(UnityLauncher-qml DBus Qml)
34
38
35add_unity8_plugin(Unity.Launcher 0.1 Unity/Launcher TARGETS UnityLauncher-qml)
39add_unity8_plugin(Unity.Launcher 0.1 Unity/Launcher TARGETS UnityLauncher-qml)
plugins/Unity/Launcher/launchermodel.cpp+26
@@ -22,6 +22,7 @@
22#include "backend/launcherbackend.h"
22#include "backend/launcherbackend.h"
23
23
24#include <unity/shell/application/ApplicationInfoInterface.h>
24#include <unity/shell/application/ApplicationInfoInterface.h>
25+#include <upstart-app-launch.h>
25
26
26using namespace unity::shell::application;
27using namespace unity::shell::application;
27
28
@@ -195,6 +196,31 @@ void LauncherModel::setUser(const QString &username)
195 m_backend->setUser(username);
196 m_backend->setUser(username);
196}
197}
197
198
199+QString LauncherModel::getUrlForAppId(const QString &appId)
200+{
201+ // appId is either an appId or a legacy app name. Let's find out which
202+ QString url;
203+ gchar *package, *app, *version, *longAppId;
204+
205+ // assume legacy app until proven otherwise
206+ url = "application:///" + appId + ".desktop";
207+
208+ if (upstart_app_launch_app_id_parse(appId.first().toLatin1().constData(),
209+ &package, &app, &version)) {
210+ // Turn it back into an appId to test if it's a click app or not
211+ longAppId = upstart_app_launch_triplet_to_app_id(package, app, version);
212+ if (longAppId != nullptr) { // it is a click app!
213+ url = QString("appid://%1/%2/%3").args(package, app, version);
214+ g_free(longAppId);
215+ }
216+ g_free(package);
217+ g_free(app);
218+ g_free(version);
219+ }
220+
221+ return url;
222+}
223+
198void LauncherModel::refreshStoredApplications()
224void LauncherModel::refreshStoredApplications()
199{
225{
200 // First remove any existing ones
226 // First remove any existing ones
plugins/Unity/Launcher/launchermodel.h+1
@@ -51,6 +51,7 @@ public:
51 Q_INVOKABLE void requestRemove(const QString &appId);
51 Q_INVOKABLE void requestRemove(const QString &appId);
52 Q_INVOKABLE void quickListActionInvoked(const QString &appId, int actionIndex);
52 Q_INVOKABLE void quickListActionInvoked(const QString &appId, int actionIndex);
53 Q_INVOKABLE void setUser(const QString &username);
53 Q_INVOKABLE void setUser(const QString &username);
54+ Q_INVOKABLE QString getUrlForAppId(const QString &appId) const;
54
55
55 unity::shell::application::ApplicationManagerInterface* applicationManager() const;
56 unity::shell::application::ApplicationManagerInterface* applicationManager() const;
56 void setApplicationManager(unity::shell::application::ApplicationManagerInterface *appManager);
57 void setApplicationManager(unity::shell::application::ApplicationManagerInterface *appManager);
qml/GreeterShell.qml+1−1
@@ -201,7 +201,7 @@ BasicShell {
201 dragAreaWidth: shell.edgeSize
201 dragAreaWidth: shell.edgeSize
202 available: !edgeDemo.active
202 available: !edgeDemo.active
203 onLauncherApplicationSelected: {
203 onLauncherApplicationSelected: {
204− shell.activateApplication("application:///" + appId + ".desktop")
204+ shell.activateApplication(LauncherModel.getUrlForAppId(appId))
205 }
205 }
206 onShownChanged: {
206 onShownChanged: {
207 if (shown) {
207 if (shown) {