~jhodapp/qtubuntu/qtubuntu_add-live-orientation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
  1. Description
  2. Running
  3. Building
  4. QPA native interface
  5. QPA properties


1. Description
--------------

  QtUbuntu is a set of Qt5 components for the Ubuntu Application
  API. It contains a QPA (Qt Platform Abstraction) plugin based on the
  Ubuntu Application API and a legacy QPA plugin based on the
  compatibility layers. It also provides Qt bindings for Ubuntu
  Application API features that are not exposed through the QPA
  plugins.


2 Running
---------

  Considering the QPA plugin path is correctly set using either the
  QT_QPA_PLATFORM_PLUGIN_PATH environment variable or the
  "-platformpluginpath" command line switch, the following commands
  can be used to run with the Ubuntu QPA plugin:

    $ qmlscene -platform ubuntu Foo.qml
    $ QT_QPA_PLATFORM=ubuntu qmlscene Foo.qml

  and the following ones to run with the Ubuntu legacy QPA plugin:

    $ qmlscene -platform ubuntulegacy Foo.qml
    $ QT_QPA_PLATFORM=ubuntulegacy qmlscene Foo.qml

  The QPA plugins expose the following environment variables:

    QTUBUNTU_SWAPINTERVAL: Specifies the required swap interval as an
                           integer. 1 by default.

    QTUBUNTU_MULTISAMPLE: Enables multisampling with using 4 samples
                          per fragment.

    QTUBUNTU_NO_THREADED_OPENGL: Disables QtQuick threaded OpenGL
                                 rendering.

    QTUBUNTU_NO_INPUT: Disables touchscreen and buttons.

    QTUBUNTU_INPUT_DELAY: Specifies a delay in milliseconds for input
                          initialization (ubuntulegacy plugin only).

    QTUBUNTU_ICON_THEME: Specifies the default icon theme name.


3. Building
-----------

  Here is the process to follow in order to cross-compile the project
  and deploy it to the phone. First, install PBuilder on the chroot
  host:

    $ sudo apt-get install pbuilder

  Get the pbuilder-scripts Ubuntu package hosted on Chinstrap
  (https://chinstrap.canonical.com/~mfrey/newyork/pbuilder-scripts_14_all.deb),
  and install it:

    $ sudo dpkg -i pbuilder-scripts_14_all.deb

  Create the chroot:

    $ pcreate -a armel -d quantal -e "vim apt-transport-https ca-certificates libgles2-mesa-dev libegl1-mesa-dev libudev-dev libfontconfig1-dev libfreetype6-dev libglib2.0-dev" armel-quantal

  Skip the sources.list entry edition pressing "ZZ", then login the
  chroot using the save command:

    $ ptest --save armel-quantal

  Add Manhattan repositories to Apt. See the wiki for the credentials
  (https://wiki.canonical.com/PES/Infrastructure/Repository/CustomerMirrors).

    $ echo "deb https://USER:PASSWORD@cesg.canonical.com/canonical manhattan-quantal-devel public private" >> /etc/apt/sources.list
    $ echo "deb-src https://USER:PASSWORD@cesg.canonical.com/canonical manhattan-quantal-devel public private" >> /etc/apt/sources.list
    $ echo "deb http://ppa.launchpad.net/canonical-qt5-edgers/qt5-proper/ubuntu quantal main" >> /etc/apt/sources.list
    $ apt-get update

  Then install Qt5 and the libhybris development files:

    $ apt-get install -y qt5-default libqt5qml5 libqt5quick5 qtdeclarative5-qtquick2-plugin libhybris-dev

  Exit the chroot saving the current session:

    $ exit

  Files created inside the chroot will be deleted once logging out. In
  order to write files to a filesystem on the chroot host, edit
  .pbuilderrc in your home directory and add the filesystem, for
  example "/media/data", using the BINDMOUNTS option.

    $ echo "BINDMOUNTS=\"/media/data\"" >> ~/.pbuilderrc

  Log back to the chroot:

    $ ptest armel-quantal

  The build environment is now ready. In order to compile QtUbuntu, go
  to the file system set up earlier, generate the makefiles and build:

    $ cd /media/data/qtubuntu
    $ qmake
    $ make

  By default, QtUbuntu compiles a release build. To compile a debug
  build, the following command can be used:

    $ qmake "CONFIG+=debug" && make

  To deploy on the phone, open a new shell outside the chroot and push
  the files to the phone using adb (in the android-tools-adb Quantal
  package). The deploy.sh script at the root directory is meant to do
  that:

    $ ./deploy.sh


4. QPA native interface
-----------------------

  The QPA plugin exposes a native interface allowing to retrieve
  native handles and to filter out native events. In order to retrieve
  native handles, the following code can be used:

    #include <QtGui/QGuiApplication>
    #include <qpa/qplatformnativeinterface.h>
    ...
    QQuickView* view = new QQuickView();
    ...
    QPlatformNativeInterface* native = QGuiApplication::platformNativeInterface();
    printf("app: eglcontext=%p egldisplay=%p\n",
           native->nativeResourceForContext("eglcontext", view->openglContext()),
           native->nativeResourceForWindow("egldisplay", view));

  Note that handles aren't valid until the application mainloop is started. The
  qmake .pro needs to add private gui include directories using

    QT += gui-private

  Some events exposed in the input compatibility layer can't be
  directly mapped to Qt. In order to retrieve such events, a native
  event filter needs to be installed. To do so, a
  QAbstractNativeEventFilter [1] filtering out "Event" events needs to
  be implemented and installed using
  QCoreApplication::installNativeEventFilter [2].

  [1] http://doc-snapshot.qt-project.org/5.0/qabstractnativeeventfilter.html
  [2] http://doc-snapshot.qt-project.org/5.0/qcoreapplication.html#installNativeEventFilter


5. QPA properties
-----------------

  The QPA plugin for Ubuntu looks for a "session" dynamic property on
  the QPlatformNativeInterface object in order to know the session
  type to request. That property can be set to an integer representing
  a SessionType specified in the Ubuntu Application API before the
  first window is shown. In order to request a system session type,
  the following code can be used:

    #include <qpa/qplatformnativeinterface.h>
    ...
    QPlatformNativeInterface* native = QGuiApplication::platformNativeInterface();
    native->setProperty("session", static_cast<int>(USER_SESSION_TYPE));

  The plugin also looks for "role" and "opaque" dynamic properties on
  the QWindow object. The "role" property can be set to an integer
  representing a SurfaceRole and the "opaque" property can be set to 0
  or 1 to specify whether or not the surface shoud be considered
  opaque by the compositor. Note that these properties must be set
  before the window is shown. In order to request a launcher role and
  an opaque window, the following code can be used:

    QQuickView* view = new QQuickView();
    view->setProperty("role", static_cast<int>(LAUNCHER_ACTOR_ROLE));
    view->setProperty("opaque", 1);