Update of /cvsroot/perl-win32-gui/Win32-GUI
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32668
Modified Files:
CHANGELOG GUI.h GUI.pm GUI.xs GUI_Helpers.cpp Textfield.xs
Tooltip.xs
Log Message:
Bug Fixes
Index: GUI.xs
===================================================================
RCS file: /cvsroot/perl-win32-gui/Win32-GUI/GUI.xs,v
retrieving revision 1.63
retrieving revision 1.64
diff -C2 -d -r1.63 -r1.64
*** GUI.xs 31 Oct 2006 22:24:15 -0000 1.63
--- GUI.xs 20 Jan 2007 17:09:22 -0000 1.64
***************
*** 5094,5097 ****
--- 5094,5099 ----
# -printeronly => 0/1 (default 0)
# only enable printers to be selected
+ # -directory => PATH
+ # the default start directory for browsing
# -root => PATH or CONSTANT
# the root directory for browsing; this can be either a
Index: GUI.pm
===================================================================
RCS file: /cvsroot/perl-win32-gui/Win32-GUI/GUI.pm,v
retrieving revision 1.58
retrieving revision 1.59
diff -C2 -d -r1.58 -r1.59
*** GUI.pm 5 Nov 2006 20:04:49 -0000 1.58
--- GUI.pm 20 Jan 2007 17:09:22 -0000 1.59
***************
*** 20,24 ****
# STATIC OBJECT PROPERTIES
#
! $VERSION = "1.05"; # For MakeMaker
$XS_VERSION = $VERSION; # For dynaloader
$VERSION = eval $VERSION; # For Perl (see perldoc perlmodstyle)
--- 20,24 ----
# STATIC OBJECT PROPERTIES
#
! $VERSION = "1.05_01"; # For MakeMaker
$XS_VERSION = $VERSION; # For dynaloader
$VERSION = eval $VERSION; # For Perl (see perldoc perlmodstyle)
***************
*** 2670,2674 ****
# unlikely event of someone doing PARENT->{Timer name} = undef;
my $window = Win32::GUI::GetWindowObject($self->{-handle});
! if(defined $window) {
# Remove id from -timers hash
delete $window->{-timers}->{$self->{-id}};
--- 2670,2674 ----
# unlikely event of someone doing PARENT->{Timer name} = undef;
my $window = Win32::GUI::GetWindowObject($self->{-handle});
! if(defined $window && tied %$window) {
# Remove id from -timers hash
delete $window->{-timers}->{$self->{-id}};
***************
*** 2937,2941 ****
# unlikely event of someone doing PARENT->{NotifyIcon name} = undef;
my $window = Win32::GUI::GetWindowObject($self->{-handle});
! if(defined $window) {
# Remove id from -notifyicons hash
delete $window->{-notifyicons}->{$self->{-id}} if defined
$window->{-notifyicons};
--- 2937,2941 ----
# unlikely event of someone doing PARENT->{NotifyIcon name} = undef;
my $window = Win32::GUI::GetWindowObject($self->{-handle});
! if(defined $window && tied %$window) {
# Remove id from -notifyicons hash
delete $window->{-notifyicons}->{$self->{-id}} if defined
$window->{-notifyicons};
Index: CHANGELOG
===================================================================
RCS file: /cvsroot/perl-win32-gui/Win32-GUI/CHANGELOG,v
retrieving revision 1.106
retrieving revision 1.107
diff -C2 -d -r1.106 -r1.107
*** CHANGELOG 5 Nov 2006 20:04:49 -0000 1.106
--- CHANGELOG 20 Jan 2007 17:09:22 -0000 1.107
***************
*** 6,9 ****
--- 6,18 ----
Win32-GUI ChangeLog
===================
+ + [Robert May] : 20 January 2007 - Bug Fixes
+ - Tooltip.xs - SetTitle method had warning and info icons
+ swapped. [Brian Millham]
+ - GUI_Helpers.cpp, GUI.pm - fix deleting from parent during global
+ destruction.
+ - Textfield.xs - re-write GetLine() to fix truncation caused by
+ line number being used as a character index, and to correctly
+ return zero lenght lines
+
+ [Robert May] : 5 November 2006 - 1.05 Release
- docs/GUI.pod - update references to v1.05 to v1.06, and v1.06
Index: Textfield.xs
===================================================================
RCS file: /cvsroot/perl-win32-gui/Win32-GUI/Textfield.xs,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** Textfield.xs 23 Jun 2006 23:08:07 -0000 1.8
--- Textfield.xs 20 Jan 2007 17:09:22 -0000 1.9
***************
*** 265,269 ****
###########################################################################
# (@)METHOD:GetLine(LINE)
! # Return line of text.
void
GetLine(handle, line)
--- 265,273 ----
###########################################################################
# (@)METHOD:GetLine(LINE)
! # Get a line of text.
! # LINE: zero based index to the line to be retrieved
! #
! # Returns the text of the line. Returns undef if LINE is
! # greater than the number of lines in the Textfied.
void
GetLine(handle, line)
***************
*** 273,295 ****
Win32::GUI::RichEdit::GetLine = 1
CODE:
! UINT size = SendMessage(handle, EM_LINELENGTH, line, 0);
! if (size > 0) {
! char * pBuf = (char *) safemalloc(size + 16);
! *((short*) pBuf) = size + 8;
! size = SendMessage(handle, EM_GETLINE, line, (LPARAM) pBuf);
! if (size > 0) {
! pBuf[size] = '\0';
! EXTEND(SP, 1);
! XST_mPV(0, pBuf);
! safefree(pBuf);
! XSRETURN(1);
! }
! else {
! safefree(pBuf);
! XSRETURN_UNDEF;
! }
! }
! else
XSRETURN_UNDEF;
###########################################################################
--- 277,328 ----
Win32::GUI::RichEdit::GetLine = 1
CODE:
! LONG index;
! WORD size;
! LPTSTR pBuf;
!
! index = (LONG)SendMessage(handle, EM_LINEINDEX, line, 0);
! if (index < 0) { /* -1 if line greater than number of lines in control */
XSRETURN_UNDEF;
+ }
+
+ size = (WORD)SendMessage(handle, EM_LINELENGTH, (WPARAM)index, 0);
+ /* we don't check the error condition of size == 0, as we have
+ * already checked the return value from EM_LINEINDEX, and have a valid
+ * index. A return value of zero means we have an empty line, and
+ * should return that.
+ */
+
+ /* ensure buffer is big enough to hold a WORD */
+ if (size < sizeof(WORD) ) {
+ size = (sizeof(WORD)/sizeof(TCHAR));
+ }
+ /* allocate buffer, adding one for the NUL termination */
+ /* TODO: The strategy used here results in the buffer being
+ * copied twice: once from the textfield to pBuf, and then
+ * a second time from pBuf into the SV. We should create
+ * an SV of the correct size, and pass the pointer to it's
+ * buffer to EM_GETLINE
+ */
+ New(0, pBuf, (int)(size+1), TCHAR);
+
+ /* put the size into the first word of the buffer */
+ *((WORD*)pBuf) = size;
+
+ /* get the text */
+ size = (WORD)SendMessage(handle, EM_GETLINE, line, (LPARAM)pBuf);
+ /* Again, we don't check the error condition of size == 0, as we have
+ * already checked the return value from EM_LINEINDEX, and have a valid
+ * line. A return value of zero means we have an empty line, and
+ * should return that.
+ */
+
+ /* ensure we are NUL terminated - this is NOT done by EM_GETLINE */
+ pBuf[size] = 0;
+
+ /* return the text */
+ EXTEND(SP, 1);
+ XST_mPV(0, pBuf);
+ Safefree(pBuf);
+ XSRETURN(1);
###########################################################################
Index: Tooltip.xs
===================================================================
RCS file: /cvsroot/perl-win32-gui/Win32-GUI/Tooltip.xs,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** Tooltip.xs 30 Aug 2006 21:57:58 -0000 1.9
--- Tooltip.xs 20 Jan 2007 17:09:22 -0000 1.10
***************
*** 1105,1111 ****
if(strcmp(icon, "error") == 0) {
i = 3;
- } else if(strcmp(icon, "info") == 0) {
- i = 2;
} else if(strcmp(icon, "warning") == 0) {
i = 1;
} else if(strcmp(icon, "none") == 0) {
--- 1105,1111 ----
if(strcmp(icon, "error") == 0) {
i = 3;
} else if(strcmp(icon, "warning") == 0) {
+ i = 2;
+ } else if(strcmp(icon, "info") == 0) {
i = 1;
} else if(strcmp(icon, "none") == 0) {
Index: GUI_Helpers.cpp
===================================================================
RCS file: /cvsroot/perl-win32-gui/Win32-GUI/GUI_Helpers.cpp,v
retrieving revision 1.22
retrieving revision 1.23
diff -C2 -d -r1.22 -r1.23
*** GUI_Helpers.cpp 30 Aug 2006 21:57:58 -0000 1.22
--- GUI_Helpers.cpp 20 Jan 2007 17:09:22 -0000 1.23
***************
*** 93,97 ****
SV* SvParent = SV_SELF_FROM_WINDOW(parent);
if (SvParent != NULL && SvROK(SvParent)) {
! hv_delete((HV*) SvRV(SvParent), perlud->szWindowName,
strlen(perlud->szWindowName), G_DISCARD);
}
}
--- 93,109 ----
SV* SvParent = SV_SELF_FROM_WINDOW(parent);
if (SvParent != NULL && SvROK(SvParent)) {
! /* During global destruction it is possible that the
! * underlying object supporting our tied hash is
! * destroyed before the object itself, this results in
! * fatal errors "(during cleanup) Can't call method
! * "DELETE" on an undefined value" - so we check that
! * the tied magic is still there before we try to
! * delete from the parent
! */
! MAGIC* mg;
! if ( (mg = mg_find(SvRV(SvParent), PERL_MAGIC_tied))
&& SvROK(mg->mg_obj) ) {
! hv_delete((HV*) SvRV(SvParent),
perlud->szWindowName,
! strlen(perlud->szWindowName),
G_DISCARD);
! }
}
}
Index: GUI.h
===================================================================
RCS file: /cvsroot/perl-win32-gui/Win32-GUI/GUI.h,v
retrieving revision 1.30
retrieving revision 1.31
diff -C2 -d -r1.30 -r1.31
*** GUI.h 30 Aug 2006 21:57:58 -0000 1.30
--- GUI.h 20 Jan 2007 17:09:22 -0000 1.31
***************
*** 368,371 ****
--- 368,375 ----
#endif
+ #ifndef PERL_MAGIC_tied
+ # define PERL_MAGIC_tied 'P' /* Tied array or hash */
+ #endif
+
/*
* other useful things