| ... | ... |
@@ -104,7 +104,7 @@ start(Uxn *u) |
| 104 | 104 |
{
|
| 105 | 105 |
if(!evaluxn(u, PAGE_PROGRAM)) |
| 106 | 106 |
return error("Reset", "Failed");
|
| 107 |
- while(mempeek16(devconsole->dat, 0)) |
|
| 107 |
+ if(mempeek16(devconsole->dat, 0)) |
|
| 108 | 108 |
while(read(0, &devconsole->dat[0x2], 1) > 0) |
| 109 | 109 |
evaluxn(u, mempeek16(devconsole->dat, 0)); |
| 110 | 110 |
return 1; |
| ... | ... |
@@ -1,7 +1,6 @@ |
| 1 | 1 |
#include <stdio.h> |
| 2 | 2 |
#include <unistd.h> |
| 3 | 3 |
#include <time.h> |
| 4 |
-#include <fcntl.h> |
|
| 5 | 4 |
#include "uxn.h" |
| 6 | 5 |
|
| 7 | 6 |
#pragma GCC diagnostic push |
| ... | ... |
@@ -30,6 +29,7 @@ static SDL_Rect gRect; |
| 30 | 29 |
static Ppu ppu; |
| 31 | 30 |
static Apu apu[POLYPHONY]; |
| 32 | 31 |
static Device *devscreen, *devmouse, *devctrl, *devaudio0, *devconsole; |
| 32 |
+static Uint32 stdin_event; |
|
| 33 | 33 |
|
| 34 | 34 |
#define PAD 16 |
| 35 | 35 |
|
| ... | ... |
@@ -329,6 +329,17 @@ nil_talk(Device *d, Uint8 b0, Uint8 w) |
| 329 | 329 |
|
| 330 | 330 |
#pragma mark - Generics |
| 331 | 331 |
|
| 332 |
+static int |
|
| 333 |
+in_reader(void *p) |
|
| 334 |
+{
|
|
| 335 |
+ SDL_Event event; |
|
| 336 |
+ event.type = stdin_event; |
|
| 337 |
+ while(read(0, &event.cbutton.button, 1) > 0) |
|
| 338 |
+ SDL_PushEvent(&event); |
|
| 339 |
+ return 0; |
|
| 340 |
+ (void)p; |
|
| 341 |
+} |
|
| 342 |
+ |
|
| 332 | 343 |
static int |
| 333 | 344 |
start(Uxn *u) |
| 334 | 345 |
{
|
| ... | ... |
@@ -367,10 +378,13 @@ start(Uxn *u) |
| 367 | 378 |
if(event.window.event == SDL_WINDOWEVENT_EXPOSED) |
| 368 | 379 |
redraw(u); |
| 369 | 380 |
break; |
| 381 |
+ default: |
|
| 382 |
+ if(event.type == stdin_event) {
|
|
| 383 |
+ devconsole->dat[0x2] = event.cbutton.button; |
|
| 384 |
+ evaluxn(u, mempeek16(devconsole->dat, 0)); |
|
| 385 |
+ } |
|
| 370 | 386 |
} |
| 371 | 387 |
} |
| 372 |
- while(read(0, &devconsole->dat[0x2], 1) > 0) |
|
| 373 |
- evaluxn(u, mempeek16(devconsole->dat, 0)); |
|
| 374 | 388 |
evaluxn(u, mempeek16(devscreen->dat, 0)); |
| 375 | 389 |
if(reqdraw) |
| 376 | 390 |
redraw(u); |
| ... | ... |
@@ -388,8 +402,8 @@ main(int argc, char **argv) |
| 388 | 402 |
Uxn u; |
| 389 | 403 |
zoom = 2; |
| 390 | 404 |
|
| 391 |
- /* set stdin nonblocking */ |
|
| 392 |
- fcntl(0, F_SETFL, fcntl(0, F_GETFL, 0) | O_NONBLOCK); |
|
| 405 |
+ stdin_event = SDL_RegisterEvents(1); |
|
| 406 |
+ SDL_CreateThread(in_reader, "stdin", NULL); |
|
| 393 | 407 |
|
| 394 | 408 |
if(argc < 2) |
| 395 | 409 |
return error("Input", "Missing");
|