1 /////////////////////////////////////////////////////////////////////////////
4 // Author: Robert Roebling
6 // Copyright: (c) 1998 Robert Roebling
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
10 // ============================================================================
12 // ============================================================================
14 // ----------------------------------------------------------------------------
16 // ----------------------------------------------------------------------------
19 #pragma implementation "toplevel.h"
23 #define XIconifyWindow XICONIFYWINDOW
28 #include "wx/dialog.h"
29 #include "wx/control.h"
31 #include "wx/dcclient.h"
36 #include <gdk/gdkkeysyms.h>
39 #include "wx/gtk/win_gtk.h"
41 // ----------------------------------------------------------------------------
43 // ----------------------------------------------------------------------------
45 extern void wxapp_install_idle_handler();
47 extern int g_openDialogs
;
49 // ----------------------------------------------------------------------------
51 // ----------------------------------------------------------------------------
53 // ----------------------------------------------------------------------------
55 // ----------------------------------------------------------------------------
57 extern wxList wxPendingDelete
;
59 // ----------------------------------------------------------------------------
61 // ----------------------------------------------------------------------------
65 extern void debug_focus_in( GtkWidget
* widget
, const wxChar
* name
, const wxChar
*window
);
69 // ============================================================================
71 // ============================================================================
73 // ----------------------------------------------------------------------------
75 // ----------------------------------------------------------------------------
77 //-----------------------------------------------------------------------------
78 // "focus" from m_window
79 //-----------------------------------------------------------------------------
81 static gint
gtk_frame_focus_callback( GtkWidget
*widget
, GtkDirectionType
WXUNUSED(d
), wxWindow
*WXUNUSED(win
) )
84 wxapp_install_idle_handler();
86 // This disables GTK's tab traversal
87 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "focus" );
91 //-----------------------------------------------------------------------------
93 //-----------------------------------------------------------------------------
95 static void gtk_frame_size_callback( GtkWidget
*WXUNUSED(widget
), GtkAllocation
* alloc
, wxTopLevelWindowGTK
*win
)
98 wxapp_install_idle_handler();
103 if ((win
->m_width
!= alloc
->width
) || (win
->m_height
!= alloc
->height
))
106 wxPrintf( "OnSize from " );
107 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
108 wxPrintf( win->GetClassInfo()->GetClassName() );
109 wxPrintf( " %d %d %d %d\n", (int)alloc->x,
112 (int)alloc->height );
115 win
->m_width
= alloc
->width
;
116 win
->m_height
= alloc
->height
;
117 win
->m_queuedFullRedraw
= TRUE
;
118 win
->GtkUpdateSize();
122 //-----------------------------------------------------------------------------
124 //-----------------------------------------------------------------------------
126 static gint
gtk_frame_delete_callback( GtkWidget
*WXUNUSED(widget
), GdkEvent
*WXUNUSED(event
), wxTopLevelWindowGTK
*win
)
129 wxapp_install_idle_handler();
131 if (win
->IsEnabled() &&
132 (g_openDialogs
== 0 || (win
->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG
)))
139 //-----------------------------------------------------------------------------
141 //-----------------------------------------------------------------------------
144 gtk_frame_configure_callback( GtkWidget
*WXUNUSED(widget
), GdkEventConfigure
*WXUNUSED(event
), wxTopLevelWindowGTK
*win
)
147 wxapp_install_idle_handler();
154 gdk_window_get_root_origin( win
->m_widget
->window
, &x
, &y
);
158 wxMoveEvent
mevent( wxPoint(win
->m_x
,win
->m_y
), win
->GetId() );
159 mevent
.SetEventObject( win
);
160 win
->GetEventHandler()->ProcessEvent( mevent
);
165 //-----------------------------------------------------------------------------
166 // "realize" from m_widget
167 //-----------------------------------------------------------------------------
169 // we cannot MWM hints and icons before the widget has been realized,
170 // so we do this directly after realization
173 gtk_frame_realized_callback( GtkWidget
* WXUNUSED(widget
), wxTopLevelWindowGTK
*win
)
176 wxapp_install_idle_handler();
178 // All this is for Motif Window Manager "hints" and is supposed to be
179 // recognized by other WM as well. Not tested.
180 gdk_window_set_decorations(win
->m_widget
->window
,
181 (GdkWMDecoration
)win
->m_gdkDecor
);
182 gdk_window_set_functions(win
->m_widget
->window
,
183 (GdkWMFunction
)win
->m_gdkFunc
);
185 // GTK's shrinking/growing policy
186 if ((win
->m_gdkFunc
& GDK_FUNC_RESIZE
) == 0)
187 gtk_window_set_policy(GTK_WINDOW(win
->m_widget
), 0, 0, 1);
189 gtk_window_set_policy(GTK_WINDOW(win
->m_widget
), 1, 1, 1);
192 wxIcon iconOld
= win
->GetIcon();
193 if ( iconOld
!= wxNullIcon
)
195 wxIcon
icon( iconOld
);
196 win
->SetIcon( wxNullIcon
);
197 win
->SetIcon( icon
);
200 // we set the focus to the child that accepts the focus. this
201 // doesn't really have to be done in "realize" but why not?
202 wxWindowList::Node
*node
= win
->GetChildren().GetFirst();
205 wxWindow
*child
= node
->GetData();
206 if (child
->AcceptsFocus())
212 node
= node
->GetNext();
216 //-----------------------------------------------------------------------------
217 // "map_event" from m_widget
218 //-----------------------------------------------------------------------------
221 gtk_frame_map_callback( GtkWidget
* WXUNUSED(widget
),
222 GdkEvent
* WXUNUSED(event
),
223 wxTopLevelWindow
*win
)
225 win
->SetIconizeState(FALSE
);
228 //-----------------------------------------------------------------------------
229 // "unmap_event" from m_widget
230 //-----------------------------------------------------------------------------
233 gtk_frame_unmap_callback( GtkWidget
* WXUNUSED(widget
),
234 GdkEvent
* WXUNUSED(event
),
235 wxTopLevelWindow
*win
)
237 win
->SetIconizeState(TRUE
);
240 //-----------------------------------------------------------------------------
241 // "expose_event" of m_client
242 //-----------------------------------------------------------------------------
244 static int gtk_window_expose_callback( GtkWidget
*widget
, GdkEventExpose
*gdk_event
, wxWindow
*win
)
246 GtkPizza
*pizza
= GTK_PIZZA(widget
);
248 gtk_paint_flat_box (win
->m_widget
->style
, pizza
->bin_window
, GTK_STATE_NORMAL
,
249 GTK_SHADOW_NONE
, &gdk_event
->area
, win
->m_widget
, "base", 0, 0, -1, -1);
254 //-----------------------------------------------------------------------------
255 // "draw" of m_client
256 //-----------------------------------------------------------------------------
259 static void gtk_window_draw_callback( GtkWidget
*widget
, GdkRectangle
*rect
, wxWindow
*win
)
261 GtkPizza
*pizza
= GTK_PIZZA(widget
);
263 gtk_paint_flat_box (win
->m_widget
->style
, pizza
->bin_window
, GTK_STATE_NORMAL
,
264 GTK_SHADOW_NONE
, rect
, win
->m_widget
, "base", 0, 0, -1, -1);
267 // ----------------------------------------------------------------------------
268 // wxTopLevelWindowGTK itself
269 // ----------------------------------------------------------------------------
271 //-----------------------------------------------------------------------------
272 // InsertChild for wxTopLevelWindowGTK
273 //-----------------------------------------------------------------------------
275 /* Callback for wxTopLevelWindowGTK. This very strange beast has to be used because
276 * C++ has no virtual methods in a constructor. We have to emulate a
277 * virtual function here as wxWindows requires different ways to insert
278 * a child in container classes. */
280 static void wxInsertChildInTopLevelWindow( wxTopLevelWindowGTK
* parent
, wxWindow
* child
)
282 wxASSERT( GTK_IS_WIDGET(child
->m_widget
) );
284 if (!parent
->m_insertInClientArea
)
286 // these are outside the client area
287 wxTopLevelWindowGTK
* frame
= (wxTopLevelWindowGTK
*) parent
;
288 gtk_pizza_put( GTK_PIZZA(frame
->m_mainWidget
),
289 GTK_WIDGET(child
->m_widget
),
297 // these are inside the client area
298 gtk_pizza_put( GTK_PIZZA(parent
->m_wxwindow
),
299 GTK_WIDGET(child
->m_widget
),
306 // resize on OnInternalIdle
307 parent
->GtkUpdateSize();
310 // ----------------------------------------------------------------------------
311 // wxTopLevelWindowGTK creation
312 // ----------------------------------------------------------------------------
314 void wxTopLevelWindowGTK::Init()
319 m_mainWidget
= (GtkWidget
*) NULL
;
320 m_insertInClientArea
= TRUE
;
322 m_isIconized
= FALSE
;
323 m_fsIsShowing
= FALSE
;
324 m_themeEnabled
= TRUE
;
325 m_gdkDecor
= m_gdkFunc
= 0;
328 bool wxTopLevelWindowGTK::Create( wxWindow
*parent
,
330 const wxString
& title
,
332 const wxSize
& sizeOrig
,
334 const wxString
&name
)
336 // always create a frame of some reasonable, even if arbitrary, size (at
337 // least for MSW compatibility)
338 wxSize size
= sizeOrig
;
339 if ( size
.x
== -1 || size
.y
== -1 )
341 wxSize sizeDpy
= wxGetDisplaySize();
343 size
.x
= sizeDpy
.x
/ 3;
345 size
.y
= sizeDpy
.y
/ 5;
348 wxTopLevelWindows
.Append( this );
350 m_needParent
= FALSE
;
352 if (!PreCreation( parent
, pos
, size
) ||
353 !CreateBase( parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
))
355 wxFAIL_MSG( wxT("wxTopLevelWindowGTK creation failed") );
361 m_insertCallback
= (wxInsertChildFunction
) wxInsertChildInTopLevelWindow
;
363 GtkWindowType win_type
= GTK_WINDOW_TOPLEVEL
;
365 if (style
& wxFRAME_TOOL_WINDOW
)
366 win_type
= GTK_WINDOW_POPUP
;
368 if (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG
)
369 win_type
= GTK_WINDOW_DIALOG
;
371 m_widget
= gtk_window_new( win_type
);
373 if (m_parent
&& (GTK_IS_WINDOW(m_parent
->m_widget
)) &&
374 (HasFlag(wxFRAME_FLOAT_ON_PARENT
) || (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG
)))
376 gtk_window_set_transient_for( GTK_WINDOW(m_widget
), GTK_WINDOW(m_parent
->m_widget
) );
380 gtk_window_set_wmclass( GTK_WINDOW(m_widget
), name
.mb_str(), name
.mb_str() );
383 debug_focus_in( m_widget
, wxT("wxTopLevelWindowGTK::m_widget"), name
);
386 gtk_window_set_title( GTK_WINDOW(m_widget
), title
.mbc_str() );
387 GTK_WIDGET_UNSET_FLAGS( m_widget
, GTK_CAN_FOCUS
);
389 gtk_signal_connect( GTK_OBJECT(m_widget
), "delete_event",
390 GTK_SIGNAL_FUNC(gtk_frame_delete_callback
), (gpointer
)this );
392 // m_mainWidget holds the toolbar, the menubar and the client area
393 m_mainWidget
= gtk_pizza_new();
394 gtk_widget_show( m_mainWidget
);
395 GTK_WIDGET_UNSET_FLAGS( m_mainWidget
, GTK_CAN_FOCUS
);
396 gtk_container_add( GTK_CONTAINER(m_widget
), m_mainWidget
);
398 // for m_mainWidget themes
399 gtk_signal_connect( GTK_OBJECT(m_mainWidget
), "expose_event",
400 GTK_SIGNAL_FUNC(gtk_window_expose_callback
), (gpointer
)this );
401 gtk_signal_connect( GTK_OBJECT(m_mainWidget
), "draw",
402 GTK_SIGNAL_FUNC(gtk_window_draw_callback
), (gpointer
)this );
405 debug_focus_in( m_mainWidget
, wxT("wxTopLevelWindowGTK::m_mainWidget"), name
);
408 // m_wxwindow only represents the client area without toolbar and menubar
409 m_wxwindow
= gtk_pizza_new();
410 gtk_widget_show( m_wxwindow
);
411 gtk_container_add( GTK_CONTAINER(m_mainWidget
), m_wxwindow
);
414 debug_focus_in( m_wxwindow
, wxT("wxTopLevelWindowGTK::m_wxwindow"), name
);
417 // we donm't allow the frame to get the focus as otherwise
418 // the frame will grab it at arbitrary focus changes
419 GTK_WIDGET_UNSET_FLAGS( m_wxwindow
, GTK_CAN_FOCUS
);
421 if (m_parent
) m_parent
->AddChild( this );
423 // the user resized the frame by dragging etc.
424 gtk_signal_connect( GTK_OBJECT(m_widget
), "size_allocate",
425 GTK_SIGNAL_FUNC(gtk_frame_size_callback
), (gpointer
)this );
429 if ((m_x
!= -1) || (m_y
!= -1))
430 gtk_widget_set_uposition( m_widget
, m_x
, m_y
);
432 gtk_window_set_default_size( GTK_WINDOW(m_widget
), m_width
, m_height
);
434 // we cannot set MWM hints and icons before the widget has
435 // been realized, so we do this directly after realization
436 gtk_signal_connect( GTK_OBJECT(m_widget
), "realize",
437 GTK_SIGNAL_FUNC(gtk_frame_realized_callback
), (gpointer
) this );
439 // the only way to get the window size is to connect to this event
440 gtk_signal_connect( GTK_OBJECT(m_widget
), "configure_event",
441 GTK_SIGNAL_FUNC(gtk_frame_configure_callback
), (gpointer
)this );
443 // map and unmap for iconized state
444 gtk_signal_connect( GTK_OBJECT(m_widget
), "map_event",
445 GTK_SIGNAL_FUNC(gtk_frame_map_callback
), (gpointer
)this );
446 gtk_signal_connect( GTK_OBJECT(m_widget
), "unmap_event",
447 GTK_SIGNAL_FUNC(gtk_frame_unmap_callback
), (gpointer
)this );
449 // the only way to get the window size is to connect to this event
450 gtk_signal_connect( GTK_OBJECT(m_widget
), "configure_event",
451 GTK_SIGNAL_FUNC(gtk_frame_configure_callback
), (gpointer
)this );
453 // disable native tab traversal
454 gtk_signal_connect( GTK_OBJECT(m_widget
), "focus",
455 GTK_SIGNAL_FUNC(gtk_frame_focus_callback
), (gpointer
)this );
458 if ((m_miniEdge
> 0) || (style
& wxSIMPLE_BORDER
) || (style
& wxNO_BORDER
))
465 m_gdkDecor
= (long) GDK_DECOR_BORDER
;
466 m_gdkFunc
= (long) GDK_FUNC_MOVE
;
468 // All this is for Motif Window Manager "hints" and is supposed to be
469 // recognized by other WMs as well.
470 if ((style
& wxCAPTION
) != 0)
471 m_gdkDecor
|= GDK_DECOR_TITLE
;
472 if ((style
& wxSYSTEM_MENU
) != 0)
474 m_gdkFunc
|= GDK_FUNC_CLOSE
;
475 m_gdkDecor
|= GDK_DECOR_MENU
;
477 if ((style
& wxMINIMIZE_BOX
) != 0)
479 m_gdkFunc
|= GDK_FUNC_MINIMIZE
;
480 m_gdkDecor
|= GDK_DECOR_MINIMIZE
;
482 if ((style
& wxMAXIMIZE_BOX
) != 0)
484 m_gdkFunc
|= GDK_FUNC_MAXIMIZE
;
485 m_gdkDecor
|= GDK_DECOR_MAXIMIZE
;
487 if ((style
& wxRESIZE_BORDER
) != 0)
489 m_gdkFunc
|= GDK_FUNC_RESIZE
;
490 m_gdkDecor
|= GDK_DECOR_RESIZEH
;
497 wxTopLevelWindowGTK::~wxTopLevelWindowGTK()
499 m_isBeingDeleted
= TRUE
;
501 wxTopLevelWindows
.DeleteObject( this );
503 if (wxTheApp
->GetTopWindow() == this)
504 wxTheApp
->SetTopWindow( (wxWindow
*) NULL
);
506 if ((wxTopLevelWindows
.Number() == 0) &&
507 (wxTheApp
->GetExitOnFrameDelete()))
509 wxTheApp
->ExitMainLoop();
513 bool wxTopLevelWindowGTK::ShowFullScreen(bool show
, long style
)
515 if (show
== m_fsIsShowing
) return FALSE
; // return what?
517 m_fsIsShowing
= show
;
521 m_fsSaveGdkFunc
= m_gdkFunc
;
522 m_fsSaveGdkDecor
= m_gdkDecor
;
523 m_fsSaveFlag
= style
;
524 GetPosition( &m_fsSaveFrame
.x
, &m_fsSaveFrame
.y
);
525 GetSize( &m_fsSaveFrame
.width
, &m_fsSaveFrame
.height
);
527 gtk_widget_hide( m_widget
);
528 gtk_widget_unrealize( m_widget
);
530 m_gdkDecor
= (long) GDK_DECOR_BORDER
;
531 m_gdkFunc
= (long) GDK_FUNC_MOVE
;
535 wxDisplaySize( &x
, &y
);
536 SetSize( 0, 0, x
, y
);
538 gtk_widget_realize( m_widget
);
539 gtk_widget_show( m_widget
);
543 gtk_widget_hide( m_widget
);
544 gtk_widget_unrealize( m_widget
);
546 m_gdkFunc
= m_fsSaveGdkFunc
;
547 m_gdkDecor
= m_fsSaveGdkDecor
;
549 SetSize( m_fsSaveFrame
.x
, m_fsSaveFrame
.y
, m_fsSaveFrame
.width
, m_fsSaveFrame
.height
);
551 gtk_widget_realize( m_widget
);
552 gtk_widget_show( m_widget
);
558 // ----------------------------------------------------------------------------
559 // overridden wxWindow methods
560 // ----------------------------------------------------------------------------
562 bool wxTopLevelWindowGTK::Show( bool show
)
564 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
566 if (show
&& !m_sizeSet
)
568 /* by calling GtkOnSize here, we don't have to call
569 either after showing the frame, which would entail
570 much ugly flicker or from within the size_allocate
571 handler, because GTK 1.1.X forbids that. */
573 GtkOnSize( m_x
, m_y
, m_width
, m_height
);
576 return wxWindow::Show( show
);
579 void wxTopLevelWindowGTK::DoMoveWindow(int WXUNUSED(x
), int WXUNUSED(y
), int WXUNUSED(width
), int WXUNUSED(height
) )
581 wxFAIL_MSG( wxT("DoMoveWindow called for wxTopLevelWindowGTK") );
584 void wxTopLevelWindowGTK::DoSetSize( int x
, int y
, int width
, int height
, int sizeFlags
)
586 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
588 // this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow
589 wxASSERT_MSG( (m_wxwindow
!= NULL
), wxT("invalid frame") );
599 int old_width
= m_width
;
600 int old_height
= m_height
;
602 if ((sizeFlags
& wxSIZE_ALLOW_MINUS_ONE
) == 0)
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
;
618 if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH)
620 if (width == -1) m_width = 80;
623 if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT)
625 if (height == -1) m_height = 26;
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
;
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
;
634 if ((m_x
!= -1) || (m_y
!= -1))
636 if ((m_x
!= old_x
) || (m_y
!= old_y
))
638 gtk_widget_set_uposition( m_widget
, m_x
, m_y
);
642 if ((m_width
!= old_width
) || (m_height
!= old_height
))
644 if (m_widget
->window
)
645 gdk_window_resize( m_widget
->window
, m_width
, m_height
);
647 gtk_window_set_default_size( GTK_WINDOW(m_widget
), m_width
, m_height
);
649 /* we set the size in GtkOnSize, i.e. mostly the actual resizing is
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. */
658 void wxTopLevelWindowGTK::DoGetClientSize( int *width
, int *height
) const
660 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
662 wxWindow::DoGetClientSize( width
, height
);
666 *height
-= m_miniEdge
*2 + m_miniTitle
;
670 *width
-= m_miniEdge
*2;
674 void wxTopLevelWindowGTK::DoSetClientSize( int width
, int height
)
676 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
679 width
+ m_miniEdge
*2, height
+ m_miniEdge
*2 + m_miniTitle
, 0);
682 void wxTopLevelWindowGTK::GtkOnSize( int WXUNUSED(x
), int WXUNUSED(y
),
683 int width
, int height
)
685 // due to a bug in gtk, x,y are always 0
690 if (m_resizing
) return;
693 if ( m_wxwindow
== NULL
) return;
698 /* wxMDIChildFrame derives from wxFrame but it _is_ a wxWindow as it uses
699 wxWindow::Create to create it's GTK equivalent. m_mainWidget is only
700 set in wxFrame::Create so it is used to check what kind of frame we
701 have here. if m_mainWidget is NULL it is a wxMDIChildFrame and so we
702 skip the part which handles m_frameMenuBar, m_frameToolBar and (most
703 importantly) m_mainWidget */
705 if ((m_minWidth
!= -1) && (m_width
< m_minWidth
)) m_width
= m_minWidth
;
706 if ((m_minHeight
!= -1) && (m_height
< m_minHeight
)) m_height
= m_minHeight
;
707 if ((m_maxWidth
!= -1) && (m_width
> m_maxWidth
)) m_width
= m_maxWidth
;
708 if ((m_maxHeight
!= -1) && (m_height
> m_maxHeight
)) m_height
= m_maxHeight
;
713 gint flag
= 0; // GDK_HINT_POS;
714 if ((m_minWidth
!= -1) || (m_minHeight
!= -1)) flag
|= GDK_HINT_MIN_SIZE
;
715 if ((m_maxWidth
!= -1) || (m_maxHeight
!= -1)) flag
|= GDK_HINT_MAX_SIZE
;
717 geom
.min_width
= m_minWidth
;
718 geom
.min_height
= m_minHeight
;
719 geom
.max_width
= m_maxWidth
;
720 geom
.max_height
= m_maxHeight
;
721 gtk_window_set_geometry_hints( GTK_WINDOW(m_widget
),
724 (GdkWindowHints
) flag
);
726 /* I revert back to wxGTK's original behaviour. m_mainWidget holds the
727 * menubar, the toolbar and the client area, which is represented by
729 * this hurts in the eye, but I don't want to call SetSize()
730 * because I don't want to call any non-native functions here. */
732 int client_x
= m_miniEdge
;
733 int client_y
= m_miniEdge
+ m_miniTitle
;
734 int client_w
= m_width
- 2*m_miniEdge
;
735 int client_h
= m_height
- 2*m_miniEdge
- m_miniTitle
;
736 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget
),
738 client_x
, client_y
, client_w
, client_h
);
742 // If there is no m_mainWidget between m_widget and m_wxwindow there
743 // is no need to set the size or position of m_wxwindow.
748 // send size event to frame
749 wxSizeEvent
event( wxSize(m_width
,m_height
), GetId() );
750 event
.SetEventObject( this );
751 GetEventHandler()->ProcessEvent( event
);
756 void wxTopLevelWindowGTK::OnInternalIdle()
758 if (!m_sizeSet
&& GTK_WIDGET_REALIZED(m_wxwindow
))
760 GtkOnSize( m_x
, m_y
, m_width
, m_height
);
762 // we'll come back later
764 wxapp_install_idle_handler();
768 wxWindow::OnInternalIdle();
772 // ----------------------------------------------------------------------------
774 // ----------------------------------------------------------------------------
776 void wxTopLevelWindowGTK::SetTitle( const wxString
&title
)
778 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
781 gtk_window_set_title( GTK_WINDOW(m_widget
), title
.mbc_str() );
784 void wxTopLevelWindowGTK::SetIcon( const wxIcon
&icon
)
786 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
788 wxTopLevelWindowBase::SetIcon(icon
);
793 if (!m_widget
->window
)
796 wxMask
*mask
= icon
.GetMask();
797 GdkBitmap
*bm
= (GdkBitmap
*) NULL
;
798 if (mask
) bm
= mask
->GetBitmap();
800 gdk_window_set_icon( m_widget
->window
, (GdkWindow
*) NULL
, icon
.GetPixmap(), bm
);
803 // ----------------------------------------------------------------------------
804 // frame state: maximized/iconized/normal
805 // ----------------------------------------------------------------------------
807 void wxTopLevelWindowGTK::Maximize(bool WXUNUSED(maximize
))
809 wxFAIL_MSG( _T("not implemented") );
812 bool wxTopLevelWindowGTK::IsMaximized() const
814 // wxFAIL_MSG( _T("not implemented") );
816 // This is an approximation
820 void wxTopLevelWindowGTK::Restore()
822 wxFAIL_MSG( _T("not implemented") );
825 void wxTopLevelWindowGTK::Iconize( bool iconize
)
829 GdkWindow
*window
= m_widget
->window
;
831 // you should do it later, for example from OnCreate() handler
832 wxCHECK_RET( window
, _T("frame not created yet - can't iconize") );
834 XIconifyWindow( GDK_WINDOW_XDISPLAY( window
),
835 GDK_WINDOW_XWINDOW( window
),
836 DefaultScreen( GDK_DISPLAY() ) );
840 bool wxTopLevelWindowGTK::IsIconized() const
845 void wxTopLevelWindowGTK::SetIconizeState(bool iconize
)
847 if ( iconize
!= m_isIconized
)
849 m_isIconized
= iconize
;
850 (void)SendIconizeEvent(iconize
);