From: <tj...@us...> - 2012-01-25 22:51:50
|
Revision: 15219 http://alleg.svn.sourceforge.net/alleg/?rev=15219&view=rev Author: tjaden Date: 2012-01-25 22:51:44 +0000 (Wed, 25 Jan 2012) Log Message: ----------- Clean up visuals selection: don't leave NULL entries in eds array. A side-effect is that if config_selection=new doesn't work it will fallback to config_selection=old instead of crashing. Modified Paths: -------------- allegro/branches/5.1/src/x/xglx_config.c Modified: allegro/branches/5.1/src/x/xglx_config.c =================================================================== --- allegro/branches/5.1/src/x/xglx_config.c 2012-01-25 22:51:15 UTC (rev 15218) +++ allegro/branches/5.1/src/x/xglx_config.c 2012-01-25 22:51:44 UTC (rev 15219) @@ -204,7 +204,7 @@ static ALLEGRO_EXTRA_DISPLAY_SETTINGS** get_visuals_new(ALLEGRO_DISPLAY_XGLX *glx, int *eds_count) { - int num_fbconfigs, i; + int num_fbconfigs, i, j; GLXFBConfig *fbconfig; ALLEGRO_EXTRA_DISPLAY_SETTINGS *ref; ALLEGRO_EXTRA_DISPLAY_SETTINGS **eds = NULL; @@ -225,28 +225,34 @@ ALLEGRO_INFO("%i formats.\n", num_fbconfigs); - for (i = 0; i < num_fbconfigs; i++) { + for (i = j = 0; i < num_fbconfigs; i++) { ALLEGRO_DEBUG("-- \n"); ALLEGRO_DEBUG("Decoding visual no. %i...\n", i); - eds[i] = read_fbconfig(system->gfxdisplay, fbconfig[i]); - if (!eds[i]) + eds[j] = read_fbconfig(system->gfxdisplay, fbconfig[i]); + if (!eds[j]) continue; #ifdef DEBUGMODE - display_pixel_format(eds[i]); + display_pixel_format(eds[j]); #endif - eds[i]->score = _al_score_display_settings(eds[i], ref); - if (eds[i]->score == -1) { + eds[j]->score = _al_score_display_settings(eds[j], ref); + if (eds[j]->score == -1) { continue; } - eds[i]->index = i; - eds[i]->info = al_malloc(sizeof(GLXFBConfig)); - memcpy(eds[i]->info, &fbconfig[i], sizeof(GLXFBConfig)); + eds[j]->index = i; + eds[j]->info = al_malloc(sizeof(GLXFBConfig)); + memcpy(eds[j]->info, &fbconfig[i], sizeof(GLXFBConfig)); + j++; } - *eds_count = i; - ALLEGRO_INFO("%i visuals are good enough.\n", i); + *eds_count = j; + ALLEGRO_INFO("%i visuals are good enough.\n", j); + if (j == 0) { + al_free(eds); + eds = NULL; + } XFree(fbconfig); + return eds; } @@ -333,7 +339,7 @@ static ALLEGRO_EXTRA_DISPLAY_SETTINGS** get_visuals_old(int *eds_count) { - int i, num_visuals; + int i, j, num_visuals; XVisualInfo *xv; ALLEGRO_EXTRA_DISPLAY_SETTINGS *ref; ALLEGRO_EXTRA_DISPLAY_SETTINGS **eds; @@ -349,28 +355,35 @@ ALLEGRO_INFO("%i formats.\n", num_visuals); - for (i = 0; i < num_visuals; i++) { + for (i = j = 0; i < num_visuals; i++) { ALLEGRO_DEBUG("-- \n"); ALLEGRO_DEBUG("Decoding visual no. %i...\n", i); - eds[i] = read_xvisual(system->gfxdisplay, xv+i); - if (!eds[i]) + eds[j] = read_xvisual(system->gfxdisplay, xv + i); + if (!eds[j]) continue; #ifdef DEBUGMODE - display_pixel_format(eds[i]); + display_pixel_format(eds[j]); #endif - eds[i]->score = _al_score_display_settings(eds[i], ref); - if (eds[i]->score == -1) { + eds[j]->score = _al_score_display_settings(eds[j], ref); + if (eds[j]->score == -1) { continue; } - eds[i]->index = i; + eds[j]->index = i; /* Seems that XVinfo is static. */ - eds[i]->info = al_malloc(sizeof(XVisualInfo)); - memcpy(eds[i]->info, xv + i, sizeof(XVisualInfo)); + eds[j]->info = al_malloc(sizeof(XVisualInfo)); + memcpy(eds[j]->info, xv + i, sizeof(XVisualInfo)); + j++; } - *eds_count = i; - ALLEGRO_INFO("%i visuals are good enough.\n", i); + *eds_count = j; + ALLEGRO_INFO("%i visuals are good enough.\n", j); + if (j == 0) { + al_free(eds); + eds = NULL; + } + XFree(xv); + return eds; } @@ -383,10 +396,13 @@ qsort(eds, eds_count, sizeof(*eds), _al_display_settings_sorter); + ASSERT(eds_count > 0); + ASSERT(eds[0] != NULL); + if (!eds[0]->info) { - ALLEGRO_ERROR("No matching displays found.\n"); - glx->xvinfo = NULL; - return; + ALLEGRO_ERROR("No matching displays found.\n"); + glx->xvinfo = NULL; + return; } ALLEGRO_INFO("Chose visual no. %i\n", eds[0]->index); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |