aboutsummaryrefslogtreecommitdiff
path: root/c/main.cpp
AgeCommit message (Collapse)Author
2022-07-22Cache GetSystemMetrics values with variable template.John Ankarström
The variable template could be generalized like this: template <auto F, auto... A> const auto cache = F(A...); and instantiated like: cache<GetSystemMetrics, SM_CXVSCROLL> It would still be limited to constant function arguments, which usually isn't a problem for GetSystemMetrics, but might be for other functions.
2022-07-22Set owner of termination message box.John Ankarström
If the main window exists, it is probably a good idea for the message box to be owned by it. Otherwise, the user may continue to interact with the main window. Of course, that could sometimes be a benefit, but it SEEMS a bit unsafe... I might change this in the future.
2022-07-21Simplify OnTerminate.John Ankarström
No, not "awful", AWFUN! Speaking of AWFUN, here is an alternative implementation of it: #define AWFUN(t, f) cond_fun<t, f##A, f##W> template <typename T, auto F, auto G> std::enable_if_t<std::is_same_v<T, char>, decltype(F)> cond_fun = F; template <auto F, auto G> auto cond_fun<wchar_t, F, G> = G; This implementation uses a variable template instead of a function template, but I decided against it, as (at least I think) it would instantiate useless variables that merely point to pre-existing API functions. Like, auto cond_fun__wchar_t__blablabla = MessageBoxW; auto cond_fun__char__blablabla = MessageBoxA; which is quite useless. Better to just have a constexpr function, which the compiler may inline, return the real function pointer.
2022-07-20Improve fatal error messages.John Ankarström
As the message box has no owner (because the main window may not be initialized yet), it may be unclear which application is being terminated.
2022-07-20Simplify UpdateLayout.John Ankarström
2022-07-20Simplify require, prefer.John Ankarström
2022-07-20Use template instead of Win32Error::twhat.John Ankarström
2022-07-20Fix timer.John Ankarström
2022-07-20Fix bug in and rename throw_nil, warn_nil.John Ankarström
In warn_nil, the return value was undefined on exception -- I think. While informative, the names throw_nil and warn_nil don't work very well in conditionals: if (warn_nil<f>(...)) g(); sounds like g should be called if f returns nil and a warning is issued. But it is actually the other way around; g is called if f is successful. if (prefer<f>(...)) g(); sounds less like that.
2022-07-19Check Windows API calls for errors more consistently.John Ankarström
Some of the checks are likely redundant, but the Windows API documentation rarely makes it clear WHICH errors may be returned (and under which circumstances) rather than simply WHETHER errors may be returned (under any circumstances, including those that do not apply in the given case).
2022-07-19Remove old comment.John Ankarström
2022-07-19Formatting.John Ankarström
2022-07-19Remove CreateStatusBar function.John Ankarström
2022-07-19Use static member function instead of friend function.John Ankarström
2022-07-19Implement centered message box.John Ankarström
2022-07-18Improve Library::GetProcAddress.John Ankarström
It isn't really more safe, but it removes the need for a confusing function pointer cast, which is easy to get wrong. As far as the compiler is concerned, the result is literally the same, but it does force the caller to (indirectly, via the template parameter) cast the return value, which may be a good thing.
2022-07-18Solve compiler warnings.John Ankarström
2022-07-18Add Unicode support to Win32Error.John Ankarström
2022-07-18Improve exception message.John Ankarström
2022-07-18Fix typo.John Ankarström
2022-07-18Formatting.John Ankarström
2022-07-18Fix 26bc4109.John Ankarström
Apparently, = {0} does not zero a structure in C++.
2022-07-18Ensure that CBT hook is set and unset correctly.John Ankarström
2022-07-17Prefer f() over f(void).John Ankarström
f(void) is a C-ism that is valid but unnecessary in C++.
2022-07-17Make ListView hWnd public.John Ankarström
A getter offers encapsulation, but it is also less transparent in a sense. Thinking of ListView as a struct, it is natural to expose hWnd as a public member variable.
2022-07-17Update type names and variable prefixes.John Ankarström
2022-07-17Add const to pointers, update spacing.John Ankarström
It seems that "right-spaced" pointers are more widely used among C++ programmers.
2022-07-17Add const to places.John Ankarström
Note that I did NOT add const to non-pointer/non-reference arguments in function declarations (without a following definition), as they do not mean anything there.
2022-07-16Formatting.John Ankarström
2022-07-16Rewrite TszFromSz as TsmFromSz.John Ankarström
I.e. using std::basic_string<TCHAR> instead of TCHAR *. This removes all unmanaged frees.
2022-07-16Add m_hWndParent to ListView.John Ankarström
This avoids g_hWnd.
2022-07-15Split defs.h into separate header files.John Ankarström
This is feasible now that the makedeps script exists to automatically manage build dependencies (see 6034fe2, d00f8b3).
2022-07-15Add Win32Error exception class.John Ankarström
2022-07-15Show error and exit gracefully on uncaught exception.John Ankarström
2022-07-15Use std::optional instead of std::unique_ptr for try_make.John Ankarström
This requires C++17.
2022-07-15Replace Library::Load with try_make_unique template.John Ankarström
2022-07-15Don't crash on Prolog exceptions.John Ankarström
In the future, it may be desirable to convert Prolog exceptions to C++ exceptions.
2022-07-15Reimplement Pl with variadic templatesJohn Ankarström
This is a bit safer and about as complex.
2022-07-15Change declaration style.John Ankarström
2022-07-15Add wrapper for LoadLibrary, FreeLibrary.John Ankarström
2022-07-14Prevent rating column from being invisible.John Ankarström
Bug introduced in 26f70ab. DataListView was initialized with g_iDPI set to -1, which is obviously incorrect. The default value of -1 is a remnant of earlier code and is no longer necessary.
2022-07-14Minor formal changes.John Ankarström
Height(DLVSIKEY) was incorrect. The argument to Height is supposed to be a boolean value, in this case false. It happened to work because DLVSIKEY is 0 (because Key is the 0th column in the data list view).
2022-07-14Initialize global variables in the right place.John Ankarström
The rules for what messages are sent at window creation -- and in which order -- are neither intuitive or clear. WM_CREATE can NOT be relied upon to initialize global state required by handlers of other messages (such as WM_GETMINMAXINFO, which seems to be sent before WM_CREATE). Thus, the better solution is to initialize everything using a CBT hook before the window procedure is even run. Because CBTProc creates (child): windows of its own, though, one must be careful to only run the initialization once, which is done by checking g_hWnd.
2022-07-11Improve ElvSort.John Ankarström
2022-07-11Refactor, adjust minimum window size.John Ankarström
2022-07-10Convert to C++.John Ankarström
I already hit upon some object-oriented programming patterns in *listview.c, so I felt that it would be natural to use this as an opportunity to learn C++.