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;
38 virtual ~sdlDispContext();
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 handleEvent(const SDL_DisplayEvent& ev);
47 [[nodiscard]] bool handleEvent(const SDL_WindowEvent& ev);
48
49 private:
50 [[nodiscard]] UINT DisplayControlCaps(UINT32 maxNumMonitors, UINT32 maxMonitorAreaFactorA,
51 UINT32 maxMonitorAreaFactorB);
52 [[nodiscard]] bool setWindowResizeable();
53
54 [[nodiscard]] bool sendResize();
55 [[nodiscard]] bool settings_changed(const std::vector<DISPLAY_CONTROL_MONITOR_LAYOUT>& layout);
56 [[nodiscard]] bool sendLayout(const rdpMonitor* monitors, size_t nmonitors);
57
58 [[nodiscard]] bool addTimer();
59
60 [[nodiscard]] bool updateMonitor(SDL_WindowID id);
61 [[nodiscard]] bool updateMonitors(SDL_EventType type, SDL_DisplayID displayID);
62
63 [[nodiscard]] static UINT DisplayControlCaps(DispClientContext* disp, UINT32 maxNumMonitors,
64 UINT32 maxMonitorAreaFactorA,
65 UINT32 maxMonitorAreaFactorB);
66 static void OnActivated(void* context, const ActivatedEventArgs* e);
67 static void OnGraphicsReset(void* context, const GraphicsResetEventArgs* e);
68 [[nodiscard]] static Uint32 SDLCALL OnTimer(void* param, SDL_TimerID timerID, Uint32 interval);
69
70 SdlContext* _sdl = nullptr;
71 DispClientContext* _disp = nullptr;
72 UINT64 _lastSentDate = 0;
73 bool _activated = false;
74 bool _waitingResize = false;
75 SDL_TimerID _timer = 0;
76 unsigned _timer_retries = 0;
77 std::vector<DISPLAY_CONTROL_MONITOR_LAYOUT> _last_sent_layout;
78};