]> git.saurik.com Git - wxWidgets.git/blame - src/gtk1/frame.cpp
basic support for encodings for wxMSW::wxFont
[wxWidgets.git] / src / gtk1 / frame.cpp
CommitLineData
c801d85f
KB
1/////////////////////////////////////////////////////////////////////////////
2// Name: frame.cpp
3// Purpose:
4// Author: Robert Roebling
a81258be 5// Id: $Id$
01111366 6// Copyright: (c) 1998 Robert Roebling
19717c50 7// Licence: wxWindows licence
c801d85f
KB
8/////////////////////////////////////////////////////////////////////////////
9
10#ifdef __GNUG__
fe4e9e6c 11 #pragma implementation "frame.h"
c801d85f
KB
12#endif
13
14#include "wx/frame.h"
15#include "wx/dialog.h"
16#include "wx/control.h"
17#include "wx/app.h"
cf4219e7 18#include "wx/menu.h"
dcf924a3 19#if wxUSE_TOOLBAR
cf4219e7 20#include "wx/toolbar.h"
dcf924a3
RR
21#endif
22#if wxUSE_STATUSBAR
cf4219e7 23#include "wx/statusbr.h"
dcf924a3 24#endif
362c6693 25#include "wx/dcclient.h"
83624f79
RR
26
27#include "glib.h"
28#include "gdk/gdk.h"
29#include "gtk/gtk.h"
c801d85f 30#include "wx/gtk/win_gtk.h"
801aa178 31#include "gdk/gdkkeysyms.h"
cd25b18c 32#include "gdk/gdkx.h"
c801d85f 33
2f2aa628
RR
34//-----------------------------------------------------------------------------
35// constants
36//-----------------------------------------------------------------------------
37
907789a0 38const int wxMENU_HEIGHT = 27;
c67daf87 39const int wxSTATUS_HEIGHT = 25;
41ca191f 40const int wxPLACE_HOLDER = 0;
c801d85f 41
acfd422a
RR
42//-----------------------------------------------------------------------------
43// idle system
44//-----------------------------------------------------------------------------
45
46extern void wxapp_install_idle_handler();
47extern bool g_isIdle;
48
2f2aa628
RR
49//-----------------------------------------------------------------------------
50// data
51//-----------------------------------------------------------------------------
52
c801d85f
KB
53extern wxList wxPendingDelete;
54
2e563988
RR
55//-----------------------------------------------------------------------------
56// debug
57//-----------------------------------------------------------------------------
58
59#ifdef __WXDEBUG__
60
61extern void debug_focus_in( GtkWidget* widget, const wxChar* name, const wxChar *window );
62
63#endif
64
c801d85f 65//-----------------------------------------------------------------------------
2f2aa628 66// "size_allocate"
c801d85f 67//-----------------------------------------------------------------------------
c801d85f 68
2f2aa628 69static void gtk_frame_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxFrame *win )
ed7a557b 70{
88ac883a 71 if (g_isIdle)
121a3581 72 wxapp_install_idle_handler();
acfd422a 73
a2053b27 74 if (!win->m_hasVMT) return;
8bbe427f 75
121a3581
RR
76 if ((win->m_width != alloc->width) || (win->m_height != alloc->height))
77 {
78 win->m_width = alloc->width;
79 win->m_height = alloc->height;
80 win->UpdateSize();
81 }
362c6693 82}
c801d85f
KB
83
84//-----------------------------------------------------------------------------
2f2aa628
RR
85// "delete_event"
86//-----------------------------------------------------------------------------
c801d85f 87
2f2aa628 88static gint gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxFrame *win )
ed7a557b 89{
88ac883a 90 if (g_isIdle)
121a3581 91 wxapp_install_idle_handler();
ed7a557b 92
fb1585ae 93 win->Close();
c801d85f 94
fb1585ae 95 return TRUE;
362c6693 96}
c801d85f 97
16bcc879
RR
98//-----------------------------------------------------------------------------
99// "child_attached" of menu bar
100//-----------------------------------------------------------------------------
101
102static void gtk_menu_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win )
103{
a2053b27 104 if (!win->m_hasVMT) return;
88ac883a 105
16bcc879 106 win->m_menuBarDetached = FALSE;
f03fc89f 107 win->UpdateSize();
16bcc879
RR
108}
109
110//-----------------------------------------------------------------------------
111// "child_detached" of menu bar
112//-----------------------------------------------------------------------------
113
114static void gtk_menu_detached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win )
115{
a2053b27 116 if (!win->m_hasVMT) return;
88ac883a 117
16bcc879 118 win->m_menuBarDetached = TRUE;
f03fc89f 119 win->UpdateSize();
16bcc879
RR
120}
121
88ac883a 122#if wxUSE_TOOLBAR
16bcc879
RR
123//-----------------------------------------------------------------------------
124// "child_attached" of tool bar
125//-----------------------------------------------------------------------------
126
127static void gtk_toolbar_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win )
128{
a2053b27 129 if (!win->m_hasVMT) return;
88ac883a 130
16bcc879 131 win->m_toolBarDetached = FALSE;
88ac883a 132
f03fc89f 133 win->UpdateSize();
16bcc879
RR
134}
135
136//-----------------------------------------------------------------------------
137// "child_detached" of tool bar
138//-----------------------------------------------------------------------------
139
8a126fcc 140static void gtk_toolbar_detached_callback( GtkWidget *widget, GtkWidget *WXUNUSED(child), wxFrame *win )
16bcc879 141{
88ac883a 142 if (g_isIdle)
801aa178 143 wxapp_install_idle_handler();
acfd422a 144
a2053b27 145 if (!win->m_hasVMT) return;
88ac883a 146
16bcc879 147 win->m_toolBarDetached = TRUE;
f03fc89f 148 win->UpdateSize();
16bcc879 149}
88ac883a 150#endif // wxUSE_TOOLBAR
16bcc879 151
47908e25 152//-----------------------------------------------------------------------------
2f2aa628
RR
153// "configure_event"
154//-----------------------------------------------------------------------------
47908e25 155
c693edf3
RR
156static gint
157#if (GTK_MINOR_VERSON > 0)
158gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *WXUNUSED(event), wxFrame *win )
159#else
160gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *event, wxFrame *win )
161#endif
47908e25 162{
c693edf3 163 if (g_isIdle)
121a3581 164 wxapp_install_idle_handler();
acfd422a 165
a2053b27 166 if (!win->m_hasVMT) return FALSE;
88ac883a 167
c693edf3 168#if (GTK_MINOR_VERSON > 0)
dfc3d7e0
RR
169 int x = 0;
170 int y = 0;
171 gdk_window_get_root_origin( win->m_widget->window, &x, &y );
dfc3d7e0
RR
172 win->m_x = x;
173 win->m_y = y;
c693edf3
RR
174#else
175 win->m_x = event->x;
176 win->m_y = event->y;
177#endif
8bbe427f 178
a2053b27 179 wxMoveEvent mevent( wxPoint(win->m_x,win->m_y), win->GetId() );
36b3b54a
RR
180 mevent.SetEventObject( win );
181 win->GetEventHandler()->ProcessEvent( mevent );
182
fb1585ae 183 return FALSE;
362c6693 184}
47908e25 185
2b07d713
RR
186//-----------------------------------------------------------------------------
187// "realize" from m_widget
188//-----------------------------------------------------------------------------
189
88ac883a 190/* we cannot MWM hints and icons before the widget has been realized,
2b07d713
RR
191 so we do this directly after realization */
192
88ac883a 193static gint
58dea4b0 194gtk_frame_realized_callback( GtkWidget *widget, wxFrame *win )
2b07d713 195{
88ac883a 196 if (g_isIdle)
121a3581 197 wxapp_install_idle_handler();
acfd422a 198
2b07d713
RR
199 /* all this is for Motif Window Manager "hints" and is supposed to be
200 recognized by other WM as well. not tested. */
051b55ad
KB
201 long decor = (long) GDK_DECOR_BORDER;
202 long func = (long) GDK_FUNC_MOVE;
88ac883a 203
f03fc89f
VZ
204 if ((win->GetWindowStyle() & wxCAPTION) != 0)
205 decor |= GDK_DECOR_TITLE;
206 if ((win->GetWindowStyle() & wxSYSTEM_MENU) != 0)
aa64626e
KB
207 {
208 decor |= GDK_DECOR_MENU;
209 func |= GDK_FUNC_CLOSE;
210 }
f03fc89f 211 if ((win->GetWindowStyle() & wxMINIMIZE_BOX) != 0)
15b24b14 212 {
f03fc89f
VZ
213 func |= GDK_FUNC_MINIMIZE;
214 decor |= GDK_DECOR_MINIMIZE;
15b24b14 215 }
f03fc89f 216 if ((win->GetWindowStyle() & wxMAXIMIZE_BOX) != 0)
15b24b14 217 {
f03fc89f
VZ
218 func |= GDK_FUNC_MAXIMIZE;
219 decor |= GDK_DECOR_MAXIMIZE;
15b24b14 220 }
f03fc89f 221 if ((win->GetWindowStyle() & wxRESIZE_BORDER) != 0)
aa64626e
KB
222 {
223 func |= GDK_FUNC_RESIZE;
224 decor |= GDK_DECOR_RESIZEH;
aa64626e
KB
225 }
226
a2053b27
RR
227 gdk_window_set_decorations( win->m_widget->window, (GdkWMDecoration)decor);
228 gdk_window_set_functions( win->m_widget->window, (GdkWMFunction)func);
88ac883a 229
2b07d713 230 /* GTK's shrinking/growing policy */
f03fc89f 231 if ((win->GetWindowStyle() & wxRESIZE_BORDER) == 0)
a2053b27 232 gtk_window_set_policy(GTK_WINDOW(win->m_widget), 0, 0, 1);
2b07d713 233 else
a2053b27 234 gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1);
88ac883a 235
58dea4b0
RR
236 /* reset the icon */
237 if (win->m_icon != wxNullIcon)
238 {
239 wxIcon icon( win->m_icon );
240 win->m_icon = wxNullIcon;
f03fc89f 241 win->SetIcon( icon );
58dea4b0 242 }
88ac883a 243
2e563988
RR
244 /* we set the focus to the child that accepts the focus. this
245 doesn't really have to be done in "realize" but why not? */
f03fc89f 246 wxWindowList::Node *node = win->GetChildren().GetFirst();
2e563988
RR
247 while (node)
248 {
f03fc89f
VZ
249 wxWindow *child = node->GetData();
250 if (child->AcceptsFocus())
251 {
252 child->SetFocus();
253 break;
254 }
88ac883a 255
f03fc89f 256 node = node->GetNext();
2e563988 257 }
88ac883a 258
227e5e99
RR
259 return FALSE;
260}
88ac883a 261
f362b96d
RR
262//-----------------------------------------------------------------------------
263// InsertChild for wxFrame
264//-----------------------------------------------------------------------------
265
266/* Callback for wxFrame. This very strange beast has to be used because
267 * C++ has no virtual methods in a constructor. We have to emulate a
268 * virtual function here as wxWindows requires different ways to insert
269 * a child in container classes. */
270
6bc8a1c8 271static void wxInsertChildInFrame( wxFrame* parent, wxWindow* child )
f362b96d 272{
6bc8a1c8 273 if (!parent->m_insertInClientArea)
f362b96d
RR
274 {
275 /* these are outside the client area */
f03fc89f 276 wxFrame* frame = (wxFrame*) parent;
f362b96d 277 gtk_myfixed_put( GTK_MYFIXED(frame->m_mainWidget),
a2053b27
RR
278 GTK_WIDGET(child->m_widget),
279 child->m_x,
280 child->m_y,
281 child->m_width,
282 child->m_height );
88ac883a
VZ
283
284#if wxUSE_TOOLBAR
f03fc89f
VZ
285 /* we connect to these events for recalculating the client area
286 space when the toolbar is floating */
287 if (wxIS_KIND_OF(child,wxToolBar))
288 {
289 wxToolBar *toolBar = (wxToolBar*) child;
290 if (toolBar->GetWindowStyle() & wxTB_DOCKABLE)
291 {
a2053b27 292 gtk_signal_connect( GTK_OBJECT(toolBar->m_widget), "child_attached",
41ca191f 293 GTK_SIGNAL_FUNC(gtk_toolbar_attached_callback), (gpointer)parent );
88ac883a 294
a2053b27 295 gtk_signal_connect( GTK_OBJECT(toolBar->m_widget), "child_detached",
41ca191f 296 GTK_SIGNAL_FUNC(gtk_toolbar_detached_callback), (gpointer)parent );
f03fc89f
VZ
297 }
298 }
88ac883a 299#endif // wxUSE_TOOLBAR
f362b96d
RR
300 }
301 else
302 {
303 /* these are inside the client area */
a2053b27
RR
304 gtk_myfixed_put( GTK_MYFIXED(parent->m_wxwindow),
305 GTK_WIDGET(child->m_widget),
306 child->m_x,
307 child->m_y,
308 child->m_width,
309 child->m_height );
f362b96d
RR
310 }
311
f362b96d 312 /* resize on OnInternalIdle */
f03fc89f 313 parent->UpdateSize();
f362b96d
RR
314}
315
2f2aa628
RR
316//-----------------------------------------------------------------------------
317// wxFrame
c801d85f
KB
318//-----------------------------------------------------------------------------
319
320BEGIN_EVENT_TABLE(wxFrame, wxWindow)
fb1585ae 321 EVT_SIZE(wxFrame::OnSize)
fe4e9e6c 322 EVT_CLOSE(wxFrame::OnCloseWindow)
342b6a2f 323 EVT_MENU_HIGHLIGHT_ALL(wxFrame::OnMenuHighlight)
c801d85f
KB
324END_EVENT_TABLE()
325
326IMPLEMENT_DYNAMIC_CLASS(wxFrame,wxWindow)
327
ddb6bc71 328void wxFrame::Init()
c801d85f 329{
fb1585ae 330 m_frameMenuBar = (wxMenuBar *) NULL;
88ac883a 331#if wxUSE_STATUSBAR
fb1585ae 332 m_frameStatusBar = (wxStatusBar *) NULL;
88ac883a
VZ
333#endif // wxUSE_STATUSBAR
334#if wxUSE_TOOLBAR
fb1585ae 335 m_frameToolBar = (wxToolBar *) NULL;
88ac883a 336#endif // wxUSE_TOOLBAR
fb1585ae 337 m_sizeSet = FALSE;
b2b3ccc5
RR
338 m_miniEdge = 0;
339 m_miniTitle = 0;
ab2b3dd4 340 m_mainWidget = (GtkWidget*) NULL;
16bcc879
RR
341 m_menuBarDetached = FALSE;
342 m_toolBarDetached = FALSE;
6bc8a1c8 343 m_insertInClientArea = TRUE;
362c6693 344}
c801d85f 345
ed7a557b 346wxFrame::wxFrame( wxWindow *parent, wxWindowID id, const wxString &title,
debe6624
JS
347 const wxPoint &pos, const wxSize &size,
348 long style, const wxString &name )
c801d85f 349{
ddb6bc71 350 Init();
88ac883a 351
fb1585ae 352 Create( parent, id, title, pos, size, style, name );
362c6693 353}
c801d85f 354
debe6624 355bool wxFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title,
c801d85f 356 const wxPoint &pos, const wxSize &size,
debe6624 357 long style, const wxString &name )
c801d85f 358{
a802c3a1 359 wxTopLevelWindows.Append( this );
8bbe427f 360
fb1585ae 361 m_needParent = FALSE;
ed7a557b 362
4dcaf11a
RR
363 if (!PreCreation( parent, pos, size ) ||
364 !CreateBase( parent, id, pos, size, style, wxDefaultValidator, name ))
365 {
366 wxFAIL_MSG( _T("wxFrame creation failed") );
367 return FALSE;
368 }
c801d85f 369
fb1585ae 370 m_title = title;
88ac883a 371
6bc8a1c8 372 m_insertCallback = (wxInsertChildFunction) wxInsertChildInFrame;
ed7a557b 373
fb1585ae
RR
374 GtkWindowType win_type = GTK_WINDOW_TOPLEVEL;
375 if (style & wxSIMPLE_BORDER) win_type = GTK_WINDOW_POPUP;
8bbe427f 376
fb1585ae 377 m_widget = gtk_window_new( win_type );
88ac883a 378
de1c750f
RR
379 if (!name.IsEmpty())
380 gtk_window_set_wmclass( GTK_WINDOW(m_widget), name.mb_str(), name.mb_str() );
8bbe427f 381
2e563988
RR
382#ifdef __WXDEBUG__
383 debug_focus_in( m_widget, _T("wxFrame::m_widget"), name );
384#endif
385
ed9b9841 386 gtk_window_set_title( GTK_WINDOW(m_widget), title.mbc_str() );
fb1585ae 387 GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
ed7a557b 388
fb1585ae
RR
389 gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event",
390 GTK_SIGNAL_FUNC(gtk_frame_delete_callback), (gpointer)this );
ed7a557b 391
f362b96d
RR
392 /* m_mainWidget holds the toolbar, the menubar and the client area */
393 m_mainWidget = gtk_myfixed_new();
394 gtk_widget_show( m_mainWidget );
395 GTK_WIDGET_UNSET_FLAGS( m_mainWidget, GTK_CAN_FOCUS );
396 gtk_container_add( GTK_CONTAINER(m_widget), m_mainWidget );
88ac883a 397
2e563988
RR
398#ifdef __WXDEBUG__
399 debug_focus_in( m_mainWidget, _T("wxFrame::m_mainWidget"), name );
400#endif
401
f362b96d 402 /* m_wxwindow only represents the client area without toolbar and menubar */
fb1585ae
RR
403 m_wxwindow = gtk_myfixed_new();
404 gtk_widget_show( m_wxwindow );
f362b96d 405 gtk_container_add( GTK_CONTAINER(m_mainWidget), m_wxwindow );
88ac883a 406
2e563988
RR
407#ifdef __WXDEBUG__
408 debug_focus_in( m_wxwindow, _T("wxFrame::m_wxwindow"), name );
409#endif
410
411 /* we donm't allow the frame to get the focus as otherwise
412 the frame will grabit at arbitrary fcous changes. */
413 GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
ed7a557b 414
de8113d9
RR
415 if (m_parent) m_parent->AddChild( this );
416
417 PostCreation();
418
58dea4b0 419 /* we cannot set MWM hints and icons before the widget has
2b07d713
RR
420 been realized, so we do this directly after realization */
421 gtk_signal_connect( GTK_OBJECT(m_widget), "realize",
f03fc89f 422 GTK_SIGNAL_FUNC(gtk_frame_realized_callback), (gpointer) this );
88ac883a 423
ab2b3dd4 424 /* the user resized the frame by dragging etc. */
fb1585ae
RR
425 gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
426 GTK_SIGNAL_FUNC(gtk_frame_size_callback), (gpointer)this );
ed7a557b 427
ab2b3dd4 428 /* the only way to get the window size is to connect to this event */
fb1585ae
RR
429 gtk_signal_connect( GTK_OBJECT(m_widget), "configure_event",
430 GTK_SIGNAL_FUNC(gtk_frame_configure_callback), (gpointer)this );
8bbe427f 431
fb1585ae 432 return TRUE;
362c6693 433}
c801d85f 434
19717c50 435wxFrame::~wxFrame()
c801d85f 436{
31c6b4fc 437 m_isBeingDeleted = TRUE;
88ac883a 438
fb1585ae 439 if (m_frameMenuBar) delete m_frameMenuBar;
e27ce4e9 440 m_frameMenuBar = (wxMenuBar *) NULL;
88ac883a
VZ
441
442#if wxUSE_STATUSBAR
fb1585ae 443 if (m_frameStatusBar) delete m_frameStatusBar;
e27ce4e9 444 m_frameStatusBar = (wxStatusBar *) NULL;
88ac883a
VZ
445#endif // wxUSE_STATUSBAR
446
447#if wxUSE_TOOLBAR
fb1585ae 448 if (m_frameToolBar) delete m_frameToolBar;
e27ce4e9 449 m_frameToolBar = (wxToolBar *) NULL;
88ac883a 450#endif // wxUSE_TOOLBAR
ed7a557b 451
fb1585ae 452 wxTopLevelWindows.DeleteObject( this );
2b854a32 453
0d2a2b60 454 if (wxTheApp->GetTopWindow() == this)
0d2a2b60 455 wxTheApp->SetTopWindow( (wxWindow*) NULL );
2b854a32 456
0d2a2b60 457 if (wxTopLevelWindows.Number() == 0)
0d2a2b60 458 wxTheApp->ExitMainLoop();
362c6693 459}
ed7a557b 460
debe6624 461bool wxFrame::Show( bool show )
c801d85f 462{
ed9b9841 463 wxASSERT_MSG( (m_widget != NULL), _T("invalid frame") );
8bbe427f 464
35178437 465 if (show && !m_sizeSet)
fb1585ae 466 {
e27ce4e9
RR
467 /* by calling GtkOnSize here, we don't have to call
468 either after showing the frame, which would entail
f362b96d 469 much ugly flicker or from within the size_allocate
e27ce4e9 470 handler, because GTK 1.1.X forbids that. */
8bbe427f 471
35178437 472 GtkOnSize( m_x, m_y, m_width, m_height );
fb1585ae 473 }
8bbe427f 474
fb1585ae 475 return wxWindow::Show( show );
362c6693 476}
c801d85f 477
19717c50 478bool wxFrame::Destroy()
c801d85f 479{
ed9b9841 480 wxASSERT_MSG( (m_widget != NULL), _T("invalid frame") );
8bbe427f 481
fb1585ae 482 if (!wxPendingDelete.Member(this)) wxPendingDelete.Append(this);
ed7a557b 483
fb1585ae 484 return TRUE;
c801d85f
KB
485}
486
bfc6fde4 487void wxFrame::DoSetSize( int x, int y, int width, int height, int sizeFlags )
903f689b 488{
ed9b9841 489 wxASSERT_MSG( (m_widget != NULL), _T("invalid frame") );
8bbe427f 490
ab2b3dd4 491 /* this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow */
ed9b9841 492 wxASSERT_MSG( (m_wxwindow != NULL), _T("invalid frame") );
88ac883a 493
ab2b3dd4 494 /* avoid recursions */
88ac883a 495 if (m_resizing) return;
fb1585ae
RR
496 m_resizing = TRUE;
497
498 int old_x = m_x;
499 int old_y = m_y;
500 int old_width = m_width;
501 int old_height = m_height;
8bbe427f 502
85ad5eb5 503 if ((sizeFlags & wxSIZE_ALLOW_MINUS_ONE) == 0)
fb1585ae
RR
504 {
505 if (x != -1) m_x = x;
506 if (y != -1) m_y = y;
507 if (width != -1) m_width = width;
508 if (height != -1) m_height = height;
509 }
510 else
511 {
512 m_x = x;
513 m_y = y;
514 m_width = width;
515 m_height = height;
516 }
517
518 if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH)
519 {
520 if (width == -1) m_width = 80;
521 }
522
523 if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT)
524 {
525 if (height == -1) m_height = 26;
526 }
8bbe427f 527
fb1585ae
RR
528 if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth;
529 if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight;
0c77152e
RR
530 if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth;
531 if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight;
fb1585ae
RR
532
533 if ((m_x != -1) || (m_y != -1))
534 {
8bbe427f 535 if ((m_x != old_x) || (m_y != old_y))
0138c2de 536 {
f03fc89f 537 gtk_widget_set_uposition( m_widget, m_x, m_y );
0138c2de 538 }
fb1585ae 539 }
8bbe427f 540
fb1585ae
RR
541 if ((m_width != old_width) || (m_height != old_height))
542 {
ab2b3dd4 543 /* we set the size in GtkOnSize, i.e. mostly the actual resizing is
f03fc89f
VZ
544 done either directly before the frame is shown or in idle time
545 so that different calls to SetSize() don't lead to flicker. */
de8113d9 546 m_sizeSet = FALSE;
fb1585ae 547 }
8bbe427f 548
fb1585ae 549 m_resizing = FALSE;
903f689b
RR
550}
551
552void wxFrame::Centre( int direction )
553{
ed9b9841 554 wxASSERT_MSG( (m_widget != NULL), _T("invalid frame") );
8bbe427f 555
43a18898
RR
556 int x = 0;
557 int y = 0;
8bbe427f 558
f5eafd0e
RR
559 if ((direction & wxHORIZONTAL) == wxHORIZONTAL) x = (gdk_screen_width () - m_width) / 2;
560 if ((direction & wxVERTICAL) == wxVERTICAL) y = (gdk_screen_height () - m_height) / 2;
8bbe427f 561
fb1585ae 562 Move( x, y );
903f689b
RR
563}
564
f9241296 565void wxFrame::DoGetClientSize( int *width, int *height ) const
c801d85f 566{
ed9b9841 567 wxASSERT_MSG( (m_widget != NULL), _T("invalid frame") );
8bbe427f 568
f9241296 569 wxWindow::DoGetClientSize( width, height );
fb1585ae 570 if (height)
46dc76ba 571 {
41ca191f
RR
572 /* menu bar */
573 if (m_frameMenuBar)
f03fc89f 574 {
88ac883a 575 if (!m_menuBarDetached)
f03fc89f
VZ
576 (*height) -= wxMENU_HEIGHT;
577 else
578 (*height) -= wxPLACE_HOLDER;
579 }
88ac883a 580
dcf924a3 581#if wxUSE_STATUSBAR
f03fc89f 582 /* status bar */
fb1585ae 583 if (m_frameStatusBar) (*height) -= wxSTATUS_HEIGHT;
dcf924a3 584#endif
88ac883a 585
dcf924a3 586#if wxUSE_TOOLBAR
f03fc89f 587 /* tool bar */
fb1585ae
RR
588 if (m_frameToolBar)
589 {
f03fc89f
VZ
590 if (!m_toolBarDetached)
591 {
41ca191f
RR
592 int y = 0;
593 m_frameToolBar->GetSize( (int *) NULL, &y );
594 (*height) -= y;
f03fc89f
VZ
595 }
596 else
41ca191f 597 (*height) -= wxPLACE_HOLDER;
fb1585ae 598 }
dcf924a3 599#endif
88ac883a 600
f03fc89f 601 /* mini edge */
b2b3ccc5
RR
602 (*height) -= m_miniEdge*2 + m_miniTitle;
603 }
604 if (width)
605 {
606 (*width) -= m_miniEdge*2;
46dc76ba 607 }
362c6693 608}
c801d85f 609
bfc6fde4 610void wxFrame::DoSetClientSize( int width, int height )
b593568e 611{
ed9b9841 612 wxASSERT_MSG( (m_widget != NULL), _T("invalid frame") );
8bbe427f 613
41ca191f
RR
614 /* menu bar */
615 if (m_frameMenuBar)
f03fc89f 616 {
88ac883a 617 if (!m_menuBarDetached)
f03fc89f
VZ
618 height += wxMENU_HEIGHT;
619 else
620 height += wxPLACE_HOLDER;
621 }
88ac883a 622
dcf924a3 623#if wxUSE_STATUSBAR
f03fc89f 624 /* status bar */
41ca191f 625 if (m_frameStatusBar) height += wxSTATUS_HEIGHT;
dcf924a3 626#endif
88ac883a 627
dcf924a3 628#if wxUSE_TOOLBAR
f03fc89f 629 /* tool bar */
41ca191f
RR
630 if (m_frameToolBar)
631 {
f03fc89f
VZ
632 if (!m_toolBarDetached)
633 {
41ca191f
RR
634 int y = 0;
635 m_frameToolBar->GetSize( (int *) NULL, &y );
636 height += y;
f03fc89f
VZ
637 }
638 else
41ca191f
RR
639 height += wxPLACE_HOLDER;
640 }
dcf924a3 641#endif
88ac883a 642
41ca191f 643 wxWindow::DoSetClientSize( width + m_miniEdge*2, height + m_miniEdge*2 + m_miniTitle );
362c6693 644}
b593568e 645
47908e25 646void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height )
c801d85f 647{
f5368809
RR
648 // due to a bug in gtk, x,y are always 0
649 // m_x = x;
650 // m_y = y;
651
ab2b3dd4 652 /* avoid recursions */
e52f60e6
RR
653 if (m_resizing) return;
654 m_resizing = TRUE;
8bbe427f 655
ab2b3dd4 656 /* this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow */
ed9b9841 657 wxASSERT_MSG( (m_wxwindow != NULL), _T("invalid frame") );
88ac883a 658
f5368809
RR
659 m_width = width;
660 m_height = height;
8bbe427f 661
ab2b3dd4 662 /* space occupied by m_frameToolBar and m_frameMenuBar */
88ac883a 663 int client_area_y_offset = 0;
8bbe427f 664
ab2b3dd4
RR
665 /* wxMDIChildFrame derives from wxFrame but it _is_ a wxWindow as it uses
666 wxWindow::Create to create it's GTK equivalent. m_mainWidget is only
667 set in wxFrame::Create so it is used to check what kind of frame we
668 have here. if m_mainWidget is NULL it is a wxMDIChildFrame and so we
669 skip the part which handles m_frameMenuBar, m_frameToolBar and (most
670 importantly) m_mainWidget */
88ac883a 671
ab2b3dd4 672 if (m_mainWidget)
f5368809 673 {
ab2b3dd4
RR
674 /* check if size is in legal range */
675 if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth;
676 if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight;
677 if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth;
678 if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight;
679
680 /* I revert back to wxGTK's original behaviour. m_mainWidget holds the
681 * menubar, the toolbar and the client area, which is represented by
682 * m_wxwindow.
683 * this hurts in the eye, but I don't want to call SetSize()
684 * because I don't want to call any non-native functions here. */
88ac883a 685
ab2b3dd4
RR
686 if (m_frameMenuBar)
687 {
688 int xx = m_miniEdge;
689 int yy = m_miniEdge + m_miniTitle;
690 int ww = m_width - 2*m_miniEdge;
41ca191f 691 int hh = wxMENU_HEIGHT;
f03fc89f 692 if (m_menuBarDetached) hh = wxPLACE_HOLDER;
121a3581
RR
693 m_frameMenuBar->m_x = xx;
694 m_frameMenuBar->m_y = yy;
695 m_frameMenuBar->m_width = ww;
696 m_frameMenuBar->m_height = hh;
88ac883a
VZ
697 gtk_myfixed_set_size( GTK_MYFIXED(m_mainWidget),
698 m_frameMenuBar->m_widget,
f03fc89f
VZ
699 xx, yy, ww, hh );
700 client_area_y_offset += hh;
ab2b3dd4 701 }
88ac883a 702
dcf924a3 703#if wxUSE_TOOLBAR
ab2b3dd4
RR
704 if (m_frameToolBar)
705 {
706 int xx = m_miniEdge;
707 int yy = m_miniEdge + m_miniTitle;
41ca191f 708 if (m_frameMenuBar)
f03fc89f 709 {
88ac883a
VZ
710 if (!m_menuBarDetached)
711 yy += wxMENU_HEIGHT;
712 else
f03fc89f
VZ
713 yy += wxPLACE_HOLDER;
714 }
ab2b3dd4 715 int ww = m_width - 2*m_miniEdge;
a2053b27 716 int hh = m_frameToolBar->m_height;
88ac883a 717 if (m_toolBarDetached) hh = wxPLACE_HOLDER;
121a3581
RR
718 m_frameToolBar->m_x = xx;
719 m_frameToolBar->m_y = yy;
720 /* m_frameToolBar->m_height = hh; don't change the toolbar's height */
721 m_frameToolBar->m_width = ww;
88ac883a
VZ
722 gtk_myfixed_set_size( GTK_MYFIXED(m_mainWidget),
723 m_frameToolBar->m_widget,
f03fc89f
VZ
724 xx, yy, ww, hh );
725 client_area_y_offset += hh;
ab2b3dd4 726 }
dcf924a3 727#endif
88ac883a 728
32a95f9f 729 int client_x = m_miniEdge;
f03fc89f 730 int client_y = client_area_y_offset + m_miniEdge + m_miniTitle;
32a95f9f 731 int client_w = m_width - 2*m_miniEdge;
f03fc89f 732 int client_h = m_height - client_area_y_offset- 2*m_miniEdge - m_miniTitle;
88ac883a
VZ
733 gtk_myfixed_set_size( GTK_MYFIXED(m_mainWidget),
734 m_wxwindow,
f03fc89f 735 client_x, client_y, client_w, client_h );
32a95f9f
RR
736 }
737 else
738 {
739 /* if there is no m_mainWidget between m_widget and m_wxwindow there
f03fc89f 740 is no need to set the size or position of m_wxwindow. */
f5368809 741 }
88ac883a 742
dcf924a3 743#if wxUSE_STATUSBAR
f5368809
RR
744 if (m_frameStatusBar)
745 {
b2b3ccc5 746 int xx = 0 + m_miniEdge;
f362b96d 747 int yy = m_height - wxSTATUS_HEIGHT - m_miniEdge - client_area_y_offset;
ac57418f
RR
748 int ww = m_width - 2*m_miniEdge;
749 int hh = wxSTATUS_HEIGHT;
121a3581
RR
750 m_frameStatusBar->m_x = xx;
751 m_frameStatusBar->m_y = yy;
752 m_frameStatusBar->m_width = ww;
753 m_frameStatusBar->m_height = hh;
88ac883a
VZ
754 gtk_myfixed_set_size( GTK_MYFIXED(m_wxwindow),
755 m_frameStatusBar->m_widget,
f03fc89f 756 xx, yy, ww, hh );
f5368809 757 }
dcf924a3 758#endif
8bbe427f 759
de8113d9
RR
760 /* we actually set the size of a frame here and no-where else */
761 gtk_widget_set_usize( m_widget, m_width, m_height );
88ac883a 762
f5368809 763 m_sizeSet = TRUE;
8bbe427f 764
884470b1 765 /* send size event to frame */
43a18898
RR
766 wxSizeEvent event( wxSize(m_width,m_height), GetId() );
767 event.SetEventObject( this );
e52f60e6 768 GetEventHandler()->ProcessEvent( event );
8bbe427f 769
884470b1 770 /* send size event to status bar */
5aa5e35a
RR
771 if (m_frameStatusBar)
772 {
a2053b27 773 wxSizeEvent event2( wxSize(m_frameStatusBar->m_width,m_frameStatusBar->m_height), m_frameStatusBar->GetId() );
5aa5e35a
RR
774 event2.SetEventObject( m_frameStatusBar );
775 m_frameStatusBar->GetEventHandler()->ProcessEvent( event2 );
776 }
884470b1 777
e52f60e6
RR
778 m_resizing = FALSE;
779}
780
ca26177c
RR
781void wxFrame::MakeModal( bool modal )
782{
783 if (modal)
ca26177c 784 gtk_grab_add( m_widget );
ca26177c 785 else
c25ccf85 786 gtk_grab_remove( m_widget );
ca26177c
RR
787}
788
9390a202 789void wxFrame::OnInternalIdle()
e52f60e6 790{
1b3667ab 791 if (!m_sizeSet && GTK_WIDGET_REALIZED(m_wxwindow))
e52f60e6 792 GtkOnSize( m_x, m_y, m_width, m_height );
8bbe427f 793
e52f60e6 794 DoMenuUpdates();
88ac883a 795
082b2798 796 if (m_frameMenuBar) m_frameMenuBar->OnInternalIdle();
dcf924a3 797#if wxUSE_TOOLBAR
082b2798 798 if (m_frameToolBar) m_frameToolBar->OnInternalIdle();
dcf924a3
RR
799#endif
800#if wxUSE_STATUSBAR
082b2798 801 if (m_frameStatusBar) m_frameStatusBar->OnInternalIdle();
dcf924a3 802#endif
5e014a0c
RR
803
804 wxWindow::OnInternalIdle();
362c6693 805}
c801d85f 806
6bc8a1c8 807void wxFrame::OnCloseWindow( wxCloseEvent& WXUNUSED(event) )
fe4e9e6c 808{
e3065973 809 Destroy();
fe4e9e6c
VZ
810}
811
c801d85f
KB
812void wxFrame::OnSize( wxSizeEvent &WXUNUSED(event) )
813{
ed9b9841 814 wxASSERT_MSG( (m_widget != NULL), _T("invalid frame") );
8bbe427f 815
88ac883a 816#if wxUSE_CONSTRAINTS
f5368809
RR
817 if (GetAutoLayout())
818 {
819 Layout();
820 }
8bbe427f 821 else
88ac883a 822#endif // wxUSE_CONSTRAINTS
c801d85f 823 {
ab46dc18 824 /* do we have exactly one child? */
0138c2de
VZ
825 wxWindow *child = (wxWindow *)NULL;
826 for ( wxNode *node = GetChildren().First(); node; node = node->Next() )
f5368809
RR
827 {
828 wxWindow *win = (wxWindow *)node->Data();
0138c2de 829 if ( !wxIS_KIND_OF(win,wxFrame) && !wxIS_KIND_OF(win,wxDialog) )
f5368809 830 {
ab46dc18 831 if (child)
0138c2de 832 {
ab46dc18 833 /* it's the second one: do nothing */
0138c2de
VZ
834 return;
835 }
836
f5368809
RR
837 child = win;
838 }
839 }
ed7a557b 840
ab46dc18
RR
841 /* no children at all? */
842 if (child)
0138c2de 843 {
ab46dc18 844 /* yes: set it's size to fill all the frame */
0138c2de 845 int client_x, client_y;
326f9654 846 DoGetClientSize( &client_x, &client_y );
0138c2de
VZ
847 child->SetSize( 1, 1, client_x-2, client_y-2 );
848 }
362c6693 849 }
362c6693 850}
c801d85f 851
c801d85f
KB
852void wxFrame::SetMenuBar( wxMenuBar *menuBar )
853{
ed9b9841
OK
854 wxASSERT_MSG( (m_widget != NULL), _T("invalid frame") );
855 wxASSERT_MSG( (m_wxwindow != NULL), _T("invalid frame") );
8bbe427f 856
f5368809 857 m_frameMenuBar = menuBar;
8bbe427f 858
f5368809 859 if (m_frameMenuBar)
30dea054 860 {
5bd9e519 861 m_frameMenuBar->SetInvokingWindow( this );
8bbe427f 862
f03fc89f 863 if (m_frameMenuBar->GetParent() != this)
f5368809 864 {
f03fc89f 865 m_frameMenuBar->SetParent(this);
f362b96d 866 gtk_myfixed_put( GTK_MYFIXED(m_mainWidget),
88ac883a
VZ
867 m_frameMenuBar->m_widget,
868 m_frameMenuBar->m_x,
a2053b27
RR
869 m_frameMenuBar->m_y,
870 m_frameMenuBar->m_width,
871 m_frameMenuBar->m_height );
88ac883a 872
f03fc89f
VZ
873 if (menuBar->GetWindowStyle() & wxMB_DOCKABLE)
874 {
a2053b27 875 gtk_signal_connect( GTK_OBJECT(menuBar->m_widget), "child_attached",
16bcc879 876 GTK_SIGNAL_FUNC(gtk_menu_attached_callback), (gpointer)this );
88ac883a 877
a2053b27 878 gtk_signal_connect( GTK_OBJECT(menuBar->m_widget), "child_detached",
16bcc879 879 GTK_SIGNAL_FUNC(gtk_menu_detached_callback), (gpointer)this );
f03fc89f 880 }
5bd9e519
RR
881
882 m_frameMenuBar->Show( TRUE );
f5368809 883 }
716b7364 884 }
8bbe427f 885
1e133b7d 886 /* resize window in OnInternalIdle */
5b077d48 887 m_sizeSet = FALSE;
362c6693 888}
c801d85f 889
8bbe427f 890wxMenuBar *wxFrame::GetMenuBar() const
46dc76ba 891{
f5368809 892 return m_frameMenuBar;
362c6693 893}
46dc76ba 894
342b6a2f
RR
895void wxFrame::OnMenuHighlight(wxMenuEvent& event)
896{
88ac883a 897#if wxUSE_STATUSBAR
342b6a2f
RR
898 if (GetStatusBar())
899 {
0138c2de
VZ
900 // if no help string found, we will clear the status bar text
901 wxString helpString;
902
903 int menuId = event.GetMenuId();
904 if ( menuId != -1 )
342b6a2f
RR
905 {
906 wxMenuBar *menuBar = GetMenuBar();
907 if (menuBar)
908 {
342b6a2f 909 helpString = menuBar->GetHelpString(menuId);
342b6a2f
RR
910 }
911 }
0138c2de
VZ
912
913 SetStatusText(helpString);
342b6a2f 914 }
88ac883a 915#endif // wxUSE_STATUSBAR
342b6a2f
RR
916}
917
88ac883a 918#if wxUSE_TOOLBAR
6bc8a1c8 919wxToolBar* wxFrame::CreateToolBar( long style, wxWindowID id, const wxString& name )
46dc76ba 920{
ed9b9841 921 wxASSERT_MSG( (m_widget != NULL), _T("invalid frame") );
8bbe427f 922
ed9b9841 923 wxCHECK_MSG( m_frameToolBar == NULL, FALSE, _T("recreating toolbar in wxFrame") );
362c6693 924
6bc8a1c8 925 m_insertInClientArea = FALSE;
88ac883a 926
f5368809 927 m_frameToolBar = OnCreateToolBar( style, id, name );
8bbe427f 928
6bc8a1c8 929 if (m_frameToolBar) GetChildren().DeleteObject( m_frameToolBar );
88ac883a 930
6bc8a1c8 931 m_insertInClientArea = TRUE;
8bbe427f 932
5b077d48 933 m_sizeSet = FALSE;
8bbe427f 934
f5368809 935 return m_frameToolBar;
362c6693 936}
46dc76ba 937
362c6693 938wxToolBar* wxFrame::OnCreateToolBar( long style, wxWindowID id, const wxString& name )
46dc76ba 939{
f5368809 940 return new wxToolBar( this, id, wxDefaultPosition, wxDefaultSize, style, name );
362c6693
RR
941}
942
8bbe427f
VZ
943wxToolBar *wxFrame::GetToolBar() const
944{
945 return m_frameToolBar;
362c6693 946}
88ac883a 947#endif // wxUSE_TOOLBAR
46dc76ba 948
88ac883a 949#if wxUSE_STATUSBAR
e3e65dac 950wxStatusBar* wxFrame::CreateStatusBar( int number, long style, wxWindowID id, const wxString& name )
c801d85f 951{
ed9b9841 952 wxASSERT_MSG( (m_widget != NULL), _T("invalid frame") );
8bbe427f 953
ed9b9841 954 wxCHECK_MSG( m_frameStatusBar == NULL, FALSE, _T("recreating status bar in wxFrame") );
c801d85f 955
f5368809 956 m_frameStatusBar = OnCreateStatusBar( number, style, id, name );
8bbe427f 957
5b077d48 958 m_sizeSet = FALSE;
8bbe427f 959
f5368809 960 return m_frameStatusBar;
362c6693
RR
961}
962
963wxStatusBar *wxFrame::OnCreateStatusBar( int number, long style, wxWindowID id, const wxString& name )
964{
f5368809 965 wxStatusBar *statusBar = (wxStatusBar *) NULL;
8bbe427f 966
f5368809 967 statusBar = new wxStatusBar(this, id, wxPoint(0, 0), wxSize(100, 20), style, name);
8bbe427f 968
f5368809
RR
969 // Set the height according to the font and the border size
970 wxClientDC dc(statusBar);
8bbe427f 971 dc.SetFont( statusBar->GetFont() );
362c6693 972
f5368809
RR
973 long x, y;
974 dc.GetTextExtent( "X", &x, &y );
362c6693 975
f5368809 976 int height = (int)( (y * 1.1) + 2* statusBar->GetBorderY());
362c6693 977
f5368809 978 statusBar->SetSize( -1, -1, 100, height );
362c6693 979
f5368809
RR
980 statusBar->SetFieldsCount( number );
981 return statusBar;
362c6693 982}
c801d85f 983
88ac883a 984wxStatusBar *wxFrame::GetStatusBar() const
30f1b5f3 985{
88ac883a 986 return m_frameStatusBar;
30f1b5f3
RR
987}
988
362c6693 989void wxFrame::SetStatusText(const wxString& text, int number)
c801d85f 990{
ed9b9841 991 wxASSERT_MSG( (m_widget != NULL), _T("invalid frame") );
8bbe427f 992
ed9b9841 993 wxCHECK_RET( m_frameStatusBar != NULL, _T("no statusbar to set text for") );
c801d85f 994
f5368809 995 m_frameStatusBar->SetStatusText(text, number);
362c6693
RR
996}
997
998void wxFrame::SetStatusWidths(int n, const int widths_field[] )
c801d85f 999{
ed9b9841 1000 wxASSERT_MSG( (m_widget != NULL), _T("invalid frame") );
8bbe427f 1001
ed9b9841 1002 wxCHECK_RET( m_frameStatusBar != NULL, _T("no statusbar to set widths for") );
362c6693 1003
f5368809 1004 m_frameStatusBar->SetStatusWidths(n, widths_field);
362c6693 1005}
88ac883a 1006#endif // wxUSE_STATUSBAR
c801d85f 1007
88ac883a 1008void wxFrame::Command( int id )
c801d85f 1009{
88ac883a
VZ
1010 wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, id);
1011 commandEvent.SetInt( id );
1012 commandEvent.SetEventObject( this );
1013
1014 wxMenuBar *bar = GetMenuBar();
1015 if (!bar) return;
1016
1017 wxMenuItem *item = bar->FindItemForId(id) ;
1018 if (item && item->IsCheckable())
1019 {
1020 bar->Check(id,!bar->Checked(id)) ;
1021 }
1022
1023 wxEvtHandler* evtHandler = GetEventHandler();
1024
1025 evtHandler->ProcessEvent(commandEvent);
362c6693 1026}
c801d85f 1027
c801d85f
KB
1028void wxFrame::SetTitle( const wxString &title )
1029{
ed9b9841 1030 wxASSERT_MSG( (m_widget != NULL), _T("invalid frame") );
8bbe427f 1031
f5368809 1032 m_title = title;
ed9b9841
OK
1033 if (m_title.IsNull()) m_title = _T("");
1034 gtk_window_set_title( GTK_WINDOW(m_widget), title.mbc_str() );
362c6693 1035}
c801d85f 1036
d355d3fe
RR
1037void wxFrame::SetIcon( const wxIcon &icon )
1038{
ed9b9841 1039 wxASSERT_MSG( (m_widget != NULL), _T("invalid frame") );
8bbe427f 1040
f5368809
RR
1041 m_icon = icon;
1042 if (!icon.Ok()) return;
8bbe427f 1043
58dea4b0
RR
1044 if (!m_widget->window) return;
1045
f5368809
RR
1046 wxMask *mask = icon.GetMask();
1047 GdkBitmap *bm = (GdkBitmap *) NULL;
1048 if (mask) bm = mask->GetBitmap();
8bbe427f 1049
f5368809 1050 gdk_window_set_icon( m_widget->window, (GdkWindow *) NULL, icon.GetPixmap(), bm );
d355d3fe 1051}
b2b3ccc5 1052
cd25b18c
RR
1053void wxFrame::Maximize(bool WXUNUSED(maximize))
1054{
1055}
1056
1057void wxFrame::Restore()
1058{
1059}
1060
1061void wxFrame::Iconize( bool iconize )
1062{
1063 if (iconize)
1064 {
1065 XIconifyWindow( GDK_WINDOW_XDISPLAY( m_widget->window ),
1066 GDK_WINDOW_XWINDOW( m_widget->window ),
1067 DefaultScreen( GDK_DISPLAY() ) );
1068 }
1069}
1070
1071bool wxFrame::IsIconized() const
1072{
1073 return FALSE;
1074}