11#include <QtGui/QWindow>
12#include <QtGui/QBitmap>
13#include <QtGui/private/qguiapplication_p.h>
14#include <qpa/qplatformtheme.h>
16#if QT_CONFIG(xcb_xlib)
17#include <X11/cursorfont.h>
22#include <xcb/xfixes.h>
23#include <xcb/xcb_image.h>
27using namespace Qt::StringLiterals;
35 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
36 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
37 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
40 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0xf0, 0x0f,
41 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xf0, 0x0f,
42 0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01, 0x00, 0x00 };
44 0x00, 0x00, 0x80, 0x03, 0xc0, 0x07, 0xe0, 0x0f, 0xf0, 0x1f, 0xf8, 0x3f,
45 0xfc, 0x7f, 0xc0, 0x07, 0xc0, 0x07, 0xc0, 0x07, 0xfc, 0x7f, 0xf8, 0x3f,
46 0xf0, 0x1f, 0xe0, 0x0f, 0xc0, 0x07, 0x80, 0x03 };
48 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x30, 0x18,
49 0x38, 0x38, 0xfc, 0x7f, 0xfc, 0x7f, 0x38, 0x38, 0x30, 0x18, 0x20, 0x08,
50 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
52 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0x60, 0x0c, 0x70, 0x1c, 0x78, 0x3c,
53 0xfc, 0x7f, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfc, 0x7f, 0x78, 0x3c,
54 0x70, 0x1c, 0x60, 0x0c, 0x40, 0x04, 0x00, 0x00 };
56 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x3e, 0x00, 0x3c, 0x00, 0x3e,
57 0x00, 0x37, 0x88, 0x23, 0xd8, 0x01, 0xf8, 0x00, 0x78, 0x00, 0xf8, 0x00,
58 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
60 0x00, 0x00, 0xc0, 0x7f, 0x80, 0x7f, 0x00, 0x7f, 0x00, 0x7e, 0x04, 0x7f,
61 0x8c, 0x7f, 0xdc, 0x77, 0xfc, 0x63, 0xfc, 0x41, 0xfc, 0x00, 0xfc, 0x01,
62 0xfc, 0x03, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x00 };
64 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01, 0xf8, 0x00, 0x78, 0x00,
65 0xf8, 0x00, 0xd8, 0x01, 0x88, 0x23, 0x00, 0x37, 0x00, 0x3e, 0x00, 0x3c,
66 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00 };
68 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0xfc, 0x03, 0xfc, 0x01, 0xfc, 0x00,
69 0xfc, 0x41, 0xfc, 0x63, 0xdc, 0x77, 0x8c, 0x7f, 0x04, 0x7f, 0x00, 0x7e,
70 0x00, 0x7f, 0x80, 0x7f, 0xc0, 0x7f, 0x00, 0x00 };
77 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
78 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
79 0x00, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x03, 0x00,
80 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
81 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xff, 0x7f, 0x00,
82 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7f, 0x00,
83 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
84 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00,
85 0x00, 0xc0, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
86 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
87 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
89 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
90 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
91 0x00, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xf0, 0x07, 0x00,
92 0x00, 0xf8, 0x0f, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00,
93 0x00, 0xc0, 0x01, 0x00, 0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x00,
94 0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x00,
95 0x80, 0xff, 0xff, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00,
96 0x00, 0xc0, 0x01, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0xf0, 0x07, 0x00,
97 0x00, 0xe0, 0x03, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00,
98 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
99 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
103 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00,
104 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00,
105 0x00, 0x41, 0x82, 0x00, 0x80, 0x41, 0x82, 0x01, 0xc0, 0x7f, 0xfe, 0x03,
106 0x80, 0x41, 0x82, 0x01, 0x00, 0x41, 0x82, 0x00, 0x00, 0x40, 0x02, 0x00,
107 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00,
108 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
115 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
116 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe2, 0x47, 0x00, 0x00, 0xe3, 0xc7, 0x00,
117 0x80, 0xe3, 0xc7, 0x01, 0xc0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x07,
118 0xc0, 0xff, 0xff, 0x03, 0x80, 0xe3, 0xc7, 0x01, 0x00, 0xe3, 0xc7, 0x00,
119 0x00, 0xe2, 0x47, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
120 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
125 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0xf0, 0x07, 0x00,
126 0x09, 0x18, 0x0e, 0x00, 0x11, 0x1c, 0x0e, 0x00, 0x21, 0x1c, 0x0e, 0x00,
127 0x41, 0x1c, 0x0e, 0x00, 0x81, 0x1c, 0x0e, 0x00, 0x01, 0x01, 0x07, 0x00,
128 0x01, 0x82, 0x03, 0x00, 0xc1, 0xc7, 0x01, 0x00, 0x49, 0xc0, 0x01, 0x00,
129 0x95, 0xc0, 0x01, 0x00, 0x93, 0xc0, 0x01, 0x00, 0x21, 0x01, 0x00, 0x00,
130 0x20, 0xc1, 0x01, 0x00, 0x40, 0xc2, 0x01, 0x00, 0x40, 0x02, 0x00, 0x00,
131 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
132 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
137 0x01, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x07, 0x00, 0x07, 0xf8, 0x0f, 0x00,
138 0x0f, 0xfc, 0x1f, 0x00, 0x1f, 0x3e, 0x1f, 0x00, 0x3f, 0x3e, 0x1f, 0x00,
139 0x7f, 0x3e, 0x1f, 0x00, 0xff, 0x3e, 0x1f, 0x00, 0xff, 0x9d, 0x0f, 0x00,
140 0xff, 0xc3, 0x07, 0x00, 0xff, 0xe7, 0x03, 0x00, 0x7f, 0xe0, 0x03, 0x00,
141 0xf7, 0xe0, 0x03, 0x00, 0xf3, 0xe0, 0x03, 0x00, 0xe1, 0xe1, 0x03, 0x00,
142 0xe0, 0xe1, 0x03, 0x00, 0xc0, 0xe3, 0x03, 0x00, 0xc0, 0xe3, 0x03, 0x00,
143 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
144 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
146 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
147 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
149 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
150 0x09, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
151 0x41, 0xe0, 0xff, 0x00, 0x81, 0x20, 0x80, 0x00, 0x01, 0xe1, 0xff, 0x00,
152 0x01, 0x42, 0x40, 0x00, 0xc1, 0x47, 0x40, 0x00, 0x49, 0x40, 0x55, 0x00,
153 0x95, 0x80, 0x2a, 0x00, 0x93, 0x00, 0x15, 0x00, 0x21, 0x01, 0x0a, 0x00,
154 0x20, 0x01, 0x11, 0x00, 0x40, 0x82, 0x20, 0x00, 0x40, 0x42, 0x44, 0x00,
155 0x80, 0x41, 0x4a, 0x00, 0x00, 0x40, 0x55, 0x00, 0x00, 0xe0, 0xff, 0x00,
156 0x00, 0x20, 0x80, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
161 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
162 0x0f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
163 0x7f, 0xe0, 0xff, 0x00, 0xff, 0xe0, 0xff, 0x00, 0xff, 0xe1, 0xff, 0x00,
164 0xff, 0xc3, 0x7f, 0x00, 0xff, 0xc7, 0x7f, 0x00, 0x7f, 0xc0, 0x7f, 0x00,
165 0xf7, 0x80, 0x3f, 0x00, 0xf3, 0x00, 0x1f, 0x00, 0xe1, 0x01, 0x0e, 0x00,
166 0xe0, 0x01, 0x1f, 0x00, 0xc0, 0x83, 0x3f, 0x00, 0xc0, 0xc3, 0x7f, 0x00,
167 0x80, 0xc1, 0x7f, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0xe0, 0xff, 0x00,
168 0x00, 0xe0, 0xff, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
179 0x00,0x00,0x00,0x80,0x1f,0x00,0xe0,0x7f,0x00,0xf0,0xf0,0x00,0x38,0xc0,0x01,
180 0x7c,0x80,0x03,0xec,0x00,0x03,0xce,0x01,0x07,0x86,0x03,0x06,0x06,0x07,0x06,
181 0x06,0x0e,0x06,0x06,0x1c,0x06,0x0e,0x38,0x07,0x0c,0x70,0x03,0x1c,0xe0,0x03,
182 0x38,0xc0,0x01,0xf0,0xe0,0x00,0xe0,0x7f,0x00,0x80,0x1f,0x00,0x00,0x00,0x00 };
185 0x80,0x1f,0x00,0xe0,0x7f,0x00,0xf0,0xff,0x00,0xf8,0xff,0x01,0xfc,0xf0,0x03,
186 0xfe,0xc0,0x07,0xfe,0x81,0x07,0xff,0x83,0x0f,0xcf,0x07,0x0f,0x8f,0x0f,0x0f,
187 0x0f,0x1f,0x0f,0x0f,0x3e,0x0f,0x1f,0xfc,0x0f,0x1e,0xf8,0x07,0x3e,0xf0,0x07,
188 0xfc,0xe0,0x03,0xf8,0xff,0x01,0xf0,0xff,0x00,0xe0,0x7f,0x00,0x80,0x1f,0x00};
191 0x80,0x01,0x58,0x0e,0x64,0x12,0x64,0x52,0x48,0xb2,0x48,0x92,
192 0x16,0x90,0x19,0x80,0x11,0x40,0x02,0x40,0x04,0x40,0x04,0x20,
193 0x08,0x20,0x10,0x10,0x20,0x10,0x00,0x00};
195 0x80,0x01,0xd8,0x0f,0xfc,0x1f,0xfc,0x5f,0xf8,0xff,0xf8,0xff,
196 0xf6,0xff,0xff,0xff,0xff,0x7f,0xfe,0x7f,0xfc,0x7f,0xfc,0x3f,
197 0xf8,0x3f,0xf0,0x1f,0xe0,0x1f,0x00,0x00};
199 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x0d,0x48,0x32,0x08,0x50,
200 0x10,0x40,0x18,0x40,0x04,0x40,0x04,0x20,0x08,0x20,0x10,0x10,
201 0x20,0x10,0x20,0x10,0x00,0x00,0x00,0x00};
203 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x0d,0xf8,0x3f,0xf8,0x7f,
204 0xf0,0x7f,0xf8,0x7f,0xfc,0x7f,0xfc,0x3f,0xf8,0x3f,0xf0,0x1f,
205 0xe0,0x1f,0xe0,0x1f,0x00,0x00,0x00,0x00};
213 {
"left_ptr",
"default",
"top_left_arrow",
"left_arrow" },
216 {
"wait",
"watch",
"0426c94ea35c87780ff01dc239897213" },
217 {
"ibeam",
"text",
"xterm" },
218 {
"size_ver",
"ns-resize",
"v_double_arrow",
"00008160000006810000408080010102" },
219 {
"size_hor",
"ew-resize",
"h_double_arrow",
"028006030e0e7ebffc7f7070c0600140" },
220 {
"size_bdiag",
"nesw-resize",
"50585d75b494802d0151028115016902",
"fcf1c3c7cd4491d801f1e1c78f100000" },
221 {
"size_fdiag",
"nwse-resize",
"38c5dff7c7b8962045400281044508d2",
"c7088f0f3e6c8088236ef8e1e3e70000" },
224 {
"split_v",
"row-resize",
"sb_v_double_arrow",
"2870a09082c103050810ffdffffe0204",
"c07385c7190e701020ff7ffffd08103c" },
225 {
"split_h",
"col-resize",
"sb_h_double_arrow",
"043a9f68147c53184671403ffa811cc5",
"14fef782d02440884392942c11205230" },
226 {
"pointing_hand",
"pointer",
"hand1",
"e29285e634086352946a0e7090d73106" },
227 {
"forbidden",
"not-allowed",
"crossed_circle",
"circle",
"03b6e0fcb3499374a867c041f52298f0" },
228 {
"whats_this",
"help",
"question_arrow",
"5c6cd98b3f3ebcb1f9c7f1c204630408",
"d9ce0ab605698f320427677b458ad60b" },
229 {
"left_ptr_watch",
"half-busy",
"progress",
"00000000000000020006000e7e9ffc3f",
"08e8e1c95fe2fc01f976f1e063a24ccd" },
230 {
"openhand",
"grab",
"fleur",
"5aca4d189052212118709018842178c0",
"9d800788f1b08800ae810202380a0822" },
231 {
"closedhand",
"grabbing",
"208530c400c041818281048008011002" },
232 {
"dnd-copy",
"copy" },
233 {
"dnd-move",
"move" },
234 {
"dnd-link",
"link" }
237QXcbCursorCacheKey::QXcbCursorCacheKey(
const QCursor &c)
238 : shape(c.shape()), bitmapCacheKey(0), maskCacheKey(0)
240 if (shape == Qt::BitmapCursor) {
241 const qint64 pixmapCacheKey = c.pixmap().cacheKey();
242 if (pixmapCacheKey) {
243 bitmapCacheKey = pixmapCacheKey;
245 Q_ASSERT(!c.bitmap().isNull());
246 Q_ASSERT(!c.mask().isNull());
247 bitmapCacheKey = c.bitmap().cacheKey();
248 maskCacheKey = c.mask().cacheKey();
251 hotspotCacheKey.x = c.hotSpot().x();
252 hotspotCacheKey.y = c.hotSpot().y();
262 m_bitmapCache.setMaxCost(8);
271 const char *cursorStr =
"cursor";
279 if (m_callbackForPropertyRegistered) {
280 m_screen->xSettings()->removeCallbackForHandle(
this);
287 for (xcb_cursor_t cursor : std::as_const(m_cursorHash))
288 xcb_free_cursor(conn, cursor);
292 xcb_cursor_context_free(m_cursorContext);
297 if (
const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
298 return theme->themeHint(QPlatformTheme::MouseCursorSize).toSize();
299 return QSize(24, 24);
305 xcb_cursor_context_free(m_cursorContext);
307 m_cursorContext =
nullptr;
310 if (xcb_cursor_context_new(conn, m_screen->screen(), &m_cursorContext) < 0) {
311 qWarning() <<
"xcb: Could not initialize xcb-cursor";
312 m_cursorContext =
nullptr;
319 if (!window || !window->handle())
322 xcb_cursor_t c = XCB_CURSOR_NONE;
324 const QXcbCursorCacheKey key(*cursor);
325 const Qt::CursorShape shape = cursor->shape();
327 if (shape == Qt::BitmapCursor) {
328 auto *bitmap = m_bitmapCache.object(key);
332 c = createBitmapCursor(cursor);
336 auto it = m_cursorHash.find(key);
337 if (it == m_cursorHash.end()) {
338 c = createFontCursor(shape);
339 m_cursorHash.insert(key, c);
346 auto *w =
static_cast<QXcbWindow *>(window->handle());
347 xcb_change_window_attributes(
xcb_connection(), w->xcb_window(), XCB_CW_CURSOR, &c);
355 case Qt::ArrowCursor:
358 case Qt::UpArrowCursor:
361 case Qt::CrossCursor:
367 case Qt::IBeamCursor:
370 case Qt::SizeAllCursor:
373 case Qt::PointingHandCursor:
376 case Qt::SizeBDiagCursor:
379 case Qt::SizeFDiagCursor:
382 case Qt::SizeVerCursor:
383 case Qt::SplitVCursor:
386 case Qt::SizeHorCursor:
387 case Qt::SplitHCursor:
390 case Qt::WhatsThisCursor:
393 case Qt::ForbiddenCursor:
405xcb_cursor_t
QXcbCursor::createNonStandardCursor(
int cshape)
407 xcb_cursor_t cursor = 0;
410 if (cshape == Qt::BlankCursor) {
411 xcb_pixmap_t cp = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(),
cur_blank_bits, 16, 16,
413 xcb_pixmap_t mp = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(),
cur_blank_bits, 16, 16,
415 cursor = xcb_generate_id(conn);
416 xcb_create_cursor(conn, cursor, cp, mp, 0, 0, 0, 0xFFFF, 0xFFFF, 0xFFFF, 8, 8);
417 }
else if (cshape >= Qt::SizeVerCursor && cshape < Qt::SizeAllCursor) {
418 int i = (cshape - Qt::SizeVerCursor) * 2;
419 xcb_pixmap_t pm = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(),
421 16, 16, 1, 0, 0,
nullptr);
422 xcb_pixmap_t pmm = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(),
424 16, 16, 1, 0, 0,
nullptr);
425 cursor = xcb_generate_id(conn);
426 xcb_create_cursor(conn, cursor, pm, pmm, 0, 0, 0, 0xFFFF, 0xFFFF, 0xFFFF, 8, 8);
427 }
else if ((cshape >= Qt::SplitVCursor && cshape <= Qt::SplitHCursor)
428 || cshape == Qt::WhatsThisCursor || cshape == Qt::BusyCursor) {
429 int i = (cshape - Qt::SplitVCursor) * 2;
430 xcb_pixmap_t pm = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(),
432 32, 32, 1, 0, 0,
nullptr);
433 xcb_pixmap_t pmm = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(),
435 32, 32, 1, 0, 0,
nullptr);
436 int hs = (cshape == Qt::PointingHandCursor || cshape == Qt::WhatsThisCursor
437 || cshape == Qt::BusyCursor) ? 0 : 16;
438 cursor = xcb_generate_id(conn);
439 xcb_create_cursor(conn, cursor, pm, pmm, 0, 0, 0, 0xFFFF, 0xFFFF, 0xFFFF, hs, hs);
440 }
else if (cshape == Qt::ForbiddenCursor) {
441 int i = (cshape - Qt::ForbiddenCursor) * 2;
442 xcb_pixmap_t pm = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(),
444 20, 20, 1, 0, 0,
nullptr);
445 xcb_pixmap_t pmm = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(),
447 20, 20, 1, 0, 0,
nullptr);
448 cursor = xcb_generate_id(conn);
449 xcb_create_cursor(conn, cursor, pm, pmm, 0, 0, 0, 0xFFFF, 0xFFFF, 0xFFFF, 10, 10);
450 }
else if (cshape == Qt::OpenHandCursor || cshape == Qt::ClosedHandCursor) {
451 bool open = cshape == Qt::OpenHandCursor;
452 xcb_pixmap_t pm = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(),
454 16, 16, 1, 0, 0,
nullptr);
455 xcb_pixmap_t pmm = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(),
457 16, 16, 1, 0, 0,
nullptr);
458 cursor = xcb_generate_id(conn);
459 xcb_create_cursor(conn, cursor, pm, pmm, 0, 0, 0, 0xFFFF, 0xFFFF, 0xFFFF, 8, 8);
460 }
else if (cshape == Qt::DragCopyCursor || cshape == Qt::DragMoveCursor
461 || cshape == Qt::DragLinkCursor) {
462 QImage image = QGuiApplicationPrivate::instance()->getPixmapCursor(
static_cast<Qt::CursorShape>(cshape)).toImage();
463 if (!image.isNull()) {
464 xcb_pixmap_t pm = qt_xcb_XPixmapFromBitmap(m_screen, image);
465 xcb_pixmap_t pmm = qt_xcb_XPixmapFromBitmap(m_screen, image.createAlphaMask());
466 cursor = xcb_generate_id(conn);
467 xcb_create_cursor(conn, cursor, pm, pmm, 0, 0, 0, 0xFFFF, 0xFFFF, 0xFFFF, 8, 8);
468 xcb_free_pixmap(conn, pm);
469 xcb_free_pixmap(conn, pmm);
482 self->m_cursorHash.clear();
486xcb_cursor_t
QXcbCursor::createFontCursor(
int cshape)
488 if (!m_cursorContext)
493 xcb_cursor_t cursor = XCB_NONE;
495 if (!m_callbackForPropertyRegistered && m_screen->xSettings()->initialized()) {
496 m_screen->xSettings()->registerCallbackForProperty(
"Gtk/CursorThemeName", cursorThemePropertyChanged,
this);
498 m_callbackForPropertyRegistered =
true;
502 if (cshape >= 0 && cshape <= Qt::LastCursor) {
503 for (
const char *cursorName : cursorNames[cshape]) {
504 cursor = xcb_cursor_load_cursor(m_cursorContext, cursorName);
505 if (cursor != XCB_NONE)
511 cursor = createNonStandardCursor(cshape);
514 if (!cursor && cursorId) {
515 cursor = xcb_generate_id(conn);
517 cursorId, cursorId + 1,
518 0xFFFF, 0xFFFF, 0xFFFF, 0, 0, 0);
521 if (cursor && cshape >= 0 && cshape < Qt::LastCursor && connection()->hasXFixes()) {
522 const char *name = cursorNames[cshape].front();
523 xcb_xfixes_set_cursor_name(conn, cursor, strlen(name), name);
529xcb_cursor_t
QXcbCursor::createBitmapCursor(QCursor *cursor)
531 QPoint spot = cursor->hotSpot();
532 xcb_cursor_t c = XCB_NONE;
533 if (cursor->pixmap().depth() > 1) {
534 if (connection()->hasXRender(0, 5))
535 c = qt_xcb_createCursorXRender(m_screen, cursor->pixmap().toImage(), spot);
537 qCWarning(lcQpaXcb,
"xrender >= 0.5 required to create pixmap cursors");
540 xcb_pixmap_t cp = qt_xcb_XPixmapFromBitmap(m_screen, cursor->bitmap().toImage());
541 xcb_pixmap_t mp = qt_xcb_XPixmapFromBitmap(m_screen, cursor->mask().toImage());
542 c = xcb_generate_id(conn);
543 xcb_create_cursor(conn, c, cp, mp, 0, 0, 0, 0xFFFF, 0xFFFF, 0xFFFF,
545 xcb_free_pixmap(conn, cp);
546 xcb_free_pixmap(conn, mp);
553
554
555
556
557
563 xcb_window_t root = c->primaryVirtualDesktop()->root();
565 auto reply =
Q_XCB_REPLY(xcb_query_pointer, c->xcb_connection(), root);
567 if (virtualDesktop) {
568 const auto virtualDesktops = c->virtualDesktops();
569 for (QXcbVirtualDesktop *vd : virtualDesktops) {
570 if (vd->root() == reply->root) {
571 *virtualDesktop = vd;
577 *pos = QPoint(reply->root_x, reply->root_y);
579 *keybMask = reply->mask;
587 queryPointer(connection(),
nullptr, &p);
594 queryPointer(connection(), &virtualDesktop,
nullptr);
void changeCursor(QCursor *cursor, QWindow *window) override
This method is called by Qt whenever the cursor graphic should be changed.
QPoint pos() const override
QXcbCursor(QXcbConnection *conn, QXcbScreen *screen)
void setPos(const QPoint &pos) override
QSize size() const override
Returns the size of the cursor, in native pixels.
xcb_connection_t * xcb_connection() const
QXcbObject(QXcbConnection *connection=nullptr)
xcb_window_t root() const
#define Q_XCB_REPLY(call,...)
static const uint8_t mcur_ver_bits[]
static const uint8_t * cursor_bits16[]
static const uint8_t mcur_bdiag_bits[]
static xcb_font_t cursorFont
static const uint8_t busy_bits[]
static const uint8_t closedhand_bits[]
static const uint8_t whatsthism_bits[]
static int cursorIdForShape(int cshape)
static const uint8_t openhandm_bits[]
static const uint8_t forbiddenm_bits[]
static const uint8_t cur_fdiag_bits[]
static const uint8_t cur_ver_bits[]
static uint8_t cur_blank_bits[]
static const std::vector< const char * > cursorNames[]
static const uint8_t openhand_bits[]
static const uint8_t mcur_fdiag_bits[]
static const uint8_t cur_bdiag_bits[]
static const uint8_t closedhandm_bits[]
static const uint8_t cur_hor_bits[]
static const uint8_t mcur_hor_bits[]
static const uint8_t vsplitm_bits[]
static const uint8_t *const cursor_bits32[]
static const uint8_t whatsthis_bits[]
static const uint8_t busym_bits[]
static const uint8_t hsplitm_bits[]
static const uint8_t *const cursor_bits20[]
static const uint8_t vsplit_bits[]
static const uint8_t hsplit_bits[]
static const uint8_t forbidden_bits[]
#define XC_bottom_right_corner
#define XC_sb_h_double_arrow
#define XC_question_arrow
#define XC_sb_v_double_arrow
#define XC_top_right_corner