This is a small patch to enable copying the current console to the clipboard
with Ctrl+Ins.
A line break is added after the last nonblank character of each copied line.

-- 
Here's a simple experiment. Stand on a train track between two locomotives
which are pushing on you with equal force in opposite directions. You will
exhibit no net motion. None the less, you may soon begin to notice that
something important is happening.
-- Robert Stirniman
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 <unistd.h>
 #include <fcntl.h>
 #include <sys/stat.h>
+#ifdef _WIN32
+#include <windows.h>
+#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 */
_______________________________________________
Qemu-devel mailing list
Qemu-devel@nongnu.org
http://lists.nongnu.org/mailman/listinfo/qemu-devel

Reply via email to