Browse Source

drawlines: single-threaded with fswait

K. Lange 2 years ago
parent
commit
ba40bb5cc6
1 changed files with 39 additions and 41 deletions
  1. 39 41
      apps/drawlines.c

+ 39 - 41
apps/drawlines.c

@@ -17,11 +17,12 @@
 #include <stdlib.h>
 #include <assert.h>
 #include <unistd.h>
-#include <pthread.h>
 #include <time.h>
 #include <sched.h>
 #include <math.h>
 
+#include <sys/fswait.h>
+
 #include <toaru/yutani.h>
 #include <toaru/graphics.h>
 
@@ -33,19 +34,13 @@ static gfx_context_t * ctx;
 static int should_exit = 0;
 static int thick = 0;
 
-void * draw_thread(void * garbage) {
-	(void)garbage;
-	while (!should_exit) {
-		if (thick) {
-			draw_line_aa(ctx, rand() % width, rand() % width, rand() % height, rand() % height, rgb(rand() % 255,rand() % 255,rand() % 255), (float)thick);
-		} else {
-			draw_line(ctx, rand() % width, rand() % width, rand() % height, rand() % height, rgb(rand() % 255,rand() % 255,rand() % 255));
-		}
-		yutani_flip(yctx, wina);
-		usleep(16666);
+static void draw(void) {
+	if (thick) {
+		draw_line_aa(ctx, rand() % width, rand() % width, rand() % height, rand() % height, rgb(rand() % 255,rand() % 255,rand() % 255), (float)thick);
+	} else {
+		draw_line(ctx, rand() % width, rand() % width, rand() % height, rand() % height, rgb(rand() % 255,rand() % 255,rand() % 255));
 	}
-	pthread_exit(0);
-	return NULL;
+	yutani_flip(yctx, wina);
 }
 
 static void show_usage(char * argv[]) {
@@ -93,39 +88,42 @@ int main (int argc, char ** argv) {
 	ctx = init_graphics_yutani(wina);
 	draw_fill(ctx, rgb(0,0,0));
 
-	pthread_t thread;
-	pthread_create(&thread, NULL, draw_thread, NULL);
-
 	while (!should_exit) {
-		yutani_msg_t * m = yutani_poll(yctx);
-		if (m) {
-			switch (m->type) {
-				case YUTANI_MSG_KEY_EVENT:
-					{
-						struct yutani_msg_key_event * ke = (void*)m->data;
-						if (ke->event.action == KEY_ACTION_DOWN && ke->event.keycode == 'q') {
-							should_exit = 1;
-							sched_yield();
+		int fds[1] = {fileno(yctx->sock)};
+		int index = fswait2(1,fds,20);
+		if (index == 0) {
+			yutani_msg_t * m = yutani_poll(yctx);
+			while (m) {
+				switch (m->type) {
+					case YUTANI_MSG_KEY_EVENT:
+						{
+							struct yutani_msg_key_event * ke = (void*)m->data;
+							if (ke->event.action == KEY_ACTION_DOWN && ke->event.keycode == 'q') {
+								should_exit = 1;
+								sched_yield();
+							}
 						}
-					}
-					break;
-				case YUTANI_MSG_WINDOW_MOUSE_EVENT:
-					{
-						struct yutani_msg_window_mouse_event * me = (void*)m->data;
-						if (me->command == YUTANI_MOUSE_EVENT_DOWN && me->buttons & YUTANI_MOUSE_BUTTON_LEFT) {
-							yutani_window_drag_start(yctx, wina);
+						break;
+					case YUTANI_MSG_WINDOW_MOUSE_EVENT:
+						{
+							struct yutani_msg_window_mouse_event * me = (void*)m->data;
+							if (me->command == YUTANI_MOUSE_EVENT_DOWN && me->buttons & YUTANI_MOUSE_BUTTON_LEFT) {
+								yutani_window_drag_start(yctx, wina);
+							}
 						}
-					}
-					break;
-				case YUTANI_MSG_WINDOW_CLOSE:
-				case YUTANI_MSG_SESSION_END:
-					should_exit = 1;
-					break;
-				default:
-					break;
+						break;
+					case YUTANI_MSG_WINDOW_CLOSE:
+					case YUTANI_MSG_SESSION_END:
+						should_exit = 1;
+						break;
+					default:
+						break;
+				}
+				free(m);
+				m = yutani_poll_async(yctx);
 			}
 		}
-		free(m);
+		draw();
 	}
 
 	yutani_close(yctx, wina);