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
29 #include "wx/dialog.h"
30 #include "wx/control.h"
32 #include "wx/dcclient.h"
33 #include "wx/gtk/private.h"
39 #include <gdk/gdkkeysyms.h>
42 #include "wx/gtk/win_gtk.h"
44 #include "wx/unix/utilsx11.h"
47 #include <X11/Xatom.h>
49 // ----------------------------------------------------------------------------
51 // ----------------------------------------------------------------------------
53 extern void wxapp_install_idle_handler();
56 // ----------------------------------------------------------------------------
58 // ----------------------------------------------------------------------------
60 extern wxList wxPendingDelete
;
62 extern int g_openDialogs
;
63 extern wxWindowGTK
*g_delayedFocus
;
65 //-----------------------------------------------------------------------------
66 // "focus" from m_window
67 //-----------------------------------------------------------------------------
69 static gint
gtk_frame_focus_callback( GtkWidget
*widget
, GtkDirectionType
WXUNUSED(d
), wxWindow
*WXUNUSED(win
) )
72 wxapp_install_idle_handler();
74 // This disables GTK's tab traversal
75 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "focus" );
79 //-----------------------------------------------------------------------------
81 //-----------------------------------------------------------------------------
83 static void gtk_frame_size_callback( GtkWidget
*WXUNUSED(widget
), GtkAllocation
* alloc
, wxTopLevelWindowGTK
*win
)
86 wxapp_install_idle_handler();
91 if ((win
->m_width
!= alloc
->width
) || (win
->m_height
!= alloc
->height
))
94 wxPrintf( "OnSize from " );
95 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
96 wxPrintf( win->GetClassInfo()->GetClassName() );
97 wxPrintf( " %d %d %d %d\n", (int)alloc->x,
100 (int)alloc->height );
103 win
->m_width
= alloc
->width
;
104 win
->m_height
= alloc
->height
;
105 win
->m_queuedFullRedraw
= TRUE
;
106 win
->GtkUpdateSize();
110 //-----------------------------------------------------------------------------
112 //-----------------------------------------------------------------------------
114 static gint
gtk_frame_delete_callback( GtkWidget
*WXUNUSED(widget
), GdkEvent
*WXUNUSED(event
), wxTopLevelWindowGTK
*win
)
117 wxapp_install_idle_handler();
119 if (win
->IsEnabled() &&
120 (g_openDialogs
== 0 || (win
->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG
) ||
128 //-----------------------------------------------------------------------------
130 //-----------------------------------------------------------------------------
133 gtk_frame_configure_callback( GtkWidget
*WXUNUSED(widget
), GdkEventConfigure
*WXUNUSED(event
), wxTopLevelWindowGTK
*win
)
136 wxapp_install_idle_handler();
138 if (!win
->m_hasVMT
|| !win
->IsShown())
143 gdk_window_get_root_origin( win
->m_widget
->window
, &x
, &y
);
147 wxMoveEvent
mevent( wxPoint(win
->m_x
,win
->m_y
), win
->GetId() );
148 mevent
.SetEventObject( win
);
149 win
->GetEventHandler()->ProcessEvent( mevent
);
154 //-----------------------------------------------------------------------------
155 // "realize" from m_widget
156 //-----------------------------------------------------------------------------
158 // we cannot MWM hints and icons before the widget has been realized,
159 // so we do this directly after realization
162 gtk_frame_realized_callback( GtkWidget
* WXUNUSED(widget
),
163 wxTopLevelWindowGTK
*win
)
166 wxapp_install_idle_handler();
168 // All this is for Motif Window Manager "hints" and is supposed to be
169 // recognized by other WM as well. Not tested.
170 gdk_window_set_decorations(win
->m_widget
->window
,
171 (GdkWMDecoration
)win
->m_gdkDecor
);
172 gdk_window_set_functions(win
->m_widget
->window
,
173 (GdkWMFunction
)win
->m_gdkFunc
);
175 // GTK's shrinking/growing policy
176 if ((win
->m_gdkFunc
& GDK_FUNC_RESIZE
) == 0)
177 gtk_window_set_policy(GTK_WINDOW(win
->m_widget
), 0, 0, 1);
179 gtk_window_set_policy(GTK_WINDOW(win
->m_widget
), 1, 1, 1);
182 wxIconBundle iconsOld
= win
->GetIcons();
183 if ( iconsOld
.GetIcon(-1).Ok() )
185 win
->SetIcon( wxNullIcon
);
186 win
->SetIcons( iconsOld
);
190 //-----------------------------------------------------------------------------
191 // "map_event" from m_widget
192 //-----------------------------------------------------------------------------
195 gtk_frame_map_callback( GtkWidget
* WXUNUSED(widget
),
196 GdkEvent
* WXUNUSED(event
),
197 wxTopLevelWindow
*win
)
199 win
->SetIconizeState(FALSE
);
202 //-----------------------------------------------------------------------------
203 // "unmap_event" from m_widget
204 //-----------------------------------------------------------------------------
207 gtk_frame_unmap_callback( GtkWidget
* WXUNUSED(widget
),
208 GdkEvent
* WXUNUSED(event
),
209 wxTopLevelWindow
*win
)
211 win
->SetIconizeState(TRUE
);
214 //-----------------------------------------------------------------------------
215 // "expose_event" of m_client
216 //-----------------------------------------------------------------------------
218 static int gtk_window_expose_callback( GtkWidget
*widget
, GdkEventExpose
*gdk_event
, wxWindow
*win
)
220 GtkPizza
*pizza
= GTK_PIZZA(widget
);
222 gtk_paint_flat_box (win
->m_widget
->style
,
223 pizza
->bin_window
, GTK_STATE_NORMAL
,
233 //-----------------------------------------------------------------------------
234 // "draw" of m_client
235 //-----------------------------------------------------------------------------
239 static void gtk_window_draw_callback( GtkWidget
*widget
, GdkRectangle
*rect
, wxWindow
*win
)
241 GtkPizza
*pizza
= GTK_PIZZA(widget
);
243 gtk_paint_flat_box (win
->m_widget
->style
,
244 pizza
->bin_window
, GTK_STATE_NORMAL
,
254 // ----------------------------------------------------------------------------
255 // wxTopLevelWindowGTK itself
256 // ----------------------------------------------------------------------------
258 //-----------------------------------------------------------------------------
259 // InsertChild for wxTopLevelWindowGTK
260 //-----------------------------------------------------------------------------
262 /* Callback for wxTopLevelWindowGTK. This very strange beast has to be used because
263 * C++ has no virtual methods in a constructor. We have to emulate a
264 * virtual function here as wxWindows requires different ways to insert
265 * a child in container classes. */
267 static void wxInsertChildInTopLevelWindow( wxTopLevelWindowGTK
* parent
, wxWindow
* child
)
269 wxASSERT( GTK_IS_WIDGET(child
->m_widget
) );
271 if (!parent
->m_insertInClientArea
)
273 // these are outside the client area
274 wxTopLevelWindowGTK
* frame
= (wxTopLevelWindowGTK
*) parent
;
275 gtk_pizza_put( GTK_PIZZA(frame
->m_mainWidget
),
276 GTK_WIDGET(child
->m_widget
),
284 // these are inside the client area
285 gtk_pizza_put( GTK_PIZZA(parent
->m_wxwindow
),
286 GTK_WIDGET(child
->m_widget
),
293 // resize on OnInternalIdle
294 parent
->GtkUpdateSize();
297 // ----------------------------------------------------------------------------
298 // wxTopLevelWindowGTK creation
299 // ----------------------------------------------------------------------------
301 void wxTopLevelWindowGTK::Init()
306 m_mainWidget
= (GtkWidget
*) NULL
;
307 m_insertInClientArea
= TRUE
;
308 m_isIconized
= FALSE
;
309 m_fsIsShowing
= FALSE
;
310 m_themeEnabled
= TRUE
;
311 m_gdkDecor
= m_gdkFunc
= 0;
315 bool wxTopLevelWindowGTK::Create( wxWindow
*parent
,
317 const wxString
& title
,
319 const wxSize
& sizeOrig
,
321 const wxString
&name
)
323 // always create a frame of some reasonable, even if arbitrary, size (at
324 // least for MSW compatibility)
325 wxSize size
= sizeOrig
;
326 if ( size
.x
== -1 || size
.y
== -1 )
328 wxSize sizeDpy
= wxGetDisplaySize();
330 size
.x
= sizeDpy
.x
/ 3;
332 size
.y
= sizeDpy
.y
/ 5;
335 wxTopLevelWindows
.Append( this );
337 m_needParent
= FALSE
;
339 if (!PreCreation( parent
, pos
, size
) ||
340 !CreateBase( parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
))
342 wxFAIL_MSG( wxT("wxTopLevelWindowGTK creation failed") );
348 m_insertCallback
= (wxInsertChildFunction
) wxInsertChildInTopLevelWindow
;
350 GtkWindowType win_type
= GTK_WINDOW_TOPLEVEL
;
352 if (style
& wxFRAME_TOOL_WINDOW
)
353 win_type
= GTK_WINDOW_POPUP
;
355 if (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG
)
357 // there is no more GTK_WINDOW_DIALOG in 2.0
359 win_type
= GTK_WINDOW_TOPLEVEL
;
361 win_type
= GTK_WINDOW_DIALOG
;
365 m_widget
= gtk_window_new( win_type
);
367 if (m_parent
&& (((GTK_IS_WINDOW(m_parent
->m_widget
)) &&
368 (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG
)) ||
369 (style
& wxFRAME_FLOAT_ON_PARENT
)))
371 gtk_window_set_transient_for( GTK_WINDOW(m_widget
), GTK_WINDOW(m_parent
->m_widget
) );
375 gtk_window_set_wmclass( GTK_WINDOW(m_widget
), wxGTK_CONV( name
), wxGTK_CONV( name
) );
377 gtk_window_set_title( GTK_WINDOW(m_widget
), wxGTK_CONV( title
) );
378 GTK_WIDGET_UNSET_FLAGS( m_widget
, GTK_CAN_FOCUS
);
380 gtk_signal_connect( GTK_OBJECT(m_widget
), "delete_event",
381 GTK_SIGNAL_FUNC(gtk_frame_delete_callback
), (gpointer
)this );
383 // m_mainWidget holds the toolbar, the menubar and the client area
384 m_mainWidget
= gtk_pizza_new();
385 gtk_widget_show( m_mainWidget
);
386 GTK_WIDGET_UNSET_FLAGS( m_mainWidget
, GTK_CAN_FOCUS
);
387 gtk_container_add( GTK_CONTAINER(m_widget
), m_mainWidget
);
389 if (m_miniEdge
== 0) // wxMiniFrame has its own version.
391 // For m_mainWidget themes
392 gtk_signal_connect( GTK_OBJECT(m_mainWidget
), "expose_event",
393 GTK_SIGNAL_FUNC(gtk_window_expose_callback
), (gpointer
)this );
395 gtk_signal_connect( GTK_OBJECT(m_mainWidget
), "draw",
396 GTK_SIGNAL_FUNC(gtk_window_draw_callback
), (gpointer
)this );
400 // m_wxwindow only represents the client area without toolbar and menubar
401 m_wxwindow
= gtk_pizza_new();
402 gtk_widget_show( m_wxwindow
);
403 gtk_container_add( GTK_CONTAINER(m_mainWidget
), m_wxwindow
);
405 // we donm't allow the frame to get the focus as otherwise
406 // the frame will grab it at arbitrary focus changes
407 GTK_WIDGET_UNSET_FLAGS( m_wxwindow
, GTK_CAN_FOCUS
);
409 if (m_parent
) m_parent
->AddChild( this );
411 // the user resized the frame by dragging etc.
412 gtk_signal_connect( GTK_OBJECT(m_widget
), "size_allocate",
413 GTK_SIGNAL_FUNC(gtk_frame_size_callback
), (gpointer
)this );
417 if ((m_x
!= -1) || (m_y
!= -1))
418 gtk_widget_set_uposition( m_widget
, m_x
, m_y
);
420 gtk_window_set_default_size( GTK_WINDOW(m_widget
), m_width
, m_height
);
422 // we cannot set MWM hints and icons before the widget has
423 // been realized, so we do this directly after realization
424 gtk_signal_connect( GTK_OBJECT(m_widget
), "realize",
425 GTK_SIGNAL_FUNC(gtk_frame_realized_callback
), (gpointer
) this );
427 // the only way to get the window size is to connect to this event
428 gtk_signal_connect( GTK_OBJECT(m_widget
), "configure_event",
429 GTK_SIGNAL_FUNC(gtk_frame_configure_callback
), (gpointer
)this );
431 // map and unmap for iconized state
432 gtk_signal_connect( GTK_OBJECT(m_widget
), "map_event",
433 GTK_SIGNAL_FUNC(gtk_frame_map_callback
), (gpointer
)this );
434 gtk_signal_connect( GTK_OBJECT(m_widget
), "unmap_event",
435 GTK_SIGNAL_FUNC(gtk_frame_unmap_callback
), (gpointer
)this );
437 // the only way to get the window size is to connect to this event
438 gtk_signal_connect( GTK_OBJECT(m_widget
), "configure_event",
439 GTK_SIGNAL_FUNC(gtk_frame_configure_callback
), (gpointer
)this );
441 // disable native tab traversal
442 gtk_signal_connect( GTK_OBJECT(m_widget
), "focus",
443 GTK_SIGNAL_FUNC(gtk_frame_focus_callback
), (gpointer
)this );
446 if ((m_miniEdge
> 0) || (style
& wxSIMPLE_BORDER
) || (style
& wxNO_BORDER
))
453 m_gdkDecor
= (long) GDK_DECOR_BORDER
;
454 m_gdkFunc
= (long) GDK_FUNC_MOVE
;
456 // All this is for Motif Window Manager "hints" and is supposed to be
457 // recognized by other WMs as well.
458 if ((style
& wxCAPTION
) != 0)
459 m_gdkDecor
|= GDK_DECOR_TITLE
;
460 if ((style
& wxSYSTEM_MENU
) != 0)
462 m_gdkFunc
|= GDK_FUNC_CLOSE
;
463 m_gdkDecor
|= GDK_DECOR_MENU
;
465 if ((style
& wxMINIMIZE_BOX
) != 0)
467 m_gdkFunc
|= GDK_FUNC_MINIMIZE
;
468 m_gdkDecor
|= GDK_DECOR_MINIMIZE
;
470 if ((style
& wxMAXIMIZE_BOX
) != 0)
472 m_gdkFunc
|= GDK_FUNC_MAXIMIZE
;
473 m_gdkDecor
|= GDK_DECOR_MAXIMIZE
;
475 if ((style
& wxRESIZE_BORDER
) != 0)
477 m_gdkFunc
|= GDK_FUNC_RESIZE
;
478 m_gdkDecor
|= GDK_DECOR_RESIZEH
;
485 wxTopLevelWindowGTK::~wxTopLevelWindowGTK()
489 wxASSERT_MSG( FALSE
, _T("Window still grabbed"));
493 m_isBeingDeleted
= TRUE
;
495 // it may also be GtkScrolledWindow in the case of an MDI child
496 if (GTK_IS_WINDOW(m_widget
))
498 gtk_window_set_focus( GTK_WINDOW(m_widget
), NULL
);
504 bool wxTopLevelWindowGTK::ShowFullScreen(bool show
, long style
)
506 if (show
== m_fsIsShowing
) return FALSE
; // return what?
508 m_fsIsShowing
= show
;
510 GdkWindow
*window
= m_widget
->window
;
511 wxX11FullScreenMethod method
=
512 wxGetFullScreenMethodX11((WXDisplay
*)GDK_DISPLAY(),
513 (WXWindow
)GDK_ROOT_WINDOW());
517 m_fsSaveFlag
= style
;
518 GetPosition( &m_fsSaveFrame
.x
, &m_fsSaveFrame
.y
);
519 GetSize( &m_fsSaveFrame
.width
, &m_fsSaveFrame
.height
);
521 int screen_width
,screen_height
;
522 wxDisplaySize( &screen_width
, &screen_height
);
524 gint client_x
, client_y
, root_x
, root_y
;
527 if (method
== wxX11_FS_GENERIC
)
529 // don't do it always, Metacity hates it
530 m_fsSaveGdkFunc
= m_gdkFunc
;
531 m_fsSaveGdkDecor
= m_gdkDecor
;
532 m_gdkFunc
= m_gdkDecor
= 0;
533 gdk_window_set_decorations(window
, (GdkWMDecoration
)0);
534 gdk_window_set_functions(window
, (GdkWMFunction
)0);
537 gdk_window_get_origin (m_widget
->window
, &root_x
, &root_y
);
538 gdk_window_get_geometry (m_widget
->window
, &client_x
, &client_y
,
539 &width
, &height
, NULL
);
541 gdk_window_move_resize (m_widget
->window
, -client_x
, -client_y
,
542 screen_width
+ 1, screen_height
+ 1);
544 wxSetFullScreenStateX11((WXDisplay
*)GDK_DISPLAY(),
545 (WXWindow
)GDK_ROOT_WINDOW(),
546 (WXWindow
)GDK_WINDOW_XWINDOW(window
),
547 show
, &m_fsSaveFrame
, method
);
551 if (method
== wxX11_FS_GENERIC
)
553 // don't do it always, Metacity hates it
554 m_gdkFunc
= m_fsSaveGdkFunc
;
555 m_gdkDecor
= m_fsSaveGdkDecor
;
556 gdk_window_set_decorations(window
, (GdkWMDecoration
)m_gdkDecor
);
557 gdk_window_set_functions(window
, (GdkWMFunction
)m_gdkFunc
);
560 wxSetFullScreenStateX11((WXDisplay
*)GDK_DISPLAY(),
561 (WXWindow
)GDK_ROOT_WINDOW(),
562 (WXWindow
)GDK_WINDOW_XWINDOW(window
),
563 show
, &m_fsSaveFrame
, method
);
565 SetSize(m_fsSaveFrame
.x
, m_fsSaveFrame
.y
,
566 m_fsSaveFrame
.width
, m_fsSaveFrame
.height
);
573 // ----------------------------------------------------------------------------
574 // overridden wxWindow methods
575 // ----------------------------------------------------------------------------
577 bool wxTopLevelWindowGTK::Show( bool show
)
579 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
581 if (show
&& !m_sizeSet
)
583 /* by calling GtkOnSize here, we don't have to call
584 either after showing the frame, which would entail
585 much ugly flicker or from within the size_allocate
586 handler, because GTK 1.1.X forbids that. */
588 GtkOnSize( m_x
, m_y
, m_width
, m_height
);
591 return wxWindow::Show( show
);
594 void wxTopLevelWindowGTK::DoMoveWindow(int WXUNUSED(x
), int WXUNUSED(y
), int WXUNUSED(width
), int WXUNUSED(height
) )
596 wxFAIL_MSG( wxT("DoMoveWindow called for wxTopLevelWindowGTK") );
599 void wxTopLevelWindowGTK::DoSetSize( int x
, int y
, int width
, int height
, int sizeFlags
)
601 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
603 // this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow
604 wxASSERT_MSG( (m_wxwindow
!= NULL
), wxT("invalid frame") );
614 int old_width
= m_width
;
615 int old_height
= m_height
;
617 if ((sizeFlags
& wxSIZE_ALLOW_MINUS_ONE
) == 0)
619 if (x
!= -1) m_x
= x
;
620 if (y
!= -1) m_y
= y
;
627 if (width
!= -1) m_width
= width
;
628 if (height
!= -1) m_height
= height
;
631 if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH)
633 if (width == -1) m_width = 80;
636 if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT)
638 if (height == -1) m_height = 26;
642 int minWidth
= GetMinWidth(),
643 minHeight
= GetMinHeight(),
644 maxWidth
= GetMaxWidth(),
645 maxHeight
= GetMaxHeight();
647 if ((minWidth
!= -1) && (m_width
< minWidth
)) m_width
= minWidth
;
648 if ((minHeight
!= -1) && (m_height
< minHeight
)) m_height
= minHeight
;
649 if ((maxWidth
!= -1) && (m_width
> maxWidth
)) m_width
= maxWidth
;
650 if ((maxHeight
!= -1) && (m_height
> maxHeight
)) m_height
= maxHeight
;
652 if ((m_x
!= -1) || (m_y
!= -1))
654 if ((m_x
!= old_x
) || (m_y
!= old_y
))
656 gtk_widget_set_uposition( m_widget
, m_x
, m_y
);
660 if ((m_width
!= old_width
) || (m_height
!= old_height
))
662 if (m_widget
->window
)
663 gdk_window_resize( m_widget
->window
, m_width
, m_height
);
665 gtk_window_set_default_size( GTK_WINDOW(m_widget
), m_width
, m_height
);
667 /* we set the size in GtkOnSize, i.e. mostly the actual resizing is
668 done either directly before the frame is shown or in idle time
669 so that different calls to SetSize() don't lead to flicker. */
676 void wxTopLevelWindowGTK::DoGetClientSize( int *width
, int *height
) const
678 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
680 wxWindow::DoGetClientSize( width
, height
);
684 *height
-= m_miniEdge
*2 + m_miniTitle
;
688 *width
-= m_miniEdge
*2;
692 void wxTopLevelWindowGTK::DoSetClientSize( int width
, int height
)
694 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
697 width
+ m_miniEdge
*2, height
+ m_miniEdge
*2 + m_miniTitle
, 0);
700 void wxTopLevelWindowGTK::GtkOnSize( int WXUNUSED(x
), int WXUNUSED(y
),
701 int width
, int height
)
703 // due to a bug in gtk, x,y are always 0
708 if (m_resizing
) return;
711 if ( m_wxwindow
== NULL
) return;
716 /* wxMDIChildFrame derives from wxFrame but it _is_ a wxWindow as it uses
717 wxWindow::Create to create it's GTK equivalent. m_mainWidget is only
718 set in wxFrame::Create so it is used to check what kind of frame we
719 have here. if m_mainWidget is NULL it is a wxMDIChildFrame and so we
720 skip the part which handles m_frameMenuBar, m_frameToolBar and (most
721 importantly) m_mainWidget */
723 int minWidth
= GetMinWidth(),
724 minHeight
= GetMinHeight(),
725 maxWidth
= GetMaxWidth(),
726 maxHeight
= GetMaxHeight();
728 if ((minWidth
!= -1) && (m_width
< minWidth
)) m_width
= minWidth
;
729 if ((minHeight
!= -1) && (m_height
< minHeight
)) m_height
= minHeight
;
730 if ((maxWidth
!= -1) && (m_width
> maxWidth
)) m_width
= maxWidth
;
731 if ((maxHeight
!= -1) && (m_height
> maxHeight
)) m_height
= maxHeight
;
736 gint flag
= 0; // GDK_HINT_POS;
739 if ((minWidth
!= -1) || (minHeight
!= -1)) flag
|= GDK_HINT_MIN_SIZE
;
740 if ((maxWidth
!= -1) || (maxHeight
!= -1)) flag
|= GDK_HINT_MAX_SIZE
;
742 geom
.min_width
= minWidth
;
743 geom
.min_height
= minHeight
;
745 // Because of the way we set GDK_HINT_MAX_SIZE above, if either of
746 // maxHeight or maxWidth is set, we must set them both, else the
747 // remaining -1 will be taken literally.
749 // I'm certain this also happens elsewhere, and is the probable
750 // cause of other such things as:
751 // Gtk-WARNING **: gtk_widget_size_allocate():
752 // attempt to allocate widget with width 65535 and height 600
753 // but I don't have time to track them all now..
755 // Really we need to encapulate all this height/width business and
756 // stop any old method from ripping at the members directly and
757 // scattering -1's without regard for who might resolve them later.
759 geom
.max_width
= ( maxHeight
== -1 ) ? maxWidth
760 : ( maxWidth
== -1 ) ? wxGetDisplaySize().GetWidth()
763 geom
.max_height
= ( maxWidth
== -1 ) ? maxHeight
// ( == -1 here )
764 : ( maxHeight
== -1 ) ? wxGetDisplaySize().GetHeight()
767 gtk_window_set_geometry_hints( GTK_WINDOW(m_widget
),
770 (GdkWindowHints
) flag
);
772 /* I revert back to wxGTK's original behaviour. m_mainWidget holds the
773 * menubar, the toolbar and the client area, which is represented by
775 * this hurts in the eye, but I don't want to call SetSize()
776 * because I don't want to call any non-native functions here. */
778 int client_x
= m_miniEdge
;
779 int client_y
= m_miniEdge
+ m_miniTitle
;
780 int client_w
= m_width
- 2*m_miniEdge
;
781 int client_h
= m_height
- 2*m_miniEdge
- m_miniTitle
;
783 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget
),
785 client_x
, client_y
, client_w
, client_h
);
789 // If there is no m_mainWidget between m_widget and m_wxwindow there
790 // is no need to set the size or position of m_wxwindow.
795 // send size event to frame
796 wxSizeEvent
event( wxSize(m_width
,m_height
), GetId() );
797 event
.SetEventObject( this );
798 GetEventHandler()->ProcessEvent( event
);
803 void wxTopLevelWindowGTK::OnInternalIdle()
805 if (!m_sizeSet
&& GTK_WIDGET_REALIZED(m_wxwindow
))
807 GtkOnSize( m_x
, m_y
, m_width
, m_height
);
809 // we'll come back later
811 wxapp_install_idle_handler();
815 // set the focus if not done yet and if we can already do it
816 if ( GTK_WIDGET_REALIZED(m_wxwindow
) )
818 if ( g_delayedFocus
&&
819 wxGetTopLevelParent((wxWindow
*)g_delayedFocus
) == this )
821 wxLogTrace(_T("focus"),
822 _T("Setting focus from wxTLW::OnIdle() to %s(%s)"),
823 g_delayedFocus
->GetClassInfo()->GetClassName(),
824 g_delayedFocus
->GetLabel().c_str());
826 g_delayedFocus
->SetFocus();
827 g_delayedFocus
= NULL
;
831 wxWindow::OnInternalIdle();
834 // ----------------------------------------------------------------------------
836 // ----------------------------------------------------------------------------
838 void wxTopLevelWindowGTK::SetTitle( const wxString
&title
)
840 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
843 gtk_window_set_title( GTK_WINDOW(m_widget
), wxGTK_CONV( title
) );
846 void wxTopLevelWindowGTK::DoSetIcon( const wxIcon
&icon
)
851 if (!m_widget
->window
)
854 wxMask
*mask
= icon
.GetMask();
855 GdkBitmap
*bm
= (GdkBitmap
*) NULL
;
856 if (mask
) bm
= mask
->GetBitmap();
858 gdk_window_set_icon( m_widget
->window
, (GdkWindow
*) NULL
, icon
.GetPixmap(), bm
);
861 void wxTopLevelWindowGTK::SetIcon( const wxIcon
&icon
)
863 SetIcons( wxIconBundle( icon
) );
866 void wxTopLevelWindowGTK::SetIcons( const wxIconBundle
&icons
)
868 wxASSERT_MSG( (m_widget
!= NULL
), wxT("invalid frame") );
869 GdkWindow
* window
= m_widget
->window
;
871 wxTopLevelWindowBase::SetIcons( icons
);
873 DoSetIcon( icons
.GetIcon( -1 ) );
876 wxSetIconsX11( (WXDisplay
*)GDK_WINDOW_XDISPLAY( window
),
877 (WXWindow
)GDK_WINDOW_XWINDOW( window
), icons
);
881 // ----------------------------------------------------------------------------
882 // frame state: maximized/iconized/normal
883 // ----------------------------------------------------------------------------
885 void wxTopLevelWindowGTK::Maximize(bool maximize
)
889 gtk_window_maximize( GTK_WINDOW( m_widget
) );
891 gtk_window_unmaximize( GTK_WINDOW( m_widget
) );
893 wxFAIL_MSG( _T("not implemented") );
897 bool wxTopLevelWindowGTK::IsMaximized() const
899 // wxFAIL_MSG( _T("not implemented") );
901 // This is an approximation
905 void wxTopLevelWindowGTK::Restore()
908 // "Present" seems similar enough to "restore"
909 gtk_window_present( GTK_WINDOW( m_widget
) );
911 wxFAIL_MSG( _T("not implemented") );
915 void wxTopLevelWindowGTK::Iconize( bool iconize
)
919 gtk_window_iconify( GTK_WINDOW( m_widget
) );
921 gtk_window_deiconify( GTK_WINDOW( m_widget
) );
925 GdkWindow
*window
= m_widget
->window
;
927 // you should do it later, for example from OnCreate() handler
928 wxCHECK_RET( window
, _T("frame not created yet - can't iconize") );
930 XIconifyWindow( GDK_WINDOW_XDISPLAY( window
),
931 GDK_WINDOW_XWINDOW( window
),
932 DefaultScreen( GDK_DISPLAY() ) );
937 bool wxTopLevelWindowGTK::IsIconized() const
942 void wxTopLevelWindowGTK::SetIconizeState(bool iconize
)
944 if ( iconize
!= m_isIconized
)
946 m_isIconized
= iconize
;
947 (void)SendIconizeEvent(iconize
);
951 void wxTopLevelWindowGTK::AddGrab()
956 gtk_grab_add( m_widget
);
958 gtk_grab_remove( m_widget
);
962 void wxTopLevelWindowGTK::RemoveGrab()