FreeRDP
Loading...
Searching...
No Matches
TestX11Monitor.c
1#include <freerdp/config.h>
2#include <X11/extensions/Xrandr.h>
3#include "../xfreerdp.h"
4#include "../xf_monitor.h"
5
6static BOOL check_size(Display* display, const char* name, BOOL fullscreen, BOOL workarea,
7 UINT32 percent, UINT32 width, UINT32 height)
8{
9 MONITOR_INFO monitors[16] = WINPR_C_ARRAY_INIT;
10 xfContext xfc = WINPR_C_ARRAY_INIT;
11 rdpSettings* settings = freerdp_settings_new(0);
12 if (!settings)
13 return FALSE;
14
15 xfc.display = display;
16 xfc.screen = DefaultScreenOfDisplay(display);
17 xfc.log = WLog_Get("com.freerdp.client.x11.test");
18 xfc.vscreen.monitors = monitors;
19 xfc.common.context.settings = settings;
20 BOOL rc = freerdp_settings_set_uint32(settings, FreeRDP_DesktopPosX, 1200) &&
21 freerdp_settings_set_uint32(settings, FreeRDP_DesktopPosY, 600) &&
22 freerdp_settings_set_uint32(settings, FreeRDP_DesktopWidth, 1900) &&
23 freerdp_settings_set_uint32(settings, FreeRDP_DesktopHeight, 1200) &&
24 freerdp_settings_set_bool(settings, FreeRDP_Fullscreen, fullscreen) &&
25 freerdp_settings_set_bool(settings, FreeRDP_Workarea, workarea) &&
26 freerdp_settings_set_uint32(settings, FreeRDP_PercentScreen, percent) &&
27 freerdp_settings_set_bool(settings, FreeRDP_PercentScreenUseWidth, percent != 0) &&
28 freerdp_settings_set_bool(settings, FreeRDP_PercentScreenUseHeight, percent != 0);
29 UINT32 actual_width = 0;
30 UINT32 actual_height = 0;
31 if (rc)
32 rc = xf_detect_monitors(&xfc, &actual_width, &actual_height);
33 if (!rc || actual_width != width || actual_height != height || xfc.vscreen.nmonitors != 2)
34 {
35 fprintf(stderr, "%s: expected %ux%u, got %ux%u (%u monitors)\n", name, width, height,
36 actual_width, actual_height, xfc.vscreen.nmonitors);
37 rc = FALSE;
38 }
39 freerdp_settings_free(settings);
40 return rc;
41}
42
43int main(int argc, char* argv[])
44{
45 WINPR_UNUSED(argc);
46 WINPR_UNUSED(argv);
47 Display* display = XOpenDisplay(nullptr);
48 if (!display)
49 return 1;
50 const Window root = DefaultRootWindow(display);
51 XRRScreenResources* resources = XRRGetScreenResourcesCurrent(display, root);
52 XRRMonitorInfo* left = XRRAllocateMonitor(display, 1);
53 XRRMonitorInfo* right = XRRAllocateMonitor(display, 0);
54 int rc = 1;
55 if (!resources || resources->noutput < 1 || !left || !right)
56 goto out;
57
58 left->name = XInternAtom(display, "left", False);
59 left->primary = True;
60 left->width = 1200;
61 left->height = 1920;
62 left->mwidth = 300;
63 left->mheight = 480;
64 left->outputs[0] = resources->outputs[0];
65 right->name = XInternAtom(display, "right", False);
66 right->x = 1200;
67 right->y = 600;
68 right->width = 1920;
69 right->height = 1200;
70 right->mwidth = 480;
71 right->mheight = 300;
72 XRRSetMonitor(display, root, left);
73 XRRSetMonitor(display, root, right);
74 XWarpPointer(display, None, root, 0, 0, 0, 0, 100, 100);
75 XSync(display, False);
76
77 rc = 0;
78 if (!check_size(display, "windowed", FALSE, FALSE, 0, 1900, 1200))
79 rc = 1;
80 if (!check_size(display, "fullscreen", TRUE, FALSE, 0, 1200, 1920))
81 rc = 1;
82 if (!check_size(display, "workarea", FALSE, TRUE, 0, 1200, 1920))
83 rc = 1;
84 if (!check_size(display, "50 percent", FALSE, FALSE, 50, 600, 960))
85 rc = 1;
86out:
87 if (resources)
88 XRRFreeScreenResources(resources);
89 if (left)
90 XRRFreeMonitors(left);
91 if (right)
92 XRRFreeMonitors(right);
93 XCloseDisplay(display);
94 return rc;
95}
FREERDP_API rdpSettings * freerdp_settings_new(DWORD flags)
creates a new setting struct
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_bool(rdpSettings *settings, FreeRDP_Settings_Keys_Bool id, BOOL val)
Sets a BOOL settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_uint32(rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id, UINT32 val)
Sets a UINT32 settings value.
FREERDP_API void freerdp_settings_free(rdpSettings *settings)
Free a settings struct with all data in it.