qemu: add missing files
authorMichael Lauer <mickey@vanille-media.de>
Fri, 20 Oct 2006 12:52:02 +0000 (12:52 +0000)
committerMichael Lauer <mickey@vanille-media.de>
Fri, 20 Oct 2006 12:52:02 +0000 (12:52 +0000)
packages/qemu/files/compiler.patch [new file with mode: 0644]
packages/qemu/files/nodocs_cvs.patch [new file with mode: 0644]
packages/qemu/files/qemu-pci-irq-sharing.patch [new file with mode: 0644]
packages/qemu/files/qemu-sdl-cursor.patch [new file with mode: 0644]
packages/qemu/files/qemu-usb-wacom-0.8.2.patch [new file with mode: 0644]
packages/qemu/files/qemu-usb-wacom-buttons.patch [new file with mode: 0644]
packages/qemu/files/qemu-usb-wacom-pressure.patch [new file with mode: 0644]
packages/qemu/files/qemu-usb-wacom.patch [new file with mode: 0644]
packages/qemu/files/qemu-x-no-sdl.patch [new file with mode: 0644]

diff --git a/packages/qemu/files/compiler.patch b/packages/qemu/files/compiler.patch
new file mode 100644 (file)
index 0000000..dad18b3
--- /dev/null
@@ -0,0 +1,10 @@
+--- qemu/usb-linux.c~  2006-07-19 19:06:15.000000000 +0100
++++ qemu/usb-linux.c   2006-10-02 12:49:00.000000000 +0100
+@@ -26,7 +26,6 @@
+ #if defined(__linux__)
+ #include <dirent.h>
+ #include <sys/ioctl.h>
+-#include <linux/compiler.h>
+ #include <linux/usbdevice_fs.h>
+ #include <linux/version.h>
diff --git a/packages/qemu/files/nodocs_cvs.patch b/packages/qemu/files/nodocs_cvs.patch
new file mode 100644 (file)
index 0000000..b52d860
--- /dev/null
@@ -0,0 +1,44 @@
+Index: qemu/Makefile
+===================================================================
+--- qemu.orig/Makefile 2006-04-18 11:11:37.000000000 +0100
++++ qemu/Makefile      2006-04-18 11:14:34.000000000 +0100
+@@ -11,7 +11,7 @@
+ ifdef CONFIG_STATIC
+ LDFLAGS+=-static
+ endif
+-DOCS=qemu-doc.html qemu-tech.html qemu.1 qemu-img.1
++DOCS=
+ all: dyngen$(EXESUF) $(TOOLS) $(DOCS)
+       for d in $(TARGET_DIRS); do \
+@@ -51,11 +51,11 @@
+                       video.x proll.elf linux_boot.bin; do \
+               $(INSTALL) -m 644 $(SRC_PATH)/pc-bios/$$x "$(DESTDIR)$(datadir)"; \
+       done
+-      mkdir -p "$(DESTDIR)$(docdir)"
+-      $(INSTALL) -m 644 qemu-doc.html  qemu-tech.html "$(DESTDIR)$(docdir)"
++#     mkdir -p "$(DESTDIR)$(docdir)"
++#     $(INSTALL) -m 644 qemu-doc.html  qemu-tech.html "$(DESTDIR)$(docdir)"
+ ifndef CONFIG_WIN32
+-      mkdir -p "$(DESTDIR)$(mandir)/man1"
+-      $(INSTALL) qemu.1 qemu-img.1 "$(DESTDIR)$(mandir)/man1"
++#     mkdir -p "$(DESTDIR)$(mandir)/man1"
++#     $(INSTALL) qemu.1 qemu-img.1 "$(DESTDIR)$(mandir)/man1"
+       mkdir -p "$(DESTDIR)$(datadir)/keymaps"
+       for x in $(KEYMAPS); do \
+               $(INSTALL) -m 644 $(SRC_PATH)/keymaps/$$x "$(DESTDIR)$(datadir)/keymaps"; \
+@@ -122,10 +122,10 @@
+       $(datadir)/ppc_rom.bin \
+       $(datadir)/video.x \
+       $(datadir)/proll.elf \
+-      $(datadir)/linux_boot.bin \
+-      $(docdir)/qemu-doc.html \
+-      $(docdir)/qemu-tech.html \
+-      $(mandir)/man1/qemu.1 $(mandir)/man1/qemu-img.1 )
++      $(datadir)/linux_boot.bin
++#     $(docdir)/qemu-doc.html \
++#     $(docdir)/qemu-tech.html \
++#     $(mandir)/man1/qemu.1 $(mandir)/man1/qemu-img.1 )
+ ifneq ($(wildcard .depend),)
+ include .depend
diff --git a/packages/qemu/files/qemu-pci-irq-sharing.patch b/packages/qemu/files/qemu-pci-irq-sharing.patch
new file mode 100644 (file)
index 0000000..c47e898
--- /dev/null
@@ -0,0 +1,52 @@
+diff -pNaur qemu-cvs-ts-orig/hw/pci.c qemu-cvs-ts/hw/pci.c
+--- qemu-cvs-ts-orig/hw/pci.c  2006-08-17 10:46:34.000000000 +0000
++++ qemu-cvs-ts/hw/pci.c       2006-09-23 17:02:41.000000000 +0000
+@@ -34,6 +34,7 @@ struct PCIBus {
+     SetIRQFunc *low_set_irq;
+     void *irq_opaque;
+     PCIDevice *devices[256];
++    int irq_count[4];
+ };
+ static void pci_update_mappings(PCIDevice *d);
+@@ -49,6 +50,7 @@ PCIBus *pci_register_bus(pci_set_irq_fn 
+     bus->set_irq = set_irq;
+     bus->irq_opaque = pic;
+     bus->devfn_min = devfn_min;
++    memset(bus->irq_count, 0, sizeof(bus->irq_count));
+     first_bus = bus;
+     return bus;
+ }
+@@ -100,6 +102,7 @@ PCIDevice *pci_register_device(PCIBus *b
+     pci_dev->bus = bus;
+     pci_dev->devfn = devfn;
+     pstrcpy(pci_dev->name, sizeof(pci_dev->name), name);
++    memset(pci_dev->irq_state, 0, sizeof(pci_dev->irq_state));
+     if (!config_read)
+         config_read = pci_default_read_config;
+@@ -404,7 +407,10 @@ uint32_t pci_data_read(void *opaque, uin
+ void pci_set_irq(PCIDevice *pci_dev, int irq_num, int level)
+ {
+     PCIBus *bus = pci_dev->bus;
+-    bus->set_irq(pci_dev, bus->irq_opaque, irq_num, level);
++    bus->irq_count[irq_num] += level - pci_dev->irq_state[irq_num];
++    pci_dev->irq_state[irq_num] = level;
++    bus->set_irq(pci_dev, bus->irq_opaque,
++                 irq_num, !!bus->irq_count[irq_num]);
+ }
+ /***********************************************************/
+diff -pNaur qemu-cvs-ts-orig/vl.h qemu-cvs-ts/vl.h
+--- qemu-cvs-ts-orig/vl.h      2006-09-18 01:15:29.000000000 +0000
++++ qemu-cvs-ts/vl.h   2006-09-23 17:15:21.000000000 +0000
+@@ -733,6 +733,9 @@ struct PCIDevice {
+     PCIConfigWriteFunc *config_write;
+     /* ??? This is a PC-specific hack, and should be removed.  */
+     int irq_index;
++
++    /* remember last irq levels */
++    int irq_state[4];
+ };
+ PCIDevice *pci_register_device(PCIBus *bus, const char *name,
diff --git a/packages/qemu/files/qemu-sdl-cursor.patch b/packages/qemu/files/qemu-sdl-cursor.patch
new file mode 100644 (file)
index 0000000..bd6a51a
--- /dev/null
@@ -0,0 +1,13 @@
+Index: qemu/sdl.c
+===================================================================
+--- qemu.orig/sdl.c    2006-10-02 17:06:12.000000000 +0100
++++ qemu/sdl.c 2006-10-02 17:06:59.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);
+     }
diff --git a/packages/qemu/files/qemu-usb-wacom-0.8.2.patch b/packages/qemu/files/qemu-usb-wacom-0.8.2.patch
new file mode 100644 (file)
index 0000000..33a6db3
--- /dev/null
@@ -0,0 +1,445 @@
+diff -pNaur qemu-cvs-ts-orig/hw/usb-wacom.c qemu-cvs-ts/hw/usb-wacom.c
+--- qemu-cvs-ts-orig/hw/usb-wacom.c    1970-01-01 01:00:00.000000000 +0100
++++ qemu-cvs-ts/hw/usb-wacom.c 2006-09-22 20:44:26.000000000 +0200
+@@ -0,0 +1,408 @@
++/*
++ * Wacom PenPartner USB tablet emulation.
++ *
++ * Copyright (c) 2006 Openedhand Ltd.
++ *
++ * Author: Andrzej Zaborowski <balrog@zabor.org>
++ *
++ * Based on hw/usb-hid.c:
++ * Copyright (c) 2005 Fabrice Bellard
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of this software and associated documentation files (the "Software"), to deal
++ * in the Software without restriction, including without limitation the rights
++ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++ * copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++ * THE SOFTWARE.
++ */
++#include "vl.h"
++
++/* Interface requests */
++#define WACOM_GET_REPORT      0x2101
++#define WACOM_SET_REPORT      0x2109
++
++/* HID interface requests */
++#define HID_GET_REPORT                0xa101
++#define HID_GET_IDLE          0xa102
++#define HID_GET_PROTOCOL      0xa103
++#define HID_SET_IDLE          0x210a
++#define HID_SET_PROTOCOL      0x210b
++
++#define WACOM_MODE_HID                1
++#define WACOM_MODE_WACOM      2
++
++typedef struct USBWacomState {
++    USBDevice dev;
++    int dx, dy, dz, buttons_state;
++    int x, y;
++    int mouse_grabbed;
++    int mode;
++} USBWacomState;
++
++static const uint8_t qemu_wacom_dev_descriptor[] = {
++    0x12,     /*  u8 bLength; */
++    0x01,     /*  u8 bDescriptorType; Device */
++    0x10, 0x10,       /*  u16 bcdUSB; v1.10 */
++
++    0x00,     /*  u8  bDeviceClass; */
++    0x00,     /*  u8  bDeviceSubClass; */
++    0x00,     /*  u8  bDeviceProtocol; [ low/full speeds only ] */
++    0x08,     /*  u8  bMaxPacketSize0; 8 Bytes */
++
++    0x6a, 0x05,       /*  u16 idVendor; */
++    0x00, 0x00,       /*  u16 idProduct; */
++    0x10, 0x42,       /*  u16 bcdDevice */
++
++    0x01,     /*  u8  iManufacturer; */
++    0x02,     /*  u8  iProduct; */
++    0x00,     /*  u8  iSerialNumber; */
++    0x01,     /*  u8  bNumConfigurations; */
++};
++
++static const uint8_t qemu_wacom_config_descriptor[] = {
++    /* one configuration */
++    0x09,     /*  u8  bLength; */
++    0x02,     /*  u8  bDescriptorType; Configuration */
++    0x22, 0x00,       /*  u16 wTotalLength; */
++    0x01,     /*  u8  bNumInterfaces; (1) */
++    0x01,     /*  u8  bConfigurationValue; */
++    0x00,     /*  u8  iConfiguration; */
++    0x80,     /*  u8  bmAttributes; 
++                               Bit 7: must be set,
++                                   6: Self-powered,
++                                   5: Remote wakeup,
++                                   4..0: resvd */
++    40,               /*  u8  MaxPower; */
++
++    /* one interface */
++    0x09,     /*  u8  if_bLength; */
++    0x04,     /*  u8  if_bDescriptorType; Interface */
++    0x00,     /*  u8  if_bInterfaceNumber; */
++    0x00,     /*  u8  if_bAlternateSetting; */
++    0x01,     /*  u8  if_bNumEndpoints; */
++    0x03,     /*  u8  if_bInterfaceClass; HID */
++    0x01,     /*  u8  if_bInterfaceSubClass; Boot */
++    0x02,     /*  u8  if_bInterfaceProtocol; [usb1.1 or single tt] */
++    0x00,     /*  u8  if_iInterface; */
++
++    /* HID descriptor */
++    0x09,     /*  u8  bLength; */
++    0x21,     /*  u8  bDescriptorType; */
++    0x01, 0x10,       /*  u16 HID_class */
++    0x00,     /*  u8  country_code */
++    0x01,     /*  u8  num_descriptors */
++    0x22,     /*  u8  type; Report */
++    0x6e, 0x00,       /*  u16 len */
++
++    /* one endpoint (status change endpoint) */
++    0x07,     /*  u8  ep_bLength; */
++    0x05,     /*  u8  ep_bDescriptorType; Endpoint */
++    0x81,     /*  u8  ep_bEndpointAddress; IN Endpoint 1 */
++    0x03,     /*  u8  ep_bmAttributes; Interrupt */
++    0x08, 0x00,       /*  u16 ep_wMaxPacketSize; */
++    0x0a,     /*  u8  ep_bInterval; */
++};
++
++static void usb_mouse_event(void *opaque,
++                            int dx1, int dy1, int dz1, int buttons_state)
++{
++    USBWacomState *s = opaque;
++
++    s->dx += dx1;
++    s->dy += dy1;
++    s->dz += dz1;
++    s->buttons_state = buttons_state;
++}
++
++static void usb_wacom_event(void *opaque,
++                            int x, int y, int dz, int buttons_state)
++{
++    USBWacomState *s = opaque;
++
++    s->x = x;
++    s->y = y;
++    s->dz += dz;
++    s->buttons_state = buttons_state;
++}
++
++static inline int int_clamp(int val, int vmin, int vmax)
++{
++    if (val < vmin)
++        return vmin;
++    else if (val > vmax)
++        return vmax;
++    else
++        return val;
++}
++
++static int usb_mouse_poll(USBWacomState *s, uint8_t *buf, int len)
++{
++    int dx, dy, dz, b, l;
++
++    if (!s->mouse_grabbed) {
++        qemu_add_mouse_event_handler(usb_mouse_event, s, 1);
++        s->mouse_grabbed = 1;
++    }
++
++    dx = int_clamp(s->dx, -128, 127);
++    dy = int_clamp(s->dy, -128, 127);
++    dz = int_clamp(s->dz, -128, 127);
++
++    s->dx -= dx;
++    s->dy -= dy;
++    s->dz -= dz;
++
++    b = 0;
++    if (s->buttons_state & MOUSE_EVENT_LBUTTON)
++        b |= 0x01;
++    if (s->buttons_state & MOUSE_EVENT_RBUTTON)
++        b |= 0x02;
++    if (s->buttons_state & MOUSE_EVENT_MBUTTON)
++        b |= 0x04;
++
++    buf[0] = b;
++    buf[1] = dx;
++    buf[2] = dy;
++    l = 3;
++    if (len >= 4) {
++        buf[3] = dz;
++        l = 4;
++    }
++    return l;
++}
++
++static int usb_wacom_poll(USBWacomState *s, uint8_t *buf, int len)
++{
++    int b;
++
++    if (!s->mouse_grabbed) {
++        qemu_add_mouse_event_handler(usb_wacom_event, s, 1);
++        s->mouse_grabbed = 1;
++    }
++
++    b = 0;
++    if (s->buttons_state & MOUSE_EVENT_LBUTTON)
++        b |= 0x01;
++    if (s->buttons_state & MOUSE_EVENT_RBUTTON)
++        b |= 0x02;
++    if (s->buttons_state & MOUSE_EVENT_MBUTTON)
++        b |= 0x04;
++
++    if (len < 7)
++        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[5] = 0x40;
++        buf[6] = 0;
++    } else {
++        buf[5] = 0x00;
++        buf[6] = (unsigned char) -120;
++    }
++
++    return 7;
++}
++
++static void usb_wacom_handle_reset(USBDevice *dev)
++{
++    USBWacomState *s = (USBWacomState *) dev;
++
++    s->dx = 0;
++    s->dy = 0;
++    s->dz = 0;
++    s->x = 0;
++    s->y = 0;
++    s->buttons_state = 0;
++    s->mode = WACOM_MODE_HID;
++}
++
++static int usb_wacom_handle_control(USBDevice *dev, int request, int value,
++                                    int index, int length, uint8_t *data)
++{
++    USBWacomState *s = (USBWacomState *) dev;
++    int ret = 0;
++
++    switch (request) {
++    case DeviceRequest | USB_REQ_GET_STATUS:
++        data[0] = (1 << USB_DEVICE_SELF_POWERED) |
++            (dev->remote_wakeup << USB_DEVICE_REMOTE_WAKEUP);
++        data[1] = 0x00;
++        ret = 2;
++        break;
++    case DeviceOutRequest | USB_REQ_CLEAR_FEATURE:
++        if (value == USB_DEVICE_REMOTE_WAKEUP) {
++            dev->remote_wakeup = 0;
++        } else {
++            goto fail;
++        }
++        ret = 0;
++        break;
++    case DeviceOutRequest | USB_REQ_SET_FEATURE:
++        if (value == USB_DEVICE_REMOTE_WAKEUP) {
++            dev->remote_wakeup = 1;
++        } else {
++            goto fail;
++        }
++        ret = 0;
++        break;
++    case DeviceOutRequest | USB_REQ_SET_ADDRESS:
++        dev->addr = value;
++        ret = 0;
++        break;
++    case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
++        switch (value >> 8) {
++        case USB_DT_DEVICE:
++            memcpy(data, qemu_wacom_dev_descriptor, 
++                   sizeof(qemu_wacom_dev_descriptor));
++            ret = sizeof(qemu_wacom_dev_descriptor);
++            break;
++        case USB_DT_CONFIG:
++                  memcpy(data, qemu_wacom_config_descriptor, 
++                   sizeof(qemu_wacom_config_descriptor));
++            ret = sizeof(qemu_wacom_config_descriptor);
++            break;
++        case USB_DT_STRING:
++            switch (value & 0xff) {
++            case 0:
++                /* language ids */
++                data[0] = 4;
++                data[1] = 3;
++                data[2] = 0x09;
++                data[3] = 0x04;
++                ret = 4;
++                break;
++            case 1:
++                /* serial number */
++                ret = set_usb_string(data, "1");
++                break;
++            case 2:
++              ret = set_usb_string(data, "Wacom PenPartner");
++                break;
++            case 3:
++                /* vendor description */
++                ret = set_usb_string(data, "QEMU " QEMU_VERSION);
++                break;
++            case 4:
++                ret = set_usb_string(data, "Wacom Tablet");
++                break;
++            case 5:
++                ret = set_usb_string(data, "Endpoint1 Interrupt Pipe");
++                break;
++            default:
++                goto fail;
++            }
++            break;
++        default:
++            goto fail;
++        }
++        break;
++    case DeviceRequest | USB_REQ_GET_CONFIGURATION:
++        data[0] = 1;
++        ret = 1;
++        break;
++    case DeviceOutRequest | USB_REQ_SET_CONFIGURATION:
++        ret = 0;
++        break;
++    case DeviceRequest | USB_REQ_GET_INTERFACE:
++        data[0] = 0;
++        ret = 1;
++        break;
++    case DeviceOutRequest | USB_REQ_SET_INTERFACE:
++        ret = 0;
++        break;
++    case WACOM_SET_REPORT:
++        qemu_add_mouse_event_handler(NULL, NULL, 0);
++      s->mouse_grabbed = 0;
++        s->mode = data[0];
++        ret = 0;
++        break;
++    case WACOM_GET_REPORT:
++        data[0] = 0;
++        data[1] = s->mode;
++        ret = 2;
++        break;
++    /* USB HID requests */
++    case HID_GET_REPORT:
++        if (s->mode == WACOM_MODE_HID)
++            ret = usb_mouse_poll(s, data, length);
++        else if (s->mode == WACOM_MODE_WACOM)
++            ret = usb_wacom_poll(s, data, length);
++        break;
++    case HID_SET_IDLE:
++        ret = 0;
++        break;
++    default:
++    fail:
++        ret = USB_RET_STALL;
++        break;
++    }
++    return ret;
++}
++
++static int usb_wacom_handle_data(USBDevice *dev, int pid, 
++                                 uint8_t devep, uint8_t *data, int len)
++{
++    USBWacomState *s = (USBWacomState *) dev;
++    int ret = 0;
++
++    switch (pid) {
++    case USB_TOKEN_IN:
++        if (devep == 1) {
++            if (s->mode == WACOM_MODE_HID)
++                ret = usb_mouse_poll(s, data, len);
++            else if (s->mode == WACOM_MODE_WACOM)
++                ret = usb_wacom_poll(s, data, len);
++            break;
++        }
++        /* Fall through.  */
++    case USB_TOKEN_OUT:
++    default:
++        ret = USB_RET_STALL;
++        break;
++    }
++    return ret;
++}
++
++static void usb_wacom_handle_destroy(USBDevice *dev)
++{
++    USBWacomState *s = (USBWacomState *) dev;
++
++    qemu_add_mouse_event_handler(NULL, NULL, 0);
++    qemu_free(s);
++}
++
++USBDevice *usb_wacom_init(void)
++{
++    USBWacomState *s;
++
++    s = qemu_mallocz(sizeof(USBWacomState));
++    if (!s)
++        return NULL;
++    s->dev.speed = USB_SPEED_FULL;
++    s->dev.handle_packet = usb_generic_handle_packet;
++
++    s->dev.handle_reset = usb_wacom_handle_reset;
++    s->dev.handle_control = usb_wacom_handle_control;
++    s->dev.handle_data = usb_wacom_handle_data;
++    s->dev.handle_destroy = usb_wacom_handle_destroy;
++
++    pstrcpy(s->dev.devname, sizeof(s->dev.devname),
++            "QEMU PenPartner Tablet");
++
++    return (USBDevice *) s;
++}
+diff -pNaur qemu-cvs-ts-orig/hw/usb.h qemu-cvs-ts/hw/usb.h
+--- qemu-cvs-ts-orig/hw/usb.h  2006-08-12 03:04:27.000000000 +0200
++++ qemu-cvs-ts/hw/usb.h       2006-09-21 01:40:40.000000000 +0200
+@@ -218,3 +218,6 @@ USBDevice *usb_tablet_init(void);
+ /* usb-msd.c */
+ USBDevice *usb_msd_init(const char *filename);
++
++/* usb-wacom.c */
++USBDevice *usb_wacom_init(void);
+diff -pNaur qemu-cvs-ts-orig/vl.c qemu-cvs-ts/vl.c
+--- qemu-cvs-ts-orig/vl.c      2006-09-10 16:39:54.000000000 +0200
++++ qemu-cvs-ts/vl.c   2006-09-21 01:45:16.000000000 +0200
+@@ -3765,6 +3765,8 @@ static int usb_device_add(const char *de
+       dev = usb_tablet_init();
+     } else if (strstart(devname, "disk:", &p)) {
+         dev = usb_msd_init(p);
++    } else if (!strcmp(devname, "wacom-tablet")) {
++        dev = usb_wacom_init();
+     } else {
+         return -1;
+     }
+diff -pNaur qemu-cvs-ts-orig/Makefile.target qemu-cvs-ts/Makefile.target
+--- qemu-cvs-ts-orig/Makefile.target   2006-09-18 03:15:29.000000000 +0200
++++ qemu-cvs-ts/Makefile.target        2006-09-21 02:32:19.000000000 +0200
+@@ -330,6 +330,7 @@ VL_OBJS+= scsi-disk.o cdrom.o lsi53c895a
+ # USB layer
+ VL_OBJS+= usb.o usb-hub.o usb-linux.o usb-hid.o usb-ohci.o usb-msd.o
++VL_OBJS+= usb-wacom.o
+ # PCI network cards
+ VL_OBJS+= ne2000.o rtl8139.o pcnet.o
diff --git a/packages/qemu/files/qemu-usb-wacom-buttons.patch b/packages/qemu/files/qemu-usb-wacom-buttons.patch
new file mode 100644 (file)
index 0000000..ee24c15
--- /dev/null
@@ -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;
+     }
diff --git a/packages/qemu/files/qemu-usb-wacom-pressure.patch b/packages/qemu/files/qemu-usb-wacom-pressure.patch
new file mode 100644 (file)
index 0000000..668d50d
--- /dev/null
@@ -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;
diff --git a/packages/qemu/files/qemu-usb-wacom.patch b/packages/qemu/files/qemu-usb-wacom.patch
new file mode 100644 (file)
index 0000000..c1c39ec
--- /dev/null
@@ -0,0 +1,444 @@
+diff -pNaur qemu-cvs-ts-orig/hw/usb-wacom.c qemu-cvs-ts/hw/usb-wacom.c
+--- qemu-cvs-ts-orig/hw/usb-wacom.c    1970-01-01 01:00:00.000000000 +0100
++++ qemu-cvs-ts/hw/usb-wacom.c 2006-09-22 20:44:26.000000000 +0200
+@@ -0,0 +1,407 @@
++/*
++ * Wacom PenPartner USB tablet emulation.
++ *
++ * Copyright (c) 2006 Openedhand Ltd.
++ *
++ * Author: Andrzej Zaborowski <balrog@zabor.org>
++ *
++ * Based on hw/usb-hid.c:
++ * Copyright (c) 2005 Fabrice Bellard
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of this software and associated documentation files (the "Software"), to deal
++ * in the Software without restriction, including without limitation the rights
++ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++ * copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++ * THE SOFTWARE.
++ */
++#include "vl.h"
++
++/* Interface requests */
++#define WACOM_GET_REPORT      0x2101
++#define WACOM_SET_REPORT      0x2109
++
++/* HID interface requests */
++#define HID_GET_REPORT                0xa101
++#define HID_GET_IDLE          0xa102
++#define HID_GET_PROTOCOL      0xa103
++#define HID_SET_IDLE          0x210a
++#define HID_SET_PROTOCOL      0x210b
++
++#define WACOM_MODE_HID                1
++#define WACOM_MODE_WACOM      2
++
++typedef struct USBWacomState {
++    USBDevice dev;
++    int dx, dy, dz, buttons_state;
++    int x, y;
++    int mouse_grabbed;
++    int mode;
++} USBWacomState;
++
++static const uint8_t qemu_wacom_dev_descriptor[] = {
++    0x12,     /*  u8 bLength; */
++    0x01,     /*  u8 bDescriptorType; Device */
++    0x10, 0x10,       /*  u16 bcdUSB; v1.10 */
++
++    0x00,     /*  u8  bDeviceClass; */
++    0x00,     /*  u8  bDeviceSubClass; */
++    0x00,     /*  u8  bDeviceProtocol; [ low/full speeds only ] */
++    0x08,     /*  u8  bMaxPacketSize0; 8 Bytes */
++
++    0x6a, 0x05,       /*  u16 idVendor; */
++    0x00, 0x00,       /*  u16 idProduct; */
++    0x10, 0x42,       /*  u16 bcdDevice */
++
++    0x01,     /*  u8  iManufacturer; */
++    0x02,     /*  u8  iProduct; */
++    0x00,     /*  u8  iSerialNumber; */
++    0x01,     /*  u8  bNumConfigurations; */
++};
++
++static const uint8_t qemu_wacom_config_descriptor[] = {
++    /* one configuration */
++    0x09,     /*  u8  bLength; */
++    0x02,     /*  u8  bDescriptorType; Configuration */
++    0x22, 0x00,       /*  u16 wTotalLength; */
++    0x01,     /*  u8  bNumInterfaces; (1) */
++    0x01,     /*  u8  bConfigurationValue; */
++    0x00,     /*  u8  iConfiguration; */
++    0x80,     /*  u8  bmAttributes; 
++                               Bit 7: must be set,
++                                   6: Self-powered,
++                                   5: Remote wakeup,
++                                   4..0: resvd */
++    40,               /*  u8  MaxPower; */
++
++    /* one interface */
++    0x09,     /*  u8  if_bLength; */
++    0x04,     /*  u8  if_bDescriptorType; Interface */
++    0x00,     /*  u8  if_bInterfaceNumber; */
++    0x00,     /*  u8  if_bAlternateSetting; */
++    0x01,     /*  u8  if_bNumEndpoints; */
++    0x03,     /*  u8  if_bInterfaceClass; HID */
++    0x01,     /*  u8  if_bInterfaceSubClass; Boot */
++    0x02,     /*  u8  if_bInterfaceProtocol; [usb1.1 or single tt] */
++    0x00,     /*  u8  if_iInterface; */
++
++    /* HID descriptor */
++    0x09,     /*  u8  bLength; */
++    0x21,     /*  u8  bDescriptorType; */
++    0x01, 0x10,       /*  u16 HID_class */
++    0x00,     /*  u8  country_code */
++    0x01,     /*  u8  num_descriptors */
++    0x22,     /*  u8  type; Report */
++    0x6e, 0x00,       /*  u16 len */
++
++    /* one endpoint (status change endpoint) */
++    0x07,     /*  u8  ep_bLength; */
++    0x05,     /*  u8  ep_bDescriptorType; Endpoint */
++    0x81,     /*  u8  ep_bEndpointAddress; IN Endpoint 1 */
++    0x03,     /*  u8  ep_bmAttributes; Interrupt */
++    0x08, 0x00,       /*  u16 ep_wMaxPacketSize; */
++    0x0a,     /*  u8  ep_bInterval; */
++};
++
++static void usb_mouse_event(void *opaque,
++                            int dx1, int dy1, int dz1, int buttons_state)
++{
++    USBWacomState *s = opaque;
++
++    s->dx += dx1;
++    s->dy += dy1;
++    s->dz += dz1;
++    s->buttons_state = buttons_state;
++}
++
++static void usb_wacom_event(void *opaque,
++                            int x, int y, int dz, int buttons_state)
++{
++    USBWacomState *s = opaque;
++
++    s->x = x;
++    s->y = y;
++    s->dz += dz;
++    s->buttons_state = buttons_state;
++}
++
++static inline int int_clamp(int val, int vmin, int vmax)
++{
++    if (val < vmin)
++        return vmin;
++    else if (val > vmax)
++        return vmax;
++    else
++        return val;
++}
++
++static int usb_mouse_poll(USBWacomState *s, uint8_t *buf, int len)
++{
++    int dx, dy, dz, b, l;
++
++    if (!s->mouse_grabbed) {
++        qemu_add_mouse_event_handler(usb_mouse_event, s, 1);
++        s->mouse_grabbed = 1;
++    }
++
++    dx = int_clamp(s->dx, -128, 127);
++    dy = int_clamp(s->dy, -128, 127);
++    dz = int_clamp(s->dz, -128, 127);
++
++    s->dx -= dx;
++    s->dy -= dy;
++    s->dz -= dz;
++
++    b = 0;
++    if (s->buttons_state & MOUSE_EVENT_LBUTTON)
++        b |= 0x01;
++    if (s->buttons_state & MOUSE_EVENT_RBUTTON)
++        b |= 0x02;
++    if (s->buttons_state & MOUSE_EVENT_MBUTTON)
++        b |= 0x04;
++
++    buf[0] = b;
++    buf[1] = dx;
++    buf[2] = dy;
++    l = 3;
++    if (len >= 4) {
++        buf[3] = dz;
++        l = 4;
++    }
++    return l;
++}
++
++static int usb_wacom_poll(USBWacomState *s, uint8_t *buf, int len)
++{
++    int b;
++
++    if (!s->mouse_grabbed) {
++        qemu_add_mouse_event_handler(usb_wacom_event, s, 1);
++        s->mouse_grabbed = 1;
++    }
++
++    b = 0;
++    if (s->buttons_state & MOUSE_EVENT_LBUTTON)
++        b |= 0x01;
++    if (s->buttons_state & MOUSE_EVENT_RBUTTON)
++        b |= 0x02;
++    if (s->buttons_state & MOUSE_EVENT_MBUTTON)
++        b |= 0x04;
++
++    if (len < 7)
++        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[5] = 0x40;
++        buf[6] = 0;
++    } else {
++        buf[5] = 0x00;
++        buf[6] = (unsigned char) -120;
++    }
++
++    return 7;
++}
++
++static void usb_wacom_handle_reset(USBDevice *dev)
++{
++    USBWacomState *s = (USBWacomState *) dev;
++
++    s->dx = 0;
++    s->dy = 0;
++    s->dz = 0;
++    s->x = 0;
++    s->y = 0;
++    s->buttons_state = 0;
++    s->mode = WACOM_MODE_HID;
++}
++
++static int usb_wacom_handle_control(USBDevice *dev, int request, int value,
++                                    int index, int length, uint8_t *data)
++{
++    USBWacomState *s = (USBWacomState *) dev;
++    int ret = 0;
++
++    switch (request) {
++    case DeviceRequest | USB_REQ_GET_STATUS:
++        data[0] = (1 << USB_DEVICE_SELF_POWERED) |
++            (dev->remote_wakeup << USB_DEVICE_REMOTE_WAKEUP);
++        data[1] = 0x00;
++        ret = 2;
++        break;
++    case DeviceOutRequest | USB_REQ_CLEAR_FEATURE:
++        if (value == USB_DEVICE_REMOTE_WAKEUP) {
++            dev->remote_wakeup = 0;
++        } else {
++            goto fail;
++        }
++        ret = 0;
++        break;
++    case DeviceOutRequest | USB_REQ_SET_FEATURE:
++        if (value == USB_DEVICE_REMOTE_WAKEUP) {
++            dev->remote_wakeup = 1;
++        } else {
++            goto fail;
++        }
++        ret = 0;
++        break;
++    case DeviceOutRequest | USB_REQ_SET_ADDRESS:
++        dev->addr = value;
++        ret = 0;
++        break;
++    case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
++        switch (value >> 8) {
++        case USB_DT_DEVICE:
++            memcpy(data, qemu_wacom_dev_descriptor, 
++                   sizeof(qemu_wacom_dev_descriptor));
++            ret = sizeof(qemu_wacom_dev_descriptor);
++            break;
++        case USB_DT_CONFIG:
++                  memcpy(data, qemu_wacom_config_descriptor, 
++                   sizeof(qemu_wacom_config_descriptor));
++            ret = sizeof(qemu_wacom_config_descriptor);
++            break;
++        case USB_DT_STRING:
++            switch (value & 0xff) {
++            case 0:
++                /* language ids */
++                data[0] = 4;
++                data[1] = 3;
++                data[2] = 0x09;
++                data[3] = 0x04;
++                ret = 4;
++                break;
++            case 1:
++                /* serial number */
++                ret = set_usb_string(data, "1");
++                break;
++            case 2:
++              ret = set_usb_string(data, "Wacom PenPartner");
++                break;
++            case 3:
++                /* vendor description */
++                ret = set_usb_string(data, "QEMU " QEMU_VERSION);
++                break;
++            case 4:
++                ret = set_usb_string(data, "Wacom Tablet");
++                break;
++            case 5:
++                ret = set_usb_string(data, "Endpoint1 Interrupt Pipe");
++                break;
++            default:
++                goto fail;
++            }
++            break;
++        default:
++            goto fail;
++        }
++        break;
++    case DeviceRequest | USB_REQ_GET_CONFIGURATION:
++        data[0] = 1;
++        ret = 1;
++        break;
++    case DeviceOutRequest | USB_REQ_SET_CONFIGURATION:
++        ret = 0;
++        break;
++    case DeviceRequest | USB_REQ_GET_INTERFACE:
++        data[0] = 0;
++        ret = 1;
++        break;
++    case DeviceOutRequest | USB_REQ_SET_INTERFACE:
++        ret = 0;
++        break;
++    case WACOM_SET_REPORT:
++        qemu_add_mouse_event_handler(NULL, NULL, 0);
++      s->mouse_grabbed = 0;
++        s->mode = data[0];
++        ret = 0;
++        break;
++    case WACOM_GET_REPORT:
++        data[0] = 0;
++        data[1] = s->mode;
++        ret = 2;
++        break;
++    /* USB HID requests */
++    case HID_GET_REPORT:
++        if (s->mode == WACOM_MODE_HID)
++            ret = usb_mouse_poll(s, data, length);
++        else if (s->mode == WACOM_MODE_WACOM)
++            ret = usb_wacom_poll(s, data, length);
++        break;
++    case HID_SET_IDLE:
++        ret = 0;
++        break;
++    default:
++    fail:
++        ret = USB_RET_STALL;
++        break;
++    }
++    return ret;
++}
++
++static int usb_wacom_handle_data(USBDevice *dev, USBPacket *p)
++{
++    USBWacomState *s = (USBWacomState *) dev;
++    int ret = 0;
++
++    switch (p->pid) {
++    case USB_TOKEN_IN:
++        if (p->devep == 1) {
++            if (s->mode == WACOM_MODE_HID)
++                ret = usb_mouse_poll(s, p->data, p->len);
++            else if (s->mode == WACOM_MODE_WACOM)
++                ret = usb_wacom_poll(s, p->data, p->len);
++            break;
++        }
++        /* Fall through.  */
++    case USB_TOKEN_OUT:
++    default:
++        ret = USB_RET_STALL;
++        break;
++    }
++    return ret;
++}
++
++static void usb_wacom_handle_destroy(USBDevice *dev)
++{
++    USBWacomState *s = (USBWacomState *) dev;
++
++    qemu_add_mouse_event_handler(NULL, NULL, 0);
++    qemu_free(s);
++}
++
++USBDevice *usb_wacom_init(void)
++{
++    USBWacomState *s;
++
++    s = qemu_mallocz(sizeof(USBWacomState));
++    if (!s)
++        return NULL;
++    s->dev.speed = USB_SPEED_FULL;
++    s->dev.handle_packet = usb_generic_handle_packet;
++
++    s->dev.handle_reset = usb_wacom_handle_reset;
++    s->dev.handle_control = usb_wacom_handle_control;
++    s->dev.handle_data = usb_wacom_handle_data;
++    s->dev.handle_destroy = usb_wacom_handle_destroy;
++
++    pstrcpy(s->dev.devname, sizeof(s->dev.devname),
++            "QEMU PenPartner Tablet");
++
++    return (USBDevice *) s;
++}
+diff -pNaur qemu-cvs-ts-orig/hw/usb.h qemu-cvs-ts/hw/usb.h
+--- qemu-cvs-ts-orig/hw/usb.h  2006-08-12 03:04:27.000000000 +0200
++++ qemu-cvs-ts/hw/usb.h       2006-09-21 01:40:40.000000000 +0200
+@@ -218,3 +218,6 @@ USBDevice *usb_tablet_init(void);
+ /* usb-msd.c */
+ USBDevice *usb_msd_init(const char *filename);
++
++/* usb-wacom.c */
++USBDevice *usb_wacom_init(void);
+diff -pNaur qemu-cvs-ts-orig/vl.c qemu-cvs-ts/vl.c
+--- qemu-cvs-ts-orig/vl.c      2006-09-10 16:39:54.000000000 +0200
++++ qemu-cvs-ts/vl.c   2006-09-21 01:45:16.000000000 +0200
+@@ -3765,6 +3765,8 @@ static int usb_device_add(const char *de
+       dev = usb_tablet_init();
+     } else if (strstart(devname, "disk:", &p)) {
+         dev = usb_msd_init(p);
++    } else if (!strcmp(devname, "wacom-tablet")) {
++        dev = usb_wacom_init();
+     } else {
+         return -1;
+     }
+diff -pNaur qemu-cvs-ts-orig/Makefile.target qemu-cvs-ts/Makefile.target
+--- qemu-cvs-ts-orig/Makefile.target   2006-09-18 03:15:29.000000000 +0200
++++ qemu-cvs-ts/Makefile.target        2006-09-21 02:32:19.000000000 +0200
+@@ -330,6 +330,7 @@ VL_OBJS+= scsi-disk.o cdrom.o lsi53c895a
+ # USB layer
+ VL_OBJS+= usb.o usb-hub.o usb-linux.o usb-hid.o usb-ohci.o usb-msd.o
++VL_OBJS+= usb-wacom.o
+ # PCI network cards
+ VL_OBJS+= ne2000.o rtl8139.o pcnet.o
diff --git a/packages/qemu/files/qemu-x-no-sdl.patch b/packages/qemu/files/qemu-x-no-sdl.patch
new file mode 100644 (file)
index 0000000..eb00d98
--- /dev/null
@@ -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);
++}