PKGBUILDs/extra/xawtv/xawtv-3.95-no-dga.patch
2009-10-09 21:23:22 -05:00

120 lines
3.8 KiB
Diff

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) {