Blob Blame History Raw
diff -Nrbu xawtv-3.95/console/v4l-conf.c xawtv-3.95-OK/console/v4l-conf.c
--- xawtv-3.95/console/v4l-conf.c	2005-02-09 15:27:36.000000000 +0300
+++ xawtv-3.95-OK/console/v4l-conf.c	2008-08-26 19:35:18.000000000 +0400
@@ -221,6 +221,21 @@
     }
 }
 
+#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 @@
     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 @@
 	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 -Nrbu xawtv-3.95/libng/plugins/drv0-v4l2.c xawtv-3.95-OK/libng/plugins/drv0-v4l2.c
--- xawtv-3.95/libng/plugins/drv0-v4l2.c	2008-08-26 19:31:52.000000000 +0400
+++ xawtv-3.95-OK/libng/plugins/drv0-v4l2.c	2008-08-26 19:35:18.000000000 +0400
@@ -593,7 +593,7 @@
 	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 -Nrbu xawtv-3.95/x11/xt.c xawtv-3.95-OK/x11/xt.c
--- xawtv-3.95/x11/xt.c	2005-01-11 12:26:43.000000000 +0300
+++ xawtv-3.95-OK/x11/xt.c	2008-08-26 19:35:18.000000000 +0400
@@ -1247,18 +1247,21 @@
 }
 
 /*----------------------------------------------------------------------*/
+#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 @@
 #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 @@
 #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) {