summaryrefslogtreecommitdiff
path: root/userland
diff options
context:
space:
mode:
Diffstat (limited to 'userland')
-rw-r--r--userland/libgui/libgui.c27
-rw-r--r--userland/libgui/libgui.h4
-rw-r--r--userland/windowserver/ws.c23
-rw-r--r--userland/windowserver/ws.h3
4 files changed, 47 insertions, 10 deletions
diff --git a/userland/libgui/libgui.c b/userland/libgui/libgui.c
index 5f5526d..a344778 100644
--- a/userland/libgui/libgui.c
+++ b/userland/libgui/libgui.c
@@ -2,6 +2,7 @@
#include "font.h"
#include <assert.h>
#include <fcntl.h>
+#include <poll.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -155,7 +156,6 @@ char *random_string(void) {
}
close(fd);
r[9] = '\0';
- printf("r: %s\n", r);
return r;
}
@@ -230,7 +230,30 @@ typedef struct {
void GUI_ClearScreen(GUI_Window *w, uint32_t color) {
for (int i = 0; i < w->sx * w->sy; i++)
- w->bitmap_ptr[i] =color;
+ w->bitmap_ptr[i] = color;
+}
+
+void GUI_EventLoop(GUI_Window *w, void (*event_handler)(WS_EVENT ev)) {
+ struct pollfd fds[1];
+ fds[0].fd = w->ws_socket;
+ fds[0].events = POLLIN;
+ fds[0].revents = 0;
+ for (;; fds[0].revents = 0) {
+ poll(fds, 1, 0);
+ if (!(fds[0].revents & POLLIN))
+ continue;
+
+ int rc;
+ WS_EVENT e;
+ if (0 >= (rc = read(w->ws_socket, &e, sizeof(e))))
+ continue;
+ if (event_handler) {
+ event_handler(e);
+ continue;
+ }
+ if (WINDOWSERVER_EVENT_WINDOW_EXIT == e.type)
+ exit(0);
+ }
}
GUI_Window *GUI_CreateWindow(uint32_t x, uint32_t y, uint32_t sx, uint32_t sy) {
diff --git a/userland/libgui/libgui.h b/userland/libgui/libgui.h
index d58c23c..07fd3db 100644
--- a/userland/libgui/libgui.h
+++ b/userland/libgui/libgui.h
@@ -3,6 +3,9 @@
#include <stddef.h>
#include <stdint.h>
+#define WINDOWSERVER_EVENT_KEYPRESS 0
+#define WINDOWSERVER_EVENT_WINDOW_EXIT 1
+
typedef struct {
int ws_socket;
int bitmap_fd;
@@ -31,4 +34,5 @@ void GUI_UpdateWindow(GUI_Window *w);
void GUI_OverwriteFont(GUI_Window *w, uint32_t px, uint32_t py,
const uint32_t color);
void GUI_ClearScreen(GUI_Window *w, uint32_t color);
+void GUI_EventLoop(GUI_Window *w, void (*event_handler)(WS_EVENT ev));
#endif
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 <fcntl.h>
-#include <poll.h>
-#include <stddef.h>
-#include <stdint.h>
-//#include <sys/mman.h>
+#include "ws.h"
#include "draw.h"
#include "font.h"
-#include "ws.h"
#include <assert.h>
+#include <fcntl.h>
+#include <poll.h>
#include <socket.h>
+#include <stddef.h>
+#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
@@ -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 <stddef.h>
#include <stdint.h>
+#define WINDOWSERVER_EVENT_KEYPRESS 0
+#define WINDOWSERVER_EVENT_WINDOW_EXIT 1
+
typedef struct {
int fd;
int bitmap_fd;