]> git.saurik.com Git - wxWidgets.git/blame - src/gtk/frame.cpp
fixed bug in mouse handling
[wxWidgets.git] / src / gtk / 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
84eacd30 255 if ((win->m_miniEdge > 0) || (win->HasFlag(wxSIMPLE_BORDER)) || (win->HasFlag(wxNO_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;
343e14b3
RR
428
429 if (style & wxFRAME_TOOL_WINDOW)
430 win_type = GTK_WINDOW_POPUP;
8bbe427f 431
fb1585ae 432 m_widget = gtk_window_new( win_type );
88ac883a 433
80629c8b
RR
434 if ((m_parent) && (HasFlag(wxFRAME_FLOAT_ON_PARENT)) && (GTK_IS_WINDOW(m_parent->m_widget)))
435 gtk_window_set_transient_for( GTK_WINDOW(m_widget), GTK_WINDOW(m_parent->m_widget) );
436
de1c750f
RR
437 if (!name.IsEmpty())
438 gtk_window_set_wmclass( GTK_WINDOW(m_widget), name.mb_str(), name.mb_str() );
8bbe427f 439
2e563988 440#ifdef __WXDEBUG__
223d09f6 441 debug_focus_in( m_widget, wxT("wxFrame::m_widget"), name );
2e563988
RR
442#endif
443
ed9b9841 444 gtk_window_set_title( GTK_WINDOW(m_widget), title.mbc_str() );
fb1585ae 445 GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
ed7a557b 446
fb1585ae
RR
447 gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event",
448 GTK_SIGNAL_FUNC(gtk_frame_delete_callback), (gpointer)this );
ed7a557b 449
f362b96d 450 /* m_mainWidget holds the toolbar, the menubar and the client area */
da048e3d 451 m_mainWidget = gtk_pizza_new();
f362b96d
RR
452 gtk_widget_show( m_mainWidget );
453 GTK_WIDGET_UNSET_FLAGS( m_mainWidget, GTK_CAN_FOCUS );
454 gtk_container_add( GTK_CONTAINER(m_widget), m_mainWidget );
88ac883a 455
2e563988 456#ifdef __WXDEBUG__
223d09f6 457 debug_focus_in( m_mainWidget, wxT("wxFrame::m_mainWidget"), name );
2e563988
RR
458#endif
459
f362b96d 460 /* m_wxwindow only represents the client area without toolbar and menubar */
da048e3d 461 m_wxwindow = gtk_pizza_new();
fb1585ae 462 gtk_widget_show( m_wxwindow );
f362b96d 463 gtk_container_add( GTK_CONTAINER(m_mainWidget), m_wxwindow );
88ac883a 464
2e563988 465#ifdef __WXDEBUG__
223d09f6 466 debug_focus_in( m_wxwindow, wxT("wxFrame::m_wxwindow"), name );
2e563988
RR
467#endif
468
469 /* we donm't allow the frame to get the focus as otherwise
470 the frame will grabit at arbitrary fcous changes. */
471 GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
ed7a557b 472
de8113d9
RR
473 if (m_parent) m_parent->AddChild( this );
474
54517652
RR
475 /* the user resized the frame by dragging etc. */
476 gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
477 GTK_SIGNAL_FUNC(gtk_frame_size_callback), (gpointer)this );
478
de8113d9
RR
479 PostCreation();
480
15909a16
RR
481 if ((m_x != -1) || (m_y != -1))
482 gtk_widget_set_uposition( m_widget, m_x, m_y );
483 gtk_widget_set_usize( m_widget, m_width, m_height );
f6bcfd97 484
58dea4b0 485 /* we cannot set MWM hints and icons before the widget has
2b07d713
RR
486 been realized, so we do this directly after realization */
487 gtk_signal_connect( GTK_OBJECT(m_widget), "realize",
f03fc89f 488 GTK_SIGNAL_FUNC(gtk_frame_realized_callback), (gpointer) this );
88ac883a 489
ab2b3dd4 490 /* the only way to get the window size is to connect to this event */
fb1585ae
RR
491 gtk_signal_connect( GTK_OBJECT(m_widget), "configure_event",
492 GTK_SIGNAL_FUNC(gtk_frame_configure_callback), (gpointer)this );
8bbe427f 493
69ffe1d2
RR
494 /* disable native tab traversal */
495 gtk_signal_connect( GTK_OBJECT(m_widget), "focus",
496 GTK_SIGNAL_FUNC(gtk_frame_focus_callback), (gpointer)this );
497
fb1585ae 498 return TRUE;
362c6693 499}
c801d85f 500
19717c50 501wxFrame::~wxFrame()
c801d85f 502{
31c6b4fc 503 m_isBeingDeleted = TRUE;
88ac883a 504
7c0ea335 505 DeleteAllBars();
ed7a557b 506
fb1585ae 507 wxTopLevelWindows.DeleteObject( this );
2b854a32 508
0d2a2b60 509 if (wxTheApp->GetTopWindow() == this)
0d2a2b60 510 wxTheApp->SetTopWindow( (wxWindow*) NULL );
2b854a32 511
f59d80ca
RR
512 if ((wxTopLevelWindows.Number() == 0) &&
513 (wxTheApp->GetExitOnFrameDelete()))
514 {
0d2a2b60 515 wxTheApp->ExitMainLoop();
f59d80ca 516 }
362c6693 517}
ed7a557b 518
3d0c4d2e
RR
519bool wxFrame::ShowFullScreen(bool show, long style )
520{
521 if (show == m_fsIsShowing) return FALSE; // return what?
522
523 m_fsIsShowing = show;
524
525 if (show)
526 {
527 m_fsSaveStyle = m_windowStyle;
528 m_fsSaveFlag = style;
529 GetPosition( &m_fsSaveFrame.x, &m_fsSaveFrame.y );
530 GetSize( &m_fsSaveFrame.width, &m_fsSaveFrame.height );
531
532 gtk_widget_hide( m_widget );
533 gtk_widget_unrealize( m_widget );
534
535 m_windowStyle = wxSIMPLE_BORDER;
536
537 int x;
538 int y;
539 wxDisplaySize( &x, &y );
540 SetSize( 0, 0, x, y );
541
542 gtk_widget_realize( m_widget );
543 gtk_widget_show( m_widget );
544 }
545 else
546 {
547 gtk_widget_hide( m_widget );
548 gtk_widget_unrealize( m_widget );
549
550 m_windowStyle = m_fsSaveStyle;
551
552 SetSize( m_fsSaveFrame.x, m_fsSaveFrame.y, m_fsSaveFrame.width, m_fsSaveFrame.height );
553
554 gtk_widget_realize( m_widget );
555 gtk_widget_show( m_widget );
556 }
557
558 return TRUE;
559}
560
7c0ea335
VZ
561// ----------------------------------------------------------------------------
562// overridden wxWindow methods
563// ----------------------------------------------------------------------------
564
debe6624 565bool wxFrame::Show( bool show )
c801d85f 566{
223d09f6 567 wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
8bbe427f 568
35178437 569 if (show && !m_sizeSet)
fb1585ae 570 {
e27ce4e9
RR
571 /* by calling GtkOnSize here, we don't have to call
572 either after showing the frame, which would entail
f362b96d 573 much ugly flicker or from within the size_allocate
e27ce4e9 574 handler, because GTK 1.1.X forbids that. */
8bbe427f 575
35178437 576 GtkOnSize( m_x, m_y, m_width, m_height );
fb1585ae 577 }
8bbe427f 578
fb1585ae 579 return wxWindow::Show( show );
362c6693 580}
c801d85f 581
23efdd02
RR
582void wxFrame::DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED(width), int WXUNUSED(height) )
583{
584 wxFAIL_MSG( wxT("DoMoveWindow called for wxFrame") );
585}
f6bcfd97 586
bfc6fde4 587void wxFrame::DoSetSize( int x, int y, int width, int height, int sizeFlags )
903f689b 588{
223d09f6 589 wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
8bbe427f 590
ab2b3dd4 591 /* this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow */
223d09f6 592 wxASSERT_MSG( (m_wxwindow != NULL), wxT("invalid frame") );
88ac883a 593
ab2b3dd4 594 /* avoid recursions */
7c0ea335
VZ
595 if (m_resizing)
596 return;
fb1585ae
RR
597 m_resizing = TRUE;
598
599 int old_x = m_x;
600 int old_y = m_y;
7beba2fc 601
fb1585ae
RR
602 int old_width = m_width;
603 int old_height = m_height;
8bbe427f 604
85ad5eb5 605 if ((sizeFlags & wxSIZE_ALLOW_MINUS_ONE) == 0)
fb1585ae
RR
606 {
607 if (x != -1) m_x = x;
608 if (y != -1) m_y = y;
609 if (width != -1) m_width = width;
610 if (height != -1) m_height = height;
611 }
612 else
613 {
614 m_x = x;
615 m_y = y;
616 m_width = width;
617 m_height = height;
618 }
619
11e1c70d 620/*
fb1585ae
RR
621 if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH)
622 {
623 if (width == -1) m_width = 80;
624 }
625
626 if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT)
627 {
628 if (height == -1) m_height = 26;
629 }
11e1c70d 630*/
8bbe427f 631
fb1585ae
RR
632 if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth;
633 if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight;
0c77152e
RR
634 if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth;
635 if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight;
fb1585ae
RR
636
637 if ((m_x != -1) || (m_y != -1))
638 {
8bbe427f 639 if ((m_x != old_x) || (m_y != old_y))
0138c2de 640 {
8487f887 641 gtk_widget_set_uposition( m_widget, m_x, m_y );
0138c2de 642 }
fb1585ae 643 }
8bbe427f 644
fb1585ae
RR
645 if ((m_width != old_width) || (m_height != old_height))
646 {
15909a16
RR
647 gtk_widget_set_usize( m_widget, m_width, m_height );
648
ab2b3dd4 649 /* we set the size in GtkOnSize, i.e. mostly the actual resizing is
f03fc89f
VZ
650 done either directly before the frame is shown or in idle time
651 so that different calls to SetSize() don't lead to flicker. */
de8113d9 652 m_sizeSet = FALSE;
fb1585ae 653 }
8bbe427f 654
fb1585ae 655 m_resizing = FALSE;
903f689b
RR
656}
657
f9241296 658void wxFrame::DoGetClientSize( int *width, int *height ) const
c801d85f 659{
223d09f6 660 wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
8bbe427f 661
f9241296 662 wxWindow::DoGetClientSize( width, height );
fb1585ae 663 if (height)
46dc76ba 664 {
41ca191f
RR
665 /* menu bar */
666 if (m_frameMenuBar)
f03fc89f 667 {
88ac883a 668 if (!m_menuBarDetached)
f03fc89f
VZ
669 (*height) -= wxMENU_HEIGHT;
670 else
671 (*height) -= wxPLACE_HOLDER;
672 }
88ac883a 673
dcf924a3 674#if wxUSE_STATUSBAR
f03fc89f 675 /* status bar */
fa755cf1 676 if (m_frameStatusBar && m_frameStatusBar->IsShown()) (*height) -= wxSTATUS_HEIGHT;
93fa69f8 677#endif // wxUSE_STATUSBAR
88ac883a 678
dcf924a3 679#if wxUSE_TOOLBAR
f03fc89f 680 /* tool bar */
fa755cf1 681 if (m_frameToolBar && m_frameToolBar->IsShown())
fb1585ae 682 {
93fa69f8 683 if (m_toolBarDetached)
f03fc89f 684 {
93fa69f8 685 *height -= wxPLACE_HOLDER;
f03fc89f
VZ
686 }
687 else
93fa69f8
VZ
688 {
689 int x, y;
690 m_frameToolBar->GetSize( &x, &y );
691 if ( m_frameToolBar->GetWindowStyle() & wxTB_VERTICAL )
692 {
693 *width -= x;
694 }
695 else
696 {
697 *height -= y;
698 }
699 }
fb1585ae 700 }
93fa69f8 701#endif // wxUSE_TOOLBAR
88ac883a 702
f03fc89f 703 /* mini edge */
93fa69f8 704 *height -= m_miniEdge*2 + m_miniTitle;
b2b3ccc5
RR
705 }
706 if (width)
707 {
93fa69f8 708 *width -= m_miniEdge*2;
46dc76ba 709 }
362c6693 710}
c801d85f 711
bfc6fde4 712void wxFrame::DoSetClientSize( int width, int height )
b593568e 713{
223d09f6 714 wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
8bbe427f 715
41ca191f
RR
716 /* menu bar */
717 if (m_frameMenuBar)
f03fc89f 718 {
88ac883a 719 if (!m_menuBarDetached)
f03fc89f
VZ
720 height += wxMENU_HEIGHT;
721 else
722 height += wxPLACE_HOLDER;
723 }
88ac883a 724
dcf924a3 725#if wxUSE_STATUSBAR
f03fc89f 726 /* status bar */
fa755cf1 727 if (m_frameStatusBar && m_frameStatusBar->IsShown()) height += wxSTATUS_HEIGHT;
dcf924a3 728#endif
88ac883a 729
dcf924a3 730#if wxUSE_TOOLBAR
f03fc89f 731 /* tool bar */
fa755cf1 732 if (m_frameToolBar && m_frameToolBar->IsShown())
41ca191f 733 {
93fa69f8 734 if (m_toolBarDetached)
f03fc89f 735 {
93fa69f8 736 height += wxPLACE_HOLDER;
f03fc89f
VZ
737 }
738 else
93fa69f8
VZ
739 {
740 int x, y;
741 m_frameToolBar->GetSize( &x, &y );
742 if ( m_frameToolBar->GetWindowStyle() & wxTB_VERTICAL )
743 {
744 width += x;
745 }
746 else
747 {
748 height += y;
749 }
750 }
41ca191f 751 }
dcf924a3 752#endif
88ac883a 753
3017f78d 754 DoSetSize( -1, -1, width + m_miniEdge*2, height + m_miniEdge*2 + m_miniTitle, 0 );
362c6693 755}
b593568e 756
7c0ea335
VZ
757void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y),
758 int width, int height )
c801d85f 759{
f5368809
RR
760 // due to a bug in gtk, x,y are always 0
761 // m_x = x;
762 // m_y = y;
763
ab2b3dd4 764 /* avoid recursions */
e52f60e6
RR
765 if (m_resizing) return;
766 m_resizing = TRUE;
8bbe427f 767
ab2b3dd4 768 /* this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow */
223d09f6 769 wxASSERT_MSG( (m_wxwindow != NULL), wxT("invalid frame") );
88ac883a 770
f5368809
RR
771 m_width = width;
772 m_height = height;
7beba2fc 773
ab2b3dd4 774 /* space occupied by m_frameToolBar and m_frameMenuBar */
93fa69f8
VZ
775 int client_area_x_offset = 0,
776 client_area_y_offset = 0;
8bbe427f 777
ab2b3dd4
RR
778 /* wxMDIChildFrame derives from wxFrame but it _is_ a wxWindow as it uses
779 wxWindow::Create to create it's GTK equivalent. m_mainWidget is only
780 set in wxFrame::Create so it is used to check what kind of frame we
781 have here. if m_mainWidget is NULL it is a wxMDIChildFrame and so we
782 skip the part which handles m_frameMenuBar, m_frameToolBar and (most
783 importantly) m_mainWidget */
88ac883a 784
1f3c610d
RR
785 if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth;
786 if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight;
787 if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth;
788 if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight;
1f3c610d 789
ab2b3dd4 790 if (m_mainWidget)
f5368809 791 {
f6bcfd97
BP
792 /* set size hints */
793 gint flag = 0; // GDK_HINT_POS;
794 if ((m_minWidth != -1) || (m_minHeight != -1)) flag |= GDK_HINT_MIN_SIZE;
795 if ((m_maxWidth != -1) || (m_maxHeight != -1)) flag |= GDK_HINT_MAX_SIZE;
796 GdkGeometry geom;
797 geom.min_width = m_minWidth;
798 geom.min_height = m_minHeight;
799 geom.max_width = m_maxWidth;
800 geom.max_height = m_maxHeight;
801 gtk_window_set_geometry_hints( GTK_WINDOW(m_widget),
802 (GtkWidget*) NULL,
803 &geom,
804 (GdkWindowHints) flag );
ab2b3dd4
RR
805
806 /* I revert back to wxGTK's original behaviour. m_mainWidget holds the
807 * menubar, the toolbar and the client area, which is represented by
808 * m_wxwindow.
809 * this hurts in the eye, but I don't want to call SetSize()
810 * because I don't want to call any non-native functions here. */
88ac883a 811
ab2b3dd4
RR
812 if (m_frameMenuBar)
813 {
814 int xx = m_miniEdge;
815 int yy = m_miniEdge + m_miniTitle;
816 int ww = m_width - 2*m_miniEdge;
41ca191f 817 int hh = wxMENU_HEIGHT;
f03fc89f 818 if (m_menuBarDetached) hh = wxPLACE_HOLDER;
121a3581
RR
819 m_frameMenuBar->m_x = xx;
820 m_frameMenuBar->m_y = yy;
821 m_frameMenuBar->m_width = ww;
822 m_frameMenuBar->m_height = hh;
da048e3d 823 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget),
88ac883a 824 m_frameMenuBar->m_widget,
f03fc89f
VZ
825 xx, yy, ww, hh );
826 client_area_y_offset += hh;
ab2b3dd4 827 }
88ac883a 828
dcf924a3 829#if wxUSE_TOOLBAR
fa755cf1 830 if ((m_frameToolBar) && m_frameToolBar->IsShown() &&
7beba2fc 831 (m_frameToolBar->m_widget->parent == m_mainWidget))
ab2b3dd4
RR
832 {
833 int xx = m_miniEdge;
834 int yy = m_miniEdge + m_miniTitle;
41ca191f 835 if (m_frameMenuBar)
f03fc89f 836 {
88ac883a
VZ
837 if (!m_menuBarDetached)
838 yy += wxMENU_HEIGHT;
839 else
f03fc89f
VZ
840 yy += wxPLACE_HOLDER;
841 }
93fa69f8 842
121a3581
RR
843 m_frameToolBar->m_x = xx;
844 m_frameToolBar->m_y = yy;
93fa69f8
VZ
845
846 /* don't change the toolbar's reported height/width */
847 int ww, hh;
848 if ( m_frameToolBar->GetWindowStyle() & wxTB_VERTICAL )
849 {
850 ww = m_toolBarDetached ? wxPLACE_HOLDER
851 : m_frameToolBar->m_width;
852 hh = m_height - 2*m_miniEdge;
853
854 client_area_x_offset += ww;
855 }
856 else
857 {
858 ww = m_width - 2*m_miniEdge;
859 hh = m_toolBarDetached ? wxPLACE_HOLDER
860 : m_frameToolBar->m_height;
861
862 client_area_y_offset += hh;
863 }
864
da048e3d 865 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget),
88ac883a 866 m_frameToolBar->m_widget,
f03fc89f 867 xx, yy, ww, hh );
ab2b3dd4 868 }
93fa69f8 869#endif // wxUSE_TOOLBAR
88ac883a 870
93fa69f8 871 int client_x = client_area_x_offset + m_miniEdge;
f03fc89f 872 int client_y = client_area_y_offset + m_miniEdge + m_miniTitle;
93fa69f8 873 int client_w = m_width - client_area_x_offset - 2*m_miniEdge;
f03fc89f 874 int client_h = m_height - client_area_y_offset- 2*m_miniEdge - m_miniTitle;
da048e3d 875 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget),
88ac883a 876 m_wxwindow,
f03fc89f 877 client_x, client_y, client_w, client_h );
32a95f9f
RR
878 }
879 else
880 {
881 /* if there is no m_mainWidget between m_widget and m_wxwindow there
f03fc89f 882 is no need to set the size or position of m_wxwindow. */
f5368809 883 }
88ac883a 884
dcf924a3 885#if wxUSE_STATUSBAR
fa755cf1 886 if (m_frameStatusBar && m_frameStatusBar->IsShown())
f5368809 887 {
b2b3ccc5 888 int xx = 0 + m_miniEdge;
f362b96d 889 int yy = m_height - wxSTATUS_HEIGHT - m_miniEdge - client_area_y_offset;
ac57418f
RR
890 int ww = m_width - 2*m_miniEdge;
891 int hh = wxSTATUS_HEIGHT;
121a3581
RR
892 m_frameStatusBar->m_x = xx;
893 m_frameStatusBar->m_y = yy;
894 m_frameStatusBar->m_width = ww;
895 m_frameStatusBar->m_height = hh;
da048e3d 896 gtk_pizza_set_size( GTK_PIZZA(m_wxwindow),
7c0ea335
VZ
897 m_frameStatusBar->m_widget,
898 xx, yy, ww, hh );
b6fa52db 899 gtk_widget_draw( m_frameStatusBar->m_widget, (GdkRectangle*) NULL );
f5368809 900 }
dcf924a3 901#endif
8bbe427f 902
54517652 903 m_sizeSet = TRUE;
7beba2fc 904
54517652 905 // send size event to frame
43a18898
RR
906 wxSizeEvent event( wxSize(m_width,m_height), GetId() );
907 event.SetEventObject( this );
e52f60e6 908 GetEventHandler()->ProcessEvent( event );
8bbe427f 909
54517652 910 // send size event to status bar
5aa5e35a
RR
911 if (m_frameStatusBar)
912 {
a2053b27 913 wxSizeEvent event2( wxSize(m_frameStatusBar->m_width,m_frameStatusBar->m_height), m_frameStatusBar->GetId() );
5aa5e35a
RR
914 event2.SetEventObject( m_frameStatusBar );
915 m_frameStatusBar->GetEventHandler()->ProcessEvent( event2 );
916 }
884470b1 917
e52f60e6
RR
918 m_resizing = FALSE;
919}
920
ca26177c
RR
921void wxFrame::MakeModal( bool modal )
922{
923 if (modal)
ca26177c 924 gtk_grab_add( m_widget );
ca26177c 925 else
c25ccf85 926 gtk_grab_remove( m_widget );
ca26177c
RR
927}
928
9390a202 929void wxFrame::OnInternalIdle()
e52f60e6 930{
1b3667ab 931 if (!m_sizeSet && GTK_WIDGET_REALIZED(m_wxwindow))
54517652 932 {
e52f60e6 933 GtkOnSize( m_x, m_y, m_width, m_height );
7beba2fc
VZ
934
935 // we'll come back later
54517652
RR
936 if (g_isIdle)
937 wxapp_install_idle_handler();
7beba2fc 938 return;
54517652 939 }
88ac883a 940
082b2798 941 if (m_frameMenuBar) m_frameMenuBar->OnInternalIdle();
dcf924a3 942#if wxUSE_TOOLBAR
082b2798 943 if (m_frameToolBar) m_frameToolBar->OnInternalIdle();
dcf924a3
RR
944#endif
945#if wxUSE_STATUSBAR
082b2798 946 if (m_frameStatusBar) m_frameStatusBar->OnInternalIdle();
dcf924a3 947#endif
5e014a0c
RR
948
949 wxWindow::OnInternalIdle();
362c6693 950}
c801d85f 951
7c0ea335
VZ
952// ----------------------------------------------------------------------------
953// menu/tool/status bar stuff
954// ----------------------------------------------------------------------------
c801d85f 955
c801d85f
KB
956void wxFrame::SetMenuBar( wxMenuBar *menuBar )
957{
223d09f6
KB
958 wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
959 wxASSERT_MSG( (m_wxwindow != NULL), wxT("invalid frame") );
8bbe427f 960
186baeb2
RR
961 if (menuBar == m_frameMenuBar)
962 return;
963
964 if (m_frameMenuBar)
965 {
966 m_frameMenuBar->UnsetInvokingWindow( this );
967
968 if (m_frameMenuBar->GetWindowStyle() & wxMB_DOCKABLE)
969 {
970 gtk_signal_disconnect_by_func( GTK_OBJECT(m_frameMenuBar->m_widget),
971 GTK_SIGNAL_FUNC(gtk_menu_attached_callback), (gpointer)this );
972
973 gtk_signal_disconnect_by_func( GTK_OBJECT(m_frameMenuBar->m_widget),
974 GTK_SIGNAL_FUNC(gtk_menu_detached_callback), (gpointer)this );
975 }
f6bcfd97 976
186baeb2
RR
977 gtk_container_remove( GTK_CONTAINER(m_mainWidget), m_frameMenuBar->m_widget );
978 gtk_widget_ref( m_frameMenuBar->m_widget );
979 gtk_widget_unparent( m_frameMenuBar->m_widget );
980 }
981
f5368809 982 m_frameMenuBar = menuBar;
8bbe427f 983
f5368809 984 if (m_frameMenuBar)
30dea054 985 {
5bd9e519 986 m_frameMenuBar->SetInvokingWindow( this );
8bbe427f 987
186baeb2
RR
988 m_frameMenuBar->SetParent(this);
989 gtk_pizza_put( GTK_PIZZA(m_mainWidget),
88ac883a
VZ
990 m_frameMenuBar->m_widget,
991 m_frameMenuBar->m_x,
a2053b27
RR
992 m_frameMenuBar->m_y,
993 m_frameMenuBar->m_width,
994 m_frameMenuBar->m_height );
88ac883a 995
186baeb2
RR
996 if (menuBar->GetWindowStyle() & wxMB_DOCKABLE)
997 {
998 gtk_signal_connect( GTK_OBJECT(menuBar->m_widget), "child_attached",
999 GTK_SIGNAL_FUNC(gtk_menu_attached_callback), (gpointer)this );
7beba2fc 1000
186baeb2
RR
1001 gtk_signal_connect( GTK_OBJECT(menuBar->m_widget), "child_detached",
1002 GTK_SIGNAL_FUNC(gtk_menu_detached_callback), (gpointer)this );
f5368809 1003 }
186baeb2
RR
1004
1005 m_frameMenuBar->Show( TRUE );
716b7364 1006 }
8bbe427f 1007
1e133b7d 1008 /* resize window in OnInternalIdle */
5b077d48 1009 m_sizeSet = FALSE;
362c6693 1010}
c801d85f 1011
88ac883a 1012#if wxUSE_TOOLBAR
6bc8a1c8 1013wxToolBar* wxFrame::CreateToolBar( long style, wxWindowID id, const wxString& name )
46dc76ba 1014{
223d09f6 1015 wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
8bbe427f 1016
6bc8a1c8 1017 m_insertInClientArea = FALSE;
88ac883a 1018
7c0ea335 1019 m_frameToolBar = wxFrameBase::CreateToolBar( style, id, name );
8bbe427f 1020
6bc8a1c8 1021 m_insertInClientArea = TRUE;
8bbe427f 1022
5b077d48 1023 m_sizeSet = FALSE;
8bbe427f 1024
f5368809 1025 return m_frameToolBar;
362c6693 1026}
46dc76ba 1027
7beba2fc
VZ
1028void wxFrame::SetToolBar(wxToolBar *toolbar)
1029{
7c0ea335
VZ
1030 wxFrameBase::SetToolBar(toolbar);
1031
307f16e8
RR
1032 if (m_frameToolBar)
1033 {
1034 /* insert into toolbar area if not already there */
3017f78d
RR
1035 if ((m_frameToolBar->m_widget->parent) &&
1036 (m_frameToolBar->m_widget->parent != m_mainWidget))
307f16e8 1037 {
3017f78d 1038 GetChildren().DeleteObject( m_frameToolBar );
7beba2fc
VZ
1039
1040 gtk_widget_reparent( m_frameToolBar->m_widget, m_mainWidget );
5b8a521e 1041 GtkUpdateSize();
7beba2fc 1042 }
307f16e8
RR
1043 }
1044}
1045
88ac883a 1046#endif // wxUSE_TOOLBAR
46dc76ba 1047
88ac883a 1048#if wxUSE_STATUSBAR
8bbe427f 1049
7c0ea335
VZ
1050wxStatusBar* wxFrame::CreateStatusBar(int number,
1051 long style,
1052 wxWindowID id,
1053 const wxString& name)
c801d85f 1054{
223d09f6 1055 wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
8bbe427f 1056
7c0ea335
VZ
1057 // because it will change when toolbar is added
1058 m_sizeSet = FALSE;
c801d85f 1059
7c0ea335 1060 return wxFrameBase::CreateStatusBar( number, style, id, name );
362c6693
RR
1061}
1062
8febdd39
RR
1063void wxFrame::PositionStatusBar()
1064{
1065 if ( !m_frameStatusBar )
1066 return;
1067
1068 m_sizeSet = FALSE;
1069}
88ac883a 1070#endif // wxUSE_STATUSBAR
c801d85f 1071
7c0ea335
VZ
1072// ----------------------------------------------------------------------------
1073// frame title/icon
1074// ----------------------------------------------------------------------------
c801d85f 1075
c801d85f
KB
1076void wxFrame::SetTitle( const wxString &title )
1077{
223d09f6 1078 wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
8bbe427f 1079
f5368809 1080 m_title = title;
ed9b9841 1081 gtk_window_set_title( GTK_WINDOW(m_widget), title.mbc_str() );
362c6693 1082}
c801d85f 1083
d355d3fe
RR
1084void wxFrame::SetIcon( const wxIcon &icon )
1085{
223d09f6 1086 wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
8bbe427f 1087
7c0ea335 1088 wxFrameBase::SetIcon(icon);
8bbe427f 1089
7c0ea335
VZ
1090 if ( !m_icon.Ok() )
1091 return;
1092
1093 if (!m_widget->window)
1094 return;
58dea4b0 1095
f5368809
RR
1096 wxMask *mask = icon.GetMask();
1097 GdkBitmap *bm = (GdkBitmap *) NULL;
1098 if (mask) bm = mask->GetBitmap();
8bbe427f 1099
f5368809 1100 gdk_window_set_icon( m_widget->window, (GdkWindow *) NULL, icon.GetPixmap(), bm );
d355d3fe 1101}
b2b3ccc5 1102
7c0ea335
VZ
1103// ----------------------------------------------------------------------------
1104// frame state: maximized/iconized/normal (TODO)
1105// ----------------------------------------------------------------------------
1106
7beba2fc 1107void wxFrame::Maximize(bool WXUNUSED(maximize))
cd25b18c
RR
1108{
1109}
1110
7c0ea335
VZ
1111bool wxFrame::IsMaximized() const
1112{
1113 return FALSE;
1114}
1115
7beba2fc 1116void wxFrame::Restore()
cd25b18c
RR
1117{
1118}
1119
7beba2fc
VZ
1120void wxFrame::Iconize( bool iconize )
1121{
cd25b18c
RR
1122 if (iconize)
1123 {
1124 XIconifyWindow( GDK_WINDOW_XDISPLAY( m_widget->window ),
7beba2fc
VZ
1125 GDK_WINDOW_XWINDOW( m_widget->window ),
1126 DefaultScreen( GDK_DISPLAY() ) );
cd25b18c
RR
1127 }
1128}
1129
7beba2fc
VZ
1130bool wxFrame::IsIconized() const
1131{
1132 return FALSE;
cd25b18c 1133}