now
This commit is contained in:
169
src/main.c
169
src/main.c
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user