This commit is contained in:
edwin
2025-02-21 13:56:06 +01:00
parent 426f9e9f24
commit a89abf859a
4 changed files with 110 additions and 587 deletions

View File

@@ -7,93 +7,118 @@
#ifndef MAIN_MESSAGE
#define MAIN_MESSAGE "Hello from main!"
#endif
#include <stdio.h>
#include <stdbool.h>
// Functie voor de scherminitialisatie
void lvgl_init(SDL_Window **window, SDL_Renderer **renderer, int width, int height) {
// SDL2 initialisatie
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
printf("SDL init failed: %s\n", SDL_GetError());
exit(1);
}
*window = SDL_CreateWindow("LVGL with SDL2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_OPENGL);
if (*window == NULL) {
printf("Failed to create window: %s\n", SDL_GetError());
exit(1);
}
*renderer = SDL_CreateRenderer(*window, -1, SDL_RENDERER_ACCELERATED);
if (*renderer == NULL) {
printf("Failed to create renderer: %s\n", SDL_GetError());
exit(1);
#include <SDL.h>
// Define MAX and MIN macros
#define MAX(X, Y) (((X) > (Y)) ? (X) : (Y))
#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
// Define screen dimensions
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600
int main(int argc, char* argv[])
{
// Unused argc, argv
(void) argc;
(void) argv;
// Initialize SDL
if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
printf("SDL could not be initialized!\n"
"SDL_Error: %s\n", SDL_GetError());
return 0;
}
// Initialisatie LVGL
lv_init();
#if defined linux && SDL_VERSION_ATLEAST(2, 0, 8)
// Disable compositor bypass
if(!SDL_SetHint(SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR, "0"))
{
printf("SDL can not disable compositor bypass!\n");
return 0;
}
#endif
// Koppelen van SDL2 als de display buffer
lv_disp_draw_buf_t draw_buf;
static lv_color_t buf1[LV_HOR_RES_MAX * 10];
lv_disp_draw_buf_init(&draw_buf, buf1, NULL, LV_HOR_RES_MAX * 10);
lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.draw_buf = &draw_buf;
disp_drv.flush_cb = sdl_flush;
disp_drv.hor_res = width;
disp_drv.ver_res = height;
lv_disp_drv_register(&disp_drv);
}
// Functie voor het tekenen naar het SDL-scherm
void sdl_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) {
SDL_Renderer *renderer = (SDL_Renderer*) disp->user_data;
// Zet het gebied waar we gaan tekenen
SDL_Rect rect = {area->x1, area->y1, area->x2 - area->x1 + 1, area->y2 - area->y1 + 1};
for (int y = 0; y <= rect.h; y++) {
for (int x = 0; x <= rect.w; x++) {
lv_color_t color = color_p[(y * rect.w) + x];
SDL_SetRenderDrawColor(renderer, color.ch.red, color.ch.green, color.ch.blue, 255);
SDL_RenderDrawPoint(renderer, rect.x + x, rect.y + y);
// Create window
SDL_Window *window = SDL_CreateWindow("Basic C SDL project",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
SCREEN_WIDTH, SCREEN_HEIGHT,
SDL_WINDOW_SHOWN);
if(!window)
{
printf("Window could not be created!\n"
"SDL_Error: %s\n", SDL_GetError());
}
else
{
// Create renderer
SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if(!renderer)
{
printf("Renderer could not be created!\n"
"SDL_Error: %s\n", SDL_GetError());
}
}
SDL_RenderPresent(renderer);
else
{
// Declare rect of square
SDL_Rect squareRect;
lv_disp_flush_ready(disp);
}
// Square dimensions: Half of the min(SCREEN_WIDTH, SCREEN_HEIGHT)
squareRect.w = MIN(SCREEN_WIDTH, SCREEN_HEIGHT) / 2;
squareRect.h = MIN(SCREEN_WIDTH, SCREEN_HEIGHT) / 2;
// Hoofdfunctie
int main(void) {
SDL_Window *window;
SDL_Renderer *renderer;
int width = 800;
int height = 480;
// Square position: In the middle of the screen
squareRect.x = SCREEN_WIDTH / 2 - squareRect.w / 2;
squareRect.y = SCREEN_HEIGHT / 2 - squareRect.h / 2;
lvgl_init(&window, &renderer, width, height);
// Maak een eenvoudige knop aan
lv_obj_t *btn = lv_btn_create(lv_scr_act(), NULL);
lv_obj_align(btn, NULL, LV_ALIGN_CENTER, 0, 0);
lv_obj_t *label = lv_label_create(btn, NULL);
lv_label_set_text(label, "Klik hier!");
// Event loop exit flag
bool quit = false;
// Event loop
SDL_Event e;
int quit = 0;
while (!quit) {
while (SDL_PollEvent(&e)) {
if (e.type == SDL_QUIT) {
quit = 1;
// Event loop
while(!quit)
{
SDL_Event e;
// Wait indefinitely for the next available event
SDL_WaitEvent(&e);
// User requests quit
if(e.type == SDL_QUIT)
{
quit = true;
}
// Initialize renderer color white for the background
SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
// Clear screen
SDL_RenderClear(renderer);
// Set renderer color red to draw the square
SDL_SetRenderDrawColor(renderer, 0xFF, 0x00, 0x00, 0xFF);
// Draw filled square
SDL_RenderFillRect(renderer, &squareRect);
// Update screen
SDL_RenderPresent(renderer);
}
// Destroy renderer
SDL_DestroyRenderer(renderer);
}
// LVGL taakverwerking
lv_task_handler();
SDL_Delay(5);
// Destroy window
SDL_DestroyWindow(window);
}
// Opruimen en afsluiten
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
// Quit SDL
SDL_Quit();
return 0;