X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f819b4a3ab6cd6432e00e936fecc9b34393f38b1..065722d7b13d2dde15f536591f80567c489c561a:/src/gtk/toplevel.cpp diff --git a/src/gtk/toplevel.cpp b/src/gtk/toplevel.cpp index 422f586a9d..dbe2a3a928 100644 --- a/src/gtk/toplevel.cpp +++ b/src/gtk/toplevel.cpp @@ -50,10 +50,6 @@ extern int g_openDialogs; // event tables // ---------------------------------------------------------------------------- -#ifndef __WXUNIVERSAL__ - IMPLEMENT_DYNAMIC_CLASS(wxTopLevelWindow, wxWindow) -#endif - // ---------------------------------------------------------------------------- // data // ---------------------------------------------------------------------------- @@ -145,28 +141,19 @@ static gint gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WX //----------------------------------------------------------------------------- static gint -#if (GTK_MINOR_VERSION > 0) gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *WXUNUSED(event), wxTopLevelWindowGTK *win ) -#else -gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *event, wxTopLevelWindowGTK *win ) -#endif { if (g_isIdle) wxapp_install_idle_handler(); - if (!win->m_hasVMT) + if (!win->m_hasVMT || !win->IsShown()) return FALSE; -#if (GTK_MINOR_VERSION > 0) int x = 0; int y = 0; gdk_window_get_root_origin( win->m_widget->window, &x, &y ); win->m_x = x; win->m_y = y; -#else - win->m_x = event->x; - win->m_y = event->y; -#endif wxMoveEvent mevent( wxPoint(win->m_x,win->m_y), win->GetId() ); mevent.SetEventObject( win ); @@ -179,8 +166,8 @@ gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *ev // "realize" from m_widget //----------------------------------------------------------------------------- -/* we cannot MWM hints and icons before the widget has been realized, - so we do this directly after realization */ +// we cannot MWM hints and icons before the widget has been realized, +// so we do this directly after realization static void gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget), wxTopLevelWindowGTK *win ) @@ -188,20 +175,20 @@ gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget), wxTopLevelWindowGTK * if (g_isIdle) wxapp_install_idle_handler(); - /* All this is for Motif Window Manager "hints" and is supposed to be - recognized by other WM as well. Not tested. */ - gdk_window_set_decorations(win->m_widget->window, + // All this is for Motif Window Manager "hints" and is supposed to be + // recognized by other WM as well. Not tested. + gdk_window_set_decorations(win->m_widget->window, (GdkWMDecoration)win->m_gdkDecor); - gdk_window_set_functions(win->m_widget->window, + gdk_window_set_functions(win->m_widget->window, (GdkWMFunction)win->m_gdkFunc); - /* GTK's shrinking/growing policy */ + // GTK's shrinking/growing policy if ((win->m_gdkFunc & GDK_FUNC_RESIZE) == 0) gtk_window_set_policy(GTK_WINDOW(win->m_widget), 0, 0, 1); else gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1); - /* reset the icon */ + // reset the icon wxIcon iconOld = win->GetIcon(); if ( iconOld != wxNullIcon ) { @@ -210,8 +197,8 @@ gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget), wxTopLevelWindowGTK * win->SetIcon( icon ); } - /* we set the focus to the child that accepts the focus. this - doesn't really have to be done in "realize" but why not? */ + // we set the focus to the child that accepts the focus. this + // doesn't really have to be done in "realize" but why not? wxWindowList::Node *node = win->GetChildren().GetFirst(); while (node) { @@ -258,8 +245,13 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev { GtkPizza *pizza = GTK_PIZZA(widget); - gtk_paint_flat_box (win->m_widget->style, pizza->bin_window, GTK_STATE_NORMAL, - GTK_SHADOW_NONE, &gdk_event->area, win->m_widget, "base", 0, 0, -1, -1); + gtk_paint_flat_box (win->m_widget->style, + pizza->bin_window, GTK_STATE_NORMAL, + GTK_SHADOW_NONE, + &gdk_event->area, + win->m_widget, + (char *)"base", + 0, 0, -1, -1); return TRUE; } @@ -273,8 +265,13 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW { GtkPizza *pizza = GTK_PIZZA(widget); - gtk_paint_flat_box (win->m_widget->style, pizza->bin_window, GTK_STATE_NORMAL, - GTK_SHADOW_NONE, rect, win->m_widget, "base", 0, 0, -1, -1); + gtk_paint_flat_box (win->m_widget->style, + pizza->bin_window, GTK_STATE_NORMAL, + GTK_SHADOW_NONE, + rect, + win->m_widget, + (char *)"base", + 0, 0, -1, -1); } // ---------------------------------------------------------------------------- @@ -296,7 +293,7 @@ static void wxInsertChildInTopLevelWindow( wxTopLevelWindowGTK* parent, wxWindow if (!parent->m_insertInClientArea) { - /* these are outside the client area */ + // these are outside the client area wxTopLevelWindowGTK* frame = (wxTopLevelWindowGTK*) parent; gtk_pizza_put( GTK_PIZZA(frame->m_mainWidget), GTK_WIDGET(child->m_widget), @@ -307,7 +304,7 @@ static void wxInsertChildInTopLevelWindow( wxTopLevelWindowGTK* parent, wxWindow } else { - /* these are inside the client area */ + // these are inside the client area gtk_pizza_put( GTK_PIZZA(parent->m_wxwindow), GTK_WIDGET(child->m_widget), child->m_x, @@ -316,7 +313,7 @@ static void wxInsertChildInTopLevelWindow( wxTopLevelWindowGTK* parent, wxWindow child->m_height ); } - /* resize on OnInternalIdle */ + // resize on OnInternalIdle parent->GtkUpdateSize(); } @@ -361,7 +358,7 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, wxTopLevelWindows.Append( this ); m_needParent = FALSE; - + if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, wxDefaultValidator, name )) { @@ -377,14 +374,24 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, if (style & wxFRAME_TOOL_WINDOW) win_type = GTK_WINDOW_POPUP; - + if (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG) + { + // there is no more GTK_WINDOW_DIALOG in 2.0 +#ifdef __WXGTK20__ + win_type = GTK_WINDOW_TOPLEVEL; +#else win_type = GTK_WINDOW_DIALOG; +#endif + } m_widget = gtk_window_new( win_type ); - if ((m_parent) && (HasFlag(wxFRAME_FLOAT_ON_PARENT)) && (GTK_IS_WINDOW(m_parent->m_widget))) + if (m_parent && (GTK_IS_WINDOW(m_parent->m_widget)) && + (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG)) + { gtk_window_set_transient_for( GTK_WINDOW(m_widget), GTK_WINDOW(m_parent->m_widget) ); + } if (!name.IsEmpty()) gtk_window_set_wmclass( GTK_WINDOW(m_widget), name.mb_str(), name.mb_str() ); @@ -399,13 +406,13 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event", GTK_SIGNAL_FUNC(gtk_frame_delete_callback), (gpointer)this ); - /* m_mainWidget holds the toolbar, the menubar and the client area */ + // m_mainWidget holds the toolbar, the menubar and the client area m_mainWidget = gtk_pizza_new(); gtk_widget_show( m_mainWidget ); GTK_WIDGET_UNSET_FLAGS( m_mainWidget, GTK_CAN_FOCUS ); gtk_container_add( GTK_CONTAINER(m_widget), m_mainWidget ); - /* for m_mainWidget themes */ + // for m_mainWidget themes gtk_signal_connect( GTK_OBJECT(m_mainWidget), "expose_event", GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this ); gtk_signal_connect( GTK_OBJECT(m_mainWidget), "draw", @@ -415,7 +422,7 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, debug_focus_in( m_mainWidget, wxT("wxTopLevelWindowGTK::m_mainWidget"), name ); #endif - /* m_wxwindow only represents the client area without toolbar and menubar */ + // m_wxwindow only represents the client area without toolbar and menubar m_wxwindow = gtk_pizza_new(); gtk_widget_show( m_wxwindow ); gtk_container_add( GTK_CONTAINER(m_mainWidget), m_wxwindow ); @@ -424,13 +431,13 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, debug_focus_in( m_wxwindow, wxT("wxTopLevelWindowGTK::m_wxwindow"), name ); #endif - /* we donm't allow the frame to get the focus as otherwise - the frame will grab it at arbitrary focus changes. */ + // we donm't allow the frame to get the focus as otherwise + // the frame will grab it at arbitrary focus changes GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS ); if (m_parent) m_parent->AddChild( this ); - /* the user resized the frame by dragging etc. */ + // the user resized the frame by dragging etc. gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate", GTK_SIGNAL_FUNC(gtk_frame_size_callback), (gpointer)this ); @@ -438,33 +445,33 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, if ((m_x != -1) || (m_y != -1)) gtk_widget_set_uposition( m_widget, m_x, m_y ); - gtk_widget_set_usize( m_widget, m_width, m_height ); + + gtk_window_set_default_size( GTK_WINDOW(m_widget), m_width, m_height ); - /* we cannot set MWM hints and icons before the widget has - been realized, so we do this directly after realization */ + // we cannot set MWM hints and icons before the widget has + // been realized, so we do this directly after realization gtk_signal_connect( GTK_OBJECT(m_widget), "realize", GTK_SIGNAL_FUNC(gtk_frame_realized_callback), (gpointer) this ); - /* the only way to get the window size is to connect to this event */ + // the only way to get the window size is to connect to this event gtk_signal_connect( GTK_OBJECT(m_widget), "configure_event", GTK_SIGNAL_FUNC(gtk_frame_configure_callback), (gpointer)this ); - /* map and unmap for iconized state */ + // map and unmap for iconized state gtk_signal_connect( GTK_OBJECT(m_widget), "map_event", GTK_SIGNAL_FUNC(gtk_frame_map_callback), (gpointer)this ); gtk_signal_connect( GTK_OBJECT(m_widget), "unmap_event", GTK_SIGNAL_FUNC(gtk_frame_unmap_callback), (gpointer)this ); - /* the only way to get the window size is to connect to this event */ + // the only way to get the window size is to connect to this event gtk_signal_connect( GTK_OBJECT(m_widget), "configure_event", GTK_SIGNAL_FUNC(gtk_frame_configure_callback), (gpointer)this ); - /* disable native tab traversal */ + // disable native tab traversal gtk_signal_connect( GTK_OBJECT(m_widget), "focus", GTK_SIGNAL_FUNC(gtk_frame_focus_callback), (gpointer)this ); - - /* decorations */ + // decorations if ((m_miniEdge > 0) || (style & wxSIMPLE_BORDER) || (style & wxNO_BORDER)) { m_gdkDecor = 0; @@ -474,9 +481,9 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, { m_gdkDecor = (long) GDK_DECOR_BORDER; m_gdkFunc = (long) GDK_FUNC_MOVE; - + // All this is for Motif Window Manager "hints" and is supposed to be - // recognized by other WM as well. Not tested. + // recognized by other WMs as well. if ((style & wxCAPTION) != 0) m_gdkDecor |= GDK_DECOR_TITLE; if ((style & wxSYSTEM_MENU) != 0) @@ -507,6 +514,12 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, wxTopLevelWindowGTK::~wxTopLevelWindowGTK() { m_isBeingDeleted = TRUE; + + // it may also be GtkScrolledWindow in the case of an MDI child + if (GTK_IS_WINDOW(m_widget)) + { + gtk_window_set_focus( GTK_WINDOW(m_widget), NULL ); + } wxTopLevelWindows.DeleteObject( this ); @@ -528,7 +541,8 @@ bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long style ) if (show) { - m_fsSaveStyle = m_windowStyle; + m_fsSaveGdkFunc = m_gdkFunc; + m_fsSaveGdkDecor = m_gdkDecor; m_fsSaveFlag = style; GetPosition( &m_fsSaveFrame.x, &m_fsSaveFrame.y ); GetSize( &m_fsSaveFrame.width, &m_fsSaveFrame.height ); @@ -536,7 +550,8 @@ bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long style ) gtk_widget_hide( m_widget ); gtk_widget_unrealize( m_widget ); - m_windowStyle = wxSIMPLE_BORDER; + m_gdkDecor = (long) GDK_DECOR_BORDER; + m_gdkFunc = (long) GDK_FUNC_MOVE; int x; int y; @@ -551,7 +566,8 @@ bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long style ) gtk_widget_hide( m_widget ); gtk_widget_unrealize( m_widget ); - m_windowStyle = m_fsSaveStyle; + m_gdkFunc = m_fsSaveGdkFunc; + m_gdkDecor = m_fsSaveGdkDecor; SetSize( m_fsSaveFrame.x, m_fsSaveFrame.y, m_fsSaveFrame.width, m_fsSaveFrame.height ); @@ -592,10 +608,10 @@ void wxTopLevelWindowGTK::DoSetSize( int x, int y, int width, int height, int si { wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") ); - /* this shouldn't happen: wxFrameGTK, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow */ + // this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow wxASSERT_MSG( (m_wxwindow != NULL), wxT("invalid frame") ); - /* avoid recursions */ + // avoid recursions if (m_resizing) return; m_resizing = TRUE; @@ -633,10 +649,15 @@ void wxTopLevelWindowGTK::DoSetSize( int x, int y, int width, int height, int si } */ - if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth; - if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight; - if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth; - if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight; + int minWidth = GetMinWidth(), + minHeight = GetMinHeight(), + maxWidth = GetMaxWidth(), + maxHeight = GetMaxHeight(); + + if ((minWidth != -1) && (m_width < minWidth)) m_width = minWidth; + if ((minHeight != -1) && (m_height < minHeight)) m_height = minHeight; + if ((maxWidth != -1) && (m_width > maxWidth)) m_width = maxWidth; + if ((maxHeight != -1) && (m_height > maxHeight)) m_height = maxHeight; if ((m_x != -1) || (m_y != -1)) { @@ -648,7 +669,10 @@ void wxTopLevelWindowGTK::DoSetSize( int x, int y, int width, int height, int si if ((m_width != old_width) || (m_height != old_height)) { - gtk_widget_set_usize( m_widget, m_width, m_height ); + if (m_widget->window) + gdk_window_resize( m_widget->window, m_width, m_height ); + else + gtk_window_set_default_size( GTK_WINDOW(m_widget), m_width, m_height ); /* we set the size in GtkOnSize, i.e. mostly the actual resizing is done either directly before the frame is shown or in idle time @@ -666,7 +690,7 @@ void wxTopLevelWindowGTK::DoGetClientSize( int *width, int *height ) const wxWindow::DoGetClientSize( width, height ); if (height) { - /* mini edge */ + // mini edge *height -= m_miniEdge*2 + m_miniTitle; } if (width) @@ -679,18 +703,18 @@ void wxTopLevelWindowGTK::DoSetClientSize( int width, int height ) { wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") ); - DoSetSize(-1, -1, + DoSetSize(-1, -1, width + m_miniEdge*2, height + m_miniEdge*2 + m_miniTitle, 0); } void wxTopLevelWindowGTK::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), - int width, int height ) + int width, int height ) { // due to a bug in gtk, x,y are always 0 // m_x = x; // m_y = y; - /* avoid recursions */ + // avoid recursions if (m_resizing) return; m_resizing = TRUE; @@ -699,29 +723,34 @@ void wxTopLevelWindowGTK::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), m_width = width; m_height = height; - /* wxMDIChildFrame derives from wxFrameGTK but it _is_ a wxWindow as it uses + /* wxMDIChildFrame derives from wxFrame but it _is_ a wxWindow as it uses wxWindow::Create to create it's GTK equivalent. m_mainWidget is only - set in wxFrameGTK::Create so it is used to check what kind of frame we + set in wxFrame::Create so it is used to check what kind of frame we have here. if m_mainWidget is NULL it is a wxMDIChildFrame and so we skip the part which handles m_frameMenuBar, m_frameToolBar and (most importantly) m_mainWidget */ - if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth; - if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight; - if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth; - if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight; + int minWidth = GetMinWidth(), + minHeight = GetMinHeight(), + maxWidth = GetMaxWidth(), + maxHeight = GetMaxHeight(); + + if ((minWidth != -1) && (m_width < minWidth)) m_width = minWidth; + if ((minHeight != -1) && (m_height < minHeight)) m_height = minHeight; + if ((maxWidth != -1) && (m_width > maxWidth)) m_width = maxWidth; + if ((maxHeight != -1) && (m_height > maxHeight)) m_height = maxHeight; if (m_mainWidget) { - /* set size hints */ + // set size hints gint flag = 0; // GDK_HINT_POS; - if ((m_minWidth != -1) || (m_minHeight != -1)) flag |= GDK_HINT_MIN_SIZE; - if ((m_maxWidth != -1) || (m_maxHeight != -1)) flag |= GDK_HINT_MAX_SIZE; + if ((minWidth != -1) || (minHeight != -1)) flag |= GDK_HINT_MIN_SIZE; + if ((maxWidth != -1) || (maxHeight != -1)) flag |= GDK_HINT_MAX_SIZE; GdkGeometry geom; - geom.min_width = m_minWidth; - geom.min_height = m_minHeight; - geom.max_width = m_maxWidth; - geom.max_height = m_maxHeight; + geom.min_width = minWidth; + geom.min_height = minHeight; + geom.max_width = maxWidth; + geom.max_height = maxHeight; gtk_window_set_geometry_hints( GTK_WINDOW(m_widget), (GtkWidget*) NULL, &geom, @@ -743,8 +772,8 @@ void wxTopLevelWindowGTK::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), } else { - /* if there is no m_mainWidget between m_widget and m_wxwindow there - is no need to set the size or position of m_wxwindow. */ + // If there is no m_mainWidget between m_widget and m_wxwindow there + // is no need to set the size or position of m_wxwindow. } m_sizeSet = TRUE;