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 //-----------------------------------------------------------------------------
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
,
273 pizza
->bin_window
, GTK_STATE_NORMAL
,
283 // ----------------------------------------------------------------------------
284 // wxTopLevelWindowGTK itself
285 // ----------------------------------------------------------------------------
287 //-----------------------------------------------------------------------------
288 // InsertChild for wxTopLevelWindowGTK
289 //-----------------------------------------------------------------------------
291 /* Callback for wxTopLevelWindowGTK. This very strange beast has to be used because
292 * C++ has no virtual methods in a constructor. We have to emulate a
293 * virtual function here as wxWindows requires different ways to insert
294 * a child in container classes. */
296 static void wxInsertChildInTopLevelWindow( wxTopLevelWindowGTK
* parent
, wxWindow
* child
)
298 wxASSERT( GTK_IS_WIDGET(child
->m_widget
) );
300 if (!parent
->m_insertInClientArea
)
302 // these are outside the client area
303 wxTopLevelWindowGTK
* frame
= (wxTopLevelWindowGTK
*) parent
;
304 gtk_pizza_put( GTK_PIZZA(frame
->m_mainWidget
),
305 GTK_WIDGET(child
->m_widget
),
313 // these are inside the client area
314 gtk_pizza_put( GTK_PIZZA(parent
->m_wxwindow
),
315 GTK_WIDGET(child
->m_widget
),
322 // resize on OnInternalIdle
323 parent
->GtkUpdateSize();
326 // ----------------------------------------------------------------------------
327 // wxTopLevelWindowGTK creation
328 // ----------------------------------------------------------------------------
330 void wxTopLevelWindowGTK::Init()
335 m_mainWidget
= (GtkWidget
*) NULL
;
336 m_insertInClientArea
= TRUE
;
338 m_isIconized
= FALSE
;
339 m_fsIsShowing
= FALSE
;
340 m_themeEnabled
= TRUE
;
341 m_gdkDecor
= m_gdkFunc
= 0;
344 bool wxTopLevelWindowGTK::Create( wxWindow
*parent
,
346 const wxString
& title
,
348 const wxSize
& sizeOrig
,
350 const wxString
&name
)
352 // always create a frame of some reasonable, even if arbitrary, size (at
353 // least for MSW compatibility)
354 wxSize size
= sizeOrig
;
355 if ( size
.x
== -1 || size
.y
== -1 )
357 wxSize sizeDpy
= wxGetDisplaySize();
359 size
.x
= sizeDpy
.x
/ 3;
361 size
.y
= sizeDpy
.y
/ 5;
364 wxTopLevelWindows
.Append( this );
366 m_needParent
= FALSE
;
368 if (!PreCreation( parent
, pos
, size
) ||
369 !CreateBase( parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
))
371 wxFAIL_MSG( wxT("wxTopLevelWindowGTK creation failed") );
377 m_insertCallback
= (wxInsertChildFunction
) wxInsertChildInTopLevelWindow
;
379 GtkWindowType win_type
= GTK_WINDOW_TOPLEVEL
;
381 if (style
& wxFRAME_TOOL_WINDOW
)
382 win_type
= GTK_WINDOW_POPUP
;
384 if (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG
)
386 // there is no more GTK_WINDOW_DIALOG in 2.0
388 win_type
= GTK_WINDOW_TOPLEVEL
;
390 win_type
= GTK_WINDOW_DIALOG
;
394 m_widget
= gtk_window_new( win_type
);
396 if (m_parent
&& (GTK_IS_WINDOW(m_parent
->m_widget
)) &&
397 (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG
))
399 gtk_window_set_transient_for( GTK_WINDOW(m_widget
), GTK_WINDOW(m_parent
->m_widget
) );
403 gtk_window_set_wmclass( GTK_WINDOW(m_widget
), name
.mb_str(), name
.mb_str() );
406 debug_focus_in( m_widget
, wxT("wxTopLevelWindowGTK::m_widget"), name
);
409 gtk_window_set_title( GTK_WINDOW(m_widget
), title
.mbc_str() );
410 GTK_WIDGET_UNSET_FLAGS( m_widget
, GTK_CAN_FOCUS
);
412 gtk_signal_connect( GTK_OBJECT(m_widget
), "delete_event",
413 GTK_SIGNAL_FUNC(gtk_frame_delete_callback
), (gpointer
)this );
415 // m_mainWidget holds the toolbar, the menubar and the client area
416 m_mainWidget
= gtk_pizza_new();
417 gtk_widget_show( m_mainWidget
);
418 GTK_WIDGET_UNSET_FLAGS( m_mainWidget
, GTK_CAN_FOCUS
);
419 gtk_container_add( GTK_CONTAINER(m_widget
), m_mainWidget
);
421 // for m_mainWidget themes
422 gtk_signal_connect( GTK_OBJECT(m_mainWidget
), "expose_event",
423 GTK_SIGNAL_FUNC(gtk_window_expose_callback
), (gpointer
)this );
425 gtk_signal_connect( GTK_OBJECT(m_mainWidget
), "draw",
426 GTK_SIGNAL_FUNC(gtk_window_draw_callback
), (gpointer
)this );
430 debug_focus_in( m_mainWidget
, wxT("wxTopLevelWindowGTK::m_mainWidget"), name
);
433 // m_wxwindow only represents the client area without toolbar and menubar
434 m_wxwindow
= gtk_pizza_new();
435 gtk_widget_show( m_wxwindow
);
436 gtk_container_add( GTK_CONTAINER(m_mainWidget
), m_wxwindow
);
439 debug_focus_in( m_wxwindow
, wxT("wxTopLevelWindowGTK::m_wxwindow"), name
);
442 // we donm't allow the frame to get the focus as otherwise
443 // the frame will grab it at arbitrary focus changes
444 GTK_WIDGET_UNSET_FLAGS( m_wxwindow
, GTK_CAN_FOCUS
);
446 if (m_parent
) m_parent
->AddChild( this );
448 // the user resized the frame by dragging etc.
449 gtk_signal_connect( GTK_OBJECT(m_widget
), "size_allocate",
450 GTK_SIGNAL_FUNC(gtk_frame_size_callback
), (gpointer
)this );
454 if ((m_x
!= -1) || (m_y
!= -1))
455 gtk_widget_set_uposition( m_widget
, m_x
, m_y
);
457 gtk_window_set_default_size( GTK_WINDOW(m_widget
), m_width
, m_height
);
459 // we cannot set MWM hints and icons before the widget has
460 // been realized, so we do this directly after realization
461 gtk_signal_connect( GTK_OBJECT(m_widget
), "realize",
462 GTK_SIGNAL_FUNC(gtk_frame_realized_callback
), (gpointer
) this );
464 // the only way to get the window size is to connect to this event
465 gtk_signal_connect( GTK_OBJECT(m_widget
), "configure_event",
466 GTK_SIGNAL_FUNC(gtk_frame_configure_callback
), (gpointer
)this );
468 // map and unmap for iconized state
469 gtk_signal_connect( GTK_OBJECT(m_widget
), "map_event",
470 GTK_SIGNAL_FUNC(gtk_frame_map_callback
), (gpointer
)this );
471 gtk_signal_connect( GTK_OBJECT(m_widget
), "unmap_event",
472 GTK_SIGNAL_FUNC(gtk_frame_unmap_callback
), (gpointer
)this );
474 // the only way to get the window size is to connect to this event
475 gtk_signal_connect( GTK_OBJECT(m_widget
), "configure_event",
476 GTK_SIGNAL_FUNC(gtk_frame_configure_callback
), (gpointer
)this );
478 // disable native tab traversal
479 gtk_signal_connect( GTK_OBJECT(m_widget
), "focus",
480 GTK_SIGNAL_FUNC(gtk_frame_focus_callback
), (gpointer
)this );
483 if ((m_miniEdge
> 0) || (style
& wxSIMPLE_BORDER
) || (style
& wxNO_BORDER
))
490 m_gdkDecor
= (long) GDK_DECOR_BORDER
;
491 m_gdkFunc
= (long) GDK_FUNC_MOVE
;
493 // All this is for Motif Window Manager "hints" and is supposed to be
494 // recognized by other WMs as well.
495 if ((style
& wxCAPTION
) != 0)
496 m_gdkDecor
|= GDK_DECOR_TITLE
;
497 if ((style
& wxSYSTEM_MENU
) != 0)
499 m_gdkFunc
|= GDK_FUNC_CLOSE
;
500 m_gdkDecor
|= GDK_DECOR_MENU
;
502 if ((style
& wxMINIMIZE_BOX
) != 0)
504 m_gdkFunc
|= GDK_FUNC_MINIMIZE
;
505 m_gdkDecor
|= GDK_DECOR_MINIMIZE
;
507 if ((style
& wxMAXIMIZE_BOX
) != 0)
509 m_gdkFunc
|= GDK_FUNC_MAXIMIZE
;
510 m_gdkDecor
|= GDK_DECOR_MAXIMIZE
;
512 if ((style
& wxRESIZE_BORDER
) != 0)
514 m_gdkFunc
|= GDK_FUNC_RESIZE
;
515 m_gdkDecor
|= GDK_DECOR_RESIZEH
;
522 wxTopLevelWindowGTK::~wxTopLevelWindowGTK()
524 m_isBeingDeleted
= TRUE
;
526 // it may also be GtkScrolledWindow in the case of an MDI child
527 if (GTK_IS_WINDOW(m_widget
))
529 gtk_window_set_focus( GTK_WINDOW(m_widget
), NULL
);
532 wxTopLevelWindows
.DeleteObject( this );
534 if (wxTheApp
->GetTopWindow() == this)
535 wxTheApp
->SetTopWindow( (wxWindow
*) NULL
);
537 if ((wxTopLevelWindows
.Number() == 0) &&
538 (wxTheApp
->GetExitOnFrameDelete()))
540 wxTheApp
->ExitMainLoop();
544 bool wxTopLevelWindowGTK::ShowFullScreen(bool show
, long style
)
546 if (show
== m_fsIsShowing
) return FALSE
; // return what?
548 m_fsIsShowing
= show
;
552 m_fsSaveGdkFunc
= m_gdkFunc
;
553 m_fsSaveGdkDecor
= m_gdkDecor
;
554 m_fsSaveFlag
= style
;
555 GetPosition( &m_fsSaveFrame
.x
, &m_fsSaveFrame
.y
);
556 GetSize( &m_fsSaveFrame
.width
, &m_fsSaveFrame
.height
);
558 gtk_widget_hide( m_widget
);
559 gtk_widget_unrealize( m_widget
);
561 m_gdkDecor
= (long) GDK_DECOR_BORDER
;
562 m_gdkFunc
= (long) GDK_FUNC_MOVE
;
566 wxDisplaySize( &x
, &y
);
567 SetSize( 0, 0, x
, y
);
569 gtk_widget_realize( m_widget
);
570 gtk_widget_show( m_widget
);
574 gtk_widget_hide( m_widget
);
575 gtk_widget_unrealize( m_widget
);
577 m_gdkFunc
= m_fsSaveGdkFunc
;
578 m_gdkDecor
= m_fsSaveGdkDecor
;
580 SetSize( m_fsSaveFrame
.x
, m_fsSaveFrame
.y
, m_fsSaveFrame
.width
, m_fsSaveFrame
.height
);
582 gtk_widget_realize( m_widget
);
583 gtk_widget_show( m_widget
);
589 // ----------------------------------------------------------------------------
590 // overridden wxWindow methods
591 // ----------------------------------------------------------------------------
593 bool wxTopLevelWindowGTK::Show( bool show
)
595 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
597 if (show
&& !m_sizeSet
)
599 /* by calling GtkOnSize here, we don't have to call
600 either after showing the frame, which would entail
601 much ugly flicker or from within the size_allocate
602 handler, because GTK 1.1.X forbids that. */
604 GtkOnSize( m_x
, m_y
, m_width
, m_height
);
607 return wxWindow::Show( show
);
610 void wxTopLevelWindowGTK::DoMoveWindow(int WXUNUSED(x
), int WXUNUSED(y
), int WXUNUSED(width
), int WXUNUSED(height
) )
612 wxFAIL_MSG( wxT("DoMoveWindow called for wxTopLevelWindowGTK") );
615 void wxTopLevelWindowGTK::DoSetSize( int x
, int y
, int width
, int height
, int sizeFlags
)
617 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
619 // this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow
620 wxASSERT_MSG( (m_wxwindow
!= NULL
), wxT("invalid frame") );
630 int old_width
= m_width
;
631 int old_height
= m_height
;
633 if ((sizeFlags
& wxSIZE_ALLOW_MINUS_ONE
) == 0)
635 if (x
!= -1) m_x
= x
;
636 if (y
!= -1) m_y
= y
;
637 if (width
!= -1) m_width
= width
;
638 if (height
!= -1) m_height
= height
;
649 if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH)
651 if (width == -1) m_width = 80;
654 if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT)
656 if (height == -1) m_height = 26;
660 int minWidth
= GetMinWidth(),
661 minHeight
= GetMinHeight(),
662 maxWidth
= GetMaxWidth(),
663 maxHeight
= GetMaxHeight();
665 if ((minWidth
!= -1) && (m_width
< minWidth
)) m_width
= minWidth
;
666 if ((minHeight
!= -1) && (m_height
< minHeight
)) m_height
= minHeight
;
667 if ((maxWidth
!= -1) && (m_width
> maxWidth
)) m_width
= maxWidth
;
668 if ((maxHeight
!= -1) && (m_height
> maxHeight
)) m_height
= maxHeight
;
670 if ((m_x
!= -1) || (m_y
!= -1))
672 if ((m_x
!= old_x
) || (m_y
!= old_y
))
674 gtk_widget_set_uposition( m_widget
, m_x
, m_y
);
678 if ((m_width
!= old_width
) || (m_height
!= old_height
))
680 if (m_widget
->window
)
681 gdk_window_resize( m_widget
->window
, m_width
, m_height
);
683 gtk_window_set_default_size( GTK_WINDOW(m_widget
), m_width
, m_height
);
685 /* we set the size in GtkOnSize, i.e. mostly the actual resizing is
686 done either directly before the frame is shown or in idle time
687 so that different calls to SetSize() don't lead to flicker. */
694 void wxTopLevelWindowGTK::DoGetClientSize( int *width
, int *height
) const
696 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
698 wxWindow::DoGetClientSize( width
, height
);
702 *height
-= m_miniEdge
*2 + m_miniTitle
;
706 *width
-= m_miniEdge
*2;
710 void wxTopLevelWindowGTK::DoSetClientSize( int width
, int height
)
712 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
715 width
+ m_miniEdge
*2, height
+ m_miniEdge
*2 + m_miniTitle
, 0);
718 void wxTopLevelWindowGTK::GtkOnSize( int WXUNUSED(x
), int WXUNUSED(y
),
719 int width
, int height
)
721 // due to a bug in gtk, x,y are always 0
726 if (m_resizing
) return;
729 if ( m_wxwindow
== NULL
) return;
734 /* wxMDIChildFrame derives from wxFrame but it _is_ a wxWindow as it uses
735 wxWindow::Create to create it's GTK equivalent. m_mainWidget is only
736 set in wxFrame::Create so it is used to check what kind of frame we
737 have here. if m_mainWidget is NULL it is a wxMDIChildFrame and so we
738 skip the part which handles m_frameMenuBar, m_frameToolBar and (most
739 importantly) m_mainWidget */
741 int minWidth
= GetMinWidth(),
742 minHeight
= GetMinHeight(),
743 maxWidth
= GetMaxWidth(),
744 maxHeight
= GetMaxHeight();
746 if ((minWidth
!= -1) && (m_width
< minWidth
)) m_width
= minWidth
;
747 if ((minHeight
!= -1) && (m_height
< minHeight
)) m_height
= minHeight
;
748 if ((maxWidth
!= -1) && (m_width
> maxWidth
)) m_width
= maxWidth
;
749 if ((maxHeight
!= -1) && (m_height
> maxHeight
)) m_height
= maxHeight
;
754 gint flag
= 0; // GDK_HINT_POS;
755 if ((minWidth
!= -1) || (minHeight
!= -1)) flag
|= GDK_HINT_MIN_SIZE
;
756 if ((maxWidth
!= -1) || (maxHeight
!= -1)) flag
|= GDK_HINT_MAX_SIZE
;
758 geom
.min_width
= minWidth
;
759 geom
.min_height
= minHeight
;
760 geom
.max_width
= maxWidth
;
761 geom
.max_height
= maxHeight
;
762 gtk_window_set_geometry_hints( GTK_WINDOW(m_widget
),
765 (GdkWindowHints
) flag
);
767 /* I revert back to wxGTK's original behaviour. m_mainWidget holds the
768 * menubar, the toolbar and the client area, which is represented by
770 * this hurts in the eye, but I don't want to call SetSize()
771 * because I don't want to call any non-native functions here. */
773 int client_x
= m_miniEdge
;
774 int client_y
= m_miniEdge
+ m_miniTitle
;
775 int client_w
= m_width
- 2*m_miniEdge
;
776 int client_h
= m_height
- 2*m_miniEdge
- m_miniTitle
;
777 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget
),
779 client_x
, client_y
, client_w
, client_h
);
783 // If there is no m_mainWidget between m_widget and m_wxwindow there
784 // is no need to set the size or position of m_wxwindow.
789 // send size event to frame
790 wxSizeEvent
event( wxSize(m_width
,m_height
), GetId() );
791 event
.SetEventObject( this );
792 GetEventHandler()->ProcessEvent( event
);
797 void wxTopLevelWindowGTK::OnInternalIdle()
799 if (!m_sizeSet
&& GTK_WIDGET_REALIZED(m_wxwindow
))
801 GtkOnSize( m_x
, m_y
, m_width
, m_height
);
803 // we'll come back later
805 wxapp_install_idle_handler();
809 wxWindow::OnInternalIdle();
813 // ----------------------------------------------------------------------------
815 // ----------------------------------------------------------------------------
817 void wxTopLevelWindowGTK::SetTitle( const wxString
&title
)
819 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
822 gtk_window_set_title( GTK_WINDOW(m_widget
), title
.mbc_str() );
825 void wxTopLevelWindowGTK::DoSetIcon( const wxIcon
&icon
)
830 if (!m_widget
->window
)
833 wxMask
*mask
= icon
.GetMask();
834 GdkBitmap
*bm
= (GdkBitmap
*) NULL
;
835 if (mask
) bm
= mask
->GetBitmap();
837 gdk_window_set_icon( m_widget
->window
, (GdkWindow
*) NULL
, icon
.GetPixmap(), bm
);
840 void wxTopLevelWindowGTK::SetIcon( const wxIcon
&icon
)
842 SetIcons( wxIconBundle( icon
) );
845 void wxTopLevelWindowGTK::SetIcons( const wxIconBundle
&icons
)
847 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
848 GdkWindow
* window
= m_widget
->window
;
850 wxTopLevelWindowBase::SetIcons( icons
);
852 DoSetIcon( icons
.GetIcon( -1 ) );
855 wxSetIconsX11( (WXDisplay
*)GDK_WINDOW_XDISPLAY( window
),
856 (WXWindow
)GDK_WINDOW_XWINDOW( window
), icons
);
860 // ----------------------------------------------------------------------------
861 // frame state: maximized/iconized/normal
862 // ----------------------------------------------------------------------------
864 void wxTopLevelWindowGTK::Maximize(bool WXUNUSED(maximize
))
866 wxFAIL_MSG( _T("not implemented") );
869 bool wxTopLevelWindowGTK::IsMaximized() const
871 // wxFAIL_MSG( _T("not implemented") );
873 // This is an approximation
877 void wxTopLevelWindowGTK::Restore()
879 wxFAIL_MSG( _T("not implemented") );
882 void wxTopLevelWindowGTK::Iconize( bool iconize
)
886 GdkWindow
*window
= m_widget
->window
;
888 // you should do it later, for example from OnCreate() handler
889 wxCHECK_RET( window
, _T("frame not created yet - can't iconize") );
891 XIconifyWindow( GDK_WINDOW_XDISPLAY( window
),
892 GDK_WINDOW_XWINDOW( window
),
893 DefaultScreen( GDK_DISPLAY() ) );
897 bool wxTopLevelWindowGTK::IsIconized() const
902 void wxTopLevelWindowGTK::SetIconizeState(bool iconize
)
904 if ( iconize
!= m_isIconized
)
906 m_isIconized
= iconize
;
907 (void)SendIconizeEvent(iconize
);