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 if ((win
->m_miniEdge
> 0) || (win
->HasFlag(wxSIMPLE_BORDER
)))
253 /* This is a mini-frame or a borderless frame. */
254 gdk_window_set_decorations( win
->m_widget
->window
, (GdkWMDecoration
)0 );
255 gdk_window_set_functions( win
->m_widget
->window
, (GdkWMFunction
)0 );
259 /* All this is for Motif Window Manager "hints" and is supposed to be
260 recognized by other WM as well. Not tested. */
261 long decor
= (long) GDK_DECOR_BORDER
;
262 long func
= (long) GDK_FUNC_MOVE
;
264 if ((win
->GetWindowStyle() & wxCAPTION
) != 0)
265 decor
|= GDK_DECOR_TITLE
;
266 if ((win
->GetWindowStyle() & wxSYSTEM_MENU
) != 0)
268 decor
|= GDK_DECOR_MENU
;
269 func
|= GDK_FUNC_CLOSE
;
271 if ((win
->GetWindowStyle() & wxMINIMIZE_BOX
) != 0)
273 func
|= GDK_FUNC_MINIMIZE
;
274 decor
|= GDK_DECOR_MINIMIZE
;
276 if ((win
->GetWindowStyle() & wxMAXIMIZE_BOX
) != 0)
278 func
|= GDK_FUNC_MAXIMIZE
;
279 decor
|= GDK_DECOR_MAXIMIZE
;
281 if ((win
->GetWindowStyle() & wxRESIZE_BORDER
) != 0)
283 func
|= GDK_FUNC_RESIZE
;
284 decor
|= GDK_DECOR_RESIZEH
;
287 gdk_window_set_decorations( win
->m_widget
->window
, (GdkWMDecoration
)decor
);
288 gdk_window_set_functions( win
->m_widget
->window
, (GdkWMFunction
)func
);
291 /* GTK's shrinking/growing policy */
292 if ((win
->GetWindowStyle() & wxRESIZE_BORDER
) == 0)
293 gtk_window_set_policy(GTK_WINDOW(win
->m_widget
), 0, 0, 1);
295 gtk_window_set_policy(GTK_WINDOW(win
->m_widget
), 1, 1, 1);
298 gint flag
= 0; // GDK_HINT_POS;
299 if ((win
->GetMinWidth() != -1) || (win
->GetMinHeight() != -1)) flag
|= GDK_HINT_MIN_SIZE
;
300 if ((win
->GetMaxWidth() != -1) || (win
->GetMaxHeight() != -1)) flag
|= GDK_HINT_MAX_SIZE
;
303 gdk_window_set_hints( win
->m_widget
->window
,
305 win
->GetMinWidth(), win
->GetMinHeight(),
306 win
->GetMaxWidth(), win
->GetMaxHeight(),
311 wxIcon iconOld
= win
->GetIcon();
312 if ( iconOld
!= wxNullIcon
)
314 wxIcon
icon( iconOld
);
315 win
->SetIcon( wxNullIcon
);
316 win
->SetIcon( icon
);
319 /* we set the focus to the child that accepts the focus. this
320 doesn't really have to be done in "realize" but why not? */
321 wxWindowList::Node
*node
= win
->GetChildren().GetFirst();
324 wxWindow
*child
= node
->GetData();
325 if (child
->AcceptsFocus())
331 node
= node
->GetNext();
337 // ----------------------------------------------------------------------------
339 // ----------------------------------------------------------------------------
341 //-----------------------------------------------------------------------------
342 // InsertChild for wxFrame
343 //-----------------------------------------------------------------------------
345 /* Callback for wxFrame. This very strange beast has to be used because
346 * C++ has no virtual methods in a constructor. We have to emulate a
347 * virtual function here as wxWindows requires different ways to insert
348 * a child in container classes. */
350 static void wxInsertChildInFrame( wxFrame
* parent
, wxWindow
* child
)
352 wxASSERT( GTK_IS_WIDGET(child
->m_widget
) );
354 if (!parent
->m_insertInClientArea
)
356 /* these are outside the client area */
357 wxFrame
* frame
= (wxFrame
*) parent
;
358 gtk_pizza_put( GTK_PIZZA(frame
->m_mainWidget
),
359 GTK_WIDGET(child
->m_widget
),
365 #if wxUSE_TOOLBAR_NATIVE
366 /* we connect to these events for recalculating the client area
367 space when the toolbar is floating */
368 if (wxIS_KIND_OF(child
,wxToolBar
))
370 wxToolBar
*toolBar
= (wxToolBar
*) child
;
371 if (toolBar
->GetWindowStyle() & wxTB_DOCKABLE
)
373 gtk_signal_connect( GTK_OBJECT(toolBar
->m_widget
), "child_attached",
374 GTK_SIGNAL_FUNC(gtk_toolbar_attached_callback
), (gpointer
)parent
);
376 gtk_signal_connect( GTK_OBJECT(toolBar
->m_widget
), "child_detached",
377 GTK_SIGNAL_FUNC(gtk_toolbar_detached_callback
), (gpointer
)parent
);
380 #endif // wxUSE_TOOLBAR
384 /* these are inside the client area */
385 gtk_pizza_put( GTK_PIZZA(parent
->m_wxwindow
),
386 GTK_WIDGET(child
->m_widget
),
393 /* resize on OnInternalIdle */
394 parent
->GtkUpdateSize();
397 // ----------------------------------------------------------------------------
399 // ----------------------------------------------------------------------------
406 m_mainWidget
= (GtkWidget
*) NULL
;
407 m_menuBarDetached
= FALSE
;
408 m_toolBarDetached
= FALSE
;
409 m_insertInClientArea
= TRUE
;
413 bool wxFrame::Create( wxWindow
*parent
,
415 const wxString
&title
,
419 const wxString
&name
)
421 wxTopLevelWindows
.Append( this );
423 m_needParent
= FALSE
;
426 if (!PreCreation( parent
, pos
, size
) ||
427 !CreateBase( parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
))
429 wxFAIL_MSG( wxT("wxFrame creation failed") );
435 m_insertCallback
= (wxInsertChildFunction
) wxInsertChildInFrame
;
437 GtkWindowType win_type
= GTK_WINDOW_TOPLEVEL
;
439 m_widget
= gtk_window_new( win_type
);
441 if ((m_parent
) && (HasFlag(wxFRAME_FLOAT_ON_PARENT
)) && (GTK_IS_WINDOW(m_parent
->m_widget
)))
442 gtk_window_set_transient_for( GTK_WINDOW(m_widget
), GTK_WINDOW(m_parent
->m_widget
) );
445 gtk_window_set_wmclass( GTK_WINDOW(m_widget
), name
.mb_str(), name
.mb_str() );
448 debug_focus_in( m_widget
, wxT("wxFrame::m_widget"), name
);
451 gtk_window_set_title( GTK_WINDOW(m_widget
), title
.mbc_str() );
452 GTK_WIDGET_UNSET_FLAGS( m_widget
, GTK_CAN_FOCUS
);
454 gtk_signal_connect( GTK_OBJECT(m_widget
), "delete_event",
455 GTK_SIGNAL_FUNC(gtk_frame_delete_callback
), (gpointer
)this );
457 /* m_mainWidget holds the toolbar, the menubar and the client area */
458 m_mainWidget
= gtk_pizza_new();
459 gtk_widget_show( m_mainWidget
);
460 GTK_WIDGET_UNSET_FLAGS( m_mainWidget
, GTK_CAN_FOCUS
);
461 gtk_container_add( GTK_CONTAINER(m_widget
), m_mainWidget
);
464 debug_focus_in( m_mainWidget
, wxT("wxFrame::m_mainWidget"), name
);
467 /* m_wxwindow only represents the client area without toolbar and menubar */
468 m_wxwindow
= gtk_pizza_new();
469 gtk_widget_show( m_wxwindow
);
470 gtk_container_add( GTK_CONTAINER(m_mainWidget
), m_wxwindow
);
473 debug_focus_in( m_wxwindow
, wxT("wxFrame::m_wxwindow"), name
);
476 /* we donm't allow the frame to get the focus as otherwise
477 the frame will grabit at arbitrary fcous changes. */
478 GTK_WIDGET_UNSET_FLAGS( m_wxwindow
, GTK_CAN_FOCUS
);
480 if (m_parent
) m_parent
->AddChild( this );
482 /* the user resized the frame by dragging etc. */
483 gtk_signal_connect( GTK_OBJECT(m_widget
), "size_allocate",
484 GTK_SIGNAL_FUNC(gtk_frame_size_callback
), (gpointer
)this );
488 if ((m_x
!= -1) || (m_y
!= -1))
489 gtk_widget_set_uposition( m_widget
, m_x
, m_y
);
490 gtk_widget_set_usize( m_widget
, m_width
, m_height
);
492 /* we cannot set MWM hints and icons before the widget has
493 been realized, so we do this directly after realization */
494 gtk_signal_connect( GTK_OBJECT(m_widget
), "realize",
495 GTK_SIGNAL_FUNC(gtk_frame_realized_callback
), (gpointer
) this );
497 /* the only way to get the window size is to connect to this event */
498 gtk_signal_connect( GTK_OBJECT(m_widget
), "configure_event",
499 GTK_SIGNAL_FUNC(gtk_frame_configure_callback
), (gpointer
)this );
501 /* disable native tab traversal */
502 gtk_signal_connect( GTK_OBJECT(m_widget
), "focus",
503 GTK_SIGNAL_FUNC(gtk_frame_focus_callback
), (gpointer
)this );
510 m_isBeingDeleted
= TRUE
;
514 wxTopLevelWindows
.DeleteObject( this );
516 if (wxTheApp
->GetTopWindow() == this)
517 wxTheApp
->SetTopWindow( (wxWindow
*) NULL
);
519 if ((wxTopLevelWindows
.Number() == 0) &&
520 (wxTheApp
->GetExitOnFrameDelete()))
522 wxTheApp
->ExitMainLoop();
526 // ----------------------------------------------------------------------------
527 // overridden wxWindow methods
528 // ----------------------------------------------------------------------------
530 bool wxFrame::Show( bool show
)
532 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
534 if (show
&& !m_sizeSet
)
536 /* by calling GtkOnSize here, we don't have to call
537 either after showing the frame, which would entail
538 much ugly flicker or from within the size_allocate
539 handler, because GTK 1.1.X forbids that. */
541 GtkOnSize( m_x
, m_y
, m_width
, m_height
);
544 return wxWindow::Show( show
);
547 void wxFrame::DoMoveWindow(int WXUNUSED(x
), int WXUNUSED(y
), int WXUNUSED(width
), int WXUNUSED(height
) )
549 wxFAIL_MSG( wxT("DoMoveWindow called for wxFrame") );
552 void wxFrame::DoSetSize( int x
, int y
, int width
, int height
, int sizeFlags
)
554 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
556 /* this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow */
557 wxASSERT_MSG( (m_wxwindow
!= NULL
), wxT("invalid frame") );
559 /* avoid recursions */
567 int old_width
= m_width
;
568 int old_height
= m_height
;
570 if ((sizeFlags
& wxSIZE_ALLOW_MINUS_ONE
) == 0)
572 if (x
!= -1) m_x
= x
;
573 if (y
!= -1) m_y
= y
;
574 if (width
!= -1) m_width
= width
;
575 if (height
!= -1) m_height
= height
;
586 if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH)
588 if (width == -1) m_width = 80;
591 if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT)
593 if (height == -1) m_height = 26;
597 if ((m_minWidth
!= -1) && (m_width
< m_minWidth
)) m_width
= m_minWidth
;
598 if ((m_minHeight
!= -1) && (m_height
< m_minHeight
)) m_height
= m_minHeight
;
599 if ((m_maxWidth
!= -1) && (m_width
> m_maxWidth
)) m_width
= m_maxWidth
;
600 if ((m_maxHeight
!= -1) && (m_height
> m_maxHeight
)) m_height
= m_maxHeight
;
602 if ((m_x
!= -1) || (m_y
!= -1))
604 if ((m_x
!= old_x
) || (m_y
!= old_y
))
606 gtk_widget_set_uposition( m_widget
, m_x
, m_y
);
610 if ((m_width
!= old_width
) || (m_height
!= old_height
))
612 gtk_widget_set_usize( m_widget
, m_width
, m_height
);
614 /* we set the size in GtkOnSize, i.e. mostly the actual resizing is
615 done either directly before the frame is shown or in idle time
616 so that different calls to SetSize() don't lead to flicker. */
623 void wxFrame::DoGetClientSize( int *width
, int *height
) const
625 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
627 wxWindow::DoGetClientSize( width
, height
);
633 if (!m_menuBarDetached
)
634 (*height
) -= wxMENU_HEIGHT
;
636 (*height
) -= wxPLACE_HOLDER
;
641 if (m_frameStatusBar
) (*height
) -= wxSTATUS_HEIGHT
;
642 #endif // wxUSE_STATUSBAR
648 if (m_toolBarDetached
)
650 *height
-= wxPLACE_HOLDER
;
655 m_frameToolBar
->GetSize( &x
, &y
);
656 if ( m_frameToolBar
->GetWindowStyle() & wxTB_VERTICAL
)
666 #endif // wxUSE_TOOLBAR
669 *height
-= m_miniEdge
*2 + m_miniTitle
;
673 *width
-= m_miniEdge
*2;
677 void wxFrame::DoSetClientSize( int width
, int height
)
679 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
684 if (!m_menuBarDetached
)
685 height
+= wxMENU_HEIGHT
;
687 height
+= wxPLACE_HOLDER
;
692 if (m_frameStatusBar
) height
+= wxSTATUS_HEIGHT
;
699 if (m_toolBarDetached
)
701 height
+= wxPLACE_HOLDER
;
706 m_frameToolBar
->GetSize( &x
, &y
);
707 if ( m_frameToolBar
->GetWindowStyle() & wxTB_VERTICAL
)
719 DoSetSize( -1, -1, width
+ m_miniEdge
*2, height
+ m_miniEdge
*2 + m_miniTitle
, 0 );
722 void wxFrame::GtkOnSize( int WXUNUSED(x
), int WXUNUSED(y
),
723 int width
, int height
)
725 // due to a bug in gtk, x,y are always 0
729 /* avoid recursions */
730 if (m_resizing
) return;
733 /* this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow */
734 wxASSERT_MSG( (m_wxwindow
!= NULL
), wxT("invalid frame") );
739 /* space occupied by m_frameToolBar and m_frameMenuBar */
740 int client_area_x_offset
= 0,
741 client_area_y_offset
= 0;
743 /* wxMDIChildFrame derives from wxFrame but it _is_ a wxWindow as it uses
744 wxWindow::Create to create it's GTK equivalent. m_mainWidget is only
745 set in wxFrame::Create so it is used to check what kind of frame we
746 have here. if m_mainWidget is NULL it is a wxMDIChildFrame and so we
747 skip the part which handles m_frameMenuBar, m_frameToolBar and (most
748 importantly) m_mainWidget */
752 /* check if size is in legal range */
753 if ((m_minWidth
!= -1) && (m_width
< m_minWidth
)) m_width
= m_minWidth
;
754 if ((m_minHeight
!= -1) && (m_height
< m_minHeight
)) m_height
= m_minHeight
;
755 if ((m_maxWidth
!= -1) && (m_width
> m_maxWidth
)) m_width
= m_maxWidth
;
756 if ((m_maxHeight
!= -1) && (m_height
> m_maxHeight
)) m_height
= m_maxHeight
;
758 /* I revert back to wxGTK's original behaviour. m_mainWidget holds the
759 * menubar, the toolbar and the client area, which is represented by
761 * this hurts in the eye, but I don't want to call SetSize()
762 * because I don't want to call any non-native functions here. */
767 int yy
= m_miniEdge
+ m_miniTitle
;
768 int ww
= m_width
- 2*m_miniEdge
;
769 int hh
= wxMENU_HEIGHT
;
770 if (m_menuBarDetached
) hh
= wxPLACE_HOLDER
;
771 m_frameMenuBar
->m_x
= xx
;
772 m_frameMenuBar
->m_y
= yy
;
773 m_frameMenuBar
->m_width
= ww
;
774 m_frameMenuBar
->m_height
= hh
;
775 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget
),
776 m_frameMenuBar
->m_widget
,
778 client_area_y_offset
+= hh
;
782 if ((m_frameToolBar
) &&
783 (m_frameToolBar
->m_widget
->parent
== m_mainWidget
))
786 int yy
= m_miniEdge
+ m_miniTitle
;
789 if (!m_menuBarDetached
)
792 yy
+= wxPLACE_HOLDER
;
795 m_frameToolBar
->m_x
= xx
;
796 m_frameToolBar
->m_y
= yy
;
798 /* don't change the toolbar's reported height/width */
800 if ( m_frameToolBar
->GetWindowStyle() & wxTB_VERTICAL
)
802 ww
= m_toolBarDetached
? wxPLACE_HOLDER
803 : m_frameToolBar
->m_width
;
804 hh
= m_height
- 2*m_miniEdge
;
806 client_area_x_offset
+= ww
;
810 ww
= m_width
- 2*m_miniEdge
;
811 hh
= m_toolBarDetached
? wxPLACE_HOLDER
812 : m_frameToolBar
->m_height
;
814 client_area_y_offset
+= hh
;
817 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget
),
818 m_frameToolBar
->m_widget
,
821 #endif // wxUSE_TOOLBAR
823 int client_x
= client_area_x_offset
+ m_miniEdge
;
824 int client_y
= client_area_y_offset
+ m_miniEdge
+ m_miniTitle
;
825 int client_w
= m_width
- client_area_x_offset
- 2*m_miniEdge
;
826 int client_h
= m_height
- client_area_y_offset
- 2*m_miniEdge
- m_miniTitle
;
827 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget
),
829 client_x
, client_y
, client_w
, client_h
);
833 /* if there is no m_mainWidget between m_widget and m_wxwindow there
834 is no need to set the size or position of m_wxwindow. */
838 if (m_frameStatusBar
)
840 int xx
= 0 + m_miniEdge
;
841 int yy
= m_height
- wxSTATUS_HEIGHT
- m_miniEdge
- client_area_y_offset
;
842 int ww
= m_width
- 2*m_miniEdge
;
843 int hh
= wxSTATUS_HEIGHT
;
844 m_frameStatusBar
->m_x
= xx
;
845 m_frameStatusBar
->m_y
= yy
;
846 m_frameStatusBar
->m_width
= ww
;
847 m_frameStatusBar
->m_height
= hh
;
848 gtk_pizza_set_size( GTK_PIZZA(m_wxwindow
),
849 m_frameStatusBar
->m_widget
,
851 gtk_widget_draw( m_frameStatusBar
->m_widget
, (GdkRectangle
*) NULL
);
855 /* we actually set the size of a frame here and no-where else */
856 // gtk_widget_set_usize( m_widget, m_width, m_height );
860 // send size event to frame
861 wxSizeEvent
event( wxSize(m_width
,m_height
), GetId() );
862 event
.SetEventObject( this );
863 GetEventHandler()->ProcessEvent( event
);
865 // send size event to status bar
866 if (m_frameStatusBar
)
868 wxSizeEvent
event2( wxSize(m_frameStatusBar
->m_width
,m_frameStatusBar
->m_height
), m_frameStatusBar
->GetId() );
869 event2
.SetEventObject( m_frameStatusBar
);
870 m_frameStatusBar
->GetEventHandler()->ProcessEvent( event2
);
876 void wxFrame::MakeModal( bool modal
)
879 gtk_grab_add( m_widget
);
881 gtk_grab_remove( m_widget
);
884 void wxFrame::OnInternalIdle()
886 if (!m_sizeSet
&& GTK_WIDGET_REALIZED(m_wxwindow
))
888 GtkOnSize( m_x
, m_y
, m_width
, m_height
);
890 // we'll come back later
892 wxapp_install_idle_handler();
896 if (m_frameMenuBar
) m_frameMenuBar
->OnInternalIdle();
898 if (m_frameToolBar
) m_frameToolBar
->OnInternalIdle();
901 if (m_frameStatusBar
) m_frameStatusBar
->OnInternalIdle();
904 wxWindow::OnInternalIdle();
907 // ----------------------------------------------------------------------------
908 // menu/tool/status bar stuff
909 // ----------------------------------------------------------------------------
911 void wxFrame::SetMenuBar( wxMenuBar
*menuBar
)
913 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
914 wxASSERT_MSG( (m_wxwindow
!= NULL
), wxT("invalid frame") );
916 if (menuBar
== m_frameMenuBar
)
921 m_frameMenuBar
->UnsetInvokingWindow( this );
923 if (m_frameMenuBar
->GetWindowStyle() & wxMB_DOCKABLE
)
925 gtk_signal_disconnect_by_func( GTK_OBJECT(m_frameMenuBar
->m_widget
),
926 GTK_SIGNAL_FUNC(gtk_menu_attached_callback
), (gpointer
)this );
928 gtk_signal_disconnect_by_func( GTK_OBJECT(m_frameMenuBar
->m_widget
),
929 GTK_SIGNAL_FUNC(gtk_menu_detached_callback
), (gpointer
)this );
932 gtk_container_remove( GTK_CONTAINER(m_mainWidget
), m_frameMenuBar
->m_widget
);
933 gtk_widget_ref( m_frameMenuBar
->m_widget
);
934 gtk_widget_unparent( m_frameMenuBar
->m_widget
);
937 m_frameMenuBar
= menuBar
;
941 m_frameMenuBar
->SetInvokingWindow( this );
943 m_frameMenuBar
->SetParent(this);
944 gtk_pizza_put( GTK_PIZZA(m_mainWidget
),
945 m_frameMenuBar
->m_widget
,
948 m_frameMenuBar
->m_width
,
949 m_frameMenuBar
->m_height
);
951 if (menuBar
->GetWindowStyle() & wxMB_DOCKABLE
)
953 gtk_signal_connect( GTK_OBJECT(menuBar
->m_widget
), "child_attached",
954 GTK_SIGNAL_FUNC(gtk_menu_attached_callback
), (gpointer
)this );
956 gtk_signal_connect( GTK_OBJECT(menuBar
->m_widget
), "child_detached",
957 GTK_SIGNAL_FUNC(gtk_menu_detached_callback
), (gpointer
)this );
960 m_frameMenuBar
->Show( TRUE
);
963 /* resize window in OnInternalIdle */
968 wxToolBar
* wxFrame::CreateToolBar( long style
, wxWindowID id
, const wxString
& name
)
970 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
972 m_insertInClientArea
= FALSE
;
974 m_frameToolBar
= wxFrameBase::CreateToolBar( style
, id
, name
);
977 GetChildren().DeleteObject( m_frameToolBar
);
979 m_insertInClientArea
= TRUE
;
983 return m_frameToolBar
;
986 void wxFrame::SetToolBar(wxToolBar
*toolbar
)
988 wxFrameBase::SetToolBar(toolbar
);
992 /* insert into toolbar area if not already there */
993 if ((m_frameToolBar
->m_widget
->parent
) &&
994 (m_frameToolBar
->m_widget
->parent
!= m_mainWidget
))
996 GetChildren().DeleteObject( m_frameToolBar
);
998 gtk_widget_reparent( m_frameToolBar
->m_widget
, m_mainWidget
);
1004 #endif // wxUSE_TOOLBAR
1008 wxStatusBar
* wxFrame::CreateStatusBar(int number
,
1011 const wxString
& name
)
1013 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
1015 // because it will change when toolbar is added
1018 return wxFrameBase::CreateStatusBar( number
, style
, id
, name
);
1021 void wxFrame::PositionStatusBar()
1023 if ( !m_frameStatusBar
)
1028 #endif // wxUSE_STATUSBAR
1030 // ----------------------------------------------------------------------------
1032 // ----------------------------------------------------------------------------
1034 void wxFrame::SetTitle( const wxString
&title
)
1036 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
1039 gtk_window_set_title( GTK_WINDOW(m_widget
), title
.mbc_str() );
1042 void wxFrame::SetIcon( const wxIcon
&icon
)
1044 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
1046 wxFrameBase::SetIcon(icon
);
1051 if (!m_widget
->window
)
1054 wxMask
*mask
= icon
.GetMask();
1055 GdkBitmap
*bm
= (GdkBitmap
*) NULL
;
1056 if (mask
) bm
= mask
->GetBitmap();
1058 gdk_window_set_icon( m_widget
->window
, (GdkWindow
*) NULL
, icon
.GetPixmap(), bm
);
1061 // ----------------------------------------------------------------------------
1062 // frame state: maximized/iconized/normal (TODO)
1063 // ----------------------------------------------------------------------------
1065 void wxFrame::Maximize(bool WXUNUSED(maximize
))
1069 bool wxFrame::IsMaximized() const
1074 void wxFrame::Restore()
1078 void wxFrame::Iconize( bool iconize
)
1082 XIconifyWindow( GDK_WINDOW_XDISPLAY( m_widget
->window
),
1083 GDK_WINDOW_XWINDOW( m_widget
->window
),
1084 DefaultScreen( GDK_DISPLAY() ) );
1088 bool wxFrame::IsIconized() const