aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--RadTerminal.cpp81
-rw-r--r--RadTerminal.regbin0 -> 486 bytes
-rw-r--r--WinUtils.h38
3 files changed, 89 insertions, 30 deletions
diff --git a/RadTerminal.cpp b/RadTerminal.cpp
index dec0b31..f4140c1 100644
--- a/RadTerminal.cpp
+++ b/RadTerminal.cpp
@@ -34,6 +34,7 @@
#endif
#define PROJ_NAME TEXT("RadTerminal")
+#define PROJ_CODE TEXT("RadTerminal")
template <class T>
bool MemEqual(const T& a, const T& b)
@@ -72,38 +73,31 @@ LRESULT CALLBACK RadTerminalWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
struct RadTerminalCreate
{
int iFontHeight;
- LPTSTR strFontFace;
- LPTSTR strScheme;
+ std::tstring strFontFace;
+ std::tstring strScheme;
COORD szCon;
int sb;
std::tstring strCmd;
};
-int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, PTSTR pCmdLine, int nCmdShow)
+void LoadRegistry(RadTerminalCreate& rtc)
{
- HWND hWnd = NULL;
-
- WNDCLASS wc = {};
-
- wc.lpfnWndProc = RadTerminalWindowProc;
- wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- //wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW);
- wc.hInstance = hInstance;
- wc.lpszClassName = TEXT("RadTerminal");
-
- ATOM atom = NULL;
- CHECK(atom = RegisterClass(&wc), EXIT_FAILURE);
-
- RadTerminalCreate rtc = {};
- rtc.iFontHeight = 16;
- rtc.strFontFace = _T("Consolas");
- //rtc.strScheme = _T("solarized");
- rtc.szCon = { 80, 25 };
- rtc.sb = 1000;
- //rtc.strCmd = _T("%COMSPEC%");
- rtc.strCmd = _T("cmd");
+ HKEY hKey = NULL;
+ if (RegOpenKey(HKEY_CURRENT_USER, _T("Software\\RadSoft\\" PROJ_CODE), &hKey) == ERROR_SUCCESS)
+ {
+ rtc.iFontHeight = RegGetDWORD(hKey, _T("FontSize"), rtc.iFontHeight);
+ rtc.strFontFace = RegGetString(hKey, _T("FontFace"), rtc.strFontFace);
+ rtc.strScheme = RegGetString(hKey, _T("Scheme"), rtc.strScheme);
+ rtc.szCon.X = (SHORT) RegGetDWORD(hKey, _T("Width"), rtc.szCon.X);
+ rtc.szCon.Y = (SHORT) RegGetDWORD(hKey, _T("Height"), rtc.szCon.Y);
+ rtc.sb = RegGetDWORD(hKey, _T("Scrollback"), rtc.sb);
+
+ RegCloseKey(hKey);
+ }
+}
+void ParseCommandLine(RadTerminalCreate& rtc)
+{
bool command = false;
for (int i = 1; i < __argc; ++i)
{
@@ -131,6 +125,35 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, PTSTR pCmdLine, int nCmdSho
command = true;
}
}
+}
+
+int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, PTSTR pCmdLine, int nCmdShow)
+{
+ HWND hWnd = NULL;
+
+ WNDCLASS wc = {};
+
+ wc.lpfnWndProc = RadTerminalWindowProc;
+ wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+ //wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW);
+ wc.hInstance = hInstance;
+ wc.lpszClassName = PROJ_CODE;
+
+ ATOM atom = NULL;
+ CHECK(atom = RegisterClass(&wc), EXIT_FAILURE);
+
+ RadTerminalCreate rtc = {};
+ rtc.iFontHeight = 16;
+ rtc.strFontFace = _T("Consolas");
+ //rtc.strScheme = _T("solarized");
+ rtc.szCon = { 80, 25 };
+ rtc.sb = 1000;
+ //rtc.strCmd = _T("%COMSPEC%");
+ rtc.strCmd = _T("cmd");
+
+ LoadRegistry(rtc);
+ ParseCommandLine(rtc);
HWND hChildWnd = CreateWindowEx(
0,
@@ -560,21 +583,21 @@ BOOL RadTerminalWindowOnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
tsm_screen_set_max_sb(data->screen, rtc->sb);
e = tsm_vte_new(&data->vte, data->screen, tsm_vte_write, data->spd.hInput, tsm_log, nullptr);
tsm_vte_set_osc_cb(data->vte, tsm_vte_osc, hWnd);
- if (rtc->strScheme != nullptr)
+ if (!rtc->strScheme.empty())
{
#ifdef _UNICODE
char scheme[1024];
- WideCharToMultiByte(CP_UTF8, 0, rtc->strScheme, -1, scheme, ARRAYSIZE(scheme), nullptr, nullptr);
+ WideCharToMultiByte(CP_UTF8, 0, rtc->strScheme.c_str(), -1, scheme, ARRAYSIZE(scheme), nullptr, nullptr);
e = tsm_vte_set_palette(data->vte, scheme);
#else
- e = tsm_vte_set_palette(data->vte, rtc->strScheme);
+ e = tsm_vte_set_palette(data->vte, rtc->strScheme.c_str());
#endif
}
for (int b = 0; b < 2; ++b)
for (int i = 0; i < 2; ++i)
for (int u = 0; u < 2; ++u)
- CHECK(data->draw_info.hFonts[b][i][u] = CreateFont(rtc->strFontFace, rtc->iFontHeight, b == 0 ? FW_NORMAL : FW_BOLD, i, u), FALSE);
+ CHECK(data->draw_info.hFonts[b][i][u] = CreateFont(rtc->strFontFace.c_str(), rtc->iFontHeight, b == 0 ? FW_NORMAL : FW_BOLD, i, u), FALSE);
HDC hdc = GetDC(hWnd);
SelectFont(hdc, data->draw_info.hFonts[0][0][0]);
diff --git a/RadTerminal.reg b/RadTerminal.reg
new file mode 100644
index 0000000..8b83f12
--- /dev/null
+++ b/RadTerminal.reg
Binary files differ
diff --git a/WinUtils.h b/WinUtils.h
index 68f7058..ff12f68 100644
--- a/WinUtils.h
+++ b/WinUtils.h
@@ -46,9 +46,45 @@ inline RECT Rect(POINT p1, SIZE s2)
return { p1.x, p1.y, p1.x + s2.cx, p1.y + s2.cy };
}
-inline HFONT CreateFont(LPTSTR pFontFace, int iFontHeight, int cWeight, BOOL bItalic, BOOL bUnderline)
+inline HFONT CreateFont(LPCTSTR pFontFace, int iFontHeight, int cWeight, BOOL bItalic, BOOL bUnderline)
{
return CreateFont(iFontHeight, 0, 0, 0, cWeight, bItalic, bUnderline, FALSE, ANSI_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_DONTCARE, pFontFace);
}
+
+std::string RegGetString(HKEY hKey, LPCSTR sValue, const std::string& strDef)
+{
+ CHAR buf[1024];
+ DWORD len = (ARRAYSIZE(buf) - 1) * sizeof(CHAR);
+ if (RegGetValueA(hKey, nullptr, sValue, RRF_RT_REG_SZ, nullptr, buf, &len) == ERROR_SUCCESS)
+ {
+ buf[len / sizeof(CHAR)] = _T('\0');
+ return buf;
+ }
+ else
+ return strDef;
+}
+
+std::wstring RegGetString(HKEY hKey, LPCWSTR sValue, const std::wstring& strDef)
+{
+ WCHAR buf[1024];
+ DWORD len = (ARRAYSIZE(buf) - 1) * sizeof(WCHAR);
+ if (RegGetValueW(hKey, nullptr, sValue, RRF_RT_REG_SZ, nullptr, buf, &len) == ERROR_SUCCESS)
+ {
+ buf[len / sizeof(WCHAR)] = _T('\0');
+ return buf;
+ }
+ else
+ return strDef;
+}
+
+DWORD RegGetDWORD(HKEY hKey, LPCTSTR sValue, DWORD dwDef)
+{
+ DWORD data = 0;
+ DWORD len = sizeof(data);
+ if (RegGetValue(hKey, nullptr, sValue, RRF_RT_REG_DWORD, nullptr, &data, &len) == ERROR_SUCCESS)
+ return data;
+ else
+ return dwDef;
+}