Added hopefully fine qemu touchscreen related patches

git-svn-id: https://svn.o-hand.com/repos/poky/trunk@782 311d38ba-8fff-0310-9ca6-ca027cbcb966
This commit is contained in:
Matthew Allum 2006-10-02 15:30:24 +00:00
parent 823c845655
commit 3b9e54a65e
5 changed files with 696 additions and 1 deletions

View File

@ -0,0 +1,11 @@
--- qemu-0.8.2/sdl.c 2006-10-02 15:46:42.000000000 +0100
+++ qemu-0.8.2-x/sdl.c 2006-10-02 15:47:02.000000000 +0100
@@ -287,7 +287,7 @@
{
if (kbd_mouse_is_absolute()) {
SDL_ShowCursor(1);
- SDL_SetCursor(sdl_cursor_hidden);
+ /* SDL_SetCursor(sdl_cursor_hidden); */
} else {
SDL_ShowCursor(0);
}

View File

@ -0,0 +1,23 @@
--- qemu-cvs-ts-orig/hw/usb-wacom.c 2006-09-29 22:53:06.000000000 +0000
+++ qemu-cvs-ts/hw/usb-wacom.c 2006-09-29 22:44:14.000000000 +0000
@@ -203,19 +203,18 @@ static int usb_wacom_poll(USBWacomState
return 0;
buf[0] = s->mode;
+ buf[5] = 0x00;
if (b) {
buf[1] = s->x & 0xff;
buf[2] = s->x >> 8;
buf[3] = s->y & 0xff;
buf[4] = s->y >> 8;
- buf[5] = 0x40;
buf[6] = 0;
} else {
buf[1] = 0;
buf[2] = 0;
buf[3] = 0;
buf[4] = 0;
- buf[5] = 0x00;
buf[6] = (unsigned char) -127;
}

View File

@ -0,0 +1,28 @@
--- qemu-cvs-ts-orig/hw/usb-wacom.c 2006-09-29 17:27:43.000000000 +0000
+++ qemu-cvs-ts/hw/usb-wacom.c 2006-09-29 17:48:13.000000000 +0000
@@ -203,16 +203,20 @@ static int usb_wacom_poll(USBWacomState
return 0;
buf[0] = s->mode;
- buf[1] = s->x & 0xff;
- buf[2] = s->x >> 8;
- buf[3] = s->y & 0xff;
- buf[4] = s->y >> 8;
if (b) {
+ buf[1] = s->x & 0xff;
+ buf[2] = s->x >> 8;
+ buf[3] = s->y & 0xff;
+ buf[4] = s->y >> 8;
buf[5] = 0x40;
buf[6] = 0;
} else {
+ buf[1] = 0;
+ buf[2] = 0;
+ buf[3] = 0;
+ buf[4] = 0;
buf[5] = 0x00;
- buf[6] = (unsigned char) -120;
+ buf[6] = (unsigned char) -127;
}
return 7;

View File

@ -0,0 +1,630 @@
diff -urN qemu-0.8.2/configure qemu-0.8.2-x/configure
--- qemu-0.8.2/configure 2006-07-22 18:23:34.000000000 +0100
+++ qemu-0.8.2-x/configure 2006-08-24 14:24:33.000000000 +0100
@@ -492,6 +492,21 @@
fi # cross compilation
fi # -z $sdl
+##########################################
+# X Probe
+
+x11=no
+if test -z "$sdl" || test "$sdl" = "no"; then
+ x11=yes
+fi
+
+if test "$x11" = "yes"; then
+ x11=no
+ if `pkg-config --exists x11 xext`; then
+ x11=yes
+ fi
+fi
+
# Check if tools are available to build documentation.
if [ -x "`which texi2html`" ] && [ -x "`which pod2man`" ]; then
build_docs="yes"
@@ -540,6 +555,7 @@
if test "$sdl" != "no" ; then
echo "SDL static link $sdl_static"
fi
+echo "X11 support $x11"
echo "mingw32 support $mingw32"
echo "Adlib support $adlib"
echo "CoreAudio support $coreaudio"
@@ -748,14 +764,14 @@
fi
if test "$target_user_only" = "no" -a "$check_gfx" = "yes" \
- -a "$sdl" = "no" -a "$cocoa" = "no" ; then
+ -a "$sdl" = "no" -a "$x11" = "no" -a "$cocoa" = "no" ; then
echo "ERROR: QEMU requires SDL or Cocoa for graphical output"
echo "To build QEMU without graphical output configure with --disable-gfx-check"
echo "Note that this will disable all output from the virtual graphics card."
exit 1;
fi
-#echo "Creating $config_mak, $config_h and $target_dir/Makefile"
+echo "Creating $config_mak, $config_h and $target_dir/Makefile"
mkdir -p $target_dir
mkdir -p $target_dir/fpu
@@ -882,6 +898,14 @@
fi
fi
+# x11
+if test "$x11" = "yes"; then
+ echo "#define CONFIG_X11 1" >> $config_h
+ echo "CONFIG_X11=yes" >> $config_mak
+ echo "X11_LIBS=`pkg-config --libs x11 xext`" >> $config_mak
+ echo "X11_CFLAGS=`pkg-config --cflags x11 xext`" >> $config_mak
+fi
+
if test "$cocoa" = "yes" ; then
echo "#define CONFIG_COCOA 1" >> $config_h
echo "CONFIG_COCOA=yes" >> $config_mak
diff -urN qemu-0.8.2/Makefile.target qemu-0.8.2-x/Makefile.target
--- qemu-0.8.2/Makefile.target 2006-07-22 18:23:34.000000000 +0100
+++ qemu-0.8.2-x/Makefile.target 2006-08-23 14:47:17.000000000 +0100
@@ -376,6 +376,9 @@
ifdef CONFIG_SDL
VL_OBJS+=sdl.o
endif
+ifdef CONFIG_X11
+VL_OBJS+=x.o
+endif
VL_OBJS+=vnc.o
ifdef CONFIG_COCOA
VL_OBJS+=cocoa.o
@@ -426,7 +429,7 @@
endif
$(QEMU_SYSTEM): $(VL_OBJS) libqemu.a
- $(CC) $(VL_LDFLAGS) -o $@ $^ $(LIBS) $(SDL_LIBS) $(COCOA_LIBS) $(VL_LIBS)
+ $(CC) $(VL_LDFLAGS) -o $@ $^ $(LIBS) $(SDL_LIBS) $(X11_LIBS) $(COCOA_LIBS) $(VL_LIBS)
cocoa.o: cocoa.m
$(CC) $(CFLAGS) $(DEFINES) -c -o $@ $<
@@ -434,6 +437,10 @@
sdl.o: sdl.c keymaps.c sdl_keysym.h
$(CC) $(CFLAGS) $(DEFINES) $(SDL_CFLAGS) -c -o $@ $<
+x.o: x.c keymaps.c
+ $(CC) $(CFLAGS) $(DEFINES) $(X11_CFLAGS) -c -o $@ $<
+
+
vnc.o: vnc.c keymaps.c sdl_keysym.h vnchextile.h
$(CC) $(CFLAGS) $(DEFINES) -c -o $@ $<
diff -urN qemu-0.8.2/vl.c qemu-0.8.2-x/vl.c
--- qemu-0.8.2/vl.c 2006-07-22 18:23:34.000000000 +0100
+++ qemu-0.8.2-x/vl.c 2006-09-29 18:58:26.000000000 +0100
@@ -5217,6 +5217,9 @@
#ifdef USE_CODE_COPY
"-no-code-copy disable code copy acceleration\n"
#endif
+#if defined(CONFIG_X11)
+ "-parent xid Use pre-existing window as qemu output window\n"
+#endif
#ifdef TARGET_I386
"-std-vga simulate a standard VGA card with VESA Bochs Extensions\n"
" (default is CL-GD5446 PCI VGA)\n"
@@ -5302,6 +5305,8 @@
QEMU_OPTION_smp,
QEMU_OPTION_vnc,
QEMU_OPTION_no_acpi,
+
+ QEMU_OPTION_parent_xid,
};
typedef struct QEMUOption {
@@ -5361,6 +5366,9 @@
#if defined(TARGET_PPC) || defined(TARGET_SPARC)
{ "g", 1, QEMU_OPTION_g },
#endif
+#if defined(CONFIG_X11)
+ { "parent", HAS_ARG, QEMU_OPTION_parent_xid },
+#endif
{ "localtime", 0, QEMU_OPTION_localtime },
{ "std-vga", 0, QEMU_OPTION_std_vga },
{ "monitor", 1, QEMU_OPTION_monitor },
@@ -5608,6 +5616,10 @@
char usb_devices[MAX_USB_CMDLINE][128];
int usb_devices_index;
+#if defined(CONFIG_X11)
+ unsigned long parent_xid = 0;
+#endif
+
LIST_INIT (&vm_change_state_head);
#ifndef _WIN32
{
@@ -6021,6 +6033,11 @@
case QEMU_OPTION_no_acpi:
acpi_enabled = 0;
break;
+#if defined(CONFIG_X11)
+ case QEMU_OPTION_parent_xid:
+ parent_xid = strtol(optarg, NULL, 0);
+ break;
+#endif
}
}
}
@@ -6142,6 +6159,8 @@
sdl_display_init(ds, full_screen);
#elif defined(CONFIG_COCOA)
cocoa_display_init(ds, full_screen);
+#elif defined(CONFIG_X11)
+ x_display_init(ds, full_screen, parent_xid);
#else
dumb_display_init(ds);
#endif
diff -urN qemu-0.8.2/vl.h qemu-0.8.2-x/vl.h
--- qemu-0.8.2/vl.h 2006-07-22 18:23:34.000000000 +0100
+++ qemu-0.8.2-x/vl.h 2006-09-29 18:35:32.000000000 +0100
@@ -767,6 +767,9 @@
/* vnc.c */
void vnc_display_init(DisplayState *ds, int display);
+/* x.c */
+void x_display_init(DisplayState *ds, int display, unsigned long parent_xid);
+
/* ide.c */
#define MAX_DISKS 4
diff -urN qemu-0.8.2/x.c qemu-0.8.2-x/x.c
--- qemu-0.8.2/x.c 1970-01-01 01:00:00.000000000 +0100
+++ qemu-0.8.2-x/x.c 2006-09-29 18:35:02.000000000 +0100
@@ -0,0 +1,451 @@
+#include "vl.h"
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#include <X11/keysym.h>
+#include <X11/extensions/XShm.h>
+
+#include <sys/ipc.h>
+#include <sys/shm.h>
+
+typedef struct XHostScreen
+{
+ Display *xdpy;
+ int xscreen;
+ Visual *xvisual;
+ Window xwin, xwinroot;
+ GC xgc;
+ int xdepth;
+ XImage *ximg;
+ int xwin_width, xwin_height;
+ Bool use_fullscreen;
+ Bool have_shm;
+ unsigned char *fb_data;
+ unsigned long cmap[256];
+ XShmSegmentInfo shminfo;
+}
+XHostScreen;
+
+static XHostScreen *xscreen;
+static int trapped_error_code = 0;
+static int (*old_error_handler) (Display *d, XErrorEvent *e);
+
+static void
+x_update(DisplayState *ds, int x, int y, int w, int h);
+
+static int
+error_handler(Display *display,
+ XErrorEvent *error)
+{
+ trapped_error_code = error->error_code;
+ return 0;
+}
+
+static void
+x_errors_trap(void)
+{
+ trapped_error_code = 0;
+ old_error_handler = XSetErrorHandler(error_handler);
+}
+
+static int
+x_errors_untrap(void)
+{
+ XSetErrorHandler(old_error_handler);
+ return trapped_error_code;
+}
+
+static void
+x_update(DisplayState *ds, int x, int y, int w, int h)
+{
+ if (xscreen->have_shm)
+ {
+ XShmPutImage(xscreen->xdpy, xscreen->xwin, xscreen->xgc, xscreen->ximg,
+ x, y, x, y, w, h, False);
+ }
+ else
+ {
+ XPutImage(xscreen->xdpy, xscreen->xwin, xscreen->xgc, xscreen->ximg,
+ x, y, x, y, w, h);
+ }
+
+ XSync(xscreen->xdpy, False);
+}
+
+static void
+x_resize(DisplayState *ds, int w, int h)
+{
+ Bool shm_success = False;
+ int bitmap_pad;
+ XSizeHints *size_hints;
+
+ if (xscreen->ximg != NULL)
+ {
+ if (xscreen->have_shm)
+ {
+ XShmDetach(xscreen->xdpy, &xscreen->shminfo);
+ XDestroyImage (xscreen->ximg);
+ shmdt(xscreen->shminfo.shmaddr);
+ shmctl(xscreen->shminfo.shmid, IPC_RMID, 0);
+ }
+ else
+ {
+ if (xscreen->ximg->data)
+ {
+ free(xscreen->ximg->data);
+ xscreen->ximg->data = NULL;
+ }
+
+ XDestroyImage(xscreen->ximg);
+ }
+ }
+
+ if (xscreen->have_shm)
+ {
+ xscreen->ximg = XShmCreateImage(xscreen->xdpy,
+ xscreen->xvisual,
+ xscreen->xdepth,
+ ZPixmap,
+ NULL,
+ &xscreen->shminfo,
+ w, h );
+
+ xscreen->shminfo.shmid
+ = shmget(IPC_PRIVATE,
+ xscreen->ximg->bytes_per_line * h,
+ IPC_CREAT|0777);
+ xscreen->shminfo.shmaddr = xscreen->ximg->data
+ = shmat(xscreen->shminfo.shmid, 0, 0);
+
+ if (xscreen->ximg->data == (char *)-1)
+ {
+ xscreen->have_shm = False;
+ XDestroyImage(xscreen->ximg);
+ shmctl(xscreen->shminfo.shmid, IPC_RMID, 0);
+ }
+ else
+ {
+ xscreen->shminfo.readOnly = False;
+ XShmAttach(xscreen->xdpy, &xscreen->shminfo);
+ shm_success = True;
+ }
+ }
+
+ if (!shm_success)
+ {
+ bitmap_pad = ( xscreen->xdepth > 16 ) ?
+ 32 : (( xscreen->xdepth > 8 )? 16 : 8 );
+
+ xscreen->ximg = XCreateImage( xscreen->xdpy,
+ xscreen->xvisual,
+ xscreen->xdepth,
+ ZPixmap, 0, 0,
+ w,
+ h,
+ bitmap_pad,
+ 0);
+
+ xscreen->ximg->data
+ = malloc( xscreen->ximg->bytes_per_line * h );
+ }
+
+ XResizeWindow(xscreen->xdpy, xscreen->xwin, w, h);
+
+ /* Ask the WM to keep our size static */
+ size_hints = XAllocSizeHints();
+ size_hints->max_width = size_hints->min_width = w;
+ size_hints->max_height = size_hints->min_height = h;
+ size_hints->flags = PMinSize|PMaxSize;
+ XSetWMNormalHints(xscreen->xdpy, xscreen->xwin, size_hints);
+ XFree(size_hints);
+
+ XMapWindow(xscreen->xdpy, xscreen->xwin);
+
+ XSync(xscreen->xdpy, False);
+
+ xscreen->xwin_width = w;
+ xscreen->xwin_height = h;
+
+ if (1) // (ds->depth == xscreen->xdepth)
+ {
+ ds->data = xscreen->ximg->data;
+ }
+ else
+ {
+ xscreen->fb_data = malloc(w*h*(ds->depth>>3));
+ ds->data = xscreen->fb_data;
+ }
+
+ ds->linesize = xscreen->ximg->bytes_per_line;
+ ds->depth = (xscreen->xdepth >= 24) ? 32 : xscreen->xdepth;
+ ds->bgr = 0;
+
+#if 0
+ if (ds->depth == 32 && screen->format->Rshift == 0) {
+ ds->bgr = 1;
+ } else {
+ ds->bgr = 0;
+ }
+#endif
+
+ ds->width = w;
+ ds->height = h;
+
+}
+
+static void
+x_refresh(DisplayState *ds)
+{
+ vga_hw_update();
+}
+
+static int
+x_listen_poll(void *opaque)
+{
+ return XPending(xscreen->xdpy);
+}
+
+static void
+x_grab(void)
+{
+ static Bool grab = False;
+
+ if (!grab)
+ {
+ if (XGrabPointer (xscreen->xdpy, xscreen->xwin,
+ True,
+ NoEventMask,
+ GrabModeAsync,
+ GrabModeAsync,
+ xscreen->xwin, None, CurrentTime) == 0
+ && XGrabKeyboard (xscreen->xdpy, xscreen->xwin, True,
+ GrabModeAsync,
+ GrabModeAsync,
+ CurrentTime) == 0)
+ {
+ grab = True;
+ XStoreName(xscreen->xdpy, xscreen->xwin,
+ "QEmu (ctrl+shift releases mouse and keyboard )");
+ }
+ }
+ else
+ {
+ XUngrabPointer (xscreen->xdpy, CurrentTime);
+ XUngrabKeyboard (xscreen->xdpy, CurrentTime);
+ grab = False;
+ XStoreName(xscreen->xdpy, xscreen->xwin,
+ "QEmu (ctrl+shift grabs mouse and keyboard )");
+ }
+}
+
+static void
+x_listen_read(void *opaque)
+{
+ XEvent xev;
+ DisplayState *ds = opaque;
+ Bool grabbed = False;
+ static int last_x = 0, last_y = 0, button_state = 0, state;
+
+ if (XPending(xscreen->xdpy))
+ {
+ XNextEvent(xscreen->xdpy, &xev);
+
+ switch (xev.type)
+ {
+ case EnterNotify:
+ case LeaveNotify:
+ break;
+ case FocusIn:
+ if (!kbd_mouse_is_absolute())
+ x_grab();
+ break;
+ case FocusOut:
+ break;
+ case Expose:
+ while (XCheckTypedWindowEvent(xscreen->xdpy, xev.xexpose.window,
+ Expose, &xev));
+ x_update(ds, 0, 0,
+ xscreen->xwin_width,
+ xscreen->xwin_height);
+ break;
+ case KeyRelease:
+ if ((XKeycodeToKeysym(xscreen->xdpy,
+ xev.xkey.keycode,0) == XK_Shift_L
+ || XKeycodeToKeysym(xscreen->xdpy,
+ xev.xkey.keycode,0) == XK_Shift_R)
+ && (xev.xkey.state & ControlMask))
+ {
+ x_grab();
+ break;
+ }
+ case KeyPress:
+ {
+ int keycode = xev.xkey.keycode-8; /* X adds 8 to keycode */
+
+ /* FIXME: LUT needed here me thinks */
+
+ if (keycode & 0x80) /* Extended */
+ kbd_put_keycode(0xe0);
+
+ if (xev.type == KeyPress)
+ kbd_put_keycode(keycode & 0x7f);
+ else
+ kbd_put_keycode(keycode | 0x80);
+ }
+ break;
+ case ButtonPress:
+ case ButtonRelease:
+ case MotionNotify:
+ {
+ int ev_state, ev_x, ev_y, dx, dy;
+
+ state = 0;
+
+ if (xev.type == MotionNotify)
+ {
+ ev_state = xev.xmotion.state;
+ ev_x = xev.xmotion.x;
+ ev_y = xev.xmotion.y;
+
+ if (ev_state & Button1Mask)
+ state |= MOUSE_EVENT_LBUTTON;
+ if (ev_state & Button2Mask)
+ state |= MOUSE_EVENT_RBUTTON;
+ if (ev_state & Button3Mask)
+ state |= MOUSE_EVENT_MBUTTON;
+
+ /* Touchscreen dont send motion notifys */
+ if (kbd_mouse_is_absolute() && state == 0)
+ break;
+ }
+ else
+ {
+ ev_state = xev.xbutton.state;
+ ev_x = xev.xbutton.x;
+ ev_y = xev.xbutton.y;
+
+ if (xev.type == ButtonPress)
+ {
+ if (xev.xbutton.button == Button1)
+ state |= MOUSE_EVENT_LBUTTON;
+ if (xev.xbutton.state == Button1)
+ state |= MOUSE_EVENT_RBUTTON;
+ if (xev.xbutton.state & Button3)
+ state |= MOUSE_EVENT_MBUTTON;
+ }
+ }
+
+ if (kbd_mouse_is_absolute())
+ {
+ dx = ev_x * 0x7FFF / xscreen->xwin_width;
+ dy = ev_y * 0x7FFF / xscreen->xwin_height;
+ }
+ else
+ {
+ dx = ev_x - last_x;
+ dy = ev_y - last_y;
+ }
+
+ kbd_mouse_event(dx, dy, 0, state);
+
+ last_x = ev_x;
+ last_y = ev_y;
+ }
+ break;
+ default:
+ break;
+
+ }
+ }
+ return;
+}
+
+void
+x_display_init(DisplayState *ds, int full_screen, unsigned long parent_xid)
+{
+ Cursor empty_cursor;
+ Pixmap cursor_pxm;
+ XColor col;
+ XSetWindowAttributes attr;
+
+ xscreen = malloc(sizeof(XHostScreen));
+ memset(xscreen, 0, sizeof(XHostScreen));
+
+ if ((xscreen->xdpy = XOpenDisplay(getenv("DISPLAY"))) == NULL)
+ {
+ fprintf(stderr, "\nqemu cannot open host display. Is DISPLAY set?\n");
+ exit(-1);
+ }
+
+ xscreen->xscreen = DefaultScreen(xscreen->xdpy);
+ xscreen->xwinroot = RootWindow(xscreen->xdpy, xscreen->xscreen);
+ xscreen->xgc = XCreateGC(xscreen->xdpy, xscreen->xwinroot, 0, NULL);
+ xscreen->xdepth = DefaultDepth(xscreen->xdpy, xscreen->xscreen);
+ xscreen->xvisual = DefaultVisual(xscreen->xdpy, xscreen->xscreen);
+
+ attr.event_mask = ButtonPressMask|ButtonReleaseMask|PointerMotionMask
+ |KeyPressMask|KeyReleaseMask|ExposureMask
+ |FocusChangeMask|EnterWindowMask|LeaveWindowMask;
+
+ xscreen->xwin = XCreateWindow(xscreen->xdpy,
+ xscreen->xwinroot,
+ 0,0,640,480,
+ 0,
+ CopyFromParent,
+ CopyFromParent,
+ CopyFromParent,
+ CWEventMask,
+ &attr);
+
+ xscreen->have_shm = True;
+
+ if (!XShmQueryExtension(xscreen->xdpy) || getenv("QEMU_X_NO_SHM"))
+ {
+ xscreen->have_shm = False;
+ }
+ else
+ {
+ XShmSegmentInfo shminfo;
+
+ shminfo.shmid=shmget(IPC_PRIVATE, 1, IPC_CREAT|0777);
+ shminfo.shmaddr=shmat(shminfo.shmid,0,0);
+ shminfo.readOnly=True;
+
+ x_errors_trap();
+
+ XShmAttach(xscreen->xdpy, &shminfo);
+ XSync(xscreen->xdpy, False);
+
+ if (x_errors_untrap())
+ {
+ fprintf(stderr, "QEmu unable to use SHM XImages\n");
+ xscreen->have_shm = False;
+ }
+
+ shmdt(shminfo.shmaddr);
+ shmctl(shminfo.shmid, IPC_RMID, 0);
+ }
+
+ if (!kbd_mouse_is_absolute())
+ {
+ /* Only hide cursor if were not a touchscreen */
+ cursor_pxm = XCreatePixmap (xscreen->xdpy, xscreen->xwinroot, 1, 1, 1);
+ memset (&col, 0, sizeof (col));
+ empty_cursor = XCreatePixmapCursor (xscreen->xdpy,
+ cursor_pxm, cursor_pxm,
+ &col, &col, 1, 1);
+ XDefineCursor (xscreen->xdpy, xscreen->xwin, empty_cursor);
+ XFreePixmap (xscreen->xdpy, cursor_pxm);
+ }
+
+ ds->dpy_update = x_update;
+ ds->dpy_resize = x_resize;
+ ds->dpy_refresh = x_refresh;
+
+ if ((qemu_set_fd_handler2 (ConnectionNumber(xscreen->xdpy),
+ x_listen_poll, x_listen_read, NULL, ds)) == -1)
+ exit(-1);
+
+ x_resize(ds, 640, 480);
+}

View File

@ -4,11 +4,14 @@ PR = "r1"
SRC_URI = "cvs://anonymous@cvs.savannah.nongnu.org/sources/qemu;method=pserver;rsh=ssh;module=qemu \
file://configure.patch;patch=1 \
file://qemu-sdl-cursor.patch;patch=0 \
file://arm_nptl.patch;patch=1 \
file://pl110_rgb-r0.patch;patch=1 \
file://qemu-pci-irq-sharing.patch;patch=1 \
file://compiler.patch;patch=1 \
file://qemu-usb-wacom-0.8.2.patch;patch=1"
file://qemu-usb-wacom-0.8.2.patch;patch=1 \
file://qemu-usb-wacom-pressure.patch;patch=1 \
file://qemu-usb-wacom-buttons.patch;patch=1"
S = "${WORKDIR}/qemu"