summaryrefslogtreecommitdiff
path: root/extra/xawtv/xawtv-3.95-no-dga.patch
blob: 4509d4ba0af0739757f91dc20eba4926fdec0941 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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) {