Linux: Hardened getAvailableDisplayModes so that it won't be confused by a changing number of display modes while it is executing

This commit is contained in:
Elias Naur 2005-01-16 10:43:30 +00:00
parent dd312b492b
commit 8668ab3e89
2 changed files with 16 additions and 17 deletions

View File

@ -4,7 +4,7 @@ CC=gcc
LINKER=gcc
STRIP=strip
CFLAGS_LINK=-shared -Wall
LIBS=-L/usr/X11/lib -lX11 -lXext -lXxf86vm -lpthread -L/usr/lib/jvm/java-1.4.2-sun-1.4.2.05/jre/lib/i386/ -ljawt -Wl,-static,-lXcursor,-lXrender,-lXrandr,-call_shared
LIBS=-L/usr/X11/lib -lX11 -lXext -lXxf86vm -lpthread -L/usr/lib/jvm/java-1.4.2-sun-1.4.2.06/jre/lib/i386/ -ljawt -Wl,-static,-lXcursor,-lXrender,-lXrandr,-call_shared
CFLAGS_O=-fPIC -O2 -D_X11 -Wall -pthread -c -I../common -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
SRC=$(wildcard *.c) $(wildcard ../common/*.c) $(wildcard ../common/arb/*.c) $(wildcard ../common/ati/*.c) $(wildcard ../common/ext/*.c) $(wildcard ../common/nv/*.c)
OBJECTS=$(subst .c,.o,$(SRC))

View File

@ -147,31 +147,30 @@ static extension getBestDisplayModeExtension(JNIEnv *env, Display *disp) {
static mode_info *getXrandrDisplayModes(Display *disp, int screen, int *num_modes) {
int num_randr_sizes;
XRRScreenSize *sizes = XRRSizes(disp, screen, &num_randr_sizes);
mode_info *avail_modes = NULL;
int list_size = 0;
/* Count number of modes */
int num_randr_modes = 0;
int i;
for (i = 0; i < num_randr_sizes; i++) {
int num_randr_rates;
XRRRates(disp, screen, i, &num_randr_rates);
num_randr_modes += num_randr_rates;
}
mode_info *avail_modes = (mode_info *)malloc(sizeof(mode_info)*num_randr_modes);
if (avail_modes == NULL)
return NULL;
int mode = 0;
int mode_index = 0;
for (i = 0; i < num_randr_sizes; i++) {
int num_randr_rates;
short *freqs = XRRRates(disp, screen, i, &num_randr_rates);
int j;
for (j = 0; j < num_randr_rates; j++) {
avail_modes[mode].width = sizes[i].width;
avail_modes[mode].height = sizes[i].height;
avail_modes[mode].freq = freqs[j];
avail_modes[mode].mode_data.size_index = i;
mode++;
if (list_size <= mode_index) {
list_size += 1;
avail_modes = (mode_info *)realloc(avail_modes, sizeof(mode_info)*list_size);
if (avail_modes == NULL)
return NULL;
}
avail_modes[mode_index].width = sizes[i].width;
avail_modes[mode_index].height = sizes[i].height;
avail_modes[mode_index].freq = freqs[j];
avail_modes[mode_index].mode_data.size_index = i;
mode_index++;
}
}
*num_modes = num_randr_modes;
*num_modes = mode_index;
return avail_modes;
}