X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9467bdb7f5bfde9f99331097daacb93564ca122e..64ea838d8f4d1853b7d850db93ee565e901d099a:/src/univ/topluniv.cpp?ds=sidebyside diff --git a/src/univ/topluniv.cpp b/src/univ/topluniv.cpp index 3d0f437c5b..f6dbfa3c49 100644 --- a/src/univ/topluniv.cpp +++ b/src/univ/topluniv.cpp @@ -80,6 +80,15 @@ int wxTopLevelWindow::ms_canIconize = -1; void wxTopLevelWindow::Init() { + // once-only ms_drawDecorations initialization + if ( ms_drawDecorations == -1 ) + { + ms_drawDecorations = + !wxSystemSettings::HasFeature(wxSYS_CAN_DRAW_FRAME_DECORATIONS) || + wxGetEnv(wxT("WXDECOR"), NULL); + } + + m_usingNativeDecorations = ms_drawDecorations == 0; m_isActive = false; m_windowStyle = 0; m_pressedButton = 0; @@ -97,30 +106,15 @@ bool wxTopLevelWindow::Create(wxWindow *parent, long styleOrig = 0, exstyleOrig = 0; - if ( ms_drawDecorations == -1 ) - { - ms_drawDecorations = - !wxSystemSettings::HasFeature(wxSYS_CAN_DRAW_FRAME_DECORATIONS) - || wxGetEnv(wxT("WXDECOR"), NULL); - // FIXME -- wxUniv should provide a way to force non-native decorations! - // $WXDECOR is just a hack in absence of better wxUniv solution - } - - if ( ms_canIconize == -1 ) - { - ms_canIconize = wxSystemSettings::HasFeature(wxSYS_CAN_ICONIZE_FRAME); - } - - if ( ms_drawDecorations ) + if ( !m_usingNativeDecorations ) { CreateInputHandler(wxINP_HANDLER_TOPLEVEL); styleOrig = style; exstyleOrig = GetExtraStyle(); style &= ~(wxCAPTION | wxMINIMIZE_BOX | wxMAXIMIZE_BOX | - wxSYSTEM_MENU | wxRESIZE_BORDER | wxFRAME_TOOL_WINDOW | - wxRESIZE_BORDER); - style |= wxSIMPLE_BORDER; + wxSYSTEM_MENU | wxFRAME_TOOL_WINDOW | wxRESIZE_BORDER); + style |= wxBORDER_NONE; SetExtraStyle(exstyleOrig & ~wxWS_EX_CONTEXTHELP); } @@ -128,7 +122,7 @@ bool wxTopLevelWindow::Create(wxWindow *parent, size, style, name) ) return false; - if ( ms_drawDecorations ) + if ( !m_usingNativeDecorations ) { m_windowStyle = styleOrig; m_exStyle = exstyleOrig; @@ -141,7 +135,7 @@ bool wxTopLevelWindow::ShowFullScreen(bool show, long style) { if ( show == IsFullScreen() ) return false; - if ( ms_drawDecorations ) + if ( !m_usingNativeDecorations ) { if ( show ) { @@ -160,13 +154,38 @@ bool wxTopLevelWindow::ShowFullScreen(bool show, long style) return wxTopLevelWindowNative::ShowFullScreen(show, style); } +/* static */ +void wxTopLevelWindow::UseNativeDecorationsByDefault(bool native) +{ + ms_drawDecorations = !native; +} + +void wxTopLevelWindow::UseNativeDecorations(bool native) +{ + wxASSERT_MSG( !m_windowStyle, wxT("must be called before Create()") ); + + m_usingNativeDecorations = native; +} + +bool wxTopLevelWindow::IsUsingNativeDecorations() const +{ + return m_usingNativeDecorations; +} + long wxTopLevelWindow::GetDecorationsStyle() const { long style = 0; if ( m_windowStyle & wxCAPTION ) { - style |= wxTOPLEVEL_TITLEBAR | wxTOPLEVEL_BUTTON_CLOSE; + if ( ms_canIconize == -1 ) + { + ms_canIconize = wxSystemSettings::HasFeature(wxSYS_CAN_ICONIZE_FRAME); + } + + style |= wxTOPLEVEL_TITLEBAR; + if ( m_windowStyle & wxCLOSE_BOX ) + style |= wxTOPLEVEL_BUTTON_CLOSE; if ( (m_windowStyle & wxMINIMIZE_BOX) && ms_canIconize ) style |= wxTOPLEVEL_BUTTON_ICONIZE; if ( m_windowStyle & wxMAXIMIZE_BOX ) @@ -183,12 +202,12 @@ long wxTopLevelWindow::GetDecorationsStyle() const } if ( (m_windowStyle & (wxSIMPLE_BORDER | wxNO_BORDER)) == 0 ) style |= wxTOPLEVEL_BORDER; - if ( m_windowStyle & (wxRESIZE_BORDER | wxRESIZE_BORDER) ) + if ( m_windowStyle & wxRESIZE_BORDER ) style |= wxTOPLEVEL_RESIZEABLE; if ( IsMaximized() ) style |= wxTOPLEVEL_MAXIMIZED; - if ( GetIcon().Ok() ) + if ( GetIcon().IsOk() ) style |= wxTOPLEVEL_ICON; if ( m_isActive ) style |= wxTOPLEVEL_ACTIVE; @@ -209,7 +228,7 @@ void wxTopLevelWindow::RefreshTitleBar() wxPoint wxTopLevelWindow::GetClientAreaOrigin() const { - if ( ms_drawDecorations ) + if ( !m_usingNativeDecorations ) { int w, h; wxTopLevelWindowNative::DoGetClientSize(&w, &h); @@ -227,7 +246,7 @@ wxPoint wxTopLevelWindow::GetClientAreaOrigin() const void wxTopLevelWindow::DoGetClientSize(int *width, int *height) const { - if ( ms_drawDecorations ) + if ( !m_usingNativeDecorations ) { int w, h; wxTopLevelWindowNative::DoGetClientSize(&w, &h); @@ -246,7 +265,7 @@ void wxTopLevelWindow::DoGetClientSize(int *width, int *height) const void wxTopLevelWindow::DoSetClientSize(int width, int height) { - if ( ms_drawDecorations ) + if ( !m_usingNativeDecorations ) { wxSize size = m_renderer->GetFrameTotalSize(wxSize(width, height), GetDecorationsStyle()); @@ -258,9 +277,11 @@ void wxTopLevelWindow::DoSetClientSize(int width, int height) void wxTopLevelWindow::OnNcPaint(wxNcPaintEvent& event) { - if ( !ms_drawDecorations || !m_renderer ) + if ( m_usingNativeDecorations || !m_renderer ) + { event.Skip(); - else + } + else // we're drawing the decorations ourselves { // get the window rect wxRect rect(GetSize()); @@ -283,26 +304,15 @@ long wxTopLevelWindow::HitTest(const wxPoint& pt) const return m_renderer->HitTestFrame(rect, pt+GetClientAreaOrigin(), GetDecorationsStyle()); } -int wxTopLevelWindow::GetMinWidth() const +wxSize wxTopLevelWindow::GetMinSize() const { - if ( ms_drawDecorations ) + wxSize size = wxTopLevelWindowNative::GetMinSize(); + if ( !m_usingNativeDecorations ) { - return wxMax(wxTopLevelWindowNative::GetMinWidth(), - m_renderer->GetFrameMinSize(GetDecorationsStyle()).x); + size.IncTo(m_renderer->GetFrameMinSize(GetDecorationsStyle())); } - else - return wxTopLevelWindowNative::GetMinWidth(); -} -int wxTopLevelWindow::GetMinHeight() const -{ - if ( ms_drawDecorations ) - { - return wxMax(wxTopLevelWindowNative::GetMinHeight(), - m_renderer->GetFrameMinSize(GetDecorationsStyle()).y); - } - else - return wxTopLevelWindowNative::GetMinHeight(); + return size; } // ---------------------------------------------------------------------------- @@ -313,18 +323,18 @@ void wxTopLevelWindow::SetIcons(const wxIconBundle& icons) { wxTopLevelWindowNative::SetIcons(icons); - if ( ms_drawDecorations && m_renderer ) + if ( !m_usingNativeDecorations && m_renderer ) { wxSize size = m_renderer->GetFrameIconSize(); const wxIcon& icon = icons.GetIcon( size ); - if ( !icon.Ok() || size.x == wxDefaultCoord ) + if ( !icon.IsOk() || size.x == wxDefaultCoord ) m_titlebarIcon = icon; else { wxBitmap bmp1; bmp1.CopyFromIcon(icon); - if ( !bmp1.Ok() ) + if ( !bmp1.IsOk() ) m_titlebarIcon = wxNullIcon; else if ( bmp1.GetWidth() == size.x && bmp1.GetHeight() == size.y ) m_titlebarIcon = icon;