TORCS  1.3.9
The Open Racing Car Simulator
driverselect.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  driverselect.cpp -- drivers interactive selection
3  -------------------
4  created : Mon Aug 16 20:40:44 CEST 1999
5  copyright : (C) 1999-2017 by Eric Espie, Bernhard Wymann
6  email : torcs@free.fr
7  version : $Id$
8  ***************************************************************************/
9 
10 /***************************************************************************
11  * *
12  * This program is free software; you can redistribute it and/or modify *
13  * it under the terms of the GNU General Public License as published by *
14  * the Free Software Foundation; either version 2 of the License, or *
15  * (at your option) any later version. *
16  * *
17  ***************************************************************************/
18 
26 #include <stdlib.h>
27 #include <stdio.h>
28 #include <sys/stat.h>
29 #ifdef WIN32
30 #include <windows.h>
31 #endif
32 #include <tgfclient.h>
33 #include <track.h>
34 #include <car.h>
35 #include <raceman.h>
36 #include <robot.h>
37 #include <racescreens.h>
38 #include <portability.h>
39 
40 static void *scrHandle;
41 static tRmDrvSelect *ds;
43 static int FocDrvLabelId;
44 static int PickDrvNameLabelId;
45 static int PickDrvCarLabelId;
47 static float aColor[] = { 1.0, 0.0, 0.0, 1.0 };
48 static int nbSelectedDrivers;
50 
51 typedef struct DrvElt
52 {
53  int index;
54  char *dname;
55  char *name;
56  int sel;
57  int human;
58  void *car;
59  GF_TAILQ_ENTRY(struct DrvElt) link;
60 } tDrvElt;
61 
62 GF_TAILQ_HEAD(DrvListHead, tDrvElt);
63 
64 tDrvListHead DrvList;
65 
66 static void rmFreeDrvList(void);
67 
68 
69 static void rmdsActivate(void * /* notused */)
70 {
71  /* call display function of graphic */
72 }
73 
74 
75 static void rmdsDeactivate(void *screen)
76 {
77  rmFreeDrvList();
79 
80  if (screen) {
81  GfuiScreenActivate(screen);
82  }
83 }
84 
85 
86 static void rmdsSetFocus(void * /* dummy */)
87 {
88  char *name;
89  tDrvElt *curDrv;
90 
92  if (name) {
94  GfParmSetNum(ds->param, RM_SECT_DRIVERS, RM_ATTR_FOCUSEDIDX, (char*)NULL, curDrv->index);
96  }
97 }
98 
99 
100 static void rmdsSelect(void * /* dummy */)
101 {
102  char *name;
103  tDrvElt *curDrv;
104  int index;
105  const int BUFSIZE = 1024;
106  char buf[BUFSIZE];
107 
108  snprintf(buf, BUFSIZE, "%s", RM_SECT_DRIVERS);
109  GfParmListClean(ds->param, buf);
110  name = GfuiScrollListExtractElement(scrHandle, selectedScrollList, 0, (void**)&curDrv);
111  index = 1;
112 
113  while (name != NULL) {
114  snprintf(buf, BUFSIZE, "%s/%d", RM_SECT_DRIVERS, index);
115  GfParmSetNum(ds->param, buf, RM_ATTR_IDX, (char*)NULL, curDrv->index);
116  GfParmSetStr(ds->param, buf, RM_ATTR_MODULE, curDrv->dname);
117  index++;
118  name = GfuiScrollListExtractElement(scrHandle, selectedScrollList, 0, (void**)&curDrv);
119  }
120 
122 }
123 
124 
125 static void rmMove(void *vd)
126 {
129 }
130 
131 
132 static void rmdsClickOnDriver(void * /* dummy */)
133 {
134  char *name;
135  tDrvElt *curDrv;
136  void *robhdle;
137  const int BUFSIZE = 1024;
138  char buf[BUFSIZE];
139 
141  if (!name) {
143  }
144 
145  if (name) {
147  /* search driver infos */
148  snprintf(buf, BUFSIZE, "%sdrivers/%s/%s.xml", GetLocalDir(), curDrv->dname, curDrv->dname);
149  robhdle = GfParmReadFile(buf, GFPARM_RMODE_STD);
150 
151  if (!robhdle) {
152  snprintf(buf, BUFSIZE, "drivers/%s/%s.xml", curDrv->dname, curDrv->dname);
153  robhdle = GfParmReadFile(buf, GFPARM_RMODE_STD);
154  }
155 
156  if (robhdle != NULL) {
157  snprintf(buf, BUFSIZE, "%s/%s/%d", ROB_SECT_ROBOTS, ROB_LIST_INDEX, curDrv->index);
160  GfParmReleaseHandle(robhdle);
161  }
162  }
163 }
164 
165 static void rmSelectDeselect(void * /* dummy */ )
166 {
167  char *name;
168  int src, dst;
169  tDrvElt *curDrv;
170  int robotIdx;
171  int sel;
172 
173  sel = 0;
174  name = 0;
176  src = unselectedScrollList;
177  name = GfuiScrollListExtractSelectedElement(scrHandle, src, (void**)&curDrv);
178  if (name) {
179  dst = selectedScrollList;
180  GfuiScrollListInsertElement(scrHandle, dst, name, 100, (void*)curDrv);
182  }
183  }
184 
185  if (!name) {
186  sel = 1;
187  src = selectedScrollList;
188  name = GfuiScrollListExtractSelectedElement(scrHandle, src, (void**)&curDrv);
189  if (name) {
190  dst = unselectedScrollList;
191  if (curDrv->human) {
192  GfuiScrollListInsertElement(scrHandle, dst, name, 0, (void*)curDrv);
193  } else {
194  GfuiScrollListInsertElement(scrHandle, dst, name, 100, (void*)curDrv);
195  }
197  } else {
198  return;
199  }
200  }
201 
202  const char* cardllname = GfParmGetStr(ds->param, RM_SECT_DRIVERS, RM_ATTR_FOCUSED, "");
203  robotIdx = (int)GfParmGetNum(ds->param, RM_SECT_DRIVERS, RM_ATTR_FOCUSEDIDX, (char*)NULL, 0);
204  if (sel) {
205  cardllname = GfParmGetStr(ds->param, RM_SECT_DRIVERS, RM_ATTR_FOCUSED, "");
206  robotIdx = (int)GfParmGetNum(ds->param, RM_SECT_DRIVERS, RM_ATTR_FOCUSEDIDX, (char*)NULL, 0);
207  if ((curDrv->index == robotIdx) && (strcmp(curDrv->dname, cardllname) == 0)) {
208  /* the focused element was deselected select a new one */
209  name = GfuiScrollListGetElement(scrHandle, selectedScrollList, 0, (void**)&curDrv);
210  if (name) {
212  GfParmSetNum(ds->param, RM_SECT_DRIVERS, RM_ATTR_FOCUSEDIDX, (char*)NULL, curDrv->index);
213  GfuiLabelSetText(scrHandle, FocDrvLabelId, curDrv->name);
214  } else {
218  }
219  }
220  } else {
221  if ((strlen(cardllname) == 0) || (curDrv->human)) {
223  GfParmSetNum(ds->param, RM_SECT_DRIVERS, RM_ATTR_FOCUSEDIDX, (char*)NULL, curDrv->index);
225  }
226  }
227  rmdsClickOnDriver(NULL);
228 }
229 
230 
231 static void rmdsAddKeys(void)
232 {
233  GfuiAddKey(scrHandle, 27, "Cancel Selection", ds->prevScreen, rmdsDeactivate, NULL);
234  GfuiAddKey(scrHandle, 13, "Accept Selection", NULL, rmdsSelect, NULL);
235  GfuiAddSKey(scrHandle, GLUT_KEY_F1, "Help", scrHandle, GfuiHelpScreen, NULL);
236  GfuiAddSKey(scrHandle, GLUT_KEY_F12, "Screen-Shot", NULL, GfuiScreenShot, NULL);
237  GfuiAddKey(scrHandle, '-', "Move Up", (void*)-1, rmMove, NULL);
238  GfuiAddKey(scrHandle, '+', "Move Down", (void*)1, rmMove, NULL);
239  GfuiAddKey(scrHandle, ' ', "Select/Deselect", NULL, rmSelectDeselect, NULL);
240  GfuiAddKey(scrHandle, 'f', "Set Focus", NULL, rmdsSetFocus, NULL);
241 }
242 
243 
249 void RmDriversSelect(void *vs)
250 {
251  tModList *list;
252  tModList *curmod;
253  char *sp;
254  int i, index;
255  tDrvElt *curDrv;
256  int nCars, robotIdx;
257  void *robhdle;
258  struct stat st;
259  void *carhdle;
260  int human;
261  const int BUFSIZE = 1024;
262  char buf[BUFSIZE];
263  char path[BUFSIZE];
264  char dname[BUFSIZE];
265 
266 #define B_BASE 380
267 #define B_HT 30
268 
269  ds = (tRmDrvSelect*)vs;
270 
272 
273  scrHandle = GfuiScreenCreateEx((float*)NULL, NULL, rmdsActivate, NULL, (tfuiCallback)NULL, 1);
274  GfuiScreenAddBgImg(scrHandle, "data/img/splash-qrdrv.png");
275 
276  GfuiTitleCreate(scrHandle, "Select Drivers", sizeof("Select Drivers"));
277 
279  "Selected",
281  120, 400, GFUI_ALIGN_HC_VB,
282  0);
283 
285  "Not Selected",
287  496, 400, GFUI_ALIGN_HC_VB,
288  0);
289 
291  200, 310, GFUI_SB_RIGHT, NULL, rmdsClickOnDriver);
293  200, 310, GFUI_SB_RIGHT, NULL, rmdsClickOnDriver);
294 
295 
297  NULL, rmdsSelect, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
298 
300  ds->prevScreen, rmdsDeactivate, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
301 
303  (void*)-1, rmMove, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
304 
306  (void*)1, rmMove, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
307 
309  (void*)0, rmSelectDeselect, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
310 
312  NULL, rmdsSetFocus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
313 
314  list = (tModList *)NULL;
315  snprintf(buf, BUFSIZE, "%sdrivers", GetLibDir ());
316  GfModInfoDir(CAR_IDENT, buf, 1, &list);
317 
318  curmod = list;
319  if (curmod != NULL) {
320  do {
321  curmod = curmod->next;
322  for (i = 0; i < MAX_MOD_ITF; i++) {
323  if (curmod->modInfo[i].name) {
324  sp = strrchr(curmod->sopath, '/');
325  if (sp == NULL) {
326  sp = curmod->sopath;
327  } else {
328  sp++;
329  }
330  strcpy(dname, sp);
331  dname[strlen(dname) - strlen(DLLEXT) - 1] = 0; /* cut .so or .dll */
332  snprintf(buf, BUFSIZE, "%sdrivers/%s/%s.xml", GetLocalDir(), dname, dname);
333  robhdle = GfParmReadFile(buf, GFPARM_RMODE_STD);
334  if (!robhdle) {
335  snprintf(buf, BUFSIZE, "drivers/%s/%s.xml", dname, dname);
336  robhdle = GfParmReadFile(buf, GFPARM_RMODE_STD);
337  }
338  snprintf(path, BUFSIZE, "%s/%s/%d", ROB_SECT_ROBOTS, ROB_LIST_INDEX, curmod->modInfo[i].index);
339  const char* carName = GfParmGetStr(robhdle, path, ROB_ATTR_CAR, "");
340  if (strcmp(GfParmGetStr(robhdle, path, ROB_ATTR_TYPE, ROB_VAL_ROBOT), ROB_VAL_ROBOT)) {
341  human = 1;
342  } else {
343  human = 0;
344  }
345  snprintf(path, BUFSIZE, "cars/%s/%s.xml", carName, carName);
346  if (!stat(path, &st)) {
347  carhdle = GfParmReadFile(path, GFPARM_RMODE_STD);
348  if (carhdle) {
349  curDrv = (tDrvElt*)calloc(1, sizeof(tDrvElt));
350  curDrv->index = curmod->modInfo[i].index;
351  curDrv->dname = strdup(dname);
352  curDrv->name = strdup(curmod->modInfo[i].name);
353  curDrv->car = carhdle;
354  if (human) {
355  curDrv->human = 1;
356  GF_TAILQ_INSERT_HEAD(&DrvList, curDrv, link);
357  } else {
358  curDrv->human = 0;
359  GF_TAILQ_INSERT_TAIL(&DrvList, curDrv, link);
360  }
361  } else {
362  GfOut("Driver %s not selected because car %s is not readable\n", curmod->modInfo[i].name, carName);
363  }
364  } else {
365  GfOut("Driver %s not selected because car %s is not present\n", curmod->modInfo[i].name, carName);
366  }
367  GfParmReleaseHandle(robhdle);
368  }
369  }
370  } while (curmod != list);
371 
372  GfModFreeInfoList(&list);
373  }
374 
375  nbSelectedDrivers = 0;
378  index = 1;
379  for (i = 1; i < nCars+1; i++) {
380  snprintf(dname, BUFSIZE, "%s/%d", RM_SECT_DRIVERS, i);
381  const char* cardllname = GfParmGetStr(ds->param, dname, RM_ATTR_MODULE, "");
382  robotIdx = (int)GfParmGetNum(ds->param, dname, RM_ATTR_IDX, (char*)NULL, tModInfo::INVALID_INDEX);
383  const char* robotName = GfParmGetStr(ds->param, dname, RM_ATTR_DRVNAME, "");
384 
385  curDrv = GF_TAILQ_FIRST(&DrvList);
386  if (curDrv != NULL) {
387  do {
388  if ((curDrv->index == robotIdx || strcmp(curDrv->name, robotName) == 0) && (strcmp(curDrv->dname, cardllname) == 0)) {
390  GfuiScrollListInsertElement(scrHandle, selectedScrollList, curDrv->name, index, (void*)curDrv);
391  curDrv->sel = index++;
393  }
394  break;
395  }
396  } while ((curDrv = GF_TAILQ_NEXT(curDrv, link)) != NULL);
397  }
398  }
399 
400  curDrv = GF_TAILQ_FIRST(&DrvList);
401  if (curDrv != NULL) {
402  do {
403  if (curDrv->sel == 0) {
404  GfuiScrollListInsertElement(scrHandle, unselectedScrollList, curDrv->name, 1000, (void*)curDrv);
405  }
406  } while ((curDrv = GF_TAILQ_NEXT(curDrv, link)) != NULL);
407  }
408 
410  const char* cardllname = GfParmGetStr(ds->param, RM_SECT_DRIVERS, RM_ATTR_FOCUSED, "");
411  robotIdx = (int)GfParmGetNum(ds->param, RM_SECT_DRIVERS, RM_ATTR_FOCUSEDIDX, (char*)NULL, 0);
412  curDrv = GF_TAILQ_FIRST(&DrvList);
413  if (curDrv != NULL) {
414  do {
415  if ((curDrv->index == robotIdx) && (strcmp(curDrv->dname, cardllname) == 0)) {
416  break;
417  }
418  } while ((curDrv = GF_TAILQ_NEXT(curDrv, link)) != NULL);
419  }
420 
421  if (curDrv == NULL) {
422  curDrv = GF_TAILQ_FIRST(&DrvList);
423  }
424 
425  if (curDrv == NULL) {
428  } else {
431  }
432 
433  /* Picked Driver Info */
440  GfuiLabelCreate(scrHandle, "Category:", GFUI_FONT_MEDIUM, 320, B_BASE - 9 * B_HT, GFUI_ALIGN_HC_VB, 0);
444  rmdsAddKeys();
445 
447 }
448 
449 
450 static void rmFreeDrvList(void)
451 {
452  tDrvElt *cur;
453 
454  while ((cur = GF_TAILQ_FIRST(&DrvList)) != NULL) {
455  GF_TAILQ_REMOVE(&DrvList, cur, link);
456  free(cur->name);
457  free(cur->dname);
458  GfParmReleaseHandle(cur->car);
459  free(cur);
460  }
461 }
int GfParmSetStr(void *handle, const char *path, const char *key, const char *val)
Set a string parameter in the parameter set handle.
Definition: params.cpp:2477
char * GfuiScrollListExtractSelectedElement(void *scr, int Id, void **userData)
Extract the selected element from the scroll list (removed).
tModInfo modInfo[MAX_MOD_ITF]
module info list for this dll
Definition: tgf.h:204
#define GFUI_MOUSE_UP
Definition: tgfclient.h:80
#define PRM_CATEGORY
Definition: car.h:511
void * GfParmReadFile(const char *file, int mode)
Read parameter set from file and return handle to parameter set.
Definition: params.cpp:1157
static void rmdsDeactivate(void *screen)
int GfuiButtonCreate(void *scr, const char *text, int font, int x, int y, int width, int align, int mouse, void *userDataOnPush, tfuiCallback onPush, void *userDataOnFocus, tfuiCallback onFocus, tfuiCallback onFocusLost)
Add a button to a screen.
Definition: guibutton.cpp:248
int GfModInfoDir(unsigned int gfid, char *dir, int level, tModList **modlist)
Get the generic module information of the DLLs of the specified directory.
Definition: module.cpp:129
#define ROB_ATTR_TYPE
Definition: robot.h:137
static void rmdsActivate(void *)
#define GFPARM_RMODE_STD
if handle already openned return it
Definition: tgf.h:265
#define GF_TAILQ_INSERT_TAIL(head, elm, field)
Insert an element at the tail.
Definition: tgf.h:511
struct ModList * next
next module in list
Definition: tgf.h:211
#define RM_ATTR_DRVNAME
Definition: raceman.h:258
int GfuiScrollListInsertElement(void *scr, int Id, char *element, int index, void *userData)
Insert an element in a scroll list.
char * GetLocalDir(void)
Definition: tgf.cpp:231
void GfParmReleaseHandle(void *parmHandle)
Release given parameter set handle parmHandle.
Definition: params.cpp:1834
#define RM_ATTR_FOCUSEDIDX
Definition: raceman.h:268
void * car
void GfuiAddKey(void *scr, unsigned char key, const char *descr, void *userData, tfuiCallback onKeyPressed, tfuiCallback onKeyReleased)
Add a Keyboard callback to a screen.
Definition: gui.cpp:742
char * GfuiScrollListGetSelectedElement(void *scr, int Id, void **userData)
Get the selected element from the scroll list.
Robot Module Interface Definition.
#define MAX_MOD_ITF
Maximum number of interface in one DLL.
Definition: tgf.h:185
void GfuiScreenRelease(void *scr)
Release the given screen.
Definition: gui.cpp:618
int GfuiLabelCreate(void *scr, const char *text, int font, int x, int y, int align, int maxlen)
Add a label to a screen.
Definition: guilabel.cpp:142
char * dname
#define GF_TAILQ_INSERT_HEAD(head, elm, field)
Insert an element at the head.
Definition: tgf.h:499
static void rmdsSetFocus(void *)
void * prevScreen
Race manager screen to go back.
Definition: racescreens.h:47
static float aColor[]
static void rmFreeDrvList(void)
int GfuiScrollListMoveSelectedElement(void *scr, int Id, int delta)
Move the selected element within the scroll list.
void GfuiScreenAddBgImg(void *scr, const char *filename)
Add an image background to a screen.
Definition: gui.cpp:961
#define GFUI_SB_RIGHT
Definition: tgfclient.h:89
static void rmdsSelect(void *)
static void rmdsAddKeys(void)
static void rmSelectDeselect(void *)
const char * GfParmGetStr(void *parmHandle, const char *path, const char *key, const char *deflt)
Get a string parameter from the parameter set handle.
Definition: params.cpp:2311
The Gaming Framework API (client part).
static int selectedScrollList
static void rmdsClickOnDriver(void *)
static int PickDrvCategoryLabelId
GF_TAILQ_ENTRY(struct DrvElt) link
#define B_HT
tDrvListHead DrvList
#define GFUI_FONT_LARGE
Definition: tgfclient.h:168
char * GfuiScrollListExtractElement(void *scr, int Id, int index, void **userData)
Extract the specified element from the scroll list.
#define ROB_LIST_INDEX
Definition: robot.h:124
void * GfuiScreenCreateEx(float *bgColor, void *userDataOnActivate, tfuiCallback onActivate, void *userDataOnDeactivate, tfuiCallback onDeactivate, int mouseAllowed)
Create a screen.
Definition: gui.cpp:578
#define CAR_IDENT
Definition: car.h:33
static int nbMaxSelectedDrivers
static int nbSelectedDrivers
void GfuiLabelSetText(void *scr, int id, const char *text)
Change the text of a label.
Definition: guilabel.cpp:212
char * GetLibDir(void)
Definition: tgf.cpp:244
int GfuiFontHeight(int font)
Definition: guiobject.cpp:65
#define RM_ATTR_IDX
Definition: raceman.h:266
char * GfuiScrollListGetElement(void *scr, int Id, int index, void **userData)
Get the specified element from the scroll list.
char * sopath
path name of file
Definition: tgf.h:210
#define GfOut
Definition: tgf.h:373
#define RM_ATTR_MODULE
Definition: raceman.h:265
static int FocDrvLabelId
#define B_BASE
void RmDriversSelect(void *vs)
Drivers list selection, the race manager parameter set is handed over in vs, tRmDrvSelect.param.
#define GF_TAILQ_INIT(head)
Head initialization (Mandatory)
Definition: tgf.h:485
void GfuiMenuDefaultKeysAdd(void *scr)
Add the default menu keyboard callback to a screen.
Definition: guimenu.cpp:55
#define RM_ATTR_FOCUSED
Definition: raceman.h:267
static void * scrHandle
static int PickDrvCarLabelId
int GfModFreeInfoList(tModList **modlist)
Free the info contained in the specified list.
Definition: module.cpp:145
static int unselectedScrollList
void(* tfuiCallback)(void *)
Definition: tgfclient.h:105
This is the car structure.
This is the race information structures.
void GfuiScreenActivate(void *screen)
Activate a screen and make it current.
Definition: gui.cpp:467
void GfuiAddSKey(void *scr, int key, const char *descr, void *userData, tfuiCallback onKeyPressed, tfuiCallback onKeyReleased)
Add a Special Keyboard shortcut to the screen.
Definition: gui.cpp:816
#define RM_SECT_DRIVERS
Definition: raceman.h:236
#define GF_TAILQ_FIRST(head)
First element of a TAILQ.
Definition: tgf.h:464
#define RM_ATTR_MAXNUM
Definition: raceman.h:252
int GfParmSetNum(void *handle, const char *path, const char *key, const char *unit, tdble val)
Set a numerical parameter in the parameter set handle.
Definition: params.cpp:2586
#define GFUI_ALIGN_HC_VB
Definition: tgfclient.h:72
#define ROB_SECT_ROBOTS
Definition: robot.h:122
#define SECT_CAR
Definition: car.h:473
#define GFUI_ALIGN_HL_VB
Definition: tgfclient.h:69
tdble GfParmGetNum(void *handle, const char *path, const char *key, const char *unit, tdble deflt)
Get a numerical parameter from the parameter set handle.
Definition: params.cpp:2392
static void rmMove(void *vd)
void GfuiHelpScreen(void *prevScreen)
Generate a help screen.
Definition: guihelp.cpp:48
#define GF_TAILQ_REMOVE(head, elm, field)
Remove an element.
Definition: tgf.h:541
int GfParmListClean(void *handle, const char *path)
Remove all the subsections in a section in the parameter set handle.
Definition: params.cpp:2221
void GfuiScreenShot(void *)
Save a screen shot in png format.
Definition: gui.cpp:913
char * name
name of the module (short) (NULL if no module)
Definition: tgf.h:189
int index
index if multiple interface in one dll
Definition: tgf.h:193
int GfuiLabelCreateEx(void *scr, const char *text, float *fgColor, int font, int x, int y, int align, int maxlen)
Create a new label (extended version).
Definition: guilabel.cpp:63
int GfuiTitleCreate(void *scr, const char *text, int maxlen)
Add a Title to the screen.
Definition: guilabel.cpp:170
void * param
Pointer to race manager parameter set (to set the driver)
Definition: racescreens.h:46
#define ROB_ATTR_CAR
Definition: robot.h:130
int GfuiScrollListCreate(void *scr, int font, int x, int y, int align, int width, int height, int scrollBarPos, void *userDataOnSelect, tfuiCallback onSelect)
Create a new scroll list.
GF_TAILQ_HEAD(DrvListHead, tDrvElt)
#define GF_TAILQ_NEXT(elm, field)
Next element of a TAILQ.
Definition: tgf.h:467
#define GFUI_FONT_MEDIUM_C
Definition: tgfclient.h:173
int GfParmGetEltNb(void *handle, const char *path)
Count the number of subsections in a section in the parameter set handle.
Definition: params.cpp:2106
#define ROB_VAL_ROBOT
Definition: robot.h:140
#define GFUI_FONT_MEDIUM
Definition: tgfclient.h:169
void * nextScreen
Race manager screen to go after select.
Definition: racescreens.h:48
char * name
list of module interfaces
Definition: tgf.h:203
Track Structure and Track Loader Module Definition.
Structure for driver selection.
Definition: racescreens.h:44
char * GfParmGetName(void *handle)
Get the name property of the parameter set handle.
Definition: params.cpp:2057
struct DrvElt tDrvElt
static tRmDrvSelect * ds
static int PickDrvNameLabelId