1 ///////////////////////////////////////////////////////////////////////////// 
   4 // Author:      Robert Roebling 
   6 // Copyright:   (c) 1998 Robert Roebling 
   7 // Licence:     wxWindows licence 
   8 ///////////////////////////////////////////////////////////////////////////// 
  10 // ============================================================================ 
  12 // ============================================================================ 
  14 // ---------------------------------------------------------------------------- 
  16 // ---------------------------------------------------------------------------- 
  19     #pragma implementation "toplevel.h" 
  23 #define XIconifyWindow XICONIFYWINDOW 
  28 #include "wx/dialog.h" 
  29 #include "wx/control.h" 
  31 #include "wx/dcclient.h" 
  36 #include <gdk/gdkkeysyms.h> 
  39 #include "wx/gtk/win_gtk.h" 
  41 // ---------------------------------------------------------------------------- 
  43 // ---------------------------------------------------------------------------- 
  45 extern void wxapp_install_idle_handler(); 
  47 extern int g_openDialogs
; 
  49 // ---------------------------------------------------------------------------- 
  51 // ---------------------------------------------------------------------------- 
  53 // ---------------------------------------------------------------------------- 
  55 // ---------------------------------------------------------------------------- 
  57 extern wxList wxPendingDelete
; 
  59 // ---------------------------------------------------------------------------- 
  61 // ---------------------------------------------------------------------------- 
  65 extern void debug_focus_in( GtkWidget
* widget
, const wxChar
* name
, const wxChar 
*window 
); 
  69 // ============================================================================ 
  71 // ============================================================================ 
  73 // ---------------------------------------------------------------------------- 
  75 // ---------------------------------------------------------------------------- 
  77 //----------------------------------------------------------------------------- 
  78 // "focus" from m_window 
  79 //----------------------------------------------------------------------------- 
  81 static gint 
gtk_frame_focus_callback( GtkWidget 
*widget
, GtkDirectionType 
WXUNUSED(d
), wxWindow 
*WXUNUSED(win
) ) 
  84         wxapp_install_idle_handler(); 
  86     // This disables GTK's tab traversal 
  87     gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "focus" ); 
  91 //----------------------------------------------------------------------------- 
  93 //----------------------------------------------------------------------------- 
  95 static void gtk_frame_size_callback( GtkWidget 
*WXUNUSED(widget
), GtkAllocation
* alloc
, wxTopLevelWindowGTK 
*win 
) 
  98         wxapp_install_idle_handler(); 
 103     if ((win
->m_width 
!= alloc
->width
) || (win
->m_height 
!= alloc
->height
)) 
 106         wxPrintf( "OnSize from " ); 
 107         if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) 
 108            wxPrintf( win->GetClassInfo()->GetClassName() ); 
 109         wxPrintf( " %d %d %d %d\n", (int)alloc->x, 
 112                                 (int)alloc->height ); 
 115         win
->m_width 
= alloc
->width
; 
 116         win
->m_height 
= alloc
->height
; 
 117         win
->m_queuedFullRedraw 
= TRUE
; 
 118         win
->GtkUpdateSize(); 
 122 //----------------------------------------------------------------------------- 
 124 //----------------------------------------------------------------------------- 
 126 static gint 
gtk_frame_delete_callback( GtkWidget 
*WXUNUSED(widget
), GdkEvent 
*WXUNUSED(event
), wxTopLevelWindowGTK 
*win 
) 
 129         wxapp_install_idle_handler(); 
 131     if (win
->IsEnabled() && 
 132         (g_openDialogs 
== 0 || (win
->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG
))) 
 139 //----------------------------------------------------------------------------- 
 141 //----------------------------------------------------------------------------- 
 144 gtk_frame_configure_callback( GtkWidget 
*WXUNUSED(widget
), GdkEventConfigure 
*WXUNUSED(event
), wxTopLevelWindowGTK 
*win 
) 
 147         wxapp_install_idle_handler(); 
 154     gdk_window_get_root_origin( win
->m_widget
->window
, &x
, &y 
); 
 158     wxMoveEvent 
mevent( wxPoint(win
->m_x
,win
->m_y
), win
->GetId() ); 
 159     mevent
.SetEventObject( win 
); 
 160     win
->GetEventHandler()->ProcessEvent( mevent 
); 
 165 //----------------------------------------------------------------------------- 
 166 // "realize" from m_widget 
 167 //----------------------------------------------------------------------------- 
 169 // we cannot MWM hints and icons before the widget has been realized, 
 170 // so we do this directly after realization 
 173 gtk_frame_realized_callback( GtkWidget 
* WXUNUSED(widget
), wxTopLevelWindowGTK 
*win 
) 
 176         wxapp_install_idle_handler(); 
 178     // All this is for Motif Window Manager "hints" and is supposed to be 
 179     // recognized by other WM as well. Not tested. 
 180     gdk_window_set_decorations(win
->m_widget
->window
, 
 181                                (GdkWMDecoration
)win
->m_gdkDecor
); 
 182     gdk_window_set_functions(win
->m_widget
->window
, 
 183                                (GdkWMFunction
)win
->m_gdkFunc
); 
 185     // GTK's shrinking/growing policy 
 186     if ((win
->m_gdkFunc 
& GDK_FUNC_RESIZE
) == 0) 
 187         gtk_window_set_policy(GTK_WINDOW(win
->m_widget
), 0, 0, 1); 
 189         gtk_window_set_policy(GTK_WINDOW(win
->m_widget
), 1, 1, 1); 
 192     wxIcon iconOld 
= win
->GetIcon(); 
 193     if ( iconOld 
!= wxNullIcon 
) 
 195         wxIcon 
icon( iconOld 
); 
 196         win
->SetIcon( wxNullIcon 
); 
 197         win
->SetIcon( icon 
); 
 200     // we set the focus to the child that accepts the focus. this 
 201     // doesn't really have to be done in "realize" but why not?  
 202     wxWindowList::Node 
*node 
= win
->GetChildren().GetFirst(); 
 205         wxWindow 
*child 
= node
->GetData(); 
 206         if (child
->AcceptsFocus()) 
 212         node 
= node
->GetNext(); 
 216 //----------------------------------------------------------------------------- 
 217 // "map_event" from m_widget 
 218 //----------------------------------------------------------------------------- 
 221 gtk_frame_map_callback( GtkWidget 
* WXUNUSED(widget
), 
 222                         GdkEvent 
* WXUNUSED(event
), 
 223                         wxTopLevelWindow 
*win 
) 
 225     win
->SetIconizeState(FALSE
); 
 228 //----------------------------------------------------------------------------- 
 229 // "unmap_event" from m_widget 
 230 //----------------------------------------------------------------------------- 
 233 gtk_frame_unmap_callback( GtkWidget 
* WXUNUSED(widget
), 
 234                           GdkEvent 
* WXUNUSED(event
), 
 235                           wxTopLevelWindow 
*win 
) 
 237     win
->SetIconizeState(TRUE
); 
 240 //----------------------------------------------------------------------------- 
 241 // "expose_event" of m_client 
 242 //----------------------------------------------------------------------------- 
 244 static int gtk_window_expose_callback( GtkWidget 
*widget
, GdkEventExpose 
*gdk_event
, wxWindow 
*win 
) 
 246     GtkPizza 
*pizza 
= GTK_PIZZA(widget
); 
 248     gtk_paint_flat_box (win
->m_widget
->style
, pizza
->bin_window
, GTK_STATE_NORMAL
, 
 249                 GTK_SHADOW_NONE
, &gdk_event
->area
, win
->m_widget
, "base", 0, 0, -1, -1); 
 254 //----------------------------------------------------------------------------- 
 255 // "draw" of m_client 
 256 //----------------------------------------------------------------------------- 
 259 static void gtk_window_draw_callback( GtkWidget 
*widget
, GdkRectangle 
*rect
, wxWindow 
*win 
) 
 261     GtkPizza 
*pizza 
= GTK_PIZZA(widget
); 
 263     gtk_paint_flat_box (win
->m_widget
->style
, pizza
->bin_window
, GTK_STATE_NORMAL
, 
 264                 GTK_SHADOW_NONE
, rect
, win
->m_widget
, "base", 0, 0, -1, -1); 
 267 // ---------------------------------------------------------------------------- 
 268 // wxTopLevelWindowGTK itself 
 269 // ---------------------------------------------------------------------------- 
 271 //----------------------------------------------------------------------------- 
 272 // InsertChild for wxTopLevelWindowGTK 
 273 //----------------------------------------------------------------------------- 
 275 /* Callback for wxTopLevelWindowGTK. This very strange beast has to be used because 
 276  * C++ has no virtual methods in a constructor. We have to emulate a 
 277  * virtual function here as wxWindows requires different ways to insert 
 278  * a child in container classes. */ 
 280 static void wxInsertChildInTopLevelWindow( wxTopLevelWindowGTK
* parent
, wxWindow
* child 
) 
 282     wxASSERT( GTK_IS_WIDGET(child
->m_widget
) ); 
 284     if (!parent
->m_insertInClientArea
) 
 286         // these are outside the client area 
 287         wxTopLevelWindowGTK
* frame 
= (wxTopLevelWindowGTK
*) parent
; 
 288         gtk_pizza_put( GTK_PIZZA(frame
->m_mainWidget
), 
 289                          GTK_WIDGET(child
->m_widget
), 
 297         // these are inside the client area 
 298         gtk_pizza_put( GTK_PIZZA(parent
->m_wxwindow
), 
 299                          GTK_WIDGET(child
->m_widget
), 
 306     // resize on OnInternalIdle 
 307     parent
->GtkUpdateSize(); 
 310 // ---------------------------------------------------------------------------- 
 311 // wxTopLevelWindowGTK creation 
 312 // ---------------------------------------------------------------------------- 
 314 void wxTopLevelWindowGTK::Init() 
 319     m_mainWidget 
= (GtkWidget
*) NULL
; 
 320     m_insertInClientArea 
= TRUE
; 
 322     m_isIconized 
= FALSE
; 
 323     m_fsIsShowing 
= FALSE
; 
 324     m_themeEnabled 
= TRUE
; 
 325     m_gdkDecor 
= m_gdkFunc 
= 0; 
 328 bool wxTopLevelWindowGTK::Create( wxWindow 
*parent
, 
 330                                   const wxString
& title
, 
 332                                   const wxSize
& sizeOrig
, 
 334                                   const wxString 
&name 
) 
 336     // always create a frame of some reasonable, even if arbitrary, size (at 
 337     // least for MSW compatibility) 
 338     wxSize size 
= sizeOrig
; 
 339     if ( size
.x 
== -1 || size
.y 
== -1 ) 
 341         wxSize sizeDpy 
= wxGetDisplaySize(); 
 343             size
.x 
= sizeDpy
.x 
/ 3; 
 345             size
.y 
= sizeDpy
.y 
/ 5; 
 348     wxTopLevelWindows
.Append( this ); 
 350     m_needParent 
= FALSE
; 
 352     if (!PreCreation( parent
, pos
, size 
) || 
 353         !CreateBase( parent
, id
, pos
, size
, style
, wxDefaultValidator
, name 
)) 
 355         wxFAIL_MSG( wxT("wxTopLevelWindowGTK creation failed") ); 
 361     m_insertCallback 
= (wxInsertChildFunction
) wxInsertChildInTopLevelWindow
; 
 363     GtkWindowType win_type 
= GTK_WINDOW_TOPLEVEL
; 
 365     if (style 
& wxFRAME_TOOL_WINDOW
) 
 366         win_type 
= GTK_WINDOW_POPUP
; 
 368     if (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG
) 
 369         win_type 
= GTK_WINDOW_DIALOG
; 
 371     m_widget 
= gtk_window_new( win_type 
); 
 373     if (m_parent 
&& (GTK_IS_WINDOW(m_parent
->m_widget
)) && 
 374         (HasFlag(wxFRAME_FLOAT_ON_PARENT
) || (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG
))) 
 376         gtk_window_set_transient_for( GTK_WINDOW(m_widget
), GTK_WINDOW(m_parent
->m_widget
) ); 
 380         gtk_window_set_wmclass( GTK_WINDOW(m_widget
), name
.mb_str(), name
.mb_str() ); 
 383     debug_focus_in( m_widget
, wxT("wxTopLevelWindowGTK::m_widget"), name 
); 
 386     gtk_window_set_title( GTK_WINDOW(m_widget
), title
.mbc_str() ); 
 387     GTK_WIDGET_UNSET_FLAGS( m_widget
, GTK_CAN_FOCUS 
); 
 389     gtk_signal_connect( GTK_OBJECT(m_widget
), "delete_event", 
 390         GTK_SIGNAL_FUNC(gtk_frame_delete_callback
), (gpointer
)this ); 
 392     // m_mainWidget holds the toolbar, the menubar and the client area 
 393     m_mainWidget 
= gtk_pizza_new(); 
 394     gtk_widget_show( m_mainWidget 
); 
 395     GTK_WIDGET_UNSET_FLAGS( m_mainWidget
, GTK_CAN_FOCUS 
); 
 396     gtk_container_add( GTK_CONTAINER(m_widget
), m_mainWidget 
); 
 398     // for m_mainWidget themes 
 399     gtk_signal_connect( GTK_OBJECT(m_mainWidget
), "expose_event", 
 400                 GTK_SIGNAL_FUNC(gtk_window_expose_callback
), (gpointer
)this ); 
 401     gtk_signal_connect( GTK_OBJECT(m_mainWidget
), "draw", 
 402                 GTK_SIGNAL_FUNC(gtk_window_draw_callback
), (gpointer
)this ); 
 405     debug_focus_in( m_mainWidget
, wxT("wxTopLevelWindowGTK::m_mainWidget"), name 
); 
 408     // m_wxwindow only represents the client area without toolbar and menubar 
 409     m_wxwindow 
= gtk_pizza_new(); 
 410     gtk_widget_show( m_wxwindow 
); 
 411     gtk_container_add( GTK_CONTAINER(m_mainWidget
), m_wxwindow 
); 
 414     debug_focus_in( m_wxwindow
, wxT("wxTopLevelWindowGTK::m_wxwindow"), name 
); 
 417     // we donm't allow the frame to get the focus as otherwise 
 418     // the frame will grab it at arbitrary focus changes 
 419     GTK_WIDGET_UNSET_FLAGS( m_wxwindow
, GTK_CAN_FOCUS 
); 
 421     if (m_parent
) m_parent
->AddChild( this ); 
 423     // the user resized the frame by dragging etc. 
 424     gtk_signal_connect( GTK_OBJECT(m_widget
), "size_allocate", 
 425         GTK_SIGNAL_FUNC(gtk_frame_size_callback
), (gpointer
)this ); 
 429     if ((m_x 
!= -1) || (m_y 
!= -1)) 
 430         gtk_widget_set_uposition( m_widget
, m_x
, m_y 
); 
 432     gtk_window_set_default_size( GTK_WINDOW(m_widget
), m_width
, m_height 
); 
 434     //  we cannot set MWM hints and icons before the widget has 
 435     //  been realized, so we do this directly after realization 
 436     gtk_signal_connect( GTK_OBJECT(m_widget
), "realize", 
 437                         GTK_SIGNAL_FUNC(gtk_frame_realized_callback
), (gpointer
) this ); 
 439     // the only way to get the window size is to connect to this event 
 440     gtk_signal_connect( GTK_OBJECT(m_widget
), "configure_event", 
 441         GTK_SIGNAL_FUNC(gtk_frame_configure_callback
), (gpointer
)this ); 
 443     // map and unmap for iconized state 
 444     gtk_signal_connect( GTK_OBJECT(m_widget
), "map_event", 
 445         GTK_SIGNAL_FUNC(gtk_frame_map_callback
), (gpointer
)this ); 
 446     gtk_signal_connect( GTK_OBJECT(m_widget
), "unmap_event", 
 447         GTK_SIGNAL_FUNC(gtk_frame_unmap_callback
), (gpointer
)this ); 
 449     // the only way to get the window size is to connect to this event 
 450     gtk_signal_connect( GTK_OBJECT(m_widget
), "configure_event", 
 451         GTK_SIGNAL_FUNC(gtk_frame_configure_callback
), (gpointer
)this ); 
 453     // disable native tab traversal 
 454     gtk_signal_connect( GTK_OBJECT(m_widget
), "focus", 
 455         GTK_SIGNAL_FUNC(gtk_frame_focus_callback
), (gpointer
)this ); 
 458     if ((m_miniEdge 
> 0) || (style 
& wxSIMPLE_BORDER
) || (style 
& wxNO_BORDER
)) 
 465         m_gdkDecor 
= (long) GDK_DECOR_BORDER
; 
 466         m_gdkFunc 
= (long) GDK_FUNC_MOVE
; 
 468         // All this is for Motif Window Manager "hints" and is supposed to be 
 469         // recognized by other WMs as well. 
 470         if ((style 
& wxCAPTION
) != 0) 
 471             m_gdkDecor 
|= GDK_DECOR_TITLE
; 
 472         if ((style 
& wxSYSTEM_MENU
) != 0) 
 474             m_gdkFunc 
|= GDK_FUNC_CLOSE
; 
 475             m_gdkDecor 
|= GDK_DECOR_MENU
; 
 477         if ((style 
& wxMINIMIZE_BOX
) != 0) 
 479             m_gdkFunc 
|= GDK_FUNC_MINIMIZE
; 
 480             m_gdkDecor 
|= GDK_DECOR_MINIMIZE
; 
 482         if ((style 
& wxMAXIMIZE_BOX
) != 0) 
 484             m_gdkFunc 
|= GDK_FUNC_MAXIMIZE
; 
 485             m_gdkDecor 
|= GDK_DECOR_MAXIMIZE
; 
 487         if ((style 
& wxRESIZE_BORDER
) != 0) 
 489            m_gdkFunc 
|= GDK_FUNC_RESIZE
; 
 490            m_gdkDecor 
|= GDK_DECOR_RESIZEH
; 
 497 wxTopLevelWindowGTK::~wxTopLevelWindowGTK() 
 499     m_isBeingDeleted 
= TRUE
; 
 501     wxTopLevelWindows
.DeleteObject( this ); 
 503     if (wxTheApp
->GetTopWindow() == this) 
 504         wxTheApp
->SetTopWindow( (wxWindow
*) NULL 
); 
 506     if ((wxTopLevelWindows
.Number() == 0) && 
 507         (wxTheApp
->GetExitOnFrameDelete())) 
 509         wxTheApp
->ExitMainLoop(); 
 513 bool wxTopLevelWindowGTK::ShowFullScreen(bool show
, long style 
) 
 515     if (show 
== m_fsIsShowing
) return FALSE
; // return what? 
 517     m_fsIsShowing 
= show
; 
 521         m_fsSaveGdkFunc 
= m_gdkFunc
; 
 522         m_fsSaveGdkDecor 
= m_gdkDecor
; 
 523         m_fsSaveFlag 
= style
; 
 524         GetPosition( &m_fsSaveFrame
.x
, &m_fsSaveFrame
.y 
); 
 525         GetSize( &m_fsSaveFrame
.width
, &m_fsSaveFrame
.height 
); 
 527         gtk_widget_hide( m_widget 
); 
 528         gtk_widget_unrealize( m_widget 
); 
 530         m_gdkDecor 
= (long) GDK_DECOR_BORDER
; 
 531         m_gdkFunc 
= (long) GDK_FUNC_MOVE
; 
 535         wxDisplaySize( &x
, &y 
); 
 536         SetSize( 0, 0, x
, y 
); 
 538         gtk_widget_realize( m_widget 
); 
 539         gtk_widget_show( m_widget 
); 
 543         gtk_widget_hide( m_widget 
); 
 544         gtk_widget_unrealize( m_widget 
); 
 546         m_gdkFunc 
= m_fsSaveGdkFunc
; 
 547         m_gdkDecor 
= m_fsSaveGdkDecor
; 
 549         SetSize( m_fsSaveFrame
.x
, m_fsSaveFrame
.y
, m_fsSaveFrame
.width
, m_fsSaveFrame
.height 
); 
 551         gtk_widget_realize( m_widget 
); 
 552         gtk_widget_show( m_widget 
); 
 558 // ---------------------------------------------------------------------------- 
 559 // overridden wxWindow methods 
 560 // ---------------------------------------------------------------------------- 
 562 bool wxTopLevelWindowGTK::Show( bool show 
) 
 564     wxASSERT_MSG( (m_widget 
!= NULL
), wxT("invalid frame") ); 
 566     if (show 
&& !m_sizeSet
) 
 568         /* by calling GtkOnSize here, we don't have to call 
 569            either after showing the frame, which would entail 
 570            much ugly flicker or from within the size_allocate 
 571            handler, because GTK 1.1.X forbids that. */ 
 573         GtkOnSize( m_x
, m_y
, m_width
, m_height 
); 
 576     return wxWindow::Show( show 
); 
 579 void wxTopLevelWindowGTK::DoMoveWindow(int WXUNUSED(x
), int WXUNUSED(y
), int WXUNUSED(width
), int WXUNUSED(height
) ) 
 581     wxFAIL_MSG( wxT("DoMoveWindow called for wxTopLevelWindowGTK") ); 
 584 void wxTopLevelWindowGTK::DoSetSize( int x
, int y
, int width
, int height
, int sizeFlags 
) 
 586     wxASSERT_MSG( (m_widget 
!= NULL
), wxT("invalid frame") ); 
 588     // this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow 
 589     wxASSERT_MSG( (m_wxwindow 
!= NULL
), wxT("invalid frame") ); 
 599     int old_width 
= m_width
; 
 600     int old_height 
= m_height
; 
 602     if ((sizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
) == 0) 
 604         if (x 
!= -1) m_x 
= x
; 
 605         if (y 
!= -1) m_y 
= y
; 
 606         if (width 
!= -1) m_width 
= width
; 
 607         if (height 
!= -1) m_height 
= height
; 
 618     if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH) 
 620         if (width == -1) m_width = 80; 
 623     if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT) 
 625        if (height == -1) m_height = 26; 
 629     if ((m_minWidth 
!= -1) && (m_width 
< m_minWidth
)) m_width 
= m_minWidth
; 
 630     if ((m_minHeight 
!= -1) && (m_height 
< m_minHeight
)) m_height 
= m_minHeight
; 
 631     if ((m_maxWidth 
!= -1) && (m_width 
> m_maxWidth
)) m_width 
= m_maxWidth
; 
 632     if ((m_maxHeight 
!= -1) && (m_height 
> m_maxHeight
)) m_height 
= m_maxHeight
; 
 634     if ((m_x 
!= -1) || (m_y 
!= -1)) 
 636         if ((m_x 
!= old_x
) || (m_y 
!= old_y
)) 
 638             gtk_widget_set_uposition( m_widget
, m_x
, m_y 
); 
 642     if ((m_width 
!= old_width
) || (m_height 
!= old_height
)) 
 644         if (m_widget
->window
) 
 645             gdk_window_resize( m_widget
->window
, m_width
, m_height 
); 
 647             gtk_window_set_default_size( GTK_WINDOW(m_widget
), m_width
, m_height 
); 
 649         /* we set the size in GtkOnSize, i.e. mostly the actual resizing is 
 650            done either directly before the frame is shown or in idle time 
 651            so that different calls to SetSize() don't lead to flicker. */ 
 658 void wxTopLevelWindowGTK::DoGetClientSize( int *width
, int *height 
) const 
 660     wxASSERT_MSG( (m_widget 
!= NULL
), wxT("invalid frame") ); 
 662     wxWindow::DoGetClientSize( width
, height 
); 
 666         *height 
-= m_miniEdge
*2 + m_miniTitle
; 
 670         *width 
-= m_miniEdge
*2; 
 674 void wxTopLevelWindowGTK::DoSetClientSize( int width
, int height 
) 
 676     wxASSERT_MSG( (m_widget 
!= NULL
), wxT("invalid frame") ); 
 679               width 
+ m_miniEdge
*2, height  
+ m_miniEdge
*2 + m_miniTitle
, 0); 
 682 void wxTopLevelWindowGTK::GtkOnSize( int WXUNUSED(x
), int WXUNUSED(y
), 
 683                                      int width
, int height 
) 
 685     // due to a bug in gtk, x,y are always 0 
 690     if (m_resizing
) return; 
 693     if ( m_wxwindow 
== NULL 
) return; 
 698     /* wxMDIChildFrame derives from wxFrame but it _is_ a wxWindow as it uses 
 699        wxWindow::Create to create it's GTK equivalent. m_mainWidget is only 
 700        set in wxFrame::Create so it is used to check what kind of frame we 
 701        have here. if m_mainWidget is NULL it is a wxMDIChildFrame and so we 
 702        skip the part which handles m_frameMenuBar, m_frameToolBar and (most 
 703        importantly) m_mainWidget */ 
 705     if ((m_minWidth 
!= -1) && (m_width 
< m_minWidth
)) m_width 
= m_minWidth
; 
 706     if ((m_minHeight 
!= -1) && (m_height 
< m_minHeight
)) m_height 
= m_minHeight
; 
 707     if ((m_maxWidth 
!= -1) && (m_width 
> m_maxWidth
)) m_width 
= m_maxWidth
; 
 708     if ((m_maxHeight 
!= -1) && (m_height 
> m_maxHeight
)) m_height 
= m_maxHeight
; 
 713         gint flag 
= 0; // GDK_HINT_POS; 
 714         if ((m_minWidth 
!= -1) || (m_minHeight 
!= -1)) flag 
|= GDK_HINT_MIN_SIZE
; 
 715         if ((m_maxWidth 
!= -1) || (m_maxHeight 
!= -1)) flag 
|= GDK_HINT_MAX_SIZE
; 
 717         geom
.min_width 
= m_minWidth
; 
 718         geom
.min_height 
= m_minHeight
; 
 719         geom
.max_width 
= m_maxWidth
; 
 720         geom
.max_height 
= m_maxHeight
; 
 721         gtk_window_set_geometry_hints( GTK_WINDOW(m_widget
), 
 724                                        (GdkWindowHints
) flag 
); 
 726         /* I revert back to wxGTK's original behaviour. m_mainWidget holds the 
 727          * menubar, the toolbar and the client area, which is represented by 
 729          * this hurts in the eye, but I don't want to call SetSize() 
 730          * because I don't want to call any non-native functions here. */ 
 732         int client_x 
= m_miniEdge
; 
 733         int client_y 
= m_miniEdge 
+ m_miniTitle
; 
 734         int client_w 
= m_width 
- 2*m_miniEdge
; 
 735         int client_h 
= m_height 
- 2*m_miniEdge 
- m_miniTitle
; 
 736         gtk_pizza_set_size( GTK_PIZZA(m_mainWidget
), 
 738                               client_x
, client_y
, client_w
, client_h 
); 
 742         // If there is no m_mainWidget between m_widget and m_wxwindow there 
 743         // is no need to set the size or position of m_wxwindow. 
 748     // send size event to frame 
 749     wxSizeEvent 
event( wxSize(m_width
,m_height
), GetId() ); 
 750     event
.SetEventObject( this ); 
 751     GetEventHandler()->ProcessEvent( event 
); 
 756 void wxTopLevelWindowGTK::OnInternalIdle() 
 758     if (!m_sizeSet 
&& GTK_WIDGET_REALIZED(m_wxwindow
)) 
 760         GtkOnSize( m_x
, m_y
, m_width
, m_height 
); 
 762         // we'll come back later 
 764             wxapp_install_idle_handler(); 
 768     wxWindow::OnInternalIdle(); 
 772 // ---------------------------------------------------------------------------- 
 774 // ---------------------------------------------------------------------------- 
 776 void wxTopLevelWindowGTK::SetTitle( const wxString 
&title 
) 
 778     wxASSERT_MSG( (m_widget 
!= NULL
), wxT("invalid frame") ); 
 781     gtk_window_set_title( GTK_WINDOW(m_widget
), title
.mbc_str() ); 
 784 void wxTopLevelWindowGTK::SetIcon( const wxIcon 
&icon 
) 
 786     wxASSERT_MSG( (m_widget 
!= NULL
), wxT("invalid frame") ); 
 788     wxTopLevelWindowBase::SetIcon(icon
); 
 793     if (!m_widget
->window
) 
 796     wxMask 
*mask 
= icon
.GetMask(); 
 797     GdkBitmap 
*bm 
= (GdkBitmap 
*) NULL
; 
 798     if (mask
) bm 
= mask
->GetBitmap(); 
 800     gdk_window_set_icon( m_widget
->window
, (GdkWindow 
*) NULL
, icon
.GetPixmap(), bm 
); 
 803 // ---------------------------------------------------------------------------- 
 804 // frame state: maximized/iconized/normal 
 805 // ---------------------------------------------------------------------------- 
 807 void wxTopLevelWindowGTK::Maximize(bool WXUNUSED(maximize
)) 
 809     wxFAIL_MSG( _T("not implemented") ); 
 812 bool wxTopLevelWindowGTK::IsMaximized() const 
 814   //    wxFAIL_MSG( _T("not implemented") ); 
 816     // This is an approximation 
 820 void wxTopLevelWindowGTK::Restore() 
 822     wxFAIL_MSG( _T("not implemented") ); 
 825 void wxTopLevelWindowGTK::Iconize( bool iconize 
) 
 829        GdkWindow 
*window 
= m_widget
->window
; 
 831        // you should do it later, for example from OnCreate() handler 
 832        wxCHECK_RET( window
, _T("frame not created yet - can't iconize") ); 
 834        XIconifyWindow( GDK_WINDOW_XDISPLAY( window 
), 
 835                        GDK_WINDOW_XWINDOW( window 
), 
 836                        DefaultScreen( GDK_DISPLAY() ) ); 
 840 bool wxTopLevelWindowGTK::IsIconized() const 
 845 void wxTopLevelWindowGTK::SetIconizeState(bool iconize
) 
 847     if ( iconize 
!= m_isIconized 
) 
 849         m_isIconized 
= iconize
; 
 850         (void)SendIconizeEvent(iconize
);