Re: "Cool CPU during config" patch

Annick et Jean-Philippe <[email protected]>
Newsgroups gmane.games.torcs.devel
Message-ID <[email protected]>
Hi, all.

I discovered a bug in the patch : the idle function that cools the CPU
was used in race practice mode, when blind mode is on (only results),
and also during all kinds of race qualification (another type of "blind mode").

This is the corrected version.

Please, test and tell me about your impressions.

Cheers,

Jean-Philippe.

-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Don't miss this year's exciting event. There's still time to save $100. 
Use priority code J8TL2D2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone

_______________________________________________
Torcs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/torcs-devel
coolCPUDuringConfig.afterNoMaxModuleInterfaces.patch (text/x-patch, 11.7 KB)
diff -Naur current.coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/client/client.def coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/client/client.def
--- current.coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/client/client.def	2008-04-16 21:23:30.000000000 +0200
+++ coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/client/client.def	2008-04-17 22:07:48.000000000 +0200
@@ -36,13 +36,15 @@
 	GfScrShutdown
 	GfuiDisplay
 	GfuiDisplayNothing
-	GfuiIdle
+	GfuiIdleCPUCooler
+	GfuiIdleNoCPURest
 	GfuiScreenCreate
 	GfuiScreenCreateEx
 	GfuiScreenRelease
 	GfuiScreenActivate
 	GfuiScreenReplace
 	GfuiScreenDeactivate
+	GfuiSetScreenIdleFunc
 	GfuiAddKey
 	GfuiAddSKey
 	GfuiHelpScreen
diff -Naur current.coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/confscreens/controlconfig.cpp coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/confscreens/controlconfig.cpp
--- current.coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/confscreens/controlconfig.cpp	2008-04-16 22:31:46.000000000 +0200
+++ coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/confscreens/controlconfig.cpp	2008-04-17 21:53:04.000000000 +0200
@@ -234,7 +234,7 @@
 	Cmd[CurrentCmd].ref.type = GFCTRL_TYPE_KEYBOARD;
     }
 
-    glutIdleFunc(GfuiIdle);
+    GfuiSetScreenIdleFunc(ScrHandle, GfuiIdleCPUCooler);
     InputWaited = 0;
     updateButtonText();
     return 1;
@@ -252,7 +252,7 @@
     Cmd[CurrentCmd].ref.index = key;
     Cmd[CurrentCmd].ref.type = GFCTRL_TYPE_SKEYBOARD;
 
-    glutIdleFunc(GfuiIdle);
+    GfuiSetScreenIdleFunc(ScrHandle, GfuiIdleCPUCooler);
     InputWaited = 0;
     updateButtonText();
     return 1;
@@ -284,12 +284,14 @@
     char	*str;
     int		axis;
 
+    ulMilliSecondSleep(10); // Let CPU keep cool.
+
     GfctrlMouseGetCurrent(&MouseInfo);
 
     /* Check for a mouse button pressed */
     for (i = 0; i < 3; i++) {
 	if (MouseInfo.edgedn[i]) {
-	    glutIdleFunc(GfuiIdle);
+	    GfuiSetScreenIdleFunc(ScrHandle, GfuiIdleCPUCooler);
 	    InputWaited = 0;
 	    str = GfctrlGetNameByRef(GFCTRL_TYPE_MOUSE_BUT, i);
 	    Cmd[CurrentCmd].ref.index = i;
@@ -303,7 +305,7 @@
     /* Check for a mouse axis moved */
     for (i = 0; i < 4; i++) {
 	if (MouseInfo.ax[i] > 20.0) {
-	    glutIdleFunc(GfuiIdle);
+	    GfuiSetScreenIdleFunc(ScrHandle, GfuiIdleCPUCooler);
 	    InputWaited = 0;
 	    str = GfctrlGetNameByRef(GFCTRL_TYPE_MOUSE_AXIS, i);
 	    Cmd[CurrentCmd].ref.index = i;
@@ -323,7 +325,7 @@
 	    for (i = 0, mask = 1; i < 32; i++, mask *= 2) {
 		if (((b & mask) != 0) && ((JoyButtons[index] & mask) == 0)) {
 		    /* Button i fired */
-		    glutIdleFunc(GfuiIdle);
+		    GfuiSetScreenIdleFunc(ScrHandle, GfuiIdleCPUCooler);
 		    InputWaited = 0;
 		    str = GfctrlGetNameByRef(GFCTRL_TYPE_JOY_BUT, i + 32 * index);
 		    Cmd[CurrentCmd].ref.index = i + 32 * index;
@@ -341,7 +343,7 @@
     /* detect joystick movement */
     axis = getMovedAxis();
     if (axis != -1) {
-	glutIdleFunc(GfuiIdle);
+	GfuiSetScreenIdleFunc(ScrHandle, GfuiIdleCPUCooler);
 	InputWaited = 0;
 	Cmd[CurrentCmd].ref.type = GFCTRL_TYPE_JOY_AXIS;
 	Cmd[CurrentCmd].ref.index = axis;
@@ -374,7 +376,11 @@
     if (Cmd[CurrentCmd].keyboardPossible) {
 	InputWaited = 1;
     }
-    glutIdleFunc(Idle);
+
+    /* Set GLUT idle function */
+    GfuiSetScreenIdleFunc(ScrHandle, Idle);
+
+    /* Read initial mouse status */
     GfctrlMouseInitCenter();
     memset(&MouseInfo, 0, sizeof(MouseInfo));
     GfctrlMouseGetCurrent(&MouseInfo);
diff -Naur current.coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/confscreens/joystickconfig.cpp coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/confscreens/joystickconfig.cpp
--- current.coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/confscreens/joystickconfig.cpp	2008-04-17 21:49:42.000000000 +0200
+++ coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/confscreens/joystickconfig.cpp	2008-04-17 21:53:24.000000000 +0200
@@ -137,6 +137,8 @@
     int		b, i;
     int		index;
 
+    ulMilliSecondSleep(10); // Let CPU keep cool.
+
     for (index = 0; index < NUM_JOY; index++) {
 	if (js[index]) {
 	    js[index]->read(&b, &ax[index * MAX_AXES]);
@@ -147,7 +149,7 @@
 		    /* Button fired */
 		    JoyCalAutomaton();
 		    if (CalState >= NB_STEPS) {
-			glutIdleFunc(GfuiIdle);
+			GfuiSetScreenIdleFunc(scrHandle2, GfuiIdleCPUCooler);
 		    }
 		    glutPostRedisplay();
 		    rawb[index] = b;
@@ -169,7 +171,7 @@
     
     CalState = 0;
     GfuiLabelSetText(scrHandle2, InstId, Instructions[CalState]);
-    glutIdleFunc(Idle2);
+    GfuiSetScreenIdleFunc(scrHandle2, Idle2);
     glutPostRedisplay();
     for (index = 0; index < NUM_JOY; index++) {
 	if (js[index]) {
diff -Naur current.coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/confscreens/mouseconfig.cpp coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/confscreens/mouseconfig.cpp
--- current.coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/confscreens/mouseconfig.cpp	2008-04-17 21:49:42.000000000 +0200
+++ coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/confscreens/mouseconfig.cpp	2008-04-17 21:54:03.000000000 +0200
@@ -111,9 +111,9 @@
     CalState = GetNextAxis();
     GfuiLabelSetText(scrHandle2, InstId, Instructions[CalState]);
     if (CalState < 4) {
-	glutIdleFunc(Idle2);
+	GfuiSetScreenIdleFunc(scrHandle2, Idle2);
     } else {
-	glutIdleFunc(GfuiIdle);
+	GfuiSetScreenIdleFunc(scrHandle2, GfuiIdleCPUCooler);
     }
 }
 
@@ -122,6 +122,8 @@
 {
     int	i;
 
+    ulMilliSecondSleep(1); // Let CPU keep cool.
+
     GfctrlMouseGetCurrent(&mouseInfo);
 
     /* Check for a mouse button pressed */
@@ -140,7 +142,7 @@
     memset(&mouseInfo, 0, sizeof(mouseInfo));
     GfctrlMouseGetCurrent(&mouseInfo);
     GfctrlMouseInitCenter();
-    glutIdleFunc(Idle2);
+    GfuiSetScreenIdleFunc(scrHandle2, Idle2);
 }
 
 static void
@@ -153,7 +155,7 @@
     GetNextAxis();
     GfuiLabelSetText(scrHandle2, InstId, Instructions[CalState]);
     if (CalState < 4) {
-	glutIdleFunc(IdleMouseInit);
+	GfuiSetScreenIdleFunc(scrHandle2, IdleMouseInit);
 	GfctrlMouseCenter();
     }
 }
diff -Naur current.coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/raceengineclient/racegl.cpp coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/raceengineclient/racegl.cpp
--- current.coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/raceengineclient/racegl.cpp	2008-04-17 21:49:42.000000000 +0200
+++ coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/raceengineclient/racegl.cpp	2008-04-17 21:54:27.000000000 +0200
@@ -173,6 +173,10 @@
 
     reScreenHandle = GfuiScreenCreateEx(bgcolor, 0, reScreenActivate, 0, 0, 0);
 
+    // The default glut idle function (GfuiIdleCPUCooler) is not suitable
+    // for race time : we want the CPU to work restlessly !
+    GfuiSetScreenIdleFunc(reScreenHandle, GfuiIdleNoCPURest);
+
     reAddKeys();
 
     reMsgId = GfuiLabelCreateEx(reScreenHandle,
@@ -321,6 +325,10 @@

     GfuiTitleCreate(reResScreenHdle, title[ReInfo->s->_raceType], strlen(title[ReInfo->s->_raceType]));

+    // The default glut idle function (GfuiIdleCPUCooler) is not suitable
+    // for race time : we want the CPU to work restlessly !
+    GfuiSetScreenIdleFunc(reResScreenHdle, GfuiIdleNoCPURest);
+
     img = GfParmGetStr(ReInfo->params, RM_SECT_HEADER, RM_ATTR_RUNIMG, 0);
     if (img) {
        GfuiScreenAddBgImg(reResScreenHdle, img);
diff -Naur current.coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/tgfclient/gui.cpp coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/tgfclient/gui.cpp
--- current.coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/tgfclient/gui.cpp	2008-04-16 21:48:44.000000000 +0200
+++ coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/tgfclient/gui.cpp	2008-04-17 22:00:39.000000000 +0200
@@ -109,11 +109,12 @@
 {
 }
 
-/** Idle function for the GUI to be called during Idle loop of glut.
+/** Idle function for the GUI to be called during Idle loop of glut
+    with mouse events management, and no care about CPU overuse
     @ingroup	gui
  */
 void
-GfuiIdle(void)
+GfuiIdleNoCPURest(void)
 {
 	double		curtime = GfTimeClock();
 	
@@ -129,6 +130,18 @@
 	}
 }
 
+/** Idle function for the GUI to be called during Idle loop of glut
+    with mouse events management, and care about CPU cooling
+    @ingroup	gui
+ */
+void
+GfuiIdleCPUCooler(void)
+{
+	ulMilliSecondSleep(10); // Let CPU keep/become cool.
+
+	GfuiIdleNoCPURest();
+}
+
 /** Display function for the GUI to be called during redisplay of glut.
     @ingroup	gui
 */
@@ -459,7 +472,7 @@
 	glutMouseFunc(gfuiMouse);
 	glutMotionFunc(gfuiMotion);
 	glutPassiveMotionFunc(gfuiPassiveMotion);
-	glutIdleFunc(GfuiIdle);
+	glutIdleFunc(GfuiScreen->idleFunc);
 	
 	if (GfuiScreen->onlyCallback == 0) {
 		if (GfuiScreen->hasFocus == NULL) {
@@ -545,6 +558,8 @@
 	screen->mouseColor[1] = &(GfuiColor[GFUI_MOUSECOLOR2][0]);
 	screen->mouseAllowed = 1;
 	
+	screen->idleFunc = GfuiIdleCPUCooler;
+
 	return (void*)screen;
 }
 
@@ -601,9 +616,28 @@
 	
 	screen->mouseAllowed = mouseAllowed;
 	
+	screen->idleFunc = GfuiIdleCPUCooler;
+
 	return (void*)screen;
 }
 
+/** Set the glut idle function for the given screen
+    and register it in glut if it is active
+    @ingroup	gui
+    @param	screen	Screen to modify
+    @param	idle	The new glut idle function
+ */
+void 
+GfuiSetScreenIdleFunc(void *scr, tfuiIdleFunc idle)
+{
+	tGfuiScreen *screen = (tGfuiScreen*)scr;
+
+	screen->idleFunc = idle;
+	if (GfuiScreenIsActive(screen))
+		glutIdleFunc(screen->idleFunc);
+}
+
+
 /** Release the given screen.
     @ingroup	gui
     @param	scr	Screen to release
@@ -680,6 +714,8 @@
 	screen->userActData = userDataOnActivate;
 	screen->onlyCallback = 1;
 	
+	screen->idleFunc = GfuiIdleCPUCooler;
+
 	return (void*)screen;
 }
 
diff -Naur current.coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/tgfclient/gui.h coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/tgfclient/gui.h
--- current.coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/tgfclient/gui.h	2008-04-17 21:49:42.000000000 +0200
+++ coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/tgfclient/gui.h	2008-04-17 21:55:09.000000000 +0200
@@ -228,6 +228,9 @@
     tfuiKeyCallback	onKeyAction;
     tfuiSKeyCallback	onSKeyAction;
 
+    /* glut idle function */
+    tfuiIdleFunc	idleFunc;
+
     /* mouse handling */
     int			mouse;
     int			mouseAllowed;
diff -Naur current.coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/tgfclient/tgfclient.h coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/tgfclient/tgfclient.h
--- current.coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/tgfclient/tgfclient.h	2008-04-16 21:49:29.000000000 +0200
+++ coolCPUDuringConfig.afterNoMaxModuleInterfaces/src/libs/tgfclient/tgfclient.h	2008-04-17 21:59:45.000000000 +0200
@@ -100,6 +100,7 @@
     void	*userData;	/**< Associated user data */
 } tScrollBarInfo;
 
+typedef void (*tfuiIdleFunc)(void);
 typedef void (*tfuiCallback)(void * /* userdata */);
 typedef void (*tfuiSBCallback)(tScrollBarInfo *);
 typedef int (*tfuiKeyCallback)(unsigned char key, int modifier, int state); /**< return 1 to prevent normal key computing */
@@ -112,7 +113,8 @@
 /* after a call to GfuiActivateScreen       */
 extern void GfuiDisplay(void);
 extern void GfuiDisplayNothing(void);
-extern void GfuiIdle(void);
+extern void GfuiIdleNoCPURest(void);
+extern void GfuiIdleCPUCooler(void);
 
 /* Screen management */
 extern void *GfuiScreenCreate(void);
@@ -125,6 +127,7 @@
 extern int  GfuiScreenIsActive(void *screen);
 extern void GfuiScreenReplace(void *screen);
 extern void GfuiScreenDeactivate(void);
+extern void GfuiSetScreenIdleFunc(void *screen, tfuiIdleFunc idle);
 extern void *GfuiHookCreate(void *userDataOnActivate, tfuiCallback onActivate);
 extern void GfuiHookRelease(void *hook);
 extern void GfuiAddKey(void *scr, unsigned char key, char *descr, void *userData, tfuiCallback onKeyPressed, tfuiCallback onKeyReleased);
coolCPUDuringConfig.beforeNoMaxModuleInterfaces.patch (text/x-patch, 11.8 KB)
diff -Naur current.coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/client/client.def coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/client/client.def
--- current.coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/client/client.def	2008-02-24 17:51:28.000000000 +0100
+++ coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/client/client.def	2008-04-17 22:08:18.000000000 +0200
@@ -36,13 +36,15 @@
 	GfScrShutdown
 	GfuiDisplay
 	GfuiDisplayNothing
-	GfuiIdle
+	GfuiIdleCPUCooler
+	GfuiIdleNoCPURest
 	GfuiScreenCreate
 	GfuiScreenCreateEx
 	GfuiScreenRelease
 	GfuiScreenActivate
 	GfuiScreenReplace
 	GfuiScreenDeactivate
+	GfuiSetScreenIdleFunc
 	GfuiAddKey
 	GfuiAddSKey
 	GfuiHelpScreen
diff -Naur current.coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/confscreens/controlconfig.cpp coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/confscreens/controlconfig.cpp
--- current.coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/confscreens/controlconfig.cpp	2008-03-30 18:54:32.000000000 +0200
+++ coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/confscreens/controlconfig.cpp	2008-04-17 22:31:25.000000000 +0200
@@ -276,7 +276,7 @@
 	GfParmSetStr(PrefHdle, CurrentSection, Cmd[CurrentCmd].name, name);
     }
 
-    glutIdleFunc(GfuiIdle);
+    GfuiSetScreenIdleFunc(scrHandle, GfuiIdleCPUCooler);
     InputWaited = 0;
     updateButtonText();
     return 1;
@@ -295,7 +295,7 @@
     Cmd[CurrentCmd].ref.type = GFCTRL_TYPE_SKEYBOARD;
     GfParmSetStr(PrefHdle, CurrentSection, Cmd[CurrentCmd].name, name);
 
-    glutIdleFunc(GfuiIdle);
+    GfuiSetScreenIdleFunc(scrHandle, GfuiIdleCPUCooler);
     InputWaited = 0;
     updateButtonText();
     return 1;
@@ -326,12 +326,14 @@
     char	*str;
     int		axis;
 
+    ulMilliSecondSleep(10); // Let CPU keep cool.
+
     GfctrlMouseGetCurrent(&mouseInfo);
 
     /* Check for a mouse button pressed */
     for (i = 0; i < 3; i++) {
 	if (mouseInfo.edgedn[i]) {
-	    glutIdleFunc(GfuiIdle);
+	    GfuiSetScreenIdleFunc(scrHandle, GfuiIdleCPUCooler);
 	    InputWaited = 0;
 	    str = GfctrlGetNameByRef(GFCTRL_TYPE_MOUSE_BUT, i);
 	    Cmd[CurrentCmd].ref.index = i;
@@ -345,7 +347,7 @@
     /* Check for a mouse axis moved */
     for (i = 0; i < 4; i++) {
 	if (mouseInfo.ax[i] > 20.0) {
-	    glutIdleFunc(GfuiIdle);
+	    GfuiSetScreenIdleFunc(scrHandle, GfuiIdleCPUCooler);
 	    InputWaited = 0;
 	    str = GfctrlGetNameByRef(GFCTRL_TYPE_MOUSE_AXIS, i);
 	    Cmd[CurrentCmd].ref.index = i;
@@ -365,7 +367,7 @@
 	    for (i = 0, mask = 1; i < 32; i++, mask *= 2) {
 		if (((b & mask) != 0) && ((rawb[index] & mask) == 0)) {
 		    /* Button i fired */
-		    glutIdleFunc(GfuiIdle);
+		    GfuiSetScreenIdleFunc(scrHandle, GfuiIdleCPUCooler);
 		    InputWaited = 0;
 		    str = GfctrlGetNameByRef(GFCTRL_TYPE_JOY_BUT, i + 32 * index);
 		    Cmd[CurrentCmd].ref.index = i + 32 * index;
@@ -383,7 +385,7 @@
     /* detect joystick movement */
     axis = getMovedAxis();
     if (axis != -1) {
-	glutIdleFunc(GfuiIdle);
+	GfuiSetScreenIdleFunc(scrHandle, GfuiIdleCPUCooler);
 	InputWaited = 0;
 	Cmd[CurrentCmd].ref.type = GFCTRL_TYPE_JOY_AXIS;
 	Cmd[CurrentCmd].ref.index = axis;
@@ -408,7 +410,10 @@
     if (Cmd[CurrentCmd].keyboardPossible) {
 	InputWaited = 1;
     }
-    glutIdleFunc(Idle);
+
+    /* Set GLUT idle function */
+    GfuiSetScreenIdleFunc(scrHandle, Idle);
+
     GfctrlMouseInitCenter();
     memset(&mouseInfo, 0, sizeof(mouseInfo));
     GfctrlMouseGetCurrent(&mouseInfo);
diff -Naur current.coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/confscreens/joystickconfig.cpp coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/confscreens/joystickconfig.cpp
--- current.coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/confscreens/joystickconfig.cpp	2008-03-30 18:54:33.000000000 +0200
+++ coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/confscreens/joystickconfig.cpp	2008-04-17 21:35:43.000000000 +0200
@@ -137,6 +137,8 @@
     int		b, i;
     int		index;
 
+    ulMilliSecondSleep(10); // Let CPU keep cool.
+
     for (index = 0; index < NUM_JOY; index++) {
 	if (js[index]) {
 	    js[index]->read(&b, &ax[index * MAX_AXES]);
@@ -147,7 +149,7 @@
 		    /* Button fired */
 		    JoyCalAutomaton();
 		    if (CalState >= NB_STEPS) {
-			glutIdleFunc(GfuiIdle);
+			GfuiSetScreenIdleFunc(scrHandle2, GfuiIdleCPUCooler);
 		    }
 		    glutPostRedisplay();
 		    rawb[index] = b;
@@ -169,7 +171,7 @@
     
     CalState = 0;
     GfuiLabelSetText(scrHandle2, InstId, Instructions[CalState]);
-    glutIdleFunc(Idle2);
+    GfuiSetScreenIdleFunc(scrHandle2, Idle2);
     glutPostRedisplay();
     for (index = 0; index < NUM_JOY; index++) {
 	if (js[index]) {
diff -Naur current.coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/confscreens/mouseconfig.cpp coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/confscreens/mouseconfig.cpp
--- current.coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/confscreens/mouseconfig.cpp	2008-03-30 18:54:33.000000000 +0200
+++ coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/confscreens/mouseconfig.cpp	2008-04-17 21:36:26.000000000 +0200
@@ -111,9 +111,9 @@
     CalState = GetNextAxis();
     GfuiLabelSetText(scrHandle2, InstId, Instructions[CalState]);
     if (CalState < 4) {
-	glutIdleFunc(Idle2);
+	GfuiSetScreenIdleFunc(scrHandle2, Idle2);
     } else {
-	glutIdleFunc(GfuiIdle);
+	GfuiSetScreenIdleFunc(scrHandle2, GfuiIdleCPUCooler);
     }
 }
 
@@ -122,6 +122,8 @@
 {
     int	i;
 
+    ulMilliSecondSleep(1); // Let CPU keep cool.
+
     GfctrlMouseGetCurrent(&mouseInfo);
 
     /* Check for a mouse button pressed */
@@ -140,7 +142,7 @@
     memset(&mouseInfo, 0, sizeof(mouseInfo));
     GfctrlMouseGetCurrent(&mouseInfo);
     GfctrlMouseInitCenter();
-    glutIdleFunc(Idle2);
+    GfuiSetScreenIdleFunc(scrHandle2, Idle2);
 }
 
 static void
@@ -153,7 +155,7 @@
     GetNextAxis();
     GfuiLabelSetText(scrHandle2, InstId, Instructions[CalState]);
     if (CalState < 4) {
-	glutIdleFunc(IdleMouseInit);
+	GfuiSetScreenIdleFunc(scrHandle2, IdleMouseInit);
 	GfctrlMouseCenter();
     }
 }
diff -Naur current.coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/raceengineclient/racegl.cpp coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/raceengineclient/racegl.cpp
--- current.coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/raceengineclient/racegl.cpp	2008-02-24 17:51:28.000000000 +0100
+++ coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/raceengineclient/racegl.cpp	2008-04-17 21:24:41.000000000 +0200
@@ -173,6 +173,10 @@
 
     reScreenHandle = GfuiScreenCreateEx(bgcolor, 0, reScreenActivate, 0, 0, 0);
 
+    // The default glut idle function (GfuiIdleCPUCooler) is not suitable
+    // for race time : we want the CPU to work restlessly !
+    GfuiSetScreenIdleFunc(reScreenHandle, GfuiIdleNoCPURest);
+
     reAddKeys();
 
     reMsgId = GfuiLabelCreateEx(reScreenHandle,
@@ -321,6 +325,10 @@

     GfuiTitleCreate(reResScreenHdle, title[ReInfo->s->_raceType], strlen(title[ReInfo->s->_raceType]));

+    // The default glut idle function (GfuiIdleCPUCooler) is not suitable
+    // for race time : we want the CPU to work restlessly !
+    GfuiSetScreenIdleFunc(reResScreenHdle, GfuiIdleNoCPURest);
+
     img = GfParmGetStr(ReInfo->params, RM_SECT_HEADER, RM_ATTR_RUNIMG, 0);
     if (img) {
        GfuiScreenAddBgImg(reResScreenHdle, img);
diff -Naur current.coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/tgfclient/gui.cpp coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/tgfclient/gui.cpp
--- current.coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/tgfclient/gui.cpp	2008-02-24 17:51:28.000000000 +0100
+++ coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/tgfclient/gui.cpp	2008-04-17 21:26:47.000000000 +0200
@@ -109,11 +109,12 @@
 {
 }
 
-/** Idle function for the GUI to be called during Idle loop of glut.
+/** Idle function for the GUI to be called during Idle loop of glut
+    with mouse events management, and no care about CPU overuse
     @ingroup	gui
  */
 void
-GfuiIdle(void)
+GfuiIdleNoCPURest(void)
 {
 	double		curtime = GfTimeClock();
 	
@@ -129,6 +130,18 @@
 	}
 }
 
+/** Idle function for the GUI to be called during Idle loop of glut
+    with mouse events management, and care about CPU cooling
+    @ingroup	gui
+ */
+void
+GfuiIdleCPUCooler(void)
+{
+	ulMilliSecondSleep(10); // Let CPU keep/become cool.
+
+	GfuiIdleNoCPURest();
+}
+
 /** Display function for the GUI to be called during redisplay of glut.
     @ingroup	gui
 */
@@ -459,7 +472,7 @@
 	glutMouseFunc(gfuiMouse);
 	glutMotionFunc(gfuiMotion);
 	glutPassiveMotionFunc(gfuiPassiveMotion);
-	glutIdleFunc(GfuiIdle);
+	glutIdleFunc(GfuiScreen->idleFunc);
 	
 	if (GfuiScreen->onlyCallback == 0) {
 		if (GfuiScreen->hasFocus == NULL) {
@@ -545,6 +558,8 @@
 	screen->mouseColor[1] = &(GfuiColor[GFUI_MOUSECOLOR2][0]);
 	screen->mouseAllowed = 1;
 	
+	screen->idleFunc = GfuiIdleCPUCooler;
+
 	return (void*)screen;
 }
 
@@ -601,9 +616,28 @@
 	
 	screen->mouseAllowed = mouseAllowed;
 	
+	screen->idleFunc = GfuiIdleCPUCooler;
+
 	return (void*)screen;
 }
 
+/** Set the glut idle function for the given screen
+    and register it in glut if it is active
+    @ingroup	gui
+    @param	screen	Screen to modify
+    @param	idle	The new glut idle function
+ */
+void 
+GfuiSetScreenIdleFunc(void *scr, tfuiIdleFunc idle)
+{
+	tGfuiScreen *screen = (tGfuiScreen*)scr;
+
+	screen->idleFunc = idle;
+	if (GfuiScreenIsActive(screen))
+		glutIdleFunc(screen->idleFunc);
+}
+
+
 /** Release the given screen.
     @ingroup	gui
     @param	scr	Screen to release
@@ -680,6 +714,8 @@
 	screen->userActData = userDataOnActivate;
 	screen->onlyCallback = 1;
 	
+	screen->idleFunc = GfuiIdleCPUCooler;
+
 	return (void*)screen;
 }
 
diff -Naur current.coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/tgfclient/gui.h coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/tgfclient/gui.h
--- current.coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/tgfclient/gui.h	2008-02-24 17:51:28.000000000 +0100
+++ coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/tgfclient/gui.h	2008-04-17 21:25:39.000000000 +0200
@@ -228,6 +228,9 @@
     tfuiKeyCallback	onKeyAction;
     tfuiSKeyCallback	onSKeyAction;
 
+    /* glut idle function */
+    tfuiIdleFunc	idleFunc;
+
     /* mouse handling */
     int			mouse;
     int			mouseAllowed;
diff -Naur current.coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/tgfclient/tgfclient.h coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/tgfclient/tgfclient.h
--- current.coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/tgfclient/tgfclient.h	2008-03-08 16:36:34.000000000 +0100
+++ coolCPUDuringConfig.beforeNoMaxModuleInterfaces/src/libs/tgfclient/tgfclient.h	2008-04-17 21:25:25.000000000 +0200
@@ -100,6 +100,7 @@
     void	*userData;	/**< Associated user data */
 } tScrollBarInfo;
 
+typedef void (*tfuiIdleFunc)(void);
 typedef void (*tfuiCallback)(void * /* userdata */);
 typedef void (*tfuiSBCallback)(tScrollBarInfo *);
 typedef int (*tfuiKeyCallback)(unsigned char key, int modifier, int state); /**< return 1 to prevent normal key computing */
@@ -112,7 +113,8 @@
 /* after a call to GfuiActivateScreen       */
 extern void GfuiDisplay(void);
 extern void GfuiDisplayNothing(void);
-extern void GfuiIdle(void);
+extern void GfuiIdleNoCPURest(void);
+extern void GfuiIdleCPUCooler(void);
 
 /* Screen management */
 extern void *GfuiScreenCreate(void);
@@ -125,6 +127,7 @@
 extern int  GfuiScreenIsActive(void *screen);
 extern void GfuiScreenReplace(void *screen);
 extern void GfuiScreenDeactivate(void);
+extern void GfuiSetScreenIdleFunc(void *screen, tfuiIdleFunc idle);
 extern void *GfuiHookCreate(void *userDataOnActivate, tfuiCallback onActivate);
 extern void GfuiHookRelease(void *hook);
 extern void GfuiAddKey(void *scr, unsigned char key, char *descr, void *userData, tfuiCallback onKeyPressed, tfuiCallback onKeyReleased);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.