Mon Mar 26 02:18:20 2012: Request 76042 was acted upon.
Transaction: Ticket created by [email protected]
Queue: Win32-Clipboard
Subject: (No subject given)
Broken in: (no value)
Severity: (no value)
Owner: Nobody
Requestors: [email protected]
Status: new
Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=76042 >
attached is the patch to introduce unicode support to the Win32::Clipboard
module,
which I happen to implement for my needs and now intent to share.
I decided not to support $CLIPB->... interface for these 2 new functions,
because
I dislike the concept of fake OO.
Also, the patch increments the module version number.
Thanks in advance for considering this,
regards,
Vadim.
diff -bur Win32-Clipboard-0.56/ChangeLog Win32-Clipboard-0.57/ChangeLog
--- Win32-Clipboard-0.56/ChangeLog Fri Jan 14 04:58:15 2011
+++ Win32-Clipboard-0.57/ChangeLog Sat Mar 17 23:20:22 2012
@@ -1,3 +1,7 @@
+2012-03-17
+ - version 0.57
+ - deal with unicode text: UGet(), USet($s), IsUText()
+
2011-01-13
- version 0.56
- include file <wchar.h> needed for MinGW/Cygwin compilation
diff -bur Win32-Clipboard-0.56/Clipboard.pm Win32-Clipboard-0.57/Clipboard.pm
--- Win32-Clipboard-0.56/Clipboard.pm Fri Jan 14 04:58:32 2011
+++ Win32-Clipboard-0.57/Clipboard.pm Sat Mar 17 22:00:41 2012
@@ -3,13 +3,15 @@
#
# Win32::Clipboard - Interaction with the Windows clipboard
#
-# Version: 0.56
+# Version: 0.57
# Author: Aldo Calpini <[email protected]>
#
# Modified by: Hideyo Imazu <[email protected]>
#
#######################################################################
+$VERSION = "0.57";
+
require Exporter;
require DynaLoader;
@@ -53,8 +55,6 @@
}
-$VERSION = "0.56";
-
sub new {
my($class, $value) = @_;
my $self = "I'm the Clipboard!";
@@ -62,9 +62,6 @@
return bless(\$self);
}
-sub Version {
- return $VERSION;
-}
sub Get {
if( IsBitmap() ) { return GetBitmap(); }
@@ -175,7 +172,9 @@
All the functions can be used either with their full name
(eg. B<Win32::Clipboard::Get>) or as methods of a C<Win32::Clipboard>
-object. For the syntax, refer to L</SYNOPSIS> above. Note also that
+object. Except for these two: C<Win32::Clipboard::UGet()> and
+C<Win32::Clipboard::USet($s)>.
+For the syntax, refer to L</SYNOPSIS> above. Note also that
you can create a clipboard object and set its content at the same time
with:
@@ -223,7 +222,7 @@
elsif( IsFiles() ) { return GetFiles(); }
else { return GetText(); }
-See also IsBitmap(), IsFiles(), IsText(), EnumFormats() and
+See also IsBitmap(), IsFiles(), IsText(), IsUText(), EnumFormats() and
IsFormatAvailable() to check the clipboard format before getting data.
=item GetAs(FORMAT)
@@ -240,6 +239,9 @@
$text = $clip->GetAs(CF_UNICODETEXT);
$text = Encode::decode("UTF16-LE", $text);
+Alternatively, you can use C<UGet()> function, which does required conversion
+internally, and also C<USet(...)> function for the reverse operation.
+
=item GetBitmap()
Returns the clipboard content as an image, or C<undef> on errors.
@@ -259,6 +261,21 @@
Returns the clipboard content as a string, or C<undef> on errors.
+=item UGet()
+
+Returns the clipboard content as unicode string, or C<undef> on errors.
+Resulting string have UTF8 bit on.
+Call it as C<Win32::Clipboard::UGet()>, the OO interface C<<$CLIP->...>>
+not supported.
+
+=item USet(string)
+
+Sets the clipboard content as unicode string, or C<undef> on errors.
+Internally, this function will convert string to wide-char windows
+encoding.
+Call it as C<Win32::Clipboard::USet($s)>, the OO interface C<<$CLIP->...>>
+not supported.
+
=item IsBitmap()
Returns a boolean value indicating if the clipboard contains an image.
@@ -279,6 +296,11 @@
Returns a boolean value indicating if the clipboard contains text.
See also GetText().
+
+=item IsUText()
+
+Returns a boolean value indicating if the clipboard contains Unicode text.
+See also USet(), UGet().
=item Set(VALUE)
diff -bur Win32-Clipboard-0.56/Clipboard.xs Win32-Clipboard-0.57/Clipboard.xs
--- Win32-Clipboard-0.56/Clipboard.xs Fri Jan 14 04:59:21 2011
+++ Win32-Clipboard-0.57/Clipboard.xs Sat Mar 17 23:20:04 2012
@@ -3,7 +3,7 @@
#
# Win32::Clipboard - Interaction with the Windows clipboard
#
-# Version: 0.56
+# Version: 0.57
# Created: 19 Nov 96
# Author: Aldo Calpini <[email protected]>
#
@@ -469,6 +469,34 @@
}
void
+UGet()
+PPCODE:
+ HANDLE myhandle;
+ if(OpenClipboard(NULL)) {
+ EXTEND(SP,1);
+ if(myhandle = GetClipboardData(CF_UNICODETEXT)) {
+ /* here we decode UTF16-LE into UTF8, using perl API */
+ wchar_t *wcmyh = (wchar_t*)myhandle;
+ int i, len = wcslen(wcmyh);
+ SV *sv = newSV(len * UTF8_MAXBYTES +1);
+ SvPOK_on(sv);
+ U8 *e = (U8*) SvPVX(sv), *e0 = e;
+ for (i=0; i<len; i++) {
+ e = uvuni_to_utf8(e, wcmyh[i]);
+ }
+ *e = 0;
+ SvCUR_set(sv, e-e0);
+ SvUTF8_on(sv);
+ ST(0) = sv_2mortal(sv);
+ } else
+ XST_mNO(0);
+ CloseClipboard();
+ XSRETURN(1);
+ } else {
+ XSRETURN_NO;
+ }
+
+void
GetFiles(...)
PPCODE:
HANDLE myhandle;
@@ -652,6 +680,58 @@
}
void
+USet(text)
+ SV *text
+PPCODE:
+ HANDLE myhandle;
+ HGLOBAL hGlobal;
+ STRLEN leng;
+ U8 *str = (U8*) SvPV(text, leng);
+
+ if ( hGlobal = GlobalAlloc(GMEM_DDESHARE, (leng+2)*sizeof(char)*2) ) {
+ /* here we encode UTF16-LE from UTF8, using perl API */
+ wchar_t *szString = (wchar_t *) GlobalLock(hGlobal);
+
+ if(SvUTF8(text)) {
+ /* indeed, we have utf8 data */
+ U8 * const send = str + leng;
+ STRLEN ulen;
+ while (str < send) {
+ *szString++ = (wchar_t)utf8_to_uvchr(str, &ulen);
+ str += ulen;
+ }
+ } else {
+ /* we have raw data, no encoding to UTF8, so converting
+ * binarily means appending waw '\0' to each char */
+ U8 * const send = str + leng;
+ while (str < send) {
+ *szString++ = (wchar_t) *str++;
+ }
+ }
+ *szString = '\0';
+
+ GlobalUnlock(hGlobal);
+
+ if ( OpenClipboard(NULL) ) {
+ EmptyClipboard();
+ myhandle = SetClipboardData(CF_UNICODETEXT, (HANDLE) hGlobal);
+ CloseClipboard();
+
+ if ( myhandle ) {
+ XSRETURN_YES;
+ } else {
+ XSRETURN_NO;
+ }
+ } else {
+ GlobalFree(hGlobal);
+ XSRETURN_NO;
+ }
+
+ } else {
+ XSRETURN_NO;
+ }
+
+void
Empty(...)
PPCODE:
if(OpenClipboard(NULL)) {
@@ -697,6 +777,13 @@
IsText(...)
CODE:
RETVAL = (long) IsClipboardFormatAvailable(CF_TEXT);
+OUTPUT:
+ RETVAL
+
+long
+IsUText(...)
+CODE:
+ RETVAL = (long) IsClipboardFormatAvailable(CF_UNICODETEXT);
OUTPUT:
RETVAL
diff -bur Win32-Clipboard-0.56/META.yml Win32-Clipboard-0.57/META.yml
--- Win32-Clipboard-0.56/META.yml Fri Jan 14 05:00:16 2011
+++ Win32-Clipboard-0.57/META.yml Sat Mar 17 23:18:32 2012
@@ -1,11 +1,12 @@
--- #YAML:1.0
name: Win32-Clipboard
-version: 0.56
+version: 0.57
abstract: Interaction with the Windows clipboard
author:
- Aldo Calpini <[email protected]>
- Hideyo Imazu <[email protected]>
- Jan Dubois <[email protected]>
+ - Vadim Konovalov <[email protected]>
license: perl
distribution_type: module
configure_requires:
diff -bur Win32-Clipboard-0.56/README Win32-Clipboard-0.57/README
--- Win32-Clipboard-0.56/README Fri Jan 14 04:59:31 2011
+++ Win32-Clipboard-0.57/README Sat Mar 17 23:21:35 2012
@@ -4,10 +4,12 @@
#
# Author: Aldo Calpini <[email protected]>
# Modified by: Hideyo Imazu <[email protected]>
-# Version: 0.56
+# Modified by: Vadim Konovalov <[email protected]>
+# Version: 0.57
# Info:
# http://dada.perl.it
# http://www.perl.com/CPAN/authors/Aldo_Calpini
+# https://libwin32.googlecode.com/svn/trunk/Win32-Clipboard
#
#######################################################################
@@ -18,10 +20,11 @@
changes. This version supports 3 formats for getting clipboard data:
- simple text
+ - unicode text
- bitmaps
- list of files
-...and only simple text for putting data to the clipboard.
+...and only simple/unicode text for putting data to the clipboard.
SYNOPSIS
diff -bur Win32-Clipboard-0.56/t/test.t Win32-Clipboard-0.57/t/test.t
--- Win32-Clipboard-0.56/t/test.t Wed Nov 26 02:58:00 2008
+++ Win32-Clipboard-0.57/t/test.t Sat Mar 17 22:24:54 2012
@@ -7,7 +7,7 @@
######################### We start with some black magic to print on failure.
-BEGIN { $| = 1; print "1..9\n"; }
+BEGIN { $| = 1; print "1..12\n"; }
END {print "not ok 1\n" unless $loaded;}
use Win32::Clipboard;
$loaded = 1;
@@ -50,3 +50,18 @@
$clip = "Win32::Clipboard test";
print "not " unless tied($clip)->IsText();
print "ok 9\n";
+
+# unicode clipboard checks
+use utf8;
+
+Win32::Clipboard::USet("qwerty");
+my $s = Win32::Clipboard::UGet();
+print "not " unless $s eq "qwerty";
+print "ok 10\n";
+
+print +(utf8::is_utf8($s)? '' : "not ") . "ok 11\n";
+
+Win32::Clipboard::USet("проба пера");
+print "not " unless Win32::Clipboard::UGet() eq "проба пера";
+print "ok 12\n";
+