diff options
Diffstat (limited to 'c/main.cpp')
-rw-r--r-- | c/main.cpp | 225 |
1 files changed, 111 insertions, 114 deletions
@@ -13,14 +13,14 @@ /* Looked-up constants. */ int g_bThemes; -int g_iDPI = 96; +int g_dpi = 96; /* Fonts. */ HFONT g_hfNormal; HFONT g_hfBold; /* Menus. */ -HMENU g_hPopupMenu; +HMENU g_hMenuPopup; /* Windows. */ HWND g_hWndFocus; @@ -28,13 +28,13 @@ HWND g_hWnd; HWND g_hWndStatus; /* Child window objects. */ -DataListView* g_pDlv; -EpisodeListView* g_pElv; +DataListView* g_dlv; +EpisodeListView* g_elv; /* View settings. */ int g_bViewWatched = 1; int g_bViewTVOriginal = 1; -char g_szLimitScreenwriter[64]; +char g_currentScreenwriter[64]; static LRESULT CALLBACK CBTProc(int, WPARAM, LPARAM); static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); @@ -46,28 +46,28 @@ static void UpdateTheme(); void OnTerminate() noexcept { - const wchar_t* wszWhat = L"an exception"; - wstring_owner wsoWhy; + const wchar_t* what = L"an exception"; + wstring_owner why; try { std::rethrow_exception(std::current_exception()); } catch (const term_t& t) { - wszWhat = L"a Prolog exception"; - try { wsoWhy = PlString(t); } catch (...) {} + what = L"a Prolog exception"; + try { why = PlString(t); } catch (...) {} } catch (const Win32Error& e) { - wszWhat = L"a Windows error"; - try { wsoWhy = WsoCopy(e.WhatW()); } catch (...) {} + what = L"a Windows error"; + try { why = WsoCopy(e.WhatW()); } catch (...) {} } catch (const std::exception& e) { - try { wsoWhy = WsoFromSz(e.what()); } catch (...) {} + try { why = WsoFromSz(e.what()); } catch (...) {} } catch (...) {} - wchar_t wsz[256] = {0}; - if (wsoWhy) - wszf(wsz, L"Episode Browser was terminated due to %s: %s", wszWhat, wsoWhy.p); + wchar_t msg[256] = {0}; + if (why) + wszf(msg, L"Episode Browser was terminated due to %s: %s", what, why.p); else - wszf(wsz, L"Episode Browser was terminated due to %s.", wszWhat); + wszf(msg, L"Episode Browser was terminated due to %s.", what); - MessageBox(g_hWnd, wsz, L"Fatal Error", MB_ICONERROR); + MessageBox(g_hWnd, msg, L"Fatal Error", MB_ICONERROR); _Exit(1); } @@ -89,8 +89,8 @@ int WINAPI WinMain(const HINSTANCE hInstance, const HINSTANCE, char* const, cons icc.dwICC = ICC_WIN95_CLASSES; require(InitCommonControlsEx(&icc)); - g_hPopupMenu = require(LoadMenu((HINSTANCE)NULL, MAKEINTRESOURCE(IDR_POPUPMENU))); - g_hPopupMenu = require(GetSubMenu(g_hPopupMenu, 0)); + g_hMenuPopup = require(LoadMenu((HINSTANCE)NULL, MAKEINTRESOURCE(IDR_POPUPMENU))); + g_hMenuPopup = require(GetSubMenu(g_hMenuPopup, 0)); WNDCLASSEX wc; memset(&wc, 0, sizeof(WNDCLASSEX)); @@ -131,8 +131,8 @@ int WINAPI WinMain(const HINSTANCE hInstance, const HINSTANCE, char* const, cons /* Populate episode list view. */ Pl("track_episodes","update_tracked_episodes"); - g_pElv->Update(); - g_pElv->RestoreFocus(); + g_elv->Update(); + g_elv->RestoreFocus(); MSG msg; while (GetMessage(&msg, NULL, 0, 0) > 0) { @@ -157,16 +157,16 @@ static LRESULT CALLBACK CBTProc(const int nCode, const WPARAM wParam, const LPAR g_hWnd = (HWND)wParam; /* Look up constants. */ - if (auto opLib = maybe_make<Library>(L"User32.dll"); - auto GetDpiForWindow = opLib->GetProcAddress<UINT(HWND)>("GetDpiForWindow")) - g_iDPI = GetDpiForWindow(g_hWnd); + if (auto lib = maybe_make<Library>(L"User32.dll"); + auto GetDpiForWindow = lib->GetProcAddress<UINT(HWND)>("GetDpiForWindow")) + g_dpi = GetDpiForWindow(g_hWnd); - if (auto opLib = maybe_make<Library>(L"uxtheme.dll"); - opLib->GetProcAddress<void>("SetWindowTheme")) + if (auto lib = maybe_make<Library>(L"uxtheme.dll"); + lib->GetProcAddress<void>("SetWindowTheme")) g_bThemes = 1; - if (auto opLib = maybe_make<Library>(L"User32.dll"); - opLib->GetProcAddress<void>("SystemParametersInfo" WA)) { + if (auto lib = maybe_make<Library>(L"User32.dll"); + lib->GetProcAddress<void>("SystemParametersInfo" WA)) { NONCLIENTMETRICS m; m.cbSize = sizeof(NONCLIENTMETRICS); require(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, @@ -181,15 +181,15 @@ static LRESULT CALLBACK CBTProc(const int nCode, const WPARAM wParam, const LPAR g_hfBold = require(CreateFontIndirect(&lf)); /* Create child windows. */ - g_pDlv = new DataListView(g_hWnd); - g_pElv = new EpisodeListView(g_hWnd); + g_dlv = new DataListView(g_hWnd); + g_elv = new EpisodeListView(g_hWnd); /* Get saved view settings. */ - char* sz; + char* s; Pl("cfg","get_view_watched",&g_bViewWatched); Pl("cfg","get_view_tv_original",&g_bViewTVOriginal); - if (Pl("cfg","get_limit_screenwriter",&sz)) - strcpy_s(g_szLimitScreenwriter, sizeof(g_szLimitScreenwriter), sz); + if (Pl("cfg","get_limit_screenwriter",&s)) + strcpy_s(g_currentScreenwriter, sizeof(g_currentScreenwriter), s); return 0; } @@ -199,7 +199,7 @@ LRESULT CALLBACK WndProc(const HWND hWnd, const UINT uMsg, const WPARAM wParam, case WM_CREATE: UpdateTheme(); SetWindowPos(hWnd, NULL, -1, -1, Dpi(510), Dpi(412), SWP_NOZORDER|SWP_NOMOVE|SWP_NOACTIVATE); - SetFocus(g_pElv->hWnd); + SetFocus(g_elv->hWnd); /* Set menu item checkmarks according to saved settings. */ CheckMenuItem(GetMenu(hWnd), IDM_VIEW_WATCHED, @@ -207,13 +207,13 @@ LRESULT CALLBACK WndProc(const HWND hWnd, const UINT uMsg, const WPARAM wParam, CheckMenuItem(GetMenu(hWnd), IDM_VIEW_TV_ORIGINAL, g_bViewTVOriginal? MF_CHECKED: MF_UNCHECKED); CheckMenuItem(GetMenu(hWnd), IDM_VIEW_OTHERS, - g_szLimitScreenwriter[0]? MF_UNCHECKED: MF_CHECKED); + g_currentScreenwriter[0]? MF_UNCHECKED: MF_CHECKED); break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: - g_pElv->SaveFocus(); + g_elv->SaveFocus(); PostQuitMessage(0); break; case WM_SIZE: @@ -221,30 +221,27 @@ LRESULT CALLBACK WndProc(const HWND hWnd, const UINT uMsg, const WPARAM wParam, UpdateLayout(LOWORD(lParam), HIWORD(lParam)); break; case WM_GETMINMAXINFO: - { - MINMAXINFO* const pMMI = (MINMAXINFO*)lParam; - pMMI->ptMinTrackSize.x = Dpi(220); - pMMI->ptMinTrackSize.y = Dpi(220); + ((MINMAXINFO*)lParam)->ptMinTrackSize.x = Dpi(220); + ((MINMAXINFO*)lParam)->ptMinTrackSize.y = Dpi(220); break; - } case WM_THEMECHANGED: UpdateTheme(); UpdateLayout(); break; case 0x02E0: /* WM_DPICHANGED */ { - const RECT* const lpr = (RECT*)lParam; + const RECT* const r = (RECT*)lParam; /* Update DPI and cached metrics. */ - g_iDPI = HIWORD(wParam); + g_dpi = HIWORD(wParam); Metric<SM_CXVSCROLL> = GetSystemMetrics(SM_CXVSCROLL); prefer(SetWindowPos(hWnd, (HWND)NULL, - lpr->left, lpr->top, - lpr->right-lpr->left, - lpr->bottom-lpr->top, + r->left, r->top, + r->right-r->left, + r->bottom-r->top, SWP_NOZORDER|SWP_NOACTIVATE)); - UpdateLayout(lpr->right-lpr->left, lpr->bottom-lpr->top); + UpdateLayout(r->right-r->left, r->bottom-r->top); break; } case WM_ACTIVATE: @@ -256,35 +253,35 @@ LRESULT CALLBACK WndProc(const HWND hWnd, const UINT uMsg, const WPARAM wParam, case WA_CLICKACTIVE: SetFocus(g_hWndFocus); Pl("track_episodes","update_tracked_episodes"); - g_pElv->Redraw(); + g_elv->Redraw(); } break; case WM_NOTIFY: switch (((NMHDR*)lParam)->idFrom) { case IDC_EPISODELISTVIEW: - return g_pElv->HandleNotify(lParam); + return g_elv->HandleNotify(lParam); } break; case WM_COMMAND: { - const unsigned short wCommand = LOWORD(wParam); - switch (ID_GROUP(wCommand)) { + const unsigned short command = LOWORD(wParam); + switch (ID_GROUP(command)) { case IDG_MENU: - WndProcMainMenu(hWnd, wCommand); + WndProcMainMenu(hWnd, command); break; case IDG_CTX: - WndProcContextMenu(hWnd, wCommand); + WndProcContextMenu(hWnd, command); break; } break; } case WM_MENUSELECT: { - /* Look up status bar help for menu command. The help + /* Look up status bar tip for menu command. The tip * strings are stored in arrays, whose indices * correspond to the IDM_ values (see resource.h). */ - const wchar_t* aWszMenu[] = { + const wchar_t* vTipMenu[] = { /*IDM_FILE_EXIT*/L"Close Episode Browser.", /*IDM_FILE_REFRESH*/L"Quickly refresh episode list.", /*IDM_FILE_FETCH_DATA*/L"Fetch episode data from the web (may take a few seconds).", @@ -296,11 +293,11 @@ LRESULT CALLBACK WndProc(const HWND hWnd, const UINT uMsg, const WPARAM wParam, /*IDM_VIEW_TV_ORIGINAL*/(g_bViewTVOriginal? L"Click to hide TV original episodes.": L"Click to show TV original episodes."), - /*IDM_VIEW_OTHERS*/(g_szLimitScreenwriter? + /*IDM_VIEW_OTHERS*/(g_currentScreenwriter? L"Click to hide episodes by other screenwriters.": L"Click to show episodes by other screenwriters.") }; - const wchar_t* aWszCtx[] = { + const wchar_t* vTipCtx[] = { /*IDM_WATCH_LOCALLY*/L"Open local copy of episode, if available.", /*IDM_WATCH_ONLINE*/L"Open episode in the web browser.", /*IDM_TOGGLE*/L"Toggle watched/unwatched status.", @@ -320,14 +317,14 @@ LRESULT CALLBACK WndProc(const HWND hWnd, const UINT uMsg, const WPARAM wParam, /*IDM_RATE10*/L"Rate episode 10/10." }; - const unsigned short wCommand = LOWORD(wParam); - const unsigned short wGroup = ID_GROUP(wCommand); - const wchar_t* wsz = {0}; - if (wGroup) { - const wchar_t** aWsz = wGroup==IDG_MENU? aWszMenu: aWszCtx; - wsz = aWsz[ID_INDEX(wCommand)]; + const unsigned short command = LOWORD(wParam); + const unsigned short group = ID_GROUP(command); + const wchar_t* tip = {0}; + if (group) { + const wchar_t** const vTip = group==IDG_MENU? vTipMenu: vTipCtx; + tip = vTip[ID_INDEX(command)]; } - SendMessage(g_hWndStatus, SB_SETTEXT, MAKEWPARAM(0,0), (LPARAM)wsz); + SendMessage(g_hWndStatus, SB_SETTEXT, MAKEWPARAM(0,0), (LPARAM)tip); break; } default: @@ -338,14 +335,14 @@ LRESULT CALLBACK WndProc(const HWND hWnd, const UINT uMsg, const WPARAM wParam, } /* Process main menu commands. */ -void WndProcMainMenu(const HWND hWnd, unsigned short wCommand) +void WndProcMainMenu(const HWND hWnd, unsigned short command) { - switch (wCommand) { + switch (command) { case IDM_FILE_EXIT: PostMessage(hWnd, WM_CLOSE, 0, 0); break; case IDM_FILE_REFRESH: - g_pElv->Update(); + g_elv->Update(); break; case IDM_FILE_FETCH_DATA: WaitFor("episode_data","update_episode_data"); @@ -366,46 +363,46 @@ void WndProcMainMenu(const HWND hWnd, unsigned short wCommand) g_bViewWatched? MF_UNCHECKED: MF_CHECKED); g_bViewWatched = !g_bViewWatched; Pl("cfg","set_view_watched",g_bViewWatched); - g_pElv->Update(); - g_pElv->EnsureFocusVisible(); + g_elv->Update(); + g_elv->EnsureFocusVisible(); break; case IDM_VIEW_TV_ORIGINAL: CheckMenuItem(GetMenu(hWnd), IDM_VIEW_TV_ORIGINAL, g_bViewTVOriginal? MF_UNCHECKED: MF_CHECKED); g_bViewTVOriginal = !g_bViewTVOriginal; Pl("cfg","set_view_tv_original",g_bViewTVOriginal); - g_pElv->Update(); - g_pElv->EnsureFocusVisible(); + g_elv->Update(); + g_elv->EnsureFocusVisible(); break; case IDM_VIEW_OTHERS: /* Show/hide other screenwriters. */ - if (g_szLimitScreenwriter[0]) { + if (g_currentScreenwriter[0]) { CheckMenuItem(GetMenu(hWnd), IDM_VIEW_OTHERS, MF_CHECKED); - g_szLimitScreenwriter[0] = 0; + g_currentScreenwriter[0] = 0; } else { - const int iEpFocus = ListView_GetNextItem(g_pElv->hWnd, -1, LVNI_FOCUSED); + const int iEpFocus = ListView_GetNextItem(g_elv->hWnd, -1, LVNI_FOCUSED); if (iEpFocus == -1) break; LVITEM lvi = {LVIF_PARAM, iEpFocus}; - if (!ListView_GetItem(g_pElv->hWnd, &lvi)) break; + if (!ListView_GetItem(g_elv->hWnd, &lvi)) break; - char* sz; - if (!Pl("episode_data","episode_datum",lvi.lParam,"Screenwriter",&sz)) + char* s; + if (!Pl("episode_data","episode_datum",lvi.lParam,"Screenwriter",&s)) break; - strcpy_s(g_szLimitScreenwriter, - sizeof(g_szLimitScreenwriter), sz); + strcpy_s(g_currentScreenwriter, + sizeof(g_currentScreenwriter), s); CheckMenuItem(GetMenu(hWnd), IDM_VIEW_OTHERS, MF_UNCHECKED); } - Pl("cfg","set_limit_screenwriter",g_szLimitScreenwriter); - g_pElv->Update(); - g_pElv->EnsureFocusVisible(); + Pl("cfg","set_limit_screenwriter",g_currentScreenwriter); + g_elv->Update(); + g_elv->EnsureFocusVisible(); break; } } /* Process context menu commands. */ -void WndProcContextMenu(const HWND, unsigned short wCommand) +void WndProcContextMenu(const HWND, unsigned short command) { int cNotFound = 0; @@ -413,17 +410,17 @@ void WndProcContextMenu(const HWND, unsigned short wCommand) * selected command to each one. */ LVITEM lvi = {LVIF_PARAM, -1}; - while (g_pElv->FindNextItem(&lvi, LVNI_SELECTED)) { + while (g_elv->FindNextItem(&lvi, LVNI_SELECTED)) { /* Process rate commands. */ - if (ID_SUBGROUP(wCommand) == IDG_CTX_RATE) { - Pl("episode_data","rate_episode",lvi.lParam,ID_RATING(wCommand)); - g_pElv->UpdateItem(lvi.iItem, lvi.lParam); + if (ID_SUBGROUP(command) == IDG_CTX_RATE) { + Pl("episode_data","rate_episode",lvi.lParam,ID_RATING(command)); + g_elv->UpdateItem(lvi.iItem, lvi.lParam); continue; } /* Process other commands. */ - switch (wCommand) { + switch (command) { case IDM_WATCH_LOCALLY: if (!Pl("local_episode","open_episode_locally",lvi.lParam)) cNotFound++; @@ -440,8 +437,8 @@ void WndProcContextMenu(const HWND, unsigned short wCommand) break; case IDM_LOOKUP: Pl("episode_data","retract_episode",lvi.lParam); - g_pElv->UpdateItem(lvi.iItem, lvi.lParam); - g_pDlv->ShowEpisode(lvi.lParam); + g_elv->UpdateItem(lvi.iItem, lvi.lParam); + g_dlv->ShowEpisode(lvi.lParam); break; case IDM_WIKI: Pl("episode_data","open_episode_wiki",lvi.lParam); @@ -449,38 +446,38 @@ void WndProcContextMenu(const HWND, unsigned short wCommand) } } - g_pElv->Redraw(); + g_elv->Redraw(); if (cNotFound == 1) { EBMessageBox(L"Episode could not be opened locally.", L"Error", MB_ICONWARNING); } else if (cNotFound) { - wchar_t wsz[64] = {0}; - wszf(wsz, L"%d episodes could not be opened locally.", cNotFound); - EBMessageBox(wsz, L"Error", MB_ICONWARNING); - } else if (ID_SUBGROUP(wCommand) == IDG_CTX_RATE) { - g_pElv->Sort(); - g_pElv->ShowFocus(); + wchar_t msg[64] = {0}; + wszf(msg, L"%d episodes could not be opened locally.", cNotFound); + EBMessageBox(msg, L"Error", MB_ICONWARNING); + } else if (ID_SUBGROUP(command) == IDG_CTX_RATE) { + g_elv->Sort(); + g_elv->ShowFocus(); } } /* Call Prolog predicate in other thread, if available. */ -void WaitFor(const char* szMod, const char* szPred) +void WaitFor(const char* mod, const char* pred) { static atom_t aThread; static int bActive; static int iTimer; - static wstring_owner wsoPred; + static wstring_owner activePred; if (bActive) { - wchar_t wsz[256] = {0}; - wszf(wsz, L"Another task (%s) is active. " + wchar_t msg[256] = {0}; + wszf(msg, L"Another task (%s) is active. " L"Do you want to cancel the existing task and start a new one?", - wsoPred.p); - if (EBMessageBox(wsz, L"Error", MB_YESNO|MB_ICONWARNING) != IDYES) + activePred.p); + if (EBMessageBox(msg, L"Error", MB_YESNO|MB_ICONWARNING) != IDYES) return; KillTimer(NULL, iTimer); bActive = 0; - g_pElv->Update(); + g_elv->Update(); } /* The timer procedure animates an ellipsis in the status bar @@ -498,14 +495,14 @@ void WaitFor(const char* szMod, const char* szPred) KillTimer(NULL, iTimer); i = 0; bActive = 0; - g_pElv->Update(); + g_elv->Update(); } }; - Plx(szMod,"thread_create",szPred,&aThread); + Plx(mod,"thread_create",pred,&aThread); SendMessage(g_hWndStatus, SB_SETTEXT, MAKEWPARAM(1,0), (LPARAM)L"."); if (prefer(iTimer = SetTimer(NULL, -1, 500, proc))) { - wsoPred = WsoFromSz(szPred); + activePred = WsoFromSz(pred); bActive = 1; } } @@ -544,11 +541,11 @@ void UpdateLayout(int w, int h) /* Resize list views. */ const long pad = IsThemeActive()? Dpi(6): 0; /* Add padding in modern themes. */ - const long cyDlv = rrStatus.top-g_pDlv->Height()-pad; - require(SetWindowRect(g_pDlv->hWnd, pad, cyDlv, rc.right-pad, rrStatus.top-pad)); - require(SetWindowRect(g_pElv->hWnd, pad, pad, rc.right-pad, cyDlv-pad)); - g_pDlv->ResizeColumns(rc.right-pad-pad); - g_pElv->ResizeColumns(rc.right-pad-pad); + const long cyDlv = rrStatus.top-g_dlv->Height()-pad; + require(SetWindowRect(g_dlv->hWnd, pad, cyDlv, rc.right-pad, rrStatus.top-pad)); + require(SetWindowRect(g_elv->hWnd, pad, pad, rc.right-pad, cyDlv-pad)); + g_dlv->ResizeColumns(rc.right-pad-pad); + g_elv->ResizeColumns(rc.right-pad-pad); /* Resize status bar parts. */ const int aParts[] = {rc.right-Dpi(55), rc.right}; @@ -564,6 +561,6 @@ void UpdateTheme() { if (!g_bThemes) return; const BOOL bThemeActive = IsThemeActive(); - g_pDlv->UpdateTheme(bThemeActive); - g_pElv->UpdateTheme(bThemeActive); + g_dlv->UpdateTheme(bThemeActive); + g_elv->UpdateTheme(bThemeActive); } |