From 0b1db49d64bd4f50bc5bbd8e456566c77d492e11 Mon Sep 17 00:00:00 2001 From: RadAd Date: Tue, 16 Jul 2019 13:49:10 +1000 Subject: Close frame on last child window close --- RadTerminal.cpp | 62 +++++++++++++++++++++++++++++---------------------- RadTerminal.rc | Bin 7322 -> 8744 bytes RadTerminalFrame.cpp | 5 +++-- WinUtils.h | 14 ++++++++++++ resource.h | Bin 3458 -> 3458 bytes 5 files changed, 52 insertions(+), 29 deletions(-) diff --git a/RadTerminal.cpp b/RadTerminal.cpp index 7121dfc..1beaad1 100644 --- a/RadTerminal.cpp +++ b/RadTerminal.cpp @@ -32,6 +32,7 @@ #define PROJ_NAME TEXT("RadTerminal") #define PROJ_CODE TEXT("RadTerminal") +#define REG_BASE TEXT("Software\\RadSoft\\") PROJ_CODE template bool MemEqual(const T& a, const T& b) @@ -103,7 +104,7 @@ struct RadTerminalCreate void LoadRegistry(RadTerminalCreate& rtc, LPCWSTR strSubKey) { HKEY hMainKey = NULL; - if (RegOpenKey(HKEY_CURRENT_USER, _T("Software\\RadSoft\\" PROJ_CODE "\\Profiles"), &hMainKey) == ERROR_SUCCESS) + if (RegOpenKey(HKEY_CURRENT_USER, REG_BASE TEXT("\\Profiles"), &hMainKey) == ERROR_SUCCESS) { HKEY hKey = NULL; if (RegOpenKey(hMainKey, strSubKey, &hKey) == ERROR_SUCCESS) @@ -157,7 +158,7 @@ void ParseCommandLine(RadTerminalCreate& rtc) RadTerminalCreate GetTerminalCreate(bool bParseCmdLine, std::tstring profile) { if (profile.empty()) - profile = RegGetString(HKEY_CURRENT_USER, _T("Software\\RadSoft\\" PROJ_CODE), _T("Profile"), _T("Cmd")); + profile = RegGetString(HKEY_CURRENT_USER, REG_BASE, TEXT("Profile"), TEXT("Cmd")); RadTerminalCreate rtc = {}; rtc.iFontHeight = 16; @@ -183,7 +184,7 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, PTSTR pCmdLine, int nCmdSho HWND hWnd = NULL; HWND hWndMDIClient = NULL; HACCEL hAccel = NULL; - bool bMDI = RegGetDWORD(HKEY_CURRENT_USER, _T("Software\\RadSoft\\" PROJ_CODE), _T("MDI"), TRUE) > 0; + bool bMDI = RegGetDWORD(HKEY_CURRENT_USER, REG_BASE, TEXT("MDI"), TRUE) > 0; CHECK(GetRadTerminalAtom(hInstance), EXIT_FAILURE); @@ -811,10 +812,11 @@ void RadTerminalWindowOnDestroy(HWND hWnd) tsm_vte_unref(data->vte); tsm_screen_unref(data->screen); + if (!IsMDIChild(hWnd) || CountChildWindows(GetParent(hWnd)) == 1) + PostQuitMessage(0); + delete data; SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR) nullptr); - if (!IsMDIChild(hWnd)) - PostQuitMessage(0); } void RadTerminalWindowOnPaint(HWND hWnd) @@ -1240,6 +1242,32 @@ void RadTerminalWindowOnCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify } } +LRESULT RadTerminalWindowOnWatch(HWND hWnd, WPARAM wParam, LPARAM lParam) +{ + const RadTerminalData* const data = (RadTerminalData*) GetWindowLongPtr(hWnd, GWLP_USERDATA); + HANDLE h = (HANDLE) wParam; + if (h == data->spd.pi.hProcess) + { + PostMessage(hWnd, WM_CLOSE, 0, 0); + } + return 0; +} + +LRESULT RadTerminalWindowOnRead(HWND hWnd, WPARAM wParam, LPARAM lParam) +{ + const RadTerminalData* const data = (RadTerminalData*) GetWindowLongPtr(hWnd, GWLP_USERDATA); + const char* buf = (const char*) wParam; + DWORD len = (DWORD) lParam; + tsm_vte_input(data->vte, buf, len); + FixScrollbar(hWnd); + InvalidateRect(hWnd, nullptr, TRUE); + return 0; +} + +/* LRESULT Cls_StdMessage(HWND hWnd, WPARAM wParam, LPARAM lParam) */ +#define HANDLE_STD_MSG(hwnd, message, fn) \ + case (message): return fn((hwnd), (wParam), (lParam)) + LRESULT CALLBACK RadTerminalWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { //return MyDefWindowProc(hWnd, uMsg, wParam, lParam); @@ -1260,28 +1288,8 @@ LRESULT CALLBACK RadTerminalWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPAR HANDLE_MSG(hWnd, WM_VSCROLL, RadTerminalWindowOnVScroll); HANDLE_MSG(hWnd, WM_DROPFILES, RadTerminalWindowOnDropFiles); HANDLE_MSG(hWnd, WM_COMMAND, RadTerminalWindowOnCommand); - case WM_WATCH: - { - const RadTerminalData* const data = (RadTerminalData*) GetWindowLongPtr(hWnd, GWLP_USERDATA); - HANDLE h = (HANDLE) wParam; - if (h == data->spd.pi.hProcess) - { - PostMessage(hWnd, WM_CLOSE, 0, 0); - } - return 0; - } - break; - case WM_READ: - { - const RadTerminalData* const data = (RadTerminalData*) GetWindowLongPtr(hWnd, GWLP_USERDATA); - const char* buf = (const char*) wParam; - DWORD len = (DWORD) lParam; - tsm_vte_input(data->vte, buf, len); - FixScrollbar(hWnd); - InvalidateRect(hWnd, nullptr, TRUE); - return 0; - } - break; + HANDLE_STD_MSG(hWnd, WM_WATCH, RadTerminalWindowOnWatch); + HANDLE_STD_MSG(hWnd, WM_READ, RadTerminalWindowOnRead); default: return MyDefWindowProc(hWnd, uMsg, wParam, lParam); } } diff --git a/RadTerminal.rc b/RadTerminal.rc index 4b6b09a..83cc31d 100644 Binary files a/RadTerminal.rc and b/RadTerminal.rc differ diff --git a/RadTerminalFrame.cpp b/RadTerminalFrame.cpp index 84a0789..f58c2d7 100644 --- a/RadTerminalFrame.cpp +++ b/RadTerminalFrame.cpp @@ -6,6 +6,7 @@ #define PROJ_NAME TEXT("RadTerminal") #define PROJ_CODE TEXT("RadTerminal") +#define REG_BASE TEXT("Software\\RadSoft\\") PROJ_CODE HWND ActionNewWindow(HWND hWnd, bool bParseCmdLine, const std::tstring& profile); LRESULT CALLBACK RadTerminalMDIFrameProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -66,9 +67,9 @@ BOOL RadTerminalFrameOnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct) { HKEY hMainKey = NULL; - if (RegOpenKey(HKEY_CURRENT_USER, TEXT("Software\\RadSoft\\" PROJ_CODE "\\Profiles"), &hMainKey) == ERROR_SUCCESS) + if (RegOpenKey(HKEY_CURRENT_USER, REG_BASE TEXT("\\Profiles"), &hMainKey) == ERROR_SUCCESS) { - const std::tstring strDefault = RegGetString(HKEY_CURRENT_USER, TEXT("Software\\RadSoft\\" PROJ_CODE), TEXT("Profile"), TEXT("Cmd")); + const std::tstring strDefault = RegGetString(HKEY_CURRENT_USER, REG_BASE, TEXT("Profile"), TEXT("Cmd")); DWORD i = 0; std::tstring strName; for (int i = 0; RegEnumKeyEx(hMainKey, i, strName); ++i) diff --git a/WinUtils.h b/WinUtils.h index da1a652..059d858 100644 --- a/WinUtils.h +++ b/WinUtils.h @@ -202,3 +202,17 @@ inline bool FindMenuPos(HMENU hBaseMenu, UINT myID, HMENU* pMenu, int* mpos) return false; } + +inline BOOL CALLBACK CountChildWindowsProc(HWND, LPARAM lParam) +{ + int* pCount = (int*) lParam; + ++(*pCount); + return TRUE; +} + +inline int CountChildWindows(HWND hWnd) +{ + int count = 0; + EnumChildWindows(hWnd, CountChildWindowsProc, (LPARAM) &count); + return count; +} diff --git a/resource.h b/resource.h index 89b4d50..388b2a6 100644 Binary files a/resource.h and b/resource.h differ -- cgit v1.2.3