diff options
author | Tobias Weimer <wishmaster51@googlemail.com> | 2015-07-12 14:10:16 +0000 |
---|---|---|
committer | Tobias Weimer <wishmaster51@googlemail.com> | 2015-07-12 14:10:16 +0000 |
commit | f4ce2b5c214cce406dbd7a73dc7f35ae409546ad (patch) | |
tree | 533cc821ffc9c5664c075930be6a40fde9593aba /plugins/Clist_ng/SRC/config.cpp | |
parent | 71a88c6d8c4578ca24e02a5c6f4860c206e7c6da (diff) |
Clist NG:
Commit of CList NG by silvercircle from https://github.com/silvercircle/miranda-ng
This is based on clist_nicer and Anti-Grain Geometry: http://www.antigrain.com/
This is the first version that actually compiles.
Do NOT use it in production environment!
git-svn-id: http://svn.miranda-ng.org/main/trunk@14543 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/Clist_ng/SRC/config.cpp')
-rw-r--r-- | plugins/Clist_ng/SRC/config.cpp | 626 |
1 files changed, 626 insertions, 0 deletions
diff --git a/plugins/Clist_ng/SRC/config.cpp b/plugins/Clist_ng/SRC/config.cpp new file mode 100644 index 0000000000..4674f398c5 --- /dev/null +++ b/plugins/Clist_ng/SRC/config.cpp @@ -0,0 +1,626 @@ +
+/*
+ * astyle --force-indent=tab=4 --brackets=linux --indent-switches
+ * --pad=oper --one-line=keep-blocks --unpad=paren
+ *
+ * Miranda IM: the free IM client for Microsoft* Windows*
+ *
+ * Copyright 2000-2010 Miranda ICQ/IM project,
+ * all portions of this codebase are copyrighted to the people
+ * listed in contributors.txt.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * you should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * part of clist_ng plugin for Miranda.
+ *
+ * (C) 2005-2010 by silvercircle _at_ gmail _dot_ com and contributors
+ *
+ * $Id: config.cpp 137 2010-10-16 21:03:23Z silvercircle $
+ *
+ * plugin configuration and low level API handling
+ *
+ */
+
+#include <commonheaders.h>
+
+TCluiData cfg::dat = {0};
+ClcData* cfg::clcdat = 0;
+TExtraCache* cfg::eCache = 0;
+int cfg::nextCacheEntry = 0, cfg::maxCacheEntry = 0;
+bool cfg::isAero = true;
+bool cfg::fBaseSkinValid = true;
+FI_INTERFACE* cfg::fif = 0;
+CRITICAL_SECTION cfg::cachecs = {0};
+
+bool cfg::shutDown = false;
+wchar_t cfg::szProfileDir[MAX_PATH] = L"\0";
+int cfg::maxStatus = ID_STATUS_OFFLINE;
+CLUIFrames *cfg::FrameMgr = nullptr;
+
+
+pfnAlphaBlend_t Api::pfnAlphaBlend = 0;
+PGF Api::pfnGradientFill = 0;
+pfnGetTickCount64_t Api::pfnGetTickCount64 = 0;
+
+TSysConfig Api::sysConfig = {0};
+TSysState Api::sysState = {0};
+
+pfnIsThemeActive_t Api::pfnIsThemeActive = 0;
+pfnOpenThemeData_t Api::pfnOpenThemeData = 0;
+pfnDrawThemeBackground_t Api::pfnDrawThemeBackground = 0;
+pfnCloseThemeData_t Api::pfnCloseThemeData = 0;
+pfnDrawThemeText_t Api::pfnDrawThemeText = 0;
+pfnDrawThemeTextEx_t Api::pfnDrawThemeTextEx = 0;
+pfnIsThemeBackgroundPartiallyTransparent_t Api::pfnIsThemeBackgroundPartiallyTransparent = 0;
+pfnDrawThemeParentBackground_t Api::pfnDrawThemeParentBackground = 0;
+pfnGetThemeBackgroundContentRect_t Api::pfnGetThemeBackgroundContentRect = 0;
+pfnEnableThemeDialogTexture_t Api::pfnEnableThemeDialogTexture = 0;
+
+pfnDwmExtendFrameIntoClientArea_t Api::pfnDwmExtendFrameIntoClientArea = 0;
+pfnDwmIsCompositionEnabled_t Api::pfnDwmIsCompositionEnabled = 0;
+
+pfnBufferedPaintInit_t Api::pfnBufferedPaintInit = 0;
+pfnBufferedPaintUninit_t Api::pfnBufferedPaintUninit = 0;
+
+pfnBeginBufferedPaint_t Api::pfnBeginBufferedPaint = 0;
+pfnEndBufferedPaint_t Api::pfnEndBufferedPaint = 0;
+pfnBufferedPaintSetAlpha_t Api::pfnBufferedPaintSetAlpha = 0;
+pfnBufferedPaintClear_t Api::pfnBufferedPaintClear = 0;
+pfnGetBufferedPaintBits_t Api::pfnGetBufferedPaintBits = 0;
+
+pfnDwmGetColorizationColor_t Api::pfnDwmGetColorizationColor = 0;
+pfnDwmBlurBehindWindow_t Api::pfnDwmBlurBehindWindow = 0;
+
+EXCEPTION_RECORD Api::exRecord = {0};
+CONTEXT Api::exCtx = {0};
+LRESULT Api::exLastResult = 0;
+char Api::exSzFile[MAX_PATH] = "\0";
+wchar_t Api::exReason[256] = L"\0";
+int Api::exLine = 0;
+bool Api::exAllowContinue = false;
+HMODULE Api::hUxTheme = 0, Api::hDwm = 0;
+
+void cfg::initCache()
+{
+ InitializeCriticalSection(&cachecs);
+}
+
+DWORD cfg::getDword(const MCONTACT hContact = 0, const char *szModule = 0, const char *szSetting = 0, DWORD uDefault = 0)
+{
+ return(db_get_dw(hContact, szModule, szSetting, uDefault));
+}
+
+/*
+ * read a setting from our default module (Tab_SRMSG)
+ */
+
+DWORD cfg::getDword(const char *szSetting = 0, DWORD uDefault = 0)
+{
+ return(db_get_dw(0, DEFAULT_MODULE, szSetting, uDefault));
+}
+
+/*
+ * read a setting from module only
+ */
+
+DWORD cfg::getDword(const char *szModule, const char *szSetting, DWORD uDefault)
+{
+ return(db_get_dw(0, szModule, szSetting, uDefault));
+}
+
+
+WORD cfg::getWord(const MCONTACT hContact = 0, const char *szModule = 0, const char *szSetting = 0, WORD uDefault = 0)
+{
+ return(db_get_w(hContact, szModule, szSetting, uDefault));
+}
+
+/*
+ * read a setting from our default module (Tab_SRMSG)
+ */
+
+WORD cfg::getWord(const char *szSetting = 0, WORD uDefault = 0)
+{
+ return(db_get_w(0, DEFAULT_MODULE, szSetting, uDefault));
+}
+
+/*
+ * read a setting from module only
+ */
+
+WORD cfg::getWord(const char *szModule, const char *szSetting, WORD uDefault)
+{
+ return(db_get_w(0, szModule, szSetting, uDefault));
+}
+
+/*
+ * same for bytes now
+ */
+int cfg::getByte(const MCONTACT hContact = 0, const char *szModule = 0, const char *szSetting = 0, int uDefault = 0)
+{
+ return(db_get_b(hContact, szModule, szSetting, uDefault));
+}
+
+int cfg::getByte(const char *szSetting = 0, int uDefault = 0)
+{
+ return(db_get_b(0, DEFAULT_MODULE, szSetting, uDefault));
+}
+
+int cfg::getByte(const char *szModule, const char *szSetting, int uDefault)
+{
+ return(db_get_b(0, szModule, szSetting, uDefault));
+}
+
+INT_PTR cfg::getTString(const MCONTACT hContact, const char *szModule, const char *szSetting, DBVARIANT *dbv)
+{
+ return(db_get_ws(hContact, szModule, szSetting, dbv));
+}
+
+INT_PTR cfg::getString(const MCONTACT hContact, const char *szModule, const char *szSetting, DBVARIANT *dbv)
+{
+ return(db_get_s(hContact, szModule, szSetting, dbv));
+}
+
+/*
+ * writer functions
+ */
+
+INT_PTR cfg::writeDword(const MCONTACT hContact = 0, const char *szModule = 0, const char *szSetting = 0, DWORD value = 0)
+{
+ return(db_set_dw(hContact, szModule, szSetting, value));
+}
+
+INT_PTR cfg::writeDword(const char *szModule = 0, const char *szSetting = 0, DWORD value = 0)
+{
+ return(db_set_dw(0, szModule, szSetting, value));
+}
+
+INT_PTR cfg::writeWord(const MCONTACT hContact = 0, const char *szModule = 0, const char *szSetting = 0, WORD value = 0)
+{
+ return(db_set_w(hContact, szModule, szSetting, value));
+}
+
+INT_PTR cfg::writeWord(const char *szModule = 0, const char *szSetting = 0, WORD value = 0)
+{
+ return(db_set_w(0, szModule, szSetting, value));
+}
+
+INT_PTR cfg::writeByte(const MCONTACT hContact = 0, const char *szModule = 0, const char *szSetting = 0, BYTE value = 0)
+{
+ return(db_set_b(hContact, szModule, szSetting, value));
+}
+
+INT_PTR cfg::writeByte(const char *szModule = 0, const char *szSetting = 0, BYTE value = 0)
+{
+ return(db_set_b(0, szModule, szSetting, value));
+}
+
+INT_PTR cfg::writeTString(const MCONTACT hContact, const char *szModule = 0, const char *szSetting = 0, const wchar_t *str = 0)
+{
+ return(db_set_ws(hContact, szModule, szSetting, str));
+}
+
+INT_PTR cfg::writeString(const MCONTACT hContact, const char *szModule = 0, const char *szSetting = 0, const char *str = 0)
+{
+ return(db_set_s(hContact, szModule, szSetting, str));
+}
+
+int cfg::getCache(const MCONTACT hContact, const char *szProto)
+{
+ int i, iFound = -1;
+
+ for(i = 0; i < nextCacheEntry; i++) {
+ if(eCache[i].hContact == hContact) {
+ iFound = i;
+ break;
+ }
+ }
+ if(iFound == -1) {
+ EnterCriticalSection(&cachecs);
+ if(nextCacheEntry == maxCacheEntry) {
+ maxCacheEntry += 100;
+ cfg::eCache = (TExtraCache *)realloc(cfg::eCache, maxCacheEntry * sizeof(TExtraCache));
+ }
+ memset(&cfg::eCache[nextCacheEntry], 0, sizeof(TExtraCache));
+ cfg::eCache[nextCacheEntry].hContact = hContact;
+ memset(cfg::eCache[nextCacheEntry].iExtraImage, 0xff, MAXEXTRACOLUMNS);
+ cfg::eCache[nextCacheEntry].iExtraValid = 0;
+ cfg::eCache[nextCacheEntry].valid = FALSE;
+ cfg::eCache[nextCacheEntry].bStatusMsgValid = 0;
+ cfg::eCache[nextCacheEntry].statusMsg = NULL;
+ cfg::eCache[nextCacheEntry].status_item = NULL;
+ cfg::eCache[nextCacheEntry].dwCFlags = 0;
+ cfg::eCache[nextCacheEntry].dwXMask = CalcXMask(hContact);
+ GetCachedStatusMsg(nextCacheEntry, const_cast<char *>(szProto));
+ cfg::eCache[nextCacheEntry].dwLastMsgTime = INTSORT_GetLastMsgTime(hContact);
+ iFound = nextCacheEntry++;
+ LeaveCriticalSection(&cachecs);
+ }
+ return iFound;
+}
+
+static struct {
+ UINT id;
+ TCHAR* name;
+} _tagFSINFO[] = {
+ FONTID_CONTACTS, LPGENT("Standard contacts"),
+ FONTID_INVIS, LPGENT("Online contacts to whom you have a different visibility"),
+ FONTID_OFFLINE, LPGENT("Offline contacts"),
+ FONTID_OFFINVIS, LPGENT("Offline contacts to whom you have a different visibility"),
+ FONTID_NOTONLIST, LPGENT("Contacts which are 'not on list'"),
+ FONTID_GROUPS, LPGENT("Groups"),
+ FONTID_GROUPCOUNTS, LPGENT("Group member counts"),
+ FONTID_DIVIDERS, LPGENT("Dividers"),
+ FONTID_STATUS, LPGENT("Status mode"),
+ FONTID_FRAMETITLE, LPGENT("Frame titles"),
+ FONTID_EVENTAREA, LPGENT("Event area"),
+ FONTID_TIMESTAMP, LPGENT("Contact list local time"),
+ 0, NULL
+};
+
+struct ColorOptionsList {
+ int order;
+ TCHAR* tszName;
+ char* szSetting;
+ COLORREF def;
+};
+
+/*
+ * note: bits 24-31 in default color indicates that color is a system color index
+ * (GetSysColor(default_color & 0x00ffffff)), not a rgb value.
+ */
+static ColorOptionsList _clrs[] = {
+ 0, L"List background", "BkColour", COLOR_WINDOW | 0xff000000,
+ 1, L"Group header background", "BkColourGroups", COLOR_3DFACE | 0xff000000,
+ 2, L"Selected text", "SelTextColour", COLOR_HIGHLIGHTTEXT | 0xff000000,
+ 3, L"Hottrack text", "HotTextColour", COLOR_HOTLIGHT | 0xff000000,
+ 4, L"Quicksearch text", "QuickSearchColour", CLCDEFAULT_QUICKSEARCHCOLOUR,
+ 5, L"Frame title background", "BkFrameTitles", COLOR_3DFACE | 0xff000000,
+ 6, L"Event area background", "BkEventAera", COLOR_WINDOW | 0xff000000
+};
+
+void cfg::FS_RegisterFonts()
+{
+ ColourIDT colourid;
+ FontIDT fid = {0};
+ char szTemp[50];
+ DBVARIANT dbv;
+ int j = 0;
+
+ fid.cbSize = sizeof(fid);
+ wcsncpy(fid.group, L"Contact List", _countof(fid.group));
+ strncpy(fid.dbSettingsGroup, "CLC", 5);
+ fid.flags = FIDF_DEFAULTVALID | FIDF_ALLOWEFFECTS | FIDF_APPENDNAME | FIDF_SAVEPOINTSIZE;
+ wcsncpy(fid.backgroundGroup, L"Contact List", _countof(fid.backgroundGroup));
+ while(_tagFSINFO[j].name != 0) {
+ if(FONTID_EVENTAREA == _tagFSINFO[j].id)
+ wcsncpy(fid.backgroundName, L"Event area background", _countof(fid.backgroundName));
+ else if(FONTID_FRAMETITLE == _tagFSINFO[j].id)
+ wcsncpy(fid.backgroundName, L"Frame title background", _countof(fid.backgroundName));
+ else if(FONTID_GROUPCOUNTS == _tagFSINFO[j].id || FONTID_GROUPS == _tagFSINFO[j].id)
+ _tcsncpy(fid.backgroundName, L"Group header background", _countof(fid.backgroundName));
+ else
+ wcsncpy(fid.backgroundName, L"List background", _countof(fid.backgroundName));
+
+ mir_snprintf(szTemp, sizeof(szTemp), "Font%d", _tagFSINFO[j].id);
+ strncpy(fid.prefix, szTemp, sizeof(fid.prefix));
+ fid.order = _tagFSINFO[j].id;
+ wcsncpy(fid.name, _tagFSINFO[j].name, 60);
+ _snprintf(szTemp, sizeof(szTemp), "Font%dCol", _tagFSINFO[j].id);
+ fid.deffontsettings.colour = (COLORREF)cfg::getDword("CLC", szTemp, GetSysColor(COLOR_WINDOWTEXT));
+
+ _snprintf(szTemp, sizeof(szTemp), "Font%dSize", _tagFSINFO[j].id);
+ fid.deffontsettings.size = (BYTE)cfg::getByte("CLC", szTemp, 8);
+
+ _snprintf(szTemp, sizeof(szTemp), "Font%dSty", _tagFSINFO[j].id);
+ fid.deffontsettings.style = cfg::getByte("CLC", szTemp, 0);
+ _snprintf(szTemp, sizeof(szTemp), "Font%dSet", _tagFSINFO[j].id);
+ fid.deffontsettings.charset = cfg::getByte("CLC", szTemp, DEFAULT_CHARSET);
+ _snprintf(szTemp, sizeof(szTemp), "Font%dName", _tagFSINFO[j].id);
+ if(cfg::getString(NULL, "CLC", szTemp, &dbv))
+ lstrcpyn(fid.deffontsettings.szFace, L"Tahoma", LF_FACESIZE);
+ else {
+ lstrcpyn(fid.deffontsettings.szFace, dbv.ptszVal, LF_FACESIZE);
+ mir_free(dbv.ptszVal);
+ }
+ FontRegisterT(&fid);
+ j++;
+ }
+
+ colourid.order = 0;
+ strncpy(colourid.dbSettingsGroup, "CLC", sizeof(colourid.dbSettingsGroup));
+ colourid.cbSize = sizeof(ColourIDT);
+ mir_sntprintf(colourid.group, _countof(colourid.group), L"%s", L"Contact List");
+ for (int i = 0; i < _countof(_clrs); i++) {
+ colourid.order = _clrs[i].order;
+ mir_snprintf(colourid.setting, sizeof(colourid.setting), "%s", _clrs[i].szSetting);
+ mir_sntprintf(colourid.name, _countof(colourid.name), L"%s", _clrs[i].tszName);
+ colourid.defcolour = (_clrs[i].def & 0xff000000 ? GetSysColor(_clrs[i].def & 0x00ffffff) : _clrs[i].def);
+ ColourRegisterT(&colourid);
+ }
+}
+
+TSkinDescription cfg::my_default_skin[] = {
+ IDR_SKIN_BASE, _T("base.cng"),
+ IDR_SKIN_BACK, _T("back.png"),
+ IDR_SKIN_BACKAERO, _T("AeroBack.png"),
+ IDR_SKIN_GLYPHS, _T("glyphs.png"),
+};
+
+/**
+ * first stage config init. Just read profile base path and try to
+ * extract the skin from the DLL
+ */
+int cfg::onInit()
+{
+ wchar_t* userdata = ::Utils_ReplaceVarsT(L"%miranda_profilesdir%");
+ wchar_t szBaseSkin[MAX_PATH];
+
+ LRESULT fi_version = CallService(MS_IMG_GETIFVERSION, 0, 0);
+ CallService(MS_IMG_GETINTERFACE, fi_version, (LPARAM)&fif);
+
+ if(0 == fif)
+ return(-S_FALSE);
+
+ mir_sntprintf(szProfileDir, MAX_PATH, L"%s", userdata);
+ mir_free(userdata);
+
+ Utils::ensureTralingBackslash(szProfileDir);
+ mir_sntprintf(szBaseSkin, MAX_PATH, L"%s%s", szProfileDir, L"skin\\clng\\base");
+ CreateDirectoryTreeW(szBaseSkin);
+ extractBaseSkin(false);
+
+ return(fBaseSkinValid ? S_OK : -S_FALSE);
+}
+/**
+ * extract the aero skin images from the DLL and store them in
+ * the private data folder.
+ * runs at every startup
+ *
+ * only overwrites the files when version number does not match or
+ * one of the files is missing.
+ */
+void cfg::extractBaseSkin(bool fForceOverwrite)
+{
+ wchar_t wszBasePath[MAX_PATH], wszTest[MAX_PATH];
+ bool fChecksPassed = true;
+ HANDLE hFile;
+
+ mir_sntprintf(wszBasePath, MAX_PATH, L"%s%s", szProfileDir, L"skin\\clng\\base\\");
+ mir_sntprintf(wszTest, MAX_PATH, L"%s%s", wszBasePath, L"base.cng");
+
+ /*
+ * version check, also fails when the file is simply missing
+ */
+ int uVersion = GetPrivateProfileInt(L"SkinInfo", L"Version", 0, wszTest);
+ if(uVersion < SKIN_REQUIRED_VERSION)
+ fChecksPassed = false;
+
+ /*
+ * version check passed, verify files are present
+ */
+ if(fChecksPassed) {
+ for(int i = 0; i < safe_sizeof(my_default_skin); i++) {
+ mir_sntprintf(wszTest, MAX_PATH, L"%s%s", wszBasePath, my_default_skin[i].tszName);
+ if((hFile = CreateFile(wszTest, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)) == INVALID_HANDLE_VALUE) {
+ fChecksPassed = false;
+ break;
+ }
+ CloseHandle(hFile);
+ }
+ }
+
+ // files are not present in skin dir, extract the default skin
+ if(!fChecksPassed) {
+ try {
+ for(int i = 0; i < safe_sizeof(my_default_skin); i++)
+ Utils::extractResource(g_hInst, my_default_skin[i].ulID, L"SKIN_GLYPH", wszBasePath, my_default_skin[i].tszName, true);
+
+ fBaseSkinValid = true;
+ } catch(CRTException& ex) {
+ ex.display();
+ fBaseSkinValid = false;
+ }
+ }
+}
+
+int Api::onInit()
+{
+ HMODULE hUserDll = 0;
+
+ hUserDll = GetModuleHandleA("user32.dll");
+
+ pfnGradientFill = (PGF) GetProcAddress(GetModuleHandleA("gdi32"), "GdiGradientFill");
+ if(0 == pfnGradientFill)
+ pfnGradientFill = (PGF) GetProcAddress(GetModuleHandleA("msimg32"), "GradientFill");
+
+ pfnAlphaBlend = (pfnAlphaBlend_t) GetProcAddress(GetModuleHandleA("gdi32"), "GdiAlphaBlend");
+ if(0 == pfnAlphaBlend)
+ pfnAlphaBlend = (pfnAlphaBlend_t)GetProcAddress(GetModuleHandleA("msimg32"), "AlphaBlend");
+
+ pfnGetTickCount64 = (pfnGetTickCount64_t)GetProcAddress(GetModuleHandleA("kernel32"), "GetTickCount64");
+
+ sysConfig.isVistaPlus = (IsWinVerVistaPlus() ? true : false);
+ sysConfig.isSevenPlus = (IsWinVer7Plus() ? true : false);
+
+ if(!sysConfig.isVistaPlus)
+ return(-S_FALSE);
+
+ if(sysConfig.isVistaPlus) {
+ if((hUxTheme = Utils::loadSystemLibrary(L"\\uxtheme.dll"), true) != 0) {
+ pfnIsThemeActive = (pfnIsThemeActive_t)GetProcAddress(hUxTheme, "IsThemeActive");
+ pfnOpenThemeData = (pfnOpenThemeData_t)GetProcAddress(hUxTheme, "OpenThemeData");
+ pfnDrawThemeBackground = (pfnDrawThemeBackground_t)GetProcAddress(hUxTheme, "DrawThemeBackground");
+ pfnCloseThemeData = (pfnCloseThemeData_t)GetProcAddress(hUxTheme, "CloseThemeData");
+ pfnDrawThemeText = (pfnDrawThemeText_t)GetProcAddress(hUxTheme, "DrawThemeText");
+ pfnIsThemeBackgroundPartiallyTransparent = (pfnIsThemeBackgroundPartiallyTransparent_t)GetProcAddress(hUxTheme, "IsThemeBackgroundPartiallyTransparent");
+ pfnDrawThemeParentBackground = (pfnDrawThemeParentBackground_t)GetProcAddress(hUxTheme, "DrawThemeParentBackground");
+ pfnGetThemeBackgroundContentRect = (pfnGetThemeBackgroundContentRect_t)GetProcAddress(hUxTheme, "GetThemeBackgroundContentRect");
+ pfnEnableThemeDialogTexture = (pfnEnableThemeDialogTexture_t)GetProcAddress(hUxTheme, "EnableThemeDialogTexture");
+
+ if(pfnIsThemeActive != 0 && pfnOpenThemeData != 0 && pfnDrawThemeBackground != 0 && pfnCloseThemeData != 0
+ && pfnDrawThemeText != 0 && pfnIsThemeBackgroundPartiallyTransparent != 0 && pfnDrawThemeParentBackground != 0
+ && pfnGetThemeBackgroundContentRect != 0) {
+ }
+ pfnBeginBufferedPaint = (pfnBeginBufferedPaint_t)GetProcAddress(hUxTheme, "BeginBufferedPaint");
+ pfnEndBufferedPaint = (pfnEndBufferedPaint_t)GetProcAddress(hUxTheme, "EndBufferedPaint");
+ pfnBufferedPaintInit = (pfnBufferedPaintInit_t)GetProcAddress(hUxTheme, "BufferedPaintInit");
+ pfnBufferedPaintUninit = (pfnBufferedPaintUninit_t)GetProcAddress(hUxTheme, "BufferedPaintUnInit");
+ pfnBufferedPaintSetAlpha = (pfnBufferedPaintSetAlpha_t)GetProcAddress(hUxTheme, "BufferedPaintSetAlpha");
+ pfnBufferedPaintClear = (pfnBufferedPaintClear_t)GetProcAddress(hUxTheme, "BufferedPaintClear");
+ pfnGetBufferedPaintBits = (pfnGetBufferedPaintBits_t)GetProcAddress(hUxTheme, "GetBufferedPaintBits");
+ pfnDrawThemeTextEx = (pfnDrawThemeTextEx_t)GetProcAddress(hUxTheme, "DrawThemeTextEx");
+
+ if((hDwm = Utils::loadSystemLibrary(L"\\dwmapi.dll"), true) != 0) {
+ pfnDwmIsCompositionEnabled = (pfnDwmIsCompositionEnabled_t)GetProcAddress(hDwm, "DwmIsCompositionEnabled");
+ pfnDwmExtendFrameIntoClientArea = (pfnDwmExtendFrameIntoClientArea_t)GetProcAddress(hDwm, "DwmExtendFrameIntoClientArea");
+
+ pfnDwmBlurBehindWindow = (pfnDwmBlurBehindWindow_t)GetProcAddress(hDwm, "DwmEnableBlurBehindWindow");
+ pfnDwmGetColorizationColor = (pfnDwmGetColorizationColor_t)GetProcAddress(hDwm, "DwmGetColorizationColor");
+ }
+ }
+ }
+ pfnBufferedPaintInit();
+ updateState();
+ return(S_OK);
+}
+
+void Api::onUnload()
+{
+ if(hUxTheme)
+ FreeLibrary(hUxTheme);
+
+ pfnBufferedPaintUninit();
+}
+
+/**
+ * update system's state (theme status, aero status, DWM check...
+ *
+ * called when windows broadcasts things like WM_THEMECHANGED or
+ * WM_DWMCOMPOSITIONCHANGED
+ */
+void Api::updateState()
+{
+ BOOL result = FALSE;
+
+ ::ZeroMemory(&sysState, sizeof(TSysState));
+
+ sysState.isThemed = pfnIsThemeActive() ? true : false;
+
+ if(sysConfig.isVistaPlus) {
+ sysState.isDwmActive = (pfnDwmIsCompositionEnabled && (pfnDwmIsCompositionEnabled(&result) == S_OK) && result) ? true : false;
+ sysState.isAero = cfg::getByte(SKIN_DB_MODULE, "fUseAero", 1) && sysState.isDwmActive;
+ }
+ else
+ sysState.isAero = sysState.isDwmActive = false;
+}
+
+/**
+ * exception handling for SEH exceptions
+ */
+
+/**
+ * exception handling - copy error message to clip board
+ * @param hWnd: window handle of the edit control containing the error message
+ */
+void Api::Ex_CopyEditToClipboard(HWND hWnd)
+{
+ SendMessage(hWnd, EM_SETSEL, 0, 65535L);
+ SendMessage(hWnd, WM_COPY, 0 , 0);
+ SendMessage(hWnd, EM_SETSEL, 0, 0);
+}
+
+INT_PTR CALLBACK Api::Ex_DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ WORD wNotifyCode, wID;
+
+ switch(uMsg) {
+ case WM_INITDIALOG: {
+ char szBuffer[2048];
+#ifdef _WIN64
+ sprintf(szBuffer,
+ "Exception %16.16X at address %16.16X occured in %s at line %d.\r\n\r\nEAX=%16.16X EBX=%16.16X ECX=%16.16X\r\nEDX=%16.16X ESI=%16.16X EDI=%16.16X\r\nEBP=%16.16X ESP=%16.16X EIP=%16.16X",
+ exRecord.ExceptionCode, exRecord.ExceptionAddress, exSzFile, exLine,
+ exCtx.Rax, exCtx.Rbx, exCtx.Rcx, exCtx.Rdx,
+ exCtx.Rsi, exCtx.Rdi, exCtx.Rbp, exCtx.Rsp, exCtx.Rip);
+#else
+ sprintf(szBuffer,
+ "Exception %8.8X at address %8.8X occured in %s at line %d.\r\n\r\nEAX=%8.8X EBX=%8.8X ECX=%8.8X\r\nEDX=%8.8X ESI=%8.8X EDI=%8.8X\r\nEBP=%8.8X ESP=%8.8X EIP=%8.8X",
+ exRecord.ExceptionCode, exRecord.ExceptionAddress, exSzFile, exLine,
+ exCtx.Eax, exCtx.Ebx, exCtx.Ecx, exCtx.Edx,
+ exCtx.Esi, exCtx.Edi, exCtx.Ebp, exCtx.Esp, exCtx.Eip);
+#endif
+ SetDlgItemTextA(hwndDlg, IDC_EXCEPTION_DETAILS, szBuffer);
+ SetFocus(GetDlgItem(hwndDlg, IDC_EXCEPTION_DETAILS));
+ SendDlgItemMessage(hwndDlg, IDC_EXCEPTION_DETAILS, WM_SETFONT, (WPARAM)GetStockObject(OEM_FIXED_FONT), 0);
+ SetDlgItemTextW(hwndDlg, IDC_EX_REASON, exReason);
+ Utils::enableDlgControl(hwndDlg, IDOK, exAllowContinue ? TRUE : FALSE);
+ }
+ break;
+
+ case WM_COMMAND:
+ wNotifyCode = HIWORD(wParam);
+ wID = LOWORD(wParam);
+ if(wNotifyCode == BN_CLICKED) {
+ if(wID == IDOK || wID == IDCANCEL)
+ EndDialog(hwndDlg, wID);
+
+ if(wID == IDC_COPY_EXCEPTION)
+ Ex_CopyEditToClipboard(GetDlgItem(hwndDlg, IDC_EXCEPTION_DETAILS));
+ }
+
+ break;
+ }
+ return FALSE;
+}
+
+void Api::Ex_Handler()
+{
+ if(exLastResult == IDCANCEL)
+ ExitProcess(1);
+}
+
+int Api::Ex_ShowDialog(EXCEPTION_POINTERS *ep, const char *szFile, int line, wchar_t* szReason, bool fAllowContinue)
+{
+ char szDrive[MAX_PATH], szDir[MAX_PATH], szName[MAX_PATH], szExt[MAX_PATH];
+
+ _splitpath(szFile, szDrive, szDir, szName, szExt);
+ memcpy(&exRecord, ep->ExceptionRecord, sizeof(EXCEPTION_RECORD));
+ memcpy(&exCtx, ep->ContextRecord, sizeof(CONTEXT));
+
+ _snprintf(exSzFile, MAX_PATH, "%s%s", szName, szExt);
+ mir_sntprintf(exReason, 256, L"An application error has occured: %s", szReason);
+ exLine = line;
+ exLastResult = DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_EXCEPTION), 0, Ex_DlgProc, 0);
+ exAllowContinue = fAllowContinue;
+ if(IDCANCEL == exLastResult)
+ ExitProcess(1);
+ return 1;
+}
+
+CRTException::CRTException(const char *szMsg, const wchar_t *szParam) : std::runtime_error(std::string(szMsg))
+{
+ mir_sntprintf(m_szParam, MAX_PATH, szParam);
+}
+
+void CRTException::display() const
+{
+ wchar_t* tszMsg = mir_a2t(what());
+ wchar_t tszBoxMsg[500];
+
+ mir_sntprintf(tszBoxMsg, 500, _T("%s\n\n(%s)"), tszMsg, m_szParam);
+ ::MessageBox(0, tszBoxMsg, _T("ClistNG runtime error"), MB_OK | MB_ICONERROR);
+ mir_free(tszMsg);
+}
+
|