diff -up xawtv-3.95/console/v4l-conf.c~ xawtv-3.95/console/v4l-conf.c --- xawtv-3.95/console/v4l-conf.c~ 2008-08-03 22:22:01.000000000 +0200 +++ xawtv-3.95/console/v4l-conf.c 2008-08-03 22:34:33.000000000 +0200 @@ -221,6 +221,21 @@ displayinfo_x11(Display *dpy, struct DIS } } +#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 DIS 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 DIS 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 diff -up xawtv-3.95/libng/plugins/drv0-v4l2.c~ xawtv-3.95/libng/plugins/drv0-v4l2.c --- xawtv-3.95/libng/plugins/drv0-v4l2.c~ 2008-08-03 21:52:41.000000000 +0200 +++ xawtv-3.95/libng/plugins/drv0-v4l2.c 2008-08-03 22:23:01.000000000 +0200 @@ -618,7 +618,7 @@ v4l2_setupfb(void *handle, struct ng_vid return -1; /* double-check settings */ - if (NULL != base && h->ov_fb.base != base) { + if ((NULL != base && h->ov_fb.base != base) || h->ov_fb.base == NULL) { fprintf(stderr,"v4l2: WARNING: framebuffer base address mismatch\n"); fprintf(stderr,"v4l2: me=%p v4l=%p\n",base,h->ov_fb.base); h->ov_error = 1; diff -up xawtv-3.95/x11/xt.c~ xawtv-3.95/x11/xt.c --- xawtv-3.95/x11/xt.c~ 2008-08-03 22:22:11.000000000 +0200 +++ xawtv-3.95/x11/xt.c 2008-08-03 22:35:14.000000000 +0200 @@ -1247,18 +1247,21 @@ FilterAction(Widget widget, XEvent *even } /*----------------------------------------------------------------------*/ +#ifdef HAVE_LIBXXF86DGA +static int xfree_dga_error_base; +#endif void xfree_dga_init(Display *dpy) { #ifdef HAVE_LIBXXF86DGA - int flags,foo,bar,ma,mi; + int flags,foo,ma,mi; if (!do_overlay) return; if (args.dga) { - if (XF86DGAQueryExtension(dpy,&foo,&bar)) { + if (XF86DGAQueryExtension(dpy,&foo,&xfree_dga_error_base)) { XF86DGAQueryDirectVideo(dpy,XDefaultScreen(dpy),&flags); if (flags & XF86DGADirectPresent) { XF86DGAQueryVersion(dpy,&ma,&mi); @@ -1348,6 +1351,19 @@ xfree_xinerama_init(Display *dpy) #endif } +#ifdef HAVE_LIBXXF86DGA +static int (*orig_xfree_error_handler)(Display *, XErrorEvent *); + +static int xfree_dga_error_handler(Display *d, XErrorEvent *e) +{ + if (e->error_code == (xfree_dga_error_base + XF86DGANoDirectVideoMode)) { + have_dga = 0; + return 0; + } + return orig_xfree_error_handler(d, e); +} +#endif + void grabber_init() { @@ -1358,8 +1374,11 @@ grabber_init() #ifdef HAVE_LIBXXF86DGA if (have_dga) { int bar,fred; + orig_xfree_error_handler = XSetErrorHandler(xfree_dga_error_handler); XF86DGAGetVideoLL(dpy,XDefaultScreen(dpy),(void*)&base, &screen.bytesperline,&bar,&fred); + XSync(dpy, 0); + XSetErrorHandler(orig_xfree_error_handler); } #endif if (!do_overlay) {