X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fx11%2Ffg_main_x11.c;h=0e542535b756c8de6591b43f763ef5d6a2e8fe81;hb=2c12c9eb8d63cabac2d4113b4f54fdf53da8368c;hp=cc571858bee396239c42b0a841101fea273702eb;hpb=4934c772982075dd265cab06d5651c80245626c4;p=freeglut diff --git a/src/x11/fg_main_x11.c b/src/x11/fg_main_x11.c index cc57185..0e54253 100644 --- a/src/x11/fg_main_x11.c +++ b/src/x11/fg_main_x11.c @@ -1,5 +1,5 @@ /* - * freeglut_main_x11.c + * fg_main_x11.c * * The X11-specific windows message processing methods. * @@ -28,17 +28,8 @@ #include #include "../fg_internal.h" -#ifdef HAVE_ERRNO_H -# include -#endif +#include #include -#ifdef HAVE_VFPRINTF -# define VFPRINTF(s,f,a) vfprintf((s),(f),(a)) -#elif defined(HAVE__DOPRNT) -# define VFPRINTF(s,f,a) _doprnt((f),(a),(s)) -#else -# define VFPRINTF(s,f,a) -#endif /* @@ -56,6 +47,17 @@ # define MIN(a,b) (((a)<(b)) ? (a) : (b)) #endif +extern void fghOnReshapeNotify(SFG_Window *window, int width, int height, GLboolean forceNotify); +extern void fghOnPositionNotify(SFG_Window *window, int x, int y, GLboolean forceNotify); +extern void fgPlatformFullScreenToggle( SFG_Window *win ); +extern void fgPlatformPositionWindow( SFG_Window *window, int x, int y ); +extern void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height ); +extern void fgPlatformPushWindow( SFG_Window *window ); +extern void fgPlatformPopWindow( SFG_Window *window ); +extern void fgPlatformHideWindow( SFG_Window *window ); +extern void fgPlatformIconifyWindow( SFG_Window *window ); +extern void fgPlatformShowWindow( SFG_Window *window ); + /* used in the event handling code to match and discard stale mouse motion events */ static Bool match_motion(Display *dpy, XEvent *xev, XPointer arg); @@ -63,8 +65,7 @@ static Bool match_motion(Display *dpy, XEvent *xev, XPointer arg); * TODO BEFORE THE STABLE RELEASE: * * There are some issues concerning window redrawing under X11, and maybe - * some events are not handled. The Win32 version lacks some more features, - * but seems acceptable for not demanding purposes. + * some events are not handled. * * Need to investigate why the X11 version breaks out with an error when * closing a window (using the window manager, not glutDestroyWindow)... @@ -115,10 +116,8 @@ void fgPlatformSleepForEvents( fg_time_t msec ) wait.tv_usec = (msec % 1000) * 1000; err = select( socket+1, &fdset, NULL, NULL, &wait ); -#ifdef HAVE_ERRNO_H if( ( -1 == err ) && ( errno != EINTR ) ) fgWarning ( "freeglut select() error: %d", errno ); -#endif } } @@ -644,29 +643,25 @@ void fgPlatformProcessSingleEvent ( void ) case CreateNotify: case ConfigureNotify: { - int width, height; + int width, height, x, y; if( event.type == CreateNotify ) { GETWINDOW( xcreatewindow ); width = event.xcreatewindow.width; height = event.xcreatewindow.height; + x = event.xcreatewindow.x; + y = event.xcreatewindow.y; } else { GETWINDOW( xconfigure ); width = event.xconfigure.width; height = event.xconfigure.height; + x = event.xconfigure.x; + y = event.xconfigure.y; } - if( ( width != window->State.pWState.OldWidth ) || - ( height != window->State.pWState.OldHeight ) ) - { - SFG_Window *current_window = fgStructure.CurrentWindow; - - window->State.pWState.OldWidth = width; - window->State.pWState.OldHeight = height; - INVOKE_WCB( *window, Reshape, ( width, height ) ); - glutPostRedisplay( ); - if( window->IsMenu ) - fgSetWindow( current_window ); - } + /* Update state and call callback, if there was a change */ + fghOnPositionNotify(window, x, y, GL_FALSE); + /* Update state and call callback, if there was a change */ + fghOnReshapeNotify(window, width, height, GL_FALSE); } break; @@ -692,7 +687,7 @@ void fgPlatformProcessSingleEvent ( void ) if( event.xexpose.count == 0 ) { GETWINDOW( xexpose ); - window->State.Redisplay = GL_TRUE; + window->State.WorkMask |= GLUT_DISPLAY_WORK; } break; @@ -918,20 +913,20 @@ void fgPlatformProcessSingleEvent ( void ) if ( event.xkey.keycode<256 ) /* XQueryKeymap is limited to 256 keycodes */ { if ( keys[event.xkey.keycode>>3] & (1<<(event.xkey.keycode%8)) ) - window->State.KeyRepeating = GL_TRUE; + window->State.pWState.KeyRepeating = GL_TRUE; else - window->State.KeyRepeating = GL_FALSE; + window->State.pWState.KeyRepeating = GL_FALSE; } } } else - window->State.KeyRepeating = GL_FALSE; + window->State.pWState.KeyRepeating = GL_FALSE; /* Cease processing this event if it is auto repeated */ - if (window->State.KeyRepeating) + if (window->State.pWState.KeyRepeating) { - if (event.type == KeyPress) window->State.KeyRepeating = GL_FALSE; + if (event.type == KeyPress) window->State.pWState.KeyRepeating = GL_FALSE; break; } @@ -1071,3 +1066,55 @@ void fgPlatformMainLoopPreliminaryWork ( void ) { } + +/* deal with work list items */ +void fgPlatformInitWork(SFG_Window* window) +{ + /* Notify windowStatus/visibility, position and size get notified on window creation with message handlers above + * XXX CHECK: do the messages happen too early like on windows, so client code cannot have registered + * a callback yet and the message is thus never received by client? + * -> this is a no-op + */ + return; +} + +void fgPlatformPosResZordWork(SFG_Window* window, unsigned int workMask) +{ + if (workMask & GLUT_FULL_SCREEN_WORK) + fgPlatformFullScreenToggle( window ); + if (workMask & GLUT_POSITION_WORK) + fgPlatformPositionWindow( window, window->State.DesiredXpos, window->State.DesiredYpos ); + if (workMask & GLUT_SIZE_WORK) + fgPlatformReshapeWindow ( window, window->State.DesiredWidth, window->State.DesiredHeight ); + if (workMask & GLUT_ZORDER_WORK) + { + if (window->State.DesiredZOrder < 0) + fgPlatformPushWindow( window ); + else + fgPlatformPopWindow( window ); + } +} + +void fgPlatformVisibilityWork(SFG_Window* window) +{ + /* Visibility status of window gets updated in the window message handlers above + * XXX: is this really the case? check + */ + SFG_Window *win = window; + switch (window->State.DesiredVisibility) + { + case DesireHiddenState: + fgPlatformHideWindow( window ); + break; + case DesireIconicState: + /* Call on top-level window */ + while (win->Parent) + win = win->Parent; + fgPlatformIconifyWindow( win ); + break; + case DesireNormalState: + fgPlatformShowWindow( window ); + break; + } +} +