1998-05-20 14:12:05 +00:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
2001-04-21 16:03:10 +00:00
|
|
|
// Name: msw/settings.cpp
|
2001-12-30 22:34:36 +00:00
|
|
|
// Purpose: wxSystemSettingsNative implementation for MSW
|
1998-05-20 14:12:05 +00:00
|
|
|
// Author: Julian Smart
|
|
|
|
// Modified by:
|
|
|
|
// Created: 04/01/98
|
|
|
|
// RCS-ID: $Id$
|
|
|
|
// Copyright: (c) Julian Smart and Markus Holzem
|
2000-02-15 22:10:08 +00:00
|
|
|
// Licence: wxWindows license
|
1998-05-20 14:12:05 +00:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2001-04-21 16:03:10 +00:00
|
|
|
// ============================================================================
|
|
|
|
// declarations
|
|
|
|
// ============================================================================
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// headers
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
1998-05-20 14:12:05 +00:00
|
|
|
// For compilers that support precompilation, includes "wx.h".
|
|
|
|
#include "wx/wxprec.h"
|
|
|
|
|
|
|
|
#ifdef __BORLANDC__
|
2001-12-30 22:34:36 +00:00
|
|
|
#pragma hdrstop
|
1998-05-20 14:12:05 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef WX_PRECOMP
|
2001-04-21 16:03:10 +00:00
|
|
|
#include "wx/gdicmn.h"
|
1998-05-20 14:12:05 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "wx/settings.h"
|
2001-12-30 22:34:36 +00:00
|
|
|
|
1998-05-20 14:12:05 +00:00
|
|
|
#include "wx/msw/private.h"
|
2001-12-30 22:34:36 +00:00
|
|
|
|
2001-05-08 22:28:44 +00:00
|
|
|
#include "wx/module.h"
|
2001-06-29 10:58:59 +00:00
|
|
|
#include "wx/fontutil.h"
|
1998-05-20 14:12:05 +00:00
|
|
|
|
2001-04-21 16:03:10 +00:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// private classes
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
2001-12-30 22:34:36 +00:00
|
|
|
// the module which is used to clean up wxSystemSettingsNative data (this is a
|
2001-04-21 16:03:10 +00:00
|
|
|
// singleton class so it can't be done in the dtor)
|
|
|
|
class wxSystemSettingsModule : public wxModule
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
virtual bool OnInit();
|
|
|
|
virtual void OnExit();
|
|
|
|
|
|
|
|
private:
|
|
|
|
DECLARE_DYNAMIC_CLASS(wxSystemSettingsModule)
|
|
|
|
};
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// global data
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
2001-12-30 22:34:36 +00:00
|
|
|
// the font returned by GetFont(wxSYS_DEFAULT_GUI_FONT): it is created when
|
|
|
|
// GetFont() is called for the first time and deleted by wxSystemSettingsModule
|
2001-04-21 16:03:10 +00:00
|
|
|
static wxFont *gs_fontDefault = NULL;
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
// implementation
|
|
|
|
// ============================================================================
|
|
|
|
|
2001-12-30 22:34:36 +00:00
|
|
|
// TODO: see ::SystemParametersInfo for all sorts of Windows settings.
|
|
|
|
// Different args are required depending on the id. How does this differ
|
|
|
|
// from GetSystemMetric, and should it? Perhaps call it GetSystemParameter
|
|
|
|
// and pass an optional void* arg to get further info.
|
|
|
|
// Should also have SetSystemParameter.
|
|
|
|
// Also implement WM_WININICHANGE (NT) / WM_SETTINGCHANGE (Win95)
|
|
|
|
|
2001-04-21 16:03:10 +00:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// wxSystemSettingsModule
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
IMPLEMENT_DYNAMIC_CLASS(wxSystemSettingsModule, wxModule)
|
|
|
|
|
|
|
|
bool wxSystemSettingsModule::OnInit()
|
|
|
|
{
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void wxSystemSettingsModule::OnExit()
|
|
|
|
{
|
|
|
|
delete gs_fontDefault;
|
2001-07-11 10:07:06 +00:00
|
|
|
gs_fontDefault = NULL;
|
2001-04-21 16:03:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
2001-12-30 22:34:36 +00:00
|
|
|
// wxSystemSettingsNative
|
2001-04-21 16:03:10 +00:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
2001-12-30 22:34:36 +00:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// colours
|
|
|
|
// ----------------------------------------------------------------------------
|
1998-05-20 14:12:05 +00:00
|
|
|
|
2001-12-30 22:34:36 +00:00
|
|
|
wxColour wxSystemSettingsNative::GetColour(wxSystemColour index)
|
1998-05-20 14:12:05 +00:00
|
|
|
{
|
2001-12-30 22:34:36 +00:00
|
|
|
wxColour col;
|
|
|
|
wxRGBToColour(col, ::GetSysColor(index));
|
|
|
|
return col;
|
1998-05-20 14:12:05 +00:00
|
|
|
}
|
|
|
|
|
2001-12-30 22:34:36 +00:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// fonts
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
2001-06-29 10:58:59 +00:00
|
|
|
wxFont wxCreateFontFromStockObject(int index)
|
1998-05-20 14:12:05 +00:00
|
|
|
{
|
2001-04-21 16:03:10 +00:00
|
|
|
wxFont font;
|
|
|
|
|
2000-02-15 22:10:08 +00:00
|
|
|
HFONT hFont = (HFONT) ::GetStockObject(index);
|
2001-04-21 16:03:10 +00:00
|
|
|
if ( hFont )
|
2000-02-15 22:10:08 +00:00
|
|
|
{
|
|
|
|
LOGFONT lf;
|
|
|
|
if ( ::GetObject(hFont, sizeof(LOGFONT), &lf) != 0 )
|
|
|
|
{
|
2001-06-29 10:58:59 +00:00
|
|
|
wxNativeFontInfo info;
|
|
|
|
info.lf = lf;
|
|
|
|
// Under MicroWindows we pass the HFONT as well
|
|
|
|
// because it's hard to convert HFONT -> LOGFONT -> HFONT
|
|
|
|
// It's OK to delete stock objects, the delete will be ignored.
|
|
|
|
#ifdef __WXMICROWIN__
|
|
|
|
font.Create(info, (WXHFONT) hFont);
|
|
|
|
#else
|
|
|
|
font.Create(info);
|
|
|
|
#endif
|
2000-02-15 22:10:08 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2001-04-21 16:03:10 +00:00
|
|
|
wxFAIL_MSG( _T("failed to get LOGFONT") );
|
2000-02-15 22:10:08 +00:00
|
|
|
}
|
|
|
|
}
|
2001-04-21 16:03:10 +00:00
|
|
|
else // GetStockObject() failed
|
|
|
|
{
|
|
|
|
wxFAIL_MSG( _T("stock font not found") );
|
|
|
|
}
|
2001-12-30 22:34:36 +00:00
|
|
|
|
2001-06-29 10:58:59 +00:00
|
|
|
return font;
|
|
|
|
}
|
|
|
|
|
2001-12-30 22:34:36 +00:00
|
|
|
wxFont wxSystemSettingsNative::GetFont(wxSystemFont index)
|
2001-06-29 10:58:59 +00:00
|
|
|
{
|
|
|
|
// wxWindow ctor calls GetSystemFont(wxSYS_DEFAULT_GUI_FONT) so we're
|
|
|
|
// called fairly often - this is why we cache this particular font
|
|
|
|
bool isDefaultRequested = index == wxSYS_DEFAULT_GUI_FONT;
|
|
|
|
if ( isDefaultRequested && gs_fontDefault )
|
|
|
|
{
|
|
|
|
return *gs_fontDefault;
|
|
|
|
}
|
|
|
|
|
|
|
|
wxFont font = wxCreateFontFromStockObject(index);
|
2001-04-21 16:03:10 +00:00
|
|
|
|
|
|
|
if ( isDefaultRequested )
|
2000-02-15 22:10:08 +00:00
|
|
|
{
|
2001-04-21 16:03:10 +00:00
|
|
|
// if we got here it means we hadn't cached it yet - do now
|
|
|
|
gs_fontDefault = new wxFont(font);
|
2000-02-15 22:10:08 +00:00
|
|
|
}
|
2001-04-21 16:03:10 +00:00
|
|
|
|
|
|
|
return font;
|
1998-05-20 14:12:05 +00:00
|
|
|
}
|
|
|
|
|
2001-12-30 22:34:36 +00:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// system metrics/features
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
// TODO: some of the "metrics" clearly should be features now that we have
|
|
|
|
// HasFeature()!
|
|
|
|
|
|
|
|
// the conversion table from wxSystemMetric enum to GetSystemMetrics() param
|
|
|
|
//
|
|
|
|
// if the constant is not defined, put -1 in the table to indicate that it is
|
|
|
|
// unknown
|
|
|
|
static const int gs_metricsMap[] =
|
1998-05-20 14:12:05 +00:00
|
|
|
{
|
2002-01-05 22:48:25 +00:00
|
|
|
-1, // wxSystemMetric enums start at 1, so give a dummy value for pos 0.
|
1998-05-20 14:12:05 +00:00
|
|
|
#ifdef __WIN32__
|
2001-12-30 22:34:36 +00:00
|
|
|
SM_CMOUSEBUTTONS,
|
|
|
|
#else
|
|
|
|
-1,
|
1998-05-20 14:12:05 +00:00
|
|
|
#endif
|
|
|
|
|
2001-12-30 22:34:36 +00:00
|
|
|
SM_CXBORDER,
|
|
|
|
SM_CYBORDER,
|
|
|
|
SM_CXCURSOR,
|
|
|
|
SM_CYCURSOR,
|
|
|
|
SM_CXDOUBLECLK,
|
|
|
|
SM_CYDOUBLECLK,
|
1999-01-07 08:43:47 +00:00
|
|
|
#if defined(__WIN32__) && defined(SM_CXDRAG)
|
2001-12-30 22:34:36 +00:00
|
|
|
SM_CXDRAG,
|
|
|
|
SM_CYDRAG,
|
|
|
|
SM_CXEDGE,
|
|
|
|
SM_CYEDGE,
|
|
|
|
#else
|
|
|
|
-1, -1, -1, -1
|
1998-05-20 14:12:05 +00:00
|
|
|
#endif
|
2001-12-30 22:34:36 +00:00
|
|
|
SM_CXHSCROLL,
|
|
|
|
SM_CYHSCROLL,
|
|
|
|
SM_CXHTHUMB,
|
|
|
|
SM_CXICON,
|
|
|
|
SM_CYICON,
|
|
|
|
SM_CXICONSPACING,
|
|
|
|
SM_CYICONSPACING,
|
|
|
|
SM_CXMIN,
|
|
|
|
SM_CYMIN,
|
|
|
|
SM_CXSCREEN,
|
|
|
|
SM_CYSCREEN,
|
1999-01-07 08:43:47 +00:00
|
|
|
|
|
|
|
#if defined(__WIN32__) && defined(SM_CXSIZEFRAME)
|
2001-12-30 22:34:36 +00:00
|
|
|
SM_CXSIZEFRAME,
|
|
|
|
SM_CYSIZEFRAME,
|
|
|
|
SM_CXSMICON,
|
|
|
|
SM_CYSMICON,
|
|
|
|
#else
|
|
|
|
-1, -1, -1, -1
|
1998-05-20 14:12:05 +00:00
|
|
|
#endif
|
2001-12-30 22:34:36 +00:00
|
|
|
SM_CYHSCROLL,
|
|
|
|
SM_CXVSCROLL,
|
|
|
|
SM_CXVSCROLL,
|
|
|
|
SM_CYVSCROLL,
|
|
|
|
SM_CYVTHUMB,
|
|
|
|
SM_CYCAPTION,
|
|
|
|
SM_CYMENU,
|
1999-01-07 08:43:47 +00:00
|
|
|
#if defined(__WIN32__) && defined(SM_NETWORK)
|
2001-12-30 22:34:36 +00:00
|
|
|
SM_NETWORK,
|
|
|
|
#else
|
|
|
|
-1,
|
1998-05-20 14:12:05 +00:00
|
|
|
#endif
|
2001-12-30 22:34:36 +00:00
|
|
|
SM_PENWINDOWS,
|
1999-01-07 08:43:47 +00:00
|
|
|
#if defined(__WIN32__) && defined(SM_SHOWSOUNDS)
|
2001-12-30 22:34:36 +00:00
|
|
|
SM_SHOWSOUNDS,
|
|
|
|
#else
|
|
|
|
-1,
|
1998-05-20 14:12:05 +00:00
|
|
|
#endif
|
2001-12-30 22:34:36 +00:00
|
|
|
SM_SWAPBUTTON,
|
|
|
|
};
|
|
|
|
|
|
|
|
// Get a system metric, e.g. scrollbar size
|
|
|
|
int wxSystemSettingsNative::GetMetric(wxSystemMetric index)
|
|
|
|
{
|
|
|
|
#ifdef __WXMICROWIN__
|
|
|
|
// TODO: probably use wxUniv themes functionality
|
|
|
|
return 0;
|
|
|
|
#else // !__WXMICROWIN__
|
|
|
|
wxCHECK_MSG( index < WXSIZEOF(gs_metricsMap), 0, _T("invalid metric") );
|
|
|
|
|
|
|
|
int indexMSW = gs_metricsMap[index];
|
|
|
|
if ( indexMSW == -1 )
|
|
|
|
{
|
|
|
|
// not supported under current system
|
|
|
|
return 0;
|
2000-02-15 22:10:08 +00:00
|
|
|
}
|
2001-12-30 22:34:36 +00:00
|
|
|
|
|
|
|
int rc = ::GetSystemMetrics(indexMSW);
|
|
|
|
if ( index == wxSYS_NETWORK_PRESENT )
|
|
|
|
{
|
|
|
|
// only the last bit is significant according to the MSDN
|
|
|
|
rc &= 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return rc;
|
|
|
|
#endif // __WXMICROWIN__/!__WXMICROWIN__
|
1998-05-20 14:12:05 +00:00
|
|
|
}
|
|
|
|
|
2001-12-30 22:34:36 +00:00
|
|
|
bool wxSystemSettingsNative::HasFeature(wxSystemFeature index)
|
2001-10-30 23:30:04 +00:00
|
|
|
{
|
2001-12-30 22:34:36 +00:00
|
|
|
switch ( index )
|
2001-10-30 23:30:04 +00:00
|
|
|
{
|
2001-12-30 22:34:36 +00:00
|
|
|
case wxSYS_CAN_ICONIZE_FRAME:
|
2001-10-30 23:30:04 +00:00
|
|
|
case wxSYS_CAN_DRAW_FRAME_DECORATIONS:
|
2001-11-22 23:17:45 +00:00
|
|
|
return TRUE;
|
2001-12-30 22:34:36 +00:00
|
|
|
|
2001-10-30 23:30:04 +00:00
|
|
|
default:
|
2001-12-30 22:34:36 +00:00
|
|
|
wxFAIL_MSG( _T("unknown system feature") );
|
|
|
|
|
2001-10-30 23:30:04 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|