/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace vcl { void Window::SetSettings( const AllSettings& rSettings ) { SetSettings( rSettings, false ); } void Window::SetSettings( const AllSettings& rSettings, bool bChild ) { if ( mpWindowImpl->mpBorderWindow ) { mpWindowImpl->mpBorderWindow->SetSettings( rSettings, false ); if ( (mpWindowImpl->mpBorderWindow->GetType() == WINDOW_BORDERWINDOW) && static_cast(mpWindowImpl->mpBorderWindow.get())->mpMenuBarWindow ) static_cast(mpWindowImpl->mpBorderWindow.get())->mpMenuBarWindow->SetSettings( rSettings, true ); } AllSettings aOldSettings(*mxSettings); OutputDevice::SetSettings( rSettings ); AllSettingsFlags nChangeFlags = aOldSettings.GetChangeFlags( rSettings ); // recalculate AppFont-resolution and DPI-resolution ImplInitResolutionSettings(); if ( bool(nChangeFlags) ) { DataChangedEvent aDCEvt( DataChangedEventType::SETTINGS, &aOldSettings, nChangeFlags ); DataChanged( aDCEvt ); } if ( bChild || mpWindowImpl->mbChildNotify ) { vcl::Window* pChild = mpWindowImpl->mpFirstChild; while ( pChild ) { pChild->SetSettings( rSettings, bChild ); pChild = pChild->mpWindowImpl->mpNext; } } } void Window::UpdateSettings( const AllSettings& rSettings, bool bChild ) { if ( mpWindowImpl->mpBorderWindow ) { mpWindowImpl->mpBorderWindow->UpdateSettings( rSettings ); if ( (mpWindowImpl->mpBorderWindow->GetType() == WINDOW_BORDERWINDOW) && static_cast(mpWindowImpl->mpBorderWindow.get())->mpMenuBarWindow ) static_cast(mpWindowImpl->mpBorderWindow.get())->mpMenuBarWindow->UpdateSettings( rSettings, true ); } AllSettings aOldSettings(*mxSettings); AllSettingsFlags nChangeFlags = mxSettings->Update( mxSettings->GetWindowUpdate(), rSettings ); // recalculate AppFont-resolution and DPI-resolution ImplInitResolutionSettings(); /* #i73785# * do not overwrite a WheelBehavior with false * this looks kind of a hack, but WheelBehavior * is always a local change, not a system property, * so we can spare all our users the hassle of reacting on * this in their respective DataChanged. */ MouseSettings aSet( mxSettings->GetMouseSettings() ); aSet.SetWheelBehavior( aOldSettings.GetMouseSettings().GetWheelBehavior() ); mxSettings->SetMouseSettings( aSet ); if( (nChangeFlags & AllSettingsFlags::STYLE) && IsBackground() ) { Wallpaper aWallpaper = GetBackground(); if( !aWallpaper.IsBitmap() && !aWallpaper.IsGradient() ) { if ( mpWindowImpl->mnStyle & WB_3DLOOK ) { if (aOldSettings.GetStyleSettings().GetFaceColor() != rSettings.GetStyleSettings().GetFaceColor()) SetBackground( Wallpaper( rSettings.GetStyleSettings().GetFaceColor() ) ); } else { if (aOldSettings.GetStyleSettings().GetWindowColor() != rSettings.GetStyleSettings().GetWindowColor()) SetBackground( Wallpaper( rSettings.GetStyleSettings().GetWindowColor() ) ); } } } if ( bool(nChangeFlags) ) { DataChangedEvent aDCEvt( DataChangedEventType::SETTINGS, &aOldSettings, nChangeFlags ); DataChanged( aDCEvt ); // notify data change handler CallEventListeners( VCLEVENT_WINDOW_DATACHANGED, &aDCEvt); } if ( bChild || mpWindowImpl->mbChildNotify ) { vcl::Window* pChild = mpWindowImpl->mpFirstChild; while ( pChild ) { pChild->UpdateSettings( rSettings, bChild ); pChild = pChild->mpWindowImpl->mpNext; } } } void Window::ImplUpdateGlobalSettings( AllSettings& rSettings, bool bCallHdl ) { StyleSettings aTmpSt( rSettings.GetStyleSettings() ); aTmpSt.SetHighContrastMode( false ); rSettings.SetStyleSettings( aTmpSt ); ImplGetFrame()->UpdateSettings( rSettings ); StyleSettings aStyleSettings = rSettings.GetStyleSettings(); // #97047: Force all fonts except Menu and Help to a fixed height // to avoid UI scaling due to large fonts // - but allow bigger fonts on bigger screens (i16682, i21238) // dialogs were designed to fit 800x600 with an 8pt font, so scale accordingly int maxFontheight = 9; // #107886#: 9 is default for some asian systems, so always allow if requested if( GetDesktopRectPixel().getHeight() > 600 ) maxFontheight = (int) ((( 8.0 * (double) GetDesktopRectPixel().getHeight()) / 600.0) + 1.5); vcl::Font aFont = aStyleSettings.GetMenuFont(); int defFontheight = aFont.GetHeight(); if( defFontheight > maxFontheight ) defFontheight = maxFontheight; // if the UI is korean, chinese or another locale // where the system font size is kown to be often too small to // generate readable fonts enforce a minimum font size of 9 points bool bBrokenLangFontHeight = MsLangId::isCJK(Application::GetSettings().GetUILanguageTag().getLanguageType()); if (bBrokenLangFontHeight) defFontheight = std::max(9, defFontheight); // i22098, toolfont will be scaled differently to avoid bloated rulers and status bars for big fonts int toolfontheight = defFontheight; if( toolfontheight > 9 ) toolfontheight = (defFontheight+8) / 2; aFont = aStyleSettings.GetAppFont(); aFont.SetHeight( defFontheight ); aStyleSettings.SetAppFont( aFont ); aFont = aStyleSettings.GetTitleFont(); aFont.SetHeight( defFontheight ); aStyleSettings.SetTitleFont( aFont ); aFont = aStyleSettings.GetFloatTitleFont(); aFont.SetHeight( defFontheight ); aStyleSettings.SetFloatTitleFont( aFont ); // keep menu and help font size from system unless in broken locale size if( bBrokenLangFontHeight ) { aFont = aStyleSettings.GetMenuFont(); if( aFont.GetHeight() < defFontheight ) { aFont.SetHeight( defFontheight ); aStyleSettings.SetMenuFont( aFont ); } aFont = aStyleSettings.GetHelpFont(); if( aFont.GetHeight() < defFontheight ) { aFont.SetHeight( defFontheight ); aStyleSettings.SetHelpFont( aFont ); } } // use different height for toolfont aFont = aStyleSettings.GetToolFont(); aFont.SetHeight( toolfontheight ); aStyleSettings.SetToolFont( aFont ); aFont = aStyleSettings.GetLabelFont(); aFont.SetHeight( defFontheight ); aStyleSettings.SetLabelFont( aFont ); aFont = aStyleSettings.GetInfoFont(); aFont.SetHeight( defFontheight ); aStyleSettings.SetInfoFont( aFont ); aFont = aStyleSettings.GetRadioCheckFont(); aFont.SetHeight( defFontheight ); aStyleSettings.SetRadioCheckFont( aFont ); aFont = aStyleSettings.GetPushButtonFont(); aFont.SetHeight( defFontheight ); aStyleSettings.SetPushButtonFont( aFont ); aFont = aStyleSettings.GetFieldFont(); aFont.SetHeight( defFontheight ); aStyleSettings.SetFieldFont( aFont ); aFont = aStyleSettings.GetIconFont(); aFont.SetHeight( defFontheight ); aStyleSettings.SetIconFont( aFont ); aFont = aStyleSettings.GetTabFont(); aFont.SetHeight( defFontheight ); aStyleSettings.SetTabFont( aFont ); aFont = aStyleSettings.GetGroupFont(); aFont.SetHeight( defFontheight ); aStyleSettings.SetGroupFont( aFont ); rSettings.SetStyleSettings( aStyleSettings ); bool bForceHCMode = false; // auto detect HC mode; if the system already set it to "yes" // (see above) then accept that if( !rSettings.GetStyleSettings().GetHighContrastMode() ) { bool bAutoHCMode = true; utl::OConfigurationNode aNode = utl::OConfigurationTreeRoot::tryCreateWithComponentContext( comphelper::getProcessComponentContext(), "org.openoffice.Office.Common/Accessibility" ); // note: case sensitive ! if ( aNode.isValid() ) { css::uno::Any aValue = aNode.getNodeValue( OUString("AutoDetectSystemHC") ); bool bTmp = false; if( aValue >>= bTmp ) bAutoHCMode = bTmp; } if( bAutoHCMode ) { if( rSettings.GetStyleSettings().GetFaceColor().IsDark() || rSettings.GetStyleSettings().GetWindowColor().IsDark() ) bForceHCMode = true; } } static const char* pEnvHC = getenv( "SAL_FORCE_HC" ); if( pEnvHC && *pEnvHC ) bForceHCMode = true; if( bForceHCMode ) { aStyleSettings = rSettings.GetStyleSettings(); aStyleSettings.SetHighContrastMode( true ); rSettings.SetStyleSettings( aStyleSettings ); } if ( bCallHdl ) GetpApp()->OverrideSystemSettings( rSettings ); } } /*namespace vcl*/ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */