aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Visualization/vis_avs/cfgwin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Visualization/vis_avs/cfgwin.cpp')
-rw-r--r--Src/Plugins/Visualization/vis_avs/cfgwin.cpp1918
1 files changed, 1918 insertions, 0 deletions
diff --git a/Src/Plugins/Visualization/vis_avs/cfgwin.cpp b/Src/Plugins/Visualization/vis_avs/cfgwin.cpp
new file mode 100644
index 00000000..d16a3ba2
--- /dev/null
+++ b/Src/Plugins/Visualization/vis_avs/cfgwin.cpp
@@ -0,0 +1,1918 @@
+/*
+ LICENSE
+ -------
+Copyright 2005 Nullsoft, Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ * Neither the name of Nullsoft nor the names of its contributors may be used to
+ endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+#include <windows.h>
+#include <stdio.h>
+#include <commctrl.h>
+#include "r_defs.h"
+#include "vis.h"
+#include "cfgwnd.h"
+#include "resource.h"
+#include "render.h"
+#include "rlib.h"
+#include "draw.h"
+#include "wnd.h"
+#include "bpm.h"
+#include "avs_eelif.h"
+#include "undo.h"
+#include "../Agave/Language/api_language.h"
+#include "../WAT/WAT.h"
+
+#ifdef LASER
+extern "C" {
+#include "laser/ld32.h"
+}
+#endif
+static void _do_add(HWND hwnd, HTREEITEM h, C_RenderListClass *list);
+static int treeview_hack;
+static HTREEITEM g_hroot;
+
+extern int g_config_smp_mt,g_config_smp;
+extern struct winampVisModule *g_mod;
+extern int cfg_cancelfs_on_deactivate;
+
+HWND g_debugwnd;
+
+char g_noeffectstr[48];
+//extern char *verstr;
+static HWND cur_hwnd;
+int is_aux_wnd=0;
+int config_prompt_save_preset=1,config_reuseonresize=1;
+//int g_preset_dirty;
+
+// extern BOOL CALLBACK aboutProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
+extern BOOL CALLBACK DlgProc_Bpm(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
+extern int readyToLoadPreset(HWND parent, int isnew);
+
+extern char *extension(char *fn) ;
+
+int g_dlg_fps,g_dlg_w,g_dlg_h;
+
+int cfg_cfgwnd_x=50,cfg_cfgwnd_y=50,cfg_cfgwnd_open=0;
+
+int cfg_fs_w=0,cfg_fs_h=0,cfg_fs_d=2,cfg_fs_bpp=0,cfg_fs_fps=0,cfg_fs_rnd=1,
+#ifdef LASER
+cfg_fs_flip=6,
+#else
+cfg_fs_flip=0,
+#endif
+cfg_fs_height=80,cfg_speed=5,cfg_fs_rnd_time=10,cfg_fs_use_overlay=0;
+int cfg_trans=0,cfg_trans_amount=128;
+int cfg_dont_min_avs=0;
+int cfg_transitions=4;
+int cfg_transitions2=4|32;
+int cfg_transitions_speed=8;
+int cfg_transition_mode=0x8001;
+int cfg_bkgnd_render=0,cfg_bkgnd_render_color=0x1F000F;
+int cfg_render_prio=0;
+
+char config_pres_subdir[MAX_PATH];
+char last_preset[2048];
+
+static BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
+HWND g_hwndDlg;
+
+extern HWND g_hwnd;
+
+#ifdef WA2_EMBED
+#include "wa_ipc.h"
+extern embedWindowState myWindowState;
+#endif
+
+/*
+HINSTANCE g_hDllInstance;
+HWND g_hwndParent;
+HANDLE hcfgThread;
+DWORD WINAPI cfgwnd_thread(LPVOID p)
+{
+ g_hwndDlg=CreateDialog(g_hDllInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,dlgProc);
+ while (1)
+ {
+ MSG msg;
+ if (!GetMessage(&msg,NULL,0,0)) break;
+ if (!IsDialogMessage(g_hwndDlg,&msg)) DispatchMessage(&msg);
+ }
+ return 0;
+}
+*/
+static int ExtractWindowsVersion(void)
+{
+ int dwVersion,dwWindowsMajorVersion,dwWindowsMinorVersion,WindowsType,dwBuild;
+
+ dwVersion = GetVersion();
+
+ // Get major and minor version numbers of Windows
+
+ dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
+ dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
+
+ // Get build numbers for Windows NT or Win32s
+ if (dwVersion < 0x80000000) // Windows NT
+ {
+ dwBuild = (DWORD)(HIWORD(dwVersion));
+ WindowsType = 0x4; // VER_WINNT
+ }
+ else if (dwWindowsMajorVersion < 4) // Win32s
+ {
+ dwBuild = (DWORD)(HIWORD(dwVersion) & ~0x8000);
+ WindowsType = 0x2; // VER_WIN32S
+ }
+ else // Windows 95 -- No build numbers provided
+ {
+ dwBuild = 0;
+ WindowsType = 0x1; // VER_WIN95
+ }
+
+ return dwWindowsMajorVersion;
+}
+
+void CfgWnd_Create(struct winampVisModule *this_mod)
+{
+ WASABI_API_CREATEDIALOG(IDD_DIALOG1,this_mod->hwndParent,dlgProc);
+ //CreateDialogA(this_mod->hDllInstance,MAKEINTRESOURCE(IDD_DIALOG1),this_mod->hwndParent,dlgProc);
+}
+
+void CfgWnd_Destroy(void)
+{
+ if (g_hwndDlg && IsWindow(g_hwndDlg))
+ {
+ RECT r;
+ GetWindowRect(g_hwndDlg,&r);
+ cfg_cfgwnd_x=r.left;
+ cfg_cfgwnd_y=r.top;
+ DestroyWindow(g_hwndDlg);
+ }
+ g_hwndDlg=0;
+ if (g_debugwnd) DestroyWindow(g_debugwnd);
+ /*
+ if (hcfgThread)
+ {
+ SendMessage(g_hwndDlg,WM_USER+6,0,0);
+ g_hwndDlg=0;
+ WaitForSingleObject(hcfgThread,INFINITE);
+ CloseHandle(hcfgThread);
+ hcfgThread=0;
+ }
+ */
+}
+
+static void recursiveAddDirList(HMENU menu, UINT *id, char *path, int pathlen)
+{
+ HANDLE h;
+ WIN32_FIND_DATA d;
+ char dirmask[4096];
+ wsprintf(dirmask,"%s\\*.*",path);
+
+ h = FindFirstFile(dirmask,&d);
+ if (h != INVALID_HANDLE_VALUE)
+ {
+ do {
+ if (d.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && d.cFileName[0] != '.')
+ {
+ wsprintf(dirmask,"%s\\%s",path,d.cFileName);
+
+ MENUITEMINFO i={sizeof(i),};
+ i.fType=MFT_STRING;
+ i.fMask=MIIM_TYPE|MIIM_ID;
+ i.dwTypeData = dirmask+pathlen+1;
+ i.cch = strlen(i.dwTypeData);
+ i.wID=*id;
+ InsertMenuItem(menu,*id+2-1025,TRUE,&i);
+ (*id)++;
+
+ recursiveAddDirList(menu,id,dirmask,pathlen);
+ }
+ } while (FindNextFile(h,&d));
+ FindClose(h);
+ }
+}
+
+static BOOL CALLBACK DlgProc_Preset(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ int x;
+ for (x = 0; x < 12; x ++)
+ {
+ char s[123];
+ wsprintf(s,"F%d",x+1);
+ SendDlgItemMessage(hwndDlg,IDC_COMBO1,CB_ADDSTRING,0,(LPARAM)s);
+ }
+ for (x = 0; x < 10; x ++)
+ {
+ char s[123];
+ wsprintf(s,"%d",x);
+ SendDlgItemMessage(hwndDlg,IDC_COMBO1,CB_ADDSTRING,0,(LPARAM)s);
+ }
+ for (x = 0; x < 10; x ++)
+ {
+ char s[123];
+ wsprintf(s,WASABI_API_LNGSTRING(IDS_SHIFT_X),x);
+ SendDlgItemMessage(hwndDlg,IDC_COMBO1,CB_ADDSTRING,0,(LPARAM)s);
+ }
+
+ CheckDlgButton(hwndDlg,IDC_CHECK3,cfg_fs_rnd?BST_CHECKED:BST_UNCHECKED);
+ SetDlgItemInt(hwndDlg,IDC_EDIT1,cfg_fs_rnd_time,FALSE);
+ if (config_prompt_save_preset)
+ CheckDlgButton(hwndDlg,IDC_CHECK1,BST_CHECKED);
+
+ if (config_pres_subdir[0])
+ SetDlgItemText(hwndDlg,IDC_BUTTON3,config_pres_subdir);
+ else
+ SetDlgItemText(hwndDlg,IDC_BUTTON3,WASABI_API_LNGSTRING(IDS_ALL));
+ }
+ return 1;
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDC_BUTTON3:
+ {
+ MENUITEMINFO i={sizeof(i),};
+
+ HMENU hMenu;
+ hMenu=CreatePopupMenu();
+ i.fMask=MIIM_TYPE|MIIM_ID;
+ i.fType=MFT_STRING;
+ i.wID = 1024;
+ i.dwTypeData=WASABI_API_LNGSTRING(IDS_ALL);
+ i.cch=strlen(i.dwTypeData);
+ InsertMenuItem(hMenu,0,TRUE,&i);
+ i.wID=0;
+ i.fType=MFT_SEPARATOR;
+ InsertMenuItem(hMenu,1,TRUE,&i);
+
+ UINT id=1025;
+ recursiveAddDirList(hMenu,&id,g_path,strlen(g_path));
+
+ RECT r;
+ GetWindowRect(GetDlgItem(hwndDlg,IDC_BUTTON3),&r);
+
+ int x=TrackPopupMenu(hMenu,TPM_LEFTALIGN|TPM_TOPALIGN|TPM_RETURNCMD|TPM_RIGHTBUTTON|TPM_LEFTBUTTON|TPM_NONOTIFY,r.left,r.bottom,0,hwndDlg,NULL);
+ if (x == 1024)
+ {
+ config_pres_subdir[0]=0;
+ SetDlgItemText(hwndDlg,IDC_BUTTON3,WASABI_API_LNGSTRING(IDS_ALL));
+ }
+ else if (x >= 1025)
+ {
+ MENUITEMINFO mi={sizeof(mi),MIIM_TYPE,};
+ mi.dwTypeData=config_pres_subdir;
+ mi.cch = sizeof(config_pres_subdir);
+ GetMenuItemInfo(hMenu,x,FALSE,&mi);
+ SetDlgItemText(hwndDlg,IDC_BUTTON3,config_pres_subdir);
+ }
+ DestroyMenu(hMenu);
+ }
+ return 0;
+ case IDC_CHECK1:
+ config_prompt_save_preset=IsDlgButtonChecked(hwndDlg,IDC_CHECK1)?1:0;
+ return 0;
+ case IDC_CHECK3:
+ cfg_fs_rnd=IsDlgButtonChecked(hwndDlg,IDC_CHECK3)?1:0;
+ #ifdef WA2_EMBED
+ SendMessage(g_mod->hwndParent,WM_WA_IPC,cfg_fs_rnd,IPC_CB_VISRANDOM);
+ #endif
+ return 0;
+ case IDC_EDIT1:
+ if (HIWORD(wParam) == EN_CHANGE)
+ {
+ BOOL f;
+ int r=GetDlgItemInt(hwndDlg,IDC_EDIT1,&f,0);
+ if (f)
+ {
+ cfg_fs_rnd_time=r;
+ }
+ }
+ return 0;
+ case IDC_BUTTON1:
+ {
+ int w=SendDlgItemMessage(hwndDlg,IDC_COMBO1,CB_GETCURSEL,0,0);
+ if (w != CB_ERR)
+ {
+ extern void WritePreset(int preset);
+ WritePreset(w);
+ }
+ }
+ return 0;
+ case IDC_BUTTON2:
+ if (readyToLoadPreset(hwndDlg,0))
+ {
+ int w=SendDlgItemMessage(hwndDlg,IDC_COMBO1,CB_GETCURSEL,0,0);
+ if (w != CB_ERR)
+ {
+ extern int LoadPreset(int preset);
+ LoadPreset(w);
+ }
+ }
+ return 0;
+ }
+ }
+ return 0;
+}
+
+static BOOL CALLBACK DlgProc_Disp(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ if (ExtractWindowsVersion()<5)
+ {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_TRANS_CHECK),0);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_TRANS_SLIDER),0);
+ }
+ else
+ {
+ CheckDlgButton(hwndDlg,IDC_TRANS_CHECK,cfg_trans?BST_CHECKED:BST_UNCHECKED);
+ SendDlgItemMessage(hwndDlg,IDC_TRANS_SLIDER, TBM_SETRANGE, (WPARAM)TRUE, (LPARAM)MAKELONG(16,255));
+ SendDlgItemMessage(hwndDlg,IDC_TRANS_SLIDER, TBM_SETTICFREQ, 10, (LPARAM)0);
+ SendDlgItemMessage(hwndDlg,IDC_TRANS_SLIDER, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)cfg_trans_amount);
+ }
+#ifdef LASER
+ extern int g_laser_nomessage,g_laser_zones;
+ ShowWindow(GetDlgItem(hwndDlg,IDC_L_SUPPRESS_OUTPUT),SW_SHOWNA);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_L_SYNC),SW_SHOWNA);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_L_SUPPRESS_DIALOGS),SW_SHOWNA);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_L_PROJZONES),SW_SHOWNA);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_L_FRAME),SW_SHOWNA);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_L_ACTIVEOUTPUT),SW_SHOWNA);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_THREADSBORDER),SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_CHECK4),SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_EDIT1),SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_THREADS),SW_HIDE);
+ CheckDlgButton(hwndDlg,IDC_L_SUPPRESS_DIALOGS,(g_laser_nomessage&1)?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_L_SUPPRESS_OUTPUT,(g_laser_nomessage&4)?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_L_SYNC,(g_laser_nomessage&8)?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_L_ACTIVEOUTPUT,(g_laser_nomessage&2)?BST_CHECKED:BST_UNCHECKED);
+#else
+ CheckDlgButton(hwndDlg,IDC_CHECK4,g_config_smp?BST_CHECKED:0);
+ SetDlgItemInt(hwndDlg,IDC_EDIT1,g_config_smp_mt,FALSE);
+#endif
+ }
+#ifdef WA2_EMBED
+ {
+ HWND w = myWindowState.me;
+ while (GetWindowLong(w, GWL_STYLE) & WS_CHILD) w = GetParent(w);
+ char classname[256];
+ GetClassName(w, classname, 255); classname[255] = 0;
+ if (!stricmp(classname, "BaseWindow_RootWnd"))
+ {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_STATIC_ALPHA), FALSE);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_TRANS_CHECK), FALSE);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_TRANS_SLIDER), FALSE);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_STATIC_TRANS_TOTAL), FALSE);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_STATIC_TRANS_NONE), FALSE);
+ }
+ }
+#endif
+ CheckDlgButton(hwndDlg,IDC_CHECK1,(cfg_fs_d&2)?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_CHECK6,(cfg_fs_flip&4)?BST_UNCHECKED:BST_CHECKED);
+ CheckDlgButton(hwndDlg,IDC_CHECK3,(cfg_fs_fps&2)?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_CHECK5,(cfg_fs_fps&4)?BST_CHECKED:BST_UNCHECKED);
+ //CheckDlgButton(hwndDlg,IDC_DONT_MIN_AVS,cfg_dont_min_avs?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_CHECK2,config_reuseonresize?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_BKGND_RENDER,(cfg_bkgnd_render&1)?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_SETDESKTOPCOLOR,(cfg_bkgnd_render&2)?BST_CHECKED:BST_UNCHECKED);
+ SendDlgItemMessage(hwndDlg,IDC_SLIDER1,TBM_SETRANGEMIN,0,0);
+ SendDlgItemMessage(hwndDlg,IDC_SLIDER1,TBM_SETRANGEMAX,0,80);
+ SendDlgItemMessage(hwndDlg,IDC_SLIDER1,TBM_SETPOS,1,cfg_speed&0xff);
+ SendDlgItemMessage(hwndDlg, IDC_THREAD_PRIORITY, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRING(IDS_SAME_AS_WINAMP));
+ SendDlgItemMessage(hwndDlg, IDC_THREAD_PRIORITY, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRING(IDS_IDLE));
+ SendDlgItemMessage(hwndDlg, IDC_THREAD_PRIORITY, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRING(IDS_LOWEST));
+ SendDlgItemMessage(hwndDlg, IDC_THREAD_PRIORITY, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRING(IDS_NORMAL));
+ SendDlgItemMessage(hwndDlg, IDC_THREAD_PRIORITY, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRING(IDS_HIGHEST));
+ SendDlgItemMessage(hwndDlg, IDC_THREAD_PRIORITY, CB_SETCURSEL, cfg_render_prio, 0);
+ return 1;
+
+ case WM_DRAWITEM:
+ {
+ DRAWITEMSTRUCT *di=(DRAWITEMSTRUCT *)lParam;
+ switch (di->CtlID)
+ {
+ case IDC_OVERLAYCOLOR:
+ GR_DrawColoredButton(di,cfg_bkgnd_render_color);
+ break;
+ }
+ }
+ return 0;
+ case WM_HSCROLL:
+ {
+ HWND swnd = (HWND) lParam;
+ int t = (int) SendMessage(swnd,TBM_GETPOS,0,0);
+ if (swnd == GetDlgItem(hwndDlg,IDC_SLIDER1))
+ {
+ cfg_speed&=~0xff;
+ cfg_speed|=t;
+ }
+ if (swnd == GetDlgItem(hwndDlg,IDC_TRANS_SLIDER))
+ {
+ cfg_trans_amount=t;
+ SetTransparency(g_hwnd,cfg_trans,cfg_trans_amount);
+ }
+ }
+ return 0;
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+#ifdef LASER
+ case IDC_L_PROJZONES:
+ {
+ extern int g_laser_zones;
+ HMENU hMenu=CreatePopupMenu();
+ int x;
+ for (x=0;x <20; x++)
+ {
+ PROJECTIONZONE pz;
+ if (ReadProjectionZone(x+1,&pz))
+ wsprintf(pz.Name,"Zone %d",x);
+ if (!pz.Name[0]) break;
+
+ MENUITEMINFO i={sizeof(i),};
+ i.wID = x+1;
+ i.fMask=MIIM_TYPE|MIIM_ID|MIIM_STATE;
+ i.fState=(g_laser_zones&(1<<x))?MFS_CHECKED:0;
+ i.fType=MFT_STRING;
+ i.dwTypeData=pz.Name;
+ i.cch=strlen(pz.Name);
+ InsertMenuItem(hMenu,x,TRUE,&i);
+ }
+
+ RECT r;
+ GetWindowRect(GetDlgItem(hwndDlg,IDC_L_PROJZONES),&r);
+
+ int v=TrackPopupMenu(hMenu,TPM_NONOTIFY|TPM_RETURNCMD,r.right,r.top,0,GetDlgItem(hwndDlg,IDC_L_PROJZONES),NULL);
+ DestroyMenu(hMenu);
+ if (v > 0)
+ {
+ g_laser_zones^=1<<(v-1);
+ if (!g_laser_zones) g_laser_zones=1;
+ }
+ }
+
+ return 0;
+ case IDC_L_SYNC:
+ {
+ extern int g_laser_nomessage;
+ g_laser_nomessage&=~8;
+ g_laser_nomessage|=IsDlgButtonChecked(hwndDlg,IDC_L_SYNC)?8:0;
+ }
+ return 0;
+ case IDC_L_SUPPRESS_OUTPUT:
+ {
+ extern int g_laser_nomessage;
+ g_laser_nomessage&=~4;
+ g_laser_nomessage|=IsDlgButtonChecked(hwndDlg,IDC_L_SUPPRESS_OUTPUT)?4:0;
+ }
+ return 0;
+ case IDC_L_SUPPRESS_DIALOGS:
+ {
+ extern int g_laser_nomessage;
+ g_laser_nomessage&=~1;
+ g_laser_nomessage|=IsDlgButtonChecked(hwndDlg,IDC_L_SUPPRESS_DIALOGS)?1:0;
+ }
+ return 0;
+ case IDC_L_ACTIVEOUTPUT:
+ {
+ extern int g_laser_nomessage;
+ g_laser_nomessage&=~2;
+ g_laser_nomessage|=IsDlgButtonChecked(hwndDlg,IDC_L_ACTIVEOUTPUT)?2:0;
+ }
+ return 0;
+#else
+ case IDC_CHECK4:
+ g_config_smp=!!IsDlgButtonChecked(hwndDlg,IDC_CHECK4);
+ return 0;
+ case IDC_EDIT1:
+ {
+ BOOL t;
+ g_config_smp_mt=GetDlgItemInt(hwndDlg,IDC_EDIT1,&t,FALSE);
+ }
+ return 0;
+#endif
+ case IDC_TRANS_CHECK:
+ cfg_trans=IsDlgButtonChecked(hwndDlg,IDC_TRANS_CHECK)?1:0;
+ SetTransparency(g_hwnd,cfg_trans,cfg_trans_amount);
+ return 0;
+ case IDC_CHECK1:
+ cfg_fs_d&=~2;
+ cfg_fs_d|=IsDlgButtonChecked(hwndDlg,IDC_CHECK1)?2:0;
+ {
+ RECT r;
+ extern void GetClientRect_adj(HWND hwnd, RECT *r);
+ GetClientRect_adj(g_hwnd,&r);
+ DDraw_Resize(r.right,r.bottom,cfg_fs_d&2);
+ }
+
+ return 0;
+ case IDC_CHECK6:
+ cfg_fs_flip&=~4;
+ cfg_fs_flip|=IsDlgButtonChecked(hwndDlg,IDC_CHECK6)?0:4;
+ return 0;
+ case IDC_CHECK3:
+ cfg_fs_fps&=~2;
+ cfg_fs_fps|=IsDlgButtonChecked(hwndDlg,IDC_CHECK3)?2:0;
+ return 0;
+ case IDC_CHECK5:
+ cfg_fs_fps&=~4;
+ cfg_fs_fps|=IsDlgButtonChecked(hwndDlg,IDC_CHECK5)?4:0;
+ return 0;
+ case IDC_CHECK2:
+ config_reuseonresize = !!IsDlgButtonChecked(hwndDlg,IDC_CHECK2);
+ return 0;
+// case IDC_DONT_MIN_AVS:
+ // cfg_dont_min_avs=IsDlgButtonChecked(hwndDlg,IDC_DONT_MIN_AVS)?1:0;
+ case IDC_DEFOVERLAYCOLOR:
+ cfg_bkgnd_render_color=0x1F000F;
+ InvalidateRect(GetDlgItem(hwndDlg,IDC_OVERLAYCOLOR),NULL,FALSE);
+ goto update_overlayshit;
+ case IDC_OVERLAYCOLOR:
+ GR_SelectColor(hwndDlg,&cfg_bkgnd_render_color);
+ InvalidateRect(GetDlgItem(hwndDlg,IDC_OVERLAYCOLOR),NULL,FALSE);
+ goto update_overlayshit;
+ case IDC_SETDESKTOPCOLOR:
+ case IDC_BKGND_RENDER:
+ cfg_bkgnd_render=(IsDlgButtonChecked(hwndDlg,IDC_BKGND_RENDER)?1:0) |
+ (IsDlgButtonChecked(hwndDlg,IDC_SETDESKTOPCOLOR)?2:0);
+ update_overlayshit:
+ {
+ RECT r;
+ extern void GetClientRect_adj(HWND hwnd, RECT *r);
+ GetClientRect_adj(g_hwnd,&r);
+ DDraw_Resize(r.right,r.bottom,cfg_fs_d&2);
+ }
+ return 0;
+ case IDC_THREAD_PRIORITY:
+ extern void main_setRenderThreadPriority();
+ cfg_render_prio=SendDlgItemMessage(hwndDlg,IDC_THREAD_PRIORITY,CB_GETCURSEL,0,0);
+ main_setRenderThreadPriority();
+ return 0;
+ }
+ return 0;
+ }
+ return 0;
+}
+
+static void enableFSWindows(HWND hwndDlg, int v)
+{
+ EnableWindow(GetDlgItem(hwndDlg,IDC_BPP_CONV),v);
+ //EnableWindow(GetDlgItem(hwndDlg,IDC_EDIT1),v);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_CHECK4),v);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_CHECK2),v);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_CHECK3),v);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_CHECK5),v);
+}
+
+extern int cfg_fs_dblclk;
+
+static BOOL CALLBACK DlgProc_FS(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ int l;
+ DDraw_EnumDispModes(GetDlgItem(hwndDlg,IDC_COMBO1));
+ l=SendDlgItemMessage(hwndDlg,IDC_COMBO1,CB_GETCOUNT,0,0);
+ if (l < 1 || l == CB_ERR)
+ {
+ SendDlgItemMessage(hwndDlg,IDC_COMBO1,CB_ADDSTRING,0,(LPARAM)WASABI_API_LNGSTRING(IDS_NO_SUITABLE_MODES_FOUND));
+ SendDlgItemMessage(hwndDlg,IDC_COMBO1,CB_SETCURSEL,0,0);
+ }
+ else
+ {
+ int x;
+ for (x = 0; x < l; x ++)
+ {
+ char b[256],*p=b;
+ SendDlgItemMessage(hwndDlg,IDC_COMBO1,CB_GETLBTEXT,x,(long)b);
+ int w,h,bpp;
+ w=atoi(p);
+ while (*p >= '0' && *p <= '9') p++;
+ if (!*p) continue;
+ h=atoi(++p);
+ while (*p >= '0' && *p <= '9') p++;
+ if (!*p) continue;
+ bpp=atoi(++p);
+ if (w == cfg_fs_w && h == cfg_fs_h && bpp == cfg_fs_bpp)
+ break;
+ }
+ if (x != l)
+ SendDlgItemMessage(hwndDlg,IDC_COMBO1,CB_SETCURSEL,x,0);
+ }
+ CheckDlgButton(hwndDlg,IDC_USE_OVERLAY,cfg_fs_use_overlay?BST_CHECKED:BST_UNCHECKED);
+ enableFSWindows(hwndDlg,!cfg_fs_use_overlay);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_CHECK8), cfg_fs_use_overlay);
+ CheckDlgButton(hwndDlg,IDC_CHECK1,(cfg_fs_d&1)?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_CHECK2,(cfg_fs_fps&1)?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_CHECK3,(cfg_fs_fps&8)?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_CHECK5,(cfg_fs_fps&16)?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_CHECK4,(cfg_fs_flip&1)?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_CHECK7,(cfg_fs_flip&2)?BST_UNCHECKED:BST_CHECKED);
+ CheckDlgButton(hwndDlg,IDC_CHECK8,(cfg_cancelfs_on_deactivate)?BST_UNCHECKED:BST_CHECKED);
+ CheckDlgButton(hwndDlg,IDC_BPP_CONV,(cfg_fs_flip&8)?BST_UNCHECKED:BST_CHECKED);
+ SetDlgItemInt(hwndDlg,IDC_EDIT1,cfg_fs_height,FALSE);
+ SendDlgItemMessage(hwndDlg,IDC_SLIDER1,TBM_SETRANGEMIN,0,0);
+ SendDlgItemMessage(hwndDlg,IDC_SLIDER1,TBM_SETRANGEMAX,0,80);
+ SendDlgItemMessage(hwndDlg,IDC_SLIDER1,TBM_SETPOS,1,(cfg_speed>>8)&0xff);
+ CheckDlgButton(hwndDlg,IDC_CHECK6,cfg_fs_dblclk?BST_CHECKED:BST_UNCHECKED);
+ }
+ return 1;
+ case WM_HSCROLL:
+ {
+ HWND swnd = (HWND) lParam;
+ int t = (int) SendMessage(swnd,TBM_GETPOS,0,0);
+ if (swnd == GetDlgItem(hwndDlg,IDC_SLIDER1))
+ {
+ cfg_speed&=~0xff00;
+ cfg_speed|=(t<<8);
+ }
+ }
+ return 0;
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDC_BUTTON1:
+ if (IsDlgButtonChecked(hwndDlg,IDC_USE_OVERLAY) || DDraw_IsMode(cfg_fs_w,cfg_fs_h,cfg_fs_bpp))
+ {
+ SetForegroundWindow(g_hwnd);
+ PostMessage(g_hwnd,WM_USER+32,0,0);
+ } else
+ {
+ char title[32];
+ MessageBox(hwndDlg,WASABI_API_LNGSTRING(IDS_CHOOSE_A_VIDEO_MODE),
+ WASABI_API_LNGSTRING_BUF(IDS_AVS_FULLSCREEN,title,32),MB_OK);
+ }
+ return 0;
+ case IDC_BPP_CONV:
+ cfg_fs_flip&=~8;
+ cfg_fs_flip|=IsDlgButtonChecked(hwndDlg,IDC_BPP_CONV)?0:8;
+ return 0;
+ case IDC_CHECK6:
+ cfg_fs_dblclk=!!IsDlgButtonChecked(hwndDlg,IDC_CHECK6);
+ return 0;
+ case IDC_CHECK1:
+ cfg_fs_d&=~1;
+ cfg_fs_d|=IsDlgButtonChecked(hwndDlg,IDC_CHECK1)?1:0;
+ return 0;
+ case IDC_CHECK2:
+ cfg_fs_fps&=~1;
+ cfg_fs_fps|=IsDlgButtonChecked(hwndDlg,IDC_CHECK2)?1:0;
+ return 0;
+ case IDC_CHECK3:
+ cfg_fs_fps&=~8;
+ cfg_fs_fps|=IsDlgButtonChecked(hwndDlg,IDC_CHECK3)?8:0;
+ return 0;
+ case IDC_CHECK5:
+ cfg_fs_fps&=~16;
+ cfg_fs_fps|=IsDlgButtonChecked(hwndDlg,IDC_CHECK5)?16:0;
+ return 0;
+ case IDC_CHECK4:
+ cfg_fs_flip&=~1;
+ cfg_fs_flip|=IsDlgButtonChecked(hwndDlg,IDC_CHECK4)?1:0;
+ return 0;
+ case IDC_CHECK7:
+ cfg_fs_flip&=~2;
+ cfg_fs_flip|=IsDlgButtonChecked(hwndDlg,IDC_CHECK7)?0:2;
+ return 0;
+ case IDC_CHECK8:
+ cfg_cancelfs_on_deactivate = IsDlgButtonChecked(hwndDlg,IDC_CHECK8)?0:1;
+ return 0;
+ case IDC_EDIT1:
+ if (HIWORD(wParam) == EN_CHANGE) {
+ BOOL t;
+ int r=GetDlgItemInt(hwndDlg,IDC_EDIT1,&t,FALSE);
+ if (r > 0 && r <= 100 && t)
+ cfg_fs_height=r;
+ }
+ return 0;
+ case IDC_COMBO1:
+ if (HIWORD(wParam) == CBN_SELCHANGE)
+ {
+ int bps=-1;
+ char b[256],*p=b;
+ int l=SendDlgItemMessage(hwndDlg,IDC_COMBO1,CB_GETCURSEL,0,0);
+ if (l == CB_ERR) return 0;
+ SendDlgItemMessage(hwndDlg,IDC_COMBO1,CB_GETLBTEXT,l,(long)b);
+ int w,h;
+ while (*p >= '0' && *p <= '9') p++;
+ if (!*p) return 0;
+ *p++=0;
+ w=atoi(b);
+ while (*p < '0' && *p > '9' && *p) p ++;
+ h=atoi(p);
+ while (*p >= '0' && *p <= '9') p++;
+ if (!*p) return 0;
+ p++;
+ bps=atoi(p);
+ if (w < 1|| h < 1 || bps < 1) return 0;
+ cfg_fs_h=h;
+ cfg_fs_w=w;
+ cfg_fs_bpp=bps;
+ }
+ return 0;
+ case IDC_USE_OVERLAY:
+ cfg_fs_use_overlay=IsDlgButtonChecked(hwndDlg,IDC_USE_OVERLAY)?1:0;
+ enableFSWindows(hwndDlg,!cfg_fs_use_overlay);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_CHECK8), cfg_fs_use_overlay);
+ return 0;
+ }
+ return 0;
+ }
+ return 0;
+}
+
+
+static void _insertintomenu2(HMENU hMenu, int wid, int id, char *str)
+{
+ int x;
+ for (x=0; x < 4096; x ++)
+ {
+ MENUITEMINFO mi={sizeof(mi),MIIM_DATA|MIIM_TYPE|MIIM_SUBMENU,MFT_STRING};
+ char c[512];
+ mi.dwTypeData=c;
+ mi.cch = 512;
+ if (!GetMenuItemInfo(hMenu,x,TRUE,&mi)) break;
+ if (strcmp(str,c)<0 && !mi.hSubMenu)
+ break;
+ }
+
+ MENUITEMINFO i={sizeof(i),};
+ i.wID = wid;
+ i.fMask=MIIM_TYPE|MIIM_DATA|MIIM_ID;
+ i.fType=MFT_STRING;
+ i.dwItemData=id;
+ i.dwTypeData=str;
+ i.cch=strlen(str);
+ InsertMenuItem(hMenu,x,TRUE,&i);
+}
+
+static HMENU _findsubmenu(HMENU hmenu, char *str)
+{
+ int x;
+ for (x=0; x < 4096; x ++)
+ {
+ MENUITEMINFO mi={sizeof(mi),MIIM_DATA|MIIM_TYPE|MIIM_SUBMENU,MFT_STRING};
+ char c[512];
+ mi.dwTypeData=c;
+ mi.cch = 512;
+ if (!GetMenuItemInfo(hmenu,x,TRUE,&mi)) break;
+ if (!strcmp(str,c) && mi.hSubMenu) return mi.hSubMenu;
+ }
+ return 0;
+}
+
+static void _insertintomenu(HMENU hMenu, int wid, int id, char *str)
+{
+ char ostr[1024];
+ strncpy(ostr,str,1023);
+ char *first=str;
+ char *second=str;
+ while (*second && *second != '/') second++;
+ if (*second) *second++=0;
+ if (*second)
+ {
+ while (*second == ' ' || *second == '/') second++;
+ if (*second)
+ {
+ HMENU hs;
+
+ if (!(hs=_findsubmenu(hMenu,first)))
+ {
+ MENUITEMINFO i={sizeof(i),};
+ i.fMask=MIIM_TYPE|MIIM_SUBMENU|MIIM_DATA|MIIM_ID;
+ i.fType=MFT_STRING;
+ i.dwTypeData = first;
+ i.cch = strlen(first);
+ i.hSubMenu=hs=CreatePopupMenu();
+ i.wID=0;
+ InsertMenuItem(hMenu,0,TRUE,&i);
+ }
+ _insertintomenu2(hs,wid,id,second);
+ return;
+ }
+ }
+ _insertintomenu2(hMenu,wid,id,ostr);
+
+}
+static HTREEITEM g_dragsource_item,g_dragsource_parent, g_draglastdest, g_dragplace;
+static int g_dragplaceisbelow;
+extern int findInMenu(HMENU parent, HMENU sub, UINT id, char *buf, int buf_len);
+
+#define UNDO_TIMER_INTERVAL 333
+
+static WNDPROC sniffConfigWindow_oldProc;
+static BOOL CALLBACK sniffConfigWindow_newProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
+{
+ bool dirty = false;
+ if (uMsg == WM_COMMAND || uMsg == WM_HSCROLL || uMsg == WM_VSCROLL)
+ {
+ if (uMsg != WM_COMMAND || HIWORD(wParam) == EN_CHANGE ||
+ HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == LBN_SELCHANGE ||
+ HIWORD(wParam) == CBN_SELCHANGE
+
+ )
+ dirty = true;
+ }
+
+ BOOL retval = CallWindowProc(sniffConfigWindow_oldProc,hwndDlg,uMsg,wParam,lParam);
+
+ // Don't save the new state until the window proc handles it. :)
+ if (dirty)
+ {
+ KillTimer(GetParent(hwndDlg),69);
+ SetTimer(GetParent(hwndDlg),69,UNDO_TIMER_INTERVAL,NULL);
+
+
+// g_preset_dirty=1;
+ }
+
+ return retval;
+}
+
+
+int dosavePreset(HWND hwndDlg)
+{
+ int r=1;
+ char temp[2048];
+ OPENFILENAME l={sizeof(l),0};
+ char buf1[2048],buf2[2048];
+ char filter[128], *ptr = filter;
+ char savePreset[64];
+
+ WASABI_API_LNGSTRING_BUF(IDS_AVS_FILTER_STRING,filter,128);
+ while(*ptr)
+ {
+ if (*ptr=='|') *ptr=0;
+ ptr++;
+ }
+ temp[0]=0;
+ GetCurrentDirectory(sizeof(buf2),buf2);
+ strcpy(buf1,g_path);
+ l.hwndOwner = hwndDlg;
+ l.lpstrFilter = filter;
+ l.lpstrFile = temp;
+ strcpy(temp,last_preset);
+ l.nMaxFile = 2048-1;
+ l.lpstrTitle = WASABI_API_LNGSTRING_BUF(IDS_SAVE_PRESET,savePreset,64);
+ l.lpstrDefExt = "AVS";
+ l.lpstrInitialDir = buf1;
+ l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_OVERWRITEPROMPT;
+ if (GetSaveFileName(&l))
+ {
+ strcpy(last_preset,temp); // this was changed from: lstrcpyn(last_preset,temp, 2048);
+ r=g_render_effects->__SavePreset(temp);
+ if (r==1) MessageBox(hwndDlg,WASABI_API_LNGSTRING(IDS_ERROR_SAVING_PRESET),savePreset,MB_OK);
+ else if (r==2) MessageBox(hwndDlg,WASABI_API_LNGSTRING(IDS_PRESET_TOO_LARGE),savePreset,MB_OK);
+ else if (r==-1) MessageBox(hwndDlg,WASABI_API_LNGSTRING(IDS_OUT_OF_MEMORY),savePreset,MB_OK);
+ else
+ {
+ C_UndoStack::cleardirty();
+ // g_preset_dirty=0;
+ }
+ }
+ SetCurrentDirectory(buf2);
+ return r;
+}
+
+extern int g_config_seh;
+
+static BOOL CALLBACK debugProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
+{
+ extern int debug_reg[8];
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ int x;
+ for (x = 0; x < 8; x ++)
+ {
+ SetDlgItemInt(hwndDlg,IDC_DEBUGREG_1+x*2,debug_reg[x],FALSE);
+ }
+ SetTimer(hwndDlg,1,250,NULL);
+ }
+ if (g_log_errors) CheckDlgButton(hwndDlg,IDC_CHECK1,BST_CHECKED);
+ if (g_reset_vars_on_recompile) CheckDlgButton(hwndDlg,IDC_CHECK2,BST_CHECKED);
+ if (!g_config_seh) CheckDlgButton(hwndDlg,IDC_CHECK3,BST_CHECKED);
+
+ return 0;
+ case WM_TIMER:
+ if (wParam == 1)
+ {
+ int x;
+ for (x = 0; x < 8; x ++)
+ {
+ char buf[128];
+ int v=debug_reg[x];
+ if (v >=0 && v < 100)
+ sprintf(buf,"%.14f",NSEEL_getglobalregs()[v]);
+ else strcpy(buf,"?");
+ SetDlgItemText(hwndDlg,IDC_DEBUGREG_1+x*2+1,buf);
+ }
+
+ if (g_log_errors)
+ {
+ //IDC_EDIT1
+ EnterCriticalSection(&g_eval_cs);
+ char buf[1025];
+ GetDlgItemText(hwndDlg,IDC_EDIT1,buf,sizeof(buf)-1);
+ buf[sizeof(buf)-1]=0;
+ if (strcmp(buf,last_error_string))
+ SetDlgItemText(hwndDlg,IDC_EDIT1,last_error_string);
+ LeaveCriticalSection(&g_eval_cs);
+ }
+
+ {
+ char buf[512];
+ int *g_evallib_stats=NSEEL_getstats();
+ wsprintf(buf,WASABI_API_LNGSTRING(IDS_EVAL_CODE_STATS_ETC),
+ g_evallib_stats[4],g_evallib_stats[0],g_evallib_stats[1],g_evallib_stats[2],g_evallib_stats[3]);
+ SetDlgItemText(hwndDlg,IDC_EDIT2,buf);
+ }
+
+ }
+ return 0;
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDC_CHECK1:
+ g_log_errors = !!IsDlgButtonChecked(hwndDlg,IDC_CHECK1);
+ return 0;
+ case IDC_CHECK2:
+ g_reset_vars_on_recompile = !!IsDlgButtonChecked(hwndDlg,IDC_CHECK2);
+ return 0;
+ case IDC_CHECK3:
+ g_config_seh = !IsDlgButtonChecked(hwndDlg,IDC_CHECK3);
+ return 0;
+ case IDC_BUTTON1:
+ EnterCriticalSection(&g_eval_cs);
+ last_error_string[0]=0;
+ SetDlgItemText(hwndDlg,IDC_EDIT1,"");
+ LeaveCriticalSection(&g_eval_cs);
+ return 0;
+ case IDOK:
+ case IDCANCEL:
+ DestroyWindow(hwndDlg);
+ return 0;
+ default:
+ if (HIWORD(wParam) == EN_CHANGE && LOWORD(wParam) >= IDC_DEBUGREG_1 && LOWORD(wParam) <= IDC_DEBUGREG_16)
+ {
+ int x=LOWORD(wParam)-IDC_DEBUGREG_1;
+ if (!(x&1))
+ {
+ x/=2;
+ if (x > 7) x= 7;
+ BOOL t;
+ int v=GetDlgItemInt(hwndDlg,IDC_DEBUGREG_1+x*2,&t,FALSE);
+ if (t) debug_reg[x]=v;
+ }
+ }
+ break;
+ }
+ return 0;
+ case WM_DESTROY:
+ g_debugwnd=0;
+ return 0;
+ }
+ return 0;
+}
+
+static BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
+{
+ static HMENU presetTreeMenu;
+ static int presetTreeCount;
+ extern int need_redock;
+ extern int inWharf;
+ extern void toggleWharfAmpDock(HWND hwnd);
+
+ switch (uMsg)
+ {
+ case WM_INITMENU:
+ EnableMenuItem((HMENU)wParam,IDM_UNDO,MF_BYCOMMAND|(C_UndoStack::can_undo()?MF_ENABLED:MF_GRAYED));
+ EnableMenuItem((HMENU)wParam,IDM_REDO,MF_BYCOMMAND|(C_UndoStack::can_redo()?MF_ENABLED:MF_GRAYED));
+ return 0;
+ case WM_INITMENUPOPUP:
+ if (!HIWORD(lParam) && presetTreeMenu && !GetMenuItemCount((HMENU)wParam))
+ {
+ char buf[2048];
+ buf[0]=0;
+ if (findInMenu(presetTreeMenu,(HMENU)wParam,0,buf,2048))
+ {
+ HANDLE h;
+ WIN32_FIND_DATA d;
+ char dirmask[4096];
+ wsprintf(dirmask,"%s%s\\*.*",g_path,buf);
+ int directory_pos=0, insert_pos=0;
+ // build menu
+ h = FindFirstFile(dirmask,&d);
+ if (h != INVALID_HANDLE_VALUE)
+ {
+ do
+ {
+ if (d.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && d.cFileName[0] != '.')
+ {
+ MENUITEMINFO mi={sizeof(mi),MIIM_SUBMENU|MIIM_TYPE,MFT_STRING,MFS_DEFAULT };
+ mi.hSubMenu=CreatePopupMenu();
+ mi.dwTypeData=d.cFileName;
+ mi.cch = strlen(d.cFileName);
+ InsertMenuItem((HMENU)wParam,directory_pos++,TRUE,&mi);
+ insert_pos++;
+ }
+ else if (!stricmp(extension(d.cFileName),"avs"))
+ {
+ extension(d.cFileName)[-1]=0;
+ MENUITEMINFO i={sizeof(i),MIIM_TYPE|MIIM_DATA|MIIM_ID,MFT_STRING,MFS_DEFAULT };
+ i.dwTypeData = d.cFileName;
+ i.cch = strlen(d.cFileName);
+ i.dwItemData=0xFFFFFFFF;//preset
+ i.wID=presetTreeCount++;
+ InsertMenuItem((HMENU)wParam,insert_pos++,TRUE,&i);
+ }
+ } while (FindNextFile(h,&d));
+ FindClose(h);
+ }
+ }
+ }
+ return 0;
+ case WM_USER+20:
+ CfgWnd_Unpopulate();
+ CfgWnd_Populate();
+ return 0;
+ case WM_CLOSE:
+ if (inWharf)
+ {
+#ifdef WA2_EMBED
+ toggleWharfAmpDock(g_hwnd);
+ }
+#else
+ PostMessage(g_hwnd,WM_CLOSE,0,0);
+ }
+ else
+#endif
+ {
+ cfg_cfgwnd_open=0;
+ ShowWindow(hwndDlg,SW_HIDE);
+ }
+ return 0;
+ case WM_DESTROY:
+ return 0;
+ case WM_INITDIALOG:
+ {
+ #ifdef LASER
+ HMENU m=GetMenu(hwndDlg);
+ m=GetSubMenu(m,1);
+ DeleteMenu(m,IDM_TRANSITIONS,MF_BYCOMMAND);
+ #endif
+ g_hwndDlg=hwndDlg;
+ //SetDlgItemText(hwndDlg,IDC_AVS_VER,verstr);
+ WASABI_API_LNGSTRING_BUF(IDS_NO_EFFECT_SETTING_SELECTED,g_noeffectstr,48);
+
+ TreeView_SetIndent(GetDlgItem(hwndDlg,IDC_TREE1),8);
+ SetTimer(hwndDlg,1,250,NULL);
+ if (cfg_cfgwnd_open)
+ ShowWindow(hwndDlg,SW_SHOWNA);
+ CfgWnd_Populate();
+ SetWindowPos(hwndDlg,NULL,cfg_cfgwnd_x,cfg_cfgwnd_y,0,0,SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOZORDER);
+ if (need_redock)
+ {
+ need_redock=0;
+ toggleWharfAmpDock(g_hwnd);
+ }
+ else
+ {
+ RECT r,r2;
+ // hide IDC_RRECT, resize IDC_TREE1 up
+ GetWindowRect(GetDlgItem(g_hwndDlg,IDC_RRECT),&r);
+ GetWindowRect(GetDlgItem(g_hwndDlg,IDC_TREE1),&r2);
+ ShowWindow(GetDlgItem(g_hwndDlg,IDC_RRECT),SW_HIDE);
+ SetWindowPos(GetDlgItem(g_hwndDlg,IDC_TREE1),NULL,0,0,r2.right-r2.left,r.bottom - r2.top - 2,SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE);
+ }
+ }
+ return TRUE;
+ case WM_TIMER:
+ if (wParam == 1)
+ {
+ char s[1024];
+ char *tp=last_preset;
+ while (*tp) tp++;
+ while (tp >= last_preset && *tp != '\\')
+ tp--;
+ tp++;
+ wsprintf(s,"%d.%d FPS @ %dx%d%s%s",g_dlg_fps/10,g_dlg_fps%10,g_dlg_w,g_dlg_h,*tp?" - ":".",tp);
+ tp=s;
+ while (*tp) tp++;
+ while (tp > s && *tp != '.' && *tp != '-') tp--;
+ if (*tp == '.') *tp=0;
+ SetDlgItemText(hwndDlg,IDC_FPS,s);
+ }
+ if (wParam == 69)
+ {
+ KillTimer(hwndDlg,69);
+ C_UndoStack::saveundo();
+ }
+ return FALSE;
+ case WM_MOUSEMOVE:
+ if (g_dragsource_item)
+ {
+ TVHITTESTINFO hti={0,};
+ HWND hwnd=GetDlgItem(hwndDlg,IDC_TREE1);
+ hti.pt.x=(int)LOWORD(lParam);
+ hti.pt.y=(int)HIWORD(lParam);
+ ClientToScreen(hwndDlg,&hti.pt);
+ ScreenToClient(hwnd,&hti.pt);
+ HTREEITEM h=TreeView_HitTest(hwnd,&hti);
+ if (hti.flags&TVHT_ABOVE)
+ {
+ SendMessage(hwnd,WM_VSCROLL,SB_LINEUP,NULL);
+ }
+ if (hti.flags&TVHT_BELOW)
+ {
+ SendMessage(hwnd,WM_VSCROLL,SB_LINEDOWN,NULL);
+ }
+ if (hti.flags&TVHT_NOWHERE)
+ {
+ h=g_hroot;
+ }
+ if ((hti.flags&(TVHT_NOWHERE|TVHT_ONITEMINDENT|TVHT_ONITEMRIGHT|TVHT_ONITEM|TVHT_ONITEMBUTTON))&&h)
+ {
+ HTREEITEM temp=h;
+ while (temp && temp != TVI_ROOT)
+ {
+ if (temp==g_dragsource_item)
+ {
+ h=g_dragsource_item;
+ break;
+ }
+ temp=TreeView_GetParent(hwnd,temp);
+ }
+ if (h == g_dragsource_item)
+ {
+ SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_NO)));
+ if (g_dragplace) TreeView_DeleteItem(hwnd,g_dragplace);
+ g_dragplace=0;
+ }
+ else
+ {
+ SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
+ TV_ITEM i={TVIF_HANDLE|TVIF_PARAM,h,0,0,0,0,0};
+ TreeView_GetItem(hwnd,&i);
+ if(i.lParam)
+ {
+ RECT r;
+ TreeView_GetItemRect(hwnd,h,&r,FALSE);
+ if (hti.pt.y > r.bottom-(r.bottom-r.top)/2) g_dragplaceisbelow=1;
+ else g_dragplaceisbelow=0;
+ HTREEITEM parenth;
+ g_draglastdest=h;
+ C_RenderListClass::T_RenderListType *it=(C_RenderListClass::T_RenderListType *)i.lParam;
+
+ if (it->effect_index==LIST_ID && (hti.flags&(TVHT_ONITEMINDENT|TVHT_ONITEMBUTTON)||h==g_hroot))
+ {
+ if (g_dragplace && (TreeView_GetParent(hwnd,g_dragplace)!=h ||
+ TreeView_GetNextSibling(hwnd,g_dragplace)))
+ {
+ TreeView_DeleteItem(hwnd,g_dragplace);
+ g_dragplace=0;
+ }
+
+ g_dragplaceisbelow=2;
+ parenth=h;
+ h=TVI_LAST;
+ }
+ else
+ {
+ parenth=TreeView_GetParent(hwnd,h);
+ if (g_dragplace && ((g_dragplaceisbelow&1)?
+ TreeView_GetNextSibling(hwnd,h)!=g_dragplace:
+ TreeView_GetPrevSibling(hwnd,h)!=g_dragplace))
+ {
+ TreeView_DeleteItem(hwnd,g_dragplace);
+ g_dragplace=0;
+ }
+ if (!g_dragplaceisbelow)
+ {
+ h=TreeView_GetPrevSibling(hwnd,h);
+ if (!h) h=TVI_FIRST;
+ }
+ }
+ if (!g_dragplace)
+ {
+ TV_INSERTSTRUCT is={parenth,h,{TVIF_PARAM|TVIF_TEXT|TVIF_CHILDREN,0,0,0,
+ WASABI_API_LNGSTRING(IDS_MOVE_HERE),0,0,0,0,(int)0}};
+ g_dragplace=TreeView_InsertItem(hwnd,&is);
+ if (g_dragplaceisbelow==2)
+ SendMessage(hwnd,TVM_EXPAND,TVE_EXPAND,(long)parenth);
+ }
+ }
+ }
+ }
+ return 0;
+ }
+ break;
+ case WM_LBUTTONUP:
+ if (g_dragsource_item)
+ {
+ HWND hwnd=GetDlgItem(hwndDlg,IDC_TREE1);
+ SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
+ if (g_dragplace)
+ {
+ TreeView_DeleteItem(hwnd,g_dragplace);
+ g_dragplace=0;
+ }
+ HTREEITEM h=g_draglastdest;
+ if (h)
+ {
+ C_RenderListClass::T_RenderListType *source, *source_parent;
+ C_RenderListClass::T_RenderListType *dest, // handle of item to insert above. NULL if end.
+ *dest_parent=NULL; // handle of parent to insert into
+ HTREEITEM dest_handle=h, // handle of item to insert above. NULL if folder.
+ dest_parent_handle=TreeView_GetParent(hwnd,h); // handle of parent
+ {
+ TV_ITEM i={TVIF_HANDLE|TVIF_PARAM,dest_handle,0,0,0,0,0};
+ TreeView_GetItem(hwnd,&i);
+ dest=(C_RenderListClass::T_RenderListType *)i.lParam;
+ }
+ if (dest_parent_handle)
+ {
+ TV_ITEM i={TVIF_HANDLE|TVIF_PARAM,dest_parent_handle,0,0,0,0,0};
+ TreeView_GetItem(hwnd,&i);
+ dest_parent=(C_RenderListClass::T_RenderListType *)i.lParam;
+ }
+ if (dest->effect_index==LIST_ID && (!dest_parent_handle||g_dragplaceisbelow==2))
+ {
+ dest_parent_handle=dest_handle;
+ dest_handle=NULL;
+ dest_parent=dest;
+ dest=NULL;
+ }
+
+ TV_ITEM i={TVIF_HANDLE|TVIF_PARAM|TVIF_STATE,g_dragsource_item,0,TVIS_EXPANDED,0,0,0};
+ TreeView_GetItem(hwnd,&i);
+ int expand=i.state&TVIS_EXPANDED;
+ source=(C_RenderListClass::T_RenderListType *)i.lParam;
+
+ TV_ITEM i2={TVIF_HANDLE|TVIF_PARAM,g_dragsource_parent,0,0,0,0,0};
+ TreeView_GetItem(hwnd,&i2);
+ source_parent=(C_RenderListClass::T_RenderListType *)i2.lParam;
+
+ int recurse_okay=1;
+ {
+ HTREEITEM temp=dest_parent_handle;
+ while (temp && temp != TVI_ROOT)
+ {
+ if (temp==g_dragsource_item) recurse_okay=0;
+ temp=TreeView_GetParent(hwnd,temp);
+ }
+ }
+ if (dest_handle != g_dragsource_item && recurse_okay)
+ {
+ C_RenderListClass *s=(C_RenderListClass *)source_parent->render;
+ C_RenderListClass *d=(C_RenderListClass *)dest_parent->render;
+ int os=0;
+ int a=s->findRender(source);
+ int b=d->findRender(dest);
+ int err=1;
+ if (a >= 0)
+ {
+ EnterCriticalSection(&g_render_cs);
+ err=s->removeRender(a,0);
+ if (!err)
+ {
+ d->insertRender(source,b+(g_dragplaceisbelow&1));
+ }
+ LeaveCriticalSection(&g_render_cs);
+ }
+ if (err)
+ {
+ char title[48];
+ MessageBox(NULL,WASABI_API_LNGSTRING(IDS_ERROR_TREE_INCONSISTANCY),
+ WASABI_API_LNGSTRING_BUF(IDS_CRITICAL_ERROR_OCCURRED,title,48),MB_OK);
+ }
+
+ treeview_hack=1;
+ TreeView_DeleteItem(hwnd,g_dragsource_item);
+
+ TV_INSERTSTRUCT is={dest_parent_handle,0,{TVIF_PARAM|TVIF_TEXT|TVIF_CHILDREN,0,0,0,source->render->get_desc(),0,0,0,source->effect_index==LIST_ID?1:0,(int)source}};
+
+ if (dest_handle)
+ {
+ if (g_dragplaceisbelow&1) is.hInsertAfter=dest_handle;
+ else
+ {
+ is.hInsertAfter=TreeView_GetPrevSibling(hwnd,dest_handle);
+ if (!is.hInsertAfter) is.hInsertAfter=TVI_FIRST;
+ }
+ }
+ else is.hInsertAfter=TVI_LAST;
+
+ HTREEITEM newi=TreeView_InsertItem(hwnd,&is);
+ if (source->effect_index == LIST_ID)
+ {
+ _do_add(hwnd,newi,(C_RenderListClass *)source->render);
+ if (expand) SendMessage(hwnd,TVM_EXPAND,TVE_EXPAND,(long)newi);
+ }
+ TreeView_Select(hwnd,newi,TVGN_CARET);
+ treeview_hack=0;
+
+ // After everything is changed, then save the undo and set the dirty bit.
+ KillTimer(hwndDlg,69);
+ SetTimer(hwndDlg,69,UNDO_TIMER_INTERVAL,NULL);
+ // g_preset_dirty=1;
+ }
+ }
+ TreeView_Select(hwnd,NULL,TVGN_DROPHILITE);
+ ReleaseCapture();
+ g_dragsource_item=0;
+ return 0;
+ }
+ break;
+
+ case WM_NOTIFY:
+ {
+ NM_TREEVIEW* p = (NM_TREEVIEW*)lParam;
+ if (p->hdr.hwndFrom == GetDlgItem(hwndDlg, IDC_TREE1))
+ {
+ // Element is being dragged
+ if (p->hdr.code==TVN_BEGINDRAG)
+ {
+ if (p->itemNew.hItem != g_hroot)
+ {
+ g_draglastdest=0;
+ g_dragsource_parent=TreeView_GetParent(p->hdr.hwndFrom,p->itemNew.hItem);
+ if (g_dragsource_parent)
+ {
+ SetCapture(hwndDlg);
+ g_dragsource_item=p->itemNew.hItem;
+ g_dragplace=0;
+
+ TreeView_Select(p->hdr.hwndFrom,g_dragsource_item,TVGN_CARET);
+ SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_APPSTARTING)));
+ }
+ else
+ g_dragsource_item=NULL;
+ }
+ else
+ g_dragsource_item=NULL;
+ }
+ // new element is selected selectis
+ if ((p->hdr.code== TVN_SELCHANGEDW || p->hdr.code == TVN_SELCHANGEDA) && !treeview_hack)
+ {
+ HTREEITEM hTreeItem = TreeView_GetSelection(p->hdr.hwndFrom);
+ if (hTreeItem)
+ {
+ TV_ITEM i={TVIF_HANDLE|TVIF_PARAM,hTreeItem,0,0,0,0,0};
+ TreeView_GetItem(p->hdr.hwndFrom,&i);
+ C_RenderListClass::T_RenderListType *tp=(C_RenderListClass::T_RenderListType *)i.lParam;
+ is_aux_wnd=0;
+ if (tp&&tp->render)
+ {
+ SetDlgItemText(hwndDlg,IDC_EFNAME,tp->render->get_desc());
+ if (cur_hwnd)
+ DestroyWindow(cur_hwnd);
+ cur_hwnd=tp->render->conf(g_render_library->GetRendererInstance(tp->effect_index,g_hInstance),hwndDlg);
+ if (cur_hwnd)
+ sniffConfigWindow_oldProc=(WNDPROC)SetWindowLong(cur_hwnd, GWLP_WNDPROC,(LONG)sniffConfigWindow_newProc);
+ }
+ if (cur_hwnd)
+ {
+ RECT r;
+ GetWindowRect(GetDlgItem(hwndDlg,IDC_EFFECTRECT),&r);
+ ScreenToClient(hwndDlg,(LPPOINT)&r);
+ SetWindowPos(cur_hwnd,0,r.left,r.top,0,0,SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER);
+ ShowWindow(cur_hwnd,SW_SHOWNA);
+ } else
+ SetDlgItemText(hwndDlg,IDC_EFNAME,g_noeffectstr);
+ }
+ }
+ // a tree view item has been clicked
+
+ }
+ }
+ break;
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDC_RRECT:
+ if (HIWORD(wParam)==1)
+ {
+ toggleWharfAmpDock(g_hwnd);
+ }
+ return 0;
+ case IDM_HELP_DEBUGWND:
+ if (!g_debugwnd) g_debugwnd=WASABI_API_CREATEDIALOG(IDD_DEBUG,g_hwnd,debugProc);
+ ShowWindow(g_debugwnd,SW_SHOW);
+ return 0;
+ case IDM_ABOUT:
+ // DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_DIALOG2),hwndDlg,aboutProc);
+ about(hwndDlg);
+ return 0;
+ case IDM_DISPLAY:
+ case IDM_FULLSCREEN:
+ case IDM_PRESETS:
+ case IDM_BPM:
+ case IDM_TRANSITIONS:
+ {
+ int name_ids[5]={IDS_DISPLAY,IDS_FULLSCREEN_SETTINGS,IDS_PRESET_HOTKEYS,IDS_BEAT_DETECTION,IDS_TRANSITIONS};
+ int x=0;
+ if (LOWORD(wParam) == IDM_DISPLAY) x=1;
+ if (LOWORD(wParam) == IDM_FULLSCREEN) x=2;
+ if (LOWORD(wParam) == IDM_PRESETS) x=3;
+ if (LOWORD(wParam) == IDM_BPM) x=4;
+ if (LOWORD(wParam) == IDM_TRANSITIONS) x=5;
+
+ if (x >= 1 && x <= 5)
+ {
+ SetDlgItemText(hwndDlg,IDC_EFNAME,WASABI_API_LNGSTRING(name_ids[x-1]));
+ TreeView_Select(GetDlgItem(hwndDlg,IDC_TREE1),NULL,TVGN_CARET);
+ if (cur_hwnd) DestroyWindow(cur_hwnd);
+ if (x==1)
+ cur_hwnd=WASABI_API_CREATEDIALOG(IDD_GCFG_DISP,hwndDlg,DlgProc_Disp);
+ if (x==2)
+ cur_hwnd=WASABI_API_CREATEDIALOG(IDD_GCFG_FS,hwndDlg,DlgProc_FS);
+ if (x==3)
+ cur_hwnd=WASABI_API_CREATEDIALOG(IDD_GCFG_PRESET,hwndDlg,DlgProc_Preset);
+ if (x==4)
+ cur_hwnd=WASABI_API_CREATEDIALOG(IDD_GCFG_BPM,hwndDlg,DlgProc_Bpm);
+ if (x==5)
+ cur_hwnd=g_render_transition->conf(g_hInstance,hwndDlg);
+ if (cur_hwnd)
+ {
+ RECT r;
+ is_aux_wnd=1;
+ GetWindowRect(GetDlgItem(hwndDlg,IDC_EFFECTRECT),&r);
+ ScreenToClient(hwndDlg,(LPPOINT)&r);
+ SetWindowPos(cur_hwnd,0,r.left,r.top,0,0,SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER);
+ ShowWindow(cur_hwnd,SW_SHOWNA);
+ }
+ else
+ SetDlgItemText(hwndDlg,IDC_EFNAME,g_noeffectstr);
+ }
+ }
+ return 0;
+ case IDC_ADD:
+ {
+ C_RenderListClass::T_RenderListType ren={0};
+ RECT r;
+ presetTreeMenu=CreatePopupMenu();
+
+ HMENU hAddMenu=CreatePopupMenu();
+
+ // int insert_pos=0;
+ int p=64;
+ int x=0;
+ while (1)
+ {
+ char str[1024];
+ if (!g_render_library->GetRendererDesc(x,str))
+ break;
+
+ if (str[0])
+ _insertintomenu(hAddMenu,p++,x,str);
+
+ x++;
+ }
+ x=DLLRENDERBASE;
+ while (1)
+ {
+ char str[1024];
+ int id=g_render_library->GetRendererDesc(x++, str);
+ if (!id) break;
+ if (str[0]) _insertintomenu(hAddMenu,p++,id,str);
+ }
+ _insertintomenu(hAddMenu,p++,LIST_ID,WASABI_API_LNGSTRING(IDS_EFFECT_LIST));
+
+ int preset_base=presetTreeCount=p;
+ // add presets
+ {
+ MENUITEMINFO i={sizeof(i),};
+ i.hSubMenu=presetTreeMenu;
+ i.fMask=MIIM_SUBMENU|MIIM_TYPE|MIIM_ID;
+ i.fType=MFT_STRING;
+ i.dwTypeData = WASABI_API_LNGSTRING(IDS_PRESETS);
+ i.cch = strlen((char*)i.dwTypeData);
+ InsertMenuItem(hAddMenu,0,TRUE,&i);
+ i.hSubMenu=0;
+ i.fMask=MIIM_TYPE|MIIM_ID;
+ i.fType=MFT_SEPARATOR;
+ InsertMenuItem(hAddMenu,1,TRUE,&i);
+
+ HANDLE h;
+ WIN32_FIND_DATA d;
+ char dirmask[1024];
+ wsprintf(dirmask,"%s\\*.*",g_path);
+
+ int directory_pos=0,insert_pos=0;
+
+ h = FindFirstFile(dirmask,&d);
+ if (h != INVALID_HANDLE_VALUE)
+ {
+ do
+ {
+ if (d.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && d.cFileName[0] != '.')
+ {
+ MENUITEMINFO mi={sizeof(mi),MIIM_SUBMENU|MIIM_TYPE,MFT_STRING,MFS_DEFAULT};
+ mi.hSubMenu=CreatePopupMenu();
+ mi.dwTypeData=d.cFileName;
+ mi.cch = strlen(d.cFileName);
+ InsertMenuItem(presetTreeMenu,directory_pos++,TRUE,&mi);
+ insert_pos++;
+ }
+ else if (!stricmp(extension(d.cFileName),"avs"))
+ {
+ extension(d.cFileName)[-1]=0;
+ MENUITEMINFO i={sizeof(i),MIIM_DATA|MIIM_TYPE|MIIM_ID,MFT_STRING,MFS_DEFAULT };
+ i.dwTypeData = d.cFileName;
+ i.cch = strlen(d.cFileName);
+ i.dwItemData=0xffffffff;
+ i.wID=presetTreeCount++;
+ InsertMenuItem(presetTreeMenu,insert_pos++,TRUE,&i);
+ }
+ } while (FindNextFile(h,&d));
+ FindClose(h);
+ }
+ }
+
+ GetWindowRect(GetDlgItem(hwndDlg,IDC_ADD),&r);
+ int t=TrackPopupMenu(hAddMenu,TPM_LEFTALIGN|TPM_TOPALIGN|TPM_RETURNCMD|TPM_RIGHTBUTTON|TPM_LEFTBUTTON,r.right,r.top,0,hwndDlg,NULL);
+ if (t)
+ {
+ char buf[2048];
+ buf[0]=0;
+ if (t >= preset_base)
+ {
+ if (findInMenu(presetTreeMenu,0,t,buf,2048))
+ {
+ //preset
+ C_RenderListClass *r;
+ char temp[4096];
+ ren.effect_index=LIST_ID;
+ wsprintf(temp,"%s%s.avs",g_path,buf);
+ r=new C_RenderListClass();
+ if (!r->__LoadPreset(temp,1))
+ {
+ ren.render=(C_RBASE*)r;
+ }
+ else
+ {
+ delete r;
+ ren.render=NULL;
+ }
+ }
+ }
+ else
+ {
+ MENUITEMINFO mi={sizeof(mi),MIIM_DATA,};
+ GetMenuItemInfo(hAddMenu,t,FALSE,&mi);
+ if (mi.dwItemData != 0xffffffff) // effect
+ {
+ ren.effect_index=mi.dwItemData;
+ ren.render=g_render_library->CreateRenderer(&ren.effect_index,&ren.has_rbase2);
+ }
+ }
+
+ if (ren.render)
+ {
+ int insert_pos=0;
+ HTREEITEM hTreeItem = TreeView_GetSelection(GetDlgItem(hwndDlg,IDC_TREE1));
+ C_RenderListClass *parentrender=g_render_effects;
+ HTREEITEM parenthandle=g_hroot;
+ if (hTreeItem)
+ {
+ TV_ITEM i={TVIF_HANDLE|TVIF_PARAM,hTreeItem,0,0,0,0,0};
+ TreeView_GetItem(GetDlgItem(hwndDlg,IDC_TREE1),&i);
+ C_RenderListClass::T_RenderListType *tp=(C_RenderListClass::T_RenderListType *)i.lParam;
+ if (tp->effect_index == LIST_ID)
+ {
+ parentrender=(C_RenderListClass *)tp->render;
+ parenthandle=hTreeItem;
+ }
+ else
+ {
+ HTREEITEM hParent=TreeView_GetParent(GetDlgItem(hwndDlg,IDC_TREE1),hTreeItem);
+ if (hParent && hParent != TVI_ROOT)
+ {
+ TV_ITEM i2={TVIF_HANDLE|TVIF_PARAM,hParent,0,0,0,0,0};
+ TreeView_GetItem(GetDlgItem(hwndDlg,IDC_TREE1),&i2);
+ C_RenderListClass::T_RenderListType *tparent=(C_RenderListClass::T_RenderListType *)i2.lParam;
+ parentrender=(C_RenderListClass *)tparent->render;
+ parenthandle=hParent;
+ }
+ for (insert_pos=0; insert_pos<parentrender->getNumRenders()
+ && parentrender->getRender(insert_pos)->render != tp->render; insert_pos++);
+ }
+ }
+
+ EnterCriticalSection(&g_render_cs);
+ parentrender->insertRender(&ren,insert_pos);
+ LeaveCriticalSection(&g_render_cs);
+ C_RenderListClass::T_RenderListType *newt=(C_RenderListClass::T_RenderListType *)GlobalAlloc(GMEM_FIXED,sizeof(C_RenderListClass::T_RenderListType));
+ *newt=ren;
+ TV_INSERTSTRUCT is={parenthandle,0,{TVIF_PARAM|TVIF_TEXT|TVIF_CHILDREN,0,0,0,ren.render->get_desc(),0,0,0,newt->effect_index==LIST_ID?1:0,(int)newt}};
+ if (!hTreeItem || parenthandle==hTreeItem)
+ {
+ is.hInsertAfter=TVI_FIRST;
+ }
+ else
+ {
+ is.hInsertAfter=TreeView_GetPrevSibling(GetDlgItem(hwndDlg,IDC_TREE1),hTreeItem);
+ if (!is.hInsertAfter) is.hInsertAfter=TVI_FIRST;
+ }
+ HTREEITEM newh=TreeView_InsertItem(GetDlgItem(hwndDlg,IDC_TREE1),&is);
+ TreeView_Select(GetDlgItem(hwndDlg,IDC_TREE1),newh,TVGN_CARET);
+ if (ren.effect_index == LIST_ID)
+ _do_add(GetDlgItem(hwndDlg,IDC_TREE1),newh,(C_RenderListClass *)ren.render);
+
+ // Always do undo last.
+ KillTimer(hwndDlg,69);
+ SetTimer(hwndDlg,69,UNDO_TIMER_INTERVAL,NULL);
+ // g_preset_dirty=1;
+ }
+ }
+ DestroyMenu(hAddMenu);
+ presetTreeMenu=0;
+ } // end of IDC_ADD
+ return 0;
+ case IDC_CLEAR:
+ if (readyToLoadPreset(hwndDlg,1))
+ {
+ if (g_render_transition->LoadPreset("",0) != 2)
+ last_preset[0]=0;
+ }
+ return 0;
+ case IDC_REMSEL:
+ {
+ HTREEITEM hTreeItem = TreeView_GetSelection(GetDlgItem(hwndDlg,IDC_TREE1));
+ if (hTreeItem == g_hroot)
+ {
+ CfgWnd_Unpopulate();
+ EnterCriticalSection(&g_render_cs);
+ g_render_effects->clearRenders();
+ LeaveCriticalSection(&g_render_cs);
+ CfgWnd_Populate();
+ }
+ else if (hTreeItem)
+ {
+ C_RenderListClass *parentrender;
+ TV_ITEM i={TVIF_HANDLE|TVIF_PARAM,hTreeItem,0,0,0,0,0};
+ if (TreeView_GetItem(GetDlgItem(hwndDlg,IDC_TREE1),&i))
+ {
+ C_RenderListClass::T_RenderListType *tp=(C_RenderListClass::T_RenderListType *)i.lParam;
+ HTREEITEM hParent=TreeView_GetParent(GetDlgItem(hwndDlg,IDC_TREE1),hTreeItem);
+ if (hParent != NULL)
+ {
+ TV_ITEM i2={TVIF_HANDLE|TVIF_PARAM,hParent,0,0,0,0,0};
+ TreeView_GetItem(GetDlgItem(hwndDlg,IDC_TREE1),&i2);
+ C_RenderListClass::T_RenderListType *tparent=(C_RenderListClass::T_RenderListType *)i2.lParam;
+ parentrender=(C_RenderListClass*)tparent->render;
+ EnterCriticalSection(&g_render_cs);
+ if (!parentrender->removeRenderFrom(tp,1))
+ {
+ TreeView_DeleteItem(GetDlgItem(hwndDlg,IDC_TREE1),hTreeItem);
+ if (tp)
+ GlobalFree((HGLOBAL)tp);
+ }
+ LeaveCriticalSection(&g_render_cs);
+ }
+ }
+ }
+ // Always save undo last.
+ KillTimer(hwndDlg,69);
+ SetTimer(hwndDlg,69,UNDO_TIMER_INTERVAL,NULL);
+ // g_preset_dirty=1;
+ }
+ return 0;
+ case IDC_CLONESEL:
+ {
+ C_RenderListClass::T_RenderListType ren={0,};
+ int insert_pos=-1;
+
+ HTREEITEM hTreeItem = TreeView_GetSelection(GetDlgItem(hwndDlg,IDC_TREE1));
+ if (hTreeItem && hTreeItem != g_hroot)
+ {
+ TV_ITEM i={TVIF_HANDLE|TVIF_PARAM,hTreeItem,0,0,0,0,0};
+ TreeView_GetItem(GetDlgItem(hwndDlg,IDC_TREE1),&i);
+ C_RenderListClass::T_RenderListType *tp=(C_RenderListClass::T_RenderListType *)i.lParam;
+ ren.effect_index=tp->effect_index;
+ ren.render=g_render_library->CreateRenderer(&ren.effect_index,&ren.has_rbase2);
+ if (ren.render)
+ {
+ HTREEITEM hParent=TreeView_GetParent(GetDlgItem(hwndDlg,IDC_TREE1),hTreeItem);
+ if (hParent && hParent != TVI_ROOT)
+ {
+ TV_ITEM i2={TVIF_HANDLE|TVIF_PARAM,hParent,0,0,0,0,0};
+ TreeView_GetItem(GetDlgItem(hwndDlg,IDC_TREE1),&i2);
+ C_RenderListClass::T_RenderListType *tparent=(C_RenderListClass::T_RenderListType *)i2.lParam;
+ C_RenderListClass *parentrender=(C_RenderListClass *)tparent->render;
+ for (insert_pos=0; insert_pos<parentrender->getNumRenders()
+ && parentrender->getRender(insert_pos)->render != tp->render; insert_pos++);
+ insert_pos++;
+ unsigned char *buf = (unsigned char *) GlobalAlloc(GPTR,1024*1024);
+ if (buf)
+ {
+ int len=tp->render->save_config(buf);
+ ren.render->load_config(buf,len);
+ GlobalFree((HGLOBAL)buf);
+ }
+ EnterCriticalSection(&g_render_cs);
+ parentrender->insertRender(&ren,insert_pos);
+ LeaveCriticalSection(&g_render_cs);
+
+ C_RenderListClass::T_RenderListType *newt=(C_RenderListClass::T_RenderListType *)GlobalAlloc(GMEM_FIXED,sizeof(C_RenderListClass::T_RenderListType));
+ *newt=ren;
+ TV_INSERTSTRUCT is={hParent,0,{TVIF_PARAM|TVIF_TEXT|TVIF_CHILDREN,0,0,0,ren.render->get_desc(),0,0,0,newt->effect_index==LIST_ID?1:0,(int)newt}};
+ is.hInsertAfter=hTreeItem;
+ HTREEITEM newh=TreeView_InsertItem(GetDlgItem(hwndDlg,IDC_TREE1),&is);
+ TreeView_Select(GetDlgItem(hwndDlg,IDC_TREE1),newh,TVGN_CARET);
+ if (ren.effect_index == LIST_ID)
+ _do_add(GetDlgItem(hwndDlg,IDC_TREE1),newh,(C_RenderListClass *)ren.render);
+ }
+ }
+ // Always save undo last.
+ KillTimer(hwndDlg,69);
+ SetTimer(hwndDlg,69,UNDO_TIMER_INTERVAL,NULL);
+ // g_preset_dirty=1;
+ }
+ }
+ return 0;
+ case IDC_LOAD:
+ {
+ char temp[2048];
+ OPENFILENAME l={sizeof(l),0};
+ char buf1[2048],buf2[2048];
+ char filter[128], *ptr = filter;
+ char loadPreset[64];
+
+ WASABI_API_LNGSTRING_BUF(IDS_AVS_FILTER_STRING,filter,128);
+ while(*ptr)
+ {
+ if (*ptr=='|') *ptr=0;
+ ptr++;
+ }
+
+ GetCurrentDirectory(sizeof(buf2),buf2);
+ strcpy(buf1,g_path); // this was changed from: lstrcpyn(buf1,g_path,sizeof(buf1));
+ temp[0]=0;
+ l.lpstrInitialDir = buf1;
+ l.hwndOwner = hwndDlg;
+ l.lpstrFilter = filter;
+ l.lpstrFile = temp;
+ l.nMaxFile = 2048-1;
+ l.lpstrTitle = WASABI_API_LNGSTRING_BUF(IDS_LOAD_PRESET,loadPreset,48);
+ l.lpstrDefExt = "AVS";
+ l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER;
+ if (readyToLoadPreset(hwndDlg,0) && GetOpenFileName(&l))
+ {
+ int x=g_render_transition->LoadPreset(temp,0);
+ if (x == 2)
+ MessageBox(hwndDlg,WASABI_API_LNGSTRING(IDS_STILL_INITIALIZING_PREVIOUS_PRESET),loadPreset,MB_OK);
+ else
+ lstrcpyn(last_preset,temp,sizeof(last_preset));
+ }
+ SetCurrentDirectory(buf2);
+ }
+ return 0;
+ case IDC_SAVE:
+ dosavePreset(hwndDlg);
+ return 0;
+ case IDM_UNDO:
+ C_UndoStack::undo();
+ return 0;
+ case IDM_REDO:
+ C_UndoStack::redo();
+ return 0;
+ } // end of switch(LOWORD(Param))
+ return 0;
+ }// end of switch(uMsg)
+ return 0;
+}
+
+static void _do_add(HWND hwnd, HTREEITEM h, C_RenderListClass *list)
+{
+ int x,l;
+ l=list->getNumRenders();
+ for (x = 0; x < l; x ++)
+ {
+ C_RenderListClass::T_RenderListType *t=list->getRender(x);
+ if (t)
+ {
+ C_RenderListClass::T_RenderListType *newt=(C_RenderListClass::T_RenderListType *)GlobalAlloc(GMEM_FIXED,sizeof(C_RenderListClass::T_RenderListType));
+ memcpy(newt,t,sizeof(C_RenderListClass::T_RenderListType));
+ TV_INSERTSTRUCT is;
+ memset(&is,0,sizeof(is));
+
+ is.hParent=h;
+ is.hInsertAfter=TVI_LAST;
+ is.item.mask=TVIF_PARAM|TVIF_TEXT|TVIF_CHILDREN;
+ is.item.pszText=t->render->get_desc();
+ is.item.cChildren=t->effect_index==LIST_ID?1:0;
+ is.item.lParam=(int)newt;
+
+ HTREEITEM h2=TreeView_InsertItem(hwnd,&is);
+ if (t->effect_index==LIST_ID)
+ {
+ _do_add(hwnd,h2,(C_RenderListClass *)t->render);
+ }
+ }
+ }
+ SendMessage(hwnd,TVM_EXPAND,TVE_EXPAND,(long)h);
+}
+
+static void _do_free(HWND hwnd, HTREEITEM h)
+{
+ while (h)
+ {
+ TV_ITEM i={TVIF_HANDLE|TVIF_PARAM,h,0,0,0,0,0};
+ TreeView_GetItem(hwnd,&i);
+ if (i.lParam) GlobalFree((HGLOBAL)(void*)i.lParam);
+ HTREEITEM h2=TreeView_GetChild(hwnd,h);
+ if (h2) _do_free(hwnd,h2);
+ h=TreeView_GetNextSibling(hwnd,h);
+ }
+}
+
+int need_repop;
+
+void CfgWnd_RePopIfNeeded(void)
+{
+ if (need_repop)
+ {
+ CfgWnd_Unpopulate(1);
+ CfgWnd_Populate(1);
+ need_repop=0;
+ }
+}
+
+void CfgWnd_Unpopulate(int force)
+{
+ if (force || (IsWindowVisible(g_hwndDlg)&&!DDraw_IsFullScreen()))
+ {
+ HWND hwnd=GetDlgItem(g_hwndDlg,IDC_TREE1);
+ if (!is_aux_wnd)
+ {
+ if (cur_hwnd) DestroyWindow(cur_hwnd);
+ cur_hwnd=0;
+ SetDlgItemText(g_hwndDlg,IDC_EFNAME,g_noeffectstr);
+ }
+ treeview_hack=1;
+ _do_free(hwnd,TreeView_GetChild(hwnd,TVI_ROOT));
+ TreeView_DeleteAllItems(hwnd);
+ treeview_hack=0;
+ }
+ else need_repop=1;
+}
+
+void CfgWnd_Populate(int force)
+{
+ if (force || (IsWindowVisible(g_hwndDlg)&&!DDraw_IsFullScreen()))
+ {
+ treeview_hack=1;
+ HWND hwnd=GetDlgItem(g_hwndDlg,IDC_TREE1);
+ C_RenderListClass::T_RenderListType *newt=(C_RenderListClass::T_RenderListType *)GlobalAlloc(GMEM_FIXED,sizeof(C_RenderListClass::T_RenderListType));
+ newt->render=g_render_effects;
+ newt->effect_index=LIST_ID;
+ TV_INSERTSTRUCT is;
+ memset(&is,0,sizeof(is));
+ is.hParent=TVI_ROOT;
+ is.hInsertAfter=TVI_LAST;
+ is.item.mask=TVIF_PARAM|TVIF_TEXT|TVIF_CHILDREN;
+ is.item.pszText=WASABI_API_LNGSTRING(IDS_MAIN);
+ is.item.cChildren=1;
+ is.item.lParam=(int)newt;
+ g_hroot=TreeView_InsertItem(hwnd,&is);
+ if (g_hroot)
+ {
+ _do_add(hwnd,g_hroot,g_render_effects);
+ SendMessage(hwnd,TVM_EXPAND,TVE_EXPAND,(long)g_hroot);
+ }
+ treeview_hack=0;
+ }
+ else need_repop=1;
+}