Merge lp:~gerboland/unity-mir/fix-screenshots into lp:unity-mir

Proposed by Gerry Boland
Status: Merged
Approved by: Michał Sawicz
Approved revision: 34
Merged at revision: 37
Proposed branch: lp:~gerboland/unity-mir/fix-screenshots
Merge into: lp:unity-mir
Diff against target: 231 lines (+58/-25)
8 files modified
src/modules/Unity/ApplicationManager/application.cpp (+0/-6)
src/modules/Unity/ApplicationManager/application.h (+0/-3)
src/modules/Unity/ApplicationManager/application_list_model.cpp (+2/-2)
src/modules/Unity/ApplicationManager/application_list_model.h (+1/-1)
src/modules/Unity/ApplicationManager/application_manager.cpp (+16/-5)
src/modules/Unity/ApplicationManager/application_manager.h (+2/-0)
src/modules/Unity/ApplicationManager/applicationscreenshotprovider.cpp (+35/-7)
src/modules/Unity/ApplicationManager/applicationscreenshotprovider.h (+2/-1)
To merge this branch: bzr merge lp:~gerboland/unity-mir/fix-screenshots
Reviewer Review Type Date Requested Status
Michał Sawicz Approve
PS Jenkins bot (community) continuous-integration Approve
Albert Astals Cid Pending
Review via email: mp+179307@code.launchpad.net

Commit message

Remove unnecessary Application id, use app_id instead. Fix screenshots to remove white padding pixels. Application only focused when it creates its surface.

Description of the change

Remove unnecessary Application id, use app_id instead. This is needed for lenses to obtain app screenshots.

Fix screenshots to remove white padding pixels, which are due to current implementation detail where all qtubuntu applications are fullscreen, and just draw under the panel.

Application only focused when it creates its surface. Helps shell timings for animations.

To post a comment you must log in.
Revision history for this message
Albert Astals Cid (aacid) wrote :

Looks good, i understand m_panelHeight is just a "hack" for the moment, right?

Revision history for this message
Gerry Boland (gerboland) wrote :

> Looks good, i understand m_panelHeight is just a "hack" for the moment, right?

Yep. When platform-api/qtubuntu create surfaces more correctly, this can go away.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
33. By Gerry Boland

Merge trunk and fix commit

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
34. By Gerry Boland

Merge trunk

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Gerry Boland (gerboland) wrote :

To test, please use the Unity8 in lp:~gerboland/unity8/u8m-animation-fixes

Revision history for this message
Michał Sawicz (saviq) wrote :

Yup, works.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/modules/Unity/ApplicationManager/application.cpp'
2--- src/modules/Unity/ApplicationManager/application.cpp 2013-08-09 13:16:13 +0000
3+++ src/modules/Unity/ApplicationManager/application.cpp 2013-08-15 15:37:10 +0000
4@@ -37,7 +37,6 @@
5 DASSERT(desktopData != NULL);
6 DLOG("Application::Application (this=%p, desktopData=%p, pid=%lld, stage=%d, state=%d",
7 this, desktopData, pid, static_cast<int>(stage), static_cast<int>(state));
8- m_id = qrand();
9 }
10
11 Application::~Application()
12@@ -46,11 +45,6 @@
13 delete m_desktopData;
14 }
15
16-int Application::id() const
17-{
18- return m_id;
19-}
20-
21 QString Application::desktopFile() const
22 {
23 return m_desktopData->file();
24
25=== modified file 'src/modules/Unity/ApplicationManager/application.h'
26--- src/modules/Unity/ApplicationManager/application.h 2013-08-09 13:16:13 +0000
27+++ src/modules/Unity/ApplicationManager/application.h 2013-08-15 15:37:10 +0000
28@@ -35,7 +35,6 @@
29 Q_OBJECT
30 Q_ENUMS(Stage)
31 Q_ENUMS(State)
32- Q_PROPERTY(int id READ id CONSTANT)
33 Q_PROPERTY(QString desktopFile READ desktopFile CONSTANT)
34 Q_PROPERTY(QString appId READ appId CONSTANT)
35 Q_PROPERTY(QString name READ name CONSTANT)
36@@ -54,7 +53,6 @@
37 Application(DesktopFileReader* desktopData, qint64 pid, Stage stage, State state);
38 ~Application();
39
40- int id() const;
41 QString desktopFile() const;
42 QString appId() const;
43 QString name() const;
44@@ -81,7 +79,6 @@
45 void setSession(const std::shared_ptr<mir::shell::ApplicationSession>& session);
46 void setSessionName(const QString& name);
47
48- int m_id;
49 DesktopFileReader* m_desktopData;
50 qint64 m_pid;
51 Stage m_stage;
52
53=== modified file 'src/modules/Unity/ApplicationManager/application_list_model.cpp'
54--- src/modules/Unity/ApplicationManager/application_list_model.cpp 2013-08-15 12:40:41 +0000
55+++ src/modules/Unity/ApplicationManager/application_list_model.cpp 2013-08-15 15:37:10 +0000
56@@ -122,10 +122,10 @@
57 return nullptr;
58 }
59
60-Application* ApplicationListModel::getApplicationWithId(const int id)
61+Application* ApplicationListModel::getApplicationWithAppId(const QString &appId)
62 {
63 for (Application *app : m_applications) {
64- if (app->m_id == id) {
65+ if (app->appId() == appId) {
66 return app;
67 }
68 }
69
70=== modified file 'src/modules/Unity/ApplicationManager/application_list_model.h'
71--- src/modules/Unity/ApplicationManager/application_list_model.h 2013-08-09 13:16:13 +0000
72+++ src/modules/Unity/ApplicationManager/application_list_model.h 2013-08-15 15:37:10 +0000
73@@ -51,7 +51,7 @@
74
75 Application* getApplicationWithSession(const std::shared_ptr<mir::shell::Session> &session);
76 Application* getApplicationWithSession(const mir::shell::Session *session);
77- Application* getApplicationWithId(const int id);
78+ Application* getApplicationWithAppId(const QString &appId);
79 Application* getApplicationWithPid(const int pid);
80 Application* getLastExecutedApplication();
81
82
83=== modified file 'src/modules/Unity/ApplicationManager/application_manager.cpp'
84--- src/modules/Unity/ApplicationManager/application_manager.cpp 2013-08-09 13:16:13 +0000
85+++ src/modules/Unity/ApplicationManager/application_manager.cpp 2013-08-15 15:37:10 +0000
86@@ -283,11 +283,11 @@
87 {
88 DLOG("ApplicationManager::sessionFocused (this=%p, application=%s)", this, session->name().c_str());
89 Application* application = m_mainStageApplications->getApplicationWithSession(session);
90- if (application && application != m_mainStageFocusedApplication) {
91- m_mainStageFocusedApplication = application;
92- m_mainStageFocusedApplication->setFocus(true);
93- Q_EMIT mainStageFocusedApplicationChanged();
94- m_dbusWindowStack->FocusedWindowChanged(0, application->name(), application->stage());
95+
96+ // Don't give application focus until it has created it's surface, when it is set as state "Running"
97+ if (application && application->state() != Application::Starting
98+ && application != m_mainStageFocusedApplication) {
99+ setFocused(application);
100 }
101 }
102
103@@ -313,5 +313,16 @@
104 application->setState(Application::Running);
105
106 m_dbusWindowStack->WindowCreated(0, application->name());
107+
108+ // only when Session creates a Surface will we actually mark it focused
109+ setFocused(application);
110 }
111 }
112+
113+void ApplicationManager::setFocused(Application *application)
114+{
115+ m_mainStageFocusedApplication = application;
116+ m_mainStageFocusedApplication->setFocus(true);
117+ Q_EMIT mainStageFocusedApplicationChanged();
118+ m_dbusWindowStack->FocusedWindowChanged(0, application->name(), application->stage());
119+}
120
121=== modified file 'src/modules/Unity/ApplicationManager/application_manager.h'
122--- src/modules/Unity/ApplicationManager/application_manager.h 2013-08-09 13:16:13 +0000
123+++ src/modules/Unity/ApplicationManager/application_manager.h 2013-08-15 15:37:10 +0000
124@@ -101,6 +101,8 @@
125 void sessionCreatedSurface(mir::shell::ApplicationSession const*, std::shared_ptr<mir::shell::Surface> const&);
126
127 private:
128+ void setFocused(Application *application);
129+
130 ApplicationListModel* m_mainStageApplications;
131 Application* m_mainStageFocusedApplication; // remove as Mir has API for this
132 ShellServerConfiguration* m_mirServer;
133
134=== modified file 'src/modules/Unity/ApplicationManager/applicationscreenshotprovider.cpp'
135--- src/modules/Unity/ApplicationManager/applicationscreenshotprovider.cpp 2013-08-09 13:16:13 +0000
136+++ src/modules/Unity/ApplicationManager/applicationscreenshotprovider.cpp 2013-08-15 15:37:10 +0000
137@@ -26,10 +26,29 @@
138 // mir
139 #include "mirserver/mir/shell/application_session.h"
140
141+// fallback grid unit used if GRID_UNIT_PX is not in the environment.
142+const int defaultGridUnitPx = 8;
143+
144 ApplicationScreenshotProvider::ApplicationScreenshotProvider(ApplicationManager *appManager)
145 : QQuickImageProvider(QQuickImageProvider::Image)
146 , m_appManager(appManager)
147+ , m_panelHeight(54)
148 {
149+ // See below to explain why this is needed for now.
150+ int gridUnitPx = defaultGridUnitPx;
151+
152+ QByteArray gridUnitString = qgetenv("GRID_UNIT_PX");
153+ if (!gridUnitString.isEmpty()) {
154+ bool ok;
155+ int value = gridUnitString.toInt(&ok);
156+ if (ok) {
157+ gridUnitPx = value;
158+ }
159+ }
160+
161+ int densityPixelPx = qFloor( (float)gridUnitPx / defaultGridUnitPx );
162+
163+ m_panelHeight = 3 * gridUnitPx + 2 * densityPixelPx;
164 }
165
166 QQmlImageProviderBase::Flags ApplicationScreenshotProvider::flags() const
167@@ -38,14 +57,14 @@
168 return QQmlImageProviderBase::ForceAsynchronousImageLoading;
169 }
170
171-QImage ApplicationScreenshotProvider::requestImage(const QString & id, QSize * size,
172- const QSize & requestedSize)
173+QImage ApplicationScreenshotProvider::requestImage(const QString &appId, QSize * size,
174+ const QSize &requestedSize)
175 {
176- DLOG("ApplicationScreenshotProvider::requestPixmap (this=%p, id=%s)", this, id.toLatin1().constData());
177+ DLOG("ApplicationScreenshotProvider::requestPixmap (this=%p, id=%s)", this, appId.toLatin1().constData());
178
179- Application* app = m_appManager->mainStageApplications()->getApplicationWithId(id.toInt());
180+ Application* app = m_appManager->mainStageApplications()->getApplicationWithAppId(appId);
181 if (app == NULL) {
182- LOG("ApplicationScreenshotProvider - app with id %d not found", id.toInt());
183+ LOG("ApplicationScreenshotProvider - app with appId %s not found", appId.toLatin1().constData());
184 return QImage();
185 }
186
187@@ -54,6 +73,15 @@
188 return QImage();
189 }
190
191+ /* Workaround for bug https://bugs.launchpad.net/qtubuntu/+bug/1209216 - currently all qtubuntu
192+ * based applications are allocated a fullscreen Mir surface, but draw in a geometry excluding
193+ * the panel's rectangle. Mir snapshots thus have a white rectangle which the panel hides.
194+ * So need to clip this rectangle from the snapshot. */
195+ int yOffset = 0;
196+ if (!app->fullscreen()) {
197+ yOffset = m_panelHeight;
198+ }
199+
200 QMutex mutex;
201 QWaitCondition wait;
202 mutex.lock();
203@@ -66,9 +94,9 @@
204 DLOG("ApplicationScreenshotProvider - Mir snapshot ready with size %d x %d",
205 snapshot.size.height.as_int(), snapshot.size.width.as_int());
206
207- image = QImage( (const uchar*)snapshot.pixels,
208+ image = QImage( (const uchar*)snapshot.pixels, // since we mirror, no need to offset starting position
209 snapshot.size.width.as_int(),
210- snapshot.size.height.as_int(),
211+ snapshot.size.height.as_int() - yOffset,
212 QImage::Format_ARGB32_Premultiplied).mirrored();
213 wait.wakeOne();
214 });
215
216=== modified file 'src/modules/Unity/ApplicationManager/applicationscreenshotprovider.h'
217--- src/modules/Unity/ApplicationManager/applicationscreenshotprovider.h 2013-08-09 13:16:13 +0000
218+++ src/modules/Unity/ApplicationManager/applicationscreenshotprovider.h 2013-08-15 15:37:10 +0000
219@@ -26,10 +26,11 @@
220 explicit ApplicationScreenshotProvider(ApplicationManager *appManager);
221
222 Flags flags() const override;
223- QImage requestImage(const QString & id, QSize * size, const QSize & requestedSize) override;
224+ QImage requestImage(const QString &appId, QSize *size, const QSize &requestedSize) override;
225
226 private:
227 ApplicationManager* m_appManager;
228+ int m_panelHeight;
229 };
230
231 #endif // APPLICATIONSCREENSHOTPROVIDER_H

Subscribers

People subscribed via source and target branches