aboutsummaryrefslogtreecommitdiff
path: root/c/defs.h
blob: f57989cd5a8ec79244fa1eabb637b4f7ac345aa7 (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
#ifndef DEFS_H
#define DEFS_H

#include <memory>
#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 *);
	static std::unique_ptr<Library> Load(const TCHAR *);
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 Pl(const char *, const char *);

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); }

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...); }
template <typename ...T>
int Pl(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;
	if (!PL_call_predicate(NULL, PL_Q_NORMAL, PL_predicate(szPred, iArity, szMod), t))
		return 0;
	if (!PlGetv(t, args...)) return 0;
	return 1;
}

/* 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);
}

#endif