Merge lp:~dandrader/qtmir/dbusFocusInfo into lp:qtmir

Proposed by Daniel d'Andrada on 2016-06-23
Status: Merged
Approved by: Nick Dedekind on 2016-07-04
Approved revision: 525
Merged at revision: 521
Proposed branch: lp:~dandrader/qtmir/dbusFocusInfo
Merge into: lp:qtmir
Diff against target: 580 lines (+357/-2)
20 files modified
CMakeLists.txt (+1/-2)
debian/control (+1/-0)
src/modules/Unity/Application/CMakeLists.txt (+3/-0)
src/modules/Unity/Application/application.cpp (+1/-0)
src/modules/Unity/Application/application_manager.cpp (+3/-0)
src/modules/Unity/Application/application_manager.h (+2/-0)
src/modules/Unity/Application/cgmanager.cpp (+117/-0)
src/modules/Unity/Application/cgmanager.h (+42/-0)
src/modules/Unity/Application/dbusfocusinfo.cpp (+89/-0)
src/modules/Unity/Application/dbusfocusinfo.h (+54/-0)
src/modules/Unity/Application/mirsurface.cpp (+5/-0)
src/modules/Unity/Application/mirsurface.h (+1/-0)
src/modules/Unity/Application/mirsurfaceinterface.h (+4/-0)
src/modules/Unity/Application/session.cpp (+17/-0)
src/modules/Unity/Application/session.h (+4/-0)
src/modules/Unity/Application/session_interface.h (+6/-0)
src/platforms/mirserver/logging.cpp (+1/-0)
src/platforms/mirserver/logging.h (+1/-0)
tests/framework/fake_mirsurface.h (+1/-0)
tests/framework/fake_session.h (+4/-0)
To merge this branch: bzr merge lp:~dandrader/qtmir/dbusFocusInfo
Reviewer Review Type Date Requested Status
Nick Dedekind (community) 2016-06-23 Approve on 2016-07-04
Unity8 CI Bot continuous-integration Approve on 2016-07-01
Michael Sheldon (community) Needs Fixing on 2016-06-24
Review via email: mp+298253@code.launchpad.net

Commit Message

com.canonical.Unity.FocusInfo D-Bus service for providing focus information

Description of the Change

Needed for fixing bug 1594863.

* Are there any related MPs required for this MP to build/function as expected? Please list.
No

* Did you perform an exploratory manual test run of your code change and any related functionality?
Yes, with commands like:
$ gdbus call --session --dest com.canonical.Unity.FocusInfo --object-path / --method com.canonical.Unity.FocusInfo.isPidFocused $(pidof unity8-dash)

* If you changed the packaging (debian), did you subscribe the ubuntu-unity team to this MP?
Not applicable

To post a comment you must log in.
Unity8 CI Bot (unity8-ci-bot) wrote :

FAILED: Continuous integration, rev:521
No commit message was specified in the merge proposal. Click on the following link and set the commit message (if you want a jenkins rebuild you need to trigger it yourself):
https://code.launchpad.net/~dandrader/qtmir/dbusFocusInfo/+merge/298253/+edit-commit-message

https://unity8-jenkins.ubuntu.com/job/lp-qtmir-ci/292/
Executed test runs:
    FAILURE: https://unity8-jenkins.ubuntu.com/job/build/2137/console
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-0-fetch/2165
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/2074
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/2074
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/2074
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=vivid+overlay/2065
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=vivid+overlay/2065/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=xenial+overlay/2065
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=xenial+overlay/2065/artifact/output/*zip*/output.zip
    FAILURE: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=yakkety/2065/console
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=vivid+overlay/2065
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=vivid+overlay/2065/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=xenial+overlay/2065
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=xenial+overlay/2065/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=yakkety/2065
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=yakkety/2065/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=vivid+overlay/2065
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=vivid+overlay/2065/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=xenial+overlay/2065
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=xenial+overlay/2065/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=yakkety/2065
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=yakkety/2065/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://unity8-jenkins.ubuntu.com/job/lp-qtmir-ci/292/rebuild

review: Needs Fixing (continuous-integration)
Michael Sheldon (michael-sheldon) wrote :

This doesn't seem to report focus correctly for trust prompts at the moment. To reproduce:

1. Remove any existing twitter account

2. Start twitter app

3. Run: gdbus call --session --dest com.canonical.Unity.FocusInfo --object-path / --method com.canonical.Unity.FocusInfo.isPidFocused $(pidof online-accounts-ui)

This should return true because the online-accounts-ui has focus, but it currently returns false

review: Needs Fixing
Daniel d'Andrada (dandrader) wrote :

> This doesn't seem to report focus correctly for trust prompts at the moment.
> To reproduce:
>
> 1. Remove any existing twitter account
>
> 2. Start twitter app
>
> 3. Run: gdbus call --session --dest com.canonical.Unity.FocusInfo --object-
> path / --method com.canonical.Unity.FocusInfo.isPidFocused $(pidof online-
> accounts-ui)
>
> This should return true because the online-accounts-ui has focus, but it
> currently returns false

Fixed.

Unity8 CI Bot (unity8-ci-bot) wrote :

FAILED: Continuous integration, rev:522
No commit message was specified in the merge proposal. Click on the following link and set the commit message (if you want a jenkins rebuild you need to trigger it yourself):
https://code.launchpad.net/~dandrader/qtmir/dbusFocusInfo/+merge/298253/+edit-commit-message

https://unity8-jenkins.ubuntu.com/job/lp-qtmir-ci/296/
Executed test runs:
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build/2147
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-0-fetch/2175
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/2084
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/2084
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/2084
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=vivid+overlay/2075
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=vivid+overlay/2075/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=xenial+overlay/2075
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=xenial+overlay/2075/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=yakkety/2075
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=yakkety/2075/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=vivid+overlay/2075
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=vivid+overlay/2075/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=xenial+overlay/2075
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=xenial+overlay/2075/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=yakkety/2075
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=yakkety/2075/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=vivid+overlay/2075
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=vivid+overlay/2075/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=xenial+overlay/2075
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=xenial+overlay/2075/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=yakkety/2075
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=yakkety/2075/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://unity8-jenkins.ubuntu.com/job/lp-qtmir-ci/296/rebuild

review: Needs Fixing (continuous-integration)
review: Needs Fixing
Daniel d'Andrada (dandrader) wrote :

On 24/06/2016 11:59, Nick Dedekind wrote:
>> + QList<Application*> *m_applications;
> const QList<Application>& m_applications ?
>
> const and easier to read; no dereferencing.
>

Done.

Unity8 CI Bot (unity8-ci-bot) wrote :

FAILED: Continuous integration, rev:523
https://unity8-jenkins.ubuntu.com/job/lp-qtmir-ci/297/
Executed test runs:
    FAILURE: https://unity8-jenkins.ubuntu.com/job/build/2150/console
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-0-fetch/2178
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/2086
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/2086
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/2086
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=vivid+overlay/2077
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=vivid+overlay/2077/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=xenial+overlay/2077
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=xenial+overlay/2077/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=yakkety/2077
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=yakkety/2077/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=vivid+overlay/2077
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=vivid+overlay/2077/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=xenial+overlay/2077
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=xenial+overlay/2077/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=yakkety/2077
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=yakkety/2077/artifact/output/*zip*/output.zip
    FAILURE: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=vivid+overlay/2077/console
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=xenial+overlay/2077
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=xenial+overlay/2077/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=yakkety/2077
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=yakkety/2077/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://unity8-jenkins.ubuntu.com/job/lp-qtmir-ci/297/rebuild

review: Needs Fixing (continuous-integration)
Nick Dedekind (nick-dedekind) wrote :

Thanks for the change.
Looks fine now.

review: Approve
Unity8 CI Bot (unity8-ci-bot) wrote :

PASSED: Continuous integration, rev:524
https://unity8-jenkins.ubuntu.com/job/lp-qtmir-ci/302/
Executed test runs:
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build/2204
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-0-fetch/2232
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/2138
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/2138
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/2138
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=vivid+overlay/2129
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=vivid+overlay/2129/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=xenial+overlay/2129
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=xenial+overlay/2129/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=yakkety/2129
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=yakkety/2129/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=vivid+overlay/2129
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=vivid+overlay/2129/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=xenial+overlay/2129
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=xenial+overlay/2129/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=yakkety/2129
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=yakkety/2129/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=vivid+overlay/2129
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=vivid+overlay/2129/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=xenial+overlay/2129
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=xenial+overlay/2129/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=yakkety/2129
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=yakkety/2129/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://unity8-jenkins.ubuntu.com/job/lp-qtmir-ci/302/rebuild

review: Approve (continuous-integration)
Unity8 CI Bot (unity8-ci-bot) wrote :

PASSED: Continuous integration, rev:525
https://unity8-jenkins.ubuntu.com/job/lp-qtmir-ci/303/
Executed test runs:
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build/2205
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-0-fetch/2233
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/2139
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/2139
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/2139
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=vivid+overlay/2130
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=vivid+overlay/2130/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=xenial+overlay/2130
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=xenial+overlay/2130/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=yakkety/2130
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=yakkety/2130/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=vivid+overlay/2130
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=vivid+overlay/2130/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=xenial+overlay/2130
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=xenial+overlay/2130/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=yakkety/2130
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=yakkety/2130/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=vivid+overlay/2130
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=vivid+overlay/2130/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=xenial+overlay/2130
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=xenial+overlay/2130/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=yakkety/2130
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=yakkety/2130/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://unity8-jenkins.ubuntu.com/job/lp-qtmir-ci/303/rebuild

review: Approve (continuous-integration)
Nick Dedekind (nick-dedekind) wrote :

Changes look fine.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'CMakeLists.txt'
2--- CMakeLists.txt 2016-06-14 08:33:42 +0000
3+++ CMakeLists.txt 2016-07-01 16:20:12 +0000
4@@ -84,8 +84,7 @@
5 pkg_check_modules(QTDBUSTEST libqtdbustest-1 REQUIRED)
6 pkg_check_modules(QTDBUSMOCK libqtdbusmock-1 REQUIRED)
7 pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=18)
8-
9-include_directories(${APPLICATION_API_INCLUDE_DIRS})
10+pkg_check_modules(CGMANAGER libcgmanager REQUIRED)
11
12 add_definitions(-DMIR_REQUIRE_DEPRECATED_EVENT_OPT_IN=1)
13
14
15=== modified file 'debian/control'
16--- debian/control 2016-06-03 11:16:30 +0000
17+++ debian/control 2016-07-01 16:20:12 +0000
18@@ -6,6 +6,7 @@
19 cmake-extras (>= 0.3),
20 debhelper (>= 9),
21 google-mock (>= 1.6.0+svn437),
22+ libcgmanager-dev,
23 libfontconfig1-dev,
24 libgles2-mesa-dev,
25 libglib2.0-dev,
26
27=== modified file 'src/modules/Unity/Application/CMakeLists.txt'
28--- src/modules/Unity/Application/CMakeLists.txt 2016-04-26 08:56:36 +0000
29+++ src/modules/Unity/Application/CMakeLists.txt 2016-07-01 16:20:12 +0000
30@@ -10,6 +10,7 @@
31 ${CMAKE_SOURCE_DIR}/src/platforms/mirserver
32 ${CMAKE_SOURCE_DIR}/src/common
33 ${GSETTINGS_QT_INCLUDE_DIRS}
34+ ${CGMANAGER_INCLUDE_DIRS}
35
36 ${LTTNG_INCLUDE_DIRS}
37 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
38@@ -25,8 +26,10 @@
39 set(QMLMIRPLUGIN_SRC
40 application_manager.cpp
41 application.cpp
42+ cgmanager.cpp
43 ../../../common/abstractdbusservicemonitor.cpp
44 ../../../common/debughelpers.cpp
45+ dbusfocusinfo.cpp
46 plugin.cpp
47 dbuswindowstack.cpp
48 mirsurfacemanager.cpp
49
50=== modified file 'src/modules/Unity/Application/application.cpp'
51--- src/modules/Unity/Application/application.cpp 2016-06-03 11:08:30 +0000
52+++ src/modules/Unity/Application/application.cpp 2016-07-01 16:20:12 +0000
53@@ -18,6 +18,7 @@
54 #include "application.h"
55 #include "applicationinfo.h"
56 #include "application_manager.h"
57+#include "mirsurfaceinterface.h"
58 #include "session.h"
59 #include "sharedwakelock.h"
60 #include "timer.h"
61
62=== modified file 'src/modules/Unity/Application/application_manager.cpp'
63--- src/modules/Unity/Application/application_manager.cpp 2016-05-06 08:41:15 +0000
64+++ src/modules/Unity/Application/application_manager.cpp 2016-07-01 16:20:12 +0000
65@@ -18,6 +18,7 @@
66 #include "application_manager.h"
67 #include "application.h"
68 #include "applicationinfo.h"
69+#include "dbusfocusinfo.h"
70 #include "dbuswindowstack.h"
71 #include "mirfocuscontroller.h"
72 #include "session.h"
73@@ -176,6 +177,7 @@
74 const QSharedPointer<SettingsInterface>& settings,
75 QObject *parent)
76 : ApplicationManagerInterface(parent)
77+ , m_dbusFocusInfo(new DBusFocusInfo(m_applications))
78 , m_dbusWindowStack(new DBusWindowStack(this))
79 , m_taskController(taskController)
80 , m_procInfo(procInfo)
81@@ -200,6 +202,7 @@
82 ApplicationManager::~ApplicationManager()
83 {
84 qCDebug(QTMIR_APPLICATIONS) << "ApplicationManager::~ApplicationManager";
85+ delete m_dbusFocusInfo;
86 }
87
88 int ApplicationManager::rowCount(const QModelIndex &parent) const
89
90=== modified file 'src/modules/Unity/Application/application_manager.h'
91--- src/modules/Unity/Application/application_manager.h 2016-05-05 15:02:01 +0000
92+++ src/modules/Unity/Application/application_manager.h 2016-07-01 16:20:12 +0000
93@@ -49,6 +49,7 @@
94
95 namespace qtmir {
96
97+class DBusFocusInfo;
98 class DBusWindowStack;
99 class MirSurfaceManager;
100 class ProcInfo;
101@@ -138,6 +139,7 @@
102 Application *findApplication(MirSurfaceInterface* surface);
103
104 QList<Application*> m_applications;
105+ DBusFocusInfo *m_dbusFocusInfo;
106 DBusWindowStack* m_dbusWindowStack;
107 QSharedPointer<TaskController> m_taskController;
108 QSharedPointer<ProcInfo> m_procInfo;
109
110=== added file 'src/modules/Unity/Application/cgmanager.cpp'
111--- src/modules/Unity/Application/cgmanager.cpp 1970-01-01 00:00:00 +0000
112+++ src/modules/Unity/Application/cgmanager.cpp 2016-07-01 16:20:12 +0000
113@@ -0,0 +1,117 @@
114+/*
115+ * Copyright (C) 2016 Canonical, Ltd.
116+ *
117+ * This program is free software: you can redistribute it and/or modify it under
118+ * the terms of the GNU Lesser General Public License version 3, as published by
119+ * the Free Software Foundation.
120+ *
121+ * This program is distributed in the hope that it will be useful, but WITHOUT
122+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
123+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
124+ * Lesser General Public License for more details.
125+ *
126+ * You should have received a copy of the GNU Lesser General Public License
127+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
128+ */
129+
130+#include "cgmanager.h"
131+
132+// QPA mirserver
133+#include <logging.h>
134+
135+#include <cgmanager/cgmanager.h>
136+
137+#include <QDBusArgument>
138+#include <QDBusMessage>
139+
140+using namespace qtmir;
141+
142+// According to D-Bus interface defined in:
143+// https://github.com/lxc/cgmanager/blob/master/org.linuxcontainers.cgmanager.xml
144+
145+CGManager::CGManager(QObject *parent)
146+ : QObject(parent)
147+{
148+}
149+
150+CGManager::~CGManager()
151+{
152+ QDBusConnection::disconnectFromPeer("cgmanager");
153+}
154+
155+QDBusConnection CGManager::getConnection()
156+{
157+ auto connection = QDBusConnection("cgmanager");
158+
159+ if (!connection.isConnected()) {
160+ connection = QDBusConnection::connectToPeer(CGMANAGER_DBUS_PATH, "cgmanager");
161+ if (!connection.isConnected()) {
162+ qCWarning(QTMIR_DBUS, "CGManager: Failed to connect to %s", CGMANAGER_DBUS_PATH);
163+ }
164+ }
165+
166+ return connection;
167+}
168+
169+QString CGManager::getCGroupOfPid(const QString &controller, pid_t pid)
170+{
171+ auto connection = getConnection();
172+ if (!connection.isConnected()) {
173+ return QString();
174+ }
175+
176+ auto message = QDBusMessage::createMethodCall(QString() /*service*/, m_path, m_interface, "GetPidCgroup");
177+
178+ QList<QVariant> arguments;
179+ arguments << QVariant(controller);
180+ arguments << QVariant((int)pid);
181+
182+ message.setArguments(arguments);
183+
184+ QDBusMessage reply = connection.call(message);
185+
186+ if (reply.type() == QDBusMessage::ReplyMessage) {
187+ return reply.arguments()[0].toString();
188+ } else {
189+ Q_ASSERT(reply.type() == QDBusMessage::ErrorMessage);
190+ qCWarning(QTMIR_DBUS) << "CGManager::getCGroupOfPid failed." << reply.errorMessage();
191+ return QString();
192+ }
193+}
194+
195+QSet<pid_t> CGManager::getTasks(const QString &controller, const QString &cgroup)
196+{
197+ auto connection = getConnection();
198+ if (!connection.isConnected()) {
199+ return QSet<pid_t>();
200+ }
201+
202+ auto message = QDBusMessage::createMethodCall(QString() /*service*/, m_path, m_interface, "GetTasks");
203+
204+ QList<QVariant> arguments;
205+ arguments << QVariant(controller);
206+ arguments << QVariant(cgroup);
207+
208+ message.setArguments(arguments);
209+
210+ QDBusMessage reply = connection.call(message);
211+
212+ if (reply.type() == QDBusMessage::ErrorMessage) {
213+ qCWarning(QTMIR_DBUS) << "CGManager::getCGroupOfPid failed." << reply.errorMessage();
214+ return QSet<pid_t>();
215+ }
216+
217+ Q_ASSERT(reply.type() == QDBusMessage::ReplyMessage);
218+
219+ auto arg = reply.arguments()[0].value<QDBusArgument>();
220+ Q_ASSERT(arg.currentType() == QDBusArgument::ArrayType);
221+
222+ auto pidList = qdbus_cast<QList<int>>(arg);
223+ Q_ASSERT(pidList.count() > 0);
224+
225+ QSet<pid_t> pidSet;
226+ for (int i = 0; i < pidList.count(); ++i) {
227+ pidSet << (pid_t)pidList[i];
228+ }
229+ return pidSet;
230+}
231
232=== added file 'src/modules/Unity/Application/cgmanager.h'
233--- src/modules/Unity/Application/cgmanager.h 1970-01-01 00:00:00 +0000
234+++ src/modules/Unity/Application/cgmanager.h 2016-07-01 16:20:12 +0000
235@@ -0,0 +1,42 @@
236+/*
237+ * Copyright (C) 2016 Canonical, Ltd.
238+ *
239+ * This program is free software: you can redistribute it and/or modify it under
240+ * the terms of the GNU Lesser General Public License version 3, as published by
241+ * the Free Software Foundation.
242+ *
243+ * This program is distributed in the hope that it will be useful, but WITHOUT
244+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
245+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
246+ * Lesser General Public License for more details.
247+ *
248+ * You should have received a copy of the GNU Lesser General Public License
249+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
250+ */
251+
252+#ifndef QTMIR_CGMANAGER_H
253+#define QTMIR_CGMANAGER_H
254+
255+#include <QDBusConnection>
256+
257+namespace qtmir {
258+
259+class CGManager : public QObject {
260+ Q_OBJECT
261+public:
262+ CGManager(QObject *parent = nullptr);
263+ virtual ~CGManager();
264+
265+ QString getCGroupOfPid(const QString &controller, pid_t pid);
266+
267+ QSet<pid_t> getTasks(const QString &controller, const QString &cgroup);
268+
269+private:
270+ const QString m_interface{"org.linuxcontainers.cgmanager0_0"};
271+ const QString m_path{"/org/linuxcontainers/cgmanager"};
272+ QDBusConnection getConnection();
273+};
274+
275+} // namespace qtmir
276+
277+#endif // QTMIR_CGMANAGER_H
278
279=== added file 'src/modules/Unity/Application/dbusfocusinfo.cpp'
280--- src/modules/Unity/Application/dbusfocusinfo.cpp 1970-01-01 00:00:00 +0000
281+++ src/modules/Unity/Application/dbusfocusinfo.cpp 2016-07-01 16:20:12 +0000
282@@ -0,0 +1,89 @@
283+/*
284+ * Copyright (C) 2016 Canonical, Ltd.
285+ *
286+ * This program is free software: you can redistribute it and/or modify it under
287+ * the terms of the GNU Lesser General Public License version 3, as published by
288+ * the Free Software Foundation.
289+ *
290+ * This program is distributed in the hope that it will be useful, but WITHOUT
291+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
292+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
293+ * Lesser General Public License for more details.
294+ *
295+ * You should have received a copy of the GNU Lesser General Public License
296+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
297+ */
298+
299+#include "dbusfocusinfo.h"
300+
301+// local
302+#include "cgmanager.h"
303+
304+// QPA mirserver
305+#include <logging.h>
306+
307+#include <QDBusConnection>
308+
309+using namespace qtmir;
310+
311+DBusFocusInfo::DBusFocusInfo(const QList<Application*> &applications)
312+ : m_applications(applications)
313+{
314+ QDBusConnection::sessionBus().registerService("com.canonical.Unity.FocusInfo");
315+ QDBusConnection::sessionBus().registerObject("/", this, QDBusConnection::ExportScriptableSlots);
316+
317+ m_cgManager = new CGManager(this);
318+}
319+
320+bool DBusFocusInfo::isPidFocused(unsigned int pid)
321+{
322+ if (QCoreApplication::applicationPid() == (qint64)pid) {
323+ // Shell itself.
324+ // Don't bother checking if it has a QML with activeFocus() which is not a MirSurfaceItem.
325+ return true;
326+ } else {
327+ auto pidSet = fetchAssociatedPids((pid_t)pid);
328+ SessionInterface *session = findSessionWithPid(pidSet);
329+ return session ? session->activeFocus() : false;
330+ }
331+}
332+
333+QSet<pid_t> DBusFocusInfo::fetchAssociatedPids(pid_t pid)
334+{
335+ QString cgroup = m_cgManager->getCGroupOfPid("freezer", pid);
336+
337+ // If a cgroup has a format like this:
338+ // /user.slice/user-32011.slice/session-c3.scope/upstart/application-legacy-puritine_gedit_0.0-
339+ // All PIds in it are associated with a single application.
340+ if (cgroup.split("/").contains("upstart")) {
341+ QSet<pid_t> pidSet = m_cgManager->getTasks("freezer", cgroup);
342+ qCDebug(QTMIR_DBUS) << "DBusFocusInfo: pid" << pid << "is in cgroup" << cgroup << "along with:" << pidSet;
343+ if (pidSet.isEmpty()) {
344+ pidSet << pid;
345+ }
346+ return pidSet;
347+ } else {
348+ qCDebug(QTMIR_DBUS) << "DBusFocusInfo: pid" << pid << "is in cgroup" << cgroup << "which is not app-specific";
349+ return QSet<pid_t>({pid});
350+ }
351+}
352+
353+SessionInterface* DBusFocusInfo::findSessionWithPid(const QSet<pid_t> &pidSet)
354+{
355+ Q_FOREACH (Application* application, m_applications) {
356+ auto session = application->session();
357+ if (pidSet.contains(session->pid())) {
358+ return session;
359+ }
360+ SessionInterface *chosenChildSession = nullptr;
361+ session->foreachChildSession([&](SessionInterface* childSession) {
362+ if (pidSet.contains(childSession->pid())) {
363+ chosenChildSession = childSession;
364+ }
365+ });
366+ if (chosenChildSession) {
367+ return chosenChildSession;
368+ }
369+ }
370+ return nullptr;
371+}
372
373=== added file 'src/modules/Unity/Application/dbusfocusinfo.h'
374--- src/modules/Unity/Application/dbusfocusinfo.h 1970-01-01 00:00:00 +0000
375+++ src/modules/Unity/Application/dbusfocusinfo.h 2016-07-01 16:20:12 +0000
376@@ -0,0 +1,54 @@
377+/*
378+ * Copyright (C) 2016 Canonical, Ltd.
379+ *
380+ * This program is free software: you can redistribute it and/or modify it under
381+ * the terms of the GNU Lesser General Public License version 3, as published by
382+ * the Free Software Foundation.
383+ *
384+ * This program is distributed in the hope that it will be useful, but WITHOUT
385+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
386+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
387+ * Lesser General Public License for more details.
388+ *
389+ * You should have received a copy of the GNU Lesser General Public License
390+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
391+ */
392+
393+#include <QList>
394+#include <QSet>
395+
396+#include "application.h"
397+
398+namespace qtmir {
399+
400+class CGManager;
401+
402+/*
403+ FIXME: This is a hack to provide OSK with needed info for avoiding input snooping.
404+ Remove when possible
405+ */
406+class DBusFocusInfo : public QObject
407+{
408+ Q_OBJECT
409+ Q_CLASSINFO("D-Bus Interface", "com.canonical.Unity.FocusInfo")
410+public:
411+ explicit DBusFocusInfo(const QList<Application*> &applications);
412+ virtual ~DBusFocusInfo() {}
413+
414+public Q_SLOTS:
415+
416+ /*
417+ Returns true if the application with the given PID has input focus
418+ */
419+ Q_SCRIPTABLE bool isPidFocused(unsigned int pid);
420+
421+private:
422+ QSet<pid_t> fetchAssociatedPids(pid_t pid);
423+ SessionInterface* findSessionWithPid(const QSet<pid_t> &pidSet);
424+
425+ const QList<Application*> &m_applications;
426+
427+ CGManager *m_cgManager;
428+};
429+
430+} // namespace qtmir
431
432=== modified file 'src/modules/Unity/Application/mirsurface.cpp'
433--- src/modules/Unity/Application/mirsurface.cpp 2016-05-25 13:54:52 +0000
434+++ src/modules/Unity/Application/mirsurface.cpp 2016-07-01 16:20:12 +0000
435@@ -453,6 +453,11 @@
436 }
437 }
438
439+bool MirSurface::activeFocus() const
440+{
441+ return !m_activelyFocusedViews.empty();
442+}
443+
444 void MirSurface::updateActiveFocus()
445 {
446 if (!m_session) {
447
448=== modified file 'src/modules/Unity/Application/mirsurface.h'
449--- src/modules/Unity/Application/mirsurface.h 2016-05-25 13:54:52 +0000
450+++ src/modules/Unity/Application/mirsurface.h 2016-07-01 16:20:12 +0000
451@@ -121,6 +121,7 @@
452 void setFocused(bool focus) override;
453
454 void setViewActiveFocus(qintptr viewId, bool value) override;
455+ bool activeFocus() const override;
456
457 void mousePressEvent(QMouseEvent *event) override;
458 void mouseMoveEvent(QMouseEvent *event) override;
459
460=== modified file 'src/modules/Unity/Application/mirsurfaceinterface.h'
461--- src/modules/Unity/Application/mirsurfaceinterface.h 2016-05-24 20:13:10 +0000
462+++ src/modules/Unity/Application/mirsurfaceinterface.h 2016-07-01 16:20:12 +0000
463@@ -77,6 +77,10 @@
464 the name.
465 */
466 virtual void setViewActiveFocus(qintptr viewId, bool value) = 0;
467+ /*
468+ Whether any view of this surface currently has QML active focus
469+ */
470+ virtual bool activeFocus() const = 0;
471
472 virtual void mousePressEvent(QMouseEvent *event) = 0;
473 virtual void mouseMoveEvent(QMouseEvent *event) = 0;
474
475=== modified file 'src/modules/Unity/Application/session.cpp'
476--- src/modules/Unity/Application/session.cpp 2016-06-14 08:35:56 +0000
477+++ src/modules/Unity/Application/session.cpp 2016-07-01 16:20:12 +0000
478@@ -514,6 +514,23 @@
479 return m_hadSurface;
480 }
481
482+bool Session::activeFocus() const
483+{
484+ for (int i = 0; i < m_surfaceList.count(); ++i) {
485+ auto surface = static_cast<const MirSurfaceInterface*>(m_surfaceList.get(i));
486+ if (surface->activeFocus()) {
487+ return true;
488+ }
489+ }
490+
491+ return false;
492+}
493+
494+pid_t Session::pid() const
495+{
496+ return m_session->process_id();
497+}
498+
499 void Session::setSuspendTimer(AbstractTimer *timer)
500 {
501 bool timerWasRunning = false;
502
503=== modified file 'src/modules/Unity/Application/session.h'
504--- src/modules/Unity/Application/session.h 2016-05-17 19:18:44 +0000
505+++ src/modules/Unity/Application/session.h 2016-07-01 16:20:12 +0000
506@@ -67,6 +67,10 @@
507 bool hadSurface() const override;
508 bool hasClosingSurfaces() const override;
509
510+ bool activeFocus() const override;
511+
512+ pid_t pid() const override;
513+
514 void addChildSession(SessionInterface* session) override;
515 void insertChildSession(uint index, SessionInterface* session) override;
516 void removeChildSession(SessionInterface* session) override;
517
518=== modified file 'src/modules/Unity/Application/session_interface.h'
519--- src/modules/Unity/Application/session_interface.h 2016-05-17 19:18:44 +0000
520+++ src/modules/Unity/Application/session_interface.h 2016-07-01 16:20:12 +0000
521@@ -92,6 +92,12 @@
522 virtual bool hadSurface() const = 0; // whether this session ever had any surface (currently or in the past)
523 virtual bool hasClosingSurfaces() const = 0; // whether it has surfaces being forcibly closed
524
525+ // Whether any of its MirSurfaces has activeFocus()
526+ // See qtmir::MirSurfaceInterface::activeFocus
527+ virtual bool activeFocus() const = 0;
528+
529+ virtual pid_t pid() const = 0;
530+
531 // For SessionManager use
532
533 virtual void addChildSession(SessionInterface* session) = 0;
534
535=== modified file 'src/platforms/mirserver/logging.cpp'
536--- src/platforms/mirserver/logging.cpp 2016-05-03 19:45:51 +0000
537+++ src/platforms/mirserver/logging.cpp 2016-07-01 16:20:12 +0000
538@@ -24,3 +24,4 @@
539 Q_LOGGING_CATEGORY(QTMIR_CLIPBOARD, "qtmir.clipboard")
540 Q_LOGGING_CATEGORY(QTMIR_SENSOR_MESSAGES, "qtmir.sensor")
541 Q_LOGGING_CATEGORY(QTMIR_SCREENS, "qtmir.screens")
542+Q_LOGGING_CATEGORY(QTMIR_DBUS, "qtmir.dbus", QtWarningMsg)
543
544=== modified file 'src/platforms/mirserver/logging.h'
545--- src/platforms/mirserver/logging.h 2015-08-20 10:16:54 +0000
546+++ src/platforms/mirserver/logging.h 2016-07-01 16:20:12 +0000
547@@ -26,5 +26,6 @@
548 Q_DECLARE_LOGGING_CATEGORY(QTMIR_MIR_INPUT)
549 Q_DECLARE_LOGGING_CATEGORY(QTMIR_CLIPBOARD)
550 Q_DECLARE_LOGGING_CATEGORY(QTMIR_SCREENS)
551+Q_DECLARE_LOGGING_CATEGORY(QTMIR_DBUS)
552
553 #endif // UBUNTU_APPLICATION_PLUGIN_LOGGING_H
554
555=== modified file 'tests/framework/fake_mirsurface.h'
556--- tests/framework/fake_mirsurface.h 2016-05-24 20:13:10 +0000
557+++ tests/framework/fake_mirsurface.h 2016-07-01 16:20:12 +0000
558@@ -112,6 +112,7 @@
559 void setFocused(bool focus) override;
560
561 void setViewActiveFocus(qintptr, bool) override {};
562+ bool activeFocus() const override { return false; }
563
564 void mousePressEvent(QMouseEvent *) override;
565 void mouseMoveEvent(QMouseEvent *) override;
566
567=== modified file 'tests/framework/fake_session.h'
568--- tests/framework/fake_session.h 2016-05-24 20:13:10 +0000
569+++ tests/framework/fake_session.h 2016-07-01 16:20:12 +0000
570@@ -58,6 +58,10 @@
571
572 void close() override;
573
574+ bool activeFocus() const override { return false; }
575+
576+ pid_t pid() const override { return 0; }
577+
578 // For SessionManager use
579
580 void addChildSession(SessionInterface*) override;

Subscribers

People subscribed via source and target branches