FreeRDP
Loading...
Searching...
No Matches
xfreerdp.h
1
22#ifndef FREERDP_CLIENT_X11_FREERDP_H
23#define FREERDP_CLIENT_X11_FREERDP_H
24
25#include <freerdp/config.h>
26
27#include "xf_types.h"
28#include "xf_disp.h"
29#include "xf_cliprdr.h"
30#include "xf_video.h"
31#include "xf_rail.h"
32
33#ifdef WITH_XCURSOR
34#include <X11/Xcursor/Xcursor.h>
35#endif
36
37#ifdef WITH_XI
38#include <X11/extensions/XInput2.h>
39#endif
40
41#include <freerdp/api.h>
42
43#include "xf_window.h"
44#include "xf_monitor.h"
45#include "xf_channels.h"
46
47#if defined(CHANNEL_TSMF_CLIENT)
48#include <freerdp/client/tsmf.h>
49#endif
50
51#include <freerdp/gdi/gdi.h>
52#include <freerdp/codec/rfx.h>
53#include <freerdp/codec/nsc.h>
54#include <freerdp/codec/clear.h>
55#include <freerdp/codec/color.h>
56#include <freerdp/codec/bitmap.h>
57#include <freerdp/codec/h264.h>
58#include <freerdp/codec/progressive.h>
59#include <freerdp/codec/region.h>
60#include <freerdp/locale/keyboard.h>
61#include <freerdp/client.h>
62
63#if !defined(XcursorUInt)
64typedef unsigned int XcursorUInt;
65#endif
66
67#if !defined(XcursorPixel)
68typedef XcursorUInt XcursorPixel;
69#endif
70
72{
73 INT32 top;
74 INT32 bottom;
75 INT32 left;
76 INT32 right;
77};
78typedef struct xf_FullscreenMonitors xfFullscreenMonitors;
79
81{
82 INT32 x;
83 INT32 y;
84 UINT32 width;
85 UINT32 height;
86};
87typedef struct xf_WorkArea xfWorkArea;
88
90{
91 rdpPointer pointer;
92 XcursorPixel* cursorPixels;
93 UINT32 nCursors;
94 UINT32 mCursors;
95 UINT32* cursorWidths;
96 UINT32* cursorHeights;
97 Cursor* cursors;
98 Cursor cursor;
99};
100typedef struct xf_pointer xfPointer;
101
103{
104 rdpBitmap bitmap;
105 Pixmap pixmap;
106 XImage* image;
107};
108typedef struct xf_bitmap xfBitmap;
109
111{
112 rdpGlyph glyph;
113 Pixmap pixmap;
114};
115typedef struct xf_glyph xfGlyph;
116
117/* Number of buttons that are mapped from X11 to RDP button events. */
118#define NUM_BUTTONS_MAPPED 11
119
120typedef struct
121{
122 UINT32 button;
123 UINT16 flags;
124} button_map;
125
126#if defined(WITH_XI)
127#define MAX_CONTACTS 20
128
129typedef struct touch_contact
130{
131 int id;
132 int count;
133 double pos_x;
134 double pos_y;
135 double last_x;
136 double last_y;
137
138} touchContact;
139
140#endif
141
143{
144 rdpClientContext common;
145
146 GC gc;
147 int xfds;
148 int depth;
149
150 GC gc_mono;
151 BOOL invert;
152 Screen* screen;
153 XImage* image;
154 Pixmap primary;
155 Pixmap drawing;
156 Visual* visual;
157 Display* display;
158 Drawable drawable;
159 Pixmap bitmap_mono;
160 Colormap colormap;
161 int screen_number;
162 int scanline_pad;
163 BOOL big_endian;
164 BOOL fullscreen;
165 BOOL decorations;
166 BOOL grab_keyboard;
167 BOOL unobscured;
168 BOOL debug;
169 HANDLE x11event;
170 xfWindow* window;
171 Window reconnectWindow;
172 char reconnectMessage[128];
173 xfAppWindow* appWindow;
174 xfPointer* pointer;
175 xfWorkArea workArea;
176 xfWorkArea railWorkArea;
177 xfFullscreenMonitors fullscreenMonitors;
178 int current_desktop;
179 BOOL remote_app;
180 HANDLE mutex;
181 BOOL UseXThreads;
182 BOOL cursorHidden;
183
184 UINT32 bitmap_size;
185 BYTE* bitmap_buffer;
186
187 BOOL frame_begin;
188
189 int XInputOpcode;
190
191 int savedWidth;
192 int savedHeight;
193 int savedPosX;
194 int savedPosY;
195
196#ifdef WITH_XRENDER
197 int scaledWidth;
198 int scaledHeight;
199 int offset_x;
200 int offset_y;
201#endif
202
203 BOOL focused;
204 BOOL mouse_active;
205 BOOL fullscreen_toggle;
206 BOOL KeyboardState[256];
207 BOOL deferAlt;
208 struct
209 {
210 UINT32 pending;
211 UINT32 sent;
212 } deferredAlt;
213 XModifierKeymap* modifierMap;
214 wArrayList* keyCombinations;
215 wArrayList* xevents;
216 BOOL actionScriptExists;
217
218 int attribs_mask;
219 XSetWindowAttributes attribs;
220 BOOL complex_regions;
221 VIRTUAL_SCREEN vscreen;
222#if defined(CHANNEL_TSMF_CLIENT)
223 void* xv_context;
224#endif
225
226 Atom* supportedAtoms;
227 unsigned long supportedAtomCount;
228
229 Atom UTF8_STRING;
230
231 Atom XWAYLAND_MAY_GRAB_KEYBOARD;
232
233 Atom NET_WM_ICON;
234 Atom MOTIF_WM_HINTS;
235 Atom NET_NUMBER_OF_DESKTOPS;
236 Atom NET_CURRENT_DESKTOP;
237 Atom NET_WORKAREA;
238
239 Atom NET_SUPPORTED;
240 Atom NET_SUPPORTING_WM_CHECK;
241
242 Atom NET_WM_STATE;
243 Atom NET_WM_STATE_MODAL;
244 Atom NET_WM_STATE_STICKY;
245 Atom NET_WM_STATE_MAXIMIZED_VERT;
246 Atom NET_WM_STATE_MAXIMIZED_HORZ;
247 Atom NET_WM_STATE_SHADED;
248 Atom NET_WM_STATE_SKIP_TASKBAR;
249 Atom NET_WM_STATE_SKIP_PAGER;
250 Atom NET_WM_STATE_HIDDEN;
251 Atom NET_WM_STATE_FULLSCREEN;
252 Atom NET_WM_STATE_ABOVE;
253 Atom NET_WM_STATE_BELOW;
254 Atom NET_WM_STATE_DEMANDS_ATTENTION;
255
256 Atom NET_WM_FULLSCREEN_MONITORS;
257
258 Atom NET_WM_NAME;
259 Atom NET_WM_PID;
260
261 Atom NET_WM_WINDOW_TYPE;
262 Atom NET_WM_WINDOW_TYPE_NORMAL;
263 Atom NET_WM_WINDOW_TYPE_DIALOG;
264 Atom NET_WM_WINDOW_TYPE_UTILITY;
265 Atom NET_WM_WINDOW_TYPE_POPUP;
266 Atom NET_WM_WINDOW_TYPE_POPUP_MENU;
267 Atom NET_WM_WINDOW_TYPE_DROPDOWN_MENU;
268
269 Atom NET_WM_MOVERESIZE;
270 Atom NET_MOVERESIZE_WINDOW;
271
272 Atom WM_STATE;
273 Atom WM_PROTOCOLS;
274 Atom WM_DELETE_WINDOW;
275
276 /* Allow actions */
277 Atom NET_WM_ALLOWED_ACTIONS;
278
279 Atom NET_WM_ACTION_CLOSE;
280 Atom NET_WM_ACTION_MINIMIZE;
281 Atom NET_WM_ACTION_MOVE;
282 Atom NET_WM_ACTION_RESIZE;
283 Atom NET_WM_ACTION_MAXIMIZE_HORZ;
284 Atom NET_WM_ACTION_MAXIMIZE_VERT;
285 Atom NET_WM_ACTION_FULLSCREEN;
286 Atom NET_WM_ACTION_CHANGE_DESKTOP;
287
288 /* Channels */
289#if defined(CHANNEL_TSMF_CLIENT)
290 TsmfClientContext* tsmf;
291#endif
292
293 xfClipboard* clipboard;
294 CliprdrClientContext* cliprdr;
295 xfVideoContext* xfVideo;
296 xfDispContext* xfDisp;
297
298 RailClientContext* rail;
299 wHashTable* railWindows;
300 xfRailIconCache* railIconCache;
301 /* gdi's DeleteSurface, wrapped with software GDI to detach RemoteApp windows */
302 pcRdpgfxDeleteSurface gdiDeleteSurface;
303
304#if defined(WITH_VERBOSE_WINPR_ASSERT)
305 BOOL isRailWindowsLocked;
306 const char* whereFkt;
307 const char* whereFile;
308 size_t whereLine;
309#endif
310
311 BOOL xkbAvailable;
312 BOOL xrenderAvailable;
313
314 /* value to be sent over wire for each logical client mouse button */
315 button_map button_map[NUM_BUTTONS_MAPPED];
316 BYTE savedMaximizedState;
317 UINT32 locked;
318 BOOL wasRightCtrlAlreadyPressed;
319 BOOL ungrabKeyboardWithRightCtrl;
320
321#if defined(WITH_XI)
322 touchContact contacts[MAX_CONTACTS];
323 int active_contacts;
324 int lastEvType;
325 XIDeviceEvent lastEvent;
326 double firstDist;
327 double lastDist;
328 double z_vector;
329 double px_vector;
330 double py_vector;
331#endif
332 BOOL xi_rawevent;
333 BOOL xi_event;
334 wLog* log;
335 FREERDP_REMAP_TABLE* remap_table;
336 DWORD X11_KEYCODE_TO_VIRTUAL_SCANCODE[256];
337 bool isCursorHidden;
338 bool isActionScriptAllowed;
339 bool exposeRequested;
340 GDI_RGN exposedArea;
341 Window exposedWindow;
342};
343
344BOOL xf_create_window(xfContext* xfc);
345void xf_destroy_window(xfContext* xfc);
346
347BOOL xf_create_image(xfContext* xfc);
348void xf_toggle_fullscreen(xfContext* xfc);
349void xf_minimize(xfContext* xfc);
350
351enum XF_EXIT_CODE
352{
353 /* section 0-15: protocol-independent codes */
354 XF_EXIT_SUCCESS = 0,
355 XF_EXIT_DISCONNECT = 1,
356 XF_EXIT_LOGOFF = 2,
357 XF_EXIT_IDLE_TIMEOUT = 3,
358 XF_EXIT_LOGON_TIMEOUT = 4,
359 XF_EXIT_CONN_REPLACED = 5,
360 XF_EXIT_OUT_OF_MEMORY = 6,
361 XF_EXIT_CONN_DENIED = 7,
362 XF_EXIT_CONN_DENIED_FIPS = 8,
363 XF_EXIT_USER_PRIVILEGES = 9,
364 XF_EXIT_FRESH_CREDENTIALS_REQUIRED = 10,
365 XF_EXIT_DISCONNECT_BY_USER = 11,
366
367 /* section 16-31: license error set */
368 XF_EXIT_LICENSE_INTERNAL = 16,
369 XF_EXIT_LICENSE_NO_LICENSE_SERVER = 17,
370 XF_EXIT_LICENSE_NO_LICENSE = 18,
371 XF_EXIT_LICENSE_BAD_CLIENT_MSG = 19,
372 XF_EXIT_LICENSE_HWID_DOESNT_MATCH = 20,
373 XF_EXIT_LICENSE_BAD_CLIENT = 21,
374 XF_EXIT_LICENSE_CANT_FINISH_PROTOCOL = 22,
375 XF_EXIT_LICENSE_CLIENT_ENDED_PROTOCOL = 23,
376 XF_EXIT_LICENSE_BAD_CLIENT_ENCRYPTION = 24,
377 XF_EXIT_LICENSE_CANT_UPGRADE = 25,
378 XF_EXIT_LICENSE_NO_REMOTE_CONNECTIONS = 26,
379
380 /* section 32-127: RDP protocol error set */
381 XF_EXIT_RDP = 32,
382
383 /* section 128-254: xfreerdp specific exit codes */
384 XF_EXIT_PARSE_ARGUMENTS = 128,
385 XF_EXIT_MEMORY = 129,
386 XF_EXIT_PROTOCOL = 130,
387 XF_EXIT_CONN_FAILED = 131,
388 XF_EXIT_AUTH_FAILURE = 132,
389 XF_EXIT_NEGO_FAILURE = 133,
390 XF_EXIT_LOGON_FAILURE = 134,
391 XF_EXIT_ACCOUNT_LOCKED_OUT = 135,
392 XF_EXIT_PRE_CONNECT_FAILED = 136,
393 XF_EXIT_CONNECT_UNDEFINED = 137,
394 XF_EXIT_POST_CONNECT_FAILED = 138,
395 XF_EXIT_DNS_ERROR = 139,
396 XF_EXIT_DNS_NAME_NOT_FOUND = 140,
397 XF_EXIT_CONNECT_FAILED = 141,
398 XF_EXIT_MCS_CONNECT_INITIAL_ERROR = 142,
399 XF_EXIT_TLS_CONNECT_FAILED = 143,
400 XF_EXIT_INSUFFICIENT_PRIVILEGES = 144,
401 XF_EXIT_CONNECT_CANCELLED = 145,
402
403 XF_EXIT_CONNECT_TRANSPORT_FAILED = 147,
404 XF_EXIT_CONNECT_PASSWORD_EXPIRED = 148,
405 XF_EXIT_CONNECT_PASSWORD_MUST_CHANGE = 149,
406 XF_EXIT_CONNECT_KDC_UNREACHABLE = 150,
407 XF_EXIT_CONNECT_ACCOUNT_DISABLED = 151,
408 XF_EXIT_CONNECT_PASSWORD_CERTAINLY_EXPIRED = 152,
409 XF_EXIT_CONNECT_CLIENT_REVOKED = 153,
410 XF_EXIT_CONNECT_WRONG_PASSWORD = 154,
411 XF_EXIT_CONNECT_ACCESS_DENIED = 155,
412 XF_EXIT_CONNECT_ACCOUNT_RESTRICTION = 156,
413 XF_EXIT_CONNECT_ACCOUNT_EXPIRED = 157,
414 XF_EXIT_CONNECT_LOGON_TYPE_NOT_GRANTED = 158,
415 XF_EXIT_CONNECT_NO_OR_MISSING_CREDENTIALS = 159,
416 XF_EXIT_CONNECT_TARGET_BOOTING = 160,
417 XF_EXIT_CONNECT_HYBRID_REQUIRED_BY_SERVER = 161,
418 XF_EXIT_CODE_LAST = XF_EXIT_CONNECT_HYBRID_REQUIRED_BY_SERVER,
419 XF_EXIT_UNKNOWN = 255,
420};
421
422#define xf_lock_x11(xfc) xf_lock_x11_(xfc, __func__)
423#define xf_unlock_x11(xfc) xf_unlock_x11_(xfc, __func__)
424
425void xf_lock_x11_(xfContext* xfc, const char* fkt);
426void xf_unlock_x11_(xfContext* xfc, const char* fkt);
427
428BOOL xf_picture_transform_required(xfContext* xfc);
429
430#define xf_draw_screen(_xfc, _x, _y, _w, _h) \
431 xf_draw_screen_((_xfc), (_x), (_y), (_w), (_h), __func__, __FILE__, __LINE__)
432void xf_draw_screen_(xfContext* xfc, int x, int y, int w, int h, const char* fkt, const char* file,
433 int line);
434
435BOOL xf_keyboard_update_modifier_map(xfContext* xfc);
436
437FREERDP_API int xf_exit_code_from_disconnect_reason(DWORD reason);
438
439#endif /* FREERDP_CLIENT_X11_FREERDP_H */