Re: [Fwd: Re: displaying of Tk::Optionmenu]
listmail <[email protected]> Thu, 11 Jan 2007 16:36:35 -0500
| Newsgroups | gmane.comp.lang.perl.tk |
|---|---|
| Message-ID | <[email protected]> |
Yes I was and I found that tk.pm has a methods sub that defines each Tk:Menu method as shift->WidgetMethod($name, @_). When I couldn't find WidgetMethod i assumed it was compiled code. Anyway, I finally ended up getting things to work as expected. Thanks for your time. Slaven Rezic wrote: > listmail <[email protected]> writes: > > >> I am hoping this is something very simple and easily answered as I dont >> want to bother you to much for my special >> requirements. >> >> I cannot figure out why I cannot directly modify the post sub in >> Perl/Site/Lib/Tk/Menu.pm and get this to work. >> I added a couple of debug lines and don't see that its getting called, >> yet when I use your code in the main script >> it works as expected. One reason I need to doit this way, is for some >> reason it causes perltray (ActiveState) to not >> exit when an exit is called. Here is the code for post (modified): >> > > Are you confusing post and Post? These two are different methods: Post > (capitalized) is defined as pure perl in Tk/Menu.pm, post (lowercase) > is an internal Tk method. > > >> sub Post >> { >> print "Post called\n"; >> my $menu = shift; >> return unless (defined $menu); >> my $x = shift; >> my $y = shift; >> my $entry = shift; >> >> print "Before X: x% Y: $y\n"; >> if ($y + $menu->reqheight > $menu->screenheight) { >> my $pointery = $menu->pointery; >> $y = $pointery - 15 - $menu->reqheight; >> if ($y < 0) { >> $y = 0; >> } >> } >> print "After X: $x Y: $y\n"; >> >> Unpost(undef) if (defined($Tk::popup) || defined($Tk::postedMb)); >> $menu->PostOverPoint($x,$y,$entry); >> $menu->grabGlobal; >> $Tk::popup = $menu; >> $Tk::focus = $menu->focusCurrent; >> $menu->focus(); >> } >> >> >> >> >> >> >> >> Slaven Rezic wrote: >> >>> listmail <[email protected]> writes: >>> >>> >>> >>>> I figured out it had to do with my existing use statements. I tried >>>> to migrate this code into Tk::Menu::Post >>>> but it doesn't seem to work. During stepping, it looked like Post >>>> wasn't being called when I clicked the Menubutton and that Unpost was. >>>> Weird. I'm not familiar with this *post = sub way of defining things. >>>> Is it a wildcard and it means it is redifining Tk::Menu::Unpost as >>>> well? >>>> >>>> >>> The >>> >>> *function = sub { >>> ... >>> }; >>> >>> is just like >>> >>> sub function { >>> ... >>> } >>> >>> but in the latter form the sub is always created, regardless whether >>> in a negative condition or not. >>> >>> >>> >>>> Anyway thats for the immediate fix, it works. >>>> >>>> -------- Original Message -------- >>>> Subject: Re: displaying of Tk::Optionmenu >>>> Date: Wed, 06 Dec 2006 15:51:52 -0500 >>>> From: listmail <[email protected]> >>>> To: [email protected] >>>> CC: Perl TK Mailing List <[email protected]> >>>> References: <[email protected]> >>>> <[email protected]> >>>> >>>> >>>> >>>> It tried just plopping this is in my script and get a Can't locate >>>> auto/Tk/Widget/Construct.al >>>> error. I'd like to blend your code into the existing Menu.pm post sub >>>> if I can. >>>> >>>> >>>> >>>> >>>> >>>> Slaven Rezic wrote: >>>> >>>> >>>>> listmail <[email protected]> writes: >>>>> >>>>> >>>>> >>>>> >>>>>> A Tk::Optionmenu typically displays it’s drop down list for its >>>>>> options just below the drop down selector. When the Tk::Optionmenu >>>>>> is located close to the bottom of the screen (such as near the >>>>>> windows taskbar) and the option list is too long to have room to >>>>>> display its list below the drop down select, it will display the >>>>>> list upwards which ends up overlapping the menu selector. I suppose >>>>>> the display portion could be something that is handled by the >>>>>> window manger and not necessarily Tk::Optionmen/Tk::Menubutton etc. >>>>>> >>>>>> I would like to have it start displaying the contents from the top >>>>>> of the drop down selector and move upward when the list is too long >>>>>> to display downward. One of the main reasons for this is that is >>>>>> easy for the end user to accidentaly select the wrong option when >>>>>> it overlaps and draws itself under the current mouse position as >>>>>> well. Can anyone give me a clue as to how I could get things work >>>>>> as I describe? Does this problem exist in the more recent versions >>>>>> of Tk? >>>>>> >>>>>> >>>>>> >>>>>> >>>>> Yes, the problem still exists, and it seems to be existent in current >>>>> Tcl/Tk versions, too. Under Unix/X11, there is a similar problem with >>>>> application menus in Tk (I am not sure if the problem is also under >>>>> Windows, maybe there native menus will be used). >>>>> >>>>> To workaround this problem, you can drop the following lines into your >>>>> script. I originally wrote it for the Unix menu problem, but it seems >>>>> to also solve the Optionmenu problem. >>>>> >>>>> >>>>> { >>>>> package Tk::Menu; >>>>> use Tk::Menu; >>>>> my $orig_menu_post; >>>>> BEGIN { >>>>> $orig_menu_post = \&Tk::Menu::post; >>>>> } >>>>> if ($Tk::VERSION < 805) { >>>>> *post = sub { >>>>> my($self, $x, $y) = @_; >>>>> if ($y + $self->reqheight > $self->screenheight) { >>>>> my $pointery = $self->pointery; >>>>> $y = $pointery - 10 - $self->reqheight; >>>>> if ($y < 0) { >>>>> $y = 0; >>>>> } >>>>> } >>>>> $orig_menu_post->($self, $x, $y); >>>>> }; >>>>> } >>>>> } >>>>> >>>>> >>>>> >>>>> Regards, >>>>> Slaven >>>>> >>>>> >>>>> >>>>> >>>> --++**==--++**==--++**==--++**==--++**==--++**==--++**== >>>> ptk mailing list >>>> [email protected] >>>> https://mailman.stanford.edu/mailman/listinfo/ptk >>>> >>>> >>>> >>>> >>>> >>> >>> >> --++**==--++**==--++**==--++**==--++**==--++**==--++**== >> ptk mailing list >> [email protected] >> https://mailman.stanford.edu/mailman/listinfo/ptk >> >> >> > > --++**==--++**==--++**==--++**==--++**==--++**==--++**== ptk mailing list [email protected] https://mailman.stanford.edu/mailman/listinfo/ptk