Thanks Mark!
Will gave that a try.
On Thu, 2012-02-09 at 09:09 +0000, Mark Dootson wrote:
> Hi,
>
> Looks like a potential bug in wxWidgets / GTK interaction.
>
> It appears that showing and moving a dialog in GTK causes a few extra
> things to happen - including repositioning the dialog with respect to
> the parent window if necessary. (code it would seem checks for changed
> parent position and dialog coordinates to see if some movement is
> necessary, amongst other things).
>
> I have pasted a 'workaround' below which should allow you to use
> Wx::Dialog in this way. You must call 'Show' before 'Move' as 'Show'
> will reposition the dialog with respect to the parent. You must call
> 'Move' twice to ensure the internal code does not 'skip' the process by
> assuming a move is not necessary.
>
> I think folks don't hit this bug very often because conceptually a
> Dialog isn't something you would keep hidden and re-show. In most usage
> you would get the user info and destroy the object. You would only have
> a non-modal dialog if you wanted to continue background processing
> whilst asking some questions.
>
> For other top level windows where you don't want or need Wx::Dialog
> features, better to use a Wx::Frame as a base class.
>
> Hope it helps.
>
> Mark
>
>
> sub ButtonClicked
> {
> my( $self, $event ) = @_;
>
> if($self->{dialog_state}==0){
> $self->{dialog}->Show(1);
> $self->{dialog}->MoveXY(99,99);
> $self->{dialog}->MoveXY(100,100);
> $self->{dialog_state}=1;
> }
> else{
> $self->{dialog}->Show(0);
> $self->{dialog_state}=0;
> }
>
> }
>
>
>
> On 08/02/2012 22:39, jeff wrote:
> > One slight correction. That code on ~line 50 should be Movexy(100,100) -
> > some folks might be use to seeing MoveXY, but both work and display the
> > same odd behavior.
> >
> >
> > -------- Forwarded Message --------
> >
> > Have some odd behavior here.
> > Here is a test simple script. It simple opens and closes a non modal
> > dialog by click a button on the main window.
> >
> > On the 1st click it will open the dialog at the requested location.
> > Click the button a 2nd time and it will close.
> > Click it a 3rd time and it will center on parent - hiding the main
> > window.
> > Move it aside.
> > Click it a 4th time and it will close.
> > Click it a 5th time and it will open at the requested location.
> > And on and on., alternating between the two positions.
> >
> > The line of interest is ~ line 50.
> > Having this behavior in many locations in real code :-(
> >
> > Anyone have any ideas? Hopefully we're just being stupid ;-)
> >
> > Jeff
> >
> > ##################################### CUT HERE
> > #################################
> > use strict;
> > use Wx;
> > ###########################################################
> > #
> > # Extend the Frame class to our needs
> > #
> > package MyFrame;
> >
> > use Wx::Event qw( EVT_BUTTON );
> > use Wx qw/:everything/;
> >
> > use base qw/Wx::Frame/; # Inherit from Wx::Frame
> >
> > sub new
> > {
> > my $class = shift;
> >
> > my $self = $class->SUPER::new(@_); # call the superclass' constructor
> >
> > # Then define a Panel to put the button on
> > my $panel = Wx::Panel->new( $self, # parent
> > -1 # id
> > );
> >
> > my $BTNID = 1; # store the id of the button in $BTNID
> >
> > $self->{btn} = Wx::Button->new( $panel, # parent
> > $BTNID, # ButtonID
> > ">>> Press me<<<", # label
> > [50,50] # position
> > );
> >
> > EVT_BUTTON( $self, # Object to bind to
> > $BTNID, # ButtonID
> > \&ButtonClicked # Subroutine to execute
> > );
> >
> > $self->{dialog} = Wx::Dialog->new($self, -1, "test dialog");
> > $self->{dialog_state}=0;
> >
> > return $self;
> > }
> >
> > sub ButtonClicked
> > {
> > my( $self, $event ) = @_;
> >
> > if($self->{dialog_state}==0){
> > $self->{dialog}->MoveXY
> >
> > (100, 100);
> > $self->{dialog}->Show(1);
> > $self->{dialog_state}=1;
> > }
> > else{
> > $self->{dialog}->Show(0);
> > $self->{dialog_state}=0;
> > }
> > }
> >
> > ###########################################################
> > #
> > # Define our ButtonApp2 class that extends Wx::App
> > #
> > package ButtonApp2;
> >
> > use base qw(Wx::App); # Inherit from Wx::App
> >
> > sub OnInit
> > {
> > my $self = shift;
> > my $frame = MyFrame->new( undef, # Parent window
> > -1, # Window id
> > 'Button interaction example', # Title
> > [300,400], # position X, Y
> > [200, 150] # size X, Y
> > );
> > $self->SetTopWindow($frame); # Define the toplevel window
> > $frame->Show(1); # Show the frame
> > }
> >
> > ###########################################################
> > #
> > # The main program
> > #
> > package main;
> >
> > my $wxobj = ButtonApp2->new(); # New ButtonApp application
> > $wxobj->MainLoop;
> >
> >
> >
> >
> > ______________________________________________________________________
> > This email has been scanned by the Symantec Email Security.cloud service.
> > For more information please visit http://www.symanteccloud.com
> > ______________________________________________________________________
> >
> >
>
>
> ______________________________________________________________________
> This email has been scanned by the Symantec Email Security.cloud service.
> For more information please visit http://www.symanteccloud.com
> ______________________________________________________________________