package void SingleEvent(){ //TODO only redraw on expose? version(xlib){ XEvent event; XNextEvent(conn, &event); switch(event.type){ case MotionNotify: //todo limit windows[event.xany.window].motion(event.xmotion.x, event.xmotion.y, event.xbutton.state, event.xbutton.button); break; case Expose: //TODO static bool collapse = false; if(!collapse){ collapse = true; checkEvents(); if(nested == 0) foreach(w; windows) w.display(); collapse = false; } break; case KeyPress: windows[event.xany.window].keyPress(event.xkey.x, event.xkey.y, event.xkey.state, event.xkey.keycode); break; case KeyRelease: windows[event.xany.window].keyRelease(event.xkey.x, event.xkey.y, event.xkey.state, event.xkey.keycode); break; case ButtonPress: windows[event.xany.window].buttonPress(event. case ButtonRelease: windows[event.xany.window].buttonRelease(event.xbutton.x, event.xbutton.y, event.xbutton.state, event.xbutton.button); break; case EnterNotify: windows[event.xany.window].enter(); break; case LeaveNotify: windows[event.xany.window].leave(); break; case ClientMessage: if(event.xclient.data.l[0] == deleteWindow) windows[event.xany.window].close(); break; //resize case ConfigureNotify: //TODO windows[event.xany.window].internalResize(event.xconfigure.x, event.xconfigure.y, event.xconfigure.width, event.xconfigure.height); break; default: break; } } } void checkEvents(){ version(xlib) while(XPending(conn)) SingleEvent(); } void constantLoop(){ while(1){ checkEvents(); foreach(w; windows) w.display(); } } void sleepyLoop(){ while(1) SingleEvent(); }