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