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
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
|
#ifndef _WAC_H
#define _WAC_H
#include <api/wac/compdb.h>//CUT
#include <bfc/ptrlist.h>
#include <api/config/items/cfgitemi.h>
class ifc_canvas; // see canvas.h
class CfgItem; // see cfgitem
class CfgItemI;
class ComponentAPI; // see api.h
class api_window; // see rootwnd.h
class LoadableResource; // see below
// this tells wasabi what version of the SDK we're compiled with
// this number will be incremented every once in a while. when it is, you'll
// have to recompile
// 5 -> build #471
// 6 -> build rc1
// 7 -> build 484 (rc5)
// 8 -> Winamp 5.23 (build 608)
// 9 -> Winamp 5.4
#define WA_COMPONENT_VERSION 9
#define DB_DENY 0
#define DB_ALLOW 1
// commands for onNotify below
#define WAC_NOTIFY_NOP 0
#define WAC_NOTIFY_ACTIVATE 10
#define WAC_NOTIFY_DEACTIVATE 20
#define WAC_NOTIFY_FULLSCREEN 30
#define WAC_NOTIFY_RESTORE 40
#define WAC_NOTIFY_ENTERRESIZE 50
#define WAC_NOTIFY_LEAVERESIZE 51
#define WAC_NOTIFY_SYSTRAYDONE 60
#define WAC_NOTIFY_POPUPDONE 61
#define WAC_NOTIFY_BASETEXTUREWINDOW 78
#define WAC_NOTIFY_LOADEARLY 90
#define WAC_NOTIFY_MENU_COMMAND 10000
// this message is sent when service runlevel notifies are sent
// param1 = msg
// param2 = param1
// param3 = param2
#define WAC_NOTIFY_SERVICE_NOTIFY 100
#define WAC_NOTIFY_SKINUNLOADING 0xE300 // before unloading current skin
#define WAC_NOTIFY_SWITCHINGSKIN 0xE301 // right after unloading current skin and right before loading new one, getSkinName/Path points to new skin
#define WAC_NOTIFY_SKINELEMENTSLOADED 0xE302 // after skin elements definitions are loaded
#define WAC_NOTIFY_BEFORELOADINGSKINELEMENTS 0xE303 // before skin elements definitions are loaded, trap this to load your elements/groups and let people override them
#define WAC_NOTIFY_SKINGUILOADED 0xE304 // after skin GUI objects are loaded from xml
#define WAC_NOTIFY_SKINLOADED 0xE305 // after skin is fully loaded
enum {
RSF_STATIC=0,
RSF_RELATIVETOWAC=1,
RSF_RELATIVETOTHEME=2,
};
// -----------
#include <bfc/dispatch.h>
class NOVTABLE WaComponent : public Dispatchable {
public:
// provide your component name & other info here
const wchar_t *getName() { return _call(GETNAME, (wchar_t *)NULL); }
GUID getGUID() { return _call(GETGUID, INVALID_GUID); }
#ifdef WASABINOMAINAPI
void registerServices(api_service *a) { _voidcall(REGISTERSERVICES2, a); }
#else
void registerServices(ComponentAPI *a) { _voidcall(REGISTERSERVICES, a); }
#endif
void deregisterServices() { _voidcall(DEREGISTERSERVICES); }
void onCreate() { _voidcall(ONCREATE); }
void onDestroy() { _voidcall(ONDESTROY); }
//DEPRECATED: will go away
api_window *createWindow(int n, api_window *parentWnd) { return _call(CREATEWINDOW, (api_window*)NULL, n, parentWnd); }
int onNotify(int cmd, int param1=0, int param2=0, int param3=0, int param4=0){
return _call(ONNOTIFY, 0, cmd, param1, param2, param3, param4);
}
// everything after cmd is for future expansion
int onCommand(const wchar_t *cmd, int param1, int param2, void *ptr, int ptrlen){
return _call(ONCOMMAND, 0, cmd, param1, param2, ptr, ptrlen);
}
// gets the CfgItem * from WAComponentClient
CfgItem *getCfgInterface(int n) {
return _call(GETCFGINTERFACE, (CfgItem*)NULL, n);
}
// saves the OSMODULEHANDLE of your WAC for you
void setOSModuleHandle(OSMODULEHANDLE modulehandle) {
_voidcall(SETOSMODULEHANDLE, modulehandle);
}
OSMODULEHANDLE getOSModuleHandle() {
return _call(GETOSMODULEHANDLE, (OSMODULEHANDLE)0);
}
// saves the path of your WAC for you
void setComponentPath(const wchar_t *path) {
_voidcall(SETPATH, path);
}
const wchar_t *getComponentPath() {
return _call(GETPATH, (const wchar_t *)NULL);
}
enum {
GETNAME=100,
GETGUID=120,
REGISTERSERVICES=200,
REGISTERSERVICES2=210,
ONCREATE=400,
ONDESTROY=410,
CREATEWINDOW=420,
ONNOTIFY=500,
ONCOMMAND=600,
GETCFGINTERFACE=800,
SETHINSTANCE=900, SETOSMODULEHANDLE=900, // note dups for back-compat
GETHINSTANCE=910, GETOSMODULEHANDLE=910, // note dups for back-compat
DEREGISTERSERVICES=1000,
SETPATH=1100,
GETPATH=1200,
};
};
// hides the dispatchable interface
class NOVTABLE WaComponentI : public WaComponent {
protected:
WaComponentI() {} // protect constructor
public:
virtual const wchar_t *getName()=0;
virtual GUID getGUID()=0;
#ifdef WASABINOMAINAPI
virtual void registerServices(api_service *)=0;
#else
virtual void registerServices(ComponentAPI *)=0;
#endif
virtual int RegisterServicesSafeModeOk()=0;
virtual void deregisterServices()=0;
virtual void onCreate()=0;
virtual void onDestroy()=0;
virtual api_window *createWindow(int n, api_window *parentWnd)=0; //DEPRECATED
virtual int onNotify(int cmd, int param1, int param2, int param3, int param4)=0;
virtual int onCommand(const wchar_t *cmd, int param1, int param2, void *ptr, int ptrlen)=0;
virtual CfgItem *getCfgInterface(int n)=0;
virtual void setOSModuleHandle(OSMODULEHANDLE moduleHandle)=0;
virtual OSMODULEHANDLE getOSModuleHandle()=0;
virtual void setComponentPath(const wchar_t *path)=0;
virtual const wchar_t *getComponentPath()=0;
private:
virtual void internal_onDestroy()=0;
virtual int internal_onNotify(int cmd, int param1, int param2, int param3, int param4)=0; // calls thru to onNotify after processing
RECVS_DISPATCH;
};
class waServiceFactoryI;
/**
*/
class NOVTABLE WAComponentClient : public WaComponentI, public CfgItemI
{
protected:
WAComponentClient(const wchar_t *name=NULL);
public:
virtual ~WAComponentClient() {}
// provide your component name & other info here
virtual const wchar_t *getName(); //OVERRIDE ME (or just set name in constructor)
virtual GUID getGUID()=0; // be sure to override this one //OVERRIDE ME
#ifdef WASABINOMAINAPI
void registerServices(api_service *); // don't override
#else
void registerServices(ComponentAPI *); // don't override
#endif
int RegisterServicesSafeModeOk();
void deregisterServices(); // don't override
// override these to receive notifications
virtual void onRegisterServices() {}// register extra services here
virtual void onCreate() {} // init stuff
virtual void onDestroy() {} // destroy everything here, not in ~
//DEPRECATED: will go away
// this is moving to svc_wndcreate
virtual api_window *createWindow(int n, api_window *parentWnd) { return NULL; }
// OVERRIDE ME for various events
virtual int onNotify(int cmd, int param1, int param2, int param3, int param4) { return 0; }
// everything after cmd is for future expansion
virtual int onCommand(const wchar_t *cmd, int param1, int param2, void *ptr, int ptrlen) { return 0; }
// config ptr... you can override this and provide a different *
// otherwise 'this' will be returned
virtual CfgItem *getCfgInterface(int n);
// saves the OSMODULEHANDLE of your WAC for you
void setOSModuleHandle(OSMODULEHANDLE moduleHandle) { OSModuleHandle = moduleHandle; };
OSMODULEHANDLE getOSModuleHandle() { return OSModuleHandle; }
void setComponentPath(const wchar_t *path) { componentpath = path; };
const wchar_t *getComponentPath() { return componentpath; }
OSMODULEHANDLE gethInstance() { return getOSModuleHandle(); } //DEPRECATED
// various options to register during your constructor, like services,
// skin parts, and autopop guids. just register them and forget them
void registerService(waServiceFactoryI* service);
void registerSkinFile(const wchar_t *filename, int relative=RSF_RELATIVETOWAC);
/* benski> cut
void registerAutoPopup(GUID guid, const wchar_t *description, const wchar_t *prefered_container=NULL, int container_required=FALSE);
void registerAutoPopup(const wchar_t *groupid, const wchar_t *description, const wchar_t *container_layout=NULL, int container_required=FALSE);
void registerCfgItem(CfgItemI *cfgitem, int autodelete=FALSE);
void registerExtension(const wchar_t *extension, const wchar_t *description, const wchar_t *family=NULL);
void registerCallback(SysCallback *_callback, void *_param = NULL);
void registerPrefGroup(const wchar_t *groupname, const wchar_t *dest, GUID pref_guid, GUID pref_guid_parent=INVALID_GUID);*/
// or register your own resource types here
void registerResource(LoadableResource *res);
virtual void onSkinLoaded() {}
private:
virtual void internal_onDestroy();
virtual int internal_onNotify(int cmd, int param1, int param2, int param3, int param4);
OSMODULEHANDLE OSModuleHandle;
int postregisterservices; // if 1, onRegisterServices has been called
PtrList<LoadableResource> resources;
StringW componentpath;
};
extern "C" {
typedef void (*WACINIT)(OSMODULEHANDLE);
typedef UINT (*WACGETVERSION)(void); // returns the interface version component was compiled with
typedef WaComponent *(*WACENUMCOMPONENT)(int n);
};
class LoadableResource {
public:
virtual ~LoadableResource() {}
virtual int deleteOnShutdown() { return TRUE; } // return FALSE if you're static
virtual void onRegisterServices() {}
virtual void onDeregisterServices() {} // unload during this one
virtual void beforeLoadingSkinElements() {}
};
#endif
|