aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/wac/wac.h
blob: d19f56158e7366028df13a78d18afb874e032618 (plain) (blame)
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