aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
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 GetLastError() as default for Win32Error.John Ankarström
2022-07-20Improve ANSI compatibility.John Ankarström
This improves upon 79d4fa6. Actually, ANSI compatibility may be desirable, as recent work has been done to make the A versions of Windows API functions work with UTF-8.
2022-07-20Fix ANSI compatibility.John Ankarström
It's not very useful, but it's a fun exercise.
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-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 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-19Add comments.John Ankarström
2022-07-19Remove EBMessageBoxA.John Ankarström
2022-07-19Use Prolog string buffer marks.John Ankarström
Speaking of unclear documentation, it is not obvious whether it is necessary for programs calling into Prolog to manually mark and release strings. I suppose that it should be, if the same logic that applies to terms apply to strings. On the other hand, the stack in which the strings are stored belongs to Prolog, and there is nothing that would prevent Prolog from cleaning up the strings when called at a later time. I am not sure. But better safe than sorry, I guess. The Mark class acts like the Frame class. The constructor and destructor are equivalent to the PL_STRINGS_MARK and PL_STRINGS_RELEASE macros. Unlike for 34c3280, I did not notice any differences in memory usage after this change. Perhaps that is because it has no effect; perhaps it is because Prolog's stack is very big.
2022-07-19Fix Prolog memory leaks.John Ankarström
Apparently foreign frames ARE needed when calling Prolog from C. The official documentation is very terse and could make this clearer. To summarize, whenever a term is created (e.g., PL_new_term_refs), its reference count is increased by one. It is garbage-collected when its reference count hits zero. But the reference count is never decreased unless (a) control returns to Prolog after executing a foreign predicate -- which does not happen in my application -- or (b) the foreign frame in which the term was created is closed. In other words, terms must be created within a foreign frame. This is achieved by initializing a Frame object before creating the term and destroying it once the term has served its purpose. The destructor for Frame does not DISCARD the frame, only CLOSE it. The former would also invalidate all data bound by the terms, which is usually undesirable.
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-18Avoid leak in Prolog interface.John Ankarström
PL_new_atom(_wchars) creates an atom with a reference count of one, which is never decreased, and the atom is thus never garbage collected.
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-18Use -O2 instead of -O.John Ankarström
2022-07-18Makefile: Add assembly target.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-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-17Use SWI-Prolog's wide-character functions.John Ankarström
This avoids the use of TsmFromSz.
2022-07-17makedeps: Fix regular expression.John Ankarström
2022-07-16Formatting.John Ankarström
2022-07-16README: Add information about Hungarian notation.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-16Ensure c++-mode is used in header files.John Ankarström
2022-07-15Makefile: Make deps.mk silently.John Ankarström
2022-07-15Add showdeps script.John Ankarström