blob: 000532a1cc962d32c767e28ca3dd495a102e68a5 [file] [log] [blame]
// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <X11/Xlib.h>
#include <X11/Xlibint.h>
#include <X11/Xproto.h>
#include <X11/Xatom.h>
#include <X11/extensions/Xrandr.h>
#include "xrr_utils.h"
#if RANDR_MAJOR > 1 || (RANDR_MAJOR == 1 && RANDR_MINOR >= 2)
#define HAS_RANDR_1_2 1
#else
#error Only tested with xrandr 1.2
#endif
static char modechar(int flags, int pos, int neg) {
return (flags & pos) ? '+' : ((flags & neg) ? '-' : '?');
}
void showmode(XRRModeInfo *mode)
{
printf("Mode %s (%x)\n", mode->name, (unsigned int)mode->id);
printf("%dx%d, dot clock %ld %cHsync %cVsync\n",
mode->width, mode->height, mode->dotClock,
modechar(mode->modeFlags, RR_HSyncPositive, RR_HSyncNegative),
modechar(mode->modeFlags, RR_VSyncPositive, RR_VSyncNegative));
printf("H: start %d, end %d, skew %d, total %d\n",
mode->hSyncStart, mode->hSyncEnd, mode->hSkew, mode->hTotal);
printf("V: start %d, end %d, total %d\n",
mode->vSyncStart, mode->vSyncEnd, mode->vTotal);
}
XRRModeInfo *get_x_mode_info(Display *dpy, Window root)
{
XRRScreenResources *resources;
int out, md;
RRCrtc activecrtc = 0;
XRRCrtcInfo *cinfo;
RRMode activemode;
int major, minor;
if (!XRRQueryVersion (dpy, &major, &minor)) {
fprintf (stderr, "RandR extension missing\n");
exit (1);
}
resources = XRRGetScreenResources (dpy, root);
/* Assume device only uses LVDS output, so find it by what is enabled */
/* It points to a crtc which will be in a mode */
for(out = 0; out < resources->noutput; out++) {
XRROutputInfo *oinfo = XRRGetOutputInfo(dpy, resources,
resources->outputs[out]);
if (oinfo->connection == RR_Connected) {
activecrtc = oinfo->crtc;
break;
}
}
if (!activecrtc)
return NULL;
if (out >= resources->noutput) {
fprintf(stderr, "Could not find active output\n");
exit(1);
}
cinfo = XRRGetCrtcInfo(dpy, resources, activecrtc);
/* Get the XID of the mode */
activemode = cinfo->mode;
for(md = 0; md < resources->nmode; md++) {
if (resources->modes[md].id == activemode) break;
}
if (md >= resources->nmode) {
fprintf(stderr, "Could not find mode ID %x\n", (unsigned int)activemode);
exit(1);
}
return &(resources->modes[md]);
}