aboutsummaryrefslogtreecommitdiff
path: root/c/common.h
AgeCommit message (Collapse)Author
2022-07-24Improve window layout.John Ankarström
This reverts much of 97f0a27. 1. It turns out not to be a good idea to resize the list view columns based on the list view window's own rectangle, as it will change depending on whether a scrollbar is visible. The problem is that resizing the columns may add a horizontal scrollbar -- which in turn may add a vertical scrollbar. 2. The WS_EX_CLIENTEDGE style does not look very good in "modern" (non-classic) themes. In 97f0a27, I tried solving this by extending the dimensions of the child windows such that their edges were hidden. However, this type of overlapping causes problems with the status bar. My new solution is to instead *reduce* the child windows' dimensions. This achieves a visual impression similar to the thicker (more well-designed) edges of the "classically themed" list view control. To make it look even better, the main window background is changed from COLOR_WINDOWFRAME (white) to COLOR_WINDOW (light gray).
2022-07-23Fix display of Unicode text.John Ankarström
Turns out that SWI-Prolog's wide string functions, which I started using in 03fe361, do not convert between narrow Prolog atoms and wide C strings, as I mistakenly thought. Instead, they work with wide Prolog atoms. In hindsight, it is not surprising.
2022-07-23Improve UpdateLayout and ResizeColumns.John Ankarström
This incidentally removes the need for the variable template introduced by 21e96c6. I'm sure it will be needed at some point, though.
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-22Simplify AWTEXT, AWFUN.John Ankarström
Not quite so awful anymore.
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-20Simplify UpdateLayout.John Ankarström
2022-07-20Simplify require, prefer.John Ankarström
2022-07-20Use GetLastError() as default for Win32Error.John Ankarström
2022-07-20Use template instead of Win32Error::twhat.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-20Simplify templates.John Ankarström
2022-07-19Use std::declval.John Ankarström
This is equivalent, but it may be useful to highlight that `args' does not HAVE to be declared in order to get the return type of the function call.
2022-07-19Formatting.John Ankarström
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 EBMessageBoxA.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-17Prefer f() over f(void).John Ankarström
f(void) is a C-ism that is valid but unnecessary in C++.
2022-07-17Name function arguments in headers.John Ankarström
This is obviously a lot less obtuse.
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-17Remove TsmFromSz.John Ankarström
If needed in the future, it is possible to simply copy it from the Git history.
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-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-02-15Combine header files.John Ankarström
Some older UNIX programs are organized like this, and I think it gives a very good overview over the code. See troff for an example.
2022-02-15Rework list view code.John Ankarström