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 #define XIconifyWindow XICONIFYWINDOW
27 #include "wx/dialog.h"
28 #include "wx/control.h"
32 #include "wx/toolbar.h"
35 #include "wx/statusbr.h"
37 #include "wx/dcclient.h"
42 #include <gdk/gdkkeysyms.h>
45 #include "wx/gtk/win_gtk.h"
47 // ----------------------------------------------------------------------------
49 // ----------------------------------------------------------------------------
51 const int wxMENU_HEIGHT
= 27;
52 const int wxSTATUS_HEIGHT
= 25;
53 const int wxPLACE_HOLDER
= 0;
55 // ----------------------------------------------------------------------------
57 // ----------------------------------------------------------------------------
59 extern void wxapp_install_idle_handler();
61 extern int g_openDialogs
;
63 // ----------------------------------------------------------------------------
65 // ----------------------------------------------------------------------------
67 IMPLEMENT_DYNAMIC_CLASS(wxFrame
,wxWindow
)
69 // ----------------------------------------------------------------------------
71 // ----------------------------------------------------------------------------
73 extern wxList wxPendingDelete
;
75 // ----------------------------------------------------------------------------
77 // ----------------------------------------------------------------------------
81 extern void debug_focus_in( GtkWidget
* widget
, const wxChar
* name
, const wxChar
*window
);
85 // ============================================================================
87 // ============================================================================
89 // ----------------------------------------------------------------------------
91 // ----------------------------------------------------------------------------
93 //-----------------------------------------------------------------------------
94 // "focus" from m_window
95 //-----------------------------------------------------------------------------
97 static gint
gtk_frame_focus_callback( GtkWidget
*widget
, GtkDirectionType
WXUNUSED(d
), wxWindow
*WXUNUSED(win
) )
100 wxapp_install_idle_handler();
102 // This disables GTK's tab traversal
103 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "focus" );
107 //-----------------------------------------------------------------------------
109 //-----------------------------------------------------------------------------
111 static void gtk_frame_size_callback( GtkWidget
*WXUNUSED(widget
), GtkAllocation
* alloc
, wxFrame
*win
)
114 wxapp_install_idle_handler();
119 if ((win
->m_width
!= alloc
->width
) || (win
->m_height
!= alloc
->height
))
122 wxPrintf( "OnSize from " );
123 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
124 wxPrintf( win->GetClassInfo()->GetClassName() );
125 wxPrintf( " %d %d %d %d\n", (int)alloc->x,
128 (int)alloc->height );
131 win
->m_width
= alloc
->width
;
132 win
->m_height
= alloc
->height
;
133 win
->m_queuedFullRedraw
= TRUE
;
134 win
->GtkUpdateSize();
138 //-----------------------------------------------------------------------------
140 //-----------------------------------------------------------------------------
142 static gint
gtk_frame_delete_callback( GtkWidget
*WXUNUSED(widget
), GdkEvent
*WXUNUSED(event
), wxFrame
*win
)
145 wxapp_install_idle_handler();
147 if ((g_openDialogs
== 0) && (win
->IsEnabled()))
153 //-----------------------------------------------------------------------------
154 // "child_attached" of menu bar
155 //-----------------------------------------------------------------------------
157 static void gtk_menu_attached_callback( GtkWidget
*WXUNUSED(widget
), GtkWidget
*WXUNUSED(child
), wxFrame
*win
)
159 if (!win
->m_hasVMT
) return;
161 win
->m_menuBarDetached
= FALSE
;
162 win
->GtkUpdateSize();
165 //-----------------------------------------------------------------------------
166 // "child_detached" of menu bar
167 //-----------------------------------------------------------------------------
169 static void gtk_menu_detached_callback( GtkWidget
*WXUNUSED(widget
), GtkWidget
*WXUNUSED(child
), wxFrame
*win
)
171 if (!win
->m_hasVMT
) return;
173 win
->m_menuBarDetached
= TRUE
;
174 win
->GtkUpdateSize();
178 //-----------------------------------------------------------------------------
179 // "child_attached" of tool bar
180 //-----------------------------------------------------------------------------
182 static void gtk_toolbar_attached_callback( GtkWidget
*WXUNUSED(widget
), GtkWidget
*WXUNUSED(child
), wxFrame
*win
)
184 if (!win
->m_hasVMT
) return;
186 win
->m_toolBarDetached
= FALSE
;
188 win
->GtkUpdateSize();
191 //-----------------------------------------------------------------------------
192 // "child_detached" of tool bar
193 //-----------------------------------------------------------------------------
195 static void gtk_toolbar_detached_callback( GtkWidget
*WXUNUSED(widget
), GtkWidget
*WXUNUSED(child
), wxFrame
*win
)
198 wxapp_install_idle_handler();
200 if (!win
->m_hasVMT
) return;
202 win
->m_toolBarDetached
= TRUE
;
203 win
->GtkUpdateSize();
205 #endif // wxUSE_TOOLBAR
207 //-----------------------------------------------------------------------------
209 //-----------------------------------------------------------------------------
212 #if (GTK_MINOR_VERSION > 0)
213 gtk_frame_configure_callback( GtkWidget
*WXUNUSED(widget
), GdkEventConfigure
*WXUNUSED(event
), wxFrame
*win
)
215 gtk_frame_configure_callback( GtkWidget
*WXUNUSED(widget
), GdkEventConfigure
*event
, wxFrame
*win
)
219 wxapp_install_idle_handler();
224 #if (GTK_MINOR_VERSION > 0)
227 gdk_window_get_root_origin( win
->m_widget
->window
, &x
, &y
);
235 wxMoveEvent
mevent( wxPoint(win
->m_x
,win
->m_y
), win
->GetId() );
236 mevent
.SetEventObject( win
);
237 win
->GetEventHandler()->ProcessEvent( mevent
);
242 //-----------------------------------------------------------------------------
243 // "realize" from m_widget
244 //-----------------------------------------------------------------------------
246 /* we cannot MWM hints and icons before the widget has been realized,
247 so we do this directly after realization */
250 gtk_frame_realized_callback( GtkWidget
* WXUNUSED(widget
), wxFrame
*win
)
253 wxapp_install_idle_handler();
255 if ((win
->m_miniEdge
> 0) || (win
->HasFlag(wxSIMPLE_BORDER
)))
257 /* This is a mini-frame or a borderless frame. */
258 gdk_window_set_decorations( win
->m_widget
->window
, (GdkWMDecoration
)0 );
259 gdk_window_set_functions( win
->m_widget
->window
, (GdkWMFunction
)0 );
263 /* All this is for Motif Window Manager "hints" and is supposed to be
264 recognized by other WM as well. Not tested. */
265 long decor
= (long) GDK_DECOR_BORDER
;
266 long func
= (long) GDK_FUNC_MOVE
;
268 if ((win
->GetWindowStyle() & wxCAPTION
) != 0)
269 decor
|= GDK_DECOR_TITLE
;
270 if ((win
->GetWindowStyle() & wxSYSTEM_MENU
) != 0)
272 decor
|= GDK_DECOR_MENU
;
273 func
|= GDK_FUNC_CLOSE
;
275 if ((win
->GetWindowStyle() & wxMINIMIZE_BOX
) != 0)
277 func
|= GDK_FUNC_MINIMIZE
;
278 decor
|= GDK_DECOR_MINIMIZE
;
280 if ((win
->GetWindowStyle() & wxMAXIMIZE_BOX
) != 0)
282 func
|= GDK_FUNC_MAXIMIZE
;
283 decor
|= GDK_DECOR_MAXIMIZE
;
285 if ((win
->GetWindowStyle() & wxRESIZE_BORDER
) != 0)
287 func
|= GDK_FUNC_RESIZE
;
288 decor
|= GDK_DECOR_RESIZEH
;
291 gdk_window_set_decorations( win
->m_widget
->window
, (GdkWMDecoration
)decor
);
292 gdk_window_set_functions( win
->m_widget
->window
, (GdkWMFunction
)func
);
295 /* GTK's shrinking/growing policy */
296 if ((win
->GetWindowStyle() & wxRESIZE_BORDER
) == 0)
297 gtk_window_set_policy(GTK_WINDOW(win
->m_widget
), 0, 0, 1);
299 gtk_window_set_policy(GTK_WINDOW(win
->m_widget
), 1, 1, 1);
302 wxIcon iconOld
= win
->GetIcon();
303 if ( iconOld
!= wxNullIcon
)
305 wxIcon
icon( iconOld
);
306 win
->SetIcon( wxNullIcon
);
307 win
->SetIcon( icon
);
310 /* we set the focus to the child that accepts the focus. this
311 doesn't really have to be done in "realize" but why not? */
312 wxWindowList::Node
*node
= win
->GetChildren().GetFirst();
315 wxWindow
*child
= node
->GetData();
316 if (child
->AcceptsFocus())
322 node
= node
->GetNext();
328 // ----------------------------------------------------------------------------
330 // ----------------------------------------------------------------------------
332 //-----------------------------------------------------------------------------
333 // InsertChild for wxFrame
334 //-----------------------------------------------------------------------------
336 /* Callback for wxFrame. This very strange beast has to be used because
337 * C++ has no virtual methods in a constructor. We have to emulate a
338 * virtual function here as wxWindows requires different ways to insert
339 * a child in container classes. */
341 static void wxInsertChildInFrame( wxFrame
* parent
, wxWindow
* child
)
343 wxASSERT( GTK_IS_WIDGET(child
->m_widget
) );
345 if (!parent
->m_insertInClientArea
)
347 /* these are outside the client area */
348 wxFrame
* frame
= (wxFrame
*) parent
;
349 gtk_pizza_put( GTK_PIZZA(frame
->m_mainWidget
),
350 GTK_WIDGET(child
->m_widget
),
356 #if wxUSE_TOOLBAR_NATIVE
357 /* we connect to these events for recalculating the client area
358 space when the toolbar is floating */
359 if (wxIS_KIND_OF(child
,wxToolBar
))
361 wxToolBar
*toolBar
= (wxToolBar
*) child
;
362 if (toolBar
->GetWindowStyle() & wxTB_DOCKABLE
)
364 gtk_signal_connect( GTK_OBJECT(toolBar
->m_widget
), "child_attached",
365 GTK_SIGNAL_FUNC(gtk_toolbar_attached_callback
), (gpointer
)parent
);
367 gtk_signal_connect( GTK_OBJECT(toolBar
->m_widget
), "child_detached",
368 GTK_SIGNAL_FUNC(gtk_toolbar_detached_callback
), (gpointer
)parent
);
371 #endif // wxUSE_TOOLBAR
375 /* these are inside the client area */
376 gtk_pizza_put( GTK_PIZZA(parent
->m_wxwindow
),
377 GTK_WIDGET(child
->m_widget
),
384 /* resize on OnInternalIdle */
385 parent
->GtkUpdateSize();
388 // ----------------------------------------------------------------------------
390 // ----------------------------------------------------------------------------
397 m_mainWidget
= (GtkWidget
*) NULL
;
398 m_menuBarDetached
= FALSE
;
399 m_toolBarDetached
= FALSE
;
400 m_insertInClientArea
= TRUE
;
403 bool wxFrame::Create( wxWindow
*parent
,
405 const wxString
&title
,
409 const wxString
&name
)
411 wxTopLevelWindows
.Append( this );
413 m_needParent
= FALSE
;
415 if (!PreCreation( parent
, pos
, size
) ||
416 !CreateBase( parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
))
418 wxFAIL_MSG( wxT("wxFrame creation failed") );
424 m_insertCallback
= (wxInsertChildFunction
) wxInsertChildInFrame
;
426 GtkWindowType win_type
= GTK_WINDOW_TOPLEVEL
;
428 m_widget
= gtk_window_new( win_type
);
430 if ((m_parent
) && (HasFlag(wxFRAME_FLOAT_ON_PARENT
)) && (GTK_IS_WINDOW(m_parent
->m_widget
)))
431 gtk_window_set_transient_for( GTK_WINDOW(m_widget
), GTK_WINDOW(m_parent
->m_widget
) );
434 gtk_window_set_wmclass( GTK_WINDOW(m_widget
), name
.mb_str(), name
.mb_str() );
437 debug_focus_in( m_widget
, wxT("wxFrame::m_widget"), name
);
440 gtk_window_set_title( GTK_WINDOW(m_widget
), title
.mbc_str() );
441 GTK_WIDGET_UNSET_FLAGS( m_widget
, GTK_CAN_FOCUS
);
443 gtk_signal_connect( GTK_OBJECT(m_widget
), "delete_event",
444 GTK_SIGNAL_FUNC(gtk_frame_delete_callback
), (gpointer
)this );
446 /* m_mainWidget holds the toolbar, the menubar and the client area */
447 m_mainWidget
= gtk_pizza_new();
448 gtk_widget_show( m_mainWidget
);
449 GTK_WIDGET_UNSET_FLAGS( m_mainWidget
, GTK_CAN_FOCUS
);
450 gtk_container_add( GTK_CONTAINER(m_widget
), m_mainWidget
);
453 debug_focus_in( m_mainWidget
, wxT("wxFrame::m_mainWidget"), name
);
456 /* m_wxwindow only represents the client area without toolbar and menubar */
457 m_wxwindow
= gtk_pizza_new();
458 gtk_widget_show( m_wxwindow
);
459 gtk_container_add( GTK_CONTAINER(m_mainWidget
), m_wxwindow
);
462 debug_focus_in( m_wxwindow
, wxT("wxFrame::m_wxwindow"), name
);
465 /* we donm't allow the frame to get the focus as otherwise
466 the frame will grabit at arbitrary fcous changes. */
467 GTK_WIDGET_UNSET_FLAGS( m_wxwindow
, GTK_CAN_FOCUS
);
469 if (m_parent
) m_parent
->AddChild( this );
471 /* the user resized the frame by dragging etc. */
472 gtk_signal_connect( GTK_OBJECT(m_widget
), "size_allocate",
473 GTK_SIGNAL_FUNC(gtk_frame_size_callback
), (gpointer
)this );
477 if ((m_x
!= -1) || (m_y
!= -1))
478 gtk_widget_set_uposition( m_widget
, m_x
, m_y
);
479 gtk_widget_set_usize( m_widget
, m_width
, m_height
);
481 /* we cannot set MWM hints and icons before the widget has
482 been realized, so we do this directly after realization */
483 gtk_signal_connect( GTK_OBJECT(m_widget
), "realize",
484 GTK_SIGNAL_FUNC(gtk_frame_realized_callback
), (gpointer
) this );
486 /* the only way to get the window size is to connect to this event */
487 gtk_signal_connect( GTK_OBJECT(m_widget
), "configure_event",
488 GTK_SIGNAL_FUNC(gtk_frame_configure_callback
), (gpointer
)this );
490 /* disable native tab traversal */
491 gtk_signal_connect( GTK_OBJECT(m_widget
), "focus",
492 GTK_SIGNAL_FUNC(gtk_frame_focus_callback
), (gpointer
)this );
499 m_isBeingDeleted
= TRUE
;
503 wxTopLevelWindows
.DeleteObject( this );
505 if (wxTheApp
->GetTopWindow() == this)
506 wxTheApp
->SetTopWindow( (wxWindow
*) NULL
);
508 if ((wxTopLevelWindows
.Number() == 0) &&
509 (wxTheApp
->GetExitOnFrameDelete()))
511 wxTheApp
->ExitMainLoop();
515 // ----------------------------------------------------------------------------
516 // overridden wxWindow methods
517 // ----------------------------------------------------------------------------
519 bool wxFrame::Show( bool show
)
521 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
523 if (show
&& !m_sizeSet
)
525 /* by calling GtkOnSize here, we don't have to call
526 either after showing the frame, which would entail
527 much ugly flicker or from within the size_allocate
528 handler, because GTK 1.1.X forbids that. */
530 GtkOnSize( m_x
, m_y
, m_width
, m_height
);
533 return wxWindow::Show( show
);
536 void wxFrame::DoMoveWindow(int WXUNUSED(x
), int WXUNUSED(y
), int WXUNUSED(width
), int WXUNUSED(height
) )
538 wxFAIL_MSG( wxT("DoMoveWindow called for wxFrame") );
541 void wxFrame::DoSetSize( int x
, int y
, int width
, int height
, int sizeFlags
)
543 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
545 /* this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow */
546 wxASSERT_MSG( (m_wxwindow
!= NULL
), wxT("invalid frame") );
548 /* avoid recursions */
556 int old_width
= m_width
;
557 int old_height
= m_height
;
559 if ((sizeFlags
& wxSIZE_ALLOW_MINUS_ONE
) == 0)
561 if (x
!= -1) m_x
= x
;
562 if (y
!= -1) m_y
= y
;
563 if (width
!= -1) m_width
= width
;
564 if (height
!= -1) m_height
= height
;
575 if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH)
577 if (width == -1) m_width = 80;
580 if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT)
582 if (height == -1) m_height = 26;
586 if ((m_minWidth
!= -1) && (m_width
< m_minWidth
)) m_width
= m_minWidth
;
587 if ((m_minHeight
!= -1) && (m_height
< m_minHeight
)) m_height
= m_minHeight
;
588 if ((m_maxWidth
!= -1) && (m_width
> m_maxWidth
)) m_width
= m_maxWidth
;
589 if ((m_maxHeight
!= -1) && (m_height
> m_maxHeight
)) m_height
= m_maxHeight
;
591 if ((m_x
!= -1) || (m_y
!= -1))
593 if ((m_x
!= old_x
) || (m_y
!= old_y
))
595 gtk_widget_set_uposition( m_widget
, m_x
, m_y
);
599 if ((m_width
!= old_width
) || (m_height
!= old_height
))
601 gtk_widget_set_usize( m_widget
, m_width
, m_height
);
603 /* we set the size in GtkOnSize, i.e. mostly the actual resizing is
604 done either directly before the frame is shown or in idle time
605 so that different calls to SetSize() don't lead to flicker. */
612 void wxFrame::DoGetClientSize( int *width
, int *height
) const
614 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
616 wxWindow::DoGetClientSize( width
, height
);
622 if (!m_menuBarDetached
)
623 (*height
) -= wxMENU_HEIGHT
;
625 (*height
) -= wxPLACE_HOLDER
;
630 if (m_frameStatusBar
) (*height
) -= wxSTATUS_HEIGHT
;
631 #endif // wxUSE_STATUSBAR
637 if (m_toolBarDetached
)
639 *height
-= wxPLACE_HOLDER
;
644 m_frameToolBar
->GetSize( &x
, &y
);
645 if ( m_frameToolBar
->GetWindowStyle() & wxTB_VERTICAL
)
655 #endif // wxUSE_TOOLBAR
658 *height
-= m_miniEdge
*2 + m_miniTitle
;
662 *width
-= m_miniEdge
*2;
666 void wxFrame::DoSetClientSize( int width
, int height
)
668 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
673 if (!m_menuBarDetached
)
674 height
+= wxMENU_HEIGHT
;
676 height
+= wxPLACE_HOLDER
;
681 if (m_frameStatusBar
) height
+= wxSTATUS_HEIGHT
;
688 if (m_toolBarDetached
)
690 height
+= wxPLACE_HOLDER
;
695 m_frameToolBar
->GetSize( &x
, &y
);
696 if ( m_frameToolBar
->GetWindowStyle() & wxTB_VERTICAL
)
708 DoSetSize( -1, -1, width
+ m_miniEdge
*2, height
+ m_miniEdge
*2 + m_miniTitle
, 0 );
711 void wxFrame::GtkOnSize( int WXUNUSED(x
), int WXUNUSED(y
),
712 int width
, int height
)
714 // due to a bug in gtk, x,y are always 0
718 /* avoid recursions */
719 if (m_resizing
) return;
722 /* this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow */
723 wxASSERT_MSG( (m_wxwindow
!= NULL
), wxT("invalid frame") );
728 /* space occupied by m_frameToolBar and m_frameMenuBar */
729 int client_area_x_offset
= 0,
730 client_area_y_offset
= 0;
732 /* wxMDIChildFrame derives from wxFrame but it _is_ a wxWindow as it uses
733 wxWindow::Create to create it's GTK equivalent. m_mainWidget is only
734 set in wxFrame::Create so it is used to check what kind of frame we
735 have here. if m_mainWidget is NULL it is a wxMDIChildFrame and so we
736 skip the part which handles m_frameMenuBar, m_frameToolBar and (most
737 importantly) m_mainWidget */
739 if ((m_minWidth
!= -1) && (m_width
< m_minWidth
)) m_width
= m_minWidth
;
740 if ((m_minHeight
!= -1) && (m_height
< m_minHeight
)) m_height
= m_minHeight
;
741 if ((m_maxWidth
!= -1) && (m_width
> m_maxWidth
)) m_width
= m_maxWidth
;
742 if ((m_maxHeight
!= -1) && (m_height
> m_maxHeight
)) m_height
= m_maxHeight
;
747 gint flag
= 0; // GDK_HINT_POS;
748 if ((m_minWidth
!= -1) || (m_minHeight
!= -1)) flag
|= GDK_HINT_MIN_SIZE
;
749 if ((m_maxWidth
!= -1) || (m_maxHeight
!= -1)) flag
|= GDK_HINT_MAX_SIZE
;
751 geom
.min_width
= m_minWidth
;
752 geom
.min_height
= m_minHeight
;
753 geom
.max_width
= m_maxWidth
;
754 geom
.max_height
= m_maxHeight
;
755 gtk_window_set_geometry_hints( GTK_WINDOW(m_widget
),
758 (GdkWindowHints
) flag
);
760 /* I revert back to wxGTK's original behaviour. m_mainWidget holds the
761 * menubar, the toolbar and the client area, which is represented by
763 * this hurts in the eye, but I don't want to call SetSize()
764 * because I don't want to call any non-native functions here. */
769 int yy
= m_miniEdge
+ m_miniTitle
;
770 int ww
= m_width
- 2*m_miniEdge
;
771 int hh
= wxMENU_HEIGHT
;
772 if (m_menuBarDetached
) hh
= wxPLACE_HOLDER
;
773 m_frameMenuBar
->m_x
= xx
;
774 m_frameMenuBar
->m_y
= yy
;
775 m_frameMenuBar
->m_width
= ww
;
776 m_frameMenuBar
->m_height
= hh
;
777 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget
),
778 m_frameMenuBar
->m_widget
,
780 client_area_y_offset
+= hh
;
784 if ((m_frameToolBar
) &&
785 (m_frameToolBar
->m_widget
->parent
== m_mainWidget
))
788 int yy
= m_miniEdge
+ m_miniTitle
;
791 if (!m_menuBarDetached
)
794 yy
+= wxPLACE_HOLDER
;
797 m_frameToolBar
->m_x
= xx
;
798 m_frameToolBar
->m_y
= yy
;
800 /* don't change the toolbar's reported height/width */
802 if ( m_frameToolBar
->GetWindowStyle() & wxTB_VERTICAL
)
804 ww
= m_toolBarDetached
? wxPLACE_HOLDER
805 : m_frameToolBar
->m_width
;
806 hh
= m_height
- 2*m_miniEdge
;
808 client_area_x_offset
+= ww
;
812 ww
= m_width
- 2*m_miniEdge
;
813 hh
= m_toolBarDetached
? wxPLACE_HOLDER
814 : m_frameToolBar
->m_height
;
816 client_area_y_offset
+= hh
;
819 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget
),
820 m_frameToolBar
->m_widget
,
823 #endif // wxUSE_TOOLBAR
825 int client_x
= client_area_x_offset
+ m_miniEdge
;
826 int client_y
= client_area_y_offset
+ m_miniEdge
+ m_miniTitle
;
827 int client_w
= m_width
- client_area_x_offset
- 2*m_miniEdge
;
828 int client_h
= m_height
- client_area_y_offset
- 2*m_miniEdge
- m_miniTitle
;
829 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget
),
831 client_x
, client_y
, client_w
, client_h
);
835 /* if there is no m_mainWidget between m_widget and m_wxwindow there
836 is no need to set the size or position of m_wxwindow. */
840 if (m_frameStatusBar
)
842 int xx
= 0 + m_miniEdge
;
843 int yy
= m_height
- wxSTATUS_HEIGHT
- m_miniEdge
- client_area_y_offset
;
844 int ww
= m_width
- 2*m_miniEdge
;
845 int hh
= wxSTATUS_HEIGHT
;
846 m_frameStatusBar
->m_x
= xx
;
847 m_frameStatusBar
->m_y
= yy
;
848 m_frameStatusBar
->m_width
= ww
;
849 m_frameStatusBar
->m_height
= hh
;
850 gtk_pizza_set_size( GTK_PIZZA(m_wxwindow
),
851 m_frameStatusBar
->m_widget
,
853 gtk_widget_draw( m_frameStatusBar
->m_widget
, (GdkRectangle
*) NULL
);
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
);
975 m_insertInClientArea
= TRUE
;
979 return m_frameToolBar
;
982 void wxFrame::SetToolBar(wxToolBar
*toolbar
)
984 wxFrameBase::SetToolBar(toolbar
);
988 /* insert into toolbar area if not already there */
989 if ((m_frameToolBar
->m_widget
->parent
) &&
990 (m_frameToolBar
->m_widget
->parent
!= m_mainWidget
))
992 GetChildren().DeleteObject( m_frameToolBar
);
994 gtk_widget_reparent( m_frameToolBar
->m_widget
, m_mainWidget
);
1000 #endif // wxUSE_TOOLBAR
1004 wxStatusBar
* wxFrame::CreateStatusBar(int number
,
1007 const wxString
& name
)
1009 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
1011 // because it will change when toolbar is added
1014 return wxFrameBase::CreateStatusBar( number
, style
, id
, name
);
1017 void wxFrame::PositionStatusBar()
1019 if ( !m_frameStatusBar
)
1024 #endif // wxUSE_STATUSBAR
1026 // ----------------------------------------------------------------------------
1028 // ----------------------------------------------------------------------------
1030 void wxFrame::SetTitle( const wxString
&title
)
1032 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
1035 gtk_window_set_title( GTK_WINDOW(m_widget
), title
.mbc_str() );
1038 void wxFrame::SetIcon( const wxIcon
&icon
)
1040 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
1042 wxFrameBase::SetIcon(icon
);
1047 if (!m_widget
->window
)
1050 wxMask
*mask
= icon
.GetMask();
1051 GdkBitmap
*bm
= (GdkBitmap
*) NULL
;
1052 if (mask
) bm
= mask
->GetBitmap();
1054 gdk_window_set_icon( m_widget
->window
, (GdkWindow
*) NULL
, icon
.GetPixmap(), bm
);
1057 // ----------------------------------------------------------------------------
1058 // frame state: maximized/iconized/normal (TODO)
1059 // ----------------------------------------------------------------------------
1061 void wxFrame::Maximize(bool WXUNUSED(maximize
))
1065 bool wxFrame::IsMaximized() const
1070 void wxFrame::Restore()
1074 void wxFrame::Iconize( bool iconize
)
1078 XIconifyWindow( GDK_WINDOW_XDISPLAY( m_widget
->window
),
1079 GDK_WINDOW_XWINDOW( m_widget
->window
),
1080 DefaultScreen( GDK_DISPLAY() ) );
1084 bool wxFrame::IsIconized() const