From: <el...@us...> - 2007-06-30 16:18:45
|
Revision: 8025 http://svn.sourceforge.net/alleg/?rev=8025&view=rev Author: elias Date: 2007-06-30 09:18:47 -0700 (Sat, 30 Jun 2007) Log Message: ----------- Implemented immediate-resize for al_resize_display, and implemented fullscreen resizing. Modified Paths: -------------- allegro/branches/4.9-newgfx/src/xdummy/xdisplay.c allegro/branches/4.9-newgfx/src/xdummy/xdummy.h allegro/branches/4.9-newgfx/src/xdummy/xfullscreen.c allegro/branches/4.9-newgfx/src/xdummy/xsystem.c Modified: allegro/branches/4.9-newgfx/src/xdummy/xdisplay.c =================================================================== --- allegro/branches/4.9-newgfx/src/xdummy/xdisplay.c 2007-06-30 09:54:01 UTC (rev 8024) +++ allegro/branches/4.9-newgfx/src/xdummy/xdisplay.c 2007-06-30 16:18:47 UTC (rev 8025) @@ -56,6 +56,9 @@ d->display.refresh_rate = al_get_new_display_refresh_rate(); d->display.flags = al_get_new_display_flags(); + // TODO: What is this? + d->xscreen = DefaultScreen(system->xdisplay); + if (d->display.flags | AL_FULLSCREEN) _al_xdummy_fullscreen_set_mode(system, w, h, 0, 0); @@ -67,6 +70,7 @@ backbuffer->is_backbuffer = 1; /* Create a memory cache for the whole screen. */ //TODO: Maybe we should do this lazily and defer to lock_bitmap_region + //FIXME: need to resize this on resizing if (!d->backbuffer->memory) { int n = w * h * al_get_pixel_size(d->backbuffer->format); d->backbuffer->memory = _AL_MALLOC(n); @@ -83,7 +87,7 @@ /* Let GLX choose an appropriate visual. */ int nelements; GLXFBConfig *fbc = glXChooseFBConfig(system->xdisplay, - DefaultScreen(system->xdisplay), 0, &nelements); + d->xscreen, 0, &nelements); XVisualInfo *vi = glXGetVisualFromFBConfig(system->xdisplay, fbc[0]); TRACE("xdisplay: Selected visual %lu.\n", vi->visualid); @@ -139,12 +143,8 @@ TRACE("xdisplay: GLX window created.\n"); - if (d->display.flags | AL_FULLSCREEN) { - int x, y; - Window child; - XTranslateCoordinates(system->xdisplay, d->window, - RootWindow(system->xdisplay, 0), 0, 0, &x, &y, &child); - _al_xdummy_fullscreen_set_origin(system, x, y); + if (d->display.flags & AL_FULLSCREEN) { + _al_xdummy_fullscreen_to_display(system, d); } /* Create a GLX context. */ @@ -226,11 +226,30 @@ static bool resize_display(AL_DISPLAY *d, int w, int h) { - AL_SYSTEM_XDUMMY *s = (AL_SYSTEM_XDUMMY *)al_system_driver(); + AL_SYSTEM_XDUMMY *system = (AL_SYSTEM_XDUMMY *)al_system_driver(); AL_DISPLAY_XDUMMY *glx = (AL_DISPLAY_XDUMMY *)d; + + _al_mutex_lock(&system->lock); + set_size_hints(d, w, h); - XResizeWindow(s->xdisplay, glx->window, w, h); - XSync(s->xdisplay, False); + XResizeWindow(system->xdisplay, glx->window, w, h); + XSync(system->xdisplay, False); + + /* Wait until we are actually resized. There might be a better way.. */ + _al_cond_wait(&system->resized, &system->lock); + + /* The user can expect the display to already be resized when resize_display + * returns. + * TODO: Right now, we still generate a resize event - maybe we should not. + */ + acknowledge_resize(d); + + if (d->flags & AL_FULLSCREEN) { + _al_xdummy_fullscreen_set_mode(system, w, h, 0, 0); + _al_xdummy_fullscreen_to_display(system, glx); + } + + _al_mutex_unlock(&system->lock); return true; } Modified: allegro/branches/4.9-newgfx/src/xdummy/xdummy.h =================================================================== --- allegro/branches/4.9-newgfx/src/xdummy/xdummy.h 2007-06-30 09:54:01 UTC (rev 8024) +++ allegro/branches/4.9-newgfx/src/xdummy/xdummy.h 2007-06-30 16:18:47 UTC (rev 8025) @@ -38,7 +38,10 @@ _AL_THREAD thread; /* background thread. */ _AL_MUTEX lock; /* thread lock for whenever we access internals. */ - _AL_COND mapped; /* condition variable to wait for mapping a window. */ + // FIXME: One condition variable really would be enough. + _AL_COND mapped; /* Condition variable to wait for mapping a window. */ + _AL_COND resized; /* Condition variable to wait for resizing a window. */ + bool pointer_grabbed; /* Is an XGrabPointer in effect? */ }; struct AL_BITMAP_XDUMMY @@ -64,6 +67,7 @@ AL_BITMAP *backbuffer; Window window; + int xscreen; /* TODO: what is this? something with multi-monitor? */ GLXWindow glxwindow; GLXContext context; Atom wm_delete_window_atom; @@ -92,4 +96,5 @@ int format, int refresh_rate); void _al_xdummy_store_video_mode(AL_SYSTEM_XDUMMY *s); void _al_xdummy_restore_video_mode(AL_SYSTEM_XDUMMY *s); -void _al_xdummy_fullscreen_set_origin(AL_SYSTEM_XDUMMY *s, int x, int y); +void _al_xdummy_fullscreen_to_display(AL_SYSTEM_XDUMMY *s, + AL_DISPLAY_XDUMMY *d); Modified: allegro/branches/4.9-newgfx/src/xdummy/xfullscreen.c =================================================================== --- allegro/branches/4.9-newgfx/src/xdummy/xfullscreen.c 2007-06-30 09:54:01 UTC (rev 8024) +++ allegro/branches/4.9-newgfx/src/xdummy/xfullscreen.c 2007-06-30 16:18:47 UTC (rev 8025) @@ -81,8 +81,20 @@ return true; } -void _al_xdummy_fullscreen_set_origin(AL_SYSTEM_XDUMMY *s, int x, int y) +void _al_xdummy_fullscreen_to_display(AL_SYSTEM_XDUMMY *s, AL_DISPLAY_XDUMMY *d) { + int x, y; + Window child; + + /* First, make sure the mouse stays inside the window. */ + XGrabPointer(s->xdisplay, d->window, False, + PointerMotionMask | ButtonPressMask | ButtonReleaseMask, + GrabModeAsync, GrabModeAsync, d->window, None, CurrentTime); + //FIXME: handle possible errors here + s->pointer_grabbed = true; + + XTranslateCoordinates(s->xdisplay, d->window, + RootWindow(s->xdisplay, d->xscreen), 0, 0, &x, &y, &child); XF86VidModeSetViewPort(s->xdisplay, 0, x, y); } @@ -95,6 +107,10 @@ void _al_xdummy_restore_video_mode(AL_SYSTEM_XDUMMY *s) { XF86VidModeSwitchToMode(s->xdisplay, 0, s->original_mode); + if (s->pointer_grabbed) { + XUngrabPointer(s->xdisplay, CurrentTime); + s->pointer_grabbed = false; + } } #else int _al_xdummy_get_num_display_modes(void) Modified: allegro/branches/4.9-newgfx/src/xdummy/xsystem.c =================================================================== --- allegro/branches/4.9-newgfx/src/xdummy/xsystem.c 2007-06-30 09:54:01 UTC (rev 8024) +++ allegro/branches/4.9-newgfx/src/xdummy/xsystem.c 2007-06-30 16:18:47 UTC (rev 8025) @@ -39,6 +39,7 @@ break; case ConfigureNotify: _al_display_xdummy_configure(&d->display, &event); + _al_cond_signal(&s->resized); break; case MapNotify: _al_cond_signal(&s->mapped); @@ -62,6 +63,7 @@ _al_mutex_init(&s->lock); _al_cond_init(&s->mapped); + _al_cond_init(&s->resized); _al_vector_init(&s->system.displays, sizeof (AL_SYSTEM_XDUMMY *)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |