aboutsummaryrefslogtreecommitdiffstats
path: root/console
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2010-04-23 04:55:35 (GMT)
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-04-23 05:30:45 (GMT)
commitdf0903e41a99ec125ab7c10c264c478a101c526c (patch)
treef6e6a7ca5967a31bee7690bc472d19839a827c42 /console
parentecf003c4e11ce67b52b748e90711d03f49b718c8 (diff)
Better handle DGA support
This patch were imported from Fedora 12 set of patches for xawtv. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'console')
-rw-r--r--console/v4l-conf.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/console/v4l-conf.c b/console/v4l-conf.c
index fd9919f..3d51d4f 100644
--- a/console/v4l-conf.c
+++ b/console/v4l-conf.c
@@ -221,6 +221,21 @@ displayinfo_x11(Display *dpy, struct DISPLAYINFO *d)
}
}
+#ifdef HAVE_LIBXXF86DGA
+static int dga_error = 0;
+static int dga_error_base;
+static int (*orig_xfree_error_handler)(Display *, XErrorEvent *);
+
+static int dga_error_handler(Display *d, XErrorEvent *e)
+{
+ if (e->error_code == (dga_error_base + XF86DGANoDirectVideoMode)) {
+ dga_error = 1;
+ return 0;
+ }
+ return orig_xfree_error_handler(d, e);
+}
+#endif
+
static void
displayinfo_dga(Display *dpy, struct DISPLAYINFO *d)
{
@@ -228,7 +243,7 @@ displayinfo_dga(Display *dpy, struct DISPLAYINFO *d)
int width,bar,foo,major,minor,flags=0;
void *base = NULL;
- if (!XF86DGAQueryExtension(dpy,&foo,&bar)) {
+ if (!XF86DGAQueryExtension(dpy,&foo,&dga_error_base)) {
fprintf(stderr,"WARNING: Your X-Server has no DGA support.\n");
return;
}
@@ -240,7 +255,14 @@ displayinfo_dga(Display *dpy, struct DISPLAYINFO *d)
fprintf(stderr,"WARNING: No DGA support available for this display.\n");
return;
}
+ orig_xfree_error_handler = XSetErrorHandler(dga_error_handler);
XF86DGAGetVideoLL(dpy,XDefaultScreen(dpy),(void*)&base,&width,&foo,&bar);
+ XSync(dpy, 0);
+ XSetErrorHandler(orig_xfree_error_handler);
+ if (dga_error) {
+ fprintf(stderr,"WARNING: No DGA direct video mode for this display.\n");
+ return;
+ }
d->bpl = width * d->bpp/8;
d->base = base;
#else

Privacy Policy