From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1EeLJI-0002Ue-RT for qemu-devel@nongnu.org; Mon, 21 Nov 2005 18:42:57 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1EeLJF-0002Qt-Ve for qemu-devel@nongnu.org; Mon, 21 Nov 2005 18:42:54 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1EeLJF-0002QH-J9 for qemu-devel@nongnu.org; Mon, 21 Nov 2005 18:42:53 -0500 Received: from [128.8.10.163] (helo=po1.wam.umd.edu) by monty-python.gnu.org with esmtp (Exim 4.34) id 1EeLJF-0000SN-KK for qemu-devel@nongnu.org; Mon, 21 Nov 2005 18:42:53 -0500 Date: Mon, 21 Nov 2005 18:41:48 -0500 From: "Jim C. Brown" Subject: Re: [Qemu-devel] Patch: Ctrl+Ins to copy console on windows Message-ID: <20051121234148.GA26125@jbrown.mylinuxbox.org> References: <20051120032556.2a72d9fc.ayerkes@speakeasy.net> <20051120110326.3fc18bf7.ayerkes@speakeasy.net> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Nq2Wo0NMKNjxTN9z" Content-Disposition: inline In-Reply-To: <20051120110326.3fc18bf7.ayerkes@speakeasy.net> Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: art yerkes Cc: qemu-devel@nongnu.org --Nq2Wo0NMKNjxTN9z Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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. --Nq2Wo0NMKNjxTN9z Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="qemu-put-console.diff" 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); --Nq2Wo0NMKNjxTN9z--