createVisual(bool doubleBuffer = false) = 0;
virtual Drawable *
- createDrawable(const Visual *visual, int width = 256, int height = 256) = 0;
+ createDrawable(const Visual *visual, int width = 32, int height = 32) = 0;
virtual Context *
createContext(const Visual *visual, Context *shareContext = NULL) = 0;
static Display *display = NULL;
static int screen = 0;
+
class GlxVisual : public Visual
{
public:
};
+static void describeEvent(const XEvent &event) {
+ if (0) {
+ switch (event.type) {
+ case ConfigureNotify:
+ std::cerr << "ConfigureNotify";
+ break;
+ case Expose:
+ std::cerr << "Expose";
+ break;
+ case KeyPress:
+ std::cerr << "KeyPress";
+ break;
+ case MapNotify:
+ std::cerr << "MapNotify";
+ break;
+ case ReparentNotify:
+ std::cerr << "ReparentNotify";
+ break;
+ default:
+ std::cerr << "Event " << event.type;
+ }
+ std::cerr << " " << event.xany.window << "\n";
+ }
+}
+
+static void waitForEvent(Window window, int type) {
+ XFlush(display);
+ XEvent event;
+ do {
+ XNextEvent(display, &event);
+ describeEvent(event);
+ } while (event.type != type ||
+ event.xany.window != window);
+}
+
+
class GlxDrawable : public Drawable
{
public:
None, (char **)NULL, 0, &sizehints);
XMapWindow(display, window);
+
+ waitForEvent(window, Expose);
+ glXWaitX();
}
~GlxDrawable() {
void
resize(int w, int h) {
glXWaitGL();
+
+ // We need to ensure that pending events are processed here, and XSync
+ // with discard = True guarantees that, but it appears the limited
+ // event processing we do so far is sufficient
+ //XSync(display, True);
+
Drawable::resize(w, h);
+
XResizeWindow(display, window, w, h);
+
+ waitForEvent(window, ConfigureNotify);
+
glXWaitX();
}
bool
processEvents(void) {
+ XFlush(display);
while (XPending(display) > 0) {
XEvent event;
XNextEvent(display, &event);
- // TODO
+ describeEvent(event);
}
return true;
}