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);