139
map_crtc_xrandr(Display *dpy, int deviceid, const char *output_name)
138
/* Caller must free return value */
139
static XRROutputInfo*
140
find_output_xrandr(Display *dpy, const char *output_name)
142
int rc = EXIT_FAILURE;
143
142
XRRScreenResources *res;
144
XRROutputInfo *output_info;
145
XRRCrtcInfo *crtc_info;
143
XRROutputInfo *output_info = NULL;
147
147
res = XRRGetScreenResources(dpy, DefaultRootWindow(dpy));
149
149
for (i = 0; i < res->noutput && !found; i++)
151
151
output_info = XRRGetOutputInfo(dpy, res, res->outputs[i]);
152
if (!output_info->crtc || output_info->connection != RR_Connected)
155
crtc_info = XRRGetCrtcInfo (dpy, res, output_info->crtc);
156
if (strcmp(output_info->name, output_name) == 0)
153
if (output_info->crtc && output_info->connection == RR_Connected &&
154
strcmp(output_info->name, output_name) == 0)
160
XRRFreeOutputInfo(output_info);
163
XRRFreeScreenResources(res);
172
map_output_xrandr(Display *dpy, int deviceid, const char *output_name)
174
int rc = EXIT_FAILURE;
175
XRRScreenResources *res;
176
XRROutputInfo *output_info;
178
res = XRRGetScreenResources(dpy, DefaultRootWindow(dpy));
179
output_info = find_output_xrandr(dpy, output_name);
163
181
/* crtc holds our screen info, need to compare to actual screen size */
184
XRRCrtcInfo *crtc_info;
167
186
matrix_set_unity(&m);
187
crtc_info = XRRGetCrtcInfo (dpy, res, output_info->crtc);
168
188
set_transformation_matrix(dpy, &m, crtc_info->x, crtc_info->y,
169
189
crtc_info->width, crtc_info->height);
170
190
rc = apply_matrix(dpy, deviceid, &m);
191
XRRFreeCrtcInfo(crtc_info);
192
XRRFreeOutputInfo(output_info);
172
194
printf("Unable to find output '%s'. "
173
195
"Output may not be connected.\n", output_name);
181
map_crtc_xinerama(Display *dpy, int deviceid, const char *output_name)
203
map_output_xinerama(Display *dpy, int deviceid, const char *output_name)
183
205
const char *prefix = "HEAD-";
184
206
XineramaScreenInfo *screens = NULL;
232
map_to_crtc(Display *dpy, int argc, char *argv[], char *name, char *desc)
254
map_to_output(Display *dpy, int argc, char *argv[], char *name, char *desc)
234
int opcode, event, error;
237
257
XIDeviceInfo *info;
258
XRROutputInfo *output_info;
245
266
info = xi2_find_device_info(dpy, argv[0]);
248
fprintf(stderr, "unable to find device %s\n", argv[0]);
269
fprintf(stderr, "unable to find device '%s'\n", argv[0]);
249
270
return EXIT_FAILURE;
273
output_name = argv[1];
274
output_info = find_output_xrandr(dpy, output_name);
277
/* Output doesn't exist. Is this a (partial) non-RandR setup? */
278
output_info = find_output_xrandr(dpy, "default");
281
XRRFreeOutputInfo(output_info);
282
if (strncmp("HEAD-", output_name, strlen("HEAD-")) == 0)
283
return map_output_xinerama(dpy, info->deviceid, output_name);
286
XRRFreeOutputInfo(output_info);
254
/* Check for RandR 1.2. Server bug causes the NVIDIA driver to
255
* report with RandR 1.3 support but it doesn't expose RandR CRTCs.
256
* Force Xinerama if NV-CONTROL is present */
257
if (XQueryExtension(dpy, "NV-CONTROL", &opcode, &event, &error) ||
258
!XQueryExtension(dpy, "RANDR", &opcode, &event, &error) ||
259
!XRRQueryVersion(dpy, &maj, &min) || (maj * 1000 + min) < 1002)
260
return map_crtc_xinerama(dpy, info->deviceid, crtc_name);
262
return map_crtc_xrandr(dpy, info->deviceid, crtc_name);
288
return map_output_xrandr(dpy, info->deviceid, output_name);