summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-09-30 15:30:49 -0400
committerIan Moffett <ian@osmora.org>2025-09-30 15:32:16 -0400
commit1061996056666c624130a43e7a4671d10c99f555 (patch)
tree67bd914203ea281a4a41543aa8063cc6e922f2ad /src/lib
parent08b07484f1aa1f9726204e90d3f620eb28aa04f4 (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.h10
-rw-r--r--src/lib/libwidget/include/libwidget/window.h7
-rw-r--r--src/lib/libwidget/src/core/parts/window.c25
-rw-r--r--src/lib/libwidget/src/core/widget_core.c14
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[] = {