aboutsummaryrefslogtreecommitdiff
path: root/c/defs.h
blob: 5a6a25acdef020be3f9bc4ff8b846e840f626456 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#ifndef DEFS_H
#define DEFS_H

#include <memory>
#include <optional>
#include <windows.h>
#include <commctrl.h>
#include <SWI-Prolog.h>

/* common.cpp */
TCHAR *TszFromSz(const char *, int);
struct Library
{
	Library(const TCHAR *);
	~Library();
	FARPROC GetProcAddress(const char *);
private:
	HMODULE m_hModule;
};

/* main.cpp */
void UpdateLayout();

/* listview.cpp */
struct ListView
{
	ListView(HMENU, DWORD);
	int Height(int = -1);
	HWND HWnd(void) const;
	virtual void UpdateTheme(BOOL);
	virtual LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
protected:
	int m_bHeader = 1;
	WNDPROC m_prevProc;
	HWND m_hWnd;
};

/* episodelistview.cpp */
struct EpisodeListView : public ListView
{
	EpisodeListView(void);
	void DoSort(void);
	void EnsureFocusVisible(void);
	LRESULT HandleNotify(LPARAM);
	int ISort(void) const;
	void Redraw(void);
	void SaveFocus(void);
	void SetTop(int);
	void RestoreFocus(void);
	void SelectUnwatched(int);
	void ShowFocus(void);
	void Update(void);
	void UpdateItem(LPLVITEM);
	LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM) override;
private:
	int m_iSort;
	LVITEM m_lviFocus;
	friend int CALLBACK ElvSort(LPARAM, LPARAM, LPARAM);
};

/* datalistview.cpp */
struct DataListView : public ListView
{
	DataListView(void);
	void ShowEpisode(int);
};

/* pl.cpp */
int Plx(const char *, const char *);
struct Query
{
	Query(module_t ctx, predicate_t p, term_t t0);
	~Query();
	int Cut();
	int Close();
	int NextSolution();
private:
	qid_t m_q;
};

/* Polymorphic aliases for PL_put_*, PL_get_*. */
inline int PlPut(term_t t, int x) { return PL_put_integer(t, x); }
inline int PlPut(term_t t, long x) { return PL_put_integer(t, x); }
inline int PlPut(term_t t, long long x) { return PL_put_integer(t, x); }
inline int PlPut(term_t t, atom_t x) { return PL_put_atom(t, x); }
inline int PlPut(term_t t, char *x) { return PL_put_atom(t, PL_new_atom(x)); }
inline int PlPut(term_t t, const char *x) { return PL_put_atom(t, PL_new_atom(x)); }
inline int PlPut(term_t t, int *x) { return -1; }
inline int PlPut(term_t t, long *x) { return -1; }
inline int PlPut(term_t t, long long *x) { return -1; }
inline int PlPut(term_t t, atom_t *x) { return -1; }
inline int PlPut(term_t t, char **x) { return -1; }

inline int PlGet(term_t t, int x) { return -1; }
inline int PlGet(term_t t, long x) { return -1; }
inline int PlGet(term_t t, long long x) { return -1; }
inline int PlGet(term_t t, atom_t x) { return -1; }
inline int PlGet(term_t t, char *x) { return -1; }
inline int PlGet(term_t t, const char *x) { return -1; }
inline int PlGet(term_t t, int *x) { return PL_get_integer(t, x); }
inline int PlGet(term_t t, long *x) { return PL_get_long(t, x); }
inline int PlGet(term_t t, long long *x) { return PL_get_int64(t, x); }
inline int PlGet(term_t t, atom_t *x) { return PL_get_atom(t, x); }
inline int PlGet(term_t t, char **x) { return PL_get_atom_chars(t, x); }

/* Helper templates for Plx, Pl. */
template <typename T>
int PlPutv(term_t t, T arg) { return PlPut(t, arg); }
template <typename T, typename ...R>
int PlPutv(term_t t, T arg, R... rest) { return PlPut(t, arg)? PlPutv(t+1, rest...): 0; }
template <typename T>
int PlGetv(term_t t, T arg) { return PlGet(t, arg); }
template <typename T, typename ...R>
int PlGetv(term_t t, T arg, R... rest) { return PlGet(t, arg)? PlGetv(t+1, rest...): 0; }
template <typename T>
int Countv(int i, T arg) { return i+1; }
template <typename T, typename ...R>
int Countv(int i, T arg, R... rest) { return Countv(i+1, rest...); }

/* Call Prolog predicate, propagating Prolog exceptions. */
template <typename ...T>
int Plx(const char *szMod, const char *szPred, T... args)
{
	int iArity = Countv(0, args...);
	term_t t = PL_new_term_refs(iArity);
	if (!PlPutv(t, args...)) return 0;
	Query q(NULL, PL_predicate(szPred, iArity, szMod), t);
	if (!q.NextSolution()) return 0;
	if (!PlGetv(t, args...)) return 0;
	return 1;
}

/* Call Prolog predicate, ignoring Prolog exceptions. */
inline int Pl(const char *szMod, const char *szPred)
{
	try {
		return Plx(szMod, szPred);
	} catch (term_t &t) {
		return 0;
	}
}
template <typename ...T>
int Pl(const char *szMod, const char *szPred, T... args)
{
	try {
		return Plx(szMod, szPred, args...);
	} catch (term_t &t) {
		return 0;
	}
}

/* defs.h */
#ifdef UNICODE
#define WA "W"
#else
#define WA "A"
#endif

#define DLVSIKEY 0
#define DLVSIVALUE 1
#define ELVSIEPISODE 0
#define ELVSITITLE 1
#define ELVSIRATING 2

inline int Cmp(int a, int b)
{
	if (a == b)
		return 0;
	if (a > b)
		return 1;
	return -1;
}

inline int Dpi(int i)
{
	extern int g_iDPI;
	return MulDiv(i, g_iDPI, 96);
}

template <class T, typename ...A>
std::optional<T> try_make(A ...args)
{
	try {
		return T(args...);
	} catch (...) {
		return {};
	}
}

#endif