1 From 8fcc04ebda417fae3bd8e8300db6d48e71b0ff16 Mon Sep 17 00:00:00 2001
2 From: Tadao Tanikawa <tanikawa.tadao@jp.panasonic.com>
3 Date: Tue, 18 Apr 2017 18:32:15 +0900
4 Subject: [PATCH] Hack to resolve the media player doesn't play next
6 Current window manager make own ivi-layer to each application
7 and adjust the order when rendering (screen's render order of
10 E.g. When showing apps launcher, window manager has only 1
11 ivi-layer for homescreen under screen 0. When showing an app,
12 window manager add 1 ivi-layer for it and set render order
13 of 2 layers, front: app's and back: homescreen layer.
14 And when app hides, it's layer is removed from render order.
16 But if removed from render order, excecuting QML also stopped.
17 It is caused why the media player doesn't play next song
20 This patch changes how to make render order to keep media
21 player's layer in render order even when it is not shown.
23 Change-Id: I4f27a77789733987b8b92f068946cb64e9654901
24 Signed-off-by: Tadao Tanikawa <tanikawa.tadao@jp.panasonic.com>
26 HomeScreen/qml/Home.qml | 2 +-
27 HomeScreen/qml/ShortcutArea.qml | 2 +-
28 HomeScreen/src/layouthandler.cpp | 5 +-
29 HomeScreen/src/layouthandler.h | 2 +-
30 WindowManager/src/windowmanager.cpp | 123 ++++++++++++++++++++++++++++--------
31 WindowManager/src/windowmanager.hpp | 14 +++-
32 interfaces/windowmanager.xml | 4 +-
33 7 files changed, 116 insertions(+), 36 deletions(-)
35 diff --git a/HomeScreen/qml/Home.qml b/HomeScreen/qml/Home.qml
36 index aa3a129..33b958e 100644
37 --- a/HomeScreen/qml/Home.qml
38 +++ b/HomeScreen/qml/Home.qml
39 @@ -54,7 +54,7 @@ Item {
41 applicationArea.visible = true
42 appLauncherAreaLauncher.visible = false
43 - layoutHandler.showAppLayer(pid)
44 + layoutHandler.showAppLayer(model.id, pid)
47 console.warn("app cannot be launched!")
48 diff --git a/HomeScreen/qml/ShortcutArea.qml b/HomeScreen/qml/ShortcutArea.qml
49 index 14c7b6b..9be3fd0 100644
50 --- a/HomeScreen/qml/ShortcutArea.qml
51 +++ b/HomeScreen/qml/ShortcutArea.qml
52 @@ -69,7 +69,7 @@ Item {
53 applicationArea.visible = true
54 appLauncherAreaLauncher.visible = false
55 layoutHandler.makeMeVisible(pid)
56 - layoutHandler.showAppLayer(pid)
57 + layoutHandler.showAppLayer(model.application, pid)
60 console.warn("app cannot be launched!")
61 diff --git a/HomeScreen/src/layouthandler.cpp b/HomeScreen/src/layouthandler.cpp
62 index c0fa620..b91984d 100644
63 --- a/HomeScreen/src/layouthandler.cpp
64 +++ b/HomeScreen/src/layouthandler.cpp
65 @@ -86,9 +86,9 @@ LayoutHandler::~LayoutHandler()
66 delete mp_dBusWindowManagerProxy;
69 -void LayoutHandler::showAppLayer(int pid)
70 +void LayoutHandler::showAppLayer(const QString &app_id, int pid)
72 - mp_dBusWindowManagerProxy->showAppLayer(pid);
73 + mp_dBusWindowManagerProxy->showAppLayer(app_id, pid);
76 void LayoutHandler::hideAppLayer()
77 @@ -275,4 +275,3 @@ void LayoutHandler::timerEvent(QTimerEvent *e)
82 diff --git a/HomeScreen/src/layouthandler.h b/HomeScreen/src/layouthandler.h
83 index c82bfda..007f1ad 100644
84 --- a/HomeScreen/src/layouthandler.h
85 +++ b/HomeScreen/src/layouthandler.h
86 @@ -31,7 +31,7 @@ public:
90 - void showAppLayer(int pid);
91 + void showAppLayer(const QString &app_id, int pid);
93 void makeMeVisible(int pid);
95 diff --git a/WindowManager/src/windowmanager.cpp b/WindowManager/src/windowmanager.cpp
96 index e7802ca..02bc392 100644
97 --- a/WindowManager/src/windowmanager.cpp
98 +++ b/WindowManager/src/windowmanager.cpp
99 @@ -51,7 +51,7 @@ void* WindowManager::myThis = 0;
100 WindowManager::WindowManager(int displayId, QObject *parent) :
103 - mp_layoutAreaToSurfaceIdAssignment(0),
104 + // mp_layoutAreaToSurfaceIdAssignmment(0),
106 m_screenId(displayId),
108 @@ -60,6 +60,8 @@ WindowManager::WindowManager(int displayId, QObject *parent) :
114 m_pending_to_show(-1)
117 @@ -71,6 +73,7 @@ WindowManager::WindowManager(int displayId, QObject *parent) :
118 m_showLayers[2] = 0; /* APPLICATIONS is not shown by default */
119 m_showLayers[3] = WINDOWMANAGER_LAYER_HOMESCREEN; /* HOMESCREEN is shwon by default */
121 + m_keepApps.append(QString("mediaplayer@"));
123 qDebug("-=[WindowManager]=-");
125 @@ -120,17 +123,36 @@ WindowManager::~WindowManager()
128 #ifdef HAVE_IVI_LAYERMANAGEMENT_API
129 -int WindowManager::getLayerRenderOrder(t_ilm_layer id_array[])
130 +t_ilm_layer* WindowManager::getLayerRenderOrder(int& num_layers)
133 + int i, j, n_bg = m_bgApps.size();
135 - for (i = WINDOWMANAGER_LAYER_NUM - 1, j = 0; i >= 0; i--) {
136 + t_ilm_layer* id_array = new t_ilm_layer[n_bg + WINDOWMANAGER_LAYER_NUM];
138 + qDebug("Layer render order (ivi-layer-id), %d bgApps: ", n_bg);
141 + for (i = 0; i < n_bg; i++) {
142 + if (m_bgApps[i] != 0) {
143 + QMap<pid_t, t_ilm_layer>::const_iterator i_layers;
144 + i_layers = m_appLayers.find(m_bgApps[i]);
145 + /* m_showLayers[2] means layer for apps */
146 + if (i_layers != m_appLayers.end() && i_layers.value() != 0
147 + && i_layers.value() != m_showLayers[2]) {
148 + qDebug(" m_bgApps[%d]=%d", i, i_layers.value());
149 + id_array[num_layers++] = i_layers.value();
154 + for (i = WINDOWMANAGER_LAYER_NUM - 1, j = 0; i >= 0; i--,j++) {
155 if (m_showLayers[i] != 0) {
156 - id_array[j++] = m_showLayers[i];
157 + qDebug(" m_showLayers[%d]=%d", i, m_showLayers[i]);
158 + id_array[num_layers++] = m_showLayers[i];
167 @@ -401,13 +423,12 @@ void WindowManager::updateScreen()
169 #ifdef HAVE_IVI_LAYERMANAGEMENT_API
170 if (m_pending_to_show != -1) {
171 - qDebug("show pending app (%d)", m_pending_to_show);
172 + qDebug() << "show pending app (%d)" << m_pending_to_show;
173 showAppLayer(m_pending_to_show);
175 // display layer render order
176 - t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM];
177 - int num_layers = getLayerRenderOrder(renderOrder);
180 + t_ilm_layer *renderOrder = getLayerRenderOrder(num_layers);
181 qDebug("Screen render order %d, %d layers", m_screenId, num_layers);
182 ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers);
184 @@ -686,6 +707,18 @@ QString WindowManager::getLayoutName(int layoutId)
188 +#ifdef HAVE_IVI_LAYERMANAGEMENT_API
189 +void WindowManager::renderLayers(void)
192 + t_ilm_layer *renderOrder = getLayerRenderOrder(num_layers);
194 + qDebug("Screen render order %d, %d layers", m_screenId, num_layers);
195 + ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers);
196 + ilm_commitChanges();
200 void WindowManager::hideLayer(int layer)
202 qDebug("-=[hideLayer]=-");
203 @@ -701,10 +734,7 @@ void WindowManager::hideLayer(int layer)
204 m_pending_to_show = -1;
207 - t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM];
208 - int num_layers = getLayerRenderOrder(renderOrder);
209 - ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers);
210 - ilm_commitChanges();
215 @@ -779,10 +809,7 @@ void WindowManager::showLayer(int layer)
217 m_showLayers[layer] = layer_id_array[layer];
219 - t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM];
220 - int num_layers = getLayerRenderOrder(renderOrder);
221 - ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers);
222 - ilm_commitChanges();
227 @@ -790,7 +817,7 @@ void WindowManager::showLayer(int layer)
228 void WindowManager::showAppLayer(int pid)
230 qDebug("-=[showAppLayer]=-");
231 - qDebug("pid %d", pid);
232 + qDebug() << "pid=" << pid;
235 /* nothing to show */
236 @@ -802,17 +829,65 @@ void WindowManager::showAppLayer(int pid)
238 /* search layer id for application to show */
239 QMap<pid_t, t_ilm_layer>::const_iterator i = m_appLayers.find(pid);
240 - QMap<pid_t, t_ilm_surface>::const_iterator j = m_appSurfaces.find(pid);
242 if (i != m_appLayers.end()) {
243 + qDebug("Found layer(%d) to show for app(pid=%d)", m_showLayers[2], pid);
244 m_showLayers[2] = i.value();
246 + QMap<pid_t, t_ilm_surface>::const_iterator j = m_appSurfaces.find(pid);
247 + /* check if this app is registered */
248 + if (j == m_appSurfaces.end()) {
249 + qDebug("New app %d", pid);
250 + m_appSurfaces.insert(pid, 0); /* register pid only so far */
251 + } /* check app is required keep running while background */
253 + /* Probably app layer hasn't been made yet */
254 + m_pending_to_show = pid;
255 + /* hide current app once, back to default screen */
256 + m_showLayers[2] = 0;
257 + qDebug("No layer to show for app(pid=%d)", pid);
263 +void WindowManager::showAppLayer(const QString &app_id, int pid)
265 + qDebug("-=[showAppLayer]=-");
266 + qDebug() << "id=" << app_id << ", pid=" << pid;
269 + /* nothing to show */
272 +#ifdef HAVE_IVI_LAYERMANAGEMENT_API
273 + /* clear pending flag */
274 + m_pending_to_show = -1;
276 + /* search layer id for application to show */
277 + QMap<pid_t, t_ilm_layer>::const_iterator i = m_appLayers.find(pid);
279 + if (i != m_appLayers.end()) {
280 qDebug("Found layer(%d) to show for app(pid=%d)", m_showLayers[2], pid);
281 + m_showLayers[2] = i.value();
283 + QMap<pid_t, t_ilm_surface>::const_iterator j = m_appSurfaces.find(pid);
284 /* check if this app is registered */
285 if (j == m_appSurfaces.end()) {
286 qDebug("New app %d", pid);
287 m_appSurfaces.insert(pid, 0); /* register pid only so far */
290 + /* check if rendering is always required */
291 + /* QML apps should be always rendered if */
292 + for (int k = 0; k != m_keepApps.size(); k++) {
293 + if (app_id.indexOf(m_keepApps[k]) == 0) {
294 + int idx = m_bgApps.indexOf(pid);
296 + m_bgApps.append(pid);
300 + } /* check app is required keep running while background */
302 /* Probably app layer hasn't been made yet */
303 m_pending_to_show = pid;
304 @@ -820,10 +895,6 @@ void WindowManager::showAppLayer(int pid)
306 qDebug("No layer to show for app(pid=%d)", pid);
308 - t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM];
310 - int num_layers = getLayerRenderOrder(renderOrder);
311 - ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers);
312 - ilm_commitChanges();
316 diff --git a/WindowManager/src/windowmanager.hpp b/WindowManager/src/windowmanager.hpp
317 index 89f255e..532bf80 100644
318 --- a/WindowManager/src/windowmanager.hpp
319 +++ b/WindowManager/src/windowmanager.hpp
322 #ifdef HAVE_IVI_LAYERMANAGEMENT_API
323 #include <ilm/ilm_control.h>
326 class WindowManager : public QObject
328 @@ -50,9 +51,14 @@ private:
330 #ifdef HAVE_IVI_LAYERMANAGEMENT_API
331 t_ilm_layer* m_showLayers;
333 QMap<pid_t, t_ilm_surface> m_appSurfaces;
334 QMap<pid_t, t_ilm_layer> m_appLayers;
335 - int getLayerRenderOrder(t_ilm_layer* id_array);
337 + QList<QString> m_keepApps; /* Apps needs to keep rendering */
338 + QList<pid_t> m_bgApps;
340 + t_ilm_layer* getLayerRenderOrder(int& num_layers);
342 void createNewLayer(const int layerId);
344 @@ -61,11 +67,14 @@ private:
345 pid_t m_pending_to_show;
347 void addSurface(const t_ilm_surface surfaceId);
348 - t_ilm_layer addSurfaceToAppLayer(pid_t pid, const int surfaceId);
350 + t_ilm_layer addSurfaceToAppLayer(pid_t pid, const int surfaceId);
351 void addSurfaceToLayer(const int surfaceId, const int layerId);
353 void configureHomeScreenMainSurface(const t_ilm_surface surface, const t_ilm_int width, const t_ilm_int height);
354 void configureAppSurface(const pid_t pid, const t_ilm_surface surface, const t_ilm_int width, const t_ilm_int height);
356 + void renderLayers(void);
360 @@ -118,6 +127,7 @@ public Q_SLOTS: // METHODS
361 int setSurfaceToLayoutArea(int surfaceId, int layoutAreaId);
362 void showLayer(int layer);
363 void showAppLayer(int pid);
364 + void showAppLayer(const QString &app_id, int pid);
366 Q_SIGNALS: // SIGNALS
367 void surfaceVisibilityChanged(int surfaceId, bool visible);
368 diff --git a/interfaces/windowmanager.xml b/interfaces/windowmanager.xml
369 index e3c6df3..9d8cafc 100644
370 --- a/interfaces/windowmanager.xml
371 +++ b/interfaces/windowmanager.xml
374 <method name="getAvailableSurfaces">
375 <arg name="surfaceIds" type="a(i)" direction="out"/>
376 - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QList<int>"/>
377 + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QList<int>"/>
382 Show layer for application .
384 <method name="showAppLayer">
385 + <arg name="name" type="s" direction="in"/>
386 <arg name="pid" type="i" direction="in"/>