| 376 | |
| 377 | |
| 378 | static int eventLoop(void) |
| 379 | { |
| 380 | int retval = 0; |
| 381 | |
| 382 | while(!deadYet) |
| 383 | { |
| 384 | int advance = 0, doDisplay = 0; |
| 385 | |
| 386 | while(1) |
| 387 | { |
| 388 | XEvent event; |
| 389 | if(interactive) XNextEvent(dpy, &event); |
| 390 | else |
| 391 | { |
| 392 | if(XPending(dpy) > 0) XNextEvent(dpy, &event); |
| 393 | else break; |
| 394 | } |
| 395 | switch(event.type) |
| 396 | { |
| 397 | case Expose: |
| 398 | doDisplay = 1; |
| 399 | break; |
| 400 | case ConfigureNotify: |
| 401 | reshape(event.xconfigure.width, event.xconfigure.height); |
| 402 | break; |
| 403 | case KeyPress: |
| 404 | { |
| 405 | char buf[10]; |
| 406 | XLookupString(&event.xkey, buf, sizeof(buf), NULL, NULL); |
| 407 | switch(buf[0]) |
| 408 | { |
| 409 | case 27: case 'q': case 'Q': |
| 410 | return 0; |
| 411 | } |
| 412 | break; |
| 413 | } |
| 414 | case MotionNotify: |
| 415 | if(event.xmotion.state & Button1Mask) doDisplay = advance = 1; |
| 416 | break; |
| 417 | case ClientMessage: |
| 418 | { |
| 419 | XClientMessageEvent *cme = (XClientMessageEvent *)&event; |
| 420 | if(cme->message_type == protoAtom |
| 421 | && cme->data.l[0] == (long)deleteAtom) |
| 422 | return 0; |
| 423 | } |
| 424 | } |
| 425 | if(interactive) |
| 426 | { |
| 427 | if(XPending(dpy) <= 0) break; |
| 428 | } |
| 429 | } |
| 430 | if(!interactive) { CATCH(display(1)); } |
| 431 | else |
| 432 | { |
| 433 | if(doDisplay) { CATCH(display(advance)); } |
| 434 | } |
| 435 | } |
no test coverage detected