On Wed, Mar 10, 2010 at 6:39 AM, Jon Hylands <[hidden email]> wrote:
The primitive looks like this in my quite possibly obsolete VM sources: primitiveClipboardText "When called with a single string argument, post the string to
the clipboard. When called with zero arguments, return a string containing the current clipboard contents."
| s sz | argumentCount = 1 ifTrue: [s := self stackTop.
(self isBytes: s) ifFalse: [^ self primitiveFail]. self successful ifTrue: [sz := self stSizeOf: s.
self clipboardWrite: sz From: s + BaseHeaderSize At: 0. self pop: 1]]
ifFalse: [sz := self clipboardSize. (self sufficientSpaceToAllocate: sz) ifFalse:[^self primitiveFail].
s := self instantiateClass: (self splObj: ClassString) indexableSize: sz. self clipboardRead: sz Into: s + BaseHeaderSize At: 0.
self pop: 1 thenPush: s] I'm willing to bet that clipboardSize is returning -1. It probably needs to read something like
primitiveClipboardText "When called with a single string argument, post the string to the clipboard. When called with zero arguments, return a
string containing the current clipboard contents." | s sz | argumentCount = 1
ifTrue: [s := self stackTop. (self isBytes: s) ifFalse: [^ self primitiveFail].
self successful ifTrue: [sz := self stSizeOf: s. self clipboardWrite: sz From: s + BaseHeaderSize At: 0.
self pop: 1]] ifFalse: [sz := self clipboardSize. >> (sz >= 0 and: [self sufficientSpaceToAllocate: sz]) ifFalse:[^self primitiveFail].
s := self instantiateClass: (self splObj: ClassString) indexableSize: sz. self clipboardRead: sz Into: s + BaseHeaderSize At: 0.
self pop: 1 thenPush: s]
The Windows VM's clipboardText function is a tad unsafe: int clipboardSize(void) { HANDLE h; WCHAR *src; unsigned char *tmp;
int i, count, bytesNeeded; /* Do we have text in the clipboard? */ if(!IsClipboardFormatAvailable(CF_UNICODETEXT)) return 0; if(!OpenClipboard(stWindow))
return 0; /* Get it in unicode format. */ h = GetClipboardData(CF_UNICODETEXT); src = GlobalLock(h); /* How many bytes do we need to store those unicode chars in UTF8 format? */
bytesNeeded = WideCharToMultiByte(CP_UTF8, 0, src, -1, NULL, 0, NULL, NULL ); tmp = malloc(bytesNeeded+1); /* Convert Unicode text to UTF8. */
WideCharToMultiByte(CP_UTF8, 0, src, -1, tmp, bytesNeeded , NULL, NULL); /* Count CrLfs for which we remove the extra Lf */ count = bytesNeeded; /* ex. terminating zero */
for(i=0; i<count; i++) { if((tmp[i] == 13) && (tmp[i+1] == 10)) bytesNeeded--; } bytesNeeded--; /* discount terminating zero */ free(tmp); /* no longer needed */
GlobalUnlock(h); CloseClipboard(); return bytesNeeded; } If bytesNeeded is zero then the function will return (int)-1.
From the MS manual page: Return ValueReturns the number of bytes written to the buffer pointed to by lpMultiByteStr if successful. If the function succeeds and cbMultiByte is 0, the return value is the required size, in bytes, for the buffer indicated by lpMultiByteStr. The function returns 0 if it does not succeed. To get extended error information, the application can call GetLastError, which can return one of the following error codes:
So something like /* How many bytes do we need to store those unicode chars in UTF8 format? */
bytesNeeded = WideCharToMultiByte(CP_UTF8, 0, src, -1, NULL, 0, NULL, NULL ); if (bytesNeeded <= 0) return 0; would be wise.
|
The attached is better (remembers to unlock and close clipboard). I don't think I have commit rights for http://squeakvm.org/svn/squeak/trunk. Guess I should go get some :) Who do I talk to? On Wed, Mar 10, 2010 at 9:25 AM, Eliot Miranda <[hidden email]> wrote:
sqWin32Window.c (126K) Download Attachment |
On 10.03.2010, at 18:31, Eliot Miranda wrote: > The attached is better (remembers to unlock and close clipboard). I don't think I have commit rights for http://squeakvm.org/svn/squeak/trunk. Guess I should go get some :) Who do I talk to? Unless I'm mistaken only Ian, John, and Andreas have commit access to the VM trunk. And it's Ian's private box this is running on. - Bert - |
On Wed, Mar 10, 2010 at 9:38 AM, Bert Freudenberg <[hidden email]> wrote:
Then posting a modified file is fine. Works for me :) Thanks, Bert!
|
On Wed, Mar 10, 2010 at 10:00:48AM -0800, Eliot Miranda wrote: > > On Wed, Mar 10, 2010 at 9:38 AM, Bert Freudenberg <[hidden email]>wrote: > > > > > On 10.03.2010, at 18:31, Eliot Miranda wrote: > > > The attached is better (remembers to unlock and close clipboard). I > > don't think I have commit rights for http://squeakvm.org/svn/squeak/trunk. > > Guess I should go get some :) Who do I talk to? > > > > Unless I'm mistaken only Ian, John, and Andreas have commit access to the > > VM trunk. > > > > And it's Ian's private box this is running on. > > > > Then posting a modified file is fine. Works for me :) Thanks, Bert! Actually if you don't mind a few extra steps, it helps a lot if you can open an issue on Mantis under category "VM" and attach it there. Things do have a tendency to get lost if just posted to the list. Dave |
On Wed, Mar 10, 2010 at 10:56 AM, David T. Lewis <[hidden email]> wrote:
Quite :) Of course.
|
In reply to this post by David T. Lewis
On Wed, Mar 10, 2010 at 10:56 AM, David T. Lewis <[hidden email]> wrote:
Issue 7476. clipboardSize on Win32 can return -1 (4294967295) on failure
|
On Wed, Mar 10, 2010 at 11:34:29AM -0800, Eliot Miranda wrote: > > On Wed, Mar 10, 2010 at 10:56 AM, David T. Lewis <[hidden email]>wrote: > > > > Actually if you don't mind a few extra steps, it helps a lot if you > > can open an issue on Mantis under category "VM" and attach it there. > > Things do have a tendency to get lost if just posted to the list. > > Issue 7476. clipboardSize on Win32 can return -1 (4294967295) on failure Thank you! |
Free forum by Nabble | Edit this page |