diff options
author | Ian Moffett <ian@osmora.org> | 2025-09-30 15:30:49 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-09-30 15:32:16 -0400 |
commit | 1061996056666c624130a43e7a4671d10c99f555 (patch) | |
tree | 67bd914203ea281a4a41543aa8063cc6e922f2ad /src/lib | |
parent | 08b07484f1aa1f9726204e90d3f620eb28aa04f4 (diff) |
libwidget: Add initial window drawing + cleanups
Introduce the initial logic to draw windows as well as tidying up the
interface a bit.
- All callbacks must now have a state arguments
- The libwidget state is now kept internally
- Add helper to get pixel index
- Add initial window drawing
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libwidget/include/libwidget/core.h | 10 | ||||
-rw-r--r-- | src/lib/libwidget/include/libwidget/window.h | 7 | ||||
-rw-r--r-- | src/lib/libwidget/src/core/parts/window.c | 25 | ||||
-rw-r--r-- | src/lib/libwidget/src/core/widget_core.c | 14 |
4 files changed, 43 insertions, 13 deletions
diff --git a/src/lib/libwidget/include/libwidget/core.h b/src/lib/libwidget/include/libwidget/core.h index 85b33d4..074edc4 100644 --- a/src/lib/libwidget/include/libwidget/core.h +++ b/src/lib/libwidget/include/libwidget/core.h @@ -30,12 +30,14 @@ #ifndef LIBWIDGET_CORE_H #define LIBWIDGET_CORE_H 1 +#include <sys/fbdev.h> #include <stdint.h> /* Forward declarations */ struct widget; struct libwidget_state { + struct fb_info fbinfo; uint32_t *fbdev; }; @@ -82,8 +84,8 @@ struct blueprint { * @draw: Draw the widget */ struct widget_ops { - int(*init)(struct widget *wp); - int(*draw)(struct widget *wp); + int(*init)(struct libwidget_state *lws, struct widget *wp); + int(*draw)(struct libwidget_state *lws, struct widget *wp); }; /* @@ -106,12 +108,10 @@ struct widget { /* * Initialize the library * - * @lwsp: Libwidget state pointer - * * Returns zero on success, otherwise a less than zero * value on failure. */ -int libwidget_init(struct libwidget_state *lwsp); +int libwidget_init(void); /* * Initialize a widget diff --git a/src/lib/libwidget/include/libwidget/window.h b/src/lib/libwidget/include/libwidget/window.h index 2dc58b1..8823eba 100644 --- a/src/lib/libwidget/include/libwidget/window.h +++ b/src/lib/libwidget/include/libwidget/window.h @@ -30,6 +30,7 @@ #ifndef LIBWIDGET_WINDOW_H #define LIBWIDGET_WINDOW_H +#include <sys/cdefs.h> #include <libwidget/core.h> /* @@ -41,6 +42,12 @@ struct window { struct widget *wp; }; +__always_inline static inline size_t +get_pix_index(struct fb_info *info, uint32_t x, uint32_t y) +{ + return x + y * (info->pitch / 4); +} + extern struct widget_ops g_winops; #endif /* !LIBWIDGET_WINDOW_H */ diff --git a/src/lib/libwidget/src/core/parts/window.c b/src/lib/libwidget/src/core/parts/window.c index 7425407..236b272 100644 --- a/src/lib/libwidget/src/core/parts/window.c +++ b/src/lib/libwidget/src/core/parts/window.c @@ -45,7 +45,7 @@ static uint8_t next_window = 0; * and using a window array, change this when we can */ static int -window_init(struct widget *wp) +window_init(struct libwidget_state *lws, struct widget *wp) { struct window *win; @@ -59,12 +59,31 @@ window_init(struct widget *wp) } static int -window_draw(struct widget *wp) +window_draw(struct libwidget_state *lws, struct widget *wp) { - if (wp == NULL) { + struct fb_info *fbinfo; + struct blueprint *bp; + const struct bp_color *color; + uint32_t x, y, idx; + + if (lws == NULL || wp == NULL) { return -EINVAL; } + bp = &wp->bp; + color = &bp->color; + fbinfo = &lws->fbinfo; + + /* Draw a square */ + for (uint32_t cy = 0; cy < bp->height; ++cy) { + for (uint32_t cx = 0; cx < bp->width; ++cx) { + x = bp->x + cx; + y = bp->y + cy; + idx = get_pix_index(&lws->fbinfo, x, y); + lws->fbdev[idx] = color->bg; + } + } + return 0; } diff --git a/src/lib/libwidget/src/core/widget_core.c b/src/lib/libwidget/src/core/widget_core.c index 9501067..a217e87 100644 --- a/src/lib/libwidget/src/core/widget_core.c +++ b/src/lib/libwidget/src/core/widget_core.c @@ -32,25 +32,29 @@ #include <stddef.h> #include <string.h> #include <sys/mac.h> +#include <sys/fbdev.h> #include <libwidget/window.h> #include <libwidget/core.h> static struct widget backends[]; +static struct libwidget_state lws; /* * Initialize lib widget */ int -libwidget_init(struct libwidget_state *lwsp) +libwidget_init(void) { int error; - if (lwsp == NULL) { - return -EINVAL; + /* Grab framebuffer information */ + error = query(BORDER_FBDEV, &lws.fbinfo, sizeof(lws.fbinfo), 0); + if (error < 0) { + return error; } /* Grab the whole framebuffer, directly mapped */ - error = cross(BORDER_FBDEV, -1, 0, 0, &lwsp->fbdev); + error = cross(BORDER_FBDEV, -1, 0, 0, &lws.fbdev); if (error < 0) { return error; } @@ -109,7 +113,7 @@ widget_update(struct widget *wp) struct widget_ops *ops; ops = wp->ops; - return ops->draw(wp); + return ops->draw(&lws, wp); } static struct widget backends[] = { |