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