ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
sdl_esphome.h
Go to the documentation of this file.
1#pragma once
2
3#ifdef USE_HOST
6#include "esphome/core/log.h"
10#define SDL_MAIN_HANDLED
11#include "SDL.h"
12#include <map>
13
14namespace esphome::sdl {
15
16ESPHOME_LOG_TAG(TAG, "sdl");
17
18class Sdl final : public display::Display, public snapshot::Snapshot {
19 public:
21 void update() override;
22 void loop() override;
23 void setup() override;
24 void draw_pixel_at(int x, int y, Color color) override;
25 void process_key(uint32_t keycode, bool down);
26 void set_dimensions(uint16_t width, uint16_t height) {
27 this->width_ = width;
28 this->height_ = height;
29 }
30 void set_window_options(uint32_t window_options) { this->window_options_ = window_options; }
31 void set_position(int32_t pos_x, int32_t pos_y) {
32 this->pos_x_ = pos_x;
33 this->pos_y_ = pos_y;
34 }
35 void set_headless(bool headless) { this->headless_ = headless; }
36 void set_snapshot_key(int32_t keycode) { this->snapshot_key_ = keycode; }
37
38 int get_width() override;
39 int get_height() override;
40 float get_setup_priority() const override { return setup_priority::HARDWARE; }
41 void dump_config() override { LOG_DISPLAY("", "SDL", this); }
42 template<typename F> void add_key_listener(int32_t keycode, F &&callback) {
43 if (!this->key_callbacks_.contains(keycode)) {
45 }
46 this->key_callbacks_[keycode].add(std::forward<F>(callback));
47 }
48
49 int mouse_x{};
50 int mouse_y{};
51 bool mouse_down{};
52
53 protected:
54 void draw_pixels_internal(int x_start, int y_start, int w, int h, const uint8_t *ptr, display::ColorBitness bitness,
55 bool big_endian, int x_offset, int y_offset, int x_pad) override;
56
57 int get_width_internal() override { return this->width_; }
58 int get_height_internal() override { return this->height_; }
59 void redraw_(SDL_Rect &rect);
60 bool setup_renderer_();
62 void destroy_renderer_();
64 bool setup_failed_(const char *what);
65 int snapshot_width() override { return this->width_; }
66 int snapshot_height() override { return this->height_; }
67 bool capture_bgr(uint8_t *dest, size_t row_stride) override;
68 void handle_event_(const SDL_Event &event);
70 static Sdl *instance_for_window(uint32_t window_id);
71 SDL_Renderer *renderer_{};
72 SDL_Window *window_{};
73 SDL_Texture *texture_{};
74 // Offscreen render target used when headless. SDL_CreateSoftwareRenderer only borrows the
75 // surface, and the renderer goes back to using it as its output whenever the capture target is
76 // released, so it has to stay alive as long as the renderer does.
77 SDL_Surface *surface_{};
78 // Capture target, created on first snapshot.
79 SDL_Texture *shot_target_{};
80 std::map<int32_t, CallbackManager<void(bool)>> key_callbacks_{};
81 int width_{};
82 int height_{};
84 int32_t pos_x_{SDL_WINDOWPOS_UNDEFINED};
85 int32_t pos_y_{SDL_WINDOWPOS_UNDEFINED};
86 int32_t snapshot_key_{0};
87 uint16_t x_low_{0};
88 uint16_t y_low_{0};
89 uint16_t x_high_{0};
90 uint16_t y_high_{0};
91 bool headless_{false};
92};
93
94} // namespace esphome::sdl
95
96#endif
int int int const uint8_t ColorOrder ColorBitness bitness
Definition display.h:392
int int int const uint8_t ColorOrder ColorBitness bool int int y_offset
Definition display.h:392
int int int const uint8_t ColorOrder ColorBitness bool int int int x_pad
Definition display.h:392
int int int const uint8_t * ptr
Definition display.h:391
int int int const uint8_t ColorOrder ColorBitness bool big_endian
Definition display.h:392
int int int const uint8_t ColorOrder ColorBitness bool int x_offset
Definition display.h:392
uint32_t window_options_
Definition sdl_esphome.h:83
void setup() override
void set_window_options(uint32_t window_options)
Definition sdl_esphome.h:30
int get_width() override
void draw_pixels_internal(int x_start, int y_start, int w, int h, const uint8_t *ptr, display::ColorBitness bitness, bool big_endian, int x_offset, int y_offset, int x_pad) override
int get_height() override
SDL_Surface * surface_
Definition sdl_esphome.h:77
int snapshot_height() override
Definition sdl_esphome.h:66
SDL_Renderer * renderer_
Definition sdl_esphome.h:71
void set_headless(bool headless)
Definition sdl_esphome.h:35
void add_key_listener(int32_t keycode, F &&callback)
Definition sdl_esphome.h:42
int32_t snapshot_key_
Definition sdl_esphome.h:86
int get_height_internal() override
Definition sdl_esphome.h:58
void process_key(uint32_t keycode, bool down)
SDL_Texture * texture_
Definition sdl_esphome.h:73
void set_dimensions(uint16_t width, uint16_t height)
Definition sdl_esphome.h:26
void set_position(int32_t pos_x, int32_t pos_y)
Definition sdl_esphome.h:31
void redraw_(SDL_Rect &rect)
void loop() override
bool setup_failed_(const char *what)
Log an SDL failure during setup, release anything already created, and return false.
void handle_event_(const SDL_Event &event)
void dump_config() override
Definition sdl_esphome.h:41
bool capture_bgr(uint8_t *dest, size_t row_stride) override
void destroy_renderer_()
Release the window, surface, renderer and textures, and forget them.
void draw_pixel_at(int x, int y, Color color) override
int snapshot_width() override
Definition sdl_esphome.h:65
static Sdl * instance_for_window(uint32_t window_id)
The display owning the given window, or nullptr if it is not one of ours.
int get_width_internal() override
Definition sdl_esphome.h:57
void update() override
float get_setup_priority() const override
Definition sdl_esphome.h:40
SDL_Texture * shot_target_
Definition sdl_esphome.h:79
display::DisplayType get_display_type() override
Definition sdl_esphome.h:20
void set_snapshot_key(int32_t keycode)
Definition sdl_esphome.h:36
SDL_Window * window_
Definition sdl_esphome.h:72
std::map< int32_t, CallbackManager< void(bool)> > key_callbacks_
Definition sdl_esphome.h:80
Base for anything that can hand over the picture it is showing so it can be written to a file.
Definition snapshot.h:24
ESPHOME_LOG_TAG(TAG, "sdl")
constexpr float HARDWARE
For components that deal with hardware and are very important like GPIO switch.
Definition component.h:43
static void uint32_t
uint16_t x
Definition tt21100.cpp:5
uint16_t y
Definition tt21100.cpp:6