ESPHome 2026.10.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
16constexpr static const char *const 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_pixels_at(int x_start, int y_start, int w, int h, const uint8_t *ptr, display::ColorOrder order,
25 display::ColorBitness bitness, bool big_endian, int x_offset, int y_offset, int x_pad) override;
26 void draw_pixel_at(int x, int y, Color color) override;
27 void process_key(uint32_t keycode, bool down);
28 void set_dimensions(uint16_t width, uint16_t height) {
29 this->width_ = width;
30 this->height_ = height;
31 }
32 void set_window_options(uint32_t window_options) { this->window_options_ = window_options; }
33 void set_position(int32_t pos_x, int32_t pos_y) {
34 this->pos_x_ = pos_x;
35 this->pos_y_ = pos_y;
36 }
37 void set_headless(bool headless) { this->headless_ = headless; }
38 void set_snapshot_key(int32_t keycode) { this->snapshot_key_ = keycode; }
39
40 int get_width() override;
41 int get_height() override;
42 float get_setup_priority() const override { return setup_priority::HARDWARE; }
43 void dump_config() override { LOG_DISPLAY("", "SDL", this); }
44 template<typename F> void add_key_listener(int32_t keycode, F &&callback) {
45 if (!this->key_callbacks_.count(keycode)) {
47 }
48 this->key_callbacks_[keycode].add(std::forward<F>(callback));
49 }
50
51 int mouse_x{};
52 int mouse_y{};
53 bool mouse_down{};
54
55 protected:
56 int get_width_internal() override { return this->width_; }
57 int get_height_internal() override { return this->height_; }
58 void redraw_(SDL_Rect &rect);
59 bool setup_renderer_();
61 void destroy_renderer_();
63 bool setup_failed_(const char *what);
64 int snapshot_width() override { return this->width_; }
65 int snapshot_height() override { return this->height_; }
66 bool capture_bgr(uint8_t *dest, size_t row_stride) override;
67 void handle_event_(const SDL_Event &event);
69 static Sdl *instance_for_window_(uint32_t window_id);
70 SDL_Renderer *renderer_{};
71 SDL_Window *window_{};
72 SDL_Texture *texture_{};
73 // Offscreen render target used when headless. SDL_CreateSoftwareRenderer only borrows the
74 // surface, and the renderer goes back to using it as its output whenever the capture target is
75 // released, so it has to stay alive as long as the renderer does.
76 SDL_Surface *surface_{};
77 // Capture target, created on first snapshot.
78 SDL_Texture *shot_target_{};
79 std::map<int32_t, CallbackManager<void(bool)>> key_callbacks_{};
80 int width_{};
81 int height_{};
83 int32_t pos_x_{SDL_WINDOWPOS_UNDEFINED};
84 int32_t pos_y_{SDL_WINDOWPOS_UNDEFINED};
85 int32_t snapshot_key_{0};
86 uint16_t x_low_{0};
87 uint16_t y_low_{0};
88 uint16_t x_high_{0};
89 uint16_t y_high_{0};
90 bool headless_{false};
91};
92
93} // namespace esphome::sdl
94
95#endif
uint8_t h
Definition bl0906.h:2
uint32_t window_options_
Definition sdl_esphome.h:82
void setup() override
void set_window_options(uint32_t window_options)
Definition sdl_esphome.h:32
int get_width() override
int get_height() override
SDL_Surface * surface_
Definition sdl_esphome.h:76
int snapshot_height() override
Definition sdl_esphome.h:65
SDL_Renderer * renderer_
Definition sdl_esphome.h:70
void set_headless(bool headless)
Definition sdl_esphome.h:37
void add_key_listener(int32_t keycode, F &&callback)
Definition sdl_esphome.h:44
void draw_pixels_at(int x_start, int y_start, int w, int h, const uint8_t *ptr, display::ColorOrder order, display::ColorBitness bitness, bool big_endian, int x_offset, int y_offset, int x_pad) override
int32_t snapshot_key_
Definition sdl_esphome.h:85
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_height_internal() override
Definition sdl_esphome.h:57
void process_key(uint32_t keycode, bool down)
SDL_Texture * texture_
Definition sdl_esphome.h:72
void set_dimensions(uint16_t width, uint16_t height)
Definition sdl_esphome.h:28
void set_position(int32_t pos_x, int32_t pos_y)
Definition sdl_esphome.h:33
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:43
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:64
int get_width_internal() override
Definition sdl_esphome.h:56
void update() override
float get_setup_priority() const override
Definition sdl_esphome.h:42
SDL_Texture * shot_target_
Definition sdl_esphome.h:78
display::DisplayType get_display_type() override
Definition sdl_esphome.h:20
void set_snapshot_key(int32_t keycode)
Definition sdl_esphome.h:38
SDL_Window * window_
Definition sdl_esphome.h:71
std::map< int32_t, CallbackManager< void(bool)> > key_callbacks_
Definition sdl_esphome.h:79
Base for anything that can hand over the picture it is showing so it can be written to a file.
Definition snapshot.h:23
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