int config_get_monitor(char* monitor)
{
- if (strcmp(monitor, "all") == 0)
- return -1;
- else {
+ if (strcmp(monitor, "all") != 0) {
char* endptr;
int ret_int = strtol(monitor, &endptr, 10);
if (*endptr == 0)
// monitor specified by name, not by index
int i, j;
for (i=0; i<server.nb_monitor; ++i) {
+ if (server.monitor[i].names == 0)
+ // xrandr can't identify monitors
+ continue;
j = 0;
while (server.monitor[i].names[j] != 0) {
if (strcmp(monitor, server.monitor[i].names[j++]) == 0)
}
}
}
+ // monitor == "all" or monitor not found or xrandr can't identify monitors
return -1;
}
XineramaScreenInfo *info = XineramaQueryScreens(server.dsp, &nbmonitor);
XRRScreenResources *res = XRRGetScreenResourcesCurrent(server.dsp, server.root_win);
- if (res->ncrtc >= nbmonitor) {
+ if (res && res->ncrtc >= nbmonitor) {
// use xrandr to identify monitors (does not work with proprietery nvidia drivers)
printf("xRandr: Found crtc's: %d\n", res->ncrtc );
server.monitor = malloc(res->ncrtc * sizeof(Monitor));
server.monitor = realloc(server.monitor, server.nb_monitor * sizeof(Monitor));
qsort(server.monitor, server.nb_monitor, sizeof(Monitor), compareMonitorPos);
- XRRFreeScreenResources(res);
+ if (res)
+ XRRFreeScreenResources(res);
XFree(info);
}