aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/SDK/gen_classicart
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/SDK/gen_classicart')
-rw-r--r--Src/Plugins/SDK/gen_classicart/api.h24
-rw-r--r--Src/Plugins/SDK/gen_classicart/build_lng.cmd3
-rw-r--r--Src/Plugins/SDK/gen_classicart/gen_classicart.cpp935
-rw-r--r--Src/Plugins/SDK/gen_classicart/gen_classicart.nsi125
-rw-r--r--Src/Plugins/SDK/gen_classicart/gen_classicart.rc156
-rw-r--r--Src/Plugins/SDK/gen_classicart/gen_classicart.sln30
-rw-r--r--Src/Plugins/SDK/gen_classicart/gen_classicart.vcxproj449
-rw-r--r--Src/Plugins/SDK/gen_classicart/gen_classicart.vcxproj.filters42
-rw-r--r--Src/Plugins/SDK/gen_classicart/lng_generator.exebin0 -> 67072 bytes
-rw-r--r--Src/Plugins/SDK/gen_classicart/notfound.pngbin0 -> 3792 bytes
-rw-r--r--Src/Plugins/SDK/gen_classicart/resource.h33
11 files changed, 1797 insertions, 0 deletions
diff --git a/Src/Plugins/SDK/gen_classicart/api.h b/Src/Plugins/SDK/gen_classicart/api.h
new file mode 100644
index 00000000..993ee0cf
--- /dev/null
+++ b/Src/Plugins/SDK/gen_classicart/api.h
@@ -0,0 +1,24 @@
+#ifndef NULLSOFT_API_H
+#define NULLSOFT_API_H
+
+#include <api/service/api_service.h>
+extern api_service *serviceManager;
+#define WASABI_API_SVC serviceManager
+
+#include <api/service/waServiceFactory.h>
+
+#include <api/application/api_application.h>
+#define WASABI_API_APP applicationApi
+
+#include <api/memmgr/api_memmgr.h>
+extern api_memmgr *memmgrApi;
+#define WASABI_API_MEMMGR memmgrApi
+
+#include <api/service/svcs/svc_imgload.h>
+#include <api/service/svcs/svc_imgwrite.h>
+
+#include "../Agave/AlbumArt/api_albumart.h"
+
+#include "../Agave/Language/api_language.h"
+
+#endif \ No newline at end of file
diff --git a/Src/Plugins/SDK/gen_classicart/build_lng.cmd b/Src/Plugins/SDK/gen_classicart/build_lng.cmd
new file mode 100644
index 00000000..f4d9e656
--- /dev/null
+++ b/Src/Plugins/SDK/gen_classicart/build_lng.cmd
@@ -0,0 +1,3 @@
+@echo off
+lng_generator "x86_Release\gen_classicart.dll" /build
+pause
diff --git a/Src/Plugins/SDK/gen_classicart/gen_classicart.cpp b/Src/Plugins/SDK/gen_classicart/gen_classicart.cpp
new file mode 100644
index 00000000..98c988a6
--- /dev/null
+++ b/Src/Plugins/SDK/gen_classicart/gen_classicart.cpp
@@ -0,0 +1,935 @@
+/* gen_classicart
+ version 0.5, February 7th, 2010
+ version 0.4, February 4th, 2010
+ version 0.3, November 9th, 2009
+ version 0.2, February 27th, 2008
+
+ Copyright (C) 2008 Will Fisher
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Will Fisher will.fisher@gmail.com
+
+ ---------------------------------------------------------------------------
+
+ Changes from v0.2 by Darren Owen aka DrO
+
+ * Added Alt+A global shortcut to toggle the album art window
+ * Album art window is now included in Winamp's ctrl+tab feature (broken in some 5.5x builds)
+ * Double-click will now open the folder (like the native album art window does)
+ * Changing menu id to be dynamic rather than hard-coded to show use of IPC_REGISTER_LOWORD_COMMAND
+ * Made background colour match the media library album art views (override with waBkClr=1 in the plugin's ini section)
+ * Made compatible to deal with Winamp being minimised on startup so the window won't appear briefly
+ * Implemented winampUninstallPlugin(..) support
+
+ ---------------------------------------------------------------------------
+
+ Changes from v0.3 by Darren Owen aka DrO
+
+ * Added localisation support (with example en-us language file included in the installer)
+ * Adding an option to show the album art when clicking on an item in the playlist editor without having to play it
+ * Fixed the main menu item not working via the system menu
+ * Plugin will now only work on 5.53+ clients to ensure the Alt+A global shortcut will work (bug-fix for v0.3)
+ * Fixed issue with api.h not containing all of the required headers (only affects compiling source code)
+
+ ---------------------------------------------------------------------------
+
+ Changes from v0.4 by Darren Owen aka DrO
+
+ * Added detection of being used under a modern skin so the album art window and menu item can be automatically hidden (default: on)
+ * Added in ability for the tracking action to work via the keyboard actions along with button clicking
+ * Tweaked the menu item text so the items (at least with en-us translations) is better consistant with the rest of Winamp (if that's possible, heh)
+ * Added config menu into the Winamp preferences so it's possible to access the options when the album art window isn't shown
+
+*/
+
+#include <windows.h>
+#include <shlwapi.h>
+#include <strsafe.h>
+
+#include "../winamp/gen.h"
+#include "../winamp/wa_ipc.h"
+#include "../winamp/ipc_pe.h"
+#define WA_DLG_IMPLEMENT
+#include "../winamp/wa_dlg.h"
+
+#include "api.h"
+#include "resource.h"
+
+#define ID_PE_SCUP 40289
+#define ID_PE_SCDOWN 40290
+
+#define PLUGIN_NAME "Album Art Viewer"
+#define PLUGIN_VERSION "0.6"
+
+int init();
+void quit();
+void config();
+
+winampGeneralPurposePlugin plugin =
+{
+ GPPHDR_VER,
+ "nullsoft(gen_classicart.dll)",
+ init,
+ config,
+ quit,
+};
+
+// winampGeneralPurposePlugin plugin = {GPPHDR_VER,PLUGIN_NAME" v"PLUGIN_VERSION,init,config,quit};
+
+static api_memmgr* WASABI_API_MEMMGR;
+static api_service* WASABI_API_SVC;
+static api_albumart* AGAVE_API_ALBUMART;
+static api_application* WASABI_API_APP;
+static api_language* WASABI_API_LNG;
+HINSTANCE WASABI_API_LNG_HINST = 0,
+ WASABI_API_ORIG_HINST = 0;
+
+embedWindowState myWndState={0};
+HWND myWnd=NULL,
+ myWndChild=NULL;
+HMENU menu=NULL,
+ context_menu=NULL;
+WNDPROC oldWndProc=NULL,
+ oldPlaylistWndProc=NULL;
+BOOL no_uninstall=TRUE,
+ modernloaded=FALSE,
+ last_artwindow_open=FALSE;
+int artwindow_open=0,
+ lockAspect=1,
+ autoHide=0,
+ waBkClr=0,
+ on_click=0,
+ clickTrack=0,
+ hidemodern=1;
+UINT WINAMP_ARTVIEW_MENUID=0xa1ba;
+char* INI_FILE=NULL;
+RECT lastWnd={0};
+HDC cacheDC = NULL;
+COLORREF bgcolour = RGB(0,0,0);
+
+static INT_PTR CALLBACK art_dlgproc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+static LRESULT WINAPI SubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
+static LRESULT WINAPI SubclassPlaylistProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
+
+void viewArtWindow(BOOL show);
+void addAccelerators(HWND hwnd, ACCEL* accel, int accel_size, int translate_mode);
+
+// this is used to identify the skinned frame to allow for embedding/control by modern skins if needed
+// {8B9052B2-2782-4ac8-BA8E-E3DEDBF0BDB5}
+static const GUID ArtViewerGUID =
+{ 0x8b9052b2, 0x2782, 0x4ac8, { 0xba, 0x8e, 0xe3, 0xde, 0xdb, 0xf0, 0xbd, 0xb5 } };
+
+// this is used to identify the language dll to be used when this is running under a language pack
+// {EAD1E933-6D75-4c2c-B9C4-B4D7F06B7D8D}
+static const GUID GenClassicArtGUID =
+{ 0xead1e933, 0x6d75, 0x4c2c, { 0xb9, 0xc4, 0xb4, 0xd7, 0xf0, 0x6b, 0x7d, 0x8d } };
+
+BOOL ArtView_SetMinimised(BOOL fMinimized)
+{
+ if(fMinimized == TRUE)
+ {
+ return SetPropW(myWnd,L"AAMinMode",(HANDLE)TRUE);
+ }
+ RemovePropW(myWnd,L"AAMinMode");
+ return TRUE;
+}
+
+UINT ver = -1;
+UINT GetWinampVersion(HWND winamp)
+{
+ if(ver == -1)
+ {
+ return (ver = SendMessage(winamp,WM_WA_IPC,0,IPC_GETVERSION));
+ }
+ return ver;
+}
+
+template <class api_T>
+void ServiceBuild(api_T *&api_t, GUID factoryGUID_t){
+ if (WASABI_API_SVC){
+ waServiceFactory *factory = WASABI_API_SVC->service_getServiceByGuid(factoryGUID_t);
+ if (factory){
+ api_t = (api_T *)factory->getInterface();
+ }
+ }
+}
+
+BOOL DetectModernSkinLoaded(void)
+{
+ wchar_t skindir[MAX_PATH]={0};
+ SendMessage(plugin.hwndParent,WM_WA_IPC,(WPARAM)skindir,IPC_GETSKINW);
+ StringCchCat(skindir,MAX_PATH,L"\\skin.xml");
+ return PathFileExists(skindir);
+}
+
+void InsertItemIntoMainMenu(void){
+ MENUITEMINFO i = {sizeof(i), MIIM_ID | MIIM_STATE | MIIM_TYPE, MFT_STRING, MFS_UNCHECKED, WINAMP_ARTVIEW_MENUID};
+ i.dwTypeData = WASABI_API_LNGSTRINGW(IDS_ALBUM_ART_MENU);
+ InsertMenuItem(menu, 10 + (int)SendMessage(plugin.hwndParent,WM_WA_IPC,(WPARAM)0,IPC_ADJUST_OPTIONSMENUPOS), TRUE, &i);
+ SendMessage(plugin.hwndParent,WM_WA_IPC,(WPARAM)1,IPC_ADJUST_OPTIONSMENUPOS);
+}
+
+int init()
+{
+ if(GetWinampVersion(plugin.hwndParent) < 0x5053)
+ {
+ // this is due to the api_application dependancy to allow for registering a hotkey correctly
+ MessageBoxA(plugin.hwndParent,"This plug-in requires Winamp v5.9 and up for it to work.\t\n"
+ "Please upgrade your Winamp client to be able to use this.",
+ plugin.description,MB_OK|MB_ICONINFORMATION);
+ return GEN_INIT_FAILURE;
+ }
+ else
+ {
+ WASABI_API_SVC = (api_service*)SendMessage(plugin.hwndParent, WM_WA_IPC, 0, IPC_GET_API_SERVICE);
+ if(WASABI_API_SVC != NULL)
+ {
+ INI_FILE = (char*)SendMessage(plugin.hwndParent,WM_WA_IPC,0,IPC_GETINIFILE);
+
+ ServiceBuild(WASABI_API_MEMMGR,memMgrApiServiceGuid);
+ if(WASABI_API_MEMMGR == NULL) return 1;
+
+ ServiceBuild(AGAVE_API_ALBUMART,albumArtGUID);
+ if(AGAVE_API_ALBUMART == NULL) return 1;
+
+ ServiceBuild(WASABI_API_APP,applicationApiServiceGuid);
+ if(WASABI_API_APP == NULL) return 1;
+
+ ServiceBuild(WASABI_API_LNG,languageApiGUID);
+ if(WASABI_API_LNG == NULL) return 1;
+
+ WASABI_API_START_LANG(plugin.hDllInstance,GenClassicArtGUID);
+
+ static char pluginTitle[MAX_PATH] = {0};
+ StringCchPrintfA(pluginTitle, MAX_PATH, WASABI_API_LNGSTRING(IDS_PLUGIN_NAME), PLUGIN_VERSION);
+ plugin.description = pluginTitle;
+
+ WADlg_init(plugin.hwndParent);
+
+ // subclass main window
+ oldWndProc = (WNDPROC)SetWindowLongPtrW(plugin.hwndParent, GWLP_WNDPROC, (LONG_PTR)SubclassProc);
+ oldPlaylistWndProc = (WNDPROC)SetWindowLongPtrW((HWND)SendMessage(plugin.hwndParent,WM_WA_IPC,IPC_GETWND_PE,IPC_GETWND),
+ GWLP_WNDPROC, (LONG_PTR)SubclassPlaylistProc);
+
+ // do this dynamically (if on an older client then we'd need to check for a return of 1 and set an arbitrary default)
+ WINAMP_ARTVIEW_MENUID = SendMessage(plugin.hwndParent,WM_WA_IPC,0,IPC_REGISTER_LOWORD_COMMAND);
+
+ // add our menu option
+ menu = (HMENU)SendMessage(plugin.hwndParent,WM_WA_IPC,(WPARAM)0,IPC_GET_HMENU);
+ if(hidemodern){
+ if(!DetectModernSkinLoaded())
+ {
+ InsertItemIntoMainMenu();
+ }
+ else
+ {
+ modernloaded=TRUE;
+ }
+ }
+ else
+ {
+ InsertItemIntoMainMenu();
+ }
+
+ // load values from ini file
+ lockAspect = GetPrivateProfileIntA("gen_classicart","wnd_lock_aspect",lockAspect,INI_FILE);
+ myWndState.r.top = GetPrivateProfileIntA("gen_classicart","wnd_top",0,INI_FILE);
+ myWndState.r.bottom = GetPrivateProfileIntA("gen_classicart","wnd_bottom",0,INI_FILE);
+ myWndState.r.left = GetPrivateProfileIntA("gen_classicart","wnd_left",0,INI_FILE);
+ myWndState.r.right = GetPrivateProfileIntA("gen_classicart","wnd_right",0,INI_FILE);
+ artwindow_open = GetPrivateProfileIntA("gen_classicart","wnd_open",artwindow_open,INI_FILE);
+ autoHide = GetPrivateProfileIntA("gen_classicart","wnd_auto_hide",autoHide,INI_FILE);
+ waBkClr = GetPrivateProfileIntA("gen_classicart","waBkClr",waBkClr,INI_FILE);
+ clickTrack = GetPrivateProfileIntA("gen_classicart","clickTrack",clickTrack,INI_FILE);
+ hidemodern = GetPrivateProfileIntA("gen_classicart","hidemodern",hidemodern,INI_FILE);
+ last_artwindow_open = GetPrivateProfileIntA("gen_classicart","wnd_open_last",last_artwindow_open,INI_FILE);
+
+ // create window
+ myWndState.flags = EMBED_FLAGS_NOWINDOWMENU;
+ myWnd = (HWND)SendMessage(plugin.hwndParent,WM_WA_IPC,(WPARAM)&myWndState,IPC_GET_EMBEDIF);
+ WASABI_API_APP->app_registerGlobalWindow(myWnd);
+ myWndChild = WASABI_API_CREATEDIALOGW(IDD_DIALOG,myWnd,art_dlgproc);
+
+ SET_EMBED_GUID((&myWndState),ArtViewerGUID);
+ SetWindowText(myWnd,WASABI_API_LNGSTRINGW(IDS_ALBUM_ART));
+
+ if(SendMessage(plugin.hwndParent,WM_WA_IPC,0,IPC_INITIAL_SHOW_STATE) == SW_SHOWMINIMIZED && artwindow_open)
+ {
+ // we are starting minimised so process as needed (keep our window hidden)
+ MENUITEMINFO i = {sizeof(i), MIIM_STATE , MFT_STRING, MFS_UNCHECKED, WINAMP_ARTVIEW_MENUID};
+ SetMenuItemInfo(menu, WINAMP_ARTVIEW_MENUID, FALSE, &i);
+ ArtView_SetMinimised(TRUE);
+ }
+ else
+ {
+ if(artwindow_open) viewArtWindow(TRUE);
+ }
+
+ // not working correctly at the moment
+ ACCEL accel = {FVIRTKEY|FALT,'A',WINAMP_ARTVIEW_MENUID};
+ addAccelerators(myWndChild,&accel,1,TRANSLATE_MODE_GLOBAL);
+
+ context_menu = WASABI_API_LOADMENUW(IDR_MENU1);
+ return GEN_INIT_SUCCESS;
+ }
+ }
+ return GEN_INIT_FAILURE;
+}
+
+void quit()
+{
+ if(no_uninstall)
+ {
+ // save window state
+ #define WritePrivateProfileInt(key, val) \
+ { \
+ char zzval[10] = {0}; \
+ StringCchPrintfA(zzval,10,"%d",val); \
+ WritePrivateProfileStringA("gen_classicart",key,zzval,INI_FILE); \
+ }
+
+ GetWindowRect(myWnd,&myWndState.r);
+ WritePrivateProfileInt("wnd_top",myWndState.r.top);
+ WritePrivateProfileInt("wnd_bottom",myWndState.r.bottom);
+ WritePrivateProfileInt("wnd_left",myWndState.r.left);
+ WritePrivateProfileInt("wnd_right",myWndState.r.right);
+ WritePrivateProfileInt("wnd_open",artwindow_open);
+ WritePrivateProfileInt("wnd_lock_aspect",lockAspect);
+ WritePrivateProfileInt("wnd_auto_hide",autoHide);
+ WritePrivateProfileInt("clickTrack",clickTrack);
+ WritePrivateProfileInt("hidemodern",hidemodern);
+ // reset the state so if we're using a classic skin then it'll work if the window is disabled
+ if(modernloaded==FALSE) last_artwindow_open = artwindow_open;
+ WritePrivateProfileInt("wnd_open_last",last_artwindow_open);
+ }
+
+ WASABI_API_APP->app_unregisterGlobalWindow(myWnd);
+ ArtView_SetMinimised(FALSE);
+ DestroyWindow(myWnd);
+ WADlg_close();
+
+ // restores the original winamp window proc now that we are closing and if the window was subclassed
+ if(GetWindowLongPtr(plugin.hwndParent,GWLP_WNDPROC) == (LONG_PTR)SubclassProc){
+ SetWindowLongPtr(plugin.hwndParent,GWLP_WNDPROC,(LONG_PTR)oldWndProc);
+ }
+
+ // restores the original playlist window proc now that we are closing and if the window was subclassed
+ HWND pe_wnd = (HWND)SendMessage(plugin.hwndParent,WM_WA_IPC,IPC_GETWND_PE,IPC_GETWND);
+ if(GetWindowLongPtr(pe_wnd,GWLP_WNDPROC) == (LONG_PTR)SubclassPlaylistProc){
+ SetWindowLongPtr(pe_wnd,GWLP_WNDPROC,(LONG_PTR)oldPlaylistWndProc);
+ }
+}
+
+int config_open = 0;
+void config()
+{
+ /*if(!config_open){
+ char message[256]={0}, tmp[128]={0};
+ config_open = 1;
+ StringCchPrintfA(message,256,WASABI_API_LNGSTRING(IDS_ABOUT_STRING),WASABI_API_LNGSTRING_BUF(IDS_ALBUM_ART,tmp,128));
+ MessageBoxA(0,message,plugin.description,0);
+ config_open = 0;
+ }
+ else{
+ SetActiveWindow(FindWindowA("#32770",plugin.description));
+ }*/
+
+HWND list = FindWindowEx(GetParent(GetFocus()),0,L"ListBox",0);
+HMENU popup = GetSubMenu(WASABI_API_LOADMENUW(IDR_MENU1),0);
+RECT r = {0};
+wchar_t temp[MAX_PATH] = {0};
+
+ DeleteMenu(popup,ID_CONTEXTMENU_GETALBUMART,MF_BYCOMMAND);
+ DeleteMenu(popup,ID_CONTEXTMENU_REFRESH,MF_BYCOMMAND);
+ DeleteMenu(popup,ID_CONTEXTMENU_OPENFOLDER,MF_BYCOMMAND);
+
+ MENUITEMINFO i = {sizeof(i),MIIM_ID|MIIM_STATE|MIIM_TYPE,MFT_STRING,MFS_UNCHECKED|MFS_DISABLED,1};
+ StringCchPrintf(temp,MAX_PATH,WASABI_API_LNGSTRINGW(IDS_PLUGIN_NAME),TEXT(PLUGIN_VERSION));
+ i.dwTypeData = temp;
+ InsertMenuItem(popup, 0, TRUE, &i);
+
+ i.wID=2;
+ i.fState=0;
+ i.fType=MFT_SEPARATOR;
+ InsertMenuItem(popup, -1, TRUE, &i);
+
+ i.dwTypeData = WASABI_API_LNGSTRINGW(IDS_ABOUT);
+ i.wID=4;
+ i.fType=MFT_STRING;
+ InsertMenuItem(popup, -1, TRUE, &i);
+
+ SendMessage(list,LB_GETITEMRECT,SendMessage(list,LB_GETCURSEL,1,0),(LPARAM)&r);
+ ClientToScreen(list,(LPPOINT)&r);
+
+ CheckMenuItem(popup,ID_CONTEXTMENU_LOCKASPECTRATIO,(lockAspect?MF_CHECKED:MF_UNCHECKED)|MF_BYCOMMAND);
+ CheckMenuItem(popup,ID_CONTEXTMENU_AUTOHIDE,(autoHide?MF_CHECKED:MF_UNCHECKED)|MF_BYCOMMAND);
+ CheckMenuItem(popup,ID_CONTEXTMENU_CLICKTRACK,(clickTrack?MF_CHECKED:MF_UNCHECKED)|MF_BYCOMMAND);
+ CheckMenuItem(popup,ID_CONTEXTMENU_AUTO_HIDE_MODERN,(hidemodern?MF_CHECKED:MF_UNCHECKED)|MF_BYCOMMAND);
+
+ switch(TrackPopupMenu(popup,TPM_RETURNCMD|TPM_LEFTBUTTON,r.left,r.top,0,list,NULL)){
+ case 4:
+ {
+ char message[256]={0}, tmp[128]={0};
+ StringCchPrintfA(message,256,WASABI_API_LNGSTRING(IDS_ABOUT_STRING),WASABI_API_LNGSTRING_BUF(IDS_ALBUM_ART,tmp,128));
+ MessageBoxA(list,message,plugin.description,0);
+ }
+ break;
+ case ID_CONTEXTMENU_LOCKASPECTRATIO:
+ lockAspect = (!lockAspect);
+ if(cacheDC) DeleteDC(cacheDC); cacheDC = NULL;
+ InvalidateRect(myWndChild,NULL,TRUE);
+ break;
+ case ID_CONTEXTMENU_AUTOHIDE:
+ autoHide = (!autoHide);
+ break;
+ case ID_CONTEXTMENU_CLICKTRACK:
+ clickTrack = (!clickTrack);
+ break;
+ case ID_CONTEXTMENU_AUTO_HIDE_MODERN:
+ hidemodern = (!hidemodern);
+ break;
+ }
+
+ // clean up as we're sharing this menu
+ DestroyMenu(popup);
+}
+
+static LRESULT WINAPI SubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ // handles the item being selected through the main window menu
+ // including via the windows taskbar menu as it'll fail otherwise
+ if((msg == WM_COMMAND || msg == WM_SYSCOMMAND) && LOWORD(wParam) == WINAMP_ARTVIEW_MENUID)
+ {
+ if(artwindow_open) PostMessage(myWndChild,WM_CLOSE,0,0);
+ else PostMessage(myWndChild,WM_USER+1,0,0);
+ }
+
+ else if(msg == WM_WA_IPC)
+ {
+ if(lParam == IPC_CB_MISC && (wParam == IPC_CB_MISC_TITLE || wParam == IPC_CB_MISC_TITLE_RATING))
+ {
+ // art change
+ PostMessage(myWndChild,WM_USER,0,0);
+ }
+ else if(lParam == IPC_SKIN_CHANGED && hidemodern)
+ {
+ // need to check this when doing classic->modern as it causes the pledit to be hidden
+ if(DetectModernSkinLoaded()){
+ if(modernloaded==FALSE){
+ last_artwindow_open = artwindow_open;
+ if(last_artwindow_open==TRUE){
+ PostMessage(myWndChild,WM_CLOSE,0,0);
+ }
+ DeleteMenu(menu,WINAMP_ARTVIEW_MENUID,MF_BYCOMMAND);
+ SendMessage(plugin.hwndParent,WM_WA_IPC,(WPARAM)-1,IPC_ADJUST_OPTIONSMENUPOS);
+ }
+ modernloaded=TRUE;
+ }
+ else{
+ if(modernloaded==TRUE)
+ {
+ InsertItemIntoMainMenu();
+ if(last_artwindow_open==TRUE)
+ {
+ PostMessage(myWndChild,WM_USER+1,0,0);
+ }
+ }
+ modernloaded=FALSE;
+ }
+ }
+ }
+
+ // the purpose of this is show our gen frame window if we started in a minimised state
+ // as showing then hiding will otherwise cause a window to flash briefly on screen
+ else if(msg == WM_SIZE)
+ {
+ if (wParam == SIZE_RESTORED)
+ {
+ if(GetPropW(myWnd,L"AAMinMode"))
+ {
+ ShowWindow(myWnd,SW_SHOWNA);
+ ArtView_SetMinimised(FALSE);
+ }
+ }
+ }
+
+ return CallWindowProc(oldWndProc, hwnd, msg, wParam, lParam);
+}
+
+int IsInPlaylistArea(HWND playlist_wnd, int mode)
+{
+POINT pt = {0};
+RECT rc = {0};
+
+ GetCursorPos(&pt);
+ GetClientRect(playlist_wnd,&rc);
+
+ ScreenToClient(playlist_wnd,&pt);
+ // this corrects so the selection works correctly on the selection boundary
+ pt.y -= 2;
+
+ if(!mode)
+ {
+ // corrects for the window area so it only happens if a selection happens
+ rc.top += 18;
+ rc.left += 12;
+ rc.right -= 19;
+ rc.bottom -= 40;
+ return PtInRect(&rc,pt);
+ }
+ else
+ {
+ rc.bottom -= 13;
+ rc.top = rc.bottom - 19;
+ rc.left += 14;
+
+ for(int i = 0; i < 4; i++)
+ {
+ rc.right = rc.left + 22;
+ if(PtInRect(&rc,pt))
+ {
+ return 1;
+ }
+ else{
+ rc.left = rc.right + 7;
+ }
+ }
+ return 0;
+ }
+}
+
+static LRESULT WINAPI SubclassPlaylistProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ LRESULT ret=0;
+
+ // this will detect false clicks such as when the menus are shown in the classic playlist editor
+ if(msg == WM_LBUTTONDOWN)
+ {
+ if(IsInPlaylistArea(hwnd,1))
+ {
+ on_click = 1;
+ }
+ }
+
+ ret = CallWindowProc(oldPlaylistWndProc, hwnd, msg, wParam, lParam);
+
+ // this will then handle the detection of a proper click in the playlist editor so
+ // if enabled then we can get and show the album art for the selected playlist item
+ if(msg == WM_LBUTTONDOWN && !(GetKeyState(VK_MENU)&0x1000) &&
+ !(GetKeyState(VK_SHIFT)&0x1000) &&
+ !(GetKeyState(VK_CONTROL)&0x1000))
+ {
+ if(!on_click && clickTrack)
+ {
+ POINT pt = {0};
+ INT index = 0;
+ GetCursorPos(&pt);
+ ScreenToClient(hwnd,&pt);
+ // this corrects so the selection works correctly on the selection boundary
+ pt.y -= 2;
+ index = SendMessage(hwnd,WM_WA_IPC,IPC_PE_GETIDXFROMPOINT,(LPARAM)&pt);
+ if(IsInPlaylistArea(hwnd,0))
+ {
+ // bounds check things
+ if(index < SendMessage(hwnd,WM_WA_IPC,IPC_PE_GETINDEXTOTAL,0))
+ {
+ // art change to show the selected item in the playlist editor
+ PostMessage(myWndChild,WM_USER,0,(LPARAM)SendMessage(plugin.hwndParent,WM_WA_IPC,index,IPC_GETPLAYLISTFILEW));
+ }
+ }
+ }
+ else
+ {
+ // needs to do an increment for the next click will be a false
+ if(on_click == 1)
+ {
+ on_click = 2;
+ }
+ else{
+ on_click = 0;
+ }
+ }
+ }
+
+ else if(msg == WM_COMMAND)
+ {
+ // this is used for tracking the selection of items in the playlist editor
+ // so we can update the album art when doing a single up/down selection
+ if((LOWORD(wParam) == ID_PE_SCUP || LOWORD(wParam) == ID_PE_SCDOWN) && clickTrack)
+ {
+ // only do on up/down without any other keyboard accelerators pressed
+ if(!(GetKeyState(VK_MENU)&0x1000) &&
+ !(GetKeyState(VK_SHIFT)&0x1000) &&
+ !(GetKeyState(VK_CONTROL)&0x1000))
+ {
+ if(SendMessage(plugin.hwndParent,WM_WA_IPC,0,IPC_PLAYLIST_GET_SELECTED_COUNT))
+ {
+ int sel = SendMessage(plugin.hwndParent,WM_WA_IPC,-1,IPC_PLAYLIST_GET_NEXT_SELECTED);
+ if(sel != -1)
+ {
+ // art change to show the selected item in the playlist editor
+ PostMessage(myWndChild,WM_USER,0,(LPARAM)SendMessage(plugin.hwndParent,WM_WA_IPC,sel,IPC_GETPLAYLISTFILEW));
+ }
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+ARGB32 * loadImg(const void * data, int len, int *w, int *h, bool ldata=false)
+{
+ FOURCC imgload = svc_imageLoader::getServiceType();
+ int n = WASABI_API_SVC->service_getNumServices(imgload);
+ for(int i=0; i<n; i++)
+ {
+ waServiceFactory *sf = WASABI_API_SVC->service_enumService(imgload,i);
+ if(sf)
+ {
+ svc_imageLoader * l = (svc_imageLoader*)sf->getInterface();
+ if(l)
+ {
+ if(l->testData(data,len))
+ {
+ ARGB32* ret;
+ if(ldata) ret = l->loadImageData(data,len,w,h);
+ else ret = l->loadImage(data,len,w,h);
+ sf->releaseInterface(l);
+ return ret;
+ }
+ sf->releaseInterface(l);
+ }
+ }
+ }
+ return NULL;
+}
+
+ARGB32 * loadRrc(int id, wchar_t * sec, int *w, int *h, bool data=false)
+{
+ DWORD size=0;
+ HGLOBAL resourceHandle = WASABI_API_LOADRESFROMFILEW(sec,MAKEINTRESOURCE(id),&size);
+ if(resourceHandle)
+ {
+ ARGB32* ret = loadImg(resourceHandle,size,w,h,data);
+ UnlockResource(resourceHandle);
+ return ret;
+ }
+ return NULL;
+}
+
+void adjustbmp(ARGB32 * p, int len, COLORREF fg)
+{
+ ARGB32 * end = p+len;
+ while (p < end)
+ {
+ int a = (*p>>24)&0xff ;
+ int b = a*((*p&0xff) * (fg&0xff)) / (0xff*0xff);
+ int g = a*(((*p>>8)&0xff) * ((fg>>8)&0xff)) / (0xff*0xff);
+ int r = a*(((*p>>16)&0xff) * ((fg>>16)&0xff)) / (0xff*0xff);
+ *p = (a<<24) | (r&0xff) | ((g&0xff)<<8) | ((b&0xff)<<16);
+ p++;
+ }
+}
+
+void DrawArt(HDC dc, HWND hwndDlg, ARGB32 * cur_image, int cur_w, int cur_h)
+{
+ RECT dst, wnd;
+ GetWindowRect(hwndDlg,&wnd);
+ wnd.right = wnd.right - wnd.left;
+ wnd.left = 0;
+ wnd.bottom = wnd.bottom - wnd.top;
+ wnd.top = 0;
+
+ if(!memcmp(&lastWnd,&wnd,sizeof(RECT)) && cacheDC)
+ {
+ BitBlt(dc,0,0,wnd.right,wnd.bottom,cacheDC,0,0,SRCCOPY);
+ return;
+ }
+
+ // create cacheDC
+ if(cacheDC) DeleteDC(cacheDC);
+ cacheDC = CreateCompatibleDC(dc);
+ HBITMAP hbm = CreateCompatibleBitmap(dc,wnd.right,wnd.bottom);
+ SelectObject(cacheDC,hbm);
+ DeleteObject(hbm);
+ lastWnd = wnd;
+
+ if(!lockAspect) dst = wnd;
+ else
+ {
+ // maintain 'square' stretching, fill in dst
+ double aspX = (double)(wnd.right)/(double)cur_w;
+ double aspY = (double)(wnd.bottom)/(double)cur_h;
+ double asp = min(aspX, aspY);
+ int newW = (int)(cur_w*asp);
+ int newH = (int)(cur_h*asp);
+ dst.left = (wnd.right - newW)/2;
+ dst.top = (wnd.bottom - newH)/2;
+ dst.right = dst.left + newW;
+ dst.bottom = dst.top + newH;
+ }
+
+ // fill the background to black
+ HBRUSH brush = CreateSolidBrush(bgcolour);
+ FillRect(cacheDC,&wnd,brush);
+ DeleteObject(brush);
+
+ //SkinBitmap(cur_image, cur_w, cur_h).stretchToRect(&DCCanvas(cacheDC), &dst);
+ HDC srcDC = CreateCompatibleDC(dc);
+ BITMAPINFO bmi = {0};
+ bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ bmi.bmiHeader.biWidth = cur_w;
+ bmi.bmiHeader.biHeight = -cur_h;
+ bmi.bmiHeader.biPlanes = 1;
+ bmi.bmiHeader.biBitCount = 32;
+ bmi.bmiHeader.biCompression = BI_RGB;
+ void *bits = 0;
+ HBITMAP srcBMP = CreateDIBSection(srcDC, &bmi, DIB_RGB_COLORS, &bits, NULL, 0);
+ memcpy(bits, cur_image, cur_w*cur_h*4);
+
+ HBITMAP oldSrcBM = (HBITMAP)SelectObject(srcDC,srcBMP);
+ BLENDFUNCTION blendFn;
+ blendFn.BlendOp = AC_SRC_OVER;
+ blendFn.BlendFlags = 0;
+ blendFn.SourceConstantAlpha = 255;
+ blendFn.AlphaFormat = AC_SRC_ALPHA;
+
+ AlphaBlend(cacheDC,
+ dst.left, dst.top,
+ dst.right-dst.left, dst.bottom-dst.top,
+ srcDC,
+ 0, 0,
+ cur_w, cur_h,
+ blendFn);
+
+ BitBlt(dc,0,0,wnd.right,wnd.bottom,cacheDC,0,0,SRCCOPY);
+ SelectObject(srcDC,oldSrcBM);
+ DeleteObject(srcBMP);
+ DeleteDC(srcDC);
+}
+
+static INT_PTR CALLBACK art_dlgproc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ static ARGB32 * cur_image;
+ static int cur_w, cur_h;
+ static bool closed;
+ switch(msg)
+ {
+ case WM_INITDIALOG:
+ closed = 0;
+ cur_image = 0;
+ bgcolour = WADlg_getColor(WADLG_ITEMBG);
+ PostMessage(hwndDlg,WM_USER,0,0);
+ break;
+ case WM_USER+1:
+ viewArtWindow(TRUE);
+ closed=0;
+ break;
+ case WM_DISPLAYCHANGE:
+ WADlg_init(plugin.hwndParent);
+ bgcolour = WADlg_getColor(WADLG_ITEMBG);
+ case WM_USER:
+ {
+ wchar_t *filename = (!lParam?(wchar_t *)SendMessage(plugin.hwndParent,WM_WA_IPC,0,IPC_GET_PLAYING_FILENAME):(wchar_t*)lParam);
+ if(cur_image) WASABI_API_MEMMGR->sysFree(cur_image); cur_image = 0;
+ if (AGAVE_API_ALBUMART->GetAlbumArt(filename, L"cover", &cur_w, &cur_h, &cur_image) != ALBUMART_SUCCESS)
+ {/*
+ SkinBitmap b(L"winamp.cover.notfound");
+ if(!b.isInvalid())
+ {
+ cur_w = b.getWidth();
+ cur_h = b.getHeight();
+ cur_image = (ARGB32*)WASABI_API_MEMMGR->sysMalloc(cur_w * cur_h * sizeof(ARGB32));
+ memcpy(cur_image,b.getBits(),cur_w * cur_h * sizeof(ARGB32));
+ }
+ else*/
+ {
+ cur_image = loadRrc(IDR_IMAGE_NOTFOUND,L"PNG",&cur_w, &cur_h,true);
+ if(cur_image) adjustbmp(cur_image, cur_w*cur_h, WADlg_getColor(WADLG_ITEMFG));
+ }
+
+ if(!waBkClr) bgcolour = WADlg_getColor(WADLG_ITEMBG);
+ if(autoHide && !closed && msg != WM_DISPLAYCHANGE)
+ viewArtWindow(FALSE);
+ }
+ else
+ {
+ if(waBkClr) bgcolour = RGB(0,0,0);
+ if(autoHide && !closed && msg != WM_DISPLAYCHANGE)
+ viewArtWindow(TRUE);
+ }
+ if(cacheDC) DeleteDC(cacheDC); cacheDC = NULL;
+ InvalidateRect(hwndDlg,NULL,TRUE);
+ }
+ break;
+ case WM_DESTROY:
+ if(cur_image) WASABI_API_MEMMGR->sysFree(cur_image); cur_image = 0;
+ if(cacheDC) DeleteDC(cacheDC); cacheDC = NULL;
+ break;
+ case WM_PAINT:
+ {
+ if (cur_image)
+ {
+ PAINTSTRUCT psPaint={0};
+ HDC dc = BeginPaint(hwndDlg, &psPaint);
+ DrawArt(dc,hwndDlg,cur_image,cur_w,cur_h);
+ EndPaint(hwndDlg, &psPaint);
+ }
+ }
+ break;
+ case WM_ERASEBKGND:
+ {
+ if (cur_image)
+ {
+ HDC dc = (HDC)wParam;
+ DrawArt(dc,hwndDlg,cur_image,cur_w,cur_h);
+ return 1;
+ }
+ }
+ break;
+ case WM_SIZE:
+ if(cacheDC) DeleteDC(cacheDC); cacheDC = NULL;
+ InvalidateRect(hwndDlg,NULL,TRUE);
+ break;
+ case WM_CLOSE:
+ closed=1;
+ viewArtWindow(FALSE);
+ break;
+ case WM_LBUTTONDBLCLK:
+ PostMessage(hwndDlg,WM_COMMAND,MAKEWPARAM(ID_CONTEXTMENU_OPENFOLDER,0),0);
+ break;
+ case WM_RBUTTONDOWN:
+ {
+ HMENU menu = GetSubMenu(context_menu,0);
+ POINT p;
+ GetCursorPos(&p);
+ CheckMenuItem(menu,ID_CONTEXTMENU_LOCKASPECTRATIO,(lockAspect?MF_CHECKED:MF_UNCHECKED)|MF_BYCOMMAND);
+ CheckMenuItem(menu,ID_CONTEXTMENU_AUTOHIDE,(autoHide?MF_CHECKED:MF_UNCHECKED)|MF_BYCOMMAND);
+ CheckMenuItem(menu,ID_CONTEXTMENU_CLICKTRACK,(clickTrack?MF_CHECKED:MF_UNCHECKED)|MF_BYCOMMAND);
+ CheckMenuItem(menu,ID_CONTEXTMENU_AUTO_HIDE_MODERN,(hidemodern?MF_CHECKED:MF_UNCHECKED)|MF_BYCOMMAND);
+ TrackPopupMenu(menu,TPM_RIGHTBUTTON|TPM_LEFTBUTTON|TPM_NONOTIFY,p.x,p.y,0,hwndDlg,NULL);
+ }
+ break;
+ case WM_COMMAND:
+ // this is used when 'Alt+A' is pressed by the user as part of the registered global shortcut
+ if(LOWORD(wParam) == WINAMP_ARTVIEW_MENUID)
+ {
+ if(artwindow_open) PostMessage(myWndChild,WM_CLOSE,0,0);
+ else PostMessage(myWndChild,WM_USER+1,0,0);
+ }
+
+ switch(LOWORD(wParam))
+ {
+ case ID_CONTEXTMENU_GETALBUMART:
+ {
+ wchar_t *filename = (wchar_t *)SendMessage(plugin.hwndParent,WM_WA_IPC,0,IPC_GET_PLAYING_FILENAME);
+ if(filename && *filename)
+ {
+ wchar_t artist[1024],album[1024];
+ extendedFileInfoStructW a = {filename,L"artist",artist,1024};
+ SendMessage(plugin.hwndParent,WM_WA_IPC,(LPARAM)&a,IPC_GET_EXTENDED_FILE_INFOW);
+ a.metadata = L"album";
+ a.ret = album;
+ SendMessage(plugin.hwndParent,WM_WA_IPC,(LPARAM)&a,IPC_GET_EXTENDED_FILE_INFOW);
+ artFetchData d = {sizeof(d),hwndDlg,artist,album,0};
+ int r = (int)SendMessage(plugin.hwndParent,WM_WA_IPC,(LPARAM)&d,IPC_FETCH_ALBUMART);
+ if(r == 0 && d.imgData && d.imgDataLen) // success, save art in correct location
+ {
+ AGAVE_API_ALBUMART->SetAlbumArt(filename,L"cover",0,0,d.imgData,d.imgDataLen,d.type);
+ WASABI_API_MEMMGR->sysFree(d.imgData);
+ SendMessage(hwndDlg,WM_USER,0,0);
+ }
+ }
+ }
+ break;
+ case ID_CONTEXTMENU_LOCKASPECTRATIO:
+ lockAspect = (!lockAspect);
+ if(cacheDC) DeleteDC(cacheDC); cacheDC = NULL;
+ InvalidateRect(hwndDlg,NULL,TRUE);
+ break;
+ case ID_CONTEXTMENU_REFRESH:
+ SendMessage(hwndDlg,WM_USER,0,0);
+ break;
+ case ID_CONTEXTMENU_OPENFOLDER:
+ {
+ wchar_t *filename = (wchar_t *)SendMessage(plugin.hwndParent,WM_WA_IPC,0,IPC_GET_PLAYING_FILENAME);
+ if(filename && *filename)
+ {
+ wchar_t fn[MAX_PATH];
+ lstrcpynW(fn,filename,MAX_PATH);
+ PathRemoveFileSpecW(fn);
+ ShellExecuteW(NULL,L"open",fn,NULL,NULL,SW_SHOW);
+ }
+ }
+ break;
+ case ID_CONTEXTMENU_AUTOHIDE:
+ autoHide = (!autoHide);
+ break;
+ case ID_CONTEXTMENU_CLICKTRACK:
+ clickTrack = (!clickTrack);
+ break;
+ case ID_CONTEXTMENU_AUTO_HIDE_MODERN:
+ hidemodern = (!hidemodern);
+ break;
+ }
+ break;
+ }
+ return 0;
+}
+
+void viewArtWindow(BOOL show)
+{
+ artwindow_open=show;
+ MENUITEMINFO i = {sizeof(i), MIIM_STATE , MFT_STRING, (artwindow_open?MFS_CHECKED:MFS_UNCHECKED), WINAMP_ARTVIEW_MENUID};
+ SetMenuItemInfo(menu, WINAMP_ARTVIEW_MENUID, FALSE, &i);
+ ShowWindow(myWnd,(artwindow_open?SW_SHOW:SW_HIDE));
+}
+
+void addAccelerators(HWND hwnd, ACCEL* accel, int accel_size, int translate_mode)
+{
+ HACCEL hAccel = CreateAcceleratorTable(accel,accel_size);
+ if (hAccel) WASABI_API_APP->app_addAccelerators(hwnd, &hAccel, accel_size, translate_mode);
+}
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ __declspec( dllexport ) winampGeneralPurposePlugin * winampGetGeneralPurposePlugin()
+ {
+ return &plugin;
+ }
+
+ __declspec(dllexport) int winampUninstallPlugin(HINSTANCE hDllInst, HWND hwndDlg, int param)
+ {
+ // prompt to remove our settings with default as no (just incase)
+ if(MessageBoxA(hwndDlg,WASABI_API_LNGSTRING(IDS_DO_YOU_ALSO_WANT_TO_REMOVE_SETTINGS),
+ plugin.description,MB_YESNO|MB_DEFBUTTON2) == IDYES)
+ {
+ WritePrivateProfileStringA("gen_classicart",0,0,INI_FILE);
+ no_uninstall = FALSE;
+ }
+
+ // as we're doing too much in subclasses, etc we cannot allow for on-the-fly removal so need to do a normal reboot
+ return GEN_PLUGIN_UNINSTALL_REBOOT;
+ }
+
+#ifdef __cplusplus
+}
+#endif \ No newline at end of file
diff --git a/Src/Plugins/SDK/gen_classicart/gen_classicart.nsi b/Src/Plugins/SDK/gen_classicart/gen_classicart.nsi
new file mode 100644
index 00000000..c1dc70c1
--- /dev/null
+++ b/Src/Plugins/SDK/gen_classicart/gen_classicart.nsi
@@ -0,0 +1,125 @@
+; waplugin.nsi
+;
+; This script will generate an installer that installs a Winamp 2 plug-in.
+;
+; This installer will automatically alert the user that installation was
+; successful, and ask them whether or not they would like to make the
+; plug-in the default and run Winamp.
+
+;--------------------------------
+
+;Header Files
+
+!include "Sections.nsh"
+!include "WinMessages.nsh"
+
+; common defines for a generic dro installer :o)
+!define VERSION "0.6"
+!define ALT_VER "0_6"
+!define PLUG "Album Art Viewer"
+!define PLUG_ALT "Album_Art_Viewer"
+!define PLUG_FILE "gen_classicart"
+
+; use leet compression
+SetCompressor lzma
+
+; adds xp style support
+XPStyle on
+
+; The name of the installer
+Name "${PLUG} v${VERSION}"
+
+; The file to write
+OutFile "${PLUG_ALT}_v${ALT_VER}.exe"
+
+InstType "Plugin only"
+InstType "Plugin + language file"
+InstType /NOCUSTOM
+InstType /COMPONENTSONLYONCUSTOM
+
+; The default installation directory
+InstallDir $PROGRAMFILES\Winamp
+InstProgressFlags smooth
+
+; detect winamp path from uninstall string if available
+InstallDirRegKey HKLM \
+ "Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp" \
+ "UninstallString"
+
+; The text to prompt the user to enter a directory
+DirText "Please select your Winamp path below (you will be able to proceed when Winamp is detected):"
+# currently doesn't work - DirShow hide
+
+; automatically close the installer when done.
+AutoCloseWindow true
+
+; hide the "show details" box
+ShowInstDetails show
+
+;--------------------------------
+
+;Pages
+
+PageEx directory
+Caption " "
+PageExEnd
+Page components
+Page instfiles
+
+;--------------------------------
+
+
+; The stuff to install
+Section ""
+ SetOverwrite on
+ SetOutPath "$INSTDIR\Plugins"
+ ; File to extract
+ File "x86_Release\${PLUG_FILE}.dll"
+ SetOverwrite off
+SectionEnd
+
+Section "Example language file"
+; SectionSetFlags 0 SF_BOLD
+ SectionIn 2
+
+ SetOverwrite on
+ SetOutPath "$INSTDIR\Plugins\${PLUG_FILE}"
+ ; File to extract
+ File "x86_Release\LangFiles\${PLUG_FILE}.lng"
+ SetOverwrite off
+SectionEnd
+
+;--------------------------------
+
+Function .onInit
+ ;Detect running Winamp instances and close them
+ !define WINAMP_FILE_EXIT 40001
+
+ FindWindow $R0 "Winamp v1.x"
+ IntCmp $R0 0 ok
+ MessageBox MB_YESNO|MB_ICONEXCLAMATION "Please close all instances of Winamp before installing$\n\
+ ${PLUG} v${VERSION}. Attempt to close Winamp now?" IDYES checkagain IDNO no
+ checkagain:
+ FindWindow $R0 "Winamp v1.x"
+ IntCmp $R0 0 ok
+ SendMessage $R0 ${WM_COMMAND} ${WINAMP_FILE_EXIT} 0
+ Goto checkagain
+ no:
+ Abort
+ ok:
+FunctionEnd
+
+Function .onInstSuccess
+ MessageBox MB_YESNO \
+ '${PLUG} was installed. Do you want to run Winamp now?' \
+ IDNO end
+ ExecShell open "$INSTDIR\Winamp.exe"
+ end:
+FunctionEnd
+
+Function .onVerifyInstDir
+ ;Check for Winamp installation
+ IfFileExists $INSTDIR\Winamp.exe Good
+ Abort
+ Good:
+FunctionEnd \ No newline at end of file
diff --git a/Src/Plugins/SDK/gen_classicart/gen_classicart.rc b/Src/Plugins/SDK/gen_classicart/gen_classicart.rc
new file mode 100644
index 00000000..8aa7b28a
--- /dev/null
+++ b/Src/Plugins/SDK/gen_classicart/gen_classicart.rc
@@ -0,0 +1,156 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""afxres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+#endif // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.K.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_DIALOG DIALOGEX 0, 0, 187, 95
+STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN
+EXSTYLE WS_EX_WINDOWEDGE
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+ IDD_DIALOG, DIALOG
+ BEGIN
+ RIGHTMARGIN, 186
+ BOTTOMMARGIN, 94
+ END
+END
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDR_MENU1 MENU
+BEGIN
+ POPUP "ContextMenu"
+ BEGIN
+ MENUITEM "Get album art", ID_CONTEXTMENU_GETALBUMART
+ MENUITEM "Refresh album art", ID_CONTEXTMENU_REFRESH
+ MENUITEM "Open folder", ID_CONTEXTMENU_OPENFOLDER
+ MENUITEM SEPARATOR
+ MENUITEM "Lock aspect ratio", ID_CONTEXTMENU_LOCKASPECTRATIO
+ MENUITEM "Auto-hide", ID_CONTEXTMENU_AUTOHIDE
+ MENUITEM "Auto-hide window with modern skins", ID_CONTEXTMENU_AUTO_HIDE_MODERN
+ MENUITEM SEPARATOR
+ MENUITEM "Show album art for selected playlist item", ID_CONTEXTMENU_CLICKTRACK
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// PNG
+//
+
+IDR_IMAGE_NOTFOUND PNG "notfound.png"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE
+BEGIN
+ IDS_PLUGIN_NAME "Album Art v%s"
+ IDS_ALBUM_ART_MENU "Album Art\tAlt+A"
+ IDS_ALBUM_ART "Album Art"
+ IDS_DO_YOU_ALSO_WANT_TO_REMOVE_SETTINGS
+ "Do you also want to remove the saved settings for this plugin?"
+ IDS_ABOUT_STRING "%s\nby Will Fisher, (C) 2008\n\nUpdates by DrO, (C) 2009-2010"
+ IDS_ABOUT "About..."
+END
+
+STRINGTABLE
+BEGIN
+ 65535 "{EAD1E933-6D75-4c2c-B9C4-B4D7F06B7D8D}"
+END
+
+#endif // English (U.K.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/Src/Plugins/SDK/gen_classicart/gen_classicart.sln b/Src/Plugins/SDK/gen_classicart/gen_classicart.sln
new file mode 100644
index 00000000..c4f8e2a4
--- /dev/null
+++ b/Src/Plugins/SDK/gen_classicart/gen_classicart.sln
@@ -0,0 +1,30 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.32630.194
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gen_classicart", "gen_classicart.vcxproj", "{DD15E699-90D2-4301-921A-7C2C48B25766}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x86 = Debug|x86
+ Profiling|x86 = Profiling|x86
+ Release Static|x86 = Release Static|x86
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {DD15E699-90D2-4301-921A-7C2C48B25766}.Debug|x86.ActiveCfg = Debug|Win32
+ {DD15E699-90D2-4301-921A-7C2C48B25766}.Debug|x86.Build.0 = Debug|Win32
+ {DD15E699-90D2-4301-921A-7C2C48B25766}.Profiling|x86.ActiveCfg = Profiling|Win32
+ {DD15E699-90D2-4301-921A-7C2C48B25766}.Profiling|x86.Build.0 = Profiling|Win32
+ {DD15E699-90D2-4301-921A-7C2C48B25766}.Release Static|x86.ActiveCfg = Release|Win32
+ {DD15E699-90D2-4301-921A-7C2C48B25766}.Release Static|x86.Build.0 = Release|Win32
+ {DD15E699-90D2-4301-921A-7C2C48B25766}.Release|x86.ActiveCfg = Release|Win32
+ {DD15E699-90D2-4301-921A-7C2C48B25766}.Release|x86.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {66E16789-5B4D-4040-B006-59B99C861563}
+ EndGlobalSection
+EndGlobal
diff --git a/Src/Plugins/SDK/gen_classicart/gen_classicart.vcxproj b/Src/Plugins/SDK/gen_classicart/gen_classicart.vcxproj
new file mode 100644
index 00000000..ae03d0ca
--- /dev/null
+++ b/Src/Plugins/SDK/gen_classicart/gen_classicart.vcxproj
@@ -0,0 +1,449 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Profiling|Win32">
+ <Configuration>Profiling</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Profiling|x64">
+ <Configuration>Profiling</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectName>gen_classicart</ProjectName>
+ <ProjectGuid>{C3E347A7-B0D5-423B-A124-02936516B2EA}</ProjectGuid>
+ <RootNamespace>gen_classicart</RootNamespace>
+ <WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Profiling|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v142</PlatformToolset>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Profiling|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v142</PlatformToolset>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v142</PlatformToolset>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v142</PlatformToolset>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v142</PlatformToolset>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v142</PlatformToolset>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Profiling|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Profiling|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>16.0.32629.160</_ProjectFileVersion>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
+ <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
+ <LinkIncremental>false</LinkIncremental>
+ <IncludePath>$(IncludePath)</IncludePath>
+ <LibraryPath>$(LibraryPath)</LibraryPath>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
+ <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
+ <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
+ <LinkIncremental>false</LinkIncremental>
+ <IncludePath>$(IncludePath)</IncludePath>
+ <LibraryPath>$(LibraryPath)</LibraryPath>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
+ <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Profiling|Win32'">
+ <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
+ <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Profiling|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Label="Vcpkg">
+ <VcpkgEnabled>false</VcpkgEnabled>
+ </PropertyGroup>
+ <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <VcpkgConfiguration>Debug</VcpkgConfiguration>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\Wasabi;..\..;..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;_WIN32_WINNT=0x500;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <PrecompiledHeader />
+ <PrecompiledHeaderOutputFile>$(IntDir)$(TagetName).pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>shlwapi.lib;msimg32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ <SubSystem>Windows</SubSystem>
+ </Link>
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>$(IntDir)$(TargetName).tlb</TypeLibraryName>
+ <HeaderFileName />
+ </Midl>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\Wasabi;..\..;..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;_WIN32_WINNT=0x500;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <PrecompiledHeaderOutputFile>$(IntDir)$(TagetName).pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(IntDir)$(TagetName).pdb</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>shlwapi.lib;msimg32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TagetName).pdb</ProgramDatabaseFile>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ <SubSystem>Windows</SubSystem>
+ </Link>
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TypeLibraryName>$(IntDir)$(TargetName).tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MinSpace</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..\Wasabi;..\..;..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;TATAKI_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling />
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>true</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
+ <ForceConformanceInForLoopScope>true</ForceConformanceInForLoopScope>
+ <PrecompiledHeader />
+ <PrecompiledHeaderOutputFile>$(IntDir)$(TagetName).pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>None</DebugInformationFormat>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>shlwapi.lib;msimg32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <BaseAddress>0x12500000</BaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ </Link>
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>$(IntDir)$(TargetName).tlb</TypeLibraryName>
+ <HeaderFileName />
+ </Midl>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <Optimization>MinSpace</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..\Wasabi;..\..;..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;TATAKI_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>true</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
+ <ForceConformanceInForLoopScope>true</ForceConformanceInForLoopScope>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <PrecompiledHeaderOutputFile>$(IntDir)$(TagetName).pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(IntDir)$(TagetName).pdb</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>None</DebugInformationFormat>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>shlwapi.lib;msimg32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <BaseAddress>0x12500000</BaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ <ProgramDatabaseFile>$(IntDir)$(TagetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ </Link>
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TypeLibraryName>$(IntDir)$(TargetName).tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Profiling|Win32'">
+ <ClCompile>
+ <Optimization>MinSpace</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..\Wasabi;..\..;..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling />
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader />
+ <PrecompiledHeaderOutputFile>$(IntDir)$(TagetName).pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(IntDir)$(TagetName).pdb</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>shlwapi.lib;msimg32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <EntryPointSymbol>_DllMainCRTStartup</EntryPointSymbol>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ <ProgramDatabaseFile>$(IntDir)$(TagetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ </Link>
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>$(IntDir)$(TargetName).tlb</TypeLibraryName>
+ <HeaderFileName />
+ </Midl>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Profiling|x64'">
+ <ClCompile>
+ <Optimization>MinSpace</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..\Wasabi;..\..;..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <PrecompiledHeaderOutputFile>$(IntDir)$(TagetName).pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(IntDir)$(TagetName).pdb</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>shlwapi.lib;msimg32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <EntryPointSymbol>_DllMainCRTStartup</EntryPointSymbol>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ <ProgramDatabaseFile>$(IntDir)$(TagetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ </Link>
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TypeLibraryName>$(IntDir)$(TargetName).tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="gen_classicart.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="gen_classicart.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="api.h" />
+ <ClInclude Include="resource.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="notfound.png" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/Src/Plugins/SDK/gen_classicart/gen_classicart.vcxproj.filters b/Src/Plugins/SDK/gen_classicart/gen_classicart.vcxproj.filters
new file mode 100644
index 00000000..f7cf8108
--- /dev/null
+++ b/Src/Plugins/SDK/gen_classicart/gen_classicart.vcxproj.filters
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{dc60e336-beb5-4726-9c94-0b8e309bb18b}</UniqueIdentifier>
+ <Extensions>cpp;c;cxx;rc;def;r;odl;idl;hpj;bat</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{e70551dc-3601-4d7a-b048-646279a130b6}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl</Extensions>
+ </Filter>
+ <Filter Include="Image Files">
+ <UniqueIdentifier>{aba55931-1b82-424a-a1e3-18bd09bbc930}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{c89321cb-8ede-44a9-98b1-1e79cb278b95}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="gen_classicart.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="api.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="resource.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="notfound.png">
+ <Filter>Image Files</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="gen_classicart.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/Src/Plugins/SDK/gen_classicart/lng_generator.exe b/Src/Plugins/SDK/gen_classicart/lng_generator.exe
new file mode 100644
index 00000000..5dcd1227
--- /dev/null
+++ b/Src/Plugins/SDK/gen_classicart/lng_generator.exe
Binary files differ
diff --git a/Src/Plugins/SDK/gen_classicart/notfound.png b/Src/Plugins/SDK/gen_classicart/notfound.png
new file mode 100644
index 00000000..2a6cc8f1
--- /dev/null
+++ b/Src/Plugins/SDK/gen_classicart/notfound.png
Binary files differ
diff --git a/Src/Plugins/SDK/gen_classicart/resource.h b/Src/Plugins/SDK/gen_classicart/resource.h
new file mode 100644
index 00000000..d95d06e4
--- /dev/null
+++ b/Src/Plugins/SDK/gen_classicart/resource.h
@@ -0,0 +1,33 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by gen_classicart.rc
+//
+#define IDS_PLUGIN_NAME 1
+#define IDS_ALBUM_ART_MENU 2
+#define IDS_ALBUM_ART 3
+#define IDS_DO_YOU_ALSO_WANT_TO_REMOVE_SETTINGS 4
+#define IDS_ABOUT_STRING 5
+#define IDS_STRING6 6
+#define IDS_ABOUT 6
+#define IDD_DIALOG 101
+#define IDR_MENU1 102
+#define IDR_IMAGE_NOTFOUND 103
+#define ID_CONTEXTMENU_REFRESH 40001
+#define ID_CONTEXTMENU_LOCKASPECTRATIO 40002
+#define ID_CONTEXTMENU_GETALBUMART 40003
+#define ID_CONTEXTMENU_OPENFOLDER 40004
+#define ID_CONTEXTMENU_AUTOHIDE 40005
+#define ID_CONTEXTMENU_CLICKTRACK 40006
+#define ID_CONTEXTMENU_AUTO 40007
+#define ID_CONTEXTMENU_AUTO_HIDE_MODERN 40008
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 104
+#define _APS_NEXT_COMMAND_VALUE 40009
+#define _APS_NEXT_CONTROL_VALUE 1003
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif