winamp/Src/Winamp/ipc_pe.h

171 lines
5.4 KiB
C
Raw Normal View History

2024-09-24 14:54:57 +02:00
#ifndef __IPC_PE_H
#define __IPC_PE_H
/*
** To use these messages you will need a valid window handle for the playlist window
** and the format to use them is:
**
** SendMessageW(playlist_wnd,WM_WA_IPC,IPC_*,(parameter));
**
** Note:
** This IS the OPPOSITE way to how the messages to the main winamp window are sent
** SendMessageW(hwnd_winamp,WM_WA_IPC,(parameter),IPC_*);
*/
/*
** Playlist Window:
**
** To get the playlist window there are two ways depending on the version you're using
**
** HWND playlist_wnd = 0;
** int wa_version = SendMessageW(plugin.hwndParent,WM_WA_IPC,0,IPC_GETVERSION);
**
** if(wa_version >= 0x2900)
** {
** // use the built in api to get the handle
** playlist_wnd = (HWND)SendMessageW(plugin.hwndParent,WM_WA_IPC,IPC_GETWND_PE,IPC_GETWND);
** }
**
** // if it failed then use the old way :o)
** if(!IsWindow(playlist_wnd))
** {
** playlist_wnd = FindWindow("Winamp PE",0);
** }
*/
/*
** Structures used by some of the apis referenced.
*/
typedef struct {
char file[MAX_PATH];
int index;
} fileinfo;
typedef struct {
wchar_t file[MAX_PATH];
int index;
} fileinfoW;
typedef struct {
HWND callback;
int index;
} callbackinfo;
typedef struct {
int fileindex;
char filetitle[256];
char filelength[16];
} fileinfo2;
typedef struct {
int fileindex;
wchar_t filetitle[256];
wchar_t filelength[16];
} fileinfo2W;
#define IPC_PE_GETCURINDEX 100 // returns current idx (typically the playing item)
#define IPC_PE_GETINDEXTOTAL 101 // returns the number of items in the playlist
#define IPC_PE_GETINDEXINFO 102 // (copydata) lpData is of type callbackinfo, callback is called with copydata/fileinfo structure and msg IPC_PE_GETINDEXINFORESULT
#define IPC_PE_GETINDEXINFORESULT 103 // callback message for IPC_PE_GETINDEXINFO
#define IPC_PE_DELETEINDEX 104 // lParam = index
#define IPC_PE_SWAPINDEX 105 // (lParam & 0xFFFF0000) >> 16 = from, (lParam & 0xFFFF) = to
/*
** SendMessageW(playlist_wnd,WM_WA_IPC,IPC_PE_SWAPINDEX,MAKELPARAM(from,to));
*/
#define IPC_PE_INSERTFILENAME 106 // (copydata) lpData is of type fileinfo
#define IPC_PE_INSERTFILENAMEW 114 // (copydata) lpData is of type fileinfoW (5.3+)
/* COPYDATASTRUCT cds = {0};
** fileinfo f = {0};
**
** lstrcpyn(f.file, file,MAX_PATH); // path to the file
** f.index = position; // insert file position
**
** cds.dwData = IPC_PE_INSERTFILENAME;
** cds.lpData = (void*)&f;
** cds.cbData = sizeof(fileinfo);
** SendMessageW(playlist_wnd,WM_COPYDATA,0,(LPARAM)&cds);
*/
#define IPC_PE_GETDIRTY 107 // returns 1 if the playlist changed since the last IPC_PE_SETCLEAN
#define IPC_PE_SETCLEAN 108 // resets the dirty flag until next modification
#define IPC_PE_GETIDXFROMPOINT 109 // pass a point param and will return a playlist index (if in the area)
/*
** POINT pt;
** RECT rc;
**
** // Get the current position of the mouse and the current client area of the playlist window
** // and then mapping the mouse position to the client area
** GetCursorPos(&pt);
**
** // Get the client area of the playlist window and then map the mouse position to it
** GetClientRect(playlist_wnd,&rc);
** ScreenToClient(playlist_wnd,&pt);
**
** // this corrects so the selection works correctly on the selection boundary
** // appears to happen on the older 2.x series as well
** pt.y -= 2;
**
** // corrections for the playlist window area so that work is only done for valid positions
** // and nicely enough it works for both classic and modern skin modes
** rc.top += 18;
** rc.left += 12;
** rc.right -= 19;
** rc.bottom -= 40;
**
** // is the click in
** if(PtInRect(&rc,pt))
** {
** // get the item index at the given point
** // if this is out of range then it will return 0 (not very helpful really)
** int idx = SendMessageW(playlist_wnd,WM_WA_IPC,IPC_PE_GETIDXFROMPOINT,(LPARAM)&pt);
**
** // makes sure that the item isn't past the last playlist item
** if(idx < SendMessageW(playlist_wnd,WM_WA_IPC,IPC_PE_GETINDEXTOTAL,0))
** {
** // ... do stuff in here (this example will start playing the selected track)
** SendMessageW(plugin.hwndParent,WM_WA_IPC,idx,IPC_SETPLAYLISTPOS);
** SendMessageW(plugin.hwndParent,WM_COMMAND,MAKEWPARAM(WINAMP_BUTTON2,0),0);
** }
** }
*/
#define IPC_PE_SAVEEND 110 // pass index to save from
#define IPC_PE_RESTOREEND 111 // no parm
#define IPC_PE_GETNEXTSELECTED 112 // same as IPC_PLAYLIST_GET_NEXT_SELECTED for the main window
#define IPC_PE_GETSELECTEDCOUNT 113
#define IPC_PE_GETINDEXINFO_TITLE 115 // like IPC_PE_GETINDEXINFO, but writes the title to char file[MAX_PATH] instead of filename
#define IPC_PE_GETINDEXINFORESULT_TITLE 116 // callback message for IPC_PE_GETINDEXINFO
// the following messages are in_process ONLY
#define IPC_PE_GETINDEXTITLE 200 // lParam = pointer to fileinfo2 struct
#define IPC_PE_GETINDEXTITLEW 201 // lParam = pointer to fileinfo2W struct
/*
** fileinfo2 file;
** int ret = 0;
**
** file.fileindex = position; // this is zero based!
** ret = SendMessageW(playlist_wnd,WM_WA_IPC,IPC_PE_GETINDEXTITLE,(LPARAM)&file);
**
** // if it returns 0 then track information was received
** if(!ret)
** {
** // ... do stuff
** }
*/
#define IPC_PE_GETINDEXINFO_INPROC 202 // lParam = pointer to fileinfo struct
#define IPC_PE_GETINDEXINFOW_INPROC 203 // lParam = pointer to fileinfoW struct
#endif