From 4eaa407b5628e76a45949b86849816f7ee2294f9 Mon Sep 17 00:00:00 2001 From: Michael Lauer Date: Fri, 20 Oct 2006 12:52:02 +0000 Subject: qemu: add missing files --- packages/qemu/files/compiler.patch | 10 + packages/qemu/files/nodocs_cvs.patch | 44 ++ packages/qemu/files/qemu-pci-irq-sharing.patch | 52 ++ packages/qemu/files/qemu-sdl-cursor.patch | 13 + packages/qemu/files/qemu-usb-wacom-0.8.2.patch | 445 +++++++++++++++ packages/qemu/files/qemu-usb-wacom-buttons.patch | 23 + packages/qemu/files/qemu-usb-wacom-pressure.patch | 28 + packages/qemu/files/qemu-usb-wacom.patch | 444 +++++++++++++++ packages/qemu/files/qemu-x-no-sdl.patch | 630 ++++++++++++++++++++++ 9 files changed, 1689 insertions(+) create mode 100644 packages/qemu/files/compiler.patch create mode 100644 packages/qemu/files/nodocs_cvs.patch create mode 100644 packages/qemu/files/qemu-pci-irq-sharing.patch create mode 100644 packages/qemu/files/qemu-sdl-cursor.patch create mode 100644 packages/qemu/files/qemu-usb-wacom-0.8.2.patch create mode 100644 packages/qemu/files/qemu-usb-wacom-buttons.patch create mode 100644 packages/qemu/files/qemu-usb-wacom-pressure.patch create mode 100644 packages/qemu/files/qemu-usb-wacom.patch create mode 100644 packages/qemu/files/qemu-x-no-sdl.patch (limited to 'packages/qemu') diff --git a/packages/qemu/files/compiler.patch b/packages/qemu/files/compiler.patch new file mode 100644 index 0000000000..dad18b3a61 --- /dev/null +++ b/packages/qemu/files/compiler.patch @@ -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 + #include +-#include + #include + #include + diff --git a/packages/qemu/files/nodocs_cvs.patch b/packages/qemu/files/nodocs_cvs.patch new file mode 100644 index 0000000000..b52d860fb0 --- /dev/null +++ b/packages/qemu/files/nodocs_cvs.patch @@ -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 index 0000000000..c47e89895f --- /dev/null +++ b/packages/qemu/files/qemu-pci-irq-sharing.patch @@ -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 index 0000000000..bd6a51a1f5 --- /dev/null +++ b/packages/qemu/files/qemu-sdl-cursor.patch @@ -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 index 0000000000..33a6db3f18 --- /dev/null +++ b/packages/qemu/files/qemu-usb-wacom-0.8.2.patch @@ -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 ++ * ++ * 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 index 0000000000..ee24c15780 --- /dev/null +++ b/packages/qemu/files/qemu-usb-wacom-buttons.patch @@ -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 index 0000000000..668d50d5f2 --- /dev/null +++ b/packages/qemu/files/qemu-usb-wacom-pressure.patch @@ -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 index 0000000000..c1c39eccaf --- /dev/null +++ b/packages/qemu/files/qemu-usb-wacom.patch @@ -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 ++ * ++ * 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 index 0000000000..eb00d9806b --- /dev/null +++ b/packages/qemu/files/qemu-x-no-sdl.patch @@ -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 ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++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); ++} -- cgit 1.2.3-korg