22#ifndef FREERDP_CLIENT_X11_FREERDP_H
23#define FREERDP_CLIENT_X11_FREERDP_H
25#include <freerdp/config.h>
29#include "xf_cliprdr.h"
34#include <X11/Xcursor/Xcursor.h>
38#include <X11/extensions/XInput2.h>
41#include <freerdp/api.h>
44#include "xf_monitor.h"
45#include "xf_channels.h"
47#if defined(CHANNEL_TSMF_CLIENT)
48#include <freerdp/client/tsmf.h>
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>
63#if !defined(XcursorUInt)
64typedef unsigned int XcursorUInt;
67#if !defined(XcursorPixel)
68typedef XcursorUInt XcursorPixel;
92 XcursorPixel* cursorPixels;
96 UINT32* cursorHeights;
118#define NUM_BUTTONS_MAPPED 11
127#define MAX_CONTACTS 20
129typedef struct touch_contact
144 rdpClientContext common;
171 Window reconnectWindow;
172 char reconnectMessage[128];
173 xfAppWindow* appWindow;
176 xfWorkArea railWorkArea;
177 xfFullscreenMonitors fullscreenMonitors;
205 BOOL fullscreen_toggle;
206 BOOL KeyboardState[256];
207 XModifierKeymap* modifierMap;
208 wArrayList* keyCombinations;
210 BOOL actionScriptExists;
213 XSetWindowAttributes attribs;
214 BOOL complex_regions;
215 VIRTUAL_SCREEN vscreen;
216#if defined(CHANNEL_TSMF_CLIENT)
220 Atom* supportedAtoms;
221 unsigned long supportedAtomCount;
225 Atom XWAYLAND_MAY_GRAB_KEYBOARD;
229 Atom NET_NUMBER_OF_DESKTOPS;
230 Atom NET_CURRENT_DESKTOP;
234 Atom NET_SUPPORTING_WM_CHECK;
237 Atom NET_WM_STATE_MODAL;
238 Atom NET_WM_STATE_STICKY;
239 Atom NET_WM_STATE_MAXIMIZED_VERT;
240 Atom NET_WM_STATE_MAXIMIZED_HORZ;
241 Atom NET_WM_STATE_SHADED;
242 Atom NET_WM_STATE_SKIP_TASKBAR;
243 Atom NET_WM_STATE_SKIP_PAGER;
244 Atom NET_WM_STATE_HIDDEN;
245 Atom NET_WM_STATE_FULLSCREEN;
246 Atom NET_WM_STATE_ABOVE;
247 Atom NET_WM_STATE_BELOW;
248 Atom NET_WM_STATE_DEMANDS_ATTENTION;
250 Atom NET_WM_FULLSCREEN_MONITORS;
255 Atom NET_WM_WINDOW_TYPE;
256 Atom NET_WM_WINDOW_TYPE_NORMAL;
257 Atom NET_WM_WINDOW_TYPE_DIALOG;
258 Atom NET_WM_WINDOW_TYPE_UTILITY;
259 Atom NET_WM_WINDOW_TYPE_POPUP;
260 Atom NET_WM_WINDOW_TYPE_POPUP_MENU;
261 Atom NET_WM_WINDOW_TYPE_DROPDOWN_MENU;
263 Atom NET_WM_MOVERESIZE;
264 Atom NET_MOVERESIZE_WINDOW;
268 Atom WM_DELETE_WINDOW;
271 Atom NET_WM_ALLOWED_ACTIONS;
273 Atom NET_WM_ACTION_CLOSE;
274 Atom NET_WM_ACTION_MINIMIZE;
275 Atom NET_WM_ACTION_MOVE;
276 Atom NET_WM_ACTION_RESIZE;
277 Atom NET_WM_ACTION_MAXIMIZE_HORZ;
278 Atom NET_WM_ACTION_MAXIMIZE_VERT;
279 Atom NET_WM_ACTION_FULLSCREEN;
280 Atom NET_WM_ACTION_CHANGE_DESKTOP;
283#if defined(CHANNEL_TSMF_CLIENT)
284 TsmfClientContext* tsmf;
287 xfClipboard* clipboard;
288 CliprdrClientContext* cliprdr;
289 xfVideoContext* xfVideo;
290 xfDispContext* xfDisp;
292 RailClientContext* rail;
293 wHashTable* railWindows;
294 xfRailIconCache* railIconCache;
296#if defined(WITH_VERBOSE_WINPR_ASSERT)
297 BOOL isRailWindowsLocked;
301 BOOL xrenderAvailable;
305 BYTE savedMaximizedState;
307 BOOL wasRightCtrlAlreadyPressed;
308 BOOL ungrabKeyboardWithRightCtrl;
311 touchContact contacts[MAX_CONTACTS];
314 XIDeviceEvent lastEvent;
325 FREERDP_REMAP_TABLE* remap_table;
326 DWORD X11_KEYCODE_TO_VIRTUAL_SCANCODE[256];
328 bool isActionScriptAllowed;
329 bool exposeRequested;
331 Window exposedWindow;
334BOOL xf_create_window(xfContext* xfc);
335void xf_destroy_window(xfContext* xfc);
337BOOL xf_create_image(xfContext* xfc);
338void xf_toggle_fullscreen(xfContext* xfc);
339void xf_minimize(xfContext* xfc);
345 XF_EXIT_DISCONNECT = 1,
347 XF_EXIT_IDLE_TIMEOUT = 3,
348 XF_EXIT_LOGON_TIMEOUT = 4,
349 XF_EXIT_CONN_REPLACED = 5,
350 XF_EXIT_OUT_OF_MEMORY = 6,
351 XF_EXIT_CONN_DENIED = 7,
352 XF_EXIT_CONN_DENIED_FIPS = 8,
353 XF_EXIT_USER_PRIVILEGES = 9,
354 XF_EXIT_FRESH_CREDENTIALS_REQUIRED = 10,
355 XF_EXIT_DISCONNECT_BY_USER = 11,
358 XF_EXIT_LICENSE_INTERNAL = 16,
359 XF_EXIT_LICENSE_NO_LICENSE_SERVER = 17,
360 XF_EXIT_LICENSE_NO_LICENSE = 18,
361 XF_EXIT_LICENSE_BAD_CLIENT_MSG = 19,
362 XF_EXIT_LICENSE_HWID_DOESNT_MATCH = 20,
363 XF_EXIT_LICENSE_BAD_CLIENT = 21,
364 XF_EXIT_LICENSE_CANT_FINISH_PROTOCOL = 22,
365 XF_EXIT_LICENSE_CLIENT_ENDED_PROTOCOL = 23,
366 XF_EXIT_LICENSE_BAD_CLIENT_ENCRYPTION = 24,
367 XF_EXIT_LICENSE_CANT_UPGRADE = 25,
368 XF_EXIT_LICENSE_NO_REMOTE_CONNECTIONS = 26,
374 XF_EXIT_PARSE_ARGUMENTS = 128,
375 XF_EXIT_MEMORY = 129,
376 XF_EXIT_PROTOCOL = 130,
377 XF_EXIT_CONN_FAILED = 131,
378 XF_EXIT_AUTH_FAILURE = 132,
379 XF_EXIT_NEGO_FAILURE = 133,
380 XF_EXIT_LOGON_FAILURE = 134,
381 XF_EXIT_ACCOUNT_LOCKED_OUT = 135,
382 XF_EXIT_PRE_CONNECT_FAILED = 136,
383 XF_EXIT_CONNECT_UNDEFINED = 137,
384 XF_EXIT_POST_CONNECT_FAILED = 138,
385 XF_EXIT_DNS_ERROR = 139,
386 XF_EXIT_DNS_NAME_NOT_FOUND = 140,
387 XF_EXIT_CONNECT_FAILED = 141,
388 XF_EXIT_MCS_CONNECT_INITIAL_ERROR = 142,
389 XF_EXIT_TLS_CONNECT_FAILED = 143,
390 XF_EXIT_INSUFFICIENT_PRIVILEGES = 144,
391 XF_EXIT_CONNECT_CANCELLED = 145,
393 XF_EXIT_CONNECT_TRANSPORT_FAILED = 147,
394 XF_EXIT_CONNECT_PASSWORD_EXPIRED = 148,
395 XF_EXIT_CONNECT_PASSWORD_MUST_CHANGE = 149,
396 XF_EXIT_CONNECT_KDC_UNREACHABLE = 150,
397 XF_EXIT_CONNECT_ACCOUNT_DISABLED = 151,
398 XF_EXIT_CONNECT_PASSWORD_CERTAINLY_EXPIRED = 152,
399 XF_EXIT_CONNECT_CLIENT_REVOKED = 153,
400 XF_EXIT_CONNECT_WRONG_PASSWORD = 154,
401 XF_EXIT_CONNECT_ACCESS_DENIED = 155,
402 XF_EXIT_CONNECT_ACCOUNT_RESTRICTION = 156,
403 XF_EXIT_CONNECT_ACCOUNT_EXPIRED = 157,
404 XF_EXIT_CONNECT_LOGON_TYPE_NOT_GRANTED = 158,
405 XF_EXIT_CONNECT_NO_OR_MISSING_CREDENTIALS = 159,
406 XF_EXIT_CONNECT_TARGET_BOOTING = 160,
407 XF_EXIT_CONNECT_HYBRID_REQUIRED_BY_SERVER = 161,
408 XF_EXIT_CODE_LAST = XF_EXIT_CONNECT_HYBRID_REQUIRED_BY_SERVER,
409 XF_EXIT_UNKNOWN = 255,
412#define xf_lock_x11(xfc) xf_lock_x11_(xfc, __func__)
413#define xf_unlock_x11(xfc) xf_unlock_x11_(xfc, __func__)
415void xf_lock_x11_(xfContext* xfc,
const char* fkt);
416void xf_unlock_x11_(xfContext* xfc,
const char* fkt);
418BOOL xf_picture_transform_required(xfContext* xfc);
420#define xf_draw_screen(_xfc, _x, _y, _w, _h) \
421 xf_draw_screen_((_xfc), (_x), (_y), (_w), (_h), __func__, __FILE__, __LINE__)
422void xf_draw_screen_(xfContext* xfc,
int x,
int y,
int w,
int h,
const char* fkt,
const char* file,
425BOOL xf_keyboard_update_modifier_map(xfContext* xfc);
427int xf_exit_code_from_disconnect_reason(DWORD reason);