Browse Source

Follow windows 10 settings for app dark/light

sabrogden 6 years ago
parent
commit
817bb79a69
6 changed files with 102 additions and 10 deletions
  1. 33 1
      MainFrm.cpp
  2. 2 0
      MainFrm.h
  3. 20 0
      Misc.cpp
  4. 2 0
      Misc.h
  5. 33 8
      OptionsGeneral.cpp
  6. 12 1
      Theme.cpp

+ 33 - 1
MainFrm.cpp

@@ -71,6 +71,7 @@ IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)
 	ON_MESSAGE(WM_DISPLAYCHANGE, &CMainFrame::OnResolutionChange)
 	ON_MESSAGE(WM_TRAYNOTIFY, &CMainFrame::OnTrayNotification)
 	ON_MESSAGE(WM_PLAIN_TEXT_PASTE, &CMainFrame::OnPlainTextPaste)
+		ON_WM_WININICHANGE()
 	END_MESSAGE_MAP()
 
 	static UINT indicators[] = 
@@ -780,6 +781,25 @@ void CMainFrame::OnTimer(UINT_PTR nIDEvent)
 		}
 		break;
 
+		case SET_WINDOWS_THEME_TIMER:
+		{
+			KillTimer(SET_WINDOWS_THEME_TIMER);
+			auto theme = g_Opt.GetTheme();
+			if (theme == _T(""))
+			{
+				g_Opt.m_Theme.Load(theme);
+
+				auto visible = m_quickPaste.IsWindowVisibleEx();
+				m_quickPaste.CloseQPasteWnd();
+
+				if (visible)
+				{
+					m_quickPaste.ShowQPasteWnd(this, true, false, true);
+				}
+			}
+		}
+		break;
+
     }
 
     CFrameWnd::OnTimer(nIDEvent);
@@ -1382,4 +1402,16 @@ LRESULT CMainFrame::OnResolutionChange(WPARAM wParam, LPARAM lParam)
 	}
 
 	return TRUE;
-}
+}
+
+void CMainFrame::OnWinIniChange(LPCTSTR lpszSection)
+{
+	CFrameWnd::OnWinIniChange(lpszSection);
+
+	if (wcscmp(lpszSection, L"ImmersiveColorSet") == 0)
+	{
+		Log(StrF(_T("OnWinIniChange %s, setting timer to 1000ms to change theme"), lpszSection));
+		KillTimer(SET_WINDOWS_THEME_TIMER);
+		SetTimer(SET_WINDOWS_THEME_TIMER, 1000, NULL);
+	}
+}

+ 2 - 0
MainFrm.h

@@ -23,6 +23,7 @@
 #define CLOSE_POPUP_MSG_WND				14
 #define SCREEN_RESOLUTION_CHANGED		15
 #define DELAYED_SHOW_DITTO_TIMER		16
+#define SET_WINDOWS_THEME_TIMER			17
 
 class CMainFrame: public CFrameWnd
 {
@@ -139,4 +140,5 @@ DECLARE_MESSAGE_MAP()public:
 	afx_msg LRESULT OnResolutionChange(WPARAM wParam, LPARAM lParam);
 	afx_msg LRESULT OnTrayNotification(WPARAM wParam, LPARAM lParam);
 	afx_msg LRESULT OnPlainTextPaste(WPARAM wParam, LPARAM lParam);
+	afx_msg void OnWinIniChange(LPCTSTR lpszSection);
 };

+ 20 - 0
Misc.cpp

@@ -1535,4 +1535,24 @@ CString FolderPath(int folderId)
 	}
 
 	return folder;
+}
+
+BOOL DarkAppWindows10Setting()
+{
+	HKEY hkKey;
+	long lResult = ::RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"), NULL, KEY_READ, &hkKey);
+	if (lResult == ERROR_SUCCESS)
+	{
+		DWORD buffer;
+		DWORD len = sizeof(buffer);
+		DWORD type;
+
+		lResult = ::RegQueryValueEx(hkKey, _T("AppsUseLightTheme"), 0, &type, (LPBYTE)&buffer, &len);
+
+		RegCloseKey(hkKey);
+
+		return buffer == 0;
+	}
+
+	return FALSE;
 }

+ 2 - 0
Misc.h

@@ -198,4 +198,6 @@ CString FolderPath(int folderId);
 
 CString TopLevelWindowText(DWORD pid);
 
+BOOL DarkAppWindows10Setting();
+
 #endif // !defined(AFX_CP_GUI_GLOBALS__FBCDED09_A6F2_47EB_873F_50A746EBC86B__INCLUDED_)

+ 33 - 8
OptionsGeneral.cpp

@@ -14,7 +14,7 @@
 
 using namespace nsPath;
 
-#define DEFAULT_THEME _T("(Default)")
+#define DEFAULT_THEME _T("(Ditto)")
 
 #ifdef _DEBUG
 #define new DEBUG_NEW
@@ -315,17 +315,18 @@ BOOL COptionsGeneral::OnApply()
 
 	CString currentTheme = g_Opt.GetTheme();
 
-	CString csTheme;
+	CString csTheme = _T("");
 	if (m_cbTheme.GetCurSel() >= 0)
 	{
-		m_cbTheme.GetLBText(m_cbTheme.GetCurSel(), csTheme);
-		if (csTheme == DEFAULT_THEME)
+		if (m_cbTheme.GetItemData(m_cbTheme.GetCurSel()) == 1)
 		{
-			g_Opt.SetTheme("");
-			csTheme = _T("");
+			m_cbTheme.GetLBText(m_cbTheme.GetCurSel(), csTheme);			
+			g_Opt.SetTheme(csTheme);
 		}
 		else
-			g_Opt.SetTheme(csTheme);
+		{
+			g_Opt.SetTheme("");
+		}
 	}
 	else
 	{
@@ -466,6 +467,11 @@ void COptionsGeneral::FillThemes()
 	csFile += "*.xml";
 
 	CString csTheme = CGetSetOptions::GetTheme();
+	
+	m_cbTheme.Clear();
+
+	int windowsSettingIndex = m_cbTheme.AddString(_T("(Follow windows light/dark themes)"));
+	m_cbTheme.SetItemData(windowsSettingIndex, 0);
 
 	CFileFind find;
 	BOOL bCont = find.FindFile(csFile);
@@ -481,6 +487,7 @@ void COptionsGeneral::FillThemes()
 			if (theme.FileVersion() >= 2 && theme.FileVersion() < 100)
 			{
 				int nIndex = m_cbTheme.AddString(find.GetFileTitle());
+				m_cbTheme.SetItemData(nIndex, 1);
 
 				if (find.GetFileTitle() == csTheme)
 				{
@@ -492,9 +499,24 @@ void COptionsGeneral::FillThemes()
 	}
 
 	int nIndex = m_cbTheme.AddString(DEFAULT_THEME);
-	if (bSetCurSel == false)
+	m_cbTheme.SetItemData(nIndex, 1);
+	if (csTheme == DEFAULT_THEME)
 	{
 		m_cbTheme.SetCurSel(nIndex);
+		bSetCurSel = true;
+	}
+
+	if (bSetCurSel == false)
+	{
+		int count = m_cbTheme.GetCount();
+		for (int i = 0; i < count; i++)
+		{
+			if (m_cbTheme.GetItemData(i) == 0)
+			{
+				m_cbTheme.SetCurSel(i);
+				break;
+			}
+		}
 	}
 }
 
@@ -506,6 +528,9 @@ void COptionsGeneral::OnBnClickedButtonTheme()
 	CString csTheme;
 	m_cbTheme.GetLBText(m_cbTheme.GetCurSel(), csTheme);
 
+	if (m_cbTheme.GetItemData(m_cbTheme.GetCurSel()) == 0)
+		return;
+
 	if (csTheme == DEFAULT_THEME)
 		return;
 

+ 12 - 1
Theme.cpp

@@ -66,13 +66,24 @@ void CTheme::LoadDefaults()
 
 bool CTheme::Load(CString csTheme, bool bHeaderOnly, bool bCheckLastWriteTime)
 {
-	if (csTheme.IsEmpty() || csTheme == _T("Ditto"))
+	if (csTheme.IsEmpty())
+	{
+		if (DarkAppWindows10Setting())
+		{
+			csTheme = _T("DarkerDitto");
+			Log(_T("Loading theme based on windows setting of dark mode for apps"));
+		}
+	}
+
+	if (csTheme.IsEmpty() || csTheme == _T("Ditto") || csTheme == _T("(Default)") || csTheme == _T("(Ditto)"))
 	{
 		LoadDefaults();
 
 		m_LastWriteTime = 0;
 		m_lastTheme = _T("");
 
+		Log(_T("Loading default ditto values for themes"));
+
 		return false;
 	}