Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qwaylandivishellintegration.cpp
Go to the documentation of this file.
1
// Copyright (C) 2017 ITAGE Corporation, author: <yusuke.binsaki@itage.co.jp>
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
// Qt-Security score:critical reason:network-protocol
4
5
#
include
"qwaylandivishellintegration.h"
6
7
#
include
<
QtCore
/
qsize
.
h
>
8
#
include
<
QtCore
/
qdebug
.
h
>
9
10
#
include
<
QtWaylandClient
/
private
/
qwaylanddisplay_p
.
h
>
11
#
include
<
QtWaylandClient
/
private
/
qwaylandwindow_p
.
h
>
12
#
include
<
QtWaylandClient
/
private
/
qwaylandabstractdecoration_p
.
h
>
13
14
#
include
"qwaylandivisurface_p.h"
15
16
#
include
<
mutex
>
17
18
#
include
<
unistd
.
h
>
19
20
QT_BEGIN_NAMESPACE
21
22
namespace
QtWaylandClient
{
23
24
class
QWaylandIviController
:
public
QWaylandClientExtensionTemplate
<
QWaylandIviController
>,
25
public
QtWayland
::
ivi_controller
26
{
27
public
:
28
QWaylandIviController
() :
QWaylandClientExtensionTemplate
(1) { }
29
void
initialize
() { QWaylandClientExtensionTemplate::initialize(); }
30
};
31
32
QWaylandIviShellIntegration
::
QWaylandIviShellIntegration
()
33
:
QWaylandShellIntegrationTemplate
(1),
m_iviController
(
new
QWaylandIviController
)
34
{
35
}
36
37
bool
QWaylandIviShellIntegration
::
initialize
(
QWaylandDisplay
*
display
)
38
{
39
QWaylandShellIntegrationTemplate
::
initialize
(
display
);
40
m_iviController
->
initialize
();
41
return
isActive
();
42
}
43
44
/* get unique id
45
* pattern1:
46
* When set QT_IVI_SURFACE_ID, We use it as ID.
47
* Next ID is increment.
48
* pattern2:
49
* When not set QT_IVI_SURFACE_ID, We use process ID and unused bit.
50
* process ID maximum is 2^22. Unused bit is 23 to 32 bit.
51
* Therefor, We use 23 to 32 bit. This do not overlap with other clients.
52
* Next ID is increment of 23 to 32 bit.
53
* +------------+---------------------------+
54
* |31 23|22 0|
55
* +------------+---------------------------+
56
* |0000 0000 00|00 0000 0000 0000 0000 0000|
57
* |<- ID ->|<- process ID ->|
58
* +------------+---------------------------+
59
*/
60
uint32_t
QWaylandIviShellIntegration
::
getNextUniqueSurfaceId
()
61
{
62
const
uint32_t
PID_MAX_EXPONENTIATION
= 22;
// 22 bit shift operation
63
const
uint32_t
ID_LIMIT
= 1 << (32 -
PID_MAX_EXPONENTIATION
);
// 10 bit is unique id
64
const
std
::
lock_guard
<
QRecursiveMutex
>
locker
(
m_mutex
);
65
66
if
(
m_lastSurfaceId
== 0) {
67
QByteArray
env
=
qgetenv
(
"QT_IVI_SURFACE_ID"
);
68
bool
ok
;
69
m_lastSurfaceId
=
env
.
toUInt
(&
ok
, 10);
70
if
(
ok
)
71
m_useEnvSurfaceId
=
true
;
72
else
73
m_lastSurfaceId
=
getpid
();
74
75
return
m_lastSurfaceId
;
76
}
77
78
if
(
m_useEnvSurfaceId
) {
79
m_lastSurfaceId
++;
80
}
else
{
81
m_surfaceNumber
++;
82
if
(
m_surfaceNumber
>=
ID_LIMIT
) {
83
qWarning
(
"IVI surface id counter overflow\n"
);
84
return
0;
85
}
86
m_lastSurfaceId
+= (
m_surfaceNumber
<<
PID_MAX_EXPONENTIATION
);
87
}
88
89
return
m_lastSurfaceId
;
90
}
91
92
QWaylandShellSurface
*
QWaylandIviShellIntegration
::
createShellSurface
(
QWaylandWindow
*
window
)
93
{
94
if
(!
isActive
())
95
return
nullptr
;
96
97
uint32_t
surfaceId
=
getNextUniqueSurfaceId
();
98
if
(
surfaceId
== 0)
99
return
nullptr
;
100
101
struct
ivi_surface
*
surface
=
surface_create
(
surfaceId
,
window
->
wlSurface
());
102
if
(!
m_iviController
->
isActive
())
103
return
new
QWaylandIviSurface
(
surface
,
window
);
104
105
struct
::
ivi_controller_surface
*
controller
=
m_iviController
->
ivi_controller
::
surface_create
(
surfaceId
);
106
QWaylandIviSurface
*
iviSurface
=
new
QWaylandIviSurface
(
surface
,
window
,
controller
);
107
108
if
(
window
->
window
()->
type
() ==
Qt
::
Popup
) {
109
QPoint
transientPos
=
window
->
geometry
().
topLeft
();
// this is absolute
110
QWaylandWindow
*
parent
=
window
->
transientParent
();
111
if
(
parent
&&
parent
->
decoration
()) {
112
transientPos
-=
parent
->
geometry
().
topLeft
();
113
transientPos
.
setX
(
transientPos
.
x
() +
parent
->
decoration
()->
margins
().
left
());
114
transientPos
.
setY
(
transientPos
.
y
() +
parent
->
decoration
()->
margins
().
top
());
115
}
116
QSize
size
=
window
->
windowGeometry
().
size
();
117
iviSurface
->
ivi_controller_surface
::
set_destination_rectangle
(
transientPos
.
x
(),
118
transientPos
.
y
(),
119
size
.
width
(),
120
size
.
height
());
121
}
122
123
return
iviSurface
;
124
}
125
126
}
127
128
QT_END_NAMESPACE
QtWaylandClient::QWaylandIviController
Definition
qwaylandivishellintegration.cpp:26
QtWaylandClient::QWaylandIviController::initialize
void initialize()
Definition
qwaylandivishellintegration.cpp:29
QtWaylandClient::QWaylandIviController::QWaylandIviController
QWaylandIviController()
Definition
qwaylandivishellintegration.cpp:28
QtWaylandClient
Definition
qwaylandclientextension.h:16
qtwayland
src
plugins
shellintegration
ivi-shell
qwaylandivishellintegration.cpp
Generated on
for Qt by
1.16.1