summaryrefslogtreecommitdiff
path: root/examples/keyboard.c
blob: 51a488e0e2d609907da2055f6fb915b9ee7e6b2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <stdio.h>
#include <stdbool.h>
#define FBGL_IMPLEMENTATION
#include "fbgl.h"

#define RECT_WIDTH 50
#define RECT_HEIGHT 30
#define MOVE_STEP 10
#define BG_COLOR 0x000000 // Black
#define RECT_COLOR 0xFFFFFF // White

int main(void)
{
    // Initialize framebuffer
    fbgl_t framebuffer;
    if (fbgl_init(NULL, &framebuffer) != 0) {
        fprintf(stderr, "Failed to initialize framebuffer\n");
        return EXIT_FAILURE;
    }

    // Initialize keyboard
    if (fbgl_keyboard_init() != 0) {
        fprintf(stderr, "Failed to initialize keyboard\n");
        fbgl_destroy(&framebuffer);
        return EXIT_FAILURE;
    }

    atexit(fbgl_keyboard_clean); // Cleanup on exit
    atexit((void (*)(void))fbgl_destroy, &framebuffer);

    // Initial rectangle position
    fbgl_point_t top_left = {framebuffer.width / 2 - RECT_WIDTH / 2, framebuffer.height / 2 - RECT_HEIGHT / 2};
    fbgl_point_t bottom_right = {top_left.x + RECT_WIDTH, top_left.y + RECT_HEIGHT};

    // Main loop
    while (!fbgl_check_esc_key()) {
        // Update keyboard state
        fbgl_keyboard_update();

        // Clear screen
        fbgl_set_bg(&framebuffer, BG_COLOR);

        // Move rectangle based on key input
        if (fbgl_key_down('w')) {
            top_left.y -= MOVE_STEP;
            bottom_right.y -= MOVE_STEP;
        }
        if (fbgl_key_down('s')) {
            top_left.y += MOVE_STEP;
            bottom_right.y += MOVE_STEP;
        }
        if (fbgl_key_down('a')) {
            top_left.x -= MOVE_STEP;
            bottom_right.x -= MOVE_STEP;
        }
        if (fbgl_key_down('d')) {
            top_left.x += MOVE_STEP;
            bottom_right.x += MOVE_STEP;
        }

        // Ensure rectangle stays within screen bounds
        if (top_left.x < 0) {
            top_left.x = 0;
            bottom_right.x = RECT_WIDTH;
        }
        if (top_left.y < 0) {
            top_left.y = 0;
            bottom_right.y = RECT_HEIGHT;
        }
        if (bottom_right.x > framebuffer.width) {
            bottom_right.x = framebuffer.width;
            top_left.x = framebuffer.width - RECT_WIDTH;
        }
        if (bottom_right.y > framebuffer.height) {
            bottom_right.y = framebuffer.height;
            top_left.y = framebuffer.height - RECT_HEIGHT;
        }

        // Draw the rectangle
        fbgl_draw_rectangle_filled(top_left, bottom_right, RECT_COLOR, &framebuffer);

        // Refresh frame (add a delay if needed)
        usleep(16000); // ~60 FPS
    }

    // Cleanup
    fbgl_keyboard_clean();
    fbgl_destroy(&framebuffer);

    return EXIT_SUCCESS;
}