int CRegHistory::Load(LPCTSTR lpszSection, LPCTSTR lpszKeyPrefix) { if (lpszSection == NULL || lpszKeyPrefix == NULL || *lpszSection == '\0') return -1; m_arEntries.clear(); m_sSection = lpszSection; m_sKeyPrefix = lpszKeyPrefix; int n = 0; std::wstring sText; do { //keys are of form <lpszKeyPrefix><entrynumber> TCHAR sKey[4096] = {0}; if (m_pIniFile) { _stprintf_s(sKey, _countof(sKey), _T("%s%d"), lpszKeyPrefix, n++); sText = m_pIniFile->GetValue(lpszSection, sKey, L""); } else { _stprintf_s(sKey, _countof(sKey), _T("%s\\%s%d"), lpszSection, lpszKeyPrefix, n++); CRegStdString regkey = CRegStdString(sKey); sText = std::wstring(regkey); } if (!sText.empty()) { m_arEntries.push_back(sText); } } while (!sText.empty() && n < m_nMaxHistoryItems); return (int)m_arEntries.size(); }
bool CMainWindow::Initialize() { m_hWndEdit = ::CreateWindow( L"Scintilla", L"Source", WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, *this, 0, hResource, 0); if (m_hWndEdit == NULL) return false; RECT rect; GetClientRect(*this, &rect); ::SetWindowPos(m_hWndEdit, HWND_TOP, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, SWP_SHOWWINDOW); m_directFunction = SendMessage(m_hWndEdit, SCI_GETDIRECTFUNCTION, 0, 0); m_directPointer = SendMessage(m_hWndEdit, SCI_GETDIRECTPOINTER, 0, 0); // Set up the global default style. These attributes are used wherever no explicit choices are made. CRegStdDWORD used2d(L"Software\\TortoiseSVN\\ScintillaDirect2D", TRUE); bool enabled2d = false; if (IsWindows7OrGreater() && DWORD(used2d)) enabled2d = true; std::wstring fontNameW = CRegStdString(L"Software\\TortoiseSVN\\UDiffFontName", L"Consolas"); std::string fontName; fontName = CUnicodeUtils::StdGetUTF8(fontNameW); SetAStyle(STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOWTEXT), ::GetSysColor(COLOR_WINDOW), CRegStdDWORD(L"Software\\TortoiseSVN\\UDiffFontSize", 10), fontName.c_str()); SendEditor(SCI_SETTABWIDTH, CRegStdDWORD(L"Software\\TortoiseSVN\\UDiffTabSize", 4)); SendEditor(SCI_SETREADONLY, TRUE); LRESULT pix = SendEditor(SCI_TEXTWIDTH, STYLE_LINENUMBER, (LPARAM)"_99999"); SendEditor(SCI_SETMARGINWIDTHN, 0, pix); SendEditor(SCI_SETMARGINWIDTHN, 1); SendEditor(SCI_SETMARGINWIDTHN, 2); //Set the default windows colors for edit controls SendEditor(SCI_STYLESETFORE, STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOWTEXT)); SendEditor(SCI_STYLESETBACK, STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOW)); SendEditor(SCI_SETSELFORE, TRUE, ::GetSysColor(COLOR_HIGHLIGHTTEXT)); SendEditor(SCI_SETSELBACK, TRUE, ::GetSysColor(COLOR_HIGHLIGHT)); SendEditor(SCI_SETCARETFORE, ::GetSysColor(COLOR_WINDOWTEXT)); if (enabled2d) { SendEditor(SCI_SETTECHNOLOGY, SC_TECHNOLOGY_DIRECTWRITERETAIN); SendEditor(SCI_SETBUFFEREDDRAW, 0); } SendEditor(SCI_SETVIEWWS, 1); SendEditor(SCI_SETWHITESPACESIZE, 2); SendEditor(SCI_SETWHITESPACEFORE, true, ::GetSysColor(COLOR_3DSHADOW)); SendEditor(SCI_STYLESETVISIBLE, STYLE_CONTROLCHAR, TRUE); return true; }
bool CMainWindow::Initialize() { m_hWndEdit = ::CreateWindow( _T("Scintilla"), _T("Source"), WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, *this, 0, hResource, 0); if (m_hWndEdit == NULL) return false; RECT rect; GetClientRect(*this, &rect); ::SetWindowPos(m_hWndEdit, HWND_TOP, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, SWP_SHOWWINDOW); m_directFunction = SendMessage(m_hWndEdit, SCI_GETDIRECTFUNCTION, 0, 0); m_directPointer = SendMessage(m_hWndEdit, SCI_GETDIRECTPOINTER, 0, 0); // Set up the global default style. These attributes are used wherever no explicit choices are made. SetAStyle(STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOWTEXT), ::GetSysColor(COLOR_WINDOW), // Reusing TortoiseBlame's setting which already have an user friendly // pane in TortoiseSVN's Settings dialog, while there is no such // pane for TortoiseUDiff. CRegStdDWORD(_T("Software\\TortoiseGit\\BlameFontSize"), 10), CUnicodeUtils::StdGetUTF8(CRegStdString(_T("Software\\TortoiseGit\\BlameFontName"), _T("Courier New"))).c_str()); SendEditor(SCI_SETTABWIDTH, 4); SendEditor(SCI_SETREADONLY, TRUE); LRESULT pix = SendEditor(SCI_TEXTWIDTH, STYLE_LINENUMBER, (LPARAM)"_99999"); SendEditor(SCI_SETMARGINWIDTHN, 0, pix); SendEditor(SCI_SETMARGINWIDTHN, 1); SendEditor(SCI_SETMARGINWIDTHN, 2); //Set the default windows colors for edit controls SendEditor(SCI_STYLESETFORE, STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOWTEXT)); SendEditor(SCI_STYLESETBACK, STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOW)); SendEditor(SCI_SETSELFORE, TRUE, ::GetSysColor(COLOR_HIGHLIGHTTEXT)); SendEditor(SCI_SETSELBACK, TRUE, ::GetSysColor(COLOR_HIGHLIGHT)); SendEditor(SCI_SETCARETFORE, ::GetSysColor(COLOR_WINDOWTEXT)); CRegStdDWORD used2d(L"Software\\TortoiseGit\\ScintillaDirect2D", FALSE); if (SysInfo::Instance().IsWin7OrLater() && DWORD(used2d)) { SendEditor(SCI_SETTECHNOLOGY, SC_TECHNOLOGY_DIRECTWRITE); SendEditor(SCI_SETBUFFEREDDRAW, 0); } SendEditor(SCI_SETVIEWWS, 1); SendEditor(SCI_SETWHITESPACESIZE, 2); SendEditor(SCI_SETWHITESPACEFORE, true, ::GetSysColor(COLOR_3DSHADOW)); SendEditor(SCI_STYLESETVISIBLE, STYLE_CONTROLCHAR, TRUE); return true; }
bool CMainWindow::Initialize() { m_hWndEdit = ::CreateWindow( L"Scintilla", L"Source", WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, *this, nullptr, hResource, nullptr); if (!m_hWndEdit) return false; RECT rect; GetClientRect(*this, &rect); ::SetWindowPos(m_hWndEdit, HWND_TOP, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, SWP_SHOWWINDOW); m_directFunction = SendMessage(m_hWndEdit, SCI_GETDIRECTFUNCTION, 0, 0); m_directPointer = SendMessage(m_hWndEdit, SCI_GETDIRECTPOINTER, 0, 0); // Set up the global default style. These attributes are used wherever no explicit choices are made. SetAStyle(STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOWTEXT), ::GetSysColor(COLOR_WINDOW), CRegStdDWORD(L"Software\\TortoiseGit\\UDiffFontSize", 10), CUnicodeUtils::StdGetUTF8(CRegStdString(L"Software\\TortoiseGit\\UDiffFontName", L"Consolas")).c_str()); SendEditor(SCI_SETTABWIDTH, CRegStdDWORD(L"Software\\TortoiseGit\\UDiffTabSize", 4)); SendEditor(SCI_SETREADONLY, TRUE); LRESULT pix = SendEditor(SCI_TEXTWIDTH, STYLE_LINENUMBER, reinterpret_cast<LPARAM>("_99999")); SendEditor(SCI_SETMARGINWIDTHN, 0, pix); SendEditor(SCI_SETMARGINWIDTHN, 1); SendEditor(SCI_SETMARGINWIDTHN, 2); //Set the default windows colors for edit controls SetupColors(false); if (CRegStdDWORD(L"Software\\TortoiseGit\\ScintillaDirect2D", FALSE) != FALSE) { SendEditor(SCI_SETTECHNOLOGY, SC_TECHNOLOGY_DIRECTWRITERETAIN); SendEditor(SCI_SETBUFFEREDDRAW, 0); } SendEditor(SCI_SETVIEWWS, 1); SendEditor(SCI_SETWHITESPACESIZE, 2); SendEditor(SCI_STYLESETVISIBLE, STYLE_CONTROLCHAR, TRUE); return true; }
void CSetSavedDataPage::OnBnClickedAuthhistclear() { CRegStdString auth = CRegStdString(_T("Software\\TortoiseGit\\Auth\\")); auth.removeKey(); PWSTR pszPath = nullptr; if (SHGetKnownFolderPath(FOLDERID_RoamingAppData, KF_FLAG_CREATE, nullptr, &pszPath) == S_OK) { CString path = pszPath; CoTaskMemFree(pszPath); path += L"\\Subversion\\auth\\"; DeleteViaShell(path, IDS_SETTINGS_DELFILE); } m_btnAuthHistClear.EnableWindow(FALSE); m_tooltips.DelTool(GetDlgItem(IDC_AUTHHISTCLEAR)); m_tooltips.DelTool(GetDlgItem(IDC_AUTHHISTORY)); }
bool CRegHistory::Save() const { if (m_sSection.empty()) return false; // save history to registry int nMax = min((int)m_arEntries.size(), m_nMaxHistoryItems + 1); for (int n = 0; n < (int)m_arEntries.size(); n++) { TCHAR sKey[4096] = {0}; if (m_pIniFile) { _stprintf_s(sKey, _countof(sKey), _T("%s%d"), m_sKeyPrefix.c_str(), n); m_pIniFile->SetValue(m_sSection.c_str(), sKey, m_arEntries[n].c_str()); } else { _stprintf_s(sKey, _countof(sKey), _T("%s\\%s%d"), m_sSection.c_str(), m_sKeyPrefix.c_str(), n); CRegStdString regkey(sKey); regkey = m_arEntries[n]; } } // remove items exceeding the max number of history items for (int n = nMax; ; n++) { TCHAR sKey[4096] = {0}; if (m_pIniFile) { _stprintf_s(sKey, _countof(sKey), _T("%s\\%s%d"), m_sSection.c_str(), m_sKeyPrefix.c_str(), n); if (wcscmp(m_pIniFile->GetValue(m_sSection.c_str(), sKey, L""), L"")==0) break; m_pIniFile->Delete(m_sSection.c_str(), sKey, false); } else { _stprintf_s(sKey, _countof(sKey), _T("%s\\%s%d"), m_sSection.c_str(), m_sKeyPrefix.c_str(), n); CRegStdString regkey = CRegStdString(sKey); if (std::wstring(regkey).empty()) break; regkey.removeValue(); // remove entry } } return true; }
void CSetSavedDataPage::OnBnClickedAuthhistclear() { CRegStdString auth = CRegStdString(_T("Software\\TortoiseGit\\Auth\\")); auth.removeKey(); TCHAR pathbuf[MAX_PATH] = {0}; if (SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, pathbuf)==S_OK) { _tcscat_s(pathbuf, MAX_PATH, _T("\\Subversion\\auth")); pathbuf[_tcslen(pathbuf)+1] = 0; SHFILEOPSTRUCT fileop; fileop.hwnd = this->m_hWnd; fileop.wFunc = FO_DELETE; fileop.pFrom = pathbuf; fileop.pTo = NULL; fileop.fFlags = FOF_NO_CONNECTED_ELEMENTS | FOF_NOCONFIRMATION;// | FOF_NOERRORUI | FOF_SILENT; fileop.lpszProgressTitle = _T("deleting file"); SHFileOperation(&fileop); } m_btnAuthHistClear.EnableWindow(FALSE); m_tooltips.DelTool(GetDlgItem(IDC_AUTHHISTCLEAR)); m_tooltips.DelTool(GetDlgItem(IDC_AUTHHISTORY)); }
void SetUUIDOverlayIcon( HWND hWnd ) { if (!CRegStdDWORD(_T("Software\\TortoiseGit\\GroupTaskbarIconsPerRepo"), 3)) return; if (!CRegStdDWORD(_T("Software\\TortoiseGit\\GroupTaskbarIconsPerRepoOverlay"), TRUE)) return; std::wstring uuid; std::wstring sicon; bool bRemoveicon = false; #ifdef __AFXWIN_H__ uuid = g_sGroupingUUID; sicon = g_sGroupingIcon; bRemoveicon = g_bGroupingRemoveIcon; #else CCmdLineParser parser(GetCommandLine()); if (parser.HasVal(L"groupuuid")) uuid = parser.GetVal(L"groupuuid"); #endif if (uuid.empty()) return; CComPtr<ITaskbarList3> pTaskbarInterface; if (FAILED(pTaskbarInterface.CoCreateInstance(CLSID_TaskbarList, nullptr, CLSCTX_INPROC_SERVER))) return; int foundUUIDIndex = 0; do { wchar_t buf[MAX_PATH] = { 0 }; swprintf_s(buf, _countof(buf), L"%s%d", L"Software\\TortoiseGit\\LastUsedUUIDsForGrouping\\", foundUUIDIndex); CRegStdString r = CRegStdString(buf); std::wstring sr = r; if (sr.empty()) { r = uuid + (sicon.empty() ? L"" : (L";" + sicon)); break; } size_t sep = sr.find(L';'); std::wstring olduuid = sep != std::wstring::npos ? sr.substr(0, sep) : sr; if (olduuid.compare(uuid) == 0) { if (bRemoveicon) r = uuid; // reset icon path in registry else if (!sicon.empty()) r = uuid + (sicon.empty() ? L"" : (L";" + sicon)); else sicon = sep != std::wstring::npos ? sr.substr(sep + 1) : L""; break; } foundUUIDIndex++; } while (foundUUIDIndex < 20); if (foundUUIDIndex >= 20) { CRegStdString r = CRegStdString(L"Software\\TortoiseGit\\LastUsedUUIDsForGrouping\\1"); r.removeKey(); } HICON icon = nullptr; if (!sicon.empty()) { if (sicon.size() >= 4 && !_wcsicmp(sicon.substr(sicon.size() - 4).c_str(), L".ico")) icon = (HICON)::LoadImage(nullptr, sicon.c_str(), IMAGE_ICON, 16, 16, LR_LOADFROMFILE | LR_SHARED); else { ULONG_PTR gdiplusToken = 0; Gdiplus::GdiplusStartupInput gdiplusStartupInput; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, nullptr); if (gdiplusToken) { Gdiplus::Bitmap* pBitmap = new Gdiplus::Bitmap(sicon.c_str(), FALSE); if (pBitmap->GetLastStatus() == Gdiplus::Status::Ok) pBitmap->GetHICON(&icon); delete pBitmap; Gdiplus::GdiplusShutdown(gdiplusToken); } } } if (!icon) { DWORD colors[6] = { 0x80FF0000, 0x80FFFF00, 0x8000FF00, 0x800000FF, 0x80000000, 0x8000FFFF }; // AND mask - monochrome - determines which pixels get drawn BYTE AND[32]; for (int i = 0; i<32; i++) { AND[i] = 0xFF; } // XOR mask - 32bpp ARGB - determines the pixel values DWORD XOR[256]; for (int i = 0; i<256; i++) { XOR[i] = colors[foundUUIDIndex % 6]; } icon = ::CreateIcon(nullptr, 16, 16, 1, 32, AND, (BYTE*)XOR); } pTaskbarInterface->SetOverlayIcon(hWnd, icon, uuid.c_str()); DestroyIcon(icon); }
ShellCache::ShellCache() { cachetype = CRegStdDWORD(L"Software\\TortoiseGit\\CacheType", GetSystemMetrics(SM_REMOTESESSION) ? dll : exe, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); showrecursive = CRegStdDWORD(L"Software\\TortoiseGit\\RecursiveOverlay", TRUE, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); folderoverlay = CRegStdDWORD(L"Software\\TortoiseGit\\FolderOverlay", TRUE, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); driveremote = CRegStdDWORD(L"Software\\TortoiseGit\\DriveMaskRemote", FALSE, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); drivefixed = CRegStdDWORD(L"Software\\TortoiseGit\\DriveMaskFixed", TRUE, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); drivecdrom = CRegStdDWORD(L"Software\\TortoiseGit\\DriveMaskCDROM", FALSE, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); driveremove = CRegStdDWORD(L"Software\\TortoiseGit\\DriveMaskRemovable", FALSE, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); drivefloppy = CRegStdDWORD(L"Software\\TortoiseGit\\DriveMaskFloppy", FALSE, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); driveram = CRegStdDWORD(L"Software\\TortoiseGit\\DriveMaskRAM", FALSE, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); driveunknown = CRegStdDWORD(L"Software\\TortoiseGit\\DriveMaskUnknown", FALSE, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); shellmenuaccelerators = CRegStdDWORD(L"Software\\TortoiseGit\\ShellMenuAccelerators", TRUE, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); simplecontext = CRegStdDWORD(L"Software\\TortoiseGit\\SimpleContext", FALSE, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); unversionedasmodified = CRegStdDWORD(L"Software\\TortoiseGit\\UnversionedAsModified", FALSE, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); recursesubmodules = CRegStdDWORD(L"Software\\TortoiseGit\\TGitCacheRecurseSubmodules", FALSE, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); hidemenusforunversioneditems = CRegStdDWORD(L"Software\\TortoiseGit\\HideMenusForUnversionedItems", FALSE, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); showunversionedoverlay = CRegStdDWORD(L"Software\\TortoiseGit\\ShowUnversionedOverlay", TRUE, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); showignoredoverlay = CRegStdDWORD(L"Software\\TortoiseGit\\ShowIgnoredOverlay", TRUE, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); getlocktop = CRegStdDWORD(L"Software\\TortoiseGit\\GetLockTop", TRUE, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); excludedasnormal = CRegStdDWORD(L"Software\\TortoiseGit\\ShowExcludedAsNormal", TRUE, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); drivetypeticker = 0; unsigned __int64 entries = (DEFAULTMENUTOPENTRIES); menulayoutlow = CRegStdDWORD(L"Software\\TortoiseGit\\ContextMenuEntries", entries & 0xFFFFFFFF, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); menulayouthigh = CRegStdDWORD(L"Software\\TortoiseGit\\ContextMenuEntrieshigh", entries >> 32, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); unsigned __int64 ext = (DEFAULTMENUEXTENTRIES); menuextlow = CRegStdDWORD(L"Software\\TortoiseGit\\ContextMenuExtEntriesLow", ext & 0xFFFFFFFF, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); menuexthigh = CRegStdDWORD(L"Software\\TortoiseGit\\ContextMenuExtEntriesHigh", ext >> 32, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); menumasklow_lm = CRegStdDWORD(L"Software\\TortoiseGit\\ContextMenuEntriesMaskLow", 0, FALSE, HKEY_LOCAL_MACHINE, KEY_WOW64_64KEY); menumaskhigh_lm = CRegStdDWORD(L"Software\\TortoiseGit\\ContextMenuEntriesMaskHigh", 0, FALSE, HKEY_LOCAL_MACHINE, KEY_WOW64_64KEY); menumasklow_cu = CRegStdDWORD(L"Software\\TortoiseGit\\ContextMenuEntriesMaskLow", 0, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); menumaskhigh_cu = CRegStdDWORD(L"Software\\TortoiseGit\\ContextMenuEntriesMaskHigh", 0, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); menumaskticker = 0; langid = CRegStdDWORD(L"Software\\TortoiseGit\\LanguageID", 1033, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); blockstatus = CRegStdDWORD(L"Software\\TortoiseGit\\BlockStatus", 0, false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); std::fill_n(drivetypecache, 27, (UINT)-1); if (DWORD(drivefloppy) == 0) { // A: and B: are floppy disks drivetypecache[0] = DRIVE_REMOVABLE; drivetypecache[1] = DRIVE_REMOVABLE; } drivetypepathcache[0] = L'\0'; nocontextpaths = CRegStdString(L"Software\\TortoiseGit\\NoContextPaths", L"", false, HKEY_CURRENT_USER, KEY_WOW64_64KEY); m_critSec.Init(); // Use RegNotifyChangeKeyValue() to get a notification event whenever a registry value // below HKCU\Software\TortoiseGit is changed. If a value has changed, re-read all // the registry variables to ensure we use the latest ones RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\TortoiseGit", 0, KEY_NOTIFY | KEY_WOW64_64KEY, &m_hNotifyRegKey); m_registryChangeEvent = CreateEvent(nullptr, true, false, nullptr); if (RegNotifyChangeKeyValue(m_hNotifyRegKey, false, REG_NOTIFY_CHANGE_LAST_SET, m_registryChangeEvent, TRUE) != ERROR_SUCCESS) { CloseHandle(m_registryChangeEvent); m_registryChangeEvent = nullptr; RegCloseKey(m_hNotifyRegKey); m_hNotifyRegKey = nullptr; } }
ShellCache::ShellCache() { cachetype = CRegStdDWORD(L"Software\\TortoiseSVN\\CacheType", GetSystemMetrics(SM_REMOTESESSION) ? dll : exe); showrecursive = CRegStdDWORD(L"Software\\TortoiseSVN\\RecursiveOverlay", TRUE); folderoverlay = CRegStdDWORD(L"Software\\TortoiseSVN\\FolderOverlay", TRUE); driveremote = CRegStdDWORD(L"Software\\TortoiseSVN\\DriveMaskRemote"); drivefixed = CRegStdDWORD(L"Software\\TortoiseSVN\\DriveMaskFixed", TRUE); drivecdrom = CRegStdDWORD(L"Software\\TortoiseSVN\\DriveMaskCDROM"); driveremove = CRegStdDWORD(L"Software\\TortoiseSVN\\DriveMaskRemovable"); drivefloppy = CRegStdDWORD(L"Software\\TortoiseSVN\\DriveMaskFloppy"); driveram = CRegStdDWORD(L"Software\\TortoiseSVN\\DriveMaskRAM"); driveunknown = CRegStdDWORD(L"Software\\TortoiseSVN\\DriveMaskUnknown"); shellmenuaccelerators = CRegStdDWORD(L"Software\\TortoiseSVN\\ShellMenuAccelerators", TRUE); unversionedasmodified = CRegStdDWORD(L"Software\\TortoiseSVN\\UnversionedAsModified", FALSE); ignoreoncommitignored = CRegStdDWORD(L"Software\\TortoiseSVN\\IgnoreOnCommitIgnored", TRUE); hidemenusforunversioneditems = CRegStdDWORD(L"Software\\TortoiseSVN\\HideMenusForUnversionedItems", FALSE); getlocktop = CRegStdDWORD(L"Software\\TortoiseSVN\\GetLockTop", TRUE); excludedasnormal = CRegStdDWORD(L"Software\\TortoiseSVN\\ShowExcludedFoldersAsNormal", FALSE); alwaysextended = CRegStdDWORD(L"Software\\TortoiseSVN\\AlwaysExtendedMenu", FALSE); cachetypeticker = GetTickCount64(); recursiveticker = cachetypeticker; folderoverlayticker = cachetypeticker; driveticker = cachetypeticker; drivetypeticker = 0; langticker = cachetypeticker; columnrevformatticker = cachetypeticker; pathfilterticker = 0; shellmenuacceleratorsticker = cachetypeticker; unversionedasmodifiedticker = cachetypeticker; ignoreoncommitignoredticker = cachetypeticker; columnseverywhereticker = cachetypeticker; getlocktopticker = cachetypeticker; excludedasnormalticker = cachetypeticker; alwaysextendedticker = cachetypeticker; hidemenusforunversioneditemsticker = cachetypeticker; layoutticker = cachetypeticker; menumaskticker = cachetypeticker; blockstatusticker = cachetypeticker; excontextticker = 0; menulayoutlow = CRegStdDWORD(L"Software\\TortoiseSVN\\ContextMenuEntries", MENUCHECKOUT | MENUUPDATE | MENUCOMMIT); menulayouthigh = CRegStdDWORD(L"Software\\TortoiseSVN\\ContextMenuEntrieshigh", 0); menumasklow_lm = CRegStdDWORD(L"Software\\TortoiseSVN\\ContextMenuEntriesMaskLow", 0, FALSE, HKEY_LOCAL_MACHINE); menumaskhigh_lm = CRegStdDWORD(L"Software\\TortoiseSVN\\ContextMenuEntriesMaskHigh", 0, FALSE, HKEY_LOCAL_MACHINE); menumasklow_cu = CRegStdDWORD(L"Software\\TortoiseSVN\\ContextMenuEntriesMaskLow", 0); menumaskhigh_cu = CRegStdDWORD(L"Software\\TortoiseSVN\\ContextMenuEntriesMaskHigh", 0); langid = CRegStdDWORD(L"Software\\TortoiseSVN\\LanguageID", 1033); blockstatus = CRegStdDWORD(L"Software\\TortoiseSVN\\BlockStatus", 0); columnseverywhere = CRegStdDWORD(L"Software\\TortoiseSVN\\ColumnsEveryWhere", FALSE); std::fill_n(drivetypecache, 27, (UINT)-1); if (DWORD(drivefloppy) == 0) { // A: and B: are floppy disks drivetypecache[0] = DRIVE_REMOVABLE; drivetypecache[1] = DRIVE_REMOVABLE; } TCHAR szBuffer[5] = { 0 }; columnrevformatticker = GetTickCount64(); SecureZeroMemory(&columnrevformat, sizeof(NUMBERFMT)); GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, &szDecSep[0], _countof(szDecSep)); GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, &szThousandsSep[0], _countof(szThousandsSep)); columnrevformat.lpDecimalSep = szDecSep; columnrevformat.lpThousandSep = szThousandsSep; GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SGROUPING, &szBuffer[0], _countof(szBuffer)); columnrevformat.Grouping = _wtoi(szBuffer); GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_INEGNUMBER, &szBuffer[0], _countof(szBuffer)); columnrevformat.NegativeOrder = _wtoi(szBuffer); nocontextpaths = CRegStdString(L"Software\\TortoiseSVN\\NoContextPaths", L""); drivetypepathcache[0] = 0; m_critSec.Init(); }
void CTortoiseProcApp::CheckUpgrade() { CRegString regVersion = CRegString(_T("Software\\TortoiseGit\\CurrentVersion")); CString sVersion = regVersion; CTraceToOutputDebugString::Instance()(_T(__FUNCTION__) _T(": Current TGit Version %s\n"), sVersion); if (sVersion.Compare(_T(STRPRODUCTVER))==0) return; // we're starting the first time with a new version! LONG lVersion = 0; int pos = sVersion.Find('.'); if (pos > 0) { lVersion = (_ttol(sVersion.Left(pos))<<24); lVersion |= (_ttol(sVersion.Mid(pos+1))<<16); pos = sVersion.Find('.', pos+1); lVersion |= (_ttol(sVersion.Mid(pos+1))<<8); } else { pos = sVersion.Find(','); if (pos > 0) { lVersion = (_ttol(sVersion.Left(pos))<<24); lVersion |= (_ttol(sVersion.Mid(pos+1))<<16); pos = sVersion.Find(',', pos+1); lVersion |= (_ttol(sVersion.Mid(pos+1))<<8); } } // generic cleanup if (CRegStdDWORD(_T("Software\\TortoiseGit\\UseLibgit2"), TRUE) != TRUE) { if (CMessageBox::Show(nullptr, _T("You have disabled the usage of libgit2 in TortoiseGit.\n\nThis might be the case in order to resolve an issue in an older TortoiseGit version.\n\nDo you want to restore the default value (i.e., enable it)?"), _T("TortoiseGit"), MB_ICONQUESTION | MB_YESNO) == IDYES) CRegStdDWORD(_T("Software\\TortoiseGit\\UseLibgit2")).removeValue(); } if (CRegStdDWORD(_T("Software\\TortoiseGit\\UseLibgit2_mask")).exists()) { if (CMessageBox::Show(nullptr, _T("You have a non-default setting of UseLibgit2_mask in your registry.\n\nThis might be the case in order to resolve an issue in an older TortoiseGit version.\n\nDo you want to restore the default value (i.e., remove custom setting from registry)?"), _T("TortoiseGit"), MB_ICONQUESTION | MB_YESNO) == IDYES) CRegStdDWORD(_T("Software\\TortoiseGit\\UseLibgit2_mask")).removeValue(); } // version specific updates if (lVersion <= 0x01080802) { CRegStdDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\CleanTypeDlgWindowPlacement")).removeValue(); } if (lVersion <= 0x01080801) { CRegStdDWORD(_T("Software\\TortoiseGit\\StatusColumns\\BrowseRefs")).removeValue(); CRegStdString(_T("Software\\TortoiseGit\\StatusColumns\\BrowseRefs_Order")).removeValue(); CRegStdString(_T("Software\\TortoiseGit\\StatusColumns\\BrowseRefs_Width")).removeValue(); } if (lVersion <= 0x01080401) { if (CRegStdDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\SendMail\\UseMAPI"), FALSE) == TRUE) CRegStdDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\SendMail\\DeliveryType")) = 1; CRegStdDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\SendMail\\UseMAPI")).removeValue(); } if (lVersion <= 0x01080202) { // upgrade to 1.8.3: force recreation of all diff scripts. CAppUtils::SetupDiffScripts(true, CString()); } if (lVersion <= 0x01080100) { if (CRegStdDWORD(_T("Software\\TortoiseGit\\LogTopoOrder"), TRUE) == FALSE) CRegStdDWORD(_T("Software\\TortoiseGit\\LogOrderBy")) = 0; // smoothly migrate broken msysgit path settings CString oldmsysGitSetting = CRegString(REG_MSYSGIT_PATH); oldmsysGitSetting.TrimRight(_T("\\")); CString right = oldmsysGitSetting.Right(4); if (oldmsysGitSetting.GetLength() > 4 && oldmsysGitSetting.Right(4) == _T("\\cmd")) { CString newPath = oldmsysGitSetting.Mid(0, oldmsysGitSetting.GetLength() - 3) + _T("bin"); if (PathFileExists(newPath + _T("\\git.exe"))) { CRegString(REG_MSYSGIT_PATH) = newPath; g_Git.m_bInitialized = FALSE; g_Git.CheckMsysGitDir(); } } } if (lVersion <= 0x01040000) { CRegStdDWORD(_T("Software\\TortoiseGit\\OwnerdrawnMenus")).removeValue(); } if (lVersion <= 0x01070600) { CoInitialize(NULL); EnsureGitLibrary(); CoUninitialize(); CRegStdDWORD(_T("Software\\TortoiseGit\\ConvertBase")).removeValue(); CRegStdDWORD(_T("Software\\TortoiseGit\\DiffProps")).removeValue(); if (CRegStdDWORD(_T("Software\\TortoiseGit\\CheckNewer"), TRUE) == FALSE) CRegStdDWORD(_T("Software\\TortoiseGit\\VersionCheck")) = FALSE; CRegStdDWORD(_T("Software\\TortoiseGit\\CheckNewer")).removeValue(); } CTraceToOutputDebugString::Instance()(_T(__FUNCTION__) _T(": Setting up diff scripts ...\n")); CAppUtils::SetupDiffScripts(false, CString()); // set the current version so we don't come here again until the next update! regVersion = _T(STRPRODUCTVER); }
void SetUUIDOverlayIcon( HWND hWnd ) { if (CRegStdDWORD(_T("Software\\TortoiseGit\\GroupTaskbarIconsPerRepo"), 3)) { if (CRegStdDWORD(_T("Software\\TortoiseGit\\GroupTaskbarIconsPerRepoOverlay"), TRUE)) { std::wstring uuid; #ifdef _MFC_VER uuid = g_sGroupingUUID; #else CCmdLineParser parser(GetCommandLine()); if (parser.HasVal(L"groupuuid")) uuid = parser.GetVal(L"groupuuid"); #endif if (!uuid.empty()) { ITaskbarList3 * pTaskbarInterface = NULL; HRESULT hr = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList3, reinterpret_cast<void**> (&(pTaskbarInterface))); if (SUCCEEDED(hr)) { int foundUUIDIndex = 0; do { wchar_t buf[MAX_PATH]; swprintf_s(buf, _countof(buf), L"%s%d", L"Software\\TortoiseGit\\LastUsedUUIDsForGrouping\\", foundUUIDIndex); CRegStdString r = CRegStdString(buf); std::wstring sr = r; if (sr.empty() || (sr.compare(uuid)==0)) { r = uuid; break; } foundUUIDIndex++; } while (foundUUIDIndex < 20); if (foundUUIDIndex >= 20) { CRegStdString r = CRegStdString(L"Software\\TortoiseGit\\LastUsedUUIDsForGrouping\\1"); r.removeKey(); } DWORD colors[6] = {0x80FF0000, 0x80FFFF00, 0x8000FF00, 0x800000FF, 0x80000000, 0x8000FFFF}; // AND mask - monochrome - determines which pixels get drawn BYTE AND[32]; for( int i=0; i<32; i++ ) { AND[i] = 0xFF; } // XOR mask - 32bpp ARGB - determines the pixel values DWORD XOR[256]; for( int i=0; i<256; i++ ) { XOR[i] = colors[foundUUIDIndex % 6]; } HICON icon = ::CreateIcon(NULL,16,16,1,32,AND,(BYTE*)XOR); pTaskbarInterface->SetOverlayIcon(hWnd, icon, uuid.c_str()); pTaskbarInterface->Release(); DestroyIcon(icon); } } } } }
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); UNREFERENCED_PARAMETER(nCmdShow); // uncomment the following lines for low-memory tests. // note: process needs to run elevated for this to work. // //auto job = CreateJobObject(NULL, NULL); //JOBOBJECT_EXTENDED_LIMIT_INFORMATION joblimit = { 0 }; //joblimit.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_WORKINGSET; //joblimit.JobMemoryLimit = 30 * 1024 * 1024; //joblimit.ProcessMemoryLimit = 30 * 1024 * 1024; //joblimit.PeakProcessMemoryUsed = 30 * 1024 * 1024; //joblimit.BasicLimitInformation.MaximumWorkingSetSize = 30 * 1024 * 1024; //joblimit.BasicLimitInformation.MinimumWorkingSetSize = 30 * 1024; //SetInformationJobObject(job, JobObjectExtendedLimitInformation, &joblimit, sizeof(joblimit)); //AssignProcessToJobObject(job, GetCurrentProcess()); SetDllDirectory(L""); // if multiple items are selected in explorer and grepWin is started for all of them, // explorer starts multiple grepWin instances at once. In case there's already a grepWin instance // running, sleep for a while to give that instance time to fully initialize HANDLE hReloadProtection = ::CreateMutex(NULL, FALSE, L"{6473AA76-0EAE-4C96-8C99-AFDFEFFE42B5}"); bool alreadyRunning = false; if ((!hReloadProtection) || (GetLastError() == ERROR_ALREADY_EXISTS)) { // An instance of grepWin is already running alreadyRunning = true; } g_hInst = hInstance; ::OleInitialize(NULL); ::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); // we need some of the common controls INITCOMMONCONTROLSEX icex; icex.dwSize = sizeof(INITCOMMONCONTROLSEX); icex.dwICC = ICC_LINK_CLASS|ICC_LISTVIEW_CLASSES|ICC_PAGESCROLLER_CLASS |ICC_PROGRESS_CLASS|ICC_STANDARD_CLASSES|ICC_TAB_CLASSES|ICC_TREEVIEW_CLASSES |ICC_UPDOWN_CLASS|ICC_USEREX_CLASSES|ICC_WIN95_CLASSES; InitCommonControlsEx(&icex); HMODULE hRichEdt = LoadLibrary(_T("Riched20.dll")); CCmdLineParser parser(lpCmdLine); if (parser.HasKey(L"register")) { RegisterContextMenu(true); return FALSE; } if ((parser.HasKey(L"unregister")) || (parser.HasKey(L"deregister"))) { RegisterContextMenu(false); return FALSE; } bool bQuit = false; HWND hWnd = NULL; int timeout = 20; do { EnumWindows(windowenumerator, (LPARAM)&hWnd); if (alreadyRunning && (hWnd == NULL)) Sleep(100); timeout--; } while ((hWnd == NULL) && alreadyRunning && timeout); auto modulename = CPathUtils::GetFileName(CPathUtils::GetModulePath(0)); bPortable = ((_tcsstr(modulename.c_str(), _T("portable"))) || (parser.HasKey(_T("portable")))); std::wstring iniPath = CPathUtils::GetModuleDir(0); iniPath += L"\\grepwin.ini"; if (parser.HasVal(L"inipath")) iniPath = parser.GetVal(L"inipath"); if (bPortable) g_iniFile.LoadFile(iniPath.c_str()); if (hWnd) { bool bOnlyOne = !!DWORD(CRegStdDWORD(_T("Software\\grepWin\\onlyone"), 0)); if (bPortable) bOnlyOne = !!_wtoi(g_iniFile.GetValue(L"global", L"onlyone", L"0")); UINT GREPWIN_STARTUPMSG = RegisterWindowMessage(_T("grepWin_StartupMessage")); if (SendMessage(hWnd, GREPWIN_STARTUPMSG, 0, 0)) // send the new path { std::wstring spath = parser.GetVal(_T("searchpath")); SearchReplace(spath, L"/", L"\\"); spath = SanitizeSearchPaths(spath); COPYDATASTRUCT CopyData = {0}; CopyData.lpData = (LPVOID)spath.c_str(); CopyData.cbData = (DWORD)spath.size()*sizeof(wchar_t); SendMessage(hWnd, WM_COPYDATA, 0, (LPARAM)&CopyData); SetForegroundWindow(hWnd); //set the window to front bQuit = true; } else if (bOnlyOne) { std::wstring spath = parser.HasVal(L"searchpath") ? parser.GetVal(_T("searchpath")) : L""; SearchReplace(spath, L"/", L"\\"); spath = SanitizeSearchPaths(spath); COPYDATASTRUCT CopyData = { 0 }; CopyData.lpData = (LPVOID)spath.c_str(); CopyData.cbData = (DWORD)spath.size()*sizeof(wchar_t); SendMessage(hWnd, WM_COPYDATA, 1, (LPARAM)&CopyData); SetForegroundWindow(hWnd); //set the window to front bQuit = true; } } int ret = 0; if (!bQuit) { CLanguage::Instance().LoadFile(bPortable ? g_iniFile.GetValue(L"global", L"languagefile", L"") : std::wstring(CRegStdString(L"Software\\grepWin\\languagefile"))); if (parser.HasKey(_T("about"))||parser.HasKey(_T("?"))||parser.HasKey(_T("help"))) { CAboutDlg aboutDlg(NULL); ret= (int)aboutDlg.DoModal(hInstance, IDD_ABOUT, NULL, NULL); } else { CSearchDlg searchDlg(NULL); if (parser.HasVal(_T("searchpath"))) { std::wstring spath = parser.GetVal(L"searchpath"); spath = SanitizeSearchPaths(spath); searchDlg.SetSearchPath(spath); } if (parser.HasVal(_T("searchfor"))) searchDlg.SetSearchString(parser.GetVal(_T("searchfor"))); if (parser.HasVal(_T("filemaskregex"))) searchDlg.SetFileMask(parser.GetVal(_T("filemaskregex")), true); if (parser.HasVal(_T("filemask"))) searchDlg.SetFileMask(parser.GetVal(_T("filemask")), false); if (parser.HasVal(_T("filemaskexclude"))) searchDlg.SetExcludeFileMask(parser.GetVal(_T("filemaskexclude"))); if (parser.HasVal(_T("replacewith"))) searchDlg.SetReplaceWith(parser.GetVal(_T("replacewith"))); if (parser.HasVal(_T("i"))) searchDlg.SetCaseSensitive(_tcsicmp(parser.GetVal(_T("i")), _T("yes"))!=0); if (parser.HasVal(_T("n"))) searchDlg.SetMatchesNewline(_tcsicmp(parser.GetVal(_T("n")), _T("yes"))==0); if (parser.HasVal(_T("k"))) searchDlg.SetCreateBackups(_tcsicmp(parser.GetVal(_T("k")), _T("yes"))==0); if (parser.HasVal(_T("utf8"))) searchDlg.SetUTF8(_tcsicmp(parser.GetVal(_T("utf8")), _T("yes"))==0); if (parser.HasVal(_T("size"))) { int cmp = 0; if (parser.HasVal(_T("sizecmp"))) cmp = parser.GetLongVal(_T("sizecmp")); searchDlg.SetSize(parser.GetLongVal(_T("size")), cmp); } if (parser.HasVal(_T("s"))) searchDlg.SetIncludeSystem(_tcsicmp(parser.GetVal(_T("s")), _T("yes"))==0); if (parser.HasVal(_T("h"))) searchDlg.SetIncludeHidden(_tcsicmp(parser.GetVal(_T("h")), _T("yes"))==0); if (parser.HasVal(_T("u"))) searchDlg.SetIncludeSubfolders(_tcsicmp(parser.GetVal(_T("u")), _T("yes"))==0); if (parser.HasVal(_T("b"))) searchDlg.SetIncludeBinary(_tcsicmp(parser.GetVal(_T("b")), _T("yes"))==0); if (parser.HasVal(_T("regex"))) searchDlg.SetUseRegex(_tcsicmp(parser.GetVal(_T("regex")), _T("yes")) == 0); else if(parser.HasVal(_T("searchfor"))) searchDlg.SetUseRegex(true); if (parser.HasKey(L"execute") || parser.HasKey(L"executesearch")) searchDlg.SetExecute(ExecuteAction::Search); if (parser.HasKey(L"executereplace")) searchDlg.SetExecute(ExecuteAction::Replace); if (parser.HasKey(L"closedialog")) searchDlg.SetEndDialog(); ret = (int)searchDlg.DoModal(hInstance, IDD_SEARCHDLG, NULL, IDR_SEARCHDLG); } if (bPortable) { FILE * pFile = NULL; _tfopen_s(&pFile, iniPath.c_str(), _T("wb")); g_iniFile.SaveFile(pFile); fclose(pFile); } } ::CoUninitialize(); ::OleUninitialize(); FreeLibrary(hRichEdt); CloseHandle(hReloadProtection); return ret; }
bool CMainWindow::Initialize() { CRegStdDWORD pos(_T("Software\\TortoiseGit\\UDiffViewerPos"), 0); CRegStdDWORD width(_T("Software\\TortoiseGit\\UDiffViewerWidth"), (DWORD)640); CRegStdDWORD height(_T("Software\\TortoiseGit\\UDiffViewerHeight"), (DWORD)480); if (DWORD(pos) && DWORD(width) && DWORD(height)) { RECT rc; rc.left = LOWORD(DWORD(pos)); rc.top = HIWORD(DWORD(pos)); rc.right = rc.left + DWORD(width); rc.bottom = rc.top + DWORD(height); HMONITOR hMon = MonitorFromRect(&rc, MONITOR_DEFAULTTONULL); if (hMon) { // only restore the window position if the monitor is valid MoveWindow(*this, LOWORD(DWORD(pos)), HIWORD(DWORD(pos)), DWORD(width), DWORD(height), FALSE); } } m_hWndEdit = ::CreateWindow( _T("Scintilla"), _T("Source"), WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, *this, 0, hResource, 0); if (m_hWndEdit == NULL) return false; RECT rect; GetClientRect(*this, &rect); ::SetWindowPos(m_hWndEdit, HWND_TOP, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, SWP_SHOWWINDOW); m_directFunction = SendMessage(m_hWndEdit, SCI_GETDIRECTFUNCTION, 0, 0); m_directPointer = SendMessage(m_hWndEdit, SCI_GETDIRECTPOINTER, 0, 0); // Set up the global default style. These attributes are used wherever no explicit choices are made. SetAStyle(STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOWTEXT), ::GetSysColor(COLOR_WINDOW), // Reusing TortoiseBlame's setting which already have an user friendly // pane in TortoiseSVN's Settings dialog, while there is no such // pane for TortoiseUDiff. CRegStdDWORD(_T("Software\\TortoiseGit\\BlameFontSize"), 10), WideToMultibyte(CRegStdString(_T("Software\\TortoiseGit\\BlameFontName"), _T("Courier New"))).c_str()); SendEditor(SCI_SETTABWIDTH, 4); SendEditor(SCI_SETREADONLY, TRUE); LRESULT pix = SendEditor(SCI_TEXTWIDTH, STYLE_LINENUMBER, (LPARAM)"_99999"); SendEditor(SCI_SETMARGINWIDTHN, 0, pix); SendEditor(SCI_SETMARGINWIDTHN, 1); SendEditor(SCI_SETMARGINWIDTHN, 2); //Set the default windows colors for edit controls SendEditor(SCI_STYLESETFORE, STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOWTEXT)); SendEditor(SCI_STYLESETBACK, STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOW)); SendEditor(SCI_SETSELFORE, TRUE, ::GetSysColor(COLOR_HIGHLIGHTTEXT)); SendEditor(SCI_SETSELBACK, TRUE, ::GetSysColor(COLOR_HIGHLIGHT)); SendEditor(SCI_SETCARETFORE, ::GetSysColor(COLOR_WINDOWTEXT)); return true; }