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 #if (GTK_MINOR_VERSION > 0)
145 gtk_frame_configure_callback( GtkWidget
*WXUNUSED(widget
), GdkEventConfigure
*WXUNUSED(event
), wxTopLevelWindowGTK
*win
)
147 gtk_frame_configure_callback( GtkWidget
*WXUNUSED(widget
), GdkEventConfigure
*event
, wxTopLevelWindowGTK
*win
)
151 wxapp_install_idle_handler();
156 #if (GTK_MINOR_VERSION > 0)
159 gdk_window_get_root_origin( win
->m_widget
->window
, &x
, &y
);
167 wxMoveEvent
mevent( wxPoint(win
->m_x
,win
->m_y
), win
->GetId() );
168 mevent
.SetEventObject( win
);
169 win
->GetEventHandler()->ProcessEvent( mevent
);
174 //-----------------------------------------------------------------------------
175 // "realize" from m_widget
176 //-----------------------------------------------------------------------------
178 /* we cannot MWM hints and icons before the widget has been realized,
179 so we do this directly after realization */
182 gtk_frame_realized_callback( GtkWidget
* WXUNUSED(widget
), wxTopLevelWindowGTK
*win
)
185 wxapp_install_idle_handler();
187 /* All this is for Motif Window Manager "hints" and is supposed to be
188 recognized by other WM as well. Not tested. */
189 gdk_window_set_decorations(win
->m_widget
->window
,
190 (GdkWMDecoration
)win
->m_gdkDecor
);
191 gdk_window_set_functions(win
->m_widget
->window
,
192 (GdkWMFunction
)win
->m_gdkFunc
);
194 /* GTK's shrinking/growing policy */
195 if ((win
->m_gdkFunc
& GDK_FUNC_RESIZE
) == 0)
196 gtk_window_set_policy(GTK_WINDOW(win
->m_widget
), 0, 0, 1);
198 gtk_window_set_policy(GTK_WINDOW(win
->m_widget
), 1, 1, 1);
201 wxIcon iconOld
= win
->GetIcon();
202 if ( iconOld
!= wxNullIcon
)
204 wxIcon
icon( iconOld
);
205 win
->SetIcon( wxNullIcon
);
206 win
->SetIcon( icon
);
209 /* we set the focus to the child that accepts the focus. this
210 doesn't really have to be done in "realize" but why not? */
211 wxWindowList::Node
*node
= win
->GetChildren().GetFirst();
214 wxWindow
*child
= node
->GetData();
215 if (child
->AcceptsFocus())
221 node
= node
->GetNext();
225 //-----------------------------------------------------------------------------
226 // "map_event" from m_widget
227 //-----------------------------------------------------------------------------
230 gtk_frame_map_callback( GtkWidget
* WXUNUSED(widget
),
231 GdkEvent
* WXUNUSED(event
),
232 wxTopLevelWindow
*win
)
234 win
->SetIconizeState(FALSE
);
237 //-----------------------------------------------------------------------------
238 // "unmap_event" from m_widget
239 //-----------------------------------------------------------------------------
242 gtk_frame_unmap_callback( GtkWidget
* WXUNUSED(widget
),
243 GdkEvent
* WXUNUSED(event
),
244 wxTopLevelWindow
*win
)
246 win
->SetIconizeState(TRUE
);
249 //-----------------------------------------------------------------------------
250 // "expose_event" of m_client
251 //-----------------------------------------------------------------------------
253 static int gtk_window_expose_callback( GtkWidget
*widget
, GdkEventExpose
*gdk_event
, wxWindow
*win
)
255 GtkPizza
*pizza
= GTK_PIZZA(widget
);
257 gtk_paint_flat_box (win
->m_widget
->style
, pizza
->bin_window
, GTK_STATE_NORMAL
,
258 GTK_SHADOW_NONE
, &gdk_event
->area
, win
->m_widget
, "base", 0, 0, -1, -1);
263 //-----------------------------------------------------------------------------
264 // "draw" of m_client
265 //-----------------------------------------------------------------------------
268 static void gtk_window_draw_callback( GtkWidget
*widget
, GdkRectangle
*rect
, wxWindow
*win
)
270 GtkPizza
*pizza
= GTK_PIZZA(widget
);
272 gtk_paint_flat_box (win
->m_widget
->style
, pizza
->bin_window
, GTK_STATE_NORMAL
,
273 GTK_SHADOW_NONE
, rect
, win
->m_widget
, "base", 0, 0, -1, -1);
276 // ----------------------------------------------------------------------------
277 // wxTopLevelWindowGTK itself
278 // ----------------------------------------------------------------------------
280 //-----------------------------------------------------------------------------
281 // InsertChild for wxTopLevelWindowGTK
282 //-----------------------------------------------------------------------------
284 /* Callback for wxTopLevelWindowGTK. This very strange beast has to be used because
285 * C++ has no virtual methods in a constructor. We have to emulate a
286 * virtual function here as wxWindows requires different ways to insert
287 * a child in container classes. */
289 static void wxInsertChildInTopLevelWindow( wxTopLevelWindowGTK
* parent
, wxWindow
* child
)
291 wxASSERT( GTK_IS_WIDGET(child
->m_widget
) );
293 if (!parent
->m_insertInClientArea
)
295 /* these are outside the client area */
296 wxTopLevelWindowGTK
* frame
= (wxTopLevelWindowGTK
*) parent
;
297 gtk_pizza_put( GTK_PIZZA(frame
->m_mainWidget
),
298 GTK_WIDGET(child
->m_widget
),
306 /* these are inside the client area */
307 gtk_pizza_put( GTK_PIZZA(parent
->m_wxwindow
),
308 GTK_WIDGET(child
->m_widget
),
315 /* resize on OnInternalIdle */
316 parent
->GtkUpdateSize();
319 // ----------------------------------------------------------------------------
320 // wxTopLevelWindowGTK creation
321 // ----------------------------------------------------------------------------
323 void wxTopLevelWindowGTK::Init()
328 m_mainWidget
= (GtkWidget
*) NULL
;
329 m_insertInClientArea
= TRUE
;
331 m_isIconized
= FALSE
;
332 m_fsIsShowing
= FALSE
;
333 m_themeEnabled
= TRUE
;
334 m_gdkDecor
= m_gdkFunc
= 0;
337 bool wxTopLevelWindowGTK::Create( wxWindow
*parent
,
339 const wxString
& title
,
341 const wxSize
& sizeOrig
,
343 const wxString
&name
)
345 // always create a frame of some reasonable, even if arbitrary, size (at
346 // least for MSW compatibility)
347 wxSize size
= sizeOrig
;
348 if ( size
.x
== -1 || size
.y
== -1 )
350 wxSize sizeDpy
= wxGetDisplaySize();
352 size
.x
= sizeDpy
.x
/ 3;
354 size
.y
= sizeDpy
.y
/ 5;
357 wxTopLevelWindows
.Append( this );
359 m_needParent
= FALSE
;
361 if (!PreCreation( parent
, pos
, size
) ||
362 !CreateBase( parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
))
364 wxFAIL_MSG( wxT("wxTopLevelWindowGTK creation failed") );
370 m_insertCallback
= (wxInsertChildFunction
) wxInsertChildInTopLevelWindow
;
372 GtkWindowType win_type
= GTK_WINDOW_TOPLEVEL
;
374 if (style
& wxFRAME_TOOL_WINDOW
)
375 win_type
= GTK_WINDOW_POPUP
;
377 if (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG
)
378 win_type
= GTK_WINDOW_DIALOG
;
380 m_widget
= gtk_window_new( win_type
);
382 if (m_parent
&& (GTK_IS_WINDOW(m_parent
->m_widget
)) &&
383 (HasFlag(wxFRAME_FLOAT_ON_PARENT
) || (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG
)))
385 gtk_window_set_transient_for( GTK_WINDOW(m_widget
), GTK_WINDOW(m_parent
->m_widget
) );
389 gtk_window_set_wmclass( GTK_WINDOW(m_widget
), name
.mb_str(), name
.mb_str() );
392 debug_focus_in( m_widget
, wxT("wxTopLevelWindowGTK::m_widget"), name
);
395 gtk_window_set_title( GTK_WINDOW(m_widget
), title
.mbc_str() );
396 GTK_WIDGET_UNSET_FLAGS( m_widget
, GTK_CAN_FOCUS
);
398 gtk_signal_connect( GTK_OBJECT(m_widget
), "delete_event",
399 GTK_SIGNAL_FUNC(gtk_frame_delete_callback
), (gpointer
)this );
401 /* m_mainWidget holds the toolbar, the menubar and the client area */
402 m_mainWidget
= gtk_pizza_new();
403 gtk_widget_show( m_mainWidget
);
404 GTK_WIDGET_UNSET_FLAGS( m_mainWidget
, GTK_CAN_FOCUS
);
405 gtk_container_add( GTK_CONTAINER(m_widget
), m_mainWidget
);
407 /* for m_mainWidget themes */
408 gtk_signal_connect( GTK_OBJECT(m_mainWidget
), "expose_event",
409 GTK_SIGNAL_FUNC(gtk_window_expose_callback
), (gpointer
)this );
410 gtk_signal_connect( GTK_OBJECT(m_mainWidget
), "draw",
411 GTK_SIGNAL_FUNC(gtk_window_draw_callback
), (gpointer
)this );
414 debug_focus_in( m_mainWidget
, wxT("wxTopLevelWindowGTK::m_mainWidget"), name
);
417 /* m_wxwindow only represents the client area without toolbar and menubar */
418 m_wxwindow
= gtk_pizza_new();
419 gtk_widget_show( m_wxwindow
);
420 gtk_container_add( GTK_CONTAINER(m_mainWidget
), m_wxwindow
);
423 debug_focus_in( m_wxwindow
, wxT("wxTopLevelWindowGTK::m_wxwindow"), name
);
426 /* we donm't allow the frame to get the focus as otherwise
427 the frame will grab it at arbitrary focus changes. */
428 GTK_WIDGET_UNSET_FLAGS( m_wxwindow
, GTK_CAN_FOCUS
);
430 if (m_parent
) m_parent
->AddChild( this );
432 /* the user resized the frame by dragging etc. */
433 gtk_signal_connect( GTK_OBJECT(m_widget
), "size_allocate",
434 GTK_SIGNAL_FUNC(gtk_frame_size_callback
), (gpointer
)this );
438 if ((m_x
!= -1) || (m_y
!= -1))
439 gtk_widget_set_uposition( m_widget
, m_x
, m_y
);
440 gtk_widget_set_usize( m_widget
, m_width
, m_height
);
442 /* we cannot set MWM hints and icons before the widget has
443 been realized, so we do this directly after realization */
444 gtk_signal_connect( GTK_OBJECT(m_widget
), "realize",
445 GTK_SIGNAL_FUNC(gtk_frame_realized_callback
), (gpointer
) this );
447 /* the only way to get the window size is to connect to this event */
448 gtk_signal_connect( GTK_OBJECT(m_widget
), "configure_event",
449 GTK_SIGNAL_FUNC(gtk_frame_configure_callback
), (gpointer
)this );
451 /* map and unmap for iconized state */
452 gtk_signal_connect( GTK_OBJECT(m_widget
), "map_event",
453 GTK_SIGNAL_FUNC(gtk_frame_map_callback
), (gpointer
)this );
454 gtk_signal_connect( GTK_OBJECT(m_widget
), "unmap_event",
455 GTK_SIGNAL_FUNC(gtk_frame_unmap_callback
), (gpointer
)this );
457 /* the only way to get the window size is to connect to this event */
458 gtk_signal_connect( GTK_OBJECT(m_widget
), "configure_event",
459 GTK_SIGNAL_FUNC(gtk_frame_configure_callback
), (gpointer
)this );
461 /* disable native tab traversal */
462 gtk_signal_connect( GTK_OBJECT(m_widget
), "focus",
463 GTK_SIGNAL_FUNC(gtk_frame_focus_callback
), (gpointer
)this );
467 if ((m_miniEdge
> 0) || (style
& wxSIMPLE_BORDER
) || (style
& wxNO_BORDER
))
474 m_gdkDecor
= (long) GDK_DECOR_BORDER
;
475 m_gdkFunc
= (long) GDK_FUNC_MOVE
;
477 // All this is for Motif Window Manager "hints" and is supposed to be
478 // recognized by other WM as well. Not tested.
479 if ((style
& wxCAPTION
) != 0)
480 m_gdkDecor
|= GDK_DECOR_TITLE
;
481 if ((style
& wxSYSTEM_MENU
) != 0)
483 m_gdkFunc
|= GDK_FUNC_CLOSE
;
484 m_gdkDecor
|= GDK_DECOR_MENU
;
486 if ((style
& wxMINIMIZE_BOX
) != 0)
488 m_gdkFunc
|= GDK_FUNC_MINIMIZE
;
489 m_gdkDecor
|= GDK_DECOR_MINIMIZE
;
491 if ((style
& wxMAXIMIZE_BOX
) != 0)
493 m_gdkFunc
|= GDK_FUNC_MAXIMIZE
;
494 m_gdkDecor
|= GDK_DECOR_MAXIMIZE
;
496 if ((style
& wxRESIZE_BORDER
) != 0)
498 m_gdkFunc
|= GDK_FUNC_RESIZE
;
499 m_gdkDecor
|= GDK_DECOR_RESIZEH
;
506 wxTopLevelWindowGTK::~wxTopLevelWindowGTK()
508 m_isBeingDeleted
= TRUE
;
510 wxTopLevelWindows
.DeleteObject( this );
512 if (wxTheApp
->GetTopWindow() == this)
513 wxTheApp
->SetTopWindow( (wxWindow
*) NULL
);
515 if ((wxTopLevelWindows
.Number() == 0) &&
516 (wxTheApp
->GetExitOnFrameDelete()))
518 wxTheApp
->ExitMainLoop();
522 bool wxTopLevelWindowGTK::ShowFullScreen(bool show
, long style
)
524 if (show
== m_fsIsShowing
) return FALSE
; // return what?
526 m_fsIsShowing
= show
;
530 m_fsSaveGdkFunc
= m_gdkFunc
;
531 m_fsSaveGdkDecor
= m_gdkDecor
;
532 m_fsSaveFlag
= style
;
533 GetPosition( &m_fsSaveFrame
.x
, &m_fsSaveFrame
.y
);
534 GetSize( &m_fsSaveFrame
.width
, &m_fsSaveFrame
.height
);
536 gtk_widget_hide( m_widget
);
537 gtk_widget_unrealize( m_widget
);
539 m_gdkDecor
= (long) GDK_DECOR_BORDER
;
540 m_gdkFunc
= (long) GDK_FUNC_MOVE
;
544 wxDisplaySize( &x
, &y
);
545 SetSize( 0, 0, x
, y
);
547 gtk_widget_realize( m_widget
);
548 gtk_widget_show( m_widget
);
552 gtk_widget_hide( m_widget
);
553 gtk_widget_unrealize( m_widget
);
555 m_gdkFunc
= m_fsSaveGdkFunc
;
556 m_gdkDecor
= m_fsSaveGdkDecor
;
558 SetSize( m_fsSaveFrame
.x
, m_fsSaveFrame
.y
, m_fsSaveFrame
.width
, m_fsSaveFrame
.height
);
560 gtk_widget_realize( m_widget
);
561 gtk_widget_show( m_widget
);
567 // ----------------------------------------------------------------------------
568 // overridden wxWindow methods
569 // ----------------------------------------------------------------------------
571 bool wxTopLevelWindowGTK::Show( bool show
)
573 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
575 if (show
&& !m_sizeSet
)
577 /* by calling GtkOnSize here, we don't have to call
578 either after showing the frame, which would entail
579 much ugly flicker or from within the size_allocate
580 handler, because GTK 1.1.X forbids that. */
582 GtkOnSize( m_x
, m_y
, m_width
, m_height
);
585 return wxWindow::Show( show
);
588 void wxTopLevelWindowGTK::DoMoveWindow(int WXUNUSED(x
), int WXUNUSED(y
), int WXUNUSED(width
), int WXUNUSED(height
) )
590 wxFAIL_MSG( wxT("DoMoveWindow called for wxTopLevelWindowGTK") );
593 void wxTopLevelWindowGTK::DoSetSize( int x
, int y
, int width
, int height
, int sizeFlags
)
595 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
597 /* this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow */
598 wxASSERT_MSG( (m_wxwindow
!= NULL
), wxT("invalid frame") );
600 /* avoid recursions */
608 int old_width
= m_width
;
609 int old_height
= m_height
;
611 if ((sizeFlags
& wxSIZE_ALLOW_MINUS_ONE
) == 0)
613 if (x
!= -1) m_x
= x
;
614 if (y
!= -1) m_y
= y
;
615 if (width
!= -1) m_width
= width
;
616 if (height
!= -1) m_height
= height
;
627 if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH)
629 if (width == -1) m_width = 80;
632 if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT)
634 if (height == -1) m_height = 26;
638 if ((m_minWidth
!= -1) && (m_width
< m_minWidth
)) m_width
= m_minWidth
;
639 if ((m_minHeight
!= -1) && (m_height
< m_minHeight
)) m_height
= m_minHeight
;
640 if ((m_maxWidth
!= -1) && (m_width
> m_maxWidth
)) m_width
= m_maxWidth
;
641 if ((m_maxHeight
!= -1) && (m_height
> m_maxHeight
)) m_height
= m_maxHeight
;
643 if ((m_x
!= -1) || (m_y
!= -1))
645 if ((m_x
!= old_x
) || (m_y
!= old_y
))
647 gtk_widget_set_uposition( m_widget
, m_x
, m_y
);
651 if ((m_width
!= old_width
) || (m_height
!= old_height
))
653 gtk_widget_set_usize( m_widget
, m_width
, m_height
);
655 /* we set the size in GtkOnSize, i.e. mostly the actual resizing is
656 done either directly before the frame is shown or in idle time
657 so that different calls to SetSize() don't lead to flicker. */
664 void wxTopLevelWindowGTK::DoGetClientSize( int *width
, int *height
) const
666 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
668 wxWindow::DoGetClientSize( width
, height
);
672 *height
-= m_miniEdge
*2 + m_miniTitle
;
676 *width
-= m_miniEdge
*2;
680 void wxTopLevelWindowGTK::DoSetClientSize( int width
, int height
)
682 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
685 width
+ m_miniEdge
*2, height
+ m_miniEdge
*2 + m_miniTitle
, 0);
688 void wxTopLevelWindowGTK::GtkOnSize( int WXUNUSED(x
), int WXUNUSED(y
),
689 int width
, int height
)
691 // due to a bug in gtk, x,y are always 0
695 /* avoid recursions */
696 if (m_resizing
) return;
699 if ( m_wxwindow
== NULL
) return;
704 /* wxMDIChildFrame derives from wxFrame but it _is_ a wxWindow as it uses
705 wxWindow::Create to create it's GTK equivalent. m_mainWidget is only
706 set in wxFrame::Create so it is used to check what kind of frame we
707 have here. if m_mainWidget is NULL it is a wxMDIChildFrame and so we
708 skip the part which handles m_frameMenuBar, m_frameToolBar and (most
709 importantly) m_mainWidget */
711 if ((m_minWidth
!= -1) && (m_width
< m_minWidth
)) m_width
= m_minWidth
;
712 if ((m_minHeight
!= -1) && (m_height
< m_minHeight
)) m_height
= m_minHeight
;
713 if ((m_maxWidth
!= -1) && (m_width
> m_maxWidth
)) m_width
= m_maxWidth
;
714 if ((m_maxHeight
!= -1) && (m_height
> m_maxHeight
)) m_height
= m_maxHeight
;
719 gint flag
= 0; // GDK_HINT_POS;
720 if ((m_minWidth
!= -1) || (m_minHeight
!= -1)) flag
|= GDK_HINT_MIN_SIZE
;
721 if ((m_maxWidth
!= -1) || (m_maxHeight
!= -1)) flag
|= GDK_HINT_MAX_SIZE
;
723 geom
.min_width
= m_minWidth
;
724 geom
.min_height
= m_minHeight
;
725 geom
.max_width
= m_maxWidth
;
726 geom
.max_height
= m_maxHeight
;
727 gtk_window_set_geometry_hints( GTK_WINDOW(m_widget
),
730 (GdkWindowHints
) flag
);
732 /* I revert back to wxGTK's original behaviour. m_mainWidget holds the
733 * menubar, the toolbar and the client area, which is represented by
735 * this hurts in the eye, but I don't want to call SetSize()
736 * because I don't want to call any non-native functions here. */
738 int client_x
= m_miniEdge
;
739 int client_y
= m_miniEdge
+ m_miniTitle
;
740 int client_w
= m_width
- 2*m_miniEdge
;
741 int client_h
= m_height
- 2*m_miniEdge
- m_miniTitle
;
742 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget
),
744 client_x
, client_y
, client_w
, client_h
);
748 /* if there is no m_mainWidget between m_widget and m_wxwindow there
749 is no need to set the size or position of m_wxwindow. */
754 // send size event to frame
755 wxSizeEvent
event( wxSize(m_width
,m_height
), GetId() );
756 event
.SetEventObject( this );
757 GetEventHandler()->ProcessEvent( event
);
762 void wxTopLevelWindowGTK::OnInternalIdle()
764 if (!m_sizeSet
&& GTK_WIDGET_REALIZED(m_wxwindow
))
766 GtkOnSize( m_x
, m_y
, m_width
, m_height
);
768 // we'll come back later
770 wxapp_install_idle_handler();
774 wxWindow::OnInternalIdle();
778 // ----------------------------------------------------------------------------
780 // ----------------------------------------------------------------------------
782 void wxTopLevelWindowGTK::SetTitle( const wxString
&title
)
784 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
787 gtk_window_set_title( GTK_WINDOW(m_widget
), title
.mbc_str() );
790 void wxTopLevelWindowGTK::SetIcon( const wxIcon
&icon
)
792 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
794 wxTopLevelWindowBase::SetIcon(icon
);
799 if (!m_widget
->window
)
802 wxMask
*mask
= icon
.GetMask();
803 GdkBitmap
*bm
= (GdkBitmap
*) NULL
;
804 if (mask
) bm
= mask
->GetBitmap();
806 gdk_window_set_icon( m_widget
->window
, (GdkWindow
*) NULL
, icon
.GetPixmap(), bm
);
809 // ----------------------------------------------------------------------------
810 // frame state: maximized/iconized/normal
811 // ----------------------------------------------------------------------------
813 void wxTopLevelWindowGTK::Maximize(bool WXUNUSED(maximize
))
815 wxFAIL_MSG( _T("not implemented") );
818 bool wxTopLevelWindowGTK::IsMaximized() const
820 // wxFAIL_MSG( _T("not implemented") );
822 // This is an approximation
826 void wxTopLevelWindowGTK::Restore()
828 wxFAIL_MSG( _T("not implemented") );
831 void wxTopLevelWindowGTK::Iconize( bool iconize
)
835 GdkWindow
*window
= m_widget
->window
;
837 // you should do it later, for example from OnCreate() handler
838 wxCHECK_RET( window
, _T("frame not created yet - can't iconize") );
840 XIconifyWindow( GDK_WINDOW_XDISPLAY( window
),
841 GDK_WINDOW_XWINDOW( window
),
842 DefaultScreen( GDK_DISPLAY() ) );
846 bool wxTopLevelWindowGTK::IsIconized() const
851 void wxTopLevelWindowGTK::SetIconizeState(bool iconize
)
853 if ( iconize
!= m_isIconized
)
855 m_isIconized
= iconize
;
856 (void)SendIconizeEvent(iconize
);