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:
parent
dd312b492b
commit
8668ab3e89
|
@ -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))
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue