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 ______________________________________________________________________