24#include <GL/freeglut.h>
37#include <portability.h>
38#include <musicplayer/musicplayer.h>
51#include <X11/keysym.h>
52#include <X11/extensions/Xrandr.h>
65#if !defined(FREEGLUT) && !defined(WIN32)
70static char **
Res = NULL;
102static const char *
Mode[] = {
"Full-screen mode",
"Window mode"};
105static const char *
MsaaLabel[] = {
"Off",
"2x",
"4x",
"8x"};
137 int defaultIndex = 0;
140 for (i = 0; i <
nbMsaa; i++) {
158 const char *displayname = getenv(
"DISPLAY");
159 if (displayname == NULL) {
160 displayname = strdup(
":0.0");
163 Display *display = XOpenDisplay(displayname);
165 if( display != NULL) {
167 int screen = DefaultScreen(display);
168 Window root = RootWindow(display, screen);
170 XRRScreenConfiguration *screenconfig = XRRGetScreenInfo (display, root);
171 if (screenconfig != NULL) {
173 XRRScreenSize *sizes = XRRConfigSizes(screenconfig, &nsize);
177 int check_resx[] = {320, 640, 800};
178 int check_resy[] = {240, 480, 600};
179 bool mode_in_list[] = {
false,
false,
false};
180 int add_modes =
sizeof(check_resx)/
sizeof(check_resx[0]);
182 for (i = 0; i < nsize; i++) {
183 for (j = 0; j < 3; j++) {
184 if ((mode_in_list[j] ==
false) && (sizes[i].width == check_resx[j])) {
185 if (sizes[i].height == check_resy[j]) {
187 mode_in_list[j] =
true;
194 const int bufsize = 20;
195 char buffer[bufsize];
196 Res = (
char**) malloc(
sizeof(
char *)*(nsize+add_modes));
197 int resx[nsize+add_modes];
198 int resy[nsize+add_modes];
199 for (i = 0; i < nsize+add_modes; i++) {
202 snprintf(buffer, bufsize,
"%dx%d", sizes[i].width, sizes[i].height);
204 resx[i] = sizes[i].width;
205 resy[i] = sizes[i].height;
209 for (j = 0; j <
sizeof(check_resx)/
sizeof(check_resx[0]); j++) {
210 if (mode_in_list[j] ==
false) {
211 mode_in_list[j] =
true;
212 snprintf(buffer, bufsize,
"%dx%d", check_resx[j], check_resy[j]);
214 resx[i] = check_resx[j];
215 resy[i] = check_resy[j];
223 for (j = i; j > 0; j--) {
224 if ((resx[j] < resx[j-1]) ||
225 (resx[j] == resx[j-1] && resy[j] < resy[j-1]))
244 nbRes = nsize + add_modes;
247 XRRFreeScreenConfigInfo(screenconfig);
249 XCloseDisplay(display);
254 GfOut(
"Failed to initialize resolutions for display '%s'", XDisplayName(displayname));
256 Res = (
char **) malloc(
sizeof(
char *)*
nbRes);
257 Res[0] = strdup(
"640x480");
258 Res[1] = strdup(
"800x600");
259 Res[2] = strdup(
"1024x768");
260 Res[3] = strdup(
"1152x864");
261 Res[4] = strdup(
"1200x960");
262 Res[5] = strdup(
"1280x1024");
263 Res[6] = strdup(
"1600x1200");
264 Res[7] = strdup(
"320x200");
272 glMatrixMode( GL_PROJECTION );
274 glOrtho( 0.0, 640.0, 0.0, 480.0, -1.0, 1.0 );
275 glMatrixMode( GL_MODELVIEW );
292 int i, depth, msaaSamples;
293 const int BUFSIZE = 1024;
313#if !defined(FREEGLUT) && !defined(WIN32)
315 GfOut (
"Freeglut not detected...\n");
316 for (i = maxfreq; i > 59; i--) {
317 snprintf(buf, BUFSIZE,
"%dx%d:%d@%d", winX, winY, depth, i);
318 GfOut(
"Trying %s mode\n", buf);
321 GfOut(
"OK done for %s\n", buf);
331 glutInit(&argc, argv);
336 if (msaaSamples > 0) {
337 glutSetOption(GLUT_MULTISAMPLE, msaaSamples);
345 int visualDepthBits = 24;
346 bool visualSupportsMultisample = msaaSamples > 0;
347 bool visualSupportsAlpha =
true;
349 if (msaaSamples > 0) {
350 glutInitDisplayString(
"rgba double depth>=24 samples alpha");
352 glutInitDisplayString(
"rgba double depth>=24 alpha");
355 if (!glutGet(GLUT_DISPLAY_MODE_POSSIBLE)) {
357 visualDepthBits = 24;
358 visualSupportsMultisample =
false;
359 visualSupportsAlpha =
true;
360 glutInitDisplayString(
"rgba double depth>=24 alpha");
363 if (msaaSamples > 0 && !glutGet(GLUT_DISPLAY_MODE_POSSIBLE)) {
365 visualDepthBits = 24;
366 visualSupportsMultisample =
true;
367 visualSupportsAlpha =
false;
368 glutInitDisplayString(
"rgb double depth>=24 samples");
371 if (!glutGet(GLUT_DISPLAY_MODE_POSSIBLE)) {
373 visualDepthBits = 24;
374 visualSupportsMultisample =
false;
375 visualSupportsAlpha =
false;
376 glutInitDisplayString(
"rgb double depth>=24");
379 if (!glutGet(GLUT_DISPLAY_MODE_POSSIBLE)) {
381 visualDepthBits = 16;
382 visualSupportsMultisample =
false;
383 visualSupportsAlpha =
true;
384 glutInitDisplayString(
"rgba double depth>=16 alpha");
387 if (!glutGet(GLUT_DISPLAY_MODE_POSSIBLE)) {
389 visualDepthBits = 16;
390 visualSupportsMultisample =
false;
391 visualSupportsAlpha =
false;
392 glutInitDisplayString(
"rgb double depth>=16");
395 printf(
"Visual Properties Report\n");
396 printf(
"------------------------\n");
398 if (!glutGet(GLUT_DISPLAY_MODE_POSSIBLE)) {
400 printf(
"The minimum display requirements are not fulfilled.\n");
401 printf(
"We need a double buffered RGB visual with a 16 bit depth buffer at least.\n");
403 printf(
"Trying generic initialization, fallback.\n");
404 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
407 printf(
"z-buffer depth: %d (%s)\n", visualDepthBits, visualDepthBits < 24 ?
"bad" :
"good");
408 printf(
"multisampling : %s\n", msaaSamples > 0 ? (visualSupportsMultisample ?
"requested" :
"unavailable") :
"disabled");
409 printf(
"alpha bits : %s\n", visualSupportsAlpha ?
"available" :
"no");
410 if (visualDepthBits < 24) {
412 printf(
"The z-buffer resolution is below 24 bit, you will experience rendering\n");
413 printf(
"artefacts. Try to improve the setup of your graphics board or look\n");
414 printf(
"for an alternate driver.\n");
419 int displayMode = GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH;
420 if (msaaSamples > 0) {
421 displayMode |= GLUT_MULTISAMPLE;
423 glutInitDisplayMode(displayMode);
424 if (msaaSamples > 0 && !glutGet(GLUT_DISPLAY_MODE_POSSIBLE)) {
425 printf(
"MSAA %dx display mode unavailable, disabling MSAA\n", msaaSamples);
426 displayMode &= ~GLUT_MULTISAMPLE;
427 glutInitDisplayMode(displayMode);
429 printf(
"Visual Properties Report\n");
430 printf(
"------------------------\n");
431 printf(
"Compatibility mode, properties unknown.\n");
436 for (i = maxfreq; i > 59; i--) {
437 snprintf(buf, BUFSIZE,
"%dx%d:%d@%d", winX, winY, depth, i);
438 glutGameModeString(buf);
439 GfOut(
"2 - Trying %s mode\n", buf);
440 if (glutGameModeGet(GLUT_GAME_MODE_POSSIBLE)) {
441 GfOut(
"2- %s mode Possible\n", buf);
443 if (glutGameModeGet(GLUT_GAME_MODE_DISPLAY_CHANGED)) {
444 GfOut(
"Use GameMode %s\n", buf);
457 glutInitWindowPosition(0, 0);
458 glutInitWindowSize(winX, winY);
459 Window = glutCreateWindow(argv[0]);
461 printf(
"Error, couldn't open window\n");
474 GLint sampleBuffers = 0;
475 GLint actualSamples = 0;
476 glGetIntegerv(GL_SAMPLE_BUFFERS, &sampleBuffers);
477 glGetIntegerv(GL_SAMPLES, &actualSamples);
478 if (msaaSamples > 0 && sampleBuffers > 0 && actualSamples > 0) {
479 glEnable(GL_MULTISAMPLE);
480 printf(
"MSAA requested %dx, using %dx\n", msaaSamples, actualSamples);
482 glDisable(GL_MULTISAMPLE);
483 if (msaaSamples > 0) {
484 printf(
"MSAA requested %dx, unavailable (sample buffers: %d, samples: %d)\n", msaaSamples, sampleBuffers, actualSamples);
486 printf(
"MSAA disabled (sample buffers: %d, samples: %d)\n", sampleBuffers, actualSamples);
506#if !defined(FREEGLUT) && !defined(WIN32)
514 for (i = 0; i <
nbRes; i++) {
545 const int BUFSIZE = 1024;
574 static const int CMDSIZE = 1024;
587 snprintf(cmd, CMDSIZE,
"%swtorcs.exe",
GetLibDir());
589 for (i = 0; i < CMDSIZE && cmd[i] != NULL; i++) {
595 char cmdarg[CMDSIZE];
596 snprintf(cmdarg, CMDSIZE,
"\"%swtorcs.exe\"",
GetLibDir());
597 for (i = 0; i < CMDSIZE && cmdarg[i] != NULL; i++) {
598 if (cmdarg[i] ==
'/') {
603 retcode = execlp(cmd, cmdarg, (
const char *)NULL);
607 snprintf (cmd, CMDSIZE,
"%storcs-bin",
GetLibDir ());
608 memset (arg, 0,
sizeof (arg));
611 arg[curArg++] =
"-m";
615 arg[curArg++] =
"-l";
620 arg[curArg++] =
"-L";
625 arg[curArg++] =
"-D";
631 retcode = execlp (cmd, cmd, (
const char *)NULL);
634 retcode = execlp (cmd, cmd, arg[0], (
const char *)NULL);
637 retcode = execlp (cmd, cmd, arg[0], arg[1], (
const char *)NULL);
640 retcode = execlp (cmd, cmd, arg[0], arg[1], arg[2], (
const char *)NULL);
643 retcode = execlp (cmd, cmd, arg[0], arg[1], arg[2], arg[3], (
const char *)NULL);
646 retcode = execlp (cmd, cmd, arg[0], arg[1], arg[2], arg[3], arg[4], (
const char *)NULL);
649 retcode = execlp (cmd, cmd, arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], (
const char *)NULL);
652 retcode = execlp (cmd, cmd, arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], arg[6], (
const char *)NULL);
655 retcode = execlp (cmd, cmd, arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], arg[6], arg[7], (
const char *)NULL);
675 const int BUFSIZE = 1024;
762 const int BUFSIZE = 1024;
771 snprintf(buf, BUFSIZE,
"%dx%d", x,
y);
772 for (i = 0; i <
nbRes; i++) {
773 if (!strcmp(buf,
Res[i])) {
787 for (i = 0; i <
nbVInit; i++) {
788 if (strcmp(
VInit[i], tmp) == 0) {
795 snprintf(buf, BUFSIZE,
"%d", bpp);
796 for (i = 0; i <
nbDepth; i++) {
810ChangeMaxFreq(
void * )
813 const int BUFSIZE = 1024;
817 curMaxFreq = (int)strtol(val, (
char **)NULL, 0);
841 const int yoffset1 = 25, yoffset2 = 45;
843 const int yoffset1 = 25, yoffset2 = 35;
863 "data/img/arrow-left.png",
864 "data/img/arrow-left.png",
865 "data/img/arrow-left.png",
866 "data/img/arrow-left-pushed.png",
880 "data/img/arrow-right.png",
881 "data/img/arrow-right.png",
882 "data/img/arrow-right.png",
883 "data/img/arrow-right-pushed.png",
897 "data/img/arrow-left.png",
898 "data/img/arrow-left.png",
899 "data/img/arrow-left.png",
900 "data/img/arrow-left-pushed.png",
913 "data/img/arrow-right.png",
914 "data/img/arrow-right.png",
915 "data/img/arrow-right.png",
916 "data/img/arrow-right-pushed.png",
930 "data/img/arrow-left.png",
931 "data/img/arrow-left.png",
932 "data/img/arrow-left.png",
933 "data/img/arrow-left-pushed.png",
946 "data/img/arrow-right.png",
947 "data/img/arrow-right.png",
948 "data/img/arrow-right.png",
949 "data/img/arrow-right-pushed.png",
964 "data/img/arrow-left.png",
965 "data/img/arrow-left.png",
966 "data/img/arrow-left.png",
967 "data/img/arrow-left-pushed.png",
980 "data/img/arrow-right.png",
981 "data/img/arrow-right.png",
982 "data/img/arrow-right.png",
983 "data/img/arrow-right-pushed.png",
997 275,
y, 0, 8,
tGfuiAction(), [] { ChangeMaxFreq(NULL); });
1002 "Video Mode Initialization",
1008 "data/img/arrow-left.png",
1009 "data/img/arrow-left.png",
1010 "data/img/arrow-left.png",
1011 "data/img/arrow-left-pushed.png",
1024 "data/img/arrow-right.png",
1025 "data/img/arrow-right.png",
1026 "data/img/arrow-right.png",
1027 "data/img/arrow-right-pushed.png",
1048 return glutExtensionSupported(str);
static void onActivate(void)
static float LabelColor[]
void fglutLeaveGameMode(void)
void fglutGameModeString(const char *string)
int fglutEnterGameMode(void)
void checkGLFeatures(void)
void * GfuiScreenCreateExAction(float *bgColor, const tGfuiAction &onActivate, const tGfuiAction &onDeactivate, int mouseAllowed)
Create a screen.
void GfuiLabelSetText(void *scr, int id, const char *text)
Change the text of a label.
int GfuiTitleCreate(void *scr, const char *text, int maxlen)
Add a Title to the screen.
void GfuiAddKeyAction(void *scr, unsigned char key, const char *descr, const tGfuiAction &onKeyPressed, const tGfuiAction &onKeyReleased)
Add a Keyboard callback to a screen.
void GfuiScreenAddBgImg(void *scr, const char *filename)
Add an image background to a screen.
int GfuiEditboxCreateAction(void *scr, const char *text, int font, int x, int y, int width, int maxlen, const tGfuiAction &onFocus, const tGfuiAction &onFocusLost, int margin)
Add an edit box to a screen.
void GfuiAddSKeyAction(void *scr, int key, const char *descr, const tGfuiAction &onKeyPressed, const tGfuiAction &onKeyReleased)
Add a Special Keyboard shortcut to the screen.
void GfuiEditboxSetString(void *scr, int id, const char *text)
Set a new string.
char * GfuiEditboxGetString(void *scr, int id)
Get the current text of an edit box.
int GfuiLabelCreate(void *scr, const char *text, int font, int x, int y, int align, int maxlen)
Add a label to a screen.
void GfuiLabelSetColor(void *scr, int id, float *color)
Change the color of a label.
int GfuiGrButtonCreateAction(void *scr, const char *disabled, const char *enabled, const char *focused, const char *pushed, int x, int y, int align, int mouse, const tGfuiAction &onPush, const tGfuiAction &onFocus, const tGfuiAction &onFocusLost)
Add a graphical button to a screen.
void GfuiScreenActivate(void *screen)
Activate a screen and make it current.
int GfuiButtonCreateAction(void *scr, const char *text, int font, int x, int y, int width, int align, int mouse, const tGfuiAction &onPush, const tGfuiAction &onFocus, const tGfuiAction &onFocusLost)
Add a button to a screen.
const char * GfParmGetStr(void *parmHandle, const char *path, const char *key, const char *deflt)
Get a string parameter from the parameter set handle.
int GfParmSetStr(void *handle, const char *path, const char *key, const char *val)
Set a string parameter in the parameter set handle.
tdble GfParmGetNum(void *handle, const char *path, const char *key, const char *unit, tdble deflt)
Get a numerical parameter from the parameter set handle.
int GfParmSetNum(void *handle, const char *path, const char *key, const char *unit, tdble val)
Set a numerical parameter in the parameter set handle.
void GfParmReleaseHandle(void *parmHandle)
Release given parameter set handle parmHandle.
int GfParmWriteFile(const char *file, void *parmHandle, const char *name)
Write parameter set into file.
void * GfParmReadFile(const char *file, int mode)
Read parameter set from file and return handle to parameter set.
int GfuiGlutExtensionSupported(const char *str)
Query an OpenGL extension through GLUT for the current rendering context.
void GfScrShutdown(void)
Shutdown the screen.
void * GfScrMenuInit(void *precMenu)
Create and activate the video options menu screen.
void GfScrGetSize(int *scrw, int *scrh, int *vieww, int *viewh)
Get the screen and viewport sizes.
static char * strndup(const char *str, int len)
static void initFromConf(void)
static void VInitPrevNext(int delta)
static int getMsaaIndex(int samples)
static const char * Mode[]
static const int MsaaSamples[]
static const int DefaultMsaaSamples
static void Reshape(int width, int height)
void GfScrInit(int argc, char *argv[])
static const char * Depthlist[]
static void updateLabelText(void)
static void saveParams(void)
static const char * VInit[]
static void ModePrevNext(int delta)
static void DepthPrevNext(int delta)
static void ResPrevNext(int delta)
static void MsaaPrevNext(int delta)
static const char * MsaaLabel[]
#define GFSCR_VAL_VINIT_BEST
#define GFSCR_VAL_VINIT_COMPATIBLE
#define GFSCR_ATT_MSAA_SAMPLES
#define GFSCR_ATT_MAXREFRESH
#define GFPARM_RMODE_CREAT
Allow an empty in-memory set on file-open failure; does not write a file.
#define GFPARM_RMODE_STD
Return a new handle sharing cached data for this filename, if available.
The Gaming Framework API (client part).
#define GFUI_FONT_LARGE_C
#define GFUI_FONT_MEDIUM_C
std::function< void()> tGfuiAction