Update of /cvsroot/perl-win32-gui/Win32-GUI In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5945
Modified Files: CHANGELOG GUI.h GUI.pm GUI.xs GUI_Helpers.cpp GUI_MessageLoops.cpp GUI_Options.cpp Label.xs MANIFEST NotifyIcon.xs RichEdit.xs Splitter.xs Log Message: Add Notify Icon Balloon Tooltips; Re-work splitter class; bug fixes Index: GUI.xs =================================================================== RCS file: /cvsroot/perl-win32-gui/Win32-GUI/GUI.xs,v retrieving revision 1.47 retrieving revision 1.48 diff -C2 -d -r1.47 -r1.48 *** GUI.xs 3 Dec 2005 01:56:31 -0000 1.47 --- GUI.xs 11 Jan 2006 21:26:15 -0000 1.48 *************** *** 2047,2054 **** DWORD result; PPCODE: ! if(SendMessageTimeout( ! handle, msg, wparam, lparam, flags, timeout, &result ! ) == 0) { ! XSRETURN_NO; } else { XSRETURN_IV(result); --- 2047,2052 ---- DWORD result; PPCODE: ! if(SendMessageTimeout(handle, msg, wparam, lparam, flags, timeout, &result) == 0) { ! XSRETURN_UNDEF; } else { XSRETURN_IV(result); Index: Label.xs =================================================================== RCS file: /cvsroot/perl-win32-gui/Win32-GUI/Label.xs,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** Label.xs 3 Aug 2005 21:45:57 -0000 1.6 --- Label.xs 11 Jan 2006 21:26:16 -0000 1.7 *************** *** 45,63 **** } else if(strcmp(option, "-truncate") == 0) { if(strcmp(SvPV_nolen(value), "path") == 0) { ! SwitchBit(perlcs->cs.style, SS_PATHELLIPSIS, 1); ! SwitchBit(perlcs->cs.style, SS_ENDELLIPSIS, 0); ! SwitchBit(perlcs->cs.style, SS_WORDELLIPSIS, 0); } else if(strcmp(SvPV_nolen(value), "word") == 0) { ! SwitchBit(perlcs->cs.style, SS_PATHELLIPSIS, 0); ! SwitchBit(perlcs->cs.style, SS_ENDELLIPSIS, 0); ! SwitchBit(perlcs->cs.style, SS_WORDELLIPSIS, 1); } else if(SvIV(value)) { ! SwitchBit(perlcs->cs.style, SS_PATHELLIPSIS, 0); ! SwitchBit(perlcs->cs.style, SS_ENDELLIPSIS, 1); ! SwitchBit(perlcs->cs.style, SS_WORDELLIPSIS, 0); } else { ! SwitchBit(perlcs->cs.style, SS_PATHELLIPSIS, 0); ! SwitchBit(perlcs->cs.style, SS_ENDELLIPSIS, 0); ! SwitchBit(perlcs->cs.style, SS_WORDELLIPSIS, 0); } } else if(strcmp(option, "-frame") == 0) { --- 45,58 ---- } else if(strcmp(option, "-truncate") == 0) { if(strcmp(SvPV_nolen(value), "path") == 0) { ! perlcs->cs.style &= ~SS_ELLIPSISMASK; ! perlcs->cs.style |= SS_PATHELLIPSIS; } else if(strcmp(SvPV_nolen(value), "word") == 0) { ! perlcs->cs.style &= ~SS_ELLIPSISMASK; ! perlcs->cs.style |= SS_WORDELLIPSIS; } else if(SvIV(value)) { ! perlcs->cs.style &= ~SS_ELLIPSISMASK; ! perlcs->cs.style |= SS_ENDELLIPSIS; } else { ! perlcs->cs.style &= ~SS_ELLIPSISMASK; } } else if(strcmp(option, "-frame") == 0) { Index: RichEdit.xs =================================================================== RCS file: /cvsroot/perl-win32-gui/Win32-GUI/RichEdit.xs,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** RichEdit.xs 5 Oct 2005 22:20:49 -0000 1.6 --- RichEdit.xs 11 Jan 2006 21:26:16 -0000 1.7 *************** *** 25,28 **** --- 25,44 ---- void RichEdit_onPostCreate(NOTXSPROC HWND myhandle, LPPERLWIN32GUI_CREATESTRUCT perlcs) { + + if(perlcs->clrForeground != CLR_INVALID) { + CHARFORMAT cf; + ZeroMemory(&cf, sizeof(CHARFORMAT)); + cf.cbSize = sizeof(CHARFORMAT); + cf.dwMask = CFM_COLOR; + cf.crTextColor = perlcs->clrForeground; + SendMessage (myhandle, EM_SETCHARFORMAT, (WPARAM)SCF_ALL, (LPARAM)&cf); + perlcs->clrForeground = CLR_INVALID; // Don't Store + } + + if(perlcs->clrBackground != CLR_INVALID) { + SendMessage (myhandle, EM_SETBKGNDCOLOR, (WPARAM)0, (LPARAM)(perlcs->clrBackground)); + perlcs->clrBackground = CLR_INVALID; // Don't Store + } + } Index: GUI.pm =================================================================== RCS file: /cvsroot/perl-win32-gui/Win32-GUI/GUI.pm,v retrieving revision 1.36 retrieving revision 1.37 diff -C2 -d -r1.36 -r1.37 *** GUI.pm 3 Dec 2005 01:56:31 -0000 1.36 --- GUI.pm 11 Jan 2006 21:26:14 -0000 1.37 *************** *** 25,32 **** # STATIC OBJECT PROPERTIES # ! $VERSION = "1.03_01"; # For MakeMaker $XS_VERSION = $VERSION; # For dynaloader $VERSION = eval $VERSION; # For Perl (see perldoc perlmodstyle) ! $MenuIdCounter = 1; $TimerIdCounter = 1; $NotifyIconIdCounter = 1; --- 25,32 ---- # STATIC OBJECT PROPERTIES # ! $VERSION = "1.03_02"; # For MakeMaker $XS_VERSION = $VERSION; # For dynaloader $VERSION = eval $VERSION; # For Perl (see perldoc perlmodstyle) ! $MenuIdCounter = 101; $TimerIdCounter = 1; $NotifyIconIdCounter = 1; *************** *** 1469,1474 **** # -uppercase => 0/1 (default 0) # Convert all caracter into uppercase ! # -autohscroll => 0/1 (default 0) ! # -autovscroll => 0/1 (default 0) # -number => 0/1 (default 0) # Allows only digits to be entered into the edit control --- 1469,1479 ---- # -uppercase => 0/1 (default 0) # Convert all caracter into uppercase ! # -autohscroll => 0/1 (default 1 (0 for a multiline Textfield)) ! # Automatically scroll to right as text is typed past the right ! # margin; If 0 for a multiline Textfield, then wrap to the next ! # line. ! # -autovscroll => 0/1 (default 1) ! # For a multiline Textfiled automatically scroll down as lines ! # pass the bottom of the control. # -number => 0/1 (default 0) # Allows only digits to be entered into the edit control *************** *** 1824,1828 **** # (@)PACKAGE:Win32::GUI::RichEdit # Create and manipulate Richedit controls. ! # Most of the methods and events that apply to a L<TextField|Win32::GUI::Textfield> # also apply to Win32::GUI::RichEdit. # --- 1829,1833 ---- # (@)PACKAGE:Win32::GUI::RichEdit # Create and manipulate Richedit controls. ! # Most of the methods and events that apply to a L<Textfield|Win32::GUI::Textfield> # also apply to Win32::GUI::RichEdit. # *************** *** 1842,1846 **** # Creates a new RichEdit object; # can also be called as PARENT->AddRichEdit(%OPTIONS). ! # See new Win32::GUI::TextField() for B<%OPTIONS> sub new { $Win32::GUI::RICHED = Win32::GUI::LoadLibrary("RICHED32") unless defined $Win32::GUI::RICHED; --- 1847,1851 ---- # Creates a new RichEdit object; # can also be called as PARENT->AddRichEdit(%OPTIONS). ! # See new Win32::GUI::Textfield() for B<%OPTIONS> sub new { $Win32::GUI::RICHED = Win32::GUI::LoadLibrary("RICHED32") unless defined $Win32::GUI::RICHED; *************** *** 2753,2759 **** ############################################################################### # (@)PACKAGE:Win32::GUI::NotifyIcon ! # Create and manipulate notify icons in the system tray # package Win32::GUI::NotifyIcon; ########################################################################### --- 2758,2774 ---- ############################################################################### # (@)PACKAGE:Win32::GUI::NotifyIcon ! # Create and manipulate icons and tooltips in the system tray # + # The functionality of Win32::GUI::NotifyIcon is affected by the version + # of shell.dll installed with the windows system running your script. You + # can find this version from $Win32::GUI::NotifyIcon::SHELLDLL_VERSION, + # which contains the major version number of the shell.dll library that + # has been loaded. package Win32::GUI::NotifyIcon; + use Win32(); + our $SHELLDLL_VERSION; + BEGIN { + $SHELLDLL_VERSION = (Win32::GetFileVersion('shell32'))[0]; + } ########################################################################### *************** *** 2764,2777 **** # B<%OPTIONS> are: # -icon => Win32::GUI::Icon object ! # -id => NUMBER ! # a unique identifier for the NotifyIcon object # -name => STRING # the name for the object # -tip => STRING ! # the text that will appear as tooltip when the mouse is ! # on the NotifyIcon # -event => NEM Event Hash # Set NEM event handler (you can also use -on Event Option). ! sub new { my $class = shift; --- 2779,2828 ---- # B<%OPTIONS> are: # -icon => Win32::GUI::Icon object ! # the icon to display in the taskbar # -name => STRING # the name for the object # -tip => STRING ! # the text that will appear as a tooltip when the mouse is ! # hovering over the NotifyIcon. For shell.dll versions prior ! # to 5.0 the text length is limited to 63 characters; For ! # later versions it is limited to 127 characters. The string ! # provided will be truncated as necessary. # -event => NEM Event Hash # Set NEM event handler (you can also use -on Event Option). ! # ! # For shell.dll version 5.0 and later balloon tooltips can be used, ! # the following options control balloon tooltips. If your version ! # of shell.dll does not support balloon tooltips, then these options ! # are silently ignored: ! # -balloon => 0/1 ! # A flag controlling whether the ballon tip is displayed by ! # new() or Change(), or whether the ShowBalloon() method ! # must be called to display the balloon tooltip. Defaults ! # to 0 (not displayed). ! # -balloon_tip => STRING ! # Sets the text that will appear in the body of the balloon tip. ! # Will cause the balloon tip to be removed from the screen if set ! # to the empty string and displayed. The string is limited to ! # 255 characters and will be truncated as necessary. ! # -balloon_title => STRING ! # Sets the text that appears as a title at the top of the balloon ! # tip. The string is limited to 63 characters and will be truncated ! # as necessary. ! # -balloon_icon => STRING ! # Sets the icon that is displayed next to the balloon tip title. If ! # the balloon tip title is not set (or is set to the empty string), ! # then no icon is displayed. Allowed values for STRING are: ! # error, info, warning, none. Defaults to 'none'. ! # -balloon_timeout => NUMBER ! # The maximum time for which a balloon tooltip is displayed before ! # being removed, in milliseconds. The system will limit the range ! # allowed (typically to between 10 and 30 seconds). If a balloon ! # is being displayed and another taskbar icon tries to display a ! # balloon tip, then the one being displayed will be removed after ! # it has been displayed for the system minimum time (typically 10 ! # seconds), and only then will the new tooltip be displayed. ! # Defaults to 10 seconds. ! # ! # Returns a Win32::GUI::NotifyIcon object on success, undef on failure sub new { my $class = shift; *************** *** 2782,2787 **** if(!exists($args{-id})) { ! $args{-id} = $Win32::GUI::NotifyIconIdCounter; ! $Win32::GUI::NotifyIconIdCounter++; } --- 2833,2840 ---- if(!exists($args{-id})) { ! $args{-id} = $Win32::GUI::NotifyIconIdCounter++; # TODO - deprecate ! } ! else { ! warn qq(The -id option is deprecated, and you should not be setting it.); } *************** *** 2790,2793 **** --- 2843,2848 ---- } + $args{-balloon} = 0 unless exists $args{-balloon}; + my $self = {}; bless($self, $class); *************** *** 2796,2811 **** $self->{-name} = $args{-name}; $self->{-handle} = $window->{-handle}; ! # Store name in notifyicons hash $window->{-notifyicons}->{$args{-id}} = $args{-name}; ! # AutoReference to parent $window->{$args{-name}} = $self; - # Only if perl is circular ref-safe - if ($] > 5.006) { - $self->{-window} = \$window; - } ! Win32::GUI::NotifyIcon::Add($self->{-handle}, %args); return $self; } --- 2851,2867 ---- $self->{-name} = $args{-name}; $self->{-handle} = $window->{-handle}; + $self->{-balloon_tip} = $args{-balloon_tip}; + $self->{-balloon_title} = $args{-balloon_title}; + $self->{-balloon_timeout} = $args{-balloon_timeout}; + $self->{-balloon_icon} = $args{-balloon_icon}; ! # Store name in parent's notifyicons hash $window->{-notifyicons}->{$args{-id}} = $args{-name}; ! # Add NotifyIcon into parent's hash $window->{$args{-name}} = $self; ! my $result = Win32::GUI::NotifyIcon::_Add($self->{-handle}, %args); + return undef unless $result; return $self; } *************** *** 2813,2821 **** ########################################################################### # (@)METHOD:Change(%OPTIONS) ! # Change most option. See new Win32::GUI::NotifyIcon(). sub Change { my $self = shift; my %args = @_; ! return Win32::GUI::NotifyIcon::Modify($self->{-handle}, %args); } --- 2869,2998 ---- ########################################################################### # (@)METHOD:Change(%OPTIONS) ! # Change all options. See new Win32::GUI::NotifyIcon(). ! # ! # Returns 1 on success, 0 on failure sub Change { my $self = shift; my %args = @_; ! ! $args{-balloon} = 0 unless exists $args{-balloon}; ! ! $self->{-balloon_tip} = $args{-balloon_tip} if exists $args{-balloon_tip}; ! $self->{-balloon_title} = $args{-balloon_title} if exists $args{-balloon_title}; ! $self->{-balloon_timeout} = $args{-balloon_timeout} if exists $args{-balloon_timeout}; ! $self->{-balloon_icon} = $args{-balloon_icon} if exists $args{-balloon_icon}; ! ! if($self->{-balloon}) { ! $args{-balloon_tip} = $self->{-balloon_tip}; ! $args{-balloon_title} = $self->{-balloon_title}; ! $args{-balloon_timeout} = $self->{-balloon_timeout}; ! $args{-balloon_icon} = $self->{-balloon_icon}; ! } ! ! return Win32::GUI::NotifyIcon::_Modify($self->{-handle}, -id => $self->{-id}, %args); ! } ! ! ########################################################################### ! # (@)METHOD:ShowBalloon([FLAG=1]) ! # Only supported by shell32.dll v5.0 and above ! # ! # Show or hide a balloon tooltip with details supplied from the new() or ! # Change() methods, using the -balloon_tip, -balloon_title, -balloon_timeout ! # and -balloon_icon options. ! # ! # Set B<FLAG> to a true value to display the balloon tooltip, or to a false ! # value to hide the tip (it will automatically be hidden by the system ! # after -balloon_timeout millseconds). If B<FLAG> is omitted, displays the ! # tooltip. If the tooltip is already showing, re-showing it queues ! # a new balloon tooltip to be displayed once the existing one times out. ! # ! # Returns 1 on success, 0 on failure or undef if not supported. ! sub ShowBalloon { ! return undef if $SHELLDLL_VERSION < 5; ! my $self = shift; ! my $flag = shift; ! $flag = 1 unless defined $flag; ! ! return Win32::GUI::NotifyIcon::_Modify( ! $self->{-handle}, ! -id => $self->{-id}, ! -balloon => 1, ! -balloon_tip => $flag ? $self->{-balloon_tip} : '', ! -balloon_title => $self->{-balloon_title}, ! -balloon_timeout => $self->{-balloon_timeout}, ! -balloon_icon => $self->{-balloon_icon}, ! ); ! } ! ! ########################################################################### ! # (@)METHOD:HideBalloon([FLAG=1]) ! # Only supported by shell32.dll v5.0 and above ! # ! # Show or hide a balloon tooltip with details supplied from the new() or ! # Change() methods, using the -balloon_tip, -balloon_title, -balloon_timeout ! # and -balloon_icon options. ! # ! # Set B<FLAG> to a false value to display the balloon tooltip, or to a true ! # value to hide the tip (it will automatically be hidden by the system ! # after -balloon_timeout millseconds). If B<FLAG> is omitted, hides the ! # tooltip. If the tooltip is already showing, re-showing it queues ! # a new balloon tooltip to be displayed once the existing one times out. ! # ! # Returns 1 on success, 0 on failure or undef if not supported. ! sub HideBalloon { ! return undef if $SHELLDLL_VERSION < 5; ! my $self = shift; ! my $flag = shift; ! $flag = 1 unless defined $flag; ! ! return $self->ShowBalloon(!$flag); ! } ! ! ########################################################################### ! # (@)METHOD:SetFocus() ! # Only supported by shell32.dll v5.0 and above ! # ! # Return focus to the taskbar notification area. For example if the taskbar ! # icon displays a shortcut menu and the use cancels the menu with ESC, then ! # use this method to return focus to the taskbar notification area. ! # ! # Returns 1 on success, 0 on failure and undef if not supported. ! sub SetFocus { ! return undef if $SHELLDLL_VERSION < 5; ! my $self = shift; ! return Win32::GUI::NotifyIcon::_SetFocus($self->{-handle}, -id => $self->{-id}); ! } ! ! ########################################################################### ! # (@)METHOD:SetBehaviour([FLAG]) ! # Only supported by shell32.dll v5.0 and above ! # ! # Set FLAG to a true value to get the Windows 2000 taskbar behaviour. set ! # FLAG to a flase value to get Windows 95 taskbar behaviour. See the MSDN ! # documentation for Shell_NotifyIcon for more details. ! # ! # Returns 1 on success, 0 on failure and undef if not supported. ! sub SetBehaviour { ! return undef if $SHELLDLL_VERSION < 5; ! my $self = shift; ! my $flag = shift || 0; ! return Win32::GUI::NotifyIcon::_SetVersion($self->{-handle}, -id => $self->{-id}, -behaviour => $flag); ! } ! ! ########################################################################### ! # (@)METHOD:Remove() ! # Remove the Notify Icon from the system tray, and free its related resources ! sub Remove { ! my $self = shift; ! $self->DESTROY(); ! } ! ! ########################################################################### ! # (@)METHOD:Delete() ! # Deprecated method for removing notify icon from the system tray. Will be ! # removed from future Win32::GUI versions without further warning. ! sub Delete { ! warn qq(Win32::GUI::NotifyIcon::Delete() is deprecated, please use Win32::GUI::NofityIcon::Remove()); ! return Win32::GUI::_Delete(@_); } *************** *** 2824,2846 **** sub DESTROY { ! my($self) = @_; ! if ( defined $self && ! defined $self->{-handle} && ! defined $self->{-id} ) { ! ! Win32::GUI::NotifyIcon::Delete( ! $self->{-handle}, ! -id => $self->{-id}, ! ); ! if (defined $self->{-window}) { ! my $window = ${$self->{-window}}; ! # Remove id from parent ! delete $window->{-notifyicons}->{$self->{-id}} ! if ref($window) and defined $window->{-notifyicons}->{$self->{-id}}; ! # Remove name from parent ! delete $window->{$self->{-name}} if defined $window; ! } } } --- 3001,3018 ---- sub DESTROY { + my $self = shift; ! # Remove the notify icon ! Win32::GUI::NotifyIcon::_Delete($self->{-handle}, -id => $self->{-id}); ! # We put this code to tidy up the parent here, rather than ! # in NofifyIcon->Delete(), so that we still tidy up, even in the ! # 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}; ! # Remove name from parent ! delete $window->{$self->{-name}}; } } *************** *** 3359,3363 **** } ! # print "[DESTROY Fin] self='$self'\n"; } --- 3531,3535 ---- } ! # print "[DESTROY Fin ] self='$self'\n"; } Index: CHANGELOG =================================================================== RCS file: /cvsroot/perl-win32-gui/Win32-GUI/CHANGELOG,v retrieving revision 1.69 retrieving revision 1.70 diff -C2 -d -r1.69 -r1.70 *** CHANGELOG 3 Dec 2005 01:56:31 -0000 1.69 --- CHANGELOG 11 Jan 2006 21:26:14 -0000 1.70 *************** *** 6,29 **** Win32-GUI ChangeLog =================== ! + [Robert May] : 3 Dec 2003 - bug fixes ! - GUI.h change order of instructions to prevent crashes (Trackers ! 1243378 and 1248578) - GUI.pm up version to 1.03_01 and tidy up - GUI.xs change logic in all message loops (Dialog, DoEvents, DoModal) to ! prevent memoy leak (Tracker: 1201190) - Listbox.xs add documentation to differentiate between SetCurSel and ! SetSel ! + [Robert May] : 22 Nov 2003 - 1.03 release - Tagged head as Win32-GUI-1_03 ! + [Robert May] : 21 Nov 2003 - 1.03 release candidate - t\05_Timer_*.t change interval test to use milli-seconds using ! Win32::GetTickCount() rather than time(). ! -t\01_basic.t add tests for Test::More availability and correct OS. ! -t\98_Pod.t new test of POD syntax - various minor documentation edits to correct POD syntax ! -Makefile.PL added test for presence of compiler to stop us failing CPAN ! Smoke tests in test environments with no compilers. - Up version to 1.03 --- 6,55 ---- Win32-GUI ChangeLog =================== ! + [Robert May] : 11 Jan 2006 - bug fixes and add balloon tips for Notify Icon ! - Label.xs correct -truncate option processing, as SS_.*ELLIPSIS.* ! styles are not single bits ! - NotifyIcon.xs, GUI_Options.cpp, GUI.pm re-work NofifyIcon ! class. Add balloon tooltips. Add support for message behaviour. Add ! support for setfocus. Add documentation. (Tracker: 1065072) ! - t\05_NotifyIcon*.t, MANIFEST Notify Icon Tests added ! - samples\NotifyIcon.pl, MANIFEST add demo app ! - GUI.pm Changed initial value of $Win32::GUI::MenuIdCounter to avoid ID ! clash with predefined WM_COMMAND values (IDOK, IDCANCEL, etc.) ! - GUI.xs Fix SendMessageTimeout to match documentation and return ! undef on failure. (XSRETURN_UNDEF rather than XSRETURN_NO). ! - GUI.pm corrected documentation of default values for autohscroll ! and autovscroll in Textfield documentation ! - GUI_MessageLoops.cpp added processing of WM_NEXTDLGCTL to ! CommonMessageLoop to allow for tabbing out of multiline Textfields ! when using -dialogui ! - GUI_MessageLoops.cpp fixed WM_ERASEBACKGROUND (Tracker:1363141) ! - Splitter.xs, GUI_Helpers.cpp, GUI.h re-worked splitter class. ! (Tracker:1363141) ! - RichEdit.xs made -background and -foreground work ! - GUI_MessageLoops.cpp made -background work for Splitter windows ! - GUI_Helpers.cpp removed an unnecessary dTHX, replacing it with ! PERLUD_FETCH ! - Upped version to 1.03_02 ! ! + [Robert May] : 3 Dec 2005 - bug fixes ! - GUI.h change order of instructions in PERLUD_FREE macro to prevent ! crashes (Trackers 1243378 and 1248578) - GUI.pm up version to 1.03_01 and tidy up - GUI.xs change logic in all message loops (Dialog, DoEvents, DoModal) to ! prevent memory leak (Tracker: 1201190) - Listbox.xs add documentation to differentiate between SetCurSel and ! SetSel (Tracker: 1177898) ! + [Robert May] : 22 Nov 2005 - 1.03 release - Tagged head as Win32-GUI-1_03 ! + [Robert May] : 21 Nov 2005 - 1.03 release candidate - t\05_Timer_*.t change interval test to use milli-seconds using ! Win32::GetTickCount() rather than time(). ! - t\01_basic.t add tests for Test::More availability and correct OS. ! - t\98_Pod.t new test of POD syntax - various minor documentation edits to correct POD syntax ! - Makefile.PL added test for presence of compiler to stop us failing CPAN ! Smoke tests in test environments with no compilers. - Up version to 1.03 *************** *** 31,44 **** - Makefile.PL added code to remove Test::More dependence from PPD - GUI_MessageLoops.cpp, Window.xs change all mouse related handlers to ! use GET_X_LPARAM and GET_Y_LPARAM rather than HIWORD and LOWORD ! (Tracker: 1262098) - GUI.xs added INTERNAL function GetWindowObject to get the perl window ! object from a window handle - GUI.pm, t\05_Timer*.t, docs\GUI\Tutorial\Part4.pod - re-wrote ! Win32::GUI::Timer implementation and updated docs to make it all ! consistent, and to make destruction happen correctly. Added full tests ! for the package. - GUI.xs fixed GetAsyncKeyState(), which was checking the wrong bit of ! window's return value. Updated documentation. - MANIFEST updated with new samples and new tests - GUI.pm upped version to 1.02_03 --- 57,70 ---- - Makefile.PL added code to remove Test::More dependence from PPD - GUI_MessageLoops.cpp, Window.xs change all mouse related handlers to ! use GET_X_LPARAM and GET_Y_LPARAM rather than HIWORD and LOWORD ! (Tracker: 1262098) - GUI.xs added INTERNAL function GetWindowObject to get the perl window ! object from a window handle - GUI.pm, t\05_Timer*.t, docs\GUI\Tutorial\Part4.pod - re-wrote ! Win32::GUI::Timer implementation and updated docs to make it all ! consistent, and to make destruction happen correctly. Added full tests ! for the package. - GUI.xs fixed GetAsyncKeyState(), which was checking the wrong bit of ! window's return value. Updated documentation. - MANIFEST updated with new samples and new tests - GUI.pm upped version to 1.02_03 Index: NotifyIcon.xs =================================================================== RCS file: /cvsroot/perl-win32-gui/Win32-GUI/NotifyIcon.xs,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** NotifyIcon.xs 28 Mar 2004 15:01:47 -0000 1.3 --- NotifyIcon.xs 11 Jan 2006 21:26:16 -0000 1.4 *************** *** 19,23 **** # (@)INTERNAL:Add(PARENT, %OPTIONS) BOOL ! Add(parent,...) HWND parent PREINIT: --- 19,23 ---- # (@)INTERNAL:Add(PARENT, %OPTIONS) BOOL ! _Add(parent,...) HWND parent PREINIT: *************** *** 25,33 **** CODE: ZeroMemory(&nid, sizeof(NOTIFYICONDATA)); ! nid.cbSize = sizeof(NOTIFYICONDATA); ! nid.hWnd = parent; nid.uCallbackMessage = WM_NOTIFYICON; SwitchBit(nid.uFlags, NIF_MESSAGE, 1); ParseNotifyIconOptions(NOTXSCALL sp, mark, ax, items, 1, &nid); --- 25,34 ---- CODE: ZeroMemory(&nid, sizeof(NOTIFYICONDATA)); ! nid.cbSize = NOTIFYICONDATA_V1_SIZE; nid.hWnd = parent; nid.uCallbackMessage = WM_NOTIFYICON; SwitchBit(nid.uFlags, NIF_MESSAGE, 1); + SwitchBit(nid.uFlags, NIF_INFO, 1); + nid.uTimeout = 10000; ParseNotifyIconOptions(NOTXSCALL sp, mark, ax, items, 1, &nid); *************** *** 41,45 **** # (@)INTERNAL:Modify(PARENT, %OPTIONS) BOOL ! Modify(parent,...) HWND parent PREINIT: --- 42,46 ---- # (@)INTERNAL:Modify(PARENT, %OPTIONS) BOOL ! _Modify(parent,...) HWND parent PREINIT: *************** *** 47,53 **** CODE: ZeroMemory(&nid, sizeof(NOTIFYICONDATA)); ! ! nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = parent; ParseNotifyIconOptions(NOTXSCALL sp, mark, ax, items, 1, &nid); --- 48,54 ---- CODE: ZeroMemory(&nid, sizeof(NOTIFYICONDATA)); ! nid.cbSize = NOTIFYICONDATA_V1_SIZE; nid.hWnd = parent; + nid.uTimeout = 10000; ParseNotifyIconOptions(NOTXSCALL sp, mark, ax, items, 1, &nid); *************** *** 61,65 **** # (@)INTERNAL:Delete(PARENT, %OPTIONS) BOOL ! Delete(parent,...) HWND parent PREINIT: --- 62,66 ---- # (@)INTERNAL:Delete(PARENT, %OPTIONS) BOOL ! _Delete(parent,...) HWND parent PREINIT: *************** *** 67,71 **** CODE: ZeroMemory(&nid, sizeof(NOTIFYICONDATA)); ! nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = parent; --- 68,72 ---- CODE: ZeroMemory(&nid, sizeof(NOTIFYICONDATA)); ! nid.cbSize = NOTIFYICONDATA_V1_SIZE; nid.hWnd = parent; *************** *** 75,76 **** --- 76,114 ---- OUTPUT: RETVAL + + ########################################################################### + # (@)INTERNAL:SetFocus(PARENT, %OPTIONS) + BOOL + _SetFocus(parent,...) + HWND parent + PREINIT: + NOTIFYICONDATA nid; + CODE: + ZeroMemory(&nid, sizeof(NOTIFYICONDATA)); + nid.cbSize = NOTIFYICONDATA_V1_SIZE; + nid.hWnd = parent; + + ParseNotifyIconOptions(NOTXSCALL sp, mark, ax, items, 1, &nid); + + RETVAL = Shell_NotifyIcon(NIM_SETFOCUS, &nid); + OUTPUT: + RETVAL + + ########################################################################### + # (@)INTERNAL:SetVersion(PARENT, %OPTIONS) + BOOL + _SetVersion(parent,...) + HWND parent + PREINIT: + NOTIFYICONDATA nid; + CODE: + ZeroMemory(&nid, sizeof(NOTIFYICONDATA)); + nid.cbSize = NOTIFYICONDATA_V1_SIZE; + nid.hWnd = parent; + + ParseNotifyIconOptions(NOTXSCALL sp, mark, ax, items, 1, &nid); + + RETVAL = Shell_NotifyIcon(NIM_SETVERSION, &nid); + OUTPUT: + RETVAL + Index: Splitter.xs =================================================================== RCS file: /cvsroot/perl-win32-gui/Win32-GUI/Splitter.xs,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** Splitter.xs 3 Aug 2005 21:45:57 -0000 1.4 --- Splitter.xs 11 Jan 2006 21:26:16 -0000 1.5 *************** *** 82,168 **** int PerlResult = 0; - BOOL tracking, horizontal; POINT pt; HWND phwnd, hwnd; RECT rc; switch(uMsg) { case WM_MOUSEMOVE: - tracking = perlud->dwPlStyle & PERLWIN32GUI_TRACKING; if(tracking) { - horizontal = perlud->dwPlStyle & PERLWIN32GUI_HORIZONTAL; hwnd = handle_From (NOTXSCALL perlud->svSelf); phwnd = GetParent(hwnd); ! GetCursorPos(&pt); ! ScreenToClient(phwnd, &pt); if(horizontal) { ! pt.y = AdjustSplitterCoord(NOTXSCALL perlud, pt.y, phwnd); ! DrawSplitter(NOTXSCALL hwnd); ! GetWindowRect(hwnd, &rc); ! ScreenToClient(phwnd, (POINT*)&rc); ! SetWindowPos(hwnd, NULL, rc.left, pt.y, 0, 0, SWP_NOZORDER | SWP_NOSIZE); ! DrawSplitter(NOTXSCALL hwnd); } else { ! pt.x = AdjustSplitterCoord(NOTXSCALL perlud, pt.x, phwnd); ! DrawSplitter(NOTXSCALL hwnd); ! GetWindowRect(hwnd, &rc); ! ScreenToClient(phwnd, (POINT*)&rc); ! SetWindowPos(hwnd, NULL, pt.x, rc.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE); ! DrawSplitter(NOTXSCALL hwnd); } } break; case WM_LBUTTONDOWN: - SwitchBit(perlud->dwPlStyle, PERLWIN32GUI_TRACKING, 1); - horizontal = perlud->dwPlStyle & PERLWIN32GUI_HORIZONTAL; hwnd = handle_From (NOTXSCALL perlud->svSelf); phwnd = GetParent(hwnd); ! GetCursorPos(&pt); ! ScreenToClient(phwnd, &pt); if(horizontal) { ! pt.y = AdjustSplitterCoord(NOTXSCALL perlud, pt.y, phwnd); ! DrawSplitter(NOTXSCALL hwnd); ! SetCapture(hwnd); } else { ! pt.x = AdjustSplitterCoord(NOTXSCALL perlud, pt.x, phwnd); ! DrawSplitter(NOTXSCALL hwnd); ! SetCapture(hwnd); } break; case WM_LBUTTONUP: - tracking = perlud->dwPlStyle & PERLWIN32GUI_TRACKING; if(tracking) { ! horizontal = perlud->dwPlStyle & PERLWIN32GUI_HORIZONTAL; hwnd = handle_From (NOTXSCALL perlud->svSelf); phwnd = GetParent(hwnd); ! GetCursorPos(&pt); ! ScreenToClient(phwnd, &pt); /* * (@)EVENT:Release(COORD) * Sent when the Splitter is released after being * dragged to a new location (identified by the ! * COORD parameter). * (@)APPLIES_TO:Splitter */ ! if(horizontal) { ! pt.y = AdjustSplitterCoord(NOTXSCALL perlud, pt.y, phwnd); ! DrawSplitter(NOTXSCALL hwnd); ! PerlResult = DoEvent(NOTXSCALL perlud, PERLWIN32GUI_NEM_CONTROL1, "Release", ! PERLWIN32GUI_ARGTYPE_LONG, (long) pt.y, ! -1); } else { ! pt.x = AdjustSplitterCoord(NOTXSCALL perlud, pt.x, phwnd); ! DrawSplitter(NOTXSCALL hwnd); ! PerlResult = DoEvent(NOTXSCALL perlud, PERLWIN32GUI_NEM_CONTROL1, "Release", ! PERLWIN32GUI_ARGTYPE_LONG, (long) pt.x, ! -1); } } - SwitchBit(perlud->dwPlStyle, PERLWIN32GUI_TRACKING, 0); - SetWindowLong(hwnd, GWL_USERDATA, (LONG) perlud); - ReleaseCapture(); break; --- 82,189 ---- int PerlResult = 0; POINT pt; HWND phwnd, hwnd; RECT rc; + int w,h; + + BOOL tracking = perlud->dwPlStyle & PERLWIN32GUI_TRACKING; + BOOL horizontal = perlud->dwPlStyle & PERLWIN32GUI_HORIZONTAL; switch(uMsg) { case WM_MOUSEMOVE: if(tracking) { hwnd = handle_From (NOTXSCALL perlud->svSelf); phwnd = GetParent(hwnd); ! GetWindowRect(hwnd, &rc); ! w = rc.right - rc.left; ! h = rc.bottom - rc.top; ! ScreenToClient(phwnd, (POINT*)&rc); ! pt.x = GET_X_LPARAM(lParam); ! pt.y = GET_Y_LPARAM(lParam); ! MapWindowPoints(hwnd, phwnd, (LPPOINT)&pt, 1); ! if(horizontal) { ! DrawSplitter(NOTXSCALL phwnd, rc.left, (int)(perlud->dwData), w, h); ! pt.y = AdjustSplitterCoord(NOTXSCALL perlud, pt.y, h, phwnd); ! perlud->dwData = (DWORD)pt.y; ! DrawSplitter(NOTXSCALL phwnd, rc.left, pt.y, w, h); } else { ! DrawSplitter(NOTXSCALL phwnd, (int)(perlud->dwData), rc.top, w, h); ! pt.x = AdjustSplitterCoord(NOTXSCALL perlud, pt.x, w, phwnd); ! perlud->dwData = (DWORD)pt.x; ! DrawSplitter(NOTXSCALL phwnd, pt.x, rc.top, w, h); } } break; case WM_LBUTTONDOWN: hwnd = handle_From (NOTXSCALL perlud->svSelf); phwnd = GetParent(hwnd); ! GetWindowRect(hwnd, &rc); ! w = rc.right - rc.left; ! h = rc.bottom - rc.top; ! ScreenToClient(phwnd, (POINT*)&rc); ! pt.x = GET_X_LPARAM(lParam); ! pt.y = GET_Y_LPARAM(lParam); ! MapWindowPoints(hwnd, phwnd, (LPPOINT)&pt, 1); if(horizontal) { ! pt.y = AdjustSplitterCoord(NOTXSCALL perlud, pt.y, h, phwnd); ! perlud->dwData = (DWORD)rc.top; ! DrawSplitter(NOTXSCALL phwnd, rc.left, rc.top, w, h); } else { ! pt.x = AdjustSplitterCoord(NOTXSCALL perlud, pt.x, w, phwnd); ! perlud->dwData = (DWORD)rc.left; ! DrawSplitter(NOTXSCALL phwnd, rc.left, rc.top, w, h); } + SwitchBit(perlud->dwPlStyle, PERLWIN32GUI_TRACKING, 1); + SetCapture(hwnd); break; case WM_LBUTTONUP: if(tracking) { ! ReleaseCapture(); // Sends us a WM_CAPTURECHANGED message hwnd = handle_From (NOTXSCALL perlud->svSelf); phwnd = GetParent(hwnd); ! GetWindowRect(hwnd, &rc); ! w = rc.right - rc.left; ! h = rc.bottom - rc.top; ! ScreenToClient(phwnd, (POINT*)&rc); ! ! if(horizontal) { ! MoveWindow(hwnd, rc.left, (int)(perlud->dwData), w, h, 1); ! } else { ! MoveWindow(hwnd, (int)(perlud->dwData), rc.top, w, h, 1); ! } ! /* * (@)EVENT:Release(COORD) * Sent when the Splitter is released after being * dragged to a new location (identified by the ! * COORD parameter). COORD is the top coordinate ! * of a horizontal splitter or the left coordinate ! * of a vertical splitter. * (@)APPLIES_TO:Splitter */ ! PerlResult = DoEvent(NOTXSCALL perlud, PERLWIN32GUI_NEM_CONTROL1, "Release", ! PERLWIN32GUI_ARGTYPE_LONG, (long) perlud->dwData, ! -1); ! } ! break; ! case WM_CAPTURECHANGED: ! if(tracking) { ! hwnd = handle_From (NOTXSCALL perlud->svSelf); ! phwnd = GetParent(hwnd); ! GetWindowRect(hwnd, &rc); ! w = rc.right - rc.left; ! h = rc.bottom - rc.top; ! ScreenToClient(phwnd, (POINT*)&rc); ! SwitchBit(perlud->dwPlStyle, PERLWIN32GUI_TRACKING, 0); + if(horizontal) { + DrawSplitter(NOTXSCALL phwnd, rc.left, (int)(perlud->dwData), w, h); } else { ! DrawSplitter(NOTXSCALL phwnd, (int)(perlud->dwData), rc.top, w, h); } } break; *************** *** 182,186 **** ########################################################################### # (@)METHOD:Min([VALUE]) ! # Get or Set Min value void --- 203,209 ---- ########################################################################### # (@)METHOD:Min([VALUE]) ! # Get or Set Min value. The min value is the minimum position ! # to which the left(top) of the splitter can be dragged, in ! # the parent window for a horizontal(vertical) splitter. void *************** *** 207,211 **** ########################################################################### # (@)METHOD:Max([VALUE]) ! # Get or Set Max value void --- 230,236 ---- ########################################################################### # (@)METHOD:Max([VALUE]) ! # Get or Set Max value. The max value is the maximum position ! # to which the left(top) of the splitter can be dragged, in ! # the parent window for a horizontal(vertical) splitter. void *************** *** 232,236 **** ########################################################################### # (@)METHOD:Horizontal([VALUE]) ! # Get or Set Horizontal value void --- 257,263 ---- ########################################################################### # (@)METHOD:Horizontal([VALUE]) ! # Get or Set Horizontal orientation. If value is true, then sets ! # the splitter orientation to horizontal. If value is false, then ! # sets the splitter to Vertical orintation. void *************** *** 257,261 **** ########################################################################### # (@)METHOD:Vertical([VALUE]) ! # Get or Set Vertical value void --- 284,290 ---- ########################################################################### # (@)METHOD:Vertical([VALUE]) ! # Get or Set Vertical orientation. If value is true, then sets ! # the splitter orientation to vertuical. If value is false, then ! # sets the splitter to horizontal orintation. void Index: MANIFEST =================================================================== RCS file: /cvsroot/perl-win32-gui/Win32-GUI/MANIFEST,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** MANIFEST 21 Nov 2005 22:33:33 -0000 1.11 --- MANIFEST 11 Jan 2006 21:26:16 -0000 1.12 *************** *** 89,92 **** --- 89,93 ---- samples/MonthCal.pl samples/Notepad.pl + samples/NotifyIcon.pl samples/Region.pl samples/SplashScreen.pl *************** *** 115,118 **** --- 116,124 ---- t/05_AcceleratorTable.t t/05_Menu.t + t/05_NotifyIcon_01_Constructor.t + t/05_NotifyIcon_02_Change.t + t/05_NotifyIcon_03_OtherMethods.t + t/05_NotifyIcon_04_Remove.t + t/05_NotifyIcon_05_DESTROY.t t/05_Timer_01_OEM.t t/05_Timer_02_NEM.t Index: GUI_Options.cpp =================================================================== RCS file: /cvsroot/perl-win32-gui/Win32-GUI/GUI_Options.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** GUI_Options.cpp 3 Aug 2005 21:45:57 -0000 1.9 --- GUI_Options.cpp 11 Jan 2006 21:26:16 -0000 1.10 *************** *** 860,866 **** --- 860,886 ---- int i, next_i; char * option; + SV* shversion; + UINT version = 0; HV* hvEvents = NULL; + shversion = get_sv("Win32::GUI::NotifyIcon::SHELLDLL_VERSION",0); + if(shversion != NULL) { + version = (UINT)SvIV(shversion); + #if (_WIN32_IE >= 0x0500) && (_WIN32_IE < 0x0600) + if (version >= 5) { + nid->cbSize = sizeof(NOTIFYICONDATA); + } + #endif + #if (_WIN32_IE >= 0x0600) + if (version >= 5) { + nid->cbSize = NOTIFYICONDATA_V2_SIZE; + } + if (version >= 6) { + nid->cbSize = sizeof(NOTIFYICONDATA); + } + #endif + } + next_i = -1; for(i = from_i; i < items; i++) { *************** *** 876,880 **** } else if(strcmp(option, "-tip") == 0) { next_i = i + 1; ! strcpy(nid->szTip, SvPV_nolen(ST(next_i))); SwitchBit(nid->uFlags, NIF_TIP, 1); } else if(strcmp(option, "-events") == 0) { --- 896,906 ---- } else if(strcmp(option, "-tip") == 0) { next_i = i + 1; ! if( version < 5 ) { ! strncpy(nid->szTip, SvPV_nolen(ST(next_i)), 64); ! nid->szTip[63] = '\0'; ! } else { ! strncpy(nid->szTip, SvPV_nolen(ST(next_i)), 128); ! nid->szTip[127] = '\0'; ! } SwitchBit(nid->uFlags, NIF_TIP, 1); } else if(strcmp(option, "-events") == 0) { *************** *** 902,905 **** --- 928,963 ---- ParseNEMNotifyIconEvent( NOTXSCALL hvEvents, option+3, ST(next_i) ); + } else if(strcmp(option, "-behaviour") == 0) { + next_i = i + 1; + if (SvIV(ST(next_i))) { + nid->uVersion = NOTIFYICON_VERSION; + } + } else if(strcmp(option, "-balloon") == 0) { + next_i = i + 1; + SwitchBit(nid->uFlags, NIF_INFO, SvIV(ST(next_i))); + } else if(strcmp(option, "-balloon_tip") == 0) { + next_i = i + 1; + strncpy(nid->szInfo, SvPV_nolen(ST(next_i)), 256); + nid->szInfo[255] = '\0'; + } else if(strcmp(option, "-balloon_title") == 0) { + next_i = i + 1; + strncpy(nid->szInfoTitle, SvPV_nolen(ST(next_i)), 64); + nid->szInfoTitle[63] = '\0'; + } else if(strcmp(option, "-balloon_timeout") == 0) { + next_i = i + 1; + nid->uTimeout = (UINT) SvIV(ST(next_i)); + } else if(strcmp(option, "-balloon_icon") == 0) { + next_i = i + 1; + if(strcmp(SvPV_nolen(ST(next_i)), "error") == 0) { + nid->dwInfoFlags = NIIF_ERROR; + } else if(strcmp(SvPV_nolen(ST(next_i)), "info") == 0) { + nid->dwInfoFlags = NIIF_INFO; + } else if(strcmp(SvPV_nolen(ST(next_i)), "warning") == 0) { + nid->dwInfoFlags = NIIF_WARNING; + } else if(strcmp(SvPV_nolen(ST(next_i)), "none") == 0) { + nid->dwInfoFlags = NIIF_NONE; + } else { + W32G_WARN("Win32::GUI: Invalid value for -balloon_icon!"); + } } } else { *************** *** 957,959 **** hv_undef(hvEvents); } - --- 1015,1016 ---- Index: GUI.h =================================================================== RCS file: /cvsroot/perl-win32-gui/Win32-GUI/GUI.h,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** GUI.h 5 Dec 2005 09:38:58 -0000 1.23 --- GUI.h 11 Jan 2006 21:26:14 -0000 1.24 *************** *** 420,425 **** DWORD CALLBACK RichEditLoad(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG FAR *pcb); int CALLBACK BrowseForFolderProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData); ! int AdjustSplitterCoord(NOTXSPROC LPPERLWIN32GUI_USERDATA perlud, int x, HWND phwnd); ! void DrawSplitter(NOTXSPROC HWND hwnd); BOOL CALLBACK EnumMyWindowsProc(HWND hwnd, LPARAM lparam); BOOL CALLBACK CountMyWindowsProc(HWND hwnd, LPARAM lparam); --- 420,425 ---- DWORD CALLBACK RichEditLoad(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG FAR *pcb); int CALLBACK BrowseForFolderProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData); ! int AdjustSplitterCoord(NOTXSPROC LPPERLWIN32GUI_USERDATA perlud, int x, int w, HWND phwnd); ! void DrawSplitter(NOTXSPROC HWND hwnd, int x, int y, int w, int h); BOOL CALLBACK EnumMyWindowsProc(HWND hwnd, LPARAM lparam); BOOL CALLBACK CountMyWindowsProc(HWND hwnd, LPARAM lparam); Index: GUI_Helpers.cpp =================================================================== RCS file: /cvsroot/perl-win32-gui/Win32-GUI/GUI_Helpers.cpp,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** GUI_Helpers.cpp 6 Aug 2005 10:36:20 -0000 1.14 --- GUI_Helpers.cpp 11 Jan 2006 21:26:15 -0000 1.15 *************** *** 573,577 **** # (@)INTERNAL:AdjustSplitterCoord(self, x) */ ! int AdjustSplitterCoord(NOTXSPROC LPPERLWIN32GUI_USERDATA perlud, int x, HWND phwnd) { int min, max; int adjusted; --- 573,577 ---- # (@)INTERNAL:AdjustSplitterCoord(self, x) */ ! int AdjustSplitterCoord(NOTXSPROC LPPERLWIN32GUI_USERDATA perlud, int x, int w, HWND phwnd) { int min, max; int adjusted; *************** *** 584,588 **** max = -1; max = perlud->iMaxWidth; ! if(max == -1) max = rc.right; if(adjusted < min) adjusted = min; if(adjusted > max) adjusted = max; --- 584,588 ---- max = -1; max = perlud->iMaxWidth; ! if(max == -1) max = rc.right - w; if(adjusted < min) adjusted = min; if(adjusted > max) adjusted = max; *************** *** 594,611 **** # (@)INTERNAL:DrawSplitter(hwnd) */ ! void DrawSplitter(NOTXSPROC HWND hwnd) { ! RECT rc; HDC hdc; ! HBRUSH oldBrush; ! HPEN oldPen; hdc = GetDC(hwnd); ! oldBrush = (HBRUSH) SelectObject(hdc, GetStockObject(GRAY_BRUSH)); ! oldPen = (HPEN) SelectObject(hdc, GetStockObject(NULL_PEN)); ! GetClientRect(hwnd, &rc); ! PatBlt(hdc, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, DSTINVERT); ! if(oldBrush != NULL) SelectObject(hdc, oldBrush); ! if(oldPen != NULL) SelectObject(hdc, oldPen ); ReleaseDC(hwnd, hdc); } --- 594,624 ---- # (@)INTERNAL:DrawSplitter(hwnd) */ ! void DrawSplitter(NOTXSPROC HWND hwnd, int x, int y, int w, int h) { ! ! static WORD _dotPatternBmp[8] = { 0x00aa, 0x0055, 0x00aa, 0x0055, ! 0x00aa, 0x0055, 0x00aa, 0x0055}; ! HDC hdc; ! HBITMAP hbm; ! HBRUSH hbr, hbrushOld; ! ! /* create a monochrome checkered pattern */ ! hbm = CreateBitmap(8, 8, 1, 1, _dotPatternBmp); ! hbr = CreatePatternBrush(hbm); hdc = GetDC(hwnd); ! ! SetBrushOrgEx(hdc, x, y, NULL); ! hbrushOld = (HBRUSH)SelectObject(hdc, hbr); ! ! /* draw the checkered rectangle to the screen */ ! PatBlt(hdc, x, y, w, h, PATINVERT); ! ! SelectObject(hdc, hbrushOld); ! ReleaseDC(hwnd, hdc); + + DeleteObject(hbr); + DeleteObject(hbm); } *************** *** 696,701 **** if(code == MSGF_MENU) { - dTHX; /* fetch context */ - PerlResult = 1; pmsg = (MSG *)lParam; --- 709,712 ---- *************** *** 703,706 **** --- 714,718 ---- if(ValidUserData(perlud)) { + PERLUD_FETCH; /* fetch context */ arrayref = av_fetch(perlud->avHooks, WM_TRACKPOPUP_MSGHOOK, 0); Index: GUI_MessageLoops.cpp =================================================================== RCS file: /cvsroot/perl-win32-gui/Win32-GUI/GUI_MessageLoops.cpp,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** GUI_MessageLoops.cpp 5 Dec 2005 09:38:58 -0000 1.16 --- GUI_MessageLoops.cpp 11 Jan 2006 21:26:16 -0000 1.17 *************** *** 76,88 **** perlud = (LPPERLWIN32GUI_USERDATA) GetWindowLong((HWND) hwnd, GWL_USERDATA); if(perlud && (perlud->dwPlStyle & PERLWIN32GUI_FLICKERFREE)) { ! return (LRESULT) 1; } // If we're a window and we have a background brush, then use it ! if(perlud && perlud->hBackgroundBrush && ! (perlud->iClass == WIN32__GUI__WINDOW || perlud->iClass == WIN32__GUI__DIALOG) ) { ! RECT rc; ! GetUpdateRect((HWND)hwnd, &rc, 0); ! FillRect((HDC)wParam, &rc, perlud->hBackgroundBrush); ! return (LRESULT) 1; } break; --- 76,91 ---- perlud = (LPPERLWIN32GUI_USERDATA) GetWindowLong((HWND) hwnd, GWL_USERDATA); if(perlud && (perlud->dwPlStyle & PERLWIN32GUI_FLICKERFREE)) { ! return (LRESULT) 1; } // If we're a window and we have a background brush, then use it ! if(perlud && perlud->hBackgroundBrush && (perlud->iClass == WIN32__GUI__WINDOW || ! perlud->iClass == WIN32__GUI__DIALOG || ! perlud->iClass == WIN32__GUI__SPLITTER) ) { ! // Although this looks like we paint the whole of the background ! // the HDC passed in wParam is clipped to the update region ! RECT rc; ! GetClientRect(hwnd, &rc); ! FillRect((HDC)wParam, &rc, perlud->hBackgroundBrush); ! return (LRESULT) 1; } break; *************** *** 95,103 **** if( ValidUserData(perlud) ) { if(uMsg == WM_CTLCOLORSTATIC) { ! if(perlud->iClass == WIN32__GUI__EDIT) // Read-only Edit control ! SetBkColor((HDC) wParam, GetSysColor(COLOR_BTNFACE)); ! else ! SetBkMode((HDC) wParam, TRANSPARENT); ! } if(perlud->clrForeground != CLR_INVALID) SetTextColor((HDC) wParam, perlud->clrForeground); --- 98,106 ---- if( ValidUserData(perlud) ) { if(uMsg == WM_CTLCOLORSTATIC) { ! if(perlud->iClass == WIN32__GUI__EDIT) // Read-only Edit control ! SetBkColor((HDC) wParam, GetSysColor(COLOR_BTNFACE)); ! else ! SetBkMode((HDC) wParam, TRANSPARENT); ! } if(perlud->clrForeground != CLR_INVALID) SetTextColor((HDC) wParam, perlud->clrForeground); *************** *** 108,114 **** } ! DWORD hbrBackground; ! if(hbrBackground = GetClassLong((HWND)lParam, GCL_HBRBACKGROUND)) ! return ((LRESULT) hbrBackground); switch(uMsg) { --- 111,117 ---- } ! DWORD hbrBackground; ! if(hbrBackground = GetClassLong((HWND)lParam, GCL_HBRBACKGROUND)) ! return ((LRESULT) hbrBackground); switch(uMsg) { *************** *** 153,156 **** --- 156,172 ---- break; } + + case WM_NEXTDLGCTL: + { + perlud = (LPPERLWIN32GUI_USERDATA) GetWindowLong(hwnd, GWL_USERDATA); + if( ValidUserData(perlud) && (perlud->dwPlStyle & PERLWIN32GUI_DIALOGUI) ) { + if(LOWORD(lParam)) + SetFocus((HWND)wParam); + else + SetFocus(GetNextDlgTabItem(hwnd, GetFocus(), (BOOL)wParam)); + + return 0; + } + } } #ifdef PERLWIN32GUI_STRONGDEBUG *************** *** 596,601 **** /* * (@)EVENT:MouseEvent(MSG) ! * Sent when the user performs a mouse event on * a NotifyIcon; MSG is the message code. * (@)APPLIES_TO:NotifyIcon */ --- 612,619 ---- /* * (@)EVENT:MouseEvent(MSG) ! * Sent when the user performs any other mouse event on * a NotifyIcon; MSG is the message code. + * For shell.dll greater than V6 will also fire for balloon + * events. * (@)APPLIES_TO:NotifyIcon */