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 #include "wx/unix/utilsx11.h"
43 // ----------------------------------------------------------------------------
45 // ----------------------------------------------------------------------------
47 extern void wxapp_install_idle_handler();
49 extern int g_openDialogs
;
51 // ----------------------------------------------------------------------------
53 // ----------------------------------------------------------------------------
55 // ----------------------------------------------------------------------------
57 // ----------------------------------------------------------------------------
59 extern wxList wxPendingDelete
;
61 // ----------------------------------------------------------------------------
63 // ----------------------------------------------------------------------------
67 extern void debug_focus_in( GtkWidget
* widget
, const wxChar
* name
, const wxChar
*window
);
71 // ============================================================================
73 // ============================================================================
75 // ----------------------------------------------------------------------------
77 // ----------------------------------------------------------------------------
79 //-----------------------------------------------------------------------------
80 // "focus" from m_window
81 //-----------------------------------------------------------------------------
83 static gint
gtk_frame_focus_callback( GtkWidget
*widget
, GtkDirectionType
WXUNUSED(d
), wxWindow
*WXUNUSED(win
) )
86 wxapp_install_idle_handler();
88 // This disables GTK's tab traversal
89 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "focus" );
93 //-----------------------------------------------------------------------------
95 //-----------------------------------------------------------------------------
97 static void gtk_frame_size_callback( GtkWidget
*WXUNUSED(widget
), GtkAllocation
* alloc
, wxTopLevelWindowGTK
*win
)
100 wxapp_install_idle_handler();
105 if ((win
->m_width
!= alloc
->width
) || (win
->m_height
!= alloc
->height
))
108 wxPrintf( "OnSize from " );
109 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
110 wxPrintf( win->GetClassInfo()->GetClassName() );
111 wxPrintf( " %d %d %d %d\n", (int)alloc->x,
114 (int)alloc->height );
117 win
->m_width
= alloc
->width
;
118 win
->m_height
= alloc
->height
;
119 win
->m_queuedFullRedraw
= TRUE
;
120 win
->GtkUpdateSize();
124 //-----------------------------------------------------------------------------
126 //-----------------------------------------------------------------------------
128 static gint
gtk_frame_delete_callback( GtkWidget
*WXUNUSED(widget
), GdkEvent
*WXUNUSED(event
), wxTopLevelWindowGTK
*win
)
131 wxapp_install_idle_handler();
133 if (win
->IsEnabled() &&
134 (g_openDialogs
== 0 || (win
->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG
)))
141 //-----------------------------------------------------------------------------
143 //-----------------------------------------------------------------------------
146 gtk_frame_configure_callback( GtkWidget
*WXUNUSED(widget
), GdkEventConfigure
*WXUNUSED(event
), wxTopLevelWindowGTK
*win
)
149 wxapp_install_idle_handler();
151 if (!win
->m_hasVMT
|| !win
->IsShown())
156 gdk_window_get_root_origin( win
->m_widget
->window
, &x
, &y
);
160 wxMoveEvent
mevent( wxPoint(win
->m_x
,win
->m_y
), win
->GetId() );
161 mevent
.SetEventObject( win
);
162 win
->GetEventHandler()->ProcessEvent( mevent
);
167 //-----------------------------------------------------------------------------
168 // "realize" from m_widget
169 //-----------------------------------------------------------------------------
171 // we cannot MWM hints and icons before the widget has been realized,
172 // so we do this directly after realization
175 gtk_frame_realized_callback( GtkWidget
* WXUNUSED(widget
), wxTopLevelWindowGTK
*win
)
178 wxapp_install_idle_handler();
180 // All this is for Motif Window Manager "hints" and is supposed to be
181 // recognized by other WM as well. Not tested.
182 gdk_window_set_decorations(win
->m_widget
->window
,
183 (GdkWMDecoration
)win
->m_gdkDecor
);
184 gdk_window_set_functions(win
->m_widget
->window
,
185 (GdkWMFunction
)win
->m_gdkFunc
);
187 // GTK's shrinking/growing policy
188 if ((win
->m_gdkFunc
& GDK_FUNC_RESIZE
) == 0)
189 gtk_window_set_policy(GTK_WINDOW(win
->m_widget
), 0, 0, 1);
191 gtk_window_set_policy(GTK_WINDOW(win
->m_widget
), 1, 1, 1);
194 wxIconBundle iconsOld
= win
->GetIcons();
195 wxIcon tmp
= iconsOld
.GetIcon( -1 ); // operator != is not-const
196 if ( tmp
!= wxNullIcon
)
198 // wxIconBundle icon( iconOld );
199 win
->SetIcon( wxNullIcon
);
200 win
->SetIcons( iconsOld
);
203 // we set the focus to the child that accepts the focus. this
204 // doesn't really have to be done in "realize" but why not?
205 wxWindowList::Node
*node
= win
->GetChildren().GetFirst();
208 wxWindow
*child
= node
->GetData();
209 if (child
->AcceptsFocus())
215 node
= node
->GetNext();
219 //-----------------------------------------------------------------------------
220 // "map_event" from m_widget
221 //-----------------------------------------------------------------------------
224 gtk_frame_map_callback( GtkWidget
* WXUNUSED(widget
),
225 GdkEvent
* WXUNUSED(event
),
226 wxTopLevelWindow
*win
)
228 win
->SetIconizeState(FALSE
);
231 //-----------------------------------------------------------------------------
232 // "unmap_event" from m_widget
233 //-----------------------------------------------------------------------------
236 gtk_frame_unmap_callback( GtkWidget
* WXUNUSED(widget
),
237 GdkEvent
* WXUNUSED(event
),
238 wxTopLevelWindow
*win
)
240 win
->SetIconizeState(TRUE
);
243 //-----------------------------------------------------------------------------
244 // "expose_event" of m_client
245 //-----------------------------------------------------------------------------
247 static int gtk_window_expose_callback( GtkWidget
*widget
, GdkEventExpose
*gdk_event
, wxWindow
*win
)
249 GtkPizza
*pizza
= GTK_PIZZA(widget
);
251 gtk_paint_flat_box (win
->m_widget
->style
,
252 pizza
->bin_window
, GTK_STATE_NORMAL
,
262 //-----------------------------------------------------------------------------
263 // "draw" of m_client
264 //-----------------------------------------------------------------------------
267 static void gtk_window_draw_callback( GtkWidget
*widget
, GdkRectangle
*rect
, wxWindow
*win
)
269 GtkPizza
*pizza
= GTK_PIZZA(widget
);
271 gtk_paint_flat_box (win
->m_widget
->style
,
272 pizza
->bin_window
, GTK_STATE_NORMAL
,
280 // ----------------------------------------------------------------------------
281 // wxTopLevelWindowGTK itself
282 // ----------------------------------------------------------------------------
284 //-----------------------------------------------------------------------------
285 // InsertChild for wxTopLevelWindowGTK
286 //-----------------------------------------------------------------------------
288 /* Callback for wxTopLevelWindowGTK. This very strange beast has to be used because
289 * C++ has no virtual methods in a constructor. We have to emulate a
290 * virtual function here as wxWindows requires different ways to insert
291 * a child in container classes. */
293 static void wxInsertChildInTopLevelWindow( wxTopLevelWindowGTK
* parent
, wxWindow
* child
)
295 wxASSERT( GTK_IS_WIDGET(child
->m_widget
) );
297 if (!parent
->m_insertInClientArea
)
299 // these are outside the client area
300 wxTopLevelWindowGTK
* frame
= (wxTopLevelWindowGTK
*) parent
;
301 gtk_pizza_put( GTK_PIZZA(frame
->m_mainWidget
),
302 GTK_WIDGET(child
->m_widget
),
310 // these are inside the client area
311 gtk_pizza_put( GTK_PIZZA(parent
->m_wxwindow
),
312 GTK_WIDGET(child
->m_widget
),
319 // resize on OnInternalIdle
320 parent
->GtkUpdateSize();
323 // ----------------------------------------------------------------------------
324 // wxTopLevelWindowGTK creation
325 // ----------------------------------------------------------------------------
327 void wxTopLevelWindowGTK::Init()
332 m_mainWidget
= (GtkWidget
*) NULL
;
333 m_insertInClientArea
= TRUE
;
335 m_isIconized
= FALSE
;
336 m_fsIsShowing
= FALSE
;
337 m_themeEnabled
= TRUE
;
338 m_gdkDecor
= m_gdkFunc
= 0;
341 bool wxTopLevelWindowGTK::Create( wxWindow
*parent
,
343 const wxString
& title
,
345 const wxSize
& sizeOrig
,
347 const wxString
&name
)
349 // always create a frame of some reasonable, even if arbitrary, size (at
350 // least for MSW compatibility)
351 wxSize size
= sizeOrig
;
352 if ( size
.x
== -1 || size
.y
== -1 )
354 wxSize sizeDpy
= wxGetDisplaySize();
356 size
.x
= sizeDpy
.x
/ 3;
358 size
.y
= sizeDpy
.y
/ 5;
361 wxTopLevelWindows
.Append( this );
363 m_needParent
= FALSE
;
365 if (!PreCreation( parent
, pos
, size
) ||
366 !CreateBase( parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
))
368 wxFAIL_MSG( wxT("wxTopLevelWindowGTK creation failed") );
374 m_insertCallback
= (wxInsertChildFunction
) wxInsertChildInTopLevelWindow
;
376 GtkWindowType win_type
= GTK_WINDOW_TOPLEVEL
;
378 if (style
& wxFRAME_TOOL_WINDOW
)
379 win_type
= GTK_WINDOW_POPUP
;
381 if (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG
)
383 // there is no more GTK_WINDOW_DIALOG in 2.0
385 win_type
= GTK_WINDOW_TOPLEVEL
;
387 win_type
= GTK_WINDOW_DIALOG
;
391 m_widget
= gtk_window_new( win_type
);
393 if (m_parent
&& (GTK_IS_WINDOW(m_parent
->m_widget
)) &&
394 (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG
))
396 gtk_window_set_transient_for( GTK_WINDOW(m_widget
), GTK_WINDOW(m_parent
->m_widget
) );
400 gtk_window_set_wmclass( GTK_WINDOW(m_widget
), name
.mb_str(), name
.mb_str() );
403 debug_focus_in( m_widget
, wxT("wxTopLevelWindowGTK::m_widget"), name
);
406 gtk_window_set_title( GTK_WINDOW(m_widget
), title
.mbc_str() );
407 GTK_WIDGET_UNSET_FLAGS( m_widget
, GTK_CAN_FOCUS
);
409 gtk_signal_connect( GTK_OBJECT(m_widget
), "delete_event",
410 GTK_SIGNAL_FUNC(gtk_frame_delete_callback
), (gpointer
)this );
412 // m_mainWidget holds the toolbar, the menubar and the client area
413 m_mainWidget
= gtk_pizza_new();
414 gtk_widget_show( m_mainWidget
);
415 GTK_WIDGET_UNSET_FLAGS( m_mainWidget
, GTK_CAN_FOCUS
);
416 gtk_container_add( GTK_CONTAINER(m_widget
), m_mainWidget
);
418 // for m_mainWidget themes
419 gtk_signal_connect( GTK_OBJECT(m_mainWidget
), "expose_event",
420 GTK_SIGNAL_FUNC(gtk_window_expose_callback
), (gpointer
)this );
421 gtk_signal_connect( GTK_OBJECT(m_mainWidget
), "draw",
422 GTK_SIGNAL_FUNC(gtk_window_draw_callback
), (gpointer
)this );
425 debug_focus_in( m_mainWidget
, wxT("wxTopLevelWindowGTK::m_mainWidget"), name
);
428 // m_wxwindow only represents the client area without toolbar and menubar
429 m_wxwindow
= gtk_pizza_new();
430 gtk_widget_show( m_wxwindow
);
431 gtk_container_add( GTK_CONTAINER(m_mainWidget
), m_wxwindow
);
434 debug_focus_in( m_wxwindow
, wxT("wxTopLevelWindowGTK::m_wxwindow"), name
);
437 // we donm't allow the frame to get the focus as otherwise
438 // the frame will grab it at arbitrary focus changes
439 GTK_WIDGET_UNSET_FLAGS( m_wxwindow
, GTK_CAN_FOCUS
);
441 if (m_parent
) m_parent
->AddChild( this );
443 // the user resized the frame by dragging etc.
444 gtk_signal_connect( GTK_OBJECT(m_widget
), "size_allocate",
445 GTK_SIGNAL_FUNC(gtk_frame_size_callback
), (gpointer
)this );
449 if ((m_x
!= -1) || (m_y
!= -1))
450 gtk_widget_set_uposition( m_widget
, m_x
, m_y
);
452 gtk_window_set_default_size( GTK_WINDOW(m_widget
), m_width
, m_height
);
454 // we cannot set MWM hints and icons before the widget has
455 // been realized, so we do this directly after realization
456 gtk_signal_connect( GTK_OBJECT(m_widget
), "realize",
457 GTK_SIGNAL_FUNC(gtk_frame_realized_callback
), (gpointer
) this );
459 // the only way to get the window size is to connect to this event
460 gtk_signal_connect( GTK_OBJECT(m_widget
), "configure_event",
461 GTK_SIGNAL_FUNC(gtk_frame_configure_callback
), (gpointer
)this );
463 // map and unmap for iconized state
464 gtk_signal_connect( GTK_OBJECT(m_widget
), "map_event",
465 GTK_SIGNAL_FUNC(gtk_frame_map_callback
), (gpointer
)this );
466 gtk_signal_connect( GTK_OBJECT(m_widget
), "unmap_event",
467 GTK_SIGNAL_FUNC(gtk_frame_unmap_callback
), (gpointer
)this );
469 // the only way to get the window size is to connect to this event
470 gtk_signal_connect( GTK_OBJECT(m_widget
), "configure_event",
471 GTK_SIGNAL_FUNC(gtk_frame_configure_callback
), (gpointer
)this );
473 // disable native tab traversal
474 gtk_signal_connect( GTK_OBJECT(m_widget
), "focus",
475 GTK_SIGNAL_FUNC(gtk_frame_focus_callback
), (gpointer
)this );
478 if ((m_miniEdge
> 0) || (style
& wxSIMPLE_BORDER
) || (style
& wxNO_BORDER
))
485 m_gdkDecor
= (long) GDK_DECOR_BORDER
;
486 m_gdkFunc
= (long) GDK_FUNC_MOVE
;
488 // All this is for Motif Window Manager "hints" and is supposed to be
489 // recognized by other WMs as well.
490 if ((style
& wxCAPTION
) != 0)
491 m_gdkDecor
|= GDK_DECOR_TITLE
;
492 if ((style
& wxSYSTEM_MENU
) != 0)
494 m_gdkFunc
|= GDK_FUNC_CLOSE
;
495 m_gdkDecor
|= GDK_DECOR_MENU
;
497 if ((style
& wxMINIMIZE_BOX
) != 0)
499 m_gdkFunc
|= GDK_FUNC_MINIMIZE
;
500 m_gdkDecor
|= GDK_DECOR_MINIMIZE
;
502 if ((style
& wxMAXIMIZE_BOX
) != 0)
504 m_gdkFunc
|= GDK_FUNC_MAXIMIZE
;
505 m_gdkDecor
|= GDK_DECOR_MAXIMIZE
;
507 if ((style
& wxRESIZE_BORDER
) != 0)
509 m_gdkFunc
|= GDK_FUNC_RESIZE
;
510 m_gdkDecor
|= GDK_DECOR_RESIZEH
;
517 wxTopLevelWindowGTK::~wxTopLevelWindowGTK()
519 m_isBeingDeleted
= TRUE
;
521 // it may also be GtkScrolledWindow in the case of an MDI child
522 if (GTK_IS_WINDOW(m_widget
))
524 gtk_window_set_focus( GTK_WINDOW(m_widget
), NULL
);
527 wxTopLevelWindows
.DeleteObject( this );
529 if (wxTheApp
->GetTopWindow() == this)
530 wxTheApp
->SetTopWindow( (wxWindow
*) NULL
);
532 if ((wxTopLevelWindows
.Number() == 0) &&
533 (wxTheApp
->GetExitOnFrameDelete()))
535 wxTheApp
->ExitMainLoop();
539 bool wxTopLevelWindowGTK::ShowFullScreen(bool show
, long style
)
541 if (show
== m_fsIsShowing
) return FALSE
; // return what?
543 m_fsIsShowing
= show
;
547 m_fsSaveGdkFunc
= m_gdkFunc
;
548 m_fsSaveGdkDecor
= m_gdkDecor
;
549 m_fsSaveFlag
= style
;
550 GetPosition( &m_fsSaveFrame
.x
, &m_fsSaveFrame
.y
);
551 GetSize( &m_fsSaveFrame
.width
, &m_fsSaveFrame
.height
);
553 gtk_widget_hide( m_widget
);
554 gtk_widget_unrealize( m_widget
);
556 m_gdkDecor
= (long) GDK_DECOR_BORDER
;
557 m_gdkFunc
= (long) GDK_FUNC_MOVE
;
561 wxDisplaySize( &x
, &y
);
562 SetSize( 0, 0, x
, y
);
564 gtk_widget_realize( m_widget
);
565 gtk_widget_show( m_widget
);
569 gtk_widget_hide( m_widget
);
570 gtk_widget_unrealize( m_widget
);
572 m_gdkFunc
= m_fsSaveGdkFunc
;
573 m_gdkDecor
= m_fsSaveGdkDecor
;
575 SetSize( m_fsSaveFrame
.x
, m_fsSaveFrame
.y
, m_fsSaveFrame
.width
, m_fsSaveFrame
.height
);
577 gtk_widget_realize( m_widget
);
578 gtk_widget_show( m_widget
);
584 // ----------------------------------------------------------------------------
585 // overridden wxWindow methods
586 // ----------------------------------------------------------------------------
588 bool wxTopLevelWindowGTK::Show( bool show
)
590 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
592 if (show
&& !m_sizeSet
)
594 /* by calling GtkOnSize here, we don't have to call
595 either after showing the frame, which would entail
596 much ugly flicker or from within the size_allocate
597 handler, because GTK 1.1.X forbids that. */
599 GtkOnSize( m_x
, m_y
, m_width
, m_height
);
602 return wxWindow::Show( show
);
605 void wxTopLevelWindowGTK::DoMoveWindow(int WXUNUSED(x
), int WXUNUSED(y
), int WXUNUSED(width
), int WXUNUSED(height
) )
607 wxFAIL_MSG( wxT("DoMoveWindow called for wxTopLevelWindowGTK") );
610 void wxTopLevelWindowGTK::DoSetSize( int x
, int y
, int width
, int height
, int sizeFlags
)
612 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
614 // this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow
615 wxASSERT_MSG( (m_wxwindow
!= NULL
), wxT("invalid frame") );
625 int old_width
= m_width
;
626 int old_height
= m_height
;
628 if ((sizeFlags
& wxSIZE_ALLOW_MINUS_ONE
) == 0)
630 if (x
!= -1) m_x
= x
;
631 if (y
!= -1) m_y
= y
;
632 if (width
!= -1) m_width
= width
;
633 if (height
!= -1) m_height
= height
;
644 if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH)
646 if (width == -1) m_width = 80;
649 if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT)
651 if (height == -1) m_height = 26;
655 int minWidth
= GetMinWidth(),
656 minHeight
= GetMinHeight(),
657 maxWidth
= GetMaxWidth(),
658 maxHeight
= GetMaxHeight();
660 if ((minWidth
!= -1) && (m_width
< minWidth
)) m_width
= minWidth
;
661 if ((minHeight
!= -1) && (m_height
< minHeight
)) m_height
= minHeight
;
662 if ((maxWidth
!= -1) && (m_width
> maxWidth
)) m_width
= maxWidth
;
663 if ((maxHeight
!= -1) && (m_height
> maxHeight
)) m_height
= maxHeight
;
665 if ((m_x
!= -1) || (m_y
!= -1))
667 if ((m_x
!= old_x
) || (m_y
!= old_y
))
669 gtk_widget_set_uposition( m_widget
, m_x
, m_y
);
673 if ((m_width
!= old_width
) || (m_height
!= old_height
))
675 if (m_widget
->window
)
676 gdk_window_resize( m_widget
->window
, m_width
, m_height
);
678 gtk_window_set_default_size( GTK_WINDOW(m_widget
), m_width
, m_height
);
680 /* we set the size in GtkOnSize, i.e. mostly the actual resizing is
681 done either directly before the frame is shown or in idle time
682 so that different calls to SetSize() don't lead to flicker. */
689 void wxTopLevelWindowGTK::DoGetClientSize( int *width
, int *height
) const
691 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
693 wxWindow::DoGetClientSize( width
, height
);
697 *height
-= m_miniEdge
*2 + m_miniTitle
;
701 *width
-= m_miniEdge
*2;
705 void wxTopLevelWindowGTK::DoSetClientSize( int width
, int height
)
707 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
710 width
+ m_miniEdge
*2, height
+ m_miniEdge
*2 + m_miniTitle
, 0);
713 void wxTopLevelWindowGTK::GtkOnSize( int WXUNUSED(x
), int WXUNUSED(y
),
714 int width
, int height
)
716 // due to a bug in gtk, x,y are always 0
721 if (m_resizing
) return;
724 if ( m_wxwindow
== NULL
) return;
729 /* wxMDIChildFrame derives from wxFrame but it _is_ a wxWindow as it uses
730 wxWindow::Create to create it's GTK equivalent. m_mainWidget is only
731 set in wxFrame::Create so it is used to check what kind of frame we
732 have here. if m_mainWidget is NULL it is a wxMDIChildFrame and so we
733 skip the part which handles m_frameMenuBar, m_frameToolBar and (most
734 importantly) m_mainWidget */
736 int minWidth
= GetMinWidth(),
737 minHeight
= GetMinHeight(),
738 maxWidth
= GetMaxWidth(),
739 maxHeight
= GetMaxHeight();
741 if ((minWidth
!= -1) && (m_width
< minWidth
)) m_width
= minWidth
;
742 if ((minHeight
!= -1) && (m_height
< minHeight
)) m_height
= minHeight
;
743 if ((maxWidth
!= -1) && (m_width
> maxWidth
)) m_width
= maxWidth
;
744 if ((maxHeight
!= -1) && (m_height
> maxHeight
)) m_height
= maxHeight
;
749 gint flag
= 0; // GDK_HINT_POS;
750 if ((minWidth
!= -1) || (minHeight
!= -1)) flag
|= GDK_HINT_MIN_SIZE
;
751 if ((maxWidth
!= -1) || (maxHeight
!= -1)) flag
|= GDK_HINT_MAX_SIZE
;
753 geom
.min_width
= minWidth
;
754 geom
.min_height
= minHeight
;
755 geom
.max_width
= maxWidth
;
756 geom
.max_height
= maxHeight
;
757 gtk_window_set_geometry_hints( GTK_WINDOW(m_widget
),
760 (GdkWindowHints
) flag
);
762 /* I revert back to wxGTK's original behaviour. m_mainWidget holds the
763 * menubar, the toolbar and the client area, which is represented by
765 * this hurts in the eye, but I don't want to call SetSize()
766 * because I don't want to call any non-native functions here. */
768 int client_x
= m_miniEdge
;
769 int client_y
= m_miniEdge
+ m_miniTitle
;
770 int client_w
= m_width
- 2*m_miniEdge
;
771 int client_h
= m_height
- 2*m_miniEdge
- m_miniTitle
;
772 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget
),
774 client_x
, client_y
, client_w
, client_h
);
778 // If there is no m_mainWidget between m_widget and m_wxwindow there
779 // is no need to set the size or position of m_wxwindow.
784 // send size event to frame
785 wxSizeEvent
event( wxSize(m_width
,m_height
), GetId() );
786 event
.SetEventObject( this );
787 GetEventHandler()->ProcessEvent( event
);
792 void wxTopLevelWindowGTK::OnInternalIdle()
794 if (!m_sizeSet
&& GTK_WIDGET_REALIZED(m_wxwindow
))
796 GtkOnSize( m_x
, m_y
, m_width
, m_height
);
798 // we'll come back later
800 wxapp_install_idle_handler();
804 wxWindow::OnInternalIdle();
808 // ----------------------------------------------------------------------------
810 // ----------------------------------------------------------------------------
812 void wxTopLevelWindowGTK::SetTitle( const wxString
&title
)
814 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
817 gtk_window_set_title( GTK_WINDOW(m_widget
), title
.mbc_str() );
820 void wxTopLevelWindowGTK::DoSetIcon( const wxIcon
&icon
)
825 if (!m_widget
->window
)
828 wxMask
*mask
= icon
.GetMask();
829 GdkBitmap
*bm
= (GdkBitmap
*) NULL
;
830 if (mask
) bm
= mask
->GetBitmap();
832 gdk_window_set_icon( m_widget
->window
, (GdkWindow
*) NULL
, icon
.GetPixmap(), bm
);
835 void wxTopLevelWindowGTK::SetIcon( const wxIcon
&icon
)
837 SetIcons( wxIconBundle( icon
) );
840 void wxTopLevelWindowGTK::SetIcons( const wxIconBundle
&icons
)
842 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
843 GdkWindow
* window
= m_widget
->window
;
845 wxTopLevelWindowBase::SetIcons( icons
);
847 DoSetIcon( icons
.GetIcon( -1 ) );
849 wxSetIconsX11( (WXDisplay
*)GDK_WINDOW_XDISPLAY( window
),
850 (WXWindow
)GDK_WINDOW_XWINDOW( window
), icons
);
853 // ----------------------------------------------------------------------------
854 // frame state: maximized/iconized/normal
855 // ----------------------------------------------------------------------------
857 void wxTopLevelWindowGTK::Maximize(bool WXUNUSED(maximize
))
859 wxFAIL_MSG( _T("not implemented") );
862 bool wxTopLevelWindowGTK::IsMaximized() const
864 // wxFAIL_MSG( _T("not implemented") );
866 // This is an approximation
870 void wxTopLevelWindowGTK::Restore()
872 wxFAIL_MSG( _T("not implemented") );
875 void wxTopLevelWindowGTK::Iconize( bool iconize
)
879 GdkWindow
*window
= m_widget
->window
;
881 // you should do it later, for example from OnCreate() handler
882 wxCHECK_RET( window
, _T("frame not created yet - can't iconize") );
884 XIconifyWindow( GDK_WINDOW_XDISPLAY( window
),
885 GDK_WINDOW_XWINDOW( window
),
886 DefaultScreen( GDK_DISPLAY() ) );
890 bool wxTopLevelWindowGTK::IsIconized() const
895 void wxTopLevelWindowGTK::SetIconizeState(bool iconize
)
897 if ( iconize
!= m_isIconized
)
899 m_isIconized
= iconize
;
900 (void)SendIconizeEvent(iconize
);