// Get a system metric, e.g. scrollbar size
static int GetSystemMetric(int index);
+
+ // User-customizable hints to wxWindows or associated libraries
+ // These could also be used to influence GetSystem... calls, indeed
+ // to implement SetSystemColour/Font/Metric
+
+ static void SetOption(const wxString& name, const wxString& value);
+ static void SetOption(const wxString& name, int value);
+ static wxString GetOption(const wxString& name) ;
+ static int GetOptionInt(const wxString& name) ;
+ static bool HasOption(const wxString& name) ;
};
#endif
if ( useMask )
{
#ifdef __WIN32__
- HDC hdcMem = ::CreateCompatibleDC(GetHdc());
- ::SelectObject(hdcMem, GetHbitmapOf(bmp));
-
// use MaskBlt() with ROP which doesn't do anything to dst in the mask
// points
- bool ok = ::MaskBlt(GetHdc(), x, y, width, height,
+ // On some systems, MaskBlt succeeds yet is much much slower
+ // than the wxWindows fall-back implementation. So we need
+ // to be able to switch this on and off at runtime.
+ bool ok = FALSE;
+ if (wxSystemSettings::GetOptionInt(wxT("no-maskblt")) == 0)
+ {
+ HDC hdcMem = ::CreateCompatibleDC(GetHdc());
+ ::SelectObject(hdcMem, GetHbitmapOf(bmp));
+
+ ok = ::MaskBlt(GetHdc(), x, y, width, height,
hdcMem, 0, 0,
hbmpMask, 0, 0,
MAKEROP4(SRCCOPY, DSTCOPY)) != 0;
- ::DeleteDC(hdcMem);
+ ::DeleteDC(hdcMem);
+ }
if ( !ok )
#endif // Win32
return FALSE;
}
- bool success;
+ bool success = FALSE;
if (useMask)
{
// transparent, so use "DSTCOPY" ROP for the mask points (the usual
// meaning of fg and bg is inverted which corresponds to wxWin notion
// of the mask which is also contrary to the Windows one)
- success = ::MaskBlt(GetHdc(), xdest, ydest, width, height,
+
+ // On some systems, MaskBlt succeeds yet is much much slower
+ // than the wxWindows fall-back implementation. So we need
+ // to be able to switch this on and off at runtime.
+ if (wxSystemSettings::GetOptionInt(wxT("no-maskblt")) == 0)
+ {
+ success = ::MaskBlt(GetHdc(), xdest, ydest, width, height,
GetHdcOf(*source), xsrc, ysrc,
(HBITMAP)mask->GetMaskBitmap(), xsrc, ysrc,
MAKEROP4(dwRop, DSTCOPY)) != 0;
+ }
if ( !success )
#endif // Win32
// singleton class so it can't be done in the dtor)
class wxSystemSettingsModule : public wxModule
{
+ friend class wxSystemSettings;
public:
virtual bool OnInit();
virtual void OnExit();
private:
DECLARE_DYNAMIC_CLASS(wxSystemSettingsModule)
+
+ static wxArrayString sm_optionNames;
+ static wxArrayString sm_optionValues;
};
// ----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxSystemSettingsModule, wxModule)
+wxArrayString wxSystemSettingsModule::sm_optionNames;
+wxArrayString wxSystemSettingsModule::sm_optionValues;
+
bool wxSystemSettingsModule::OnInit()
{
return TRUE;
void wxSystemSettingsModule::OnExit()
{
+ sm_optionNames.Clear();
+ sm_optionValues.Clear();
delete gs_fontDefault;
}
}
}
+// Option functions (arbitrary name/value mapping)
+void wxSystemSettings::SetOption(const wxString& name, const wxString& value)
+{
+ int idx = wxSystemSettingsModule::sm_optionNames.Index(name, FALSE);
+ if (idx == wxNOT_FOUND)
+ {
+ wxSystemSettingsModule::sm_optionNames.Add(name);
+ wxSystemSettingsModule::sm_optionValues.Add(value);
+ }
+ else
+ {
+ wxSystemSettingsModule::sm_optionNames[idx] = name;
+ wxSystemSettingsModule::sm_optionValues[idx] = value;
+ }
+}
+
+void wxSystemSettings::SetOption(const wxString& name, int value)
+{
+ wxString valStr;
+ valStr.Printf(wxT("%d"), value);
+ SetOption(name, valStr);
+}
+
+wxString wxSystemSettings::GetOption(const wxString& name)
+{
+ int idx = wxSystemSettingsModule::sm_optionNames.Index(name, FALSE);
+ if (idx == wxNOT_FOUND)
+ return wxEmptyString;
+ else
+ return wxSystemSettingsModule::sm_optionValues[idx];
+}
+
+int wxSystemSettings::GetOptionInt(const wxString& name)
+{
+ return wxAtoi(GetOption(name));
+}
+
+bool wxSystemSettings::HasOption(const wxString& name)
+{
+ return (wxSystemSettingsModule::sm_optionNames.Index(name, FALSE) != wxNOT_FOUND);
+}
+