From 921db724f897c9c0d9327a5ca1ee83c656e6d0b0 Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Fri, 25 Nov 2011 19:18:52 -0200 Subject: [PATCH] resize improvments, disable direct rendering --- src/framework/platform/x11platform.cpp | 41 ++++++++++++++++---------- src/otclient/otclient.cpp | 15 ++++++++-- 2 files changed, 38 insertions(+), 18 deletions(-) diff --git a/src/framework/platform/x11platform.cpp b/src/framework/platform/x11platform.cpp index 1bc5affa..3745532e 100644 --- a/src/framework/platform/x11platform.cpp +++ b/src/framework/platform/x11platform.cpp @@ -393,6 +393,8 @@ void Platform::poll() { XEvent event, peekevent; PlatformEvent& platformEvent = x11.platformEvent; + static int oldWidth = -1; + static int oldHeight = -1; while(XPending(x11.display) > 0) { XNextEvent(x11.display, &event); @@ -410,10 +412,11 @@ void Platform::poll() } switch(event.type) { + case Expose: + // needs redraw + break; case ConfigureNotify: // window resize - static int oldWidth = -1; - static int oldHeight = -1; if(oldWidth != event.xconfigure.width || oldHeight != event.xconfigure.height) { x11.listener->onResize(Size(event.xconfigure.width, event.xconfigure.height)); oldWidth = event.xconfigure.width; @@ -617,24 +620,29 @@ bool Platform::createWindow(int x, int y, int width, int height, int minWidth, i logFatal("RGBA/Double buffered visual not supported"); // create GLX context - x11.glxContext = glXCreateContext(x11.display, x11.visual, 0, GL_TRUE); + x11.glxContext = glXCreateContext(x11.display, x11.visual, NULL, False); if(!x11.glxContext) logFatal("Unable to create GLX context"); + logInfo("Direct rendering: ", glXIsDirect(x11.display, x11.glxContext) ? "Yes" : "No"); + // color map x11.colormap = XCreateColormap(x11.display, - RootWindow(x11.display, x11.visual->screen), - x11.visual->visual, - AllocNone); + RootWindow(x11.display, x11.visual->screen), + x11.visual->visual, + AllocNone); // setup window type - XSetWindowAttributes wa; - wa.colormap = x11.colormap; - wa.border_pixel = 0; - wa.event_mask = KeyPressMask | KeyReleaseMask | + XSetWindowAttributes attr; + attr.colormap = x11.colormap; + attr.border_pixel = 0; + attr.backing_store = Always; + attr.background_pixel = 0; + attr.event_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | ExposureMask | VisibilityChangeMask | StructureNotifyMask | FocusChangeMask; + unsigned int mask = CWBorderPixel | CWColormap | CWEventMask | CWBackingStore | CWBackPixel; x11.x = x; x11.y = y; @@ -648,11 +656,10 @@ bool Platform::createWindow(int x, int y, int width, int height, int minWidth, i x11.visual->depth, InputOutput, x11.visual->visual, - CWBorderPixel | CWColormap | CWEventMask, - &wa); - + mask, + &attr); if(!x11.window) - logFatal("Unable to create X window"); + logFatal("XCreateWindow failed"); // create input context (to have better key input handling) if(XSupportsLocale()) { @@ -673,7 +680,6 @@ bool Platform::createWindow(int x, int y, int width, int height, int minWidth, i if(!x11.xic) logWarning("Input of special keys maybe messed up because we couldn't create an input context"); - // set window minimum size XSizeHints xsizehints; xsizehints.flags = PMinSize; @@ -686,7 +692,8 @@ bool Platform::createWindow(int x, int y, int width, int height, int minWidth, i XSetWMProtocols(x11.display, x11.window, &x11.atomDeleteWindow , 1); // connect the GLX-context to the window - glXMakeCurrent(x11.display, x11.window, x11.glxContext); + if(!glXMakeCurrent(x11.display, x11.window, x11.glxContext)) + logFatal("glXMakeCurrent failed"); x11.width = width; x11.height = height; @@ -918,6 +925,8 @@ void Platform::setVerticalSync(bool enable) void Platform::swapBuffers() { + //glFlush(); + //glFinish(); glXSwapBuffers(x11.display, x11.window); } diff --git a/src/otclient/otclient.cpp b/src/otclient/otclient.cpp index 4fd3cc3b..6a8213ac 100644 --- a/src/otclient/otclient.cpp +++ b/src/otclient/otclient.cpp @@ -271,8 +271,19 @@ void OTClient::onClose() void OTClient::onResize(const Size& size) { - g_graphics.resize(size); - g_ui.resize(size); + static bool eventScheduled = false; + static Size newSize; + newSize = size; + + // avoid massive resize updates + if(!eventScheduled) { + g_dispatcher.addEvent([&] { + g_graphics.resize(newSize); + g_ui.resize(newSize); + eventScheduled = false; + }); + eventScheduled = true; + } } void OTClient::onPlatformEvent(const PlatformEvent& event)