1 /////////////////////////////////////////////////////////////////////////////
4 // Author: Robert Roebling
6 // Copyright: (c) 1998 Robert Roebling
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
10 // ============================================================================
12 // ============================================================================
14 // ----------------------------------------------------------------------------
16 // ----------------------------------------------------------------------------
19 #pragma implementation "frame.h"
23 #include "wx/dialog.h"
24 #include "wx/control.h"
28 #include "wx/toolbar.h"
31 #include "wx/statusbr.h"
33 #include "wx/dcclient.h"
38 #include <gdk/gdkkeysyms.h>
41 #include "wx/gtk/win_gtk.h"
43 // ----------------------------------------------------------------------------
45 // ----------------------------------------------------------------------------
47 const int wxMENU_HEIGHT
= 27;
48 const int wxSTATUS_HEIGHT
= 25;
49 const int wxPLACE_HOLDER
= 0;
51 // ----------------------------------------------------------------------------
53 // ----------------------------------------------------------------------------
55 extern void wxapp_install_idle_handler();
57 extern int g_openDialogs
;
59 // ----------------------------------------------------------------------------
61 // ----------------------------------------------------------------------------
63 IMPLEMENT_DYNAMIC_CLASS(wxFrame
,wxWindow
)
65 // ----------------------------------------------------------------------------
67 // ----------------------------------------------------------------------------
69 extern wxList wxPendingDelete
;
71 // ----------------------------------------------------------------------------
73 // ----------------------------------------------------------------------------
77 extern void debug_focus_in( GtkWidget
* widget
, const wxChar
* name
, const wxChar
*window
);
81 // ============================================================================
83 // ============================================================================
85 // ----------------------------------------------------------------------------
87 // ----------------------------------------------------------------------------
89 //-----------------------------------------------------------------------------
90 // "focus" from m_window
91 //-----------------------------------------------------------------------------
93 static gint
gtk_frame_focus_callback( GtkWidget
*widget
, GtkDirectionType
WXUNUSED(d
), wxWindow
*WXUNUSED(win
) )
96 wxapp_install_idle_handler();
98 // This disables GTK's tab traversal
99 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "focus" );
103 //-----------------------------------------------------------------------------
105 //-----------------------------------------------------------------------------
107 static void gtk_frame_size_callback( GtkWidget
*WXUNUSED(widget
), GtkAllocation
* alloc
, wxFrame
*win
)
110 wxapp_install_idle_handler();
115 if ((win
->m_width
!= alloc
->width
) || (win
->m_height
!= alloc
->height
))
118 wxPrintf( "OnSize from " );
119 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
120 wxPrintf( win->GetClassInfo()->GetClassName() );
121 wxPrintf( " %d %d %d %d\n", (int)alloc->x,
124 (int)alloc->height );
127 win
->m_width
= alloc
->width
;
128 win
->m_height
= alloc
->height
;
129 win
->m_queuedFullRedraw
= TRUE
;
130 win
->GtkUpdateSize();
134 //-----------------------------------------------------------------------------
136 //-----------------------------------------------------------------------------
138 static gint
gtk_frame_delete_callback( GtkWidget
*WXUNUSED(widget
), GdkEvent
*WXUNUSED(event
), wxFrame
*win
)
141 wxapp_install_idle_handler();
143 if ((g_openDialogs
== 0) && (win
->IsEnabled()))
149 //-----------------------------------------------------------------------------
150 // "child_attached" of menu bar
151 //-----------------------------------------------------------------------------
153 static void gtk_menu_attached_callback( GtkWidget
*WXUNUSED(widget
), GtkWidget
*WXUNUSED(child
), wxFrame
*win
)
155 if (!win
->m_hasVMT
) return;
157 win
->m_menuBarDetached
= FALSE
;
158 win
->GtkUpdateSize();
161 //-----------------------------------------------------------------------------
162 // "child_detached" of menu bar
163 //-----------------------------------------------------------------------------
165 static void gtk_menu_detached_callback( GtkWidget
*WXUNUSED(widget
), GtkWidget
*WXUNUSED(child
), wxFrame
*win
)
167 if (!win
->m_hasVMT
) return;
169 win
->m_menuBarDetached
= TRUE
;
170 win
->GtkUpdateSize();
174 //-----------------------------------------------------------------------------
175 // "child_attached" of tool bar
176 //-----------------------------------------------------------------------------
178 static void gtk_toolbar_attached_callback( GtkWidget
*WXUNUSED(widget
), GtkWidget
*WXUNUSED(child
), wxFrame
*win
)
180 if (!win
->m_hasVMT
) return;
182 win
->m_toolBarDetached
= FALSE
;
184 win
->GtkUpdateSize();
187 //-----------------------------------------------------------------------------
188 // "child_detached" of tool bar
189 //-----------------------------------------------------------------------------
191 static void gtk_toolbar_detached_callback( GtkWidget
*WXUNUSED(widget
), GtkWidget
*WXUNUSED(child
), wxFrame
*win
)
194 wxapp_install_idle_handler();
196 if (!win
->m_hasVMT
) return;
198 win
->m_toolBarDetached
= TRUE
;
199 win
->GtkUpdateSize();
201 #endif // wxUSE_TOOLBAR
203 //-----------------------------------------------------------------------------
205 //-----------------------------------------------------------------------------
208 #if (GTK_MINOR_VERSION > 0)
209 gtk_frame_configure_callback( GtkWidget
*WXUNUSED(widget
), GdkEventConfigure
*WXUNUSED(event
), wxFrame
*win
)
211 gtk_frame_configure_callback( GtkWidget
*WXUNUSED(widget
), GdkEventConfigure
*event
, wxFrame
*win
)
215 wxapp_install_idle_handler();
220 #if (GTK_MINOR_VERSION > 0)
223 gdk_window_get_root_origin( win
->m_widget
->window
, &x
, &y
);
231 wxMoveEvent
mevent( wxPoint(win
->m_x
,win
->m_y
), win
->GetId() );
232 mevent
.SetEventObject( win
);
233 win
->GetEventHandler()->ProcessEvent( mevent
);
238 //-----------------------------------------------------------------------------
239 // "realize" from m_widget
240 //-----------------------------------------------------------------------------
242 /* we cannot MWM hints and icons before the widget has been realized,
243 so we do this directly after realization */
246 gtk_frame_realized_callback( GtkWidget
*widget
, wxFrame
*win
)
249 wxapp_install_idle_handler();
251 /* I haven't been able to set the position of
252 the dialog before it is shown, so I set the
253 position in "realize" */
254 gtk_widget_set_uposition( widget
, win
->m_x
, win
->m_y
);
256 if ((win
->m_miniEdge
> 0) || (win
->HasFlag(wxSIMPLE_BORDER
)))
258 /* This is a mini-frame or a borderless frame. */
259 gdk_window_set_decorations( win
->m_widget
->window
, (GdkWMDecoration
)0 );
260 gdk_window_set_functions( win
->m_widget
->window
, (GdkWMFunction
)0 );
264 /* All this is for Motif Window Manager "hints" and is supposed to be
265 recognized by other WM as well. Not tested. */
266 long decor
= (long) GDK_DECOR_BORDER
;
267 long func
= (long) GDK_FUNC_MOVE
;
269 if ((win
->GetWindowStyle() & wxCAPTION
) != 0)
270 decor
|= GDK_DECOR_TITLE
;
271 if ((win
->GetWindowStyle() & wxSYSTEM_MENU
) != 0)
273 decor
|= GDK_DECOR_MENU
;
274 func
|= GDK_FUNC_CLOSE
;
276 if ((win
->GetWindowStyle() & wxMINIMIZE_BOX
) != 0)
278 func
|= GDK_FUNC_MINIMIZE
;
279 decor
|= GDK_DECOR_MINIMIZE
;
281 if ((win
->GetWindowStyle() & wxMAXIMIZE_BOX
) != 0)
283 func
|= GDK_FUNC_MAXIMIZE
;
284 decor
|= GDK_DECOR_MAXIMIZE
;
286 if ((win
->GetWindowStyle() & wxRESIZE_BORDER
) != 0)
288 func
|= GDK_FUNC_RESIZE
;
289 decor
|= GDK_DECOR_RESIZEH
;
292 gdk_window_set_decorations( win
->m_widget
->window
, (GdkWMDecoration
)decor
);
293 gdk_window_set_functions( win
->m_widget
->window
, (GdkWMFunction
)func
);
296 /* GTK's shrinking/growing policy */
297 if ((win
->GetWindowStyle() & wxRESIZE_BORDER
) == 0)
298 gtk_window_set_policy(GTK_WINDOW(win
->m_widget
), 0, 0, 1);
300 gtk_window_set_policy(GTK_WINDOW(win
->m_widget
), 1, 1, 1);
303 gint flag
= 0; // GDK_HINT_POS;
304 if ((win
->GetMinWidth() != -1) || (win
->GetMinHeight() != -1)) flag
|= GDK_HINT_MIN_SIZE
;
305 if ((win
->GetMaxWidth() != -1) || (win
->GetMaxHeight() != -1)) flag
|= GDK_HINT_MAX_SIZE
;
308 gdk_window_set_hints( win
->m_widget
->window
,
310 win
->GetMinWidth(), win
->GetMinHeight(),
311 win
->GetMaxWidth(), win
->GetMaxHeight(),
316 wxIcon iconOld
= win
->GetIcon();
317 if ( iconOld
!= wxNullIcon
)
319 wxIcon
icon( iconOld
);
320 win
->SetIcon( wxNullIcon
);
321 win
->SetIcon( icon
);
324 /* we set the focus to the child that accepts the focus. this
325 doesn't really have to be done in "realize" but why not? */
326 wxWindowList::Node
*node
= win
->GetChildren().GetFirst();
329 wxWindow
*child
= node
->GetData();
330 if (child
->AcceptsFocus())
336 node
= node
->GetNext();
342 // ----------------------------------------------------------------------------
344 // ----------------------------------------------------------------------------
346 //-----------------------------------------------------------------------------
347 // InsertChild for wxFrame
348 //-----------------------------------------------------------------------------
350 /* Callback for wxFrame. This very strange beast has to be used because
351 * C++ has no virtual methods in a constructor. We have to emulate a
352 * virtual function here as wxWindows requires different ways to insert
353 * a child in container classes. */
355 static void wxInsertChildInFrame( wxFrame
* parent
, wxWindow
* child
)
357 wxASSERT( GTK_IS_WIDGET(child
->m_widget
) );
359 if (!parent
->m_insertInClientArea
)
361 /* these are outside the client area */
362 wxFrame
* frame
= (wxFrame
*) parent
;
363 gtk_pizza_put( GTK_PIZZA(frame
->m_mainWidget
),
364 GTK_WIDGET(child
->m_widget
),
370 #if wxUSE_TOOLBAR_NATIVE
371 /* we connect to these events for recalculating the client area
372 space when the toolbar is floating */
373 if (wxIS_KIND_OF(child
,wxToolBar
))
375 wxToolBar
*toolBar
= (wxToolBar
*) child
;
376 if (toolBar
->GetWindowStyle() & wxTB_DOCKABLE
)
378 gtk_signal_connect( GTK_OBJECT(toolBar
->m_widget
), "child_attached",
379 GTK_SIGNAL_FUNC(gtk_toolbar_attached_callback
), (gpointer
)parent
);
381 gtk_signal_connect( GTK_OBJECT(toolBar
->m_widget
), "child_detached",
382 GTK_SIGNAL_FUNC(gtk_toolbar_detached_callback
), (gpointer
)parent
);
385 #endif // wxUSE_TOOLBAR
389 /* these are inside the client area */
390 gtk_pizza_put( GTK_PIZZA(parent
->m_wxwindow
),
391 GTK_WIDGET(child
->m_widget
),
398 /* resize on OnInternalIdle */
399 parent
->GtkUpdateSize();
402 // ----------------------------------------------------------------------------
404 // ----------------------------------------------------------------------------
411 m_mainWidget
= (GtkWidget
*) NULL
;
412 m_menuBarDetached
= FALSE
;
413 m_toolBarDetached
= FALSE
;
414 m_insertInClientArea
= TRUE
;
418 bool wxFrame::Create( wxWindow
*parent
,
420 const wxString
&title
,
424 const wxString
&name
)
426 wxTopLevelWindows
.Append( this );
428 m_needParent
= FALSE
;
431 if (!PreCreation( parent
, pos
, size
) ||
432 !CreateBase( parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
))
434 wxFAIL_MSG( wxT("wxFrame creation failed") );
440 m_insertCallback
= (wxInsertChildFunction
) wxInsertChildInFrame
;
442 GtkWindowType win_type
= GTK_WINDOW_TOPLEVEL
;
444 m_widget
= gtk_window_new( win_type
);
446 if ((m_parent
) && (HasFlag(wxFRAME_FLOAT_ON_PARENT
)) && (GTK_IS_WINDOW(m_parent
->m_widget
)))
447 gtk_window_set_transient_for( GTK_WINDOW(m_widget
), GTK_WINDOW(m_parent
->m_widget
) );
450 gtk_window_set_wmclass( GTK_WINDOW(m_widget
), name
.mb_str(), name
.mb_str() );
453 debug_focus_in( m_widget
, wxT("wxFrame::m_widget"), name
);
456 gtk_window_set_title( GTK_WINDOW(m_widget
), title
.mbc_str() );
457 GTK_WIDGET_UNSET_FLAGS( m_widget
, GTK_CAN_FOCUS
);
459 gtk_signal_connect( GTK_OBJECT(m_widget
), "delete_event",
460 GTK_SIGNAL_FUNC(gtk_frame_delete_callback
), (gpointer
)this );
462 /* m_mainWidget holds the toolbar, the menubar and the client area */
463 m_mainWidget
= gtk_pizza_new();
464 gtk_widget_show( m_mainWidget
);
465 GTK_WIDGET_UNSET_FLAGS( m_mainWidget
, GTK_CAN_FOCUS
);
466 gtk_container_add( GTK_CONTAINER(m_widget
), m_mainWidget
);
469 debug_focus_in( m_mainWidget
, wxT("wxFrame::m_mainWidget"), name
);
472 /* m_wxwindow only represents the client area without toolbar and menubar */
473 m_wxwindow
= gtk_pizza_new();
474 gtk_widget_show( m_wxwindow
);
475 gtk_container_add( GTK_CONTAINER(m_mainWidget
), m_wxwindow
);
478 debug_focus_in( m_wxwindow
, wxT("wxFrame::m_wxwindow"), name
);
481 /* we donm't allow the frame to get the focus as otherwise
482 the frame will grabit at arbitrary fcous changes. */
483 GTK_WIDGET_UNSET_FLAGS( m_wxwindow
, GTK_CAN_FOCUS
);
485 if (m_parent
) m_parent
->AddChild( this );
487 /* the user resized the frame by dragging etc. */
488 gtk_signal_connect( GTK_OBJECT(m_widget
), "size_allocate",
489 GTK_SIGNAL_FUNC(gtk_frame_size_callback
), (gpointer
)this );
493 /* we cannot set MWM hints and icons before the widget has
494 been realized, so we do this directly after realization */
495 gtk_signal_connect( GTK_OBJECT(m_widget
), "realize",
496 GTK_SIGNAL_FUNC(gtk_frame_realized_callback
), (gpointer
) this );
498 /* the only way to get the window size is to connect to this event */
499 gtk_signal_connect( GTK_OBJECT(m_widget
), "configure_event",
500 GTK_SIGNAL_FUNC(gtk_frame_configure_callback
), (gpointer
)this );
502 /* disable native tab traversal */
503 gtk_signal_connect( GTK_OBJECT(m_widget
), "focus",
504 GTK_SIGNAL_FUNC(gtk_frame_focus_callback
), (gpointer
)this );
511 m_isBeingDeleted
= TRUE
;
515 wxTopLevelWindows
.DeleteObject( this );
517 if (wxTheApp
->GetTopWindow() == this)
518 wxTheApp
->SetTopWindow( (wxWindow
*) NULL
);
520 if ((wxTopLevelWindows
.Number() == 0) &&
521 (wxTheApp
->GetExitOnFrameDelete()))
523 wxTheApp
->ExitMainLoop();
527 // ----------------------------------------------------------------------------
528 // overridden wxWindow methods
529 // ----------------------------------------------------------------------------
531 bool wxFrame::Show( bool show
)
533 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
535 if (show
&& !m_sizeSet
)
537 /* by calling GtkOnSize here, we don't have to call
538 either after showing the frame, which would entail
539 much ugly flicker or from within the size_allocate
540 handler, because GTK 1.1.X forbids that. */
542 GtkOnSize( m_x
, m_y
, m_width
, m_height
);
545 return wxWindow::Show( show
);
548 void wxFrame::DoMoveWindow(int WXUNUSED(x
), int WXUNUSED(y
), int WXUNUSED(width
), int WXUNUSED(height
) )
550 wxFAIL_MSG( wxT("DoMoveWindow called for wxFrame") );
553 void wxFrame::DoSetSize( int x
, int y
, int width
, int height
, int sizeFlags
)
555 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
557 /* this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow */
558 wxASSERT_MSG( (m_wxwindow
!= NULL
), wxT("invalid frame") );
560 /* avoid recursions */
568 int old_width
= m_width
;
569 int old_height
= m_height
;
571 if ((sizeFlags
& wxSIZE_ALLOW_MINUS_ONE
) == 0)
573 if (x
!= -1) m_x
= x
;
574 if (y
!= -1) m_y
= y
;
575 if (width
!= -1) m_width
= width
;
576 if (height
!= -1) m_height
= height
;
587 if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH)
589 if (width == -1) m_width = 80;
592 if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT)
594 if (height == -1) m_height = 26;
598 if ((m_minWidth
!= -1) && (m_width
< m_minWidth
)) m_width
= m_minWidth
;
599 if ((m_minHeight
!= -1) && (m_height
< m_minHeight
)) m_height
= m_minHeight
;
600 if ((m_maxWidth
!= -1) && (m_width
> m_maxWidth
)) m_width
= m_maxWidth
;
601 if ((m_maxHeight
!= -1) && (m_height
> m_maxHeight
)) m_height
= m_maxHeight
;
603 if ((m_x
!= -1) || (m_y
!= -1))
605 if ((m_x
!= old_x
) || (m_y
!= old_y
))
607 gtk_widget_set_uposition( m_widget
, m_x
, m_y
);
611 if ((m_width
!= old_width
) || (m_height
!= old_height
))
613 /* we set the size in GtkOnSize, i.e. mostly the actual resizing is
614 done either directly before the frame is shown or in idle time
615 so that different calls to SetSize() don't lead to flicker. */
622 void wxFrame::DoGetClientSize( int *width
, int *height
) const
624 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
626 wxWindow::DoGetClientSize( width
, height
);
632 if (!m_menuBarDetached
)
633 (*height
) -= wxMENU_HEIGHT
;
635 (*height
) -= wxPLACE_HOLDER
;
640 if (m_frameStatusBar
) (*height
) -= wxSTATUS_HEIGHT
;
641 #endif // wxUSE_STATUSBAR
647 if (m_toolBarDetached
)
649 *height
-= wxPLACE_HOLDER
;
654 m_frameToolBar
->GetSize( &x
, &y
);
655 if ( m_frameToolBar
->GetWindowStyle() & wxTB_VERTICAL
)
665 #endif // wxUSE_TOOLBAR
668 *height
-= m_miniEdge
*2 + m_miniTitle
;
672 *width
-= m_miniEdge
*2;
676 void wxFrame::DoSetClientSize( int width
, int height
)
678 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
683 if (!m_menuBarDetached
)
684 height
+= wxMENU_HEIGHT
;
686 height
+= wxPLACE_HOLDER
;
691 if (m_frameStatusBar
) height
+= wxSTATUS_HEIGHT
;
698 if (m_toolBarDetached
)
700 height
+= wxPLACE_HOLDER
;
705 m_frameToolBar
->GetSize( &x
, &y
);
706 if ( m_frameToolBar
->GetWindowStyle() & wxTB_VERTICAL
)
718 DoSetSize( -1, -1, width
+ m_miniEdge
*2, height
+ m_miniEdge
*2 + m_miniTitle
, 0 );
721 void wxFrame::GtkOnSize( int WXUNUSED(x
), int WXUNUSED(y
),
722 int width
, int height
)
724 // due to a bug in gtk, x,y are always 0
728 /* avoid recursions */
729 if (m_resizing
) return;
732 /* this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow */
733 wxASSERT_MSG( (m_wxwindow
!= NULL
), wxT("invalid frame") );
738 /* space occupied by m_frameToolBar and m_frameMenuBar */
739 int client_area_x_offset
= 0,
740 client_area_y_offset
= 0;
742 /* wxMDIChildFrame derives from wxFrame but it _is_ a wxWindow as it uses
743 wxWindow::Create to create it's GTK equivalent. m_mainWidget is only
744 set in wxFrame::Create so it is used to check what kind of frame we
745 have here. if m_mainWidget is NULL it is a wxMDIChildFrame and so we
746 skip the part which handles m_frameMenuBar, m_frameToolBar and (most
747 importantly) m_mainWidget */
751 /* check if size is in legal range */
752 if ((m_minWidth
!= -1) && (m_width
< m_minWidth
)) m_width
= m_minWidth
;
753 if ((m_minHeight
!= -1) && (m_height
< m_minHeight
)) m_height
= m_minHeight
;
754 if ((m_maxWidth
!= -1) && (m_width
> m_maxWidth
)) m_width
= m_maxWidth
;
755 if ((m_maxHeight
!= -1) && (m_height
> m_maxHeight
)) m_height
= m_maxHeight
;
757 /* I revert back to wxGTK's original behaviour. m_mainWidget holds the
758 * menubar, the toolbar and the client area, which is represented by
760 * this hurts in the eye, but I don't want to call SetSize()
761 * because I don't want to call any non-native functions here. */
766 int yy
= m_miniEdge
+ m_miniTitle
;
767 int ww
= m_width
- 2*m_miniEdge
;
768 int hh
= wxMENU_HEIGHT
;
769 if (m_menuBarDetached
) hh
= wxPLACE_HOLDER
;
770 m_frameMenuBar
->m_x
= xx
;
771 m_frameMenuBar
->m_y
= yy
;
772 m_frameMenuBar
->m_width
= ww
;
773 m_frameMenuBar
->m_height
= hh
;
774 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget
),
775 m_frameMenuBar
->m_widget
,
777 client_area_y_offset
+= hh
;
781 if ((m_frameToolBar
) &&
782 (m_frameToolBar
->m_widget
->parent
== m_mainWidget
))
785 int yy
= m_miniEdge
+ m_miniTitle
;
788 if (!m_menuBarDetached
)
791 yy
+= wxPLACE_HOLDER
;
794 m_frameToolBar
->m_x
= xx
;
795 m_frameToolBar
->m_y
= yy
;
797 /* don't change the toolbar's reported height/width */
799 if ( m_frameToolBar
->GetWindowStyle() & wxTB_VERTICAL
)
801 ww
= m_toolBarDetached
? wxPLACE_HOLDER
802 : m_frameToolBar
->m_width
;
803 hh
= m_height
- 2*m_miniEdge
;
805 client_area_x_offset
+= ww
;
809 ww
= m_width
- 2*m_miniEdge
;
810 hh
= m_toolBarDetached
? wxPLACE_HOLDER
811 : m_frameToolBar
->m_height
;
813 client_area_y_offset
+= hh
;
816 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget
),
817 m_frameToolBar
->m_widget
,
820 #endif // wxUSE_TOOLBAR
822 int client_x
= client_area_x_offset
+ m_miniEdge
;
823 int client_y
= client_area_y_offset
+ m_miniEdge
+ m_miniTitle
;
824 int client_w
= m_width
- client_area_x_offset
- 2*m_miniEdge
;
825 int client_h
= m_height
- client_area_y_offset
- 2*m_miniEdge
- m_miniTitle
;
826 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget
),
828 client_x
, client_y
, client_w
, client_h
);
832 /* if there is no m_mainWidget between m_widget and m_wxwindow there
833 is no need to set the size or position of m_wxwindow. */
837 if (m_frameStatusBar
)
839 int xx
= 0 + m_miniEdge
;
840 int yy
= m_height
- wxSTATUS_HEIGHT
- m_miniEdge
- client_area_y_offset
;
841 int ww
= m_width
- 2*m_miniEdge
;
842 int hh
= wxSTATUS_HEIGHT
;
843 m_frameStatusBar
->m_x
= xx
;
844 m_frameStatusBar
->m_y
= yy
;
845 m_frameStatusBar
->m_width
= ww
;
846 m_frameStatusBar
->m_height
= hh
;
847 gtk_pizza_set_size( GTK_PIZZA(m_wxwindow
),
848 m_frameStatusBar
->m_widget
,
850 gtk_widget_draw( m_frameStatusBar
->m_widget
, (GdkRectangle
*) NULL
);
854 /* we actually set the size of a frame here and no-where else */
855 gtk_widget_set_usize( m_widget
, m_width
, m_height
);
859 // send size event to frame
860 wxSizeEvent
event( wxSize(m_width
,m_height
), GetId() );
861 event
.SetEventObject( this );
862 GetEventHandler()->ProcessEvent( event
);
864 // send size event to status bar
865 if (m_frameStatusBar
)
867 wxSizeEvent
event2( wxSize(m_frameStatusBar
->m_width
,m_frameStatusBar
->m_height
), m_frameStatusBar
->GetId() );
868 event2
.SetEventObject( m_frameStatusBar
);
869 m_frameStatusBar
->GetEventHandler()->ProcessEvent( event2
);
875 void wxFrame::MakeModal( bool modal
)
878 gtk_grab_add( m_widget
);
880 gtk_grab_remove( m_widget
);
883 void wxFrame::OnInternalIdle()
885 if (!m_sizeSet
&& GTK_WIDGET_REALIZED(m_wxwindow
))
887 GtkOnSize( m_x
, m_y
, m_width
, m_height
);
889 // we'll come back later
891 wxapp_install_idle_handler();
895 if (m_frameMenuBar
) m_frameMenuBar
->OnInternalIdle();
897 if (m_frameToolBar
) m_frameToolBar
->OnInternalIdle();
900 if (m_frameStatusBar
) m_frameStatusBar
->OnInternalIdle();
903 wxWindow::OnInternalIdle();
906 // ----------------------------------------------------------------------------
907 // menu/tool/status bar stuff
908 // ----------------------------------------------------------------------------
910 void wxFrame::SetMenuBar( wxMenuBar
*menuBar
)
912 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
913 wxASSERT_MSG( (m_wxwindow
!= NULL
), wxT("invalid frame") );
915 if (menuBar
== m_frameMenuBar
)
920 m_frameMenuBar
->UnsetInvokingWindow( this );
922 if (m_frameMenuBar
->GetWindowStyle() & wxMB_DOCKABLE
)
924 gtk_signal_disconnect_by_func( GTK_OBJECT(m_frameMenuBar
->m_widget
),
925 GTK_SIGNAL_FUNC(gtk_menu_attached_callback
), (gpointer
)this );
927 gtk_signal_disconnect_by_func( GTK_OBJECT(m_frameMenuBar
->m_widget
),
928 GTK_SIGNAL_FUNC(gtk_menu_detached_callback
), (gpointer
)this );
931 gtk_container_remove( GTK_CONTAINER(m_mainWidget
), m_frameMenuBar
->m_widget
);
932 gtk_widget_ref( m_frameMenuBar
->m_widget
);
933 gtk_widget_unparent( m_frameMenuBar
->m_widget
);
936 m_frameMenuBar
= menuBar
;
940 m_frameMenuBar
->SetInvokingWindow( this );
942 m_frameMenuBar
->SetParent(this);
943 gtk_pizza_put( GTK_PIZZA(m_mainWidget
),
944 m_frameMenuBar
->m_widget
,
947 m_frameMenuBar
->m_width
,
948 m_frameMenuBar
->m_height
);
950 if (menuBar
->GetWindowStyle() & wxMB_DOCKABLE
)
952 gtk_signal_connect( GTK_OBJECT(menuBar
->m_widget
), "child_attached",
953 GTK_SIGNAL_FUNC(gtk_menu_attached_callback
), (gpointer
)this );
955 gtk_signal_connect( GTK_OBJECT(menuBar
->m_widget
), "child_detached",
956 GTK_SIGNAL_FUNC(gtk_menu_detached_callback
), (gpointer
)this );
959 m_frameMenuBar
->Show( TRUE
);
962 /* resize window in OnInternalIdle */
967 wxToolBar
* wxFrame::CreateToolBar( long style
, wxWindowID id
, const wxString
& name
)
969 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
971 m_insertInClientArea
= FALSE
;
973 m_frameToolBar
= wxFrameBase::CreateToolBar( style
, id
, name
);
976 GetChildren().DeleteObject( m_frameToolBar
);
978 m_insertInClientArea
= TRUE
;
982 return m_frameToolBar
;
985 void wxFrame::SetToolBar(wxToolBar
*toolbar
)
987 wxFrameBase::SetToolBar(toolbar
);
991 /* insert into toolbar area if not already there */
992 if ((m_frameToolBar
->m_widget
->parent
) &&
993 (m_frameToolBar
->m_widget
->parent
!= m_mainWidget
))
995 GetChildren().DeleteObject( m_frameToolBar
);
997 gtk_widget_reparent( m_frameToolBar
->m_widget
, m_mainWidget
);
1003 #endif // wxUSE_TOOLBAR
1007 wxStatusBar
* wxFrame::CreateStatusBar(int number
,
1010 const wxString
& name
)
1012 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
1014 // because it will change when toolbar is added
1017 return wxFrameBase::CreateStatusBar( number
, style
, id
, name
);
1020 void wxFrame::PositionStatusBar()
1022 if ( !m_frameStatusBar
)
1027 #endif // wxUSE_STATUSBAR
1029 // ----------------------------------------------------------------------------
1031 // ----------------------------------------------------------------------------
1033 void wxFrame::SetTitle( const wxString
&title
)
1035 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
1038 gtk_window_set_title( GTK_WINDOW(m_widget
), title
.mbc_str() );
1041 void wxFrame::SetIcon( const wxIcon
&icon
)
1043 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
1045 wxFrameBase::SetIcon(icon
);
1050 if (!m_widget
->window
)
1053 wxMask
*mask
= icon
.GetMask();
1054 GdkBitmap
*bm
= (GdkBitmap
*) NULL
;
1055 if (mask
) bm
= mask
->GetBitmap();
1057 gdk_window_set_icon( m_widget
->window
, (GdkWindow
*) NULL
, icon
.GetPixmap(), bm
);
1060 // ----------------------------------------------------------------------------
1061 // frame state: maximized/iconized/normal (TODO)
1062 // ----------------------------------------------------------------------------
1064 void wxFrame::Maximize(bool WXUNUSED(maximize
))
1068 bool wxFrame::IsMaximized() const
1073 void wxFrame::Restore()
1077 void wxFrame::Iconize( bool iconize
)
1081 XIconifyWindow( GDK_WINDOW_XDISPLAY( m_widget
->window
),
1082 GDK_WINDOW_XWINDOW( m_widget
->window
),
1083 DefaultScreen( GDK_DISPLAY() ) );
1087 bool wxFrame::IsIconized() const