X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_spaceball.c;h=89655f4571f940e112fe3094d50e64b9d03b4cfc;hb=e31cce4d7a8789dc9c0dc723c4c13e719ad2db86;hp=a36008e08038c6a4ab9794d3ff31fc8ac3333149;hpb=8507764d48cceb8461f9d0194915fa0b7fb58447;p=freeglut diff --git a/src/freeglut_spaceball.c b/src/freeglut_spaceball.c index a36008e..89655f4 100644 --- a/src/freeglut_spaceball.c +++ b/src/freeglut_spaceball.c @@ -10,6 +10,8 @@ #include #include "freeglut_internal.h" +/* -- PRIVATE FUNCTIONS --------------------------------------------------- */ + #if TARGET_HOST_POSIX_X11 #include @@ -50,12 +52,17 @@ static int spnav_remove_events(int type); static SFG_Window *spnav_win; #endif -static int sball_initialized; +/* Flag telling whether we have a spaceball: + * 0 - haven't tried initializing + * 1 - have successfully initialized + * -1 - have tried to initialize but not succeeded + */ +static int sball_initialized = 0; void fgInitialiseSpaceball(void) { - if(sball_initialized) { + if(sball_initialized != 0) { return; } @@ -64,10 +71,15 @@ void fgInitialiseSpaceball(void) Window w; if(!fgStructure.CurrentWindow) + { + sball_initialized = -1; return; + } w = fgStructure.CurrentWindow->Window.Handle; - if(spnav_x11_open(fgDisplay.Display, w) == -1) { + if(spnav_x11_open(fgDisplay.Display, w) == -1) + { + sball_initialized = -1; return; } } @@ -85,9 +97,9 @@ void fgSpaceballClose(void) int fgHasSpaceball(void) { - if(!sball_initialized) { + if(sball_initialized == 0) { fgInitialiseSpaceball(); - if(!sball_initialized) { + if(sball_initialized != 1) { fgWarning("fgInitialiseSpaceball failed\n"); return 0; } @@ -105,9 +117,9 @@ int fgHasSpaceball(void) int fgSpaceballNumButtons(void) { - if(!sball_initialized) { + if(sball_initialized == 0) { fgInitialiseSpaceball(); - if(!sball_initialized) { + if(sball_initialized != 1) { fgWarning("fgInitialiseSpaceball failed\n"); return 0; } @@ -122,9 +134,9 @@ int fgSpaceballNumButtons(void) void fgSpaceballSetWindow(SFG_Window *window) { - if(!sball_initialized) { + if(sball_initialized == 0) { fgInitialiseSpaceball(); - if(!sball_initialized) { + if(sball_initialized != 1) { return; } } @@ -143,11 +155,13 @@ int fgIsSpaceballXEvent(const XEvent *xev) { spnav_event sev; - if(!sball_initialized) { - fgInitialiseSpaceball(); - if(!sball_initialized) { - return 0; - } + if(spnav_win != fgStructure.CurrentWindow) { + /* this will also initialize spaceball if needed (first call) */ + fgSpaceballSetWindow(fgStructure.CurrentWindow); + } + + if(sball_initialized != 1) { + return 0; } return spnav_x11_event(xev, &sev); @@ -157,9 +171,9 @@ void fgSpaceballHandleXEvent(const XEvent *xev) { spnav_event sev; - if(!sball_initialized) { + if(sball_initialized == 0) { fgInitialiseSpaceball(); - if(!sball_initialized) { + if(sball_initialized != 1) { return; } } @@ -215,7 +229,10 @@ OF SUCH DAMAGE. #include #include #include + +#ifdef HAVE_ERRNO_H #include +#endif #include #include