summaryrefslogtreecommitdiff
path: root/userland/windowserver/ws.c
diff options
context:
space:
mode:
Diffstat (limited to 'userland/windowserver/ws.c')
-rw-r--r--userland/windowserver/ws.c65
1 files changed, 40 insertions, 25 deletions
diff --git a/userland/windowserver/ws.c b/userland/windowserver/ws.c
index 1224e86..3adefe0 100644
--- a/userland/windowserver/ws.c
+++ b/userland/windowserver/ws.c
@@ -93,9 +93,14 @@ int next_ui_id(void) {
return r;
}
+struct DISPLAY_INFO {
+ uint32_t width;
+ uint32_t height;
+ uint8_t bpp;
+};
+
void setup_display(DISPLAY *disp, const char *path, uint64_t size) {
disp->wallpaper_color = 0x3;
- disp->size = size;
disp->vga_fd = open(path, O_RDWR, 0);
if (-1 == disp->vga_fd) {
perror("open");
@@ -107,24 +112,35 @@ void setup_display(DISPLAY *disp, const char *path, uint64_t size) {
disp->back_buffer = malloc(size + 0x1000);
disp->window = window;
+ struct DISPLAY_INFO inf;
+ int fd = open("/dev/display_info", O_READ, 0);
+ assert(fd >= 0);
+ assert(sizeof(inf) == read(fd, &inf, sizeof(inf)));
+
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);
+
+ // ftruncate(disp->wallpaper_fd, inf.width * inf.height * sizeof(uint32_t));
+
+ // ftruncate(disp->wallpaper_fd, size);
+ // void *rc = mmap(NULL, size, 0, 0, disp->wallpaper_fd, 0);
+
+ disp->width = inf.width;
+ disp->height = inf.height;
+
+ disp->size = inf.width * inf.height * sizeof(uint32_t);
+ void *rc = mmap(NULL, inf.width * inf.height * sizeof(uint32_t), 0, 0,
+ disp->wallpaper_fd, 0);
assert(rc != (void *)(-1));
+
disp->wallpaper_buffer = rc;
- for (int i = 0; i < disp->size / disp->bpp; i++) {
- uint32_t *p = disp->wallpaper_buffer + i * sizeof(uint32_t);
- *p = 0x9b9b9b;
- }
+ // uint32_t *p = rc;
+ // for (int i = 0; i < disp->width * disp->height; i++) {
+ // *p = 0x9b9b9b;
+ // p++;
+ // }
}
-struct DISPLAY_INFO {
- uint32_t width;
- uint32_t height;
- uint8_t bpp;
-};
-
void setup(void) {
struct DISPLAY_INFO disp_info;
{
@@ -243,6 +259,7 @@ void parse_window_event(WINDOW *w) {
read(w->fd, bitmap_name, e.name_len);
bitmap_name[e.name_len] = '\0';
int bitmap_fd = shm_open(bitmap_name, O_RDWR, O_CREAT);
+ strlcpy(w->bitmap_name, bitmap_name, 256);
create_window(w, bitmap_fd, e.px, e.py, e.sx, e.sy);
draw();
return;
@@ -458,6 +475,13 @@ WINDOW *get_window(int fd) {
}
void kill_window(WINDOW *w) {
+ if (w == main_display.active_window) {
+ if (w->prev) {
+ main_display.active_window = w->prev;
+ } else {
+ main_display.active_window = w->next;
+ }
+ }
WINDOW *prev = w->prev;
if (prev) {
assert(prev->next == w);
@@ -467,18 +491,19 @@ void kill_window(WINDOW *w) {
next_window->prev = prev;
}
} else {
- assert(w = main_display.window);
+ assert(w == main_display.window);
main_display.window = w->next;
if (main_display.window) {
main_display.window->prev = NULL;
}
- main_display.active_window = NULL;
}
if (w == main_display.window_tail) {
assert(NULL == w->next);
main_display.window_tail = prev;
}
+ munmap(w->bitmap_ptr, w->buffer_sx * w->buffer_sy);
+ shm_unlink(w->bitmap_name);
free(w);
}
@@ -686,18 +711,8 @@ void draw(void) {
}
int main(void) {
- int serial_fd = open("/dev/serial", O_WRITE, 0);
- dup2(serial_fd, 1);
- serial_fd = 1;
// Start a terminal by default. This is just to make it easier for me
// to test the system.
- int pid = fork();
- if (0 == pid) {
- close(serial_fd);
- char *argv[] = {"/term", NULL};
- execv("/term", argv);
- assert(0);
- }
setup();
run();
return 0;