Index: sdl.c =================================================================== RCS file: /cvsroot/qemu/qemu/sdl.c,v retrieving revision 1.23 diff -u -r1.23 sdl.c --- sdl.c 30 Oct 2005 23:19:10 -0000 1.23 +++ sdl.c 20 Nov 2005 11:17:22 -0000 @@ -378,6 +378,7 @@ case SDLK_END: keysym = QEMU_KEY_CTRL_END; break; case SDLK_PAGEUP: keysym = QEMU_KEY_CTRL_PAGEUP; break; case SDLK_PAGEDOWN: keysym = QEMU_KEY_CTRL_PAGEDOWN; break; + case SDLK_INSERT: keysym = QEMU_KEY_CTRL_INS; break; default: break; } } else { Index: vl.h =================================================================== RCS file: /cvsroot/qemu/qemu/vl.h,v retrieving revision 1.91 diff -u -r1.91 vl.h --- vl.h 15 Nov 2005 22:16:05 -0000 1.91 +++ vl.h 20 Nov 2005 11:17:23 -0000 @@ -37,6 +37,9 @@ #include #include #include +#ifdef _WIN32 +#include +#endif #include "audio/audio.h" #ifndef O_LARGEFILE @@ -189,6 +192,7 @@ #define QEMU_KEY_CTRL_END 0xe405 #define QEMU_KEY_CTRL_PAGEUP 0xe406 #define QEMU_KEY_CTRL_PAGEDOWN 0xe407 +#define QEMU_KEY_CTRL_INS 0xe408 void kbd_put_keysym(int keysym); Index: console.c =================================================================== RCS file: /cvsroot/qemu/qemu/console.c,v retrieving revision 1.3 diff -u -r1.3 console.c --- console.c 9 Oct 2004 17:32:58 -0000 1.3 +++ console.c 20 Nov 2005 11:17:23 -0000 @@ -406,6 +406,67 @@ console_show_cursor(s, 1); } +static void console_copy() +{ +#ifdef _WIN32 + TextConsole *s; + int i, j, copytotal = 0, lastline = 0, row; + char *copydest; + HGLOBAL clipbuf; + + s = active_console; + + // Count characters + for( i = 0; i < s->total_height; i++ ) { + row = 0; + for( j = 0; j < s->width; j++ ) { + char ch = s->cells[i * s->width + j].ch; + if( isprint(ch) && !isspace(ch) ) + row = j; + } + if( row != 0 ) + lastline = i; + copytotal += row + strlen("\r\n"); + } + + // Create the clip buffer + if( !OpenClipboard( NULL ) ) return; + + EmptyClipboard(); + clipbuf = GlobalAlloc(GMEM_DDESHARE, copytotal+1); + + if( !clipbuf ) return; + + copydest = (char *)GlobalLock(clipbuf); + + // Copy the actual text + for( i = 0; i < lastline+1; i++ ) { + row = 0; + for( j = 0; j < s->width; j++ ) { + char ch = s->cells[i * s->width + j].ch; + if( isprint(ch) && !isspace(ch) ) + row = j; + } + for( j = 0; j < row; j++ ) { + char ch = s->cells[i * s->width + j].ch; + if( isprint(ch) && !isspace(ch) ) + *copydest++ = ch; + else + *copydest++ = ' '; + } + *copydest++ = '\r'; + *copydest++ = '\n'; + } + + *copydest++ = 0; + + // Now set the clipboard + GlobalUnlock(clipbuf); + SetClipboardData(CF_TEXT,clipbuf); + CloseClipboard(); +#endif +} + static void console_scroll(int ydelta) { TextConsole *s; @@ -641,6 +702,9 @@ case QEMU_KEY_CTRL_PAGEDOWN: console_scroll(10); break; + case QEMU_KEY_CTRL_INS: + console_copy(); + break; default: if (s->fd_read) { /* convert the QEMU keysym to VT100 key string */