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