diff options
| -rw-r--r-- | block/raw-win32.c | 6 | ||||
| -rw-r--r-- | block/rbd.c | 3 | ||||
| -rw-r--r-- | include/glib-compat.h | 27 | ||||
| -rw-r--r-- | include/qemu-common.h | 2 | ||||
| -rw-r--r-- | pc-bios/efi-e1000.rom | bin | 174080 -> 173568 bytes | |||
| -rw-r--r-- | pc-bios/efi-eepro100.rom | bin | 175104 -> 174592 bytes | |||
| -rw-r--r-- | pc-bios/efi-ne2k_pci.rom | bin | 173568 -> 173056 bytes | |||
| -rw-r--r-- | pc-bios/efi-pcnet.rom | bin | 173568 -> 173056 bytes | |||
| -rw-r--r-- | pc-bios/efi-rtl8139.rom | bin | 177152 -> 176640 bytes | |||
| -rw-r--r-- | pc-bios/efi-virtio.rom | bin | 171008 -> 171008 bytes | |||
| -rw-r--r-- | roms/Makefile | 7 | ||||
| -rw-r--r-- | roms/config.ipxe.general.h | 2 | ||||
| -rw-r--r-- | ui/gtk.c | 53 |
13 files changed, 92 insertions, 8 deletions
diff --git a/block/raw-win32.c b/block/raw-win32.c index 18e0068b26..ece2f1a809 100644 --- a/block/raw-win32.c +++ b/block/raw-win32.c @@ -221,7 +221,8 @@ static void raw_parse_flags(int flags, int *access_flags, DWORD *overlapped) } } -static int raw_open(BlockDriverState *bs, const char *filename, int flags) +static int raw_open(BlockDriverState *bs, const char *filename, + QDict *options, int flags) { BDRVRawState *s = bs->opaque; int access_flags; @@ -494,7 +495,8 @@ static int hdev_probe_device(const char *filename) return 0; } -static int hdev_open(BlockDriverState *bs, const char *filename, int flags) +static int hdev_open(BlockDriverState *bs, const char *filename, + QDict *options, int flags) { BDRVRawState *s = bs->opaque; int access_flags, create_flags; diff --git a/block/rbd.c b/block/rbd.c index 8cd10a7b59..1a8ea6d492 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -441,7 +441,8 @@ static int qemu_rbd_aio_flush_cb(void *opaque) return (s->qemu_aio_count > 0); } -static int qemu_rbd_open(BlockDriverState *bs, const char *filename, int flags) +static int qemu_rbd_open(BlockDriverState *bs, const char *filename, + QDict *options, int flags) { BDRVRBDState *s = bs->opaque; char pool[RBD_MAX_POOL_NAME_SIZE]; diff --git a/include/glib-compat.h b/include/glib-compat.h new file mode 100644 index 0000000000..8aa77afd62 --- /dev/null +++ b/include/glib-compat.h @@ -0,0 +1,27 @@ +/* + * GLIB Compatibility Functions + * + * Copyright IBM, Corp. 2013 + * + * Authors: + * Anthony Liguori <aliguori@us.ibm.com> + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + * + */ + +#ifndef QEMU_GLIB_COMPAT_H +#define QEMU_GLIB_COMPAT_H + +#include <glib.h> + +#if !GLIB_CHECK_VERSION(2, 14, 0) +static inline guint g_timeout_add_seconds(guint interval, GSourceFunc function, + gpointer data) +{ + return g_timeout_add(interval * 1000, function, data); +} +#endif + +#endif diff --git a/include/qemu-common.h b/include/qemu-common.h index 7754ee2fcc..2371132c11 100644 --- a/include/qemu-common.h +++ b/include/qemu-common.h @@ -40,7 +40,7 @@ #include <sys/time.h> #include <assert.h> #include <signal.h> -#include <glib.h> +#include "glib-compat.h" #ifdef _WIN32 #include "sysemu/os-win32.h" diff --git a/pc-bios/efi-e1000.rom b/pc-bios/efi-e1000.rom index 7dfcea364a..21b880afc2 100644 --- a/pc-bios/efi-e1000.rom +++ b/pc-bios/efi-e1000.rom Binary files differdiff --git a/pc-bios/efi-eepro100.rom b/pc-bios/efi-eepro100.rom index e5134a2fe5..1799c38a83 100644 --- a/pc-bios/efi-eepro100.rom +++ b/pc-bios/efi-eepro100.rom Binary files differdiff --git a/pc-bios/efi-ne2k_pci.rom b/pc-bios/efi-ne2k_pci.rom index 8aa11c370d..5d1b38b9a2 100644 --- a/pc-bios/efi-ne2k_pci.rom +++ b/pc-bios/efi-ne2k_pci.rom Binary files differdiff --git a/pc-bios/efi-pcnet.rom b/pc-bios/efi-pcnet.rom index 200b5d298e..79fa7a9b1d 100644 --- a/pc-bios/efi-pcnet.rom +++ b/pc-bios/efi-pcnet.rom Binary files differdiff --git a/pc-bios/efi-rtl8139.rom b/pc-bios/efi-rtl8139.rom index 8bcd3c79c6..0b78f1a386 100644 --- a/pc-bios/efi-rtl8139.rom +++ b/pc-bios/efi-rtl8139.rom Binary files differdiff --git a/pc-bios/efi-virtio.rom b/pc-bios/efi-virtio.rom index 25c5c6998d..e6b2bf7242 100644 --- a/pc-bios/efi-virtio.rom +++ b/pc-bios/efi-virtio.rom Binary files differdiff --git a/roms/Makefile b/roms/Makefile index 3dc560921d..7a228aed8f 100644 --- a/roms/Makefile +++ b/roms/Makefile @@ -57,13 +57,13 @@ lgplvgabios-%: pxerom: $(patsubst %,pxe-rom-%,$(pxerom_variants)) -pxe-rom-%: +pxe-rom-%: ipxe/src/config/local/general.h make -C ipxe/src bin/$(VID)$(DID).rom cp ipxe/src/bin/$(VID)$(DID).rom ../pc-bios/pxe-$*.rom efirom: $(patsubst %,efi-rom-%,$(pxerom_variants)) -efi-rom-%: +efi-rom-%: ipxe/src/config/local/general.h make -C ipxe/src bin/$(VID)$(DID).rom make -C ipxe/src bin-i386-efi/$(VID)$(DID).efidrv make -C ipxe/src bin-x86_64-efi/$(VID)$(DID).efidrv @@ -72,3 +72,6 @@ efi-rom-%: -ec ipxe/src/bin-i386-efi/$(VID)$(DID).efidrv \ -ec ipxe/src/bin-x86_64-efi/$(VID)$(DID).efidrv \ -o ../pc-bios/efi-$*.rom + +ipxe/src/config/local/%: config.ipxe.% + cp $< $@ diff --git a/roms/config.ipxe.general.h b/roms/config.ipxe.general.h new file mode 100644 index 0000000000..b3fce5326a --- /dev/null +++ b/roms/config.ipxe.general.h @@ -0,0 +1,2 @@ +#undef BANNER_TIMEOUT +#define BANNER_TIMEOUT 0 diff --git a/ui/gtk.c b/ui/gtk.c index 305940d0ba..1edfaca909 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -98,6 +98,11 @@ static inline void gdk_drawable_get_size(GdkWindow *w, gint *ww, gint *wh) #define GDK_KEY_minus GDK_minus #endif +static const int modifier_keycode[] = { + /* shift, control, alt keys, meta keys, both left & right */ + 0x2a, 0x36, 0x1d, 0x9d, 0x38, 0xb8, 0xdb, 0xdd, +}; + typedef struct VirtualConsole { GtkWidget *menu_item; @@ -157,6 +162,8 @@ typedef struct GtkDisplayState gboolean free_scale; bool external_pause_update; + + bool modifier_pressed[ARRAY_SIZE(modifier_keycode)]; } GtkDisplayState; static GtkDisplayState *global_state; @@ -263,6 +270,26 @@ static void gd_update_full_redraw(GtkDisplayState *s) gtk_widget_queue_draw_area(s->drawing_area, 0, 0, ww, wh); } +static void gtk_release_modifiers(GtkDisplayState *s) +{ + int i, keycode; + + if (!gd_on_vga(s)) { + return; + } + for (i = 0; i < ARRAY_SIZE(modifier_keycode); i++) { + keycode = modifier_keycode[i]; + if (!s->modifier_pressed[i]) { + continue; + } + if (keycode & SCANCODE_GREY) { + kbd_put_keycode(SCANCODE_EMUL0); + } + kbd_put_keycode(keycode | SCANCODE_UP); + s->modifier_pressed[i] = false; + } +} + /** DisplayState Callbacks **/ static void gd_update(DisplayChangeListener *dcl, @@ -393,8 +420,9 @@ static gboolean gd_window_key_event(GtkWidget *widget, GdkEventKey *key, void *o if (!handled && propagate_accel) { handled = gtk_window_activate_key(GTK_WINDOW(widget), key); } - - if (!handled) { + if (handled) { + gtk_release_modifiers(s); + } else { handled = gtk_window_propagate_key_event(GTK_WINDOW(widget), key); } @@ -624,8 +652,10 @@ static gboolean gd_button_event(GtkWidget *widget, GdkEventButton *button, static gboolean gd_key_event(GtkWidget *widget, GdkEventKey *key, void *opaque) { + GtkDisplayState *s = opaque; int gdk_keycode; int qemu_keycode; + int i; gdk_keycode = key->hardware_keycode; @@ -647,6 +677,12 @@ static gboolean gd_key_event(GtkWidget *widget, GdkEventKey *key, void *opaque) gdk_keycode, qemu_keycode, (key->type == GDK_KEY_PRESS) ? "down" : "up"); + for (i = 0; i < ARRAY_SIZE(modifier_keycode); i++) { + if (qemu_keycode == modifier_keycode[i]) { + s->modifier_pressed[i] = (key->type == GDK_KEY_PRESS); + } + } + if (qemu_keycode & SCANCODE_GREY) { kbd_put_keycode(SCANCODE_EMUL0); } @@ -702,6 +738,7 @@ static void gd_menu_switch_vc(GtkMenuItem *item, void *opaque) } else { int i; + gtk_release_modifiers(s); for (i = 0; i < s->nb_vcs; i++) { if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(s->vc[i].menu_item))) { gtk_notebook_set_current_page(GTK_NOTEBOOK(s->notebook), i + 1); @@ -1002,6 +1039,16 @@ static gboolean gd_leave_event(GtkWidget *widget, GdkEventCrossing *crossing, gp return TRUE; } +static gboolean gd_focus_out_event(GtkWidget *widget, + GdkEventCrossing *crossing, gpointer data) +{ + GtkDisplayState *s = data; + + gtk_release_modifiers(s); + + return TRUE; +} + /** Virtual Console Callbacks **/ static int gd_vc_chr_write(CharDriverState *chr, const uint8_t *buf, int len) @@ -1185,6 +1232,8 @@ static void gd_connect_signals(GtkDisplayState *s) G_CALLBACK(gd_enter_event), s); g_signal_connect(s->drawing_area, "leave-notify-event", G_CALLBACK(gd_leave_event), s); + g_signal_connect(s->drawing_area, "focus-out-event", + G_CALLBACK(gd_focus_out_event), s); } static void gd_create_menus(GtkDisplayState *s) |