1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the QtGui module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see http://www.qt.io/terms-conditions. For further
15 ** information use the contact form at http://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 or version 3 as published by the Free
20 ** Software Foundation and appearing in the file LICENSE.LGPLv21 and
21 ** LICENSE.LGPLv3 included in the packaging of this file. Please review the
22 ** following information to ensure the GNU Lesser General Public License
23 ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
24 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 **
26 ** As a special exception, The Qt Company gives you certain additional
27 ** rights. These rights are described in The Qt Company LGPL Exception
28 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 **
30 ** GNU General Public License Usage
31 ** Alternatively, this file may be used under the terms of the GNU
32 ** General Public License version 3.0 as published by the Free Software
33 ** Foundation and appearing in the file LICENSE.GPL included in the
34 ** packaging of this file. Please review the following information to
35 ** ensure the GNU General Public License version 3.0 requirements will be
36 ** met: http://www.gnu.org/copyleft/gpl.html.
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #include "qcursor.h"
43 #include "qbitmap.h"
44 #include "qscreen_qws.h"
45 #include "qapplication.h"
46 #include "qwindowsystem_qws.h"
47 #include "qwindowsystem_p.h"
48 #include "qwscursor_qws.h"
49
50 QT_BEGIN_NAMESPACE
51
52 #ifndef QT_NO_QWS_CURSOR
53 static QWSCursor *systemCursorTable[Qt::LastCursor+1];
54 static bool systemCursorTableInit = false;
55
56 // 16 x 16
57 static const uchar cur_arrow_bits[] = {
58 0x07, 0x00, 0x39, 0x00, 0xc1, 0x01, 0x02, 0x0e, 0x02, 0x10, 0x02, 0x08,
59 0x04, 0x04, 0x04, 0x02, 0x04, 0x04, 0x88, 0x08, 0x48, 0x11, 0x28, 0x22,
60 0x10, 0x44, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00 };
61 static const uchar mcur_arrow_bits[] = {
62 0x07, 0x00, 0x3f, 0x00, 0xff, 0x01, 0xfe, 0x0f, 0xfe, 0x1f, 0xfe, 0x0f,
63 0xfc, 0x07, 0xfc, 0x03, 0xfc, 0x07, 0xf8, 0x0f, 0x78, 0x1f, 0x38, 0x3e,
64 0x10, 0x7c, 0x00, 0x38, 0x00, 0x10, 0x00, 0x00 };
65
66 static const unsigned char cur_up_arrow_bits[] = {
67 0x80, 0x00, 0x40, 0x01, 0x40, 0x01, 0x20, 0x02, 0x20, 0x02, 0x10, 0x04,
68 0x10, 0x04, 0x08, 0x08, 0x78, 0x0f, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01,
69 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0xc0, 0x01};
70 static const unsigned char mcur_up_arrow_bits[] = {
71 0x80, 0x00, 0xc0, 0x01, 0xc0, 0x01, 0xe0, 0x03, 0xe0, 0x03, 0xf0, 0x07,
72 0xf0, 0x07, 0xf8, 0x0f, 0xf8, 0x0f, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01,
73 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01};
74
75 static const unsigned char cur_cross_bits[] = {
76 0xc0, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01,
77 0x7f, 0x7f, 0x01, 0x40, 0x7f, 0x7f, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01,
78 0x40, 0x01, 0x40, 0x01, 0xc0, 0x01, 0x00, 0x00};
79 static const unsigned char mcur_cross_bits[] = {
80 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01,
81 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01,
82 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0x00, 0x00};
83
84 static const uchar cur_ibeam_bits[] = {
85 0x00, 0x00, 0xe0, 0x03, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00,
86 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00,
87 0x80, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00 };
88 static const uchar mcur_ibeam_bits[] = {
89 0xf0, 0x07, 0xf0, 0x07, 0xf0, 0x07, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01,
90 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01,
91 0xf0, 0x07, 0xf0, 0x07, 0xf0, 0x07, 0x00, 0x00 };
92
93 static const uchar cur_ver_bits[] = {
94 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0xf0, 0x0f,
95 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xf0, 0x0f,
96 0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01, 0x00, 0x00 };
97 static const uchar mcur_ver_bits[] = {
98 0x00, 0x00, 0x80, 0x03, 0xc0, 0x07, 0xe0, 0x0f, 0xf0, 0x1f, 0xf8, 0x3f,
99 0xfc, 0x7f, 0xc0, 0x07, 0xc0, 0x07, 0xc0, 0x07, 0xfc, 0x7f, 0xf8, 0x3f,
100 0xf0, 0x1f, 0xe0, 0x0f, 0xc0, 0x07, 0x80, 0x03 };
101
102 static const uchar cur_hor_bits[] = {
103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x30, 0x18,
104 0x38, 0x38, 0xfc, 0x7f, 0xfc, 0x7f, 0x38, 0x38, 0x30, 0x18, 0x20, 0x08,
105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
106 static const uchar mcur_hor_bits[] = {
107 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0x60, 0x0c, 0x70, 0x1c, 0x78, 0x3c,
108 0xfc, 0x7f, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfc, 0x7f, 0x78, 0x3c,
109 0x70, 0x1c, 0x60, 0x0c, 0x40, 0x04, 0x00, 0x00 };
110 static const uchar cur_bdiag_bits[] = {
111 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x3e, 0x00, 0x3c, 0x00, 0x3e,
112 0x00, 0x37, 0x88, 0x23, 0xd8, 0x01, 0xf8, 0x00, 0x78, 0x00, 0xf8, 0x00,
113 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
114 static const uchar mcur_bdiag_bits[] = {
115 0x00, 0x00, 0xc0, 0x7f, 0x80, 0x7f, 0x00, 0x7f, 0x00, 0x7e, 0x04, 0x7f,
116 0x8c, 0x7f, 0xdc, 0x77, 0xfc, 0x63, 0xfc, 0x41, 0xfc, 0x00, 0xfc, 0x01,
117 0xfc, 0x03, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x00 };
118 static const uchar cur_fdiag_bits[] = {
119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01, 0xf8, 0x00, 0x78, 0x00,
120 0xf8, 0x00, 0xd8, 0x01, 0x88, 0x23, 0x00, 0x37, 0x00, 0x3e, 0x00, 0x3c,
121 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00 };
122 static const uchar mcur_fdiag_bits[] = {
123 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0xfc, 0x03, 0xfc, 0x01, 0xfc, 0x00,
124 0xfc, 0x41, 0xfc, 0x63, 0xdc, 0x77, 0x8c, 0x7f, 0x04, 0x7f, 0x00, 0x7e,
125 0x00, 0x7f, 0x80, 0x7f, 0xc0, 0x7f, 0x00, 0x00 };
126 static const uchar cur_blank_bits[] = {
127 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
130
131 // 20 x 20
132 static const uchar forbidden_bits[] = {
133 0x00,0x00,0x00,0x80,0x1f,0x00,0xe0,0x7f,0x00,0xf0,0xf0,0x00,0x38,0xc0,0x01,
134 0x7c,0x80,0x03,0xec,0x00,0x03,0xce,0x01,0x07,0x86,0x03,0x06,0x06,0x07,0x06,
135 0x06,0x0e,0x06,0x06,0x1c,0x06,0x0e,0x38,0x07,0x0c,0x70,0x03,0x1c,0xe0,0x03,
136 0x38,0xc0,0x01,0xf0,0xe0,0x00,0xe0,0x7f,0x00,0x80,0x1f,0x00,0x00,0x00,0x00 };
137
138 static const uchar forbiddenm_bits[] = {
139 0x80,0x1f,0x00,0xe0,0x7f,0x00,0xf0,0xff,0x00,0xf8,0xff,0x01,0xfc,0xf0,0x03,
140 0xfe,0xc0,0x07,0xfe,0x81,0x07,0xff,0x83,0x0f,0xcf,0x07,0x0f,0x8f,0x0f,0x0f,
141 0x0f,0x1f,0x0f,0x0f,0x3e,0x0f,0x1f,0xfc,0x0f,0x1e,0xf8,0x07,0x3e,0xf0,0x07,
142 0xfc,0xe0,0x03,0xf8,0xff,0x01,0xf0,0xff,0x00,0xe0,0x7f,0x00,0x80,0x1f,0x00};
143
144 // 32 x 32
145 static const uchar wait_data_bits[] = {
146 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
147 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x7f, 0x00,
148 0x00, 0x04, 0x40, 0x00, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0x08, 0x20, 0x00,
149 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00,
150 0x00, 0x50, 0x15, 0x00, 0x00, 0xa0, 0x0a, 0x00, 0x00, 0x40, 0x05, 0x00,
151 0x00, 0x80, 0x02, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x20, 0x08, 0x00,
152 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x21, 0x00, 0x00, 0x88, 0x22, 0x00,
153 0x00, 0x48, 0x25, 0x00, 0x00, 0xa8, 0x2a, 0x00, 0x00, 0xfc, 0x7f, 0x00,
154 0x00, 0x04, 0x40, 0x00, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00,
155 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
157 static const uchar wait_mask_bits[] = {
158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x7f, 0x00,
160 0x00, 0xfc, 0x7f, 0x00, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0xf8, 0x3f, 0x00,
161 0x00, 0xf8, 0x3f, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0xf8, 0x3f, 0x00,
162 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0xc0, 0x07, 0x00,
163 0x00, 0x80, 0x03, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0xe0, 0x0f, 0x00,
164 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0xf8, 0x3f, 0x00,
165 0x00, 0xf8, 0x3f, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0xfc, 0x7f, 0x00,
166 0x00, 0xfc, 0x7f, 0x00, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00,
167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
169
170 static const uchar hsplit_bits[] = {
171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
172 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
173 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00,
174 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00,
175 0x00, 0x41, 0x82, 0x00, 0x80, 0x41, 0x82, 0x01, 0xc0, 0x7f, 0xfe, 0x03,
176 0x80, 0x41, 0x82, 0x01, 0x00, 0x41, 0x82, 0x00, 0x00, 0x40, 0x02, 0x00,
177 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00,
178 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
179 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
181 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
182 static const uchar hsplitm_bits[] = {
183 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
184 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
185 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
186 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe2, 0x47, 0x00, 0x00, 0xe3, 0xc7, 0x00,
187 0x80, 0xe3, 0xc7, 0x01, 0xc0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x07,
188 0xc0, 0xff, 0xff, 0x03, 0x80, 0xe3, 0xc7, 0x01, 0x00, 0xe3, 0xc7, 0x00,
189 0x00, 0xe2, 0x47, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
190 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
191 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
194 static const uchar vsplit_bits[] = {
195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
196 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
197 0x00, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x03, 0x00,
198 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
199 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xff, 0x7f, 0x00,
200 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7f, 0x00,
201 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
202 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00,
203 0x00, 0xc0, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
204 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
205 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
206 static const uchar vsplitm_bits[] = {
207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
209 0x00, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xf0, 0x07, 0x00,
210 0x00, 0xf8, 0x0f, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00,
211 0x00, 0xc0, 0x01, 0x00, 0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x00,
212 0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x00,
213 0x80, 0xff, 0xff, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00,
214 0x00, 0xc0, 0x01, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0xf0, 0x07, 0x00,
215 0x00, 0xe0, 0x03, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00,
216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
218 static const uchar phand_bits[] = {
219 0x00, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00,
220 0x7e, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x70, 0x08, 0x00, 0x00,
221 0x08, 0x08, 0x00, 0x00, 0x70, 0x14, 0x00, 0x00, 0x08, 0x22, 0x00, 0x00,
222 0x30, 0x41, 0x00, 0x00, 0xc0, 0x20, 0x00, 0x00, 0x40, 0x12, 0x00, 0x00,
223 0x80, 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
224 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
227 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
228 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
230 static const uchar phandm_bits[] = {
231 0xfe, 0x01, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00,
232 0xff, 0x0f, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00,
233 0xfc, 0x1f, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0xfc, 0x7f, 0x00, 0x00,
234 0xf8, 0xff, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00,
235 0xc0, 0x1f, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
236 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
237 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
239 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
240 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
242
243 static const uchar size_all_data_bits[] = {
244 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
245 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
246 0x00, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x03, 0x00,
247 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
248 0x00, 0x80, 0x00, 0x00, 0x00, 0x81, 0x40, 0x00, 0x80, 0x81, 0xc0, 0x00,
249 0xc0, 0xff, 0xff, 0x01, 0x80, 0x81, 0xc0, 0x00, 0x00, 0x81, 0x40, 0x00,
250 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
251 0x00, 0x80, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xc0, 0x01, 0x00,
252 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
253 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
254 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
255 static const uchar size_all_mask_bits[] = {
256 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
257 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
258 0x00, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xf0, 0x07, 0x00,
259 0x00, 0xf8, 0x0f, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc2, 0x21, 0x00,
260 0x00, 0xc3, 0x61, 0x00, 0x80, 0xc3, 0xe1, 0x00, 0xc0, 0xff, 0xff, 0x01,
261 0xe0, 0xff, 0xff, 0x03, 0xc0, 0xff, 0xff, 0x01, 0x80, 0xc3, 0xe1, 0x00,
262 0x00, 0xc3, 0x61, 0x00, 0x00, 0xc2, 0x21, 0x00, 0x00, 0xc0, 0x01, 0x00,
263 0x00, 0xf8, 0x0f, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0xe0, 0x03, 0x00,
264 0x00, 0xc0, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
265 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
267
268 static const uchar whatsthis_bits[] = {
269 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0xf0, 0x07, 0x00,
270 0x09, 0x18, 0x0e, 0x00, 0x11, 0x1c, 0x0e, 0x00, 0x21, 0x1c, 0x0e, 0x00,
271 0x41, 0x1c, 0x0e, 0x00, 0x81, 0x1c, 0x0e, 0x00, 0x01, 0x01, 0x07, 0x00,
272 0x01, 0x82, 0x03, 0x00, 0xc1, 0xc7, 0x01, 0x00, 0x49, 0xc0, 0x01, 0x00,
273 0x95, 0xc0, 0x01, 0x00, 0x93, 0xc0, 0x01, 0x00, 0x21, 0x01, 0x00, 0x00,
274 0x20, 0xc1, 0x01, 0x00, 0x40, 0xc2, 0x01, 0x00, 0x40, 0x02, 0x00, 0x00,
275 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
276 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
277 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
278 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
279 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
280 static const uchar whatsthism_bits[] = {
281 0x01, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x07, 0x00, 0x07, 0xf8, 0x0f, 0x00,
282 0x0f, 0xfc, 0x1f, 0x00, 0x1f, 0x3e, 0x1f, 0x00, 0x3f, 0x3e, 0x1f, 0x00,
283 0x7f, 0x3e, 0x1f, 0x00, 0xff, 0x3e, 0x1f, 0x00, 0xff, 0x9d, 0x0f, 0x00,
284 0xff, 0xc3, 0x07, 0x00, 0xff, 0xe7, 0x03, 0x00, 0x7f, 0xe0, 0x03, 0x00,
285 0xf7, 0xe0, 0x03, 0x00, 0xf3, 0xe0, 0x03, 0x00, 0xe1, 0xe1, 0x03, 0x00,
286 0xe0, 0xe1, 0x03, 0x00, 0xc0, 0xe3, 0x03, 0x00, 0xc0, 0xe3, 0x03, 0x00,
287 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
288 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
290 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
292
293 static const uchar busy_bits[] = {
294 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
295 0x09, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
296 0x41, 0xe0, 0xff, 0x00, 0x81, 0x20, 0x80, 0x00, 0x01, 0xe1, 0xff, 0x00,
297 0x01, 0x42, 0x40, 0x00, 0xc1, 0x47, 0x40, 0x00, 0x49, 0x40, 0x55, 0x00,
298 0x95, 0x80, 0x2a, 0x00, 0x93, 0x00, 0x15, 0x00, 0x21, 0x01, 0x0a, 0x00,
299 0x20, 0x01, 0x11, 0x00, 0x40, 0x82, 0x20, 0x00, 0x40, 0x42, 0x44, 0x00,
300 0x80, 0x41, 0x4a, 0x00, 0x00, 0x40, 0x55, 0x00, 0x00, 0xe0, 0xff, 0x00,
301 0x00, 0x20, 0x80, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
302 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
305 static const uchar busym_bits[] = {
306 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
307 0x0f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
308 0x7f, 0xe0, 0xff, 0x00, 0xff, 0xe0, 0xff, 0x00, 0xff, 0xe1, 0xff, 0x00,
309 0xff, 0xc3, 0x7f, 0x00, 0xff, 0xc7, 0x7f, 0x00, 0x7f, 0xc0, 0x7f, 0x00,
310 0xf7, 0x80, 0x3f, 0x00, 0xf3, 0x00, 0x1f, 0x00, 0xe1, 0x01, 0x0e, 0x00,
311 0xe0, 0x01, 0x1f, 0x00, 0xc0, 0x83, 0x3f, 0x00, 0xc0, 0xc3, 0x7f, 0x00,
312 0x80, 0xc1, 0x7f, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0xe0, 0xff, 0x00,
313 0x00, 0xe0, 0xff, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
317
318 // 16 x 16
319 static const uchar openhand_bits[] = {
320 0x80,0x01,0x58,0x0e,0x64,0x12,0x64,0x52,0x48,0xb2,0x48,0x92,
321 0x16,0x90,0x19,0x80,0x11,0x40,0x02,0x40,0x04,0x40,0x04,0x20,
322 0x08,0x20,0x10,0x10,0x20,0x10,0x00,0x00};
323 static const uchar openhandm_bits[] = {
324 0x80,0x01,0xd8,0x0f,0xfc,0x1f,0xfc,0x5f,0xf8,0xff,0xf8,0xff,
325 0xfe,0xff,0xff,0xff,0xff,0x7f,0xfe,0x7f,0xfc,0x7f,0xfc,0x3f,
326 0xf8,0x3f,0xf0,0x1f,0xe0,0x1f,0x00,0x00};
327 static const uchar closedhand_bits[] = {
328 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x0d,0x48,0x32,0x08,0x50,
329 0x10,0x40,0x18,0x40,0x04,0x40,0x04,0x20,0x08,0x20,0x10,0x10,
330 0x20,0x10,0x20,0x10,0x00,0x00,0x00,0x00};
331 static const uchar closedhandm_bits[] = {
332 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x0d,0xf8,0x3f,0xf8,0x7f,
333 0xf0,0x7f,0xf8,0x7f,0xfc,0x7f,0xfc,0x3f,0xf8,0x3f,0xf0,0x1f,
334 0xe0,0x1f,0xe0,0x1f,0x00,0x00,0x00,0x00};
335
336 #endif
337
initializeCursor()338 void QWSServerPrivate::initializeCursor()
339 {
340 Q_Q(QWSServer);
341 // setup system cursors
342 #ifndef QT_NO_QWS_CURSOR
343 // qt_screen->initCursor(sharedram + ramlen,true);
344
345 // default cursor
346 cursor = 0;
347 setCursor(QWSCursor::systemCursor(Qt::ArrowCursor));
348 #endif
349 q->sendMouseEvent(QPoint(swidth/2, sheight/2), 0);
350 }
351
setCursor(QWSCursor * curs)352 void QWSServerPrivate::setCursor(QWSCursor *curs)
353 {
354 #ifdef QT_NO_QWS_CURSOR
355 Q_UNUSED(curs);
356 #else
357 if (cursor == curs)
358 return;
359
360 cursor = curs;
361
362 if (!haveviscurs || !curs)
363 curs = QWSCursor::systemCursor(Qt::BlankCursor);
364
365 if (qt_screencursor) {
366 qt_screencursor->set(curs->image(),
367 curs->hotSpot().x(),
368 curs->hotSpot().y());
369 }
370 #endif
371 }
372
373 #ifndef QT_NO_QWS_CURSOR
cleanupSystemCursorTable()374 static void cleanupSystemCursorTable()
375 {
376 for (int i = 0; i <= Qt::LastCursor; i++)
377 if (systemCursorTable[i]) {
378 delete systemCursorTable[i];
379 systemCursorTable[i] = 0;
380 }
381 }
382 #endif
383
createSystemCursor(int id)384 void QWSCursor::createSystemCursor(int id)
385 {
386 #ifdef QT_NO_QWS_CURSOR
387 Q_UNUSED(id);
388 #else
389 if (!systemCursorTableInit) {
390 for (int i = 0; i <= Qt::LastCursor; i++)
391 systemCursorTable[i] = 0;
392 qAddPostRoutine(cleanupSystemCursorTable);
393 systemCursorTableInit = true;
394 }
395 switch (id) {
396 // 16x16 cursors
397 case Qt::ArrowCursor:
398 systemCursorTable[Qt::ArrowCursor] =
399 new QWSCursor(cur_arrow_bits, mcur_arrow_bits, 16, 16, 0, 0);
400 break;
401
402 case Qt::UpArrowCursor:
403 systemCursorTable[Qt::UpArrowCursor] =
404 new QWSCursor(cur_up_arrow_bits, mcur_up_arrow_bits, 16, 16, 7, 0);
405 break;
406
407 case Qt::CrossCursor:
408 systemCursorTable[Qt::CrossCursor] =
409 new QWSCursor(cur_cross_bits, mcur_cross_bits, 16, 16, 7, 7);
410 break;
411
412 case Qt::IBeamCursor:
413 systemCursorTable[Qt::IBeamCursor] =
414 new QWSCursor(cur_ibeam_bits, mcur_ibeam_bits, 16, 16, 7, 7);
415 break;
416
417 case Qt::SizeVerCursor:
418 systemCursorTable[Qt::SizeVerCursor] =
419 new QWSCursor(cur_ver_bits, mcur_ver_bits, 16, 16, 7, 7);
420 break;
421
422 case Qt::SizeHorCursor:
423 systemCursorTable[Qt::SizeHorCursor] =
424 new QWSCursor(cur_hor_bits, mcur_hor_bits, 16, 16, 7, 7);
425 break;
426
427 case Qt::SizeBDiagCursor:
428 systemCursorTable[Qt::SizeBDiagCursor] =
429 new QWSCursor(cur_bdiag_bits, mcur_bdiag_bits, 16, 16, 7, 7);
430 break;
431
432 case Qt::SizeFDiagCursor:
433 systemCursorTable[Qt::SizeFDiagCursor] =
434 new QWSCursor(cur_fdiag_bits, mcur_fdiag_bits, 16, 16, 7, 7);
435 break;
436
437 case Qt::BlankCursor:
438 systemCursorTable[Qt::BlankCursor] =
439 new QWSCursor(0, 0, 0, 0, 0, 0);
440 break;
441
442 // 20x20 cursors
443 case Qt::ForbiddenCursor:
444 systemCursorTable[Qt::ForbiddenCursor] =
445 new QWSCursor(forbidden_bits, forbiddenm_bits, 20, 20, 10, 10);
446 break;
447
448 // 32x32 cursors
449 case Qt::WaitCursor:
450 systemCursorTable[Qt::WaitCursor] =
451 new QWSCursor(wait_data_bits, wait_mask_bits, 32, 32, 15, 15);
452 break;
453
454 case Qt::SplitVCursor:
455 systemCursorTable[Qt::SplitVCursor] =
456 new QWSCursor(vsplit_bits, vsplitm_bits, 32, 32, 15, 15);
457 break;
458
459 case Qt::SplitHCursor:
460 systemCursorTable[Qt::SplitHCursor] =
461 new QWSCursor(hsplit_bits, hsplitm_bits, 32, 32, 15, 15);
462 break;
463
464 case Qt::SizeAllCursor:
465 systemCursorTable[Qt::SizeAllCursor] =
466 new QWSCursor(size_all_data_bits, size_all_mask_bits, 32, 32, 15, 15);
467 break;
468
469 case Qt::PointingHandCursor:
470 systemCursorTable[Qt::PointingHandCursor] =
471 new QWSCursor(phand_bits, phandm_bits, 32, 32, 0, 0);
472 break;
473
474 case Qt::WhatsThisCursor:
475 systemCursorTable[Qt::WhatsThisCursor] =
476 new QWSCursor(whatsthis_bits, whatsthism_bits, 32, 32, 0, 0);
477 break;
478 case Qt::BusyCursor:
479 systemCursorTable[Qt::BusyCursor] =
480 new QWSCursor(busy_bits, busym_bits, 32, 32, 0, 0);
481 break;
482
483 case Qt::OpenHandCursor:
484 systemCursorTable[Qt::OpenHandCursor] =
485 new QWSCursor(openhand_bits, openhandm_bits, 16, 16, 8, 8);
486 break;
487 case Qt::ClosedHandCursor:
488 systemCursorTable[Qt::ClosedHandCursor] =
489 new QWSCursor(closedhand_bits, closedhandm_bits, 16, 16, 8, 8);
490 break;
491 default:
492 qWarning("Unknown system cursor %d", id);
493 }
494 #endif
495 }
496
systemCursor(int id)497 QWSCursor *QWSCursor::systemCursor(int id)
498 {
499 QWSCursor *cursor = 0;
500 #ifdef QT_NO_QWS_CURSOR
501 Q_UNUSED(id);
502 #else
503 if (id >= 0 && id <= Qt::LastCursor) {
504 if (!systemCursorTable[id])
505 createSystemCursor(id);
506 cursor = systemCursorTable[id];
507 }
508
509 if (cursor == 0) {
510 if (!systemCursorTable[Qt::ArrowCursor])
511 createSystemCursor(Qt::ArrowCursor);
512 cursor = systemCursorTable[Qt::ArrowCursor];
513 }
514 #endif
515 return cursor;
516 }
517
set(const uchar * data,const uchar * mask,int width,int height,int hx,int hy)518 void QWSCursor::set(const uchar *data, const uchar *mask,
519 int width, int height, int hx, int hy)
520 {
521 #ifdef QT_NO_QWS_CURSOR
522 Q_UNUSED(data);
523 Q_UNUSED(mask);
524 Q_UNUSED(width);
525 Q_UNUSED(height);
526 Q_UNUSED(hx);
527 Q_UNUSED(hy);
528 #else
529 hot.setX(hx);
530 hot.setY(hy);
531
532 cursor = QImage(width,height, QImage::Format_Indexed8);
533
534 if (!width || !height || !data || !mask || cursor.isNull())
535 return;
536
537 cursor.setColorCount(3);
538 cursor.setColor(0, 0xff000000);
539 cursor.setColor(1, 0xffffffff);
540 cursor.setColor(2, 0x00000000);
541
542 int bytesPerLine = (width + 7) / 8;
543 int p = 0;
544 int d, m;
545
546 int x = -1, w = 0;
547
548 uchar *cursor_data = cursor.bits();
549 int bpl = cursor.bytesPerLine();
550 for (int i = 0; i < height; i++)
551 {
552 for (int j = 0; j < bytesPerLine; j++, data++, mask++)
553 {
554 for (int b = 0; b < 8 && j*8+b < width; b++)
555 {
556 d = *data & (1 << b);
557 m = *mask & (1 << b);
558 if (d && m) p = 0;
559 else if (!d && m) p = 1;
560 else p = 2;
561 cursor_data[j*8+b] = p;
562
563 // calc region
564 if (x < 0 && m)
565 x = j*8+b;
566 else if (x >= 0 && !m) {
567 x = -1;
568 w = 0;
569 }
570 if (m)
571 w++;
572 }
573 }
574 if (x >= 0) {
575 x = -1;
576 w = 0;
577 }
578 cursor_data += bpl;
579 }
580
581 if (qt_screencursor && qt_screencursor->supportsAlphaCursor())
582 createDropShadow(5, 2);
583 #endif
584 }
585
586 // now we're really silly
createDropShadow(int dropx,int dropy)587 void QWSCursor::createDropShadow(int dropx, int dropy)
588 {
589 //####
590 #if 1 || defined(QT_NO_QWS_CURSOR) || defined(QT_NO_QWS_ALHPA_CURSOR)
591 Q_UNUSED(dropx);
592 Q_UNUSED(dropy);
593 #else
594 if (cursor.width() + dropx > 64 || cursor.height() + dropy > 64)
595 return;
596
597 if (!cursor.hasAlphaBuffer()) {
598 cursor.setAlphaBuffer(true);
599
600 const int nblur=4;
601 const int darkness=140;
602
603 QImage drop(cursor.width()+dropx+nblur, cursor.height()+dropy+nblur, 8, 18);
604 drop.setColor(0, 0xff000000); // bg (black)
605 drop.setColor(1, 0xffffffff); // fg (white)
606 for (int i=0; i<16; i++) {
607 drop.setColor(2+i, (darkness*i/16)<<24);
608 }
609 drop.fill(2); // all trans
610 QImage drop2 = drop.copy();
611
612 int cp;
613
614 // made solid shadow
615 for (int row = 0; row < cursor.height(); row++) {
616 for (int col = 0; col < cursor.width(); col++) {
617 cp = cursor.pixelIndex(col, row);
618 if (cp != 2)
619 drop.setPixel(col+dropx, row+dropy, 17);
620 }
621 }
622
623 // blur shadow
624 for (int blur=0; blur<nblur; blur++) {
625 QImage& to((blur&1)?drop:drop2);
626 QImage& from((blur&1)?drop2:drop);
627 for (int row = 1; row < drop.height()-1; row++) {
628 for (int col = 1; col < drop.width()-1; col++) {
629 int t=0;
630 for (int dx=-1; dx<=1; dx++) {
631 for (int dy=-1; dy<=1; dy++) {
632 t += from.pixelIndex(col+dx,row+dy)-2;
633 }
634 }
635 to.setPixel(col,row,2+t/9);
636 }
637 }
638 }
639
640 // copy cursor
641 for (int row = 0; row < cursor.height(); row++) {
642 for (int col = 0; col < cursor.width(); col++) {
643 cp = cursor.pixelIndex(col, row);
644 if (cp != 2)
645 drop.setPixel(col, row, cp);
646 }
647 }
648
649 cursor = drop;
650 }
651 #endif
652 }
653
654 QT_END_NAMESPACE
655