From 3f44d16f5297a0f7d63f98e48eba46c1e2538a3e Mon Sep 17 00:00:00 2001 From: Anton Kling Date: Mon, 23 Oct 2023 20:10:01 +0200 Subject: WindowServer/LibGUI: Add a eventloop This can be used by any program does nothing until it gets user input. --- userland/windowserver/ws.c | 23 +++++++++++++++-------- userland/windowserver/ws.h | 3 +++ 2 files changed, 18 insertions(+), 8 deletions(-) (limited to 'userland/windowserver') diff --git a/userland/windowserver/ws.c b/userland/windowserver/ws.c index 2211b00..3d6e10f 100644 --- a/userland/windowserver/ws.c +++ b/userland/windowserver/ws.c @@ -1,13 +1,12 @@ -#include -#include -#include -#include -//#include +#include "ws.h" #include "draw.h" #include "font.h" -#include "ws.h" #include +#include +#include #include +#include +#include #include #include #include @@ -193,7 +192,7 @@ typedef struct { struct KEY_EVENT ev; } WS_EVENT; -void send_to_window(struct KEY_EVENT ev) { +void send_key_event_to_window(struct KEY_EVENT ev) { WS_EVENT e = { .type = 0, .ev = ev, @@ -221,6 +220,13 @@ int windowserver_key_events(struct KEY_EVENT ev, int *redraw) { return 0; if (!(ev.mode & (1 << 1))) return 0; + if ('q' == ev.c) { + WS_EVENT e = { + .type = WINDOWSERVER_EVENT_WINDOW_EXIT, + }; + write(main_display.active_window->fd, &e, sizeof(e)); + return 1; + } if ('n' == ev.c) { // Create a new terminal int pid = fork(); @@ -230,6 +236,7 @@ int windowserver_key_events(struct KEY_EVENT ev, int *redraw) { execv("/term", argv); assert(0); } + return 1; } if (!main_display.active_window) return 0; @@ -344,7 +351,7 @@ void parse_keyboard_event(int fd) { continue; if (!main_display.active_window) continue; - send_to_window(ev[i]); + send_key_event_to_window(ev[i]); } } if (redraw) diff --git a/userland/windowserver/ws.h b/userland/windowserver/ws.h index 9236e01..241c960 100644 --- a/userland/windowserver/ws.h +++ b/userland/windowserver/ws.h @@ -3,6 +3,9 @@ #include #include +#define WINDOWSERVER_EVENT_KEYPRESS 0 +#define WINDOWSERVER_EVENT_WINDOW_EXIT 1 + typedef struct { int fd; int bitmap_fd; -- cgit v1.2.3