SOURCES: qemu-nosdlgui.patch (NEW) - X11 gui patch

pascalek pascalek at pld-linux.org
Thu Jul 7 02:37:25 CEST 2005


Author: pascalek                     Date: Thu Jul  7 00:37:25 2005 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- X11 gui patch

---- Files affected:
SOURCES:
   qemu-nosdlgui.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/qemu-nosdlgui.patch
diff -u /dev/null SOURCES/qemu-nosdlgui.patch:1.1
--- /dev/null	Thu Jul  7 02:37:25 2005
+++ SOURCES/qemu-nosdlgui.patch	Thu Jul  7 02:37:20 2005
@@ -0,0 +1,1116 @@
+diff -Nur qemu-0.7.0.orig/Makefile.target qemu-0.7.0.chng/Makefile.target
+--- qemu-0.7.0.orig/Makefile.target	2005-07-06 23:38:02.000000000 +0000
++++ qemu-0.7.0.chng/Makefile.target	2005-07-06 23:42:48.000000000 +0000
+@@ -392,7 +392,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) $(COCOA_LIBS) $(VL_LIBS) -L/usr/X11R6/lib -lX11 -lpthread
+ 
+ cocoa.o: cocoa.m
+ 	$(CC) $(CFLAGS) $(DEFINES) -c -o $@ $<
+diff -Nur qemu-0.7.0.orig/sdl.c qemu-0.7.0.chng/sdl.c
+--- qemu-0.7.0.orig/sdl.c	2005-04-27 20:52:05.000000000 +0000
++++ qemu-0.7.0.chng/sdl.c	2005-07-06 22:28:55.000000000 +0000
+@@ -1,507 +1,614 @@
+ /*
+- * QEMU SDL display driver
+- * 
+- * Copyright (c) 2003 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:
++ * Xlib interface for QEMU System Emulator
+  *
+- * 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"
+-
+-#include <SDL.h>
++ * Copyright (c) 2004 Vladimit Oleynik <dzo at simtreas.ru>
++ * Used ideas from Bochs, SDL, PCEmu.
++*/
++
++#include <X11/Xlib.h>
++#include <X11/Xutil.h>
++#include <X11/keysym.h>
++
++/* hack, special for qemu */
++#define X_display_init sdl_display_init
++
++#define icon_width 40
++#define icon_height 32
++static unsigned char icon_bits[] = {
++  0x3e, 0x26, 0x00, 0x00, 0x00,
++  0x24, 0x04, 0x01, 0x00, 0x00,
++  0x04, 0x04, 0x01, 0x00, 0x00,
++  0x14, 0xb7, 0xb3, 0x06, 0x00,
++  0x9c, 0x24, 0x49, 0x05, 0x00,
++  0x94, 0x24, 0x49, 0x01, 0x00,
++  0x84, 0x24, 0x49, 0x01, 0x00,
++  0xa4, 0x24, 0x49, 0x01, 0x00,
++  0x3e, 0x27, 0x32, 0x03, 0x00,
++  0x00, 0x00, 0x00, 0x00, 0x00,
++  0x00, 0x00, 0x00, 0x00, 0x00,
++  0x00, 0x00, 0x00, 0x00, 0x00,
++  0x08, 0x00, 0x77, 0x00, 0x00,
++  0x04, 0x00, 0x22, 0x00, 0x00,
++  0x04, 0x00, 0x14, 0x00, 0x00,
++  0xce, 0x1a, 0x14, 0x00, 0x00,
++  0x24, 0x15, 0x08, 0x00, 0x00,
++  0x24, 0x05, 0x14, 0x00, 0x00,
++  0x24, 0x05, 0x14, 0x00, 0x00,
++  0x24, 0x05, 0x22, 0x00, 0x00,
++  0xcc, 0x0c, 0x07, 0x00, 0x00,
++  0x00, 0x00, 0x00, 0x00, 0x00,
++  0x00, 0x00, 0x00, 0x00, 0x00,
++  0x00, 0x00, 0x00, 0x00, 0x00,
++  0x04, 0x00, 0x01, 0x00, 0x00,
++  0x04, 0x00, 0x01, 0x00, 0x00,
++  0xce, 0xb6, 0xb3, 0xb6, 0x0d,
++  0x24, 0x15, 0x49, 0x49, 0x09,
++  0xe4, 0x09, 0x79, 0x49, 0x09,
++  0x24, 0x08, 0x09, 0x49, 0x09,
++  0x24, 0x15, 0x49, 0x49, 0x09,
++  0xc8, 0x36, 0x32, 0x49, 0x0e,
++};
+ 
+-#ifndef _WIN32
+-#include <signal.h>
+-#endif
++#include "vl.h"
+ 
+-static SDL_Surface *screen;
+-static int gui_grab; /* if true, all keyboard/mouse events are grabbed */
+ static int last_vm_running;
+-static int gui_saved_grab;
+-static int gui_fullscreen;
+-static int gui_key_modifier_pressed;
+-static int gui_keysym;
+-static int gui_fullscreen_initial_grab;
+-static int gui_grab_code = KMOD_LALT | KMOD_LCTRL;
+-static uint8_t modifiers_state[256];
+-
+-static void sdl_update(DisplayState *ds, int x, int y, int w, int h)
+-{
+-    //    printf("updating x=%d y=%d w=%d h=%d\n", x, y, w, h);
+-    SDL_UpdateRect(screen, x, y, w, h);
+-}
+-
+-static void sdl_resize(DisplayState *ds, int w, int h)
+-{
+-    int flags;
+-
+-    //    printf("resizing to %d %d\n", w, h);
+ 
+-    flags = SDL_HWSURFACE|SDL_ASYNCBLIT|SDL_HWACCEL;
+-    flags |= SDL_RESIZABLE;
+-    if (gui_fullscreen)
+-        flags |= SDL_FULLSCREEN;
+-    screen = SDL_SetVideoMode(w, h, 0, flags);
+-    if (!screen) {
+-        fprintf(stderr, "Could not open SDL display\n");
+-        exit(1);
++static Display *qx_display;
++static int q_x_screen_num;
++static Window win;
++static GC gc;
++static XImage *ximage = NULL;
++static int     default_depth;
++static Visual  *default_visual;
++static int width, height;
++
++static void x_update(DisplayState *ds, int x, int y, int w, int h)
++{
++    XPutImage(qx_display, win, gc, ximage, x, y, x, y, w, h);
++    XFlush(qx_display);
++}
++
++static int prev_x, prev_y;
++static int current_x, current_y;
++
++/* Move the cursor to a center window place */
++static void qXWarpPointer(void)
++{
++	int x = width/2;
++	int y = height/2;
++
++	prev_x = current_x = x;
++	prev_y = current_y = y;
++	XWarpPointer(qx_display, None, win, 0, 0, 0, 0, x, y);
++}
++
++static void x_resize(DisplayState *ds, int w, int h)
++{
++    XSizeHints hints;
++    long supplied_return;
++
++    if ( XGetWMNormalHints(qx_display, win, &hints, &supplied_return) &&
++	 supplied_return & PMaxSize ) {
++      hints.max_width = hints.min_width = w;
++      hints.max_height = hints.min_height = h;
++      XSetWMNormalHints(qx_display, win, &hints);
++    }
++    if(ximage) {
++	XDestroyImage(ximage);
++//        free(ds->data);
++	XResizeWindow(qx_display, win, w, h);
++    }
++    ximage = XCreateImage(qx_display, default_visual,
++	     default_depth,          // depth of image (bitplanes)
++	     ZPixmap,
++	     0,                      // offset
++	     NULL,                   // malloc() space after
++	     w, h,                   // x & y size of image
++	     32,                     // # bits of padding
++	     0 );                    // bytes_per_line, let X11 calculate
++    if (!ximage) {
++	fprintf(stderr, "Could not XCreateImage()\n");
++	exit(1);
++    }
++    width = ds->width = w;
++    height = ds->height = h;
++    ds->depth = ximage->bits_per_pixel;
++    ds->linesize = ximage->bytes_per_line;
++    ds->data = (char *) malloc( (size_t) (ximage->bytes_per_line * h) );
++    if (!ds->data) {
++	fprintf(stderr, "Could not malloc Image data\n");
++	exit(1);
++    }
++    ximage->data = ds->data;
++    qXWarpPointer();
++    XFlush(qx_display);
++}
++
++static int gui_grab;
++
++static void x_SetCaption(void)
++{
++	char *title, *icon;
++	XTextProperty titleprop, iconprop;
++
++	title = icon = "QEMU";
++	if (!vm_running && !gui_grab)
++		title = "QEMU [Stopped]";
++	if (vm_running && gui_grab)
++		title = "QEMU - Press Ctrl-Shift to exit grab";
++	if (!vm_running && gui_grab)
++		title = "QEMU [Stopped] - Press Ctrl-Shift to exit grab";
++
++	XStringListToTextProperty(&title, 1, &titleprop);
++	XSetWMName(qx_display, win, &titleprop);
++	XFree(titleprop.value);
++
++	XStringListToTextProperty(&icon, 1, &iconprop);
++	XSetWMIconName(qx_display, win, &iconprop);
++	XFree(iconprop.value);
++	XSync(qx_display, /* no discard */ 0);
++}
++
++static void trigger_mouse_grab(void)
++{
++  gui_grab ^= 1;
++  if (gui_grab) {
++      /* disable cursor */
++      static Cursor cursor;
++      static int cursor_created;
++
++#define shape_width 16
++#define shape_height 16
++#define mask_width 16
++#define mask_height 16
++
++      static unsigned int shape_bits[(16*16)/32];
++      static unsigned int mask_bits[(16*16)/32];
++
++      if (!cursor_created) {
++	    Pixmap shape, mask;
++	    XColor white, black;
++	    Colormap default_cmap;
++
++	    default_cmap = DefaultColormap(qx_display, q_x_screen_num);
++
++	    shape = XCreatePixmapFromBitmapData(qx_display,
++						RootWindow(qx_display,q_x_screen_num),
++						(char*)shape_bits,
++						shape_width, shape_height,
++						1, 0, 1);
++	    mask =  XCreatePixmapFromBitmapData(qx_display,
++						RootWindow(qx_display,q_x_screen_num),
++						(char*)mask_bits,
++						mask_width, mask_height,
++						1, 0, 1);
++	    XParseColor(qx_display, default_cmap, "black", &black);
++	    XParseColor(qx_display, default_cmap, "white", &white);
++	    cursor = XCreatePixmapCursor(qx_display, shape, mask,
++					 &white, &black, 1, 1);
++	    cursor_created = 1;
++      }
++      XDefineCursor(qx_display, win, cursor);
++
++      /* grab pointer and keyboard */
++
++//    if ( flags & FULLSCREEN ) {
++//      /* Unbind the mouse from the fullscreen window */
++//      XUngrabPointer(qx_display, CurrentTime);
++//    }
++      /* Try to grab the mouse */
++      while ( 1 ) {
++	int result = XGrabPointer(qx_display, win, True, 0,
++					GrabModeAsync, GrabModeAsync,
++					win, None, CurrentTime);
++	if (result == GrabSuccess)
++		break;
++      }
++      /* Now grab the keyboard */
++      XGrabKeyboard(qx_display, win, True,
++			GrabModeAsync, GrabModeAsync, CurrentTime);
++
++      /* Raise the window if we grab the mouse */
++//    if ( !(flags & FULLSCREEN) )
++	XRaiseWindow(qx_display, win);
++      qXWarpPointer();
++  } else {
++    /* enable cursor */
++    XUndefineCursor(qx_display, win);
++    /* ungrab pointer and keyboard */
++    XUngrabPointer(qx_display, CurrentTime);
++    XUngrabKeyboard(qx_display, CurrentTime);
++  }
++  x_SetCaption();
++}
++
++static unsigned mouse_button_state;
++
++static void send_keyboard_mouse_status(void)
++{
++    int dx, dy;
++
++    dx = current_x - prev_x;
++    dy = -(current_y - prev_y);
++    kbd_mouse_event(dx, -dy, 0, mouse_button_state);
++    if(current_x <= 1 || current_x >= (width-1) || current_y <= 1 || current_y >= (height-1)) {
++	qXWarpPointer();
++    } else {
++	prev_x = current_x;
++	prev_y = current_y;
+     }
+-    ds->data = screen->pixels;
+-    ds->linesize = screen->pitch;
+-    ds->depth = screen->format->BitsPerPixel;
+-    ds->width = w;
+-    ds->height = h;
+ }
+ 
+-/* generic keyboard conversion */
+-
+-#include "sdl_keysym.h"
+-#include "keymaps.c"
+-
+-static kbd_layout_t *kbd_layout = NULL;
+-
+-static uint8_t sdl_keyevent_to_keycode_generic(const SDL_KeyboardEvent *ev)
++static const unsigned char scan_table1[] =
+ {
+-    int keysym;
+-    /* workaround for X11+SDL bug with AltGR */
+-    keysym = ev->keysym.sym;
+-    if (keysym == 0 && ev->keysym.scancode == 113)
+-        keysym = SDLK_MODE;
+-    return keysym2scancode(kbd_layout, keysym);
+-}
+-
+-/* specific keyboard conversions from scan codes */
+-
+-#if defined(_WIN32)
+-
+-static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev)
+-{
+-    return ev->keysym.scancode;
+-}
+-
++    0x39, 0x02,
++#ifdef KBUK             /* double quotes, hash symbol */
++    0x03, 0x2b,
+ #else
+-
+-static const uint8_t x_keycode_to_pc_keycode[61] = {
+-   0xc7,      /*  97  Home   */
+-   0xc8,      /*  98  Up     */
+-   0xc9,      /*  99  PgUp   */
+-   0xcb,      /* 100  Left   */
+-   0x4c,        /* 101  KP-5   */
+-   0xcd,      /* 102  Right  */
+-   0xcf,      /* 103  End    */
+-   0xd0,      /* 104  Down   */
+-   0xd1,      /* 105  PgDn   */
+-   0xd2,      /* 106  Ins    */
+-   0xd3,      /* 107  Del    */
+-   0x9c,      /* 108  Enter  */
+-   0x9d,      /* 109  Ctrl-R */
+-   0x0,       /* 110  Pause  */
+-   0xb7,      /* 111  Print  */
+-   0xb5,      /* 112  Divide */
+-   0xb8,      /* 113  Alt-R  */
+-   0xc6,      /* 114  Break  */   
+-   0x0,         /* 115 */
+-   0x0,         /* 116 */
+-   0x0,         /* 117 */
+-   0x0,         /* 118 */
+-   0x0,         /* 119 */
+-   0x70,         /* 120 Hiragana_Katakana */
+-   0x0,         /* 121 */
+-   0x0,         /* 122 */
+-   0x73,         /* 123 backslash */
+-   0x0,         /* 124 */
+-   0x0,         /* 125 */
+-   0x0,         /* 126 */
+-   0x0,         /* 127 */
+-   0x0,         /* 128 */
+-   0x79,         /* 129 Henkan */
+-   0x0,         /* 130 */
+-   0x7b,         /* 131 Muhenkan */
+-   0x0,         /* 132 */
+-   0x7d,         /* 133 Yen */
+-   0x0,         /* 134 */
+-   0x0,         /* 135 */
+-   0x47,         /* 136 KP_7 */
+-   0x48,         /* 137 KP_8 */
+-   0x49,         /* 138 KP_9 */
+-   0x4b,         /* 139 KP_4 */
+-   0x4c,         /* 140 KP_5 */
+-   0x4d,         /* 141 KP_6 */
+-   0x4f,         /* 142 KP_1 */
+-   0x50,         /* 143 KP_2 */
+-   0x51,         /* 144 KP_3 */
+-   0x52,         /* 145 KP_0 */
+-   0x53,         /* 146 KP_. */
+-   0x47,         /* 147 KP_HOME */
+-   0x48,         /* 148 KP_UP */
+-   0x49,         /* 149 KP_PgUp */
+-   0x4b,         /* 150 KP_Left */
+-   0x4c,         /* 151 KP_ */
+-   0x4d,         /* 152 KP_Right */
+-   0x4f,         /* 153 KP_End */
+-   0x50,         /* 154 KP_Down */
+-   0x51,         /* 155 KP_PgDn */
+-   0x52,         /* 156 KP_Ins */
+-   0x53,         /* 157 KP_Del */
+-};
+-
+-static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev)
+-{
+-    int keycode;
+-
+-    keycode = ev->keysym.scancode;
+-
+-    if (keycode < 9) {
+-        keycode = 0;
+-    } else if (keycode < 97) {
+-        keycode -= 8; /* just an offset */
+-    } else if (keycode < 158) {
+-        /* use conversion table */
+-        keycode = x_keycode_to_pc_keycode[keycode - 97];
+-    } else {
+-        keycode = 0;
+-    }
+-    return keycode;
+-}
+-
++    0x28, 0x04,
++#endif
++    0x05, 0x06, 0x08, 0x28,
++    0x0a, 0x0b, 0x09, 0x0d, 0x33, 0x0c, 0x34, 0x35,
++    0x0b, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
++    0x09, 0x0a, 0x27, 0x27, 0x33, 0x0d, 0x34, 0x35,
++#ifdef KBUK             /* at symbol */
++    0x28,
++#else
++    0x03,
++#endif
++    0x1e, 0x30, 0x2e, 0x20, 0x12, 0x21, 0x22,
++    0x23, 0x17, 0x24, 0x25, 0x26, 0x32, 0x31, 0x18,
++    0x19, 0x10, 0x13, 0x1f, 0x14, 0x16, 0x2f, 0x11,
++    0x2d, 0x15, 0x2c, 0x1a,
++#ifdef KBUK             /* backslash */
++    0x56,
++#else
++    0x2b,
++#endif
++    0x1b, 0x07, 0x0c,
++    0x29, 0x1e, 0x30, 0x2e, 0x20, 0x12, 0x21, 0x22,
++    0x23, 0x17, 0x24, 0x25, 0x26, 0x32, 0x31, 0x18,
++    0x19, 0x10, 0x13, 0x1f, 0x14, 0x16, 0x2f, 0x11,
++    0x2d, 0x15, 0x2c, 0x1a,
++#ifdef KBUK             /* vertical bar */
++    0x56,
++#else
++    0x2b,
+ #endif
+ 
+-static void reset_keys(void)
+-{
+-    int i;
+-    for(i = 0; i < 256; i++) {
+-        if (modifiers_state[i]) {
+-            if (i & 0x80)
+-                kbd_put_keycode(0xe0);
+-            kbd_put_keycode(i | 0x80);
+-            modifiers_state[i] = 0;
+-        }
+-    }
+-}
+-
+-static void sdl_process_key(SDL_KeyboardEvent *ev)
+-{
+-    int keycode, v;
+-
+-    if (ev->keysym.sym == SDLK_PAUSE) {
+-        /* specific case */
+-        v = 0;
+-        if (ev->type == SDL_KEYUP)
+-            v |= 0x80;
+-        kbd_put_keycode(0xe1);
+-        kbd_put_keycode(0x1d | v);
+-        kbd_put_keycode(0x45 | v);
+-        return;
+-    }
+-
+-    if (kbd_layout) {
+-        keycode = sdl_keyevent_to_keycode_generic(ev);
+-    } else {
+-        keycode = sdl_keyevent_to_keycode(ev);
+-    }
+-
+-    switch(keycode) {
+-    case 0x00:
+-        /* sent when leaving window: reset the modifiers state */
+-        reset_keys();
+-        return;
+-    case 0x2a:                          /* Left Shift */
+-    case 0x36:                          /* Right Shift */
+-    case 0x1d:                          /* Left CTRL */
+-    case 0x9d:                          /* Right CTRL */
+-    case 0x38:                          /* Left ALT */
+-    case 0xb8:                         /* Right ALT */
+-        if (ev->type == SDL_KEYUP)
+-            modifiers_state[keycode] = 0;
+-        else
+-            modifiers_state[keycode] = 1;
+-        break;
+-    case 0x45: /* num lock */
+-    case 0x3a: /* caps lock */
+-        /* SDL does not send the key up event, so we generate it */
+-        kbd_put_keycode(keycode);
+-        kbd_put_keycode(keycode | 0x80);
+-        return;
+-    }
+-
+-    /* now send the key code */
+-    if (keycode & 0x80)
+-        kbd_put_keycode(0xe0);
+-    if (ev->type == SDL_KEYUP)
+-        kbd_put_keycode(keycode | 0x80);
+-    else
+-        kbd_put_keycode(keycode & 0x7f);
+-}
+-
+-static void sdl_update_caption(void)
+-{
+-    char buf[1024];
+-    strcpy(buf, "QEMU");
+-    if (!vm_running) {
+-        strcat(buf, " [Stopped]");
+-    }
+-    if (gui_grab) {
+-        strcat(buf, " - Press Ctrl-Alt to exit grab");
+-    }
+-    SDL_WM_SetCaption(buf, "QEMU");
+-}
+-
+-static void sdl_grab_start(void)
+-{
+-    SDL_ShowCursor(0);
+-    SDL_WM_GrabInput(SDL_GRAB_ON);
+-    /* dummy read to avoid moving the mouse */
+-    SDL_GetRelativeMouseState(NULL, NULL);
+-    gui_grab = 1;
+-    sdl_update_caption();
+-}
+-
+-static void sdl_grab_end(void)
+-{
+-    SDL_WM_GrabInput(SDL_GRAB_OFF);
+-    SDL_ShowCursor(1);
+-    gui_grab = 0;
+-    sdl_update_caption();
+-}
+-
+-static void sdl_send_mouse_event(int dz)
+-{
+-    int dx, dy, state, buttons;
+-    state = SDL_GetRelativeMouseState(&dx, &dy);
+-    buttons = 0;
+-    if (state & SDL_BUTTON(SDL_BUTTON_LEFT))
+-        buttons |= MOUSE_EVENT_LBUTTON;
+-    if (state & SDL_BUTTON(SDL_BUTTON_RIGHT))
+-        buttons |= MOUSE_EVENT_RBUTTON;
+-    if (state & SDL_BUTTON(SDL_BUTTON_MIDDLE))
+-        buttons |= MOUSE_EVENT_MBUTTON;
+-    kbd_mouse_event(dx, dy, dz, buttons);
+-}
+-
+-static void toggle_full_screen(DisplayState *ds)
+-{
+-    gui_fullscreen = !gui_fullscreen;
+-    sdl_resize(ds, screen->w, screen->h);
+-    if (gui_fullscreen) {
+-        gui_saved_grab = gui_grab;
+-        sdl_grab_start();
+-    } else {
+-        if (!gui_saved_grab)
+-            sdl_grab_end();
+-    }
+-    vga_invalidate_display();
+-    vga_update_display();
+-}
++    0x1b,
<<Diff was trimmed, longer than 597 lines>>



More information about the pld-cvs-commit mailing list