diff options
author | Anton Kling <anton@kling.gg> | 2023-10-23 14:27:22 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2023-10-23 14:27:22 +0200 |
commit | b8ca0766a2006e4a11451cf447ac02372c996c12 (patch) | |
tree | 4e0d70324aaac483e84af5808f016e4224a2d738 /userland/windowserver | |
parent | e8643790b093a4b25651aff14b85c492ffcae3f2 (diff) |
WindowServer: Make the wallpaper be stored in a shared memory region.
This allow other processes to easily modify the wallpaper by opening the
memory region and poking into memory.
Diffstat (limited to 'userland/windowserver')
-rw-r--r-- | userland/windowserver/draw.c | 14 | ||||
-rw-r--r-- | userland/windowserver/draw.h | 1 | ||||
-rw-r--r-- | userland/windowserver/ws.c | 11 | ||||
-rw-r--r-- | userland/windowserver/ws.h | 2 |
4 files changed, 19 insertions, 9 deletions
diff --git a/userland/windowserver/draw.c b/userland/windowserver/draw.c index caa16a2..1794378 100644 --- a/userland/windowserver/draw.c +++ b/userland/windowserver/draw.c @@ -1,8 +1,6 @@ #include "draw.h" #include <string.h> -#define BPP 4 - #define place_pixel(_p, _w, _h) \ { *(uint32_t *)(disp->back_buffer + BPP * (_w) + (WIDTH * BPP * (_h))) = _p; } @@ -24,9 +22,7 @@ void update_display(DISPLAY *disp) { } void draw_wallpaper(DISPLAY *disp) { - for (int i = 0; i < disp->size / BPP; i++) { - place_pixel_pos(0xFF00FF, i); - } +memcpy(disp->back_buffer, disp->wallpaper_buffer, disp->size); } void draw_mouse(DISPLAY *disp, int mouse_x, int mouse_y) { @@ -45,11 +41,11 @@ void draw_window(DISPLAY *disp, const WINDOW *w) { x = px; y = py; for (int i = 0; i < sy; i++) { - if((i+py)*WIDTH + px > HEIGHT*WIDTH) - break; + if ((i + py) * WIDTH + px > HEIGHT * WIDTH) + break; uint32_t *ptr = disp->back_buffer + BPP * ((i + py) * WIDTH) + px * BPP; - if(i*sx > HEIGHT*WIDTH) - break; + if (i * sx > HEIGHT * WIDTH) + break; uint32_t *bm = &w->bitmap_ptr[i * sx]; // ((uint8_t *)w->bitmap_ptr) + BPP * ((i + py) * WIDTH) + px * BPP; for (int j = 0; j < sx; j++) { diff --git a/userland/windowserver/draw.h b/userland/windowserver/draw.h index bf9ff4f..cebe0fa 100644 --- a/userland/windowserver/draw.h +++ b/userland/windowserver/draw.h @@ -4,6 +4,7 @@ #define WIDTH 0x500 #define HEIGHT 0x320 +#define BPP 4 void draw_wallpaper(DISPLAY *disp); void draw_window(DISPLAY *disp, const WINDOW *w); diff --git a/userland/windowserver/ws.c b/userland/windowserver/ws.c index da1bdaa..6c7e6ee 100644 --- a/userland/windowserver/ws.c +++ b/userland/windowserver/ws.c @@ -69,6 +69,17 @@ void setup_display(DISPLAY *disp, const char *path, uint64_t size) { disp->true_buffer = mmap(NULL, size, 0, 0, disp->vga_fd, 0); disp->back_buffer = malloc(size + 0x1000); disp->clients = clients; + + disp->wallpaper_fd = shm_open("wallpaper", O_RDWR, 0); + assert(disp->wallpaper_fd >= 0); + ftruncate(disp->wallpaper_fd, size); + void *rc = mmap(NULL, size, 0, 0, disp->wallpaper_fd, 0); + assert(rc); + disp->wallpaper_buffer = rc; + for (int i = 0; i < disp->size / BPP; i++) { + uint32_t *p = disp->wallpaper_buffer + i * sizeof(uint32_t); + *p = 0xFFFFFF; + } } void setup(void) { diff --git a/userland/windowserver/ws.h b/userland/windowserver/ws.h index c4daf7b..864fc53 100644 --- a/userland/windowserver/ws.h +++ b/userland/windowserver/ws.h @@ -19,6 +19,8 @@ typedef struct { typedef struct { int vga_fd; + int wallpaper_fd; + uint8_t *wallpaper_buffer; uint8_t *back_buffer; uint8_t *true_buffer; size_t size; |