FreeRDP
Loading...
Searching...
No Matches
SDL3/sdl_disp.hpp
1
19#pragma once
20
21#include <vector>
22
23#include <freerdp/types.h>
24#include <freerdp/event.h>
25#include <freerdp/client/disp.h>
26
27#include "sdl_types.hpp"
28
29#include <SDL3/SDL.h>
30
32{
33
34 public:
35 explicit sdlDispContext(SdlContext* sdl);
36 sdlDispContext(const sdlDispContext& other) = delete;
37 sdlDispContext(sdlDispContext&& other) = delete;
39
40 sdlDispContext& operator=(const sdlDispContext& other) = delete;
41 sdlDispContext& operator=(sdlDispContext&& other) = delete;
42
43 [[nodiscard]] bool init(DispClientContext* disp);
44 [[nodiscard]] bool uninit(DispClientContext* disp);
45
46 [[nodiscard]] bool handle_display_event(const SDL_DisplayEvent* ev);
47 [[nodiscard]] bool handle_window_event(const SDL_WindowEvent* ev);
48
49 private:
50 UINT DisplayControlCaps(UINT32 maxNumMonitors, UINT32 maxMonitorAreaFactorA,
51 UINT32 maxMonitorAreaFactorB);
52 bool set_window_resizable();
53
54 bool sendResize();
55 bool settings_changed(const std::vector<DISPLAY_CONTROL_MONITOR_LAYOUT>& layout);
56 UINT sendLayout(const rdpMonitor* monitors, size_t nmonitors);
57
58 bool addTimer();
59
60 bool updateMonitor(SDL_WindowID id);
61 bool updateMonitors(SDL_EventType type);
62
63 static UINT DisplayControlCaps(DispClientContext* disp, UINT32 maxNumMonitors,
64 UINT32 maxMonitorAreaFactorA, UINT32 maxMonitorAreaFactorB);
65 static void OnActivated(void* context, const ActivatedEventArgs* e);
66 static void OnGraphicsReset(void* context, const GraphicsResetEventArgs* e);
67 static Uint32 SDLCALL OnTimer(void* param, SDL_TimerID timerID, Uint32 interval);
68
69 SdlContext* _sdl = nullptr;
70 DispClientContext* _disp = nullptr;
71 UINT64 _lastSentDate = 0;
72 bool _activated = false;
73 bool _waitingResize = false;
74 SDL_TimerID _timer = 0;
75 unsigned _timer_retries = 0;
76 std::vector<DISPLAY_CONTROL_MONITOR_LAYOUT> _last_sent_layout;
77};