On Sun, Nov 20, 2005 at 11:03:26AM -0800, art yerkes wrote:
> > > 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.
> > >
> > > +static void console_copy() 
> > > +{
> > > +#ifdef _WIN32
> > 
> Unfortunately, I only implemented copying for windows.  I'm not sure
> how the clipboard works on other platforms, but they can be added in
> the console_copy function.
> 

Thank you! This is great.

I've attached a modified version, which is more generic. Instead of copying to
the clipboard, it saves a copy of the text into a file named qemu-clip.txt
(in the working directory of qemu). Should work on all platforms. Needs a lot
of work (being able to specify the name of the file, append instead of 
overwrite,
etc.) but should make it easy to "cheat copy" (save it to a file and then copy
the text via a word processor).

I'll see if I can make it copy into the X clipboard directly (the entire
X clipboard system is built in a weird way though).

> -- 
> 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

I'll try this soon.

-- 
Infinite complexity begets infinite beauty.
Infinite precision begets infinite perfection.
diff -ur qemu/console.c qemu.new/console.c
--- qemu/console.c      Thu Jan 27 23:09:49 2005
+++ qemu.new/console.c  Mon Nov 21 18:33:15 2005
@@ -406,6 +406,56 @@
     console_show_cursor(s, 1);
 }
 
+static void console_copy() 
+{
+    TextConsole *s;
+    int i, j, copytotal = 0, lastline = 0, row;
+    FILE *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( (copydest = fopen("qemu-clip.txt","w")) == NULL ) { printf("error 
opening qemu-clip.txt\n"); return; }
+
+    // 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) ) 
+               fputc(ch, copydest);
+           else
+               fputc(' ', copydest);
+       }
+       // fputc('\r', copydest); /* don't need this since we've opened in text 
mode */
+       fputc('\n', copydest);
+    }
+    
+    //fputc(0, copydest);
+    
+    // Now set the clipboard
+    fclose(copydest);
+}
+
 static void console_scroll(int ydelta)
 {
     TextConsole *s;
@@ -641,6 +691,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 */
diff -ur qemu/sdl.c qemu.new/sdl.c
--- qemu/sdl.c  Sat Nov  5 09:56:28 2005
+++ qemu.new/sdl.c      Mon Nov 21 18:28:02 2005
@@ -391,6 +387,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 {
diff -ur qemu/vl.h qemu.new/vl.h
--- qemu/vl.h   Tue Nov 15 18:19:19 2005
+++ qemu.new/vl.h       Mon Nov 21 18:28:36 2005
@@ -193,6 +193,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);
 
_______________________________________________
Qemu-devel mailing list
Qemu-devel@nongnu.org
http://lists.nongnu.org/mailman/listinfo/qemu-devel

Reply via email to