diff options
Diffstat (limited to 'plugins/KeyboardNotify/options.cpp')
| -rw-r--r-- | plugins/KeyboardNotify/options.cpp | 1568 | 
1 files changed, 1568 insertions, 0 deletions
diff --git a/plugins/KeyboardNotify/options.cpp b/plugins/KeyboardNotify/options.cpp new file mode 100644 index 0000000000..d415862503 --- /dev/null +++ b/plugins/KeyboardNotify/options.cpp @@ -0,0 +1,1568 @@ +/*
 +
 +This program is free software; you can redistribute it and/or
 +modify it under the terms of the GNU General Public License
 +as published by the Free Software Foundation; either version 2
 +of the License, or (at your option) any later version.
 +
 +This program is distributed in the hope that it will be useful,
 +but WITHOUT ANY WARRANTY; without even the implied warranty of
 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +GNU General Public License for more details.
 +
 +You should have received a copy of the GNU General Public License
 +along with this program; if not, write to the Free Software
 +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 +
 +*/
 +
 +#define WIN32_LEAN_AND_MEAN
 +
 +#include <stdio.h>
 +#include <stdlib.h>
 +#include <windows.h>
 +#include <commctrl.h>
 +#include <commdlg.h>
 +#include "flash.h"
 +#include "ignore.h"
 +#include "resource.h"
 +#include "constants.h"
 +#include "protolist.h"
 +#include "EnumProc.h"
 +#include "utils.h"
 +#include <newpluginapi.h>
 +#include <m_clc.h>
 +#include <m_clist.h>
 +#include <m_database.h>
 +#include <m_langpack.h>
 +#include <m_options.h>
 +#include <m_protosvc.h>
 +#include <m_protocols.h>
 +#include <m_icq.h>
 +
 +#define IDI_BLANK			200
 +
 +#ifndef ETDT_ENABLE
 +#define ETDT_ENABLE			0x00000002
 +#endif
 +#ifndef ETDT_USETABTEXTURE
 +#define ETDT_USETABTEXTURE	0x00000004
 +#endif
 +#ifndef ETDT_ENABLETAB
 +#define ETDT_ENABLETAB		(ETDT_ENABLE|ETDT_USETABTEXTURE)
 +#endif
 +
 +#ifndef ListView_SetCheckState
 +#define ListView_SetCheckState(hLv, iItem, bCheck) \
 +	ListView_SetItemState(hLv, iItem, bCheck ? INDEXTOSTATEIMAGEMASK(2) : INDEXTOSTATEIMAGEMASK(1), LVIS_STATEIMAGEMASK)
 +#endif
 +
 +#ifndef TVS_NOHSCROLL
 +#define TVS_NOHSCROLL		0x8000
 +#endif
 +
 +#ifndef TVM_GETITEMSTATE
 +#define TVM_GETITEMSTATE	(TV_FIRST+39)
 +#endif
 +
 +#ifndef TreeView_SetItemState
 +#define TreeView_SetItemState(hwndTv, hti, data, _mask) \
 +	{ TVITEM _TVI; \
 +	  _TVI.mask = TVIF_STATE; \
 +	  _TVI.hItem = hti; \
 +	  _TVI.stateMask = _mask; \
 +	  _TVI.state = data; \
 +	  SendMessageA((hwndTv), TVM_SETITEM, 0, (LPARAM)&_TVI); }
 +#endif
 +
 +#ifndef TreeView_GetItemState
 +#define TreeView_GetItemState(hwndTv, hti, mask) \
 +	(UINT)SendMessageA((hwndTv), TVM_GETITEMSTATE, (WPARAM)(hti), (LPARAM)(mask))
 +#endif
 +
 +void LoadSettings(void);
 +int InitializeOptions(WPARAM,LPARAM);
 +INT_PTR CALLBACK DlgProcOptions(HWND, UINT, WPARAM, LPARAM);
 +INT_PTR CALLBACK DlgProcProtoOptions(HWND, UINT, WPARAM, LPARAM);
 +INT_PTR CALLBACK DlgProcBasicOptions(HWND, UINT, WPARAM, LPARAM);
 +INT_PTR CALLBACK DlgProcEffectOptions(HWND, UINT, WPARAM, LPARAM);
 +INT_PTR CALLBACK DlgProcThemeOptions(HWND, UINT, WPARAM, LPARAM);
 +INT_PTR CALLBACK DlgProcProcesses(HWND, UINT, WPARAM, LPARAM);
 +INT_PTR CALLBACK DlgProcEventLeds(HWND, UINT, WPARAM, LPARAM);
 +INT_PTR CALLBACK DlgProcXstatusList(HWND, UINT, WPARAM, LPARAM);
 +void exportThemes(const TCHAR *);
 +void importThemes(const TCHAR *, BOOL);
 +void writeThemeToCombo(const TCHAR *, const TCHAR *, BOOL);
 +void createProcessListAux(void);
 +void destroyProcessListAux(void);
 +void createXstatusListAux(void);
 +void destroyXstatusListAux(void);
 +
 +
 +extern HINSTANCE hInst;
 +extern double dWinVer;
 +extern BOOL bWindowsNT;
 +
 +extern BYTE bFlashOnMsg;
 +extern BYTE bFlashOnURL;
 +extern BYTE bFlashOnFile;
 +extern BYTE bFlashOnOther;
 +extern BYTE bFullScreenMode;
 +extern BYTE bScreenSaverRunning;
 +extern BYTE bWorkstationLocked;
 +extern BYTE bProcessesAreRunning;
 +extern BYTE bWorkstationActive;
 +extern BYTE bFlashIfMsgOpen;
 +extern BYTE bFlashIfMsgOlder;
 +extern WORD wSecondsOlder;
 +extern BYTE bFlashUntil;
 +extern WORD wBlinksNumber;
 +extern BYTE bMirandaOrWindows;
 +extern WORD wStatusMap;
 +extern WORD wReminderCheck;
 +extern BYTE bFlashLed[3];
 +extern BYTE bFlashEffect;
 +extern BYTE bSequenceOrder;
 +extern WORD wCustomTheme;
 +extern WORD wStartDelay;
 +extern BYTE bFlashSpeed;
 +extern BYTE bEmulateKeypresses;
 +extern BYTE bOverride;
 +extern BYTE bFlashIfMsgWinNotTop;
 +extern BYTE bTrillianLedsMsg;
 +extern BYTE bTrillianLedsURL;
 +extern BYTE bTrillianLedsFile;
 +extern BYTE bTrillianLedsOther;
 +
 +extern PROTOCOL_LIST ProtoList;
 +extern PROCESS_LIST ProcessList;
 +
 +HWND hwndProto, hwndBasic, hwndEffect, hwndTheme, hwndIgnore, hwndCurrentTab;
 +
 +TCHAR *AttendedName[]={_T("Miranda"), _T("Windows")};
 +TCHAR *OrderName[]={_T("left->right"), _T("right->left"), _T("left<->right")};
 +
 +PROCESS_LIST ProcessListAux;
 +XSTATUS_INFO *XstatusListAux;
 +BYTE trillianLedsMsg, trillianLedsURL, trillianLedsFile, trillianLedsOther;
 +
 +static BOOL (WINAPI *pfnEnableThemeDialogTexture)(HANDLE, DWORD) = 0;
 +
 +
 +// **
 +// ** Initialize the Miranda options page
 +// **
 +int InitializeOptions(WPARAM wParam,LPARAM lParam)
 +{
 +
 +	OPTIONSDIALOGPAGE odp;
 +	HMODULE hUxTheme = NULL;
 +
 +	if(bWindowsNT && dWinVer >= 5.01) {
 +		hUxTheme = GetModuleHandle(L"uxtheme.dll");
 +
 +		if(hUxTheme)
 +			pfnEnableThemeDialogTexture = (BOOL (WINAPI *)(HANDLE, DWORD))GetProcAddress(hUxTheme, "EnableThemeDialogTexture");
 +	}
 +
 +	ZeroMemory(&odp,sizeof(odp));
 +	odp.cbSize = sizeof(odp);
 +	odp.position = 0;
 +	odp.hInstance = hInst;
 +	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONS);
 +	odp.pszTitle = "Keyboard Flash";
 +	odp.pszGroup = "Plugins";
 +	odp.groupPosition = 910000000;
 +	odp.flags=ODPF_BOLDGROUPS;
 +	odp.pfnDlgProc = DlgProcOptions;
 +	odp.nIDBottomSimpleControl = 0;
 +	CallService(MS_OPT_ADDPAGE,wParam, (LPARAM)&odp);
 +
 +	return 0;
 +}
 +
 +INT_PTR CALLBACK DlgProcOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
 +{
 +	switch (msg) {
 +	case WM_INITDIALOG:
 +		{
 +            HWND tc;
 +			TCITEM tci;
 +			tc = GetDlgItem(hwndDlg, IDC_TABS);
 +			tci.mask = TCIF_TEXT;
 +			tci.pszText = TranslateT("Protocols");
 +			TabCtrl_InsertItem(tc, 0, &tci);
 +			tci.pszText = TranslateT("Rules");
 +			TabCtrl_InsertItem(tc, 1, &tci);
 +			tci.pszText = TranslateT("Flashing");
 +			TabCtrl_InsertItem(tc, 2, &tci);
 +			tci.pszText = TranslateT("Themes");
 +			TabCtrl_InsertItem(tc, 3, &tci);
 +			tci.pszText = TranslateT("Ignore");
 +			TabCtrl_InsertItem(tc, 4, &tci);
 +			
 +			hwndProto = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_PROTO_OPTIONS), hwndDlg, DlgProcProtoOptions, (LPARAM) NULL);
 +			if(hwndProto && pfnEnableThemeDialogTexture)
 +				pfnEnableThemeDialogTexture(hwndProto, ETDT_ENABLETAB);
 +			SetWindowPos(hwndProto, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
 +			ShowWindow(hwndProto, SW_SHOW);
 +			hwndBasic = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_BASIC_OPTIONS), hwndDlg, DlgProcBasicOptions, (LPARAM) NULL);
 +			if(hwndBasic && pfnEnableThemeDialogTexture)
 +				pfnEnableThemeDialogTexture(hwndBasic, ETDT_ENABLETAB);
 +			SetWindowPos(hwndBasic, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
 +			hwndEffect = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_EFFECT_OPTIONS), hwndDlg, DlgProcEffectOptions, (LPARAM) NULL);
 +			if(hwndEffect && pfnEnableThemeDialogTexture)
 +				pfnEnableThemeDialogTexture(hwndEffect, ETDT_ENABLETAB);
 +			SetWindowPos(hwndEffect, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
 +			hwndTheme = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_THEME_OPTIONS), hwndDlg, DlgProcThemeOptions, (LPARAM) NULL);
 +			if(hwndTheme && pfnEnableThemeDialogTexture)
 +				pfnEnableThemeDialogTexture(hwndTheme, ETDT_ENABLETAB);
 +			SetWindowPos(hwndTheme, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
 +			hwndIgnore = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_IGNORE_OPTIONS), hwndDlg, DlgProcIgnoreOptions, (LPARAM) NULL);
 +			if(hwndIgnore && pfnEnableThemeDialogTexture)
 +				pfnEnableThemeDialogTexture(hwndIgnore, ETDT_ENABLETAB);
 +			SetWindowPos(hwndIgnore, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
 +			hwndCurrentTab = hwndProto;
 +			return TRUE;
 +
 +		}
 +	case WM_COMMAND:
 +		break;
 +	case WM_NOTIFY:
 +		{
 +			switch (((LPNMHDR) lParam)->code) {
 +			case TCN_SELCHANGE:
 +                switch (wParam) {
 +				case IDC_TABS:
 +					{
 +						HWND hwnd;
 +						switch (TabCtrl_GetCurSel(GetDlgItem(hwndDlg, IDC_TABS))) {
 +						default:
 +						case 0:
 +							hwnd = hwndProto;
 +							break;
 +						case 1:
 +							hwnd = hwndBasic;
 +							break;
 +						case 2:
 +							hwnd = hwndEffect;
 +							break;
 +						case 3:
 +							hwnd = hwndTheme;
 +							break;
 +						case 4:
 +							hwnd = hwndIgnore;
 +							break;
 +						}
 +						if (hwnd!=hwndCurrentTab) {
 +							ShowWindow(hwnd, SW_SHOW);
 +							ShowWindow(hwndCurrentTab, SW_HIDE);
 +							hwndCurrentTab = hwnd;
 +						}
 +					}
 +					break;
 +				}
 +				break;
 +			case PSN_APPLY:
 +				SendMessage(hwndProto, WM_NOTIFY, wParam, lParam);
 +				SendMessage(hwndBasic, WM_NOTIFY, wParam, lParam);
 +				SendMessage(hwndEffect, WM_NOTIFY, wParam, lParam);
 +				SendMessage(hwndTheme, WM_NOTIFY, wParam, lParam);
 +				SendMessage(hwndIgnore, WM_NOTIFY, wParam, lParam);
 +				return TRUE;
 +			}
 +		}
 +		break;
 +	case WM_DESTROY:
 +		break;
 +	}
 +	return FALSE;
 +}
 +
 +
 +INT_PTR CALLBACK DlgProcProtoOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
 +{
 +	static BOOL initDlg=FALSE;
 +
 +	switch (msg) {
 +
 +		case WM_INITDIALOG:
 +			initDlg=TRUE;
 +			TranslateDialogDefault(hwndDlg);
 +
 +			// proto list
 +			{	
 +				unsigned int i;
 +				LVCOLUMN lvCol;
 +				LVITEM lvItem;
 +				HWND hList = GetDlgItem(hwndDlg, IDC_PROTOCOLLIST);
 +
 +				// create columns
 +				ListView_SetExtendedListViewStyleEx(hList, LVS_EX_CHECKBOXES, LVS_EX_CHECKBOXES);
 +				memset(&lvCol, 0, sizeof(lvCol));
 +				lvCol.mask = LVCF_WIDTH|LVCF_TEXT;
 +				lvCol.pszText = TranslateT("Protocol");
 +				lvCol.cx = 118;
 +				ListView_InsertColumn(hList, 0, &lvCol);
 +				// fill
 +				memset(&lvItem, 0, sizeof(lvItem));
 +				lvItem.mask = LVIF_TEXT|LVIF_PARAM;
 +				lvItem.cchTextMax = 256;
 +				lvItem.iItem = 0;
 +				lvItem.iSubItem = 0;
 +				for(i=0; i < ProtoList.protoCount; i++) {
 +					int count; PROTOACCOUNT** protos;
 +					ProtoEnumAccounts( &count, &protos );
 +					if(ProtoList.protoInfo[i].visible) {
 +						lvItem.lParam = (LPARAM)ProtoList.protoInfo[i].szProto;
 +						lvItem.pszText = protos[i] -> tszAccountName;
 +						ListView_InsertItem(hList, &lvItem);
 +						ListView_SetCheckState(hList, lvItem.iItem, ProtoList.protoInfo[i].enabled);
 +						lvItem.iItem++;
 +					}
 +				}
 +			}
 +
 +			initDlg=FALSE;
 +			return TRUE;
 +
 +		case WM_NOTIFY:
 +			{
 +				//Here we have pressed either the OK or the APPLY button.
 +				switch(((LPNMHDR)lParam)->idFrom) {
 +				case 0:
 +					switch (((LPNMHDR)lParam)->code) {
 +					case PSN_APPLY:
 +						// enabled protos
 +						{
 +							int i;
 +							LVITEM lvItem;
 +							HWND hList = GetDlgItem(hwndDlg, IDC_PROTOCOLLIST);
 +
 +							memset(&lvItem, 0, sizeof(lvItem));
 +							lvItem.mask = LVIF_PARAM;
 +							lvItem.iSubItem = 0;
 +							for (i=0; i < ListView_GetItemCount(hList); i++) {
 +								lvItem.iItem = i;
 +								ListView_GetItem(hList, &lvItem);
 +								DBWriteContactSettingByte(NULL, KEYBDMODULE, (char *)lvItem.lParam, (BYTE)!!ListView_GetCheckState(hList, lvItem.iItem));
 +							}
 +						}			
 +
 +						LoadSettings();
 +
 +						return TRUE;
 +					} // switch code - 0
 +					break;
 +				case IDC_PROTOCOLLIST:
 +					switch(((NMHDR*)lParam)->code) {
 +					case LVN_ITEMCHANGED:
 +						{
 +							NMLISTVIEW *nmlv = (NMLISTVIEW *)lParam;
 +
 +							if (!initDlg && ((nmlv->uNewState ^ nmlv->uOldState) & LVIS_STATEIMAGEMASK))
 +								SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0);
 +						}
 +						break;
 +					} // switch code - IDC_PROTOCOLLIST
 +					break;
 +				} //switch idFrom
 +			}
 +			break; //End WM_NOTIFY
 +					
 +			default:
 +			break;
 +	}
 +
 +	return FALSE;
 +}
 +
 +INT_PTR CALLBACK DlgProcBasicOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
 +{
 +	unsigned int i;
 +	static BOOL initDlg=FALSE;
 +
 +	switch (msg) {
 +
 +		case WM_INITDIALOG:
 +			initDlg=TRUE;
 +			TranslateDialogDefault(hwndDlg);
 +
 +			createProcessListAux();
 +			createXstatusListAux();
 +
 +			CheckDlgButton(hwndDlg, IDC_ONMESSAGE, bFlashOnMsg ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_ONURL, bFlashOnURL ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_ONFILE, bFlashOnFile ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_ONOTHER, bFlashOnOther ? BST_CHECKED:BST_UNCHECKED);
 +
 +			CheckDlgButton(hwndDlg, IDC_FSCREEN, bFullScreenMode ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_SSAVER, bScreenSaverRunning ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_LOCKED, bWorkstationLocked ? BST_CHECKED:BST_UNCHECKED);
 +			if (!bWindowsNT)
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_LOCKED), FALSE);
 +			CheckDlgButton(hwndDlg, IDC_PGMS, bProcessesAreRunning ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_ACTIVE, bWorkstationActive ? BST_CHECKED:BST_UNCHECKED);
 +
 +			CheckDlgButton(hwndDlg, IDC_IFOPEN, bFlashIfMsgOpen ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_IFNOTTOP, bFlashIfMsgWinNotTop ? BST_CHECKED:BST_UNCHECKED);
 +			if (!bFlashIfMsgOpen)
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_IFNOTTOP), FALSE);
 +			CheckDlgButton(hwndDlg, IDC_IFOLDER, bFlashIfMsgOlder ? BST_CHECKED:BST_UNCHECKED);
 +			SendDlgItemMessage(hwndDlg, IDC_OLDERSPIN, UDM_SETBUDDY, (WPARAM)GetDlgItem(hwndDlg, IDC_SOLDER), 0);
 +			SendDlgItemMessage(hwndDlg, IDC_OLDERSPIN, UDM_SETRANGE32, 1, MAKELONG(UD_MAXVAL, 0));
 +			SendDlgItemMessage(hwndDlg, IDC_OLDERSPIN, UDM_SETPOS, 0, MAKELONG(wSecondsOlder, 0));
 +			if (!bFlashIfMsgOlder) {
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_SOLDER), FALSE);
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_OLDERSPIN), FALSE);
 +			}
 +
 +			CheckDlgButton(hwndDlg, IDC_UNTILBLK, bFlashUntil&UNTIL_NBLINKS ? BST_CHECKED:BST_UNCHECKED);
 +			SendDlgItemMessage(hwndDlg, IDC_BLINKSPIN, UDM_SETBUDDY, (WPARAM)GetDlgItem(hwndDlg, IDC_SBLINK), 0);
 +			SendDlgItemMessage(hwndDlg, IDC_BLINKSPIN, UDM_SETRANGE32, 1, MAKELONG(UD_MAXVAL, 0));
 +			SendDlgItemMessage(hwndDlg, IDC_BLINKSPIN, UDM_SETPOS, 0, MAKELONG(wBlinksNumber, 0));
 +			if (!(bFlashUntil & UNTIL_NBLINKS)) {
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_SBLINK), FALSE);
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_BLINKSPIN), FALSE);
 +			}
 +			CheckDlgButton(hwndDlg, IDC_UNTILATTENDED, bFlashUntil&UNTIL_REATTENDED ? BST_CHECKED:BST_UNCHECKED);
 +			for (i=0; i < 2; i++) {
 +				int index = SendDlgItemMessage(hwndDlg, IDC_MIRORWIN, CB_INSERTSTRING, (WPARAM)-1, (LPARAM)AttendedName[i]);
 +				if (index != CB_ERR && index != CB_ERRSPACE)
 +					SendDlgItemMessage(hwndDlg, IDC_MIRORWIN, CB_SETITEMDATA, (WPARAM)index, (LPARAM)i);
 +			}
 +			SendDlgItemMessage(hwndDlg, IDC_MIRORWIN, CB_SETCURSEL, (WPARAM)bMirandaOrWindows, 0);
 +			if (!(bFlashUntil & UNTIL_REATTENDED))
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_MIRORWIN), FALSE);
 +			CheckDlgButton(hwndDlg, IDC_UNTILOPEN, bFlashUntil&UNTIL_EVENTSOPEN ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_UNTILCOND, bFlashUntil&UNTIL_CONDITIONS ? BST_CHECKED:BST_UNCHECKED);
 +
 +			CheckDlgButton(hwndDlg, IDC_ONLINE, wStatusMap&MAP_ONLINE ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_AWAY, wStatusMap&MAP_AWAY ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_NA, wStatusMap&MAP_NA ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_OCCUPIED, wStatusMap&MAP_OCCUPIED ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_DND, wStatusMap&MAP_DND ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_FREECHAT, wStatusMap&MAP_FREECHAT ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_INVISIBLE, wStatusMap&MAP_INVISIBLE ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_ONTHEPHONE, wStatusMap&MAP_ONTHEPHONE ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_OUTTOLUNCH, wStatusMap&MAP_OUTTOLUNCH ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_OFFLINE, wStatusMap&MAP_OFFLINE ? BST_CHECKED:BST_UNCHECKED);
 +
 +			SendDlgItemMessage(hwndDlg, IDC_REMCHECK, UDM_SETBUDDY, (WPARAM)GetDlgItem(hwndDlg, IDC_SREMCHECK), 0);
 +			SendDlgItemMessage(hwndDlg, IDC_REMCHECK, UDM_SETRANGE32, 0, MAKELONG(UD_MAXVAL, 0));
 +			SendDlgItemMessage(hwndDlg, IDC_REMCHECK, UDM_SETPOS, 0, MAKELONG(wReminderCheck, 0));
 +
 +			initDlg=FALSE;
 +			return TRUE;
 +
 +		case WM_VSCROLL:
 +		case WM_HSCROLL:
 +			SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0);
 +			break;
 +
 +		case WM_DESTROY:
 +			destroyProcessListAux();
 +			destroyXstatusListAux();
 +			break;
 +
 +		case WM_COMMAND:
 +			switch (LOWORD(wParam)) {
 +			case IDC_ONMESSAGE:
 +			case IDC_ONURL:
 +			case IDC_ONFILE:
 +			case IDC_ONOTHER:
 +			case IDC_IFOPEN:
 +			case IDC_IFNOTTOP:
 +			case IDC_IFOLDER:
 +			case IDC_UNTILBLK:
 +			case IDC_UNTILATTENDED:
 +			case IDC_MIRORWIN:
 +			case IDC_UNTILOPEN:
 +			case IDC_UNTILCOND:
 +			case IDC_FSCREEN:
 +			case IDC_SSAVER:
 +			case IDC_LOCKED:
 +			case IDC_PGMS:
 +			case IDC_ACTIVE:
 +			case IDC_ONLINE:
 +			case IDC_AWAY:
 +			case IDC_NA:
 +			case IDC_OCCUPIED:
 +			case IDC_DND:
 +			case IDC_FREECHAT:
 +			case IDC_INVISIBLE:
 +			case IDC_ONTHEPHONE:
 +			case IDC_OUTTOLUNCH:
 +			case IDC_OFFLINE:
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_IFNOTTOP), IsDlgButtonChecked(hwndDlg, IDC_IFOPEN) == BST_CHECKED);
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_SOLDER), IsDlgButtonChecked(hwndDlg, IDC_IFOLDER) == BST_CHECKED);
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_OLDERSPIN), IsDlgButtonChecked(hwndDlg, IDC_IFOLDER) == BST_CHECKED);
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_SBLINK), IsDlgButtonChecked(hwndDlg, IDC_UNTILBLK) == BST_CHECKED);
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_BLINKSPIN), IsDlgButtonChecked(hwndDlg, IDC_UNTILBLK) == BST_CHECKED);
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_MIRORWIN), IsDlgButtonChecked(hwndDlg, IDC_UNTILATTENDED) == BST_CHECKED);
 +				SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0);
 +				return TRUE;
 +			case IDC_SOLDER:
 +				if(HIWORD(wParam) == EN_CHANGE && !initDlg) {
 +					BOOL translated;
 +					int val = GetDlgItemInt(hwndDlg, IDC_SOLDER, &translated, FALSE);
 +					if (translated && val < 1)
 +						SendDlgItemMessage(hwndDlg, IDC_OLDERSPIN, UDM_SETPOS, 0, MAKELONG(val, 0));
 +					SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0);
 +				}
 +				return TRUE;
 +			case IDC_SBLINK:
 +				if(HIWORD(wParam) == EN_CHANGE && !initDlg) {
 +					BOOL translated;
 +					int val = GetDlgItemInt(hwndDlg, IDC_SBLINK, &translated, FALSE);
 +					if (translated && val < 1)
 +						SendDlgItemMessage(hwndDlg, IDC_BLINKSPIN, UDM_SETPOS, 0, MAKELONG(val, 0));
 +					SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0);
 +				}
 +				return TRUE;
 +			case IDC_ASSIGNPGMS:
 +				if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_PROCESSES), hwndDlg, DlgProcProcesses, 0) == IDC_OKPGM)
 +					SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0);
 +				return TRUE;
 +			case IDC_SELECTXSTATUS:
 +				if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_XSTATUSES), hwndDlg, DlgProcXstatusList, 0) == IDC_OKXST)
 +					SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0);
 +				return TRUE;
 +			case IDC_SREMCHECK:
 +				if(HIWORD(wParam) == EN_CHANGE && !initDlg)
 +					SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0);
 +				return TRUE;
 +			}
 +			break;
 +
 +		case WM_NOTIFY:
 +			{
 +				unsigned int j;
 +				BYTE untilMap = 0;
 +				WORD statusMap = 0;
 +				//Here we have pressed either the OK or the APPLY button.
 +				switch(((LPNMHDR)lParam)->idFrom) {
 +				case 0:
 +					switch (((LPNMHDR)lParam)->code) {
 +					case PSN_APPLY:
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "onmsg", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_ONMESSAGE) == BST_CHECKED ? 1:0));
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "onurl", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_ONURL) == BST_CHECKED ? 1:0));
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "onfile", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_ONFILE) == BST_CHECKED ? 1:0));
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "onother", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_ONOTHER) == BST_CHECKED ? 1:0));
 +
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "fscreenmode", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_FSCREEN) == BST_CHECKED ? 1:0));
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "ssaverrunning", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_SSAVER) == BST_CHECKED ? 1:0));
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "wstationlocked", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_LOCKED) == BST_CHECKED ? 1:0));
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "procsrunning", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_PGMS) == BST_CHECKED ? 1:0));
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "wstationactive", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_ACTIVE) == BST_CHECKED ? 1:0));
 +
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "ifmsgopen", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_IFOPEN) == BST_CHECKED ? 1:0));
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "ifmsgnottop", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_IFNOTTOP) == BST_CHECKED ? 1:0));
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "ifmsgolder", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_IFOLDER) == BST_CHECKED ? 1:0));
 +						DBWriteContactSettingWord(NULL, KEYBDMODULE, "secsolder", (WORD)SendDlgItemMessage(hwndDlg, IDC_OLDERSPIN, UDM_GETPOS, 0, 0));
 +
 +						if(IsDlgButtonChecked(hwndDlg, IDC_UNTILBLK) == BST_CHECKED)
 +							untilMap |= UNTIL_NBLINKS;
 +						if (IsDlgButtonChecked(hwndDlg, IDC_UNTILATTENDED) == BST_CHECKED)
 +							untilMap |= UNTIL_REATTENDED;
 +						if (IsDlgButtonChecked(hwndDlg, IDC_UNTILOPEN) == BST_CHECKED)
 +							untilMap |= UNTIL_EVENTSOPEN;
 +						if (IsDlgButtonChecked(hwndDlg, IDC_UNTILCOND) == BST_CHECKED)
 +							untilMap |= UNTIL_CONDITIONS;
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "funtil", untilMap);
 +						DBWriteContactSettingWord(NULL, KEYBDMODULE, "nblinks", (WORD)SendDlgItemMessage(hwndDlg, IDC_BLINKSPIN, UDM_GETPOS, 0, 0));
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "mirorwin", (BYTE)SendDlgItemMessage(hwndDlg, IDC_MIRORWIN, CB_GETITEMDATA, (WPARAM)SendDlgItemMessage(hwndDlg, IDC_MIRORWIN, CB_GETCURSEL, 0, 0), 0));
 +
 +						if(IsDlgButtonChecked(hwndDlg, IDC_ONLINE) == BST_CHECKED)
 +							statusMap |= MAP_ONLINE;
 +						if(IsDlgButtonChecked(hwndDlg, IDC_AWAY) == BST_CHECKED)
 +							statusMap |= MAP_AWAY;
 +						if(IsDlgButtonChecked(hwndDlg, IDC_NA) == BST_CHECKED)
 +							statusMap |= MAP_NA;
 +						if(IsDlgButtonChecked(hwndDlg, IDC_OCCUPIED) == BST_CHECKED)
 +							statusMap |= MAP_OCCUPIED;
 +						if(IsDlgButtonChecked(hwndDlg, IDC_DND) == BST_CHECKED)
 +							statusMap |= MAP_DND;
 +						if(IsDlgButtonChecked(hwndDlg, IDC_FREECHAT) == BST_CHECKED)
 +							statusMap |= MAP_FREECHAT;
 +						if(IsDlgButtonChecked(hwndDlg, IDC_INVISIBLE) == BST_CHECKED)
 +							statusMap |= MAP_INVISIBLE;
 +						if(IsDlgButtonChecked(hwndDlg, IDC_ONTHEPHONE) == BST_CHECKED)
 +							statusMap |= MAP_ONTHEPHONE;
 +						if(IsDlgButtonChecked(hwndDlg, IDC_OUTTOLUNCH) == BST_CHECKED)
 +							statusMap |= MAP_OUTTOLUNCH;
 +						if(IsDlgButtonChecked(hwndDlg, IDC_OFFLINE) == BST_CHECKED)
 +							statusMap |= MAP_OFFLINE;
 +						DBWriteContactSettingWord(NULL, KEYBDMODULE, "status", statusMap);
 +
 +						DBWriteContactSettingWord(NULL, KEYBDMODULE, "remcheck", (WORD)SendDlgItemMessage(hwndDlg, IDC_REMCHECK, UDM_GETPOS, 0, 0));
 +
 +						for (i=0, j=0; j < ProcessListAux.count; j++)
 +							if (ProcessListAux.szFileName[j])
 +								DBWriteContactSettingWString(NULL, KEYBDMODULE, fmtDBSettingName("process%d", i++), ProcessListAux.szFileName[j]);
 +						DBWriteContactSettingWord(NULL, KEYBDMODULE, "processcount", (WORD)i);
 +						while (!DBDeleteContactSetting(NULL, KEYBDMODULE, fmtDBSettingName("process%d", i++)));
 +
 +						if (XstatusListAux)
 +							for (i=0; i < ProtoList.protoCount; i++)
 +								for(j=0; j < XstatusListAux[i].count; j++)
 +									DBWriteContactSettingByte(NULL, KEYBDMODULE, fmtDBSettingName("%sxstatus%d", ProtoList.protoInfo[i].szProto, j), (BYTE)XstatusListAux[i].enabled[j]);
 +
 +						LoadSettings();
 +
 +						return TRUE;
 +					} // switch code
 +					break;
 +				} //switch idFrom
 +			}
 +			break; //End WM_NOTIFY
 +					
 +			default:
 +			break;
 +	}
 +
 +	return FALSE;
 +}
 +
 +INT_PTR CALLBACK DlgProcEffectOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
 +{
 +	int i;
 +	DBVARIANT dbv;
 +	static BOOL initDlg=FALSE;
 +
 +	switch (msg) {
 +
 +		case WM_INITDIALOG:
 +			initDlg=TRUE;
 +			TranslateDialogDefault(hwndDlg);
 +
 +			trillianLedsMsg = bTrillianLedsMsg;
 +			trillianLedsURL = bTrillianLedsURL;
 +			trillianLedsFile = bTrillianLedsFile;
 +			trillianLedsOther = bTrillianLedsOther;
 +
 +			CheckDlgButton(hwndDlg, IDC_NUM, bFlashLed[0] ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_CAPS, bFlashLed[1] ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_SCROLL, bFlashLed[2] ? BST_CHECKED:BST_UNCHECKED);
 +
 +			CheckDlgButton(hwndDlg, IDC_SAMETIME, bFlashEffect == FLASH_SAMETIME ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_INTURN, bFlashEffect == FLASH_INTURN ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_INSEQUENCE, bFlashEffect == FLASH_INSEQUENCE ? BST_CHECKED:BST_UNCHECKED);
 +			for (i=0; i < 3; i++) {
 +				int index = SendDlgItemMessage(hwndDlg, IDC_SEQORDER, CB_INSERTSTRING, (WPARAM)-1, (LPARAM)(OrderName[i]));
 +				if (index != CB_ERR && index != CB_ERRSPACE)
 +					SendDlgItemMessage(hwndDlg, IDC_SEQORDER, CB_SETITEMDATA, (WPARAM)index, (LPARAM)i);
 +			}
 +			SendDlgItemMessage(hwndDlg, IDC_SEQORDER, CB_SETCURSEL, (WPARAM)bSequenceOrder, 0);
 +			if (bFlashEffect != FLASH_INSEQUENCE)
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_SEQORDER), FALSE);
 +			CheckDlgButton(hwndDlg, IDC_CUSTOM, bFlashEffect == FLASH_CUSTOM ? BST_CHECKED:BST_UNCHECKED);
 +			for (i=0; !DBGetContactSetting(NULL, KEYBDMODULE, fmtDBSettingName("theme%d", i), &dbv); i++) {
 +				int index = SendDlgItemMessage(hwndDlg, IDC_SCUSTOM, CB_INSERTSTRING, (WPARAM)-1, (LPARAM)dbv.ptszVal);
 +				DBFreeVariant(&dbv);
 +				if (index != CB_ERR && index != CB_ERRSPACE)
 +					SendDlgItemMessage(hwndDlg, IDC_SCUSTOM, CB_SETITEMDATA, (WPARAM)index, (LPARAM)i);
 +			}
 +			SendDlgItemMessage(hwndDlg, IDC_SCUSTOM, CB_SETCURSEL, (WPARAM)wCustomTheme, 0);
 +			if (bFlashEffect != FLASH_CUSTOM)
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_SCUSTOM), FALSE);
 +			CheckDlgButton(hwndDlg, IDC_TRILLIAN, bFlashEffect == FLASH_TRILLIAN ? BST_CHECKED:BST_UNCHECKED);
 +			if (bFlashEffect != FLASH_TRILLIAN)
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_ASSIGNLEDS), FALSE);
 +
 +			SendDlgItemMessage(hwndDlg, IDC_DELAYSPIN, UDM_SETBUDDY, (WPARAM)GetDlgItem(hwndDlg, IDC_SDELAY), 0);
 +			SendDlgItemMessage(hwndDlg, IDC_DELAYSPIN, UDM_SETRANGE32, 0, MAKELONG(UD_MAXVAL, 0));
 +			SendDlgItemMessage(hwndDlg, IDC_DELAYSPIN, UDM_SETPOS, 0, MAKELONG(wStartDelay, 0));
 +
 +			SendDlgItemMessage(hwndDlg, IDC_SPEED, TBM_SETRANGE, FALSE, MAKELONG(0, 5));
 +			SendDlgItemMessage(hwndDlg, IDC_SPEED, TBM_SETPOS, TRUE, bFlashSpeed);
 +
 +			CheckDlgButton(hwndDlg, IDC_KEYPRESSES, bEmulateKeypresses ? BST_CHECKED:BST_UNCHECKED);
 +
 +			initDlg=FALSE;
 +			return TRUE;
 +
 +		case WM_VSCROLL:
 +		case WM_HSCROLL:
 +			SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0);
 +			break;
 +
 +		case WM_DESTROY:
 +			previewFlashing(FALSE);
 +			break;
 +
 +		case WM_COMMAND:
 +			switch (LOWORD(wParam)) {
 +			case IDC_NUM:
 +			case IDC_CAPS:
 +			case IDC_SCROLL:
 +			case IDC_SAMETIME:
 +			case IDC_INTURN:
 +			case IDC_INSEQUENCE:
 +			case IDC_SEQORDER:
 +			case IDC_CUSTOM:
 +			case IDC_TRILLIAN:
 +			case IDC_SCUSTOM:
 +			case IDC_SPEED:
 +			case IDC_KEYPRESSES:
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_SEQORDER), IsDlgButtonChecked(hwndDlg, IDC_INSEQUENCE) == BST_CHECKED);
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_SCUSTOM), IsDlgButtonChecked(hwndDlg, IDC_CUSTOM) == BST_CHECKED);
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_ASSIGNLEDS), IsDlgButtonChecked(hwndDlg, IDC_TRILLIAN) == BST_CHECKED);
 +				SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0);
 +				return TRUE;
 +			case IDC_ASSIGNLEDS:
 +				if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_EVENTLEDS), hwndDlg, DlgProcEventLeds, 0) == IDC_OK)
 +					SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0);
 +				return TRUE;
 +			case IDC_SDELAY:
 +				if(HIWORD(wParam) == EN_CHANGE && !initDlg)
 +					SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0);
 +				return TRUE;
 +			case IDC_PREVIEW:
 +				previewFlashing(IsDlgButtonChecked(hwndDlg, IDC_PREVIEW) == BST_CHECKED);
 +				return TRUE;
 +			}
 +			break;
 +
 +		case WM_NOTIFY:
 +			{
 +				//Here we have pressed either the OK or the APPLY button.
 +				switch(((LPNMHDR)lParam)->idFrom) {
 +				case 0:
 +					switch (((LPNMHDR)lParam)->code) {
 +					case PSN_APPLY:
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "fnum", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_NUM) == BST_CHECKED ? 1:0));
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "fcaps", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_CAPS) == BST_CHECKED ? 1:0));
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "fscroll", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_SCROLL) == BST_CHECKED ? 1:0));
 +		
 +						if(IsDlgButtonChecked(hwndDlg, IDC_INTURN) == BST_CHECKED)
 +							DBWriteContactSettingByte(NULL, KEYBDMODULE, "feffect", FLASH_INTURN);
 +						else
 +							if (IsDlgButtonChecked(hwndDlg, IDC_INSEQUENCE) == BST_CHECKED)
 +								DBWriteContactSettingByte(NULL, KEYBDMODULE, "feffect", FLASH_INSEQUENCE);
 +							else
 +								if (IsDlgButtonChecked(hwndDlg, IDC_CUSTOM) == BST_CHECKED)
 +									DBWriteContactSettingByte(NULL, KEYBDMODULE, "feffect", FLASH_CUSTOM);
 +								else
 +									if (IsDlgButtonChecked(hwndDlg, IDC_TRILLIAN) == BST_CHECKED)
 +										DBWriteContactSettingByte(NULL, KEYBDMODULE, "feffect", FLASH_TRILLIAN);
 +									else
 +										DBWriteContactSettingByte(NULL, KEYBDMODULE, "feffect", FLASH_SAMETIME);
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "order", (BYTE)SendDlgItemMessage(hwndDlg, IDC_SEQORDER, CB_GETITEMDATA, (WPARAM)SendDlgItemMessage(hwndDlg, IDC_SEQORDER, CB_GETCURSEL, 0, 0), 0));
 +						DBWriteContactSettingWord(NULL, KEYBDMODULE, "custom", (WORD)SendDlgItemMessage(hwndDlg, IDC_SCUSTOM, CB_GETITEMDATA, (WPARAM)SendDlgItemMessage(hwndDlg, IDC_SCUSTOM, CB_GETCURSEL, 0, 0), 0));
 +
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "ledsmsg", trillianLedsMsg);
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "ledsfile", trillianLedsFile);
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "ledsurl", trillianLedsURL);
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "ledsother", trillianLedsOther);
 +
 +						DBWriteContactSettingWord(NULL, KEYBDMODULE, "sdelay", (WORD)SendDlgItemMessage(hwndDlg, IDC_DELAYSPIN, UDM_GETPOS, 0, 0));
 +
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "speed", (BYTE)SendDlgItemMessage(hwndDlg, IDC_SPEED, TBM_GETPOS, 0, 0));
 +
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "keypresses", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_KEYPRESSES) == BST_CHECKED ? 1:0));
 +
 +						LoadSettings();
 +
 +						return TRUE;
 +					} // switch code
 +					break;
 +				} //switch idFrom
 +			}
 +			break; //End WM_NOTIFY
 +					
 +			default:
 +			break;
 +	}
 +
 +	return FALSE;
 +}
 +
 +INT_PTR CALLBACK DlgProcThemeOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
 +{
 +	int i;
 +	TCHAR *str;
 +	DBVARIANT dbv;
 +	static BOOL initDlg=FALSE;
 +
 +	switch (msg) {
 +
 +		case WM_INITDIALOG:
 +			initDlg=TRUE;
 +			TranslateDialogDefault(hwndDlg);
 +
 +			SendDlgItemMessage(hwndDlg, IDC_THEME, EM_LIMITTEXT, MAX_PATH, 0);
 +			SendDlgItemMessage(hwndDlg, IDC_CUSTOMSTRING, EM_LIMITTEXT, MAX_PATH, 0);
 +
 +			for (i=0; !DBGetContactSetting(NULL, KEYBDMODULE, fmtDBSettingName("theme%d", i), &dbv); i++) {
 +				int index = SendDlgItemMessage(hwndDlg, IDC_THEME, CB_INSERTSTRING, (WPARAM)-1, (LPARAM)dbv.pszVal);
 +				DBFreeVariant(&dbv);
 +				if (index != CB_ERR && index != CB_ERRSPACE) {
 +					str = (TCHAR *)malloc(MAX_PATH+1);
 +					if (str)
 +						if (DBGetContactSetting(NULL, KEYBDMODULE, fmtDBSettingName("custom%d", i), &dbv))
 +							str[0] = _T('\0');
 +						else {
 +							wcscpy(str, dbv.ptszVal);
 +							DBFreeVariant(&dbv);
 +						}
 +					SendDlgItemMessage(hwndDlg, IDC_THEME, CB_SETITEMDATA, (WPARAM)index, (LPARAM)str);
 +				}
 +			}
 +
 +			EnableWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE);
 +			EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), FALSE);
 +			if (SendDlgItemMessage(hwndDlg, IDC_THEME, CB_GETCOUNT, 0, 0) == 0)
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE), FALSE);
 +			else {
 +				SendDlgItemMessage(hwndDlg, IDC_THEME, CB_SETCURSEL, (WPARAM)wCustomTheme, 0);
 +				str = (TCHAR *)SendDlgItemMessage(hwndDlg, IDC_THEME, CB_GETITEMDATA, (WPARAM)wCustomTheme, 0);
 +				if (str)
 +					SetDlgItemText(hwndDlg, IDC_CUSTOMSTRING, str);
 +			}
 +
 +			CheckDlgButton(hwndDlg, IDC_OVERRIDE, bOverride ? BST_CHECKED:BST_UNCHECKED);
 +
 +			initDlg=FALSE;
 +			return TRUE;
 +
 +		case WM_COMMAND:
 +			switch (LOWORD(wParam)) {
 +			case IDC_THEME:
 +				switch (HIWORD(wParam)) {
 +				int item;
 +				TCHAR theme[MAX_PATH+1];
 +
 +				case CBN_SELENDOK:
 +				case CBN_SELCHANGE:
 +					str = (TCHAR *)SendMessage((HWND)lParam, CB_GETITEMDATA, (WPARAM)SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0), 0);
 +					if (str)
 +						SetDlgItemText(hwndDlg, IDC_CUSTOMSTRING, str);
 +					else
 +						SetDlgItemText(hwndDlg, IDC_CUSTOMSTRING, _T(""));
 +					EnableWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE);
 +					EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), FALSE);
 +					EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE), TRUE);
 +					break;
 +				case CBN_EDITCHANGE:
 +					GetDlgItemText(hwndDlg, IDC_THEME, theme, sizeof(theme));
 +					if ((item = SendMessage((HWND)lParam, CB_FINDSTRINGEXACT, -1, (LPARAM)theme)) == CB_ERR) {	//new theme
 +						SetDlgItemText(hwndDlg, IDC_CUSTOMSTRING, _T(""));
 +						EnableWindow(GetDlgItem(hwndDlg, IDC_ADD), TRUE);
 +						EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE), FALSE);
 +					} else {
 +						str = (TCHAR *)SendMessage((HWND)lParam, CB_GETITEMDATA, (WPARAM)item, 0);
 +						if (str)
 +							SetDlgItemText(hwndDlg, IDC_CUSTOMSTRING, str);
 +						else
 +							SetDlgItemText(hwndDlg, IDC_CUSTOMSTRING, _T(""));
 +						EnableWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE);
 +						EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE), TRUE);
 +					}
 +					EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), FALSE);
 +					break;
 +				}
 +				return TRUE;
 +			case IDC_CUSTOMSTRING:
 +				if(HIWORD(wParam) == EN_CHANGE) {
 +					int item;
 +					TCHAR theme[MAX_PATH+1], customAux[MAX_PATH+1];
 +
 +					GetDlgItemText(hwndDlg, IDC_THEME, theme, sizeof(theme));
 +					if ((item = SendDlgItemMessage(hwndDlg, IDC_THEME, CB_FINDSTRINGEXACT, -1, (LPARAM)theme)) == CB_ERR)
 +						return TRUE;
 +					str = (TCHAR *)SendDlgItemMessage(hwndDlg, IDC_THEME, CB_GETITEMDATA, (WPARAM)item, 0);
 +					if (str) {
 +						GetDlgItemText(hwndDlg, IDC_CUSTOMSTRING, customAux, MAX_PATH);
 +						if (wcscmp(str, customAux))
 +							EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), TRUE);
 +						else
 +							EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), FALSE);
 +					}
 +				}
 +				return TRUE;
 +			case IDC_TEST:
 +				{
 +				TCHAR custom[MAX_PATH+1];
 +
 +				GetDlgItemText(hwndDlg, IDC_CUSTOMSTRING, custom, MAX_PATH);
 +				SetDlgItemText(hwndDlg, IDC_CUSTOMSTRING, normalizeCustomString(custom));
 +				testSequence(custom);
 +				}
 +				return TRUE;
 +			case IDC_ADD:
 +				{
 +				int item;
 +				TCHAR theme[MAX_PATH+1];
 +
 +				GetDlgItemText(hwndDlg, IDC_THEME, theme, sizeof(theme));
 +				if (!theme[0])
 +					return TRUE;
 +				item = SendDlgItemMessage(hwndDlg, IDC_THEME, CB_ADDSTRING, 0, (LPARAM)theme);
 +				str = (TCHAR *)malloc(MAX_PATH+1);
 +				if (str) {
 +					GetDlgItemText(hwndDlg, IDC_CUSTOMSTRING, str, MAX_PATH);
 +					SetDlgItemText(hwndDlg, IDC_CUSTOMSTRING, normalizeCustomString(str));
 +				}
 +				SendDlgItemMessage(hwndDlg, IDC_THEME, CB_SETITEMDATA, (WPARAM)item, (LPARAM)str);
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE);
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), FALSE);
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE), TRUE);
 +				}
 +				SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0);
 +				return TRUE;
 +			case IDC_UPDATE:
 +				{
 +				int item;
 +				TCHAR theme[MAX_PATH+1];
 +
 +				GetDlgItemText(hwndDlg, IDC_THEME, theme, sizeof(theme));
 +				item = SendDlgItemMessage(hwndDlg, IDC_THEME, CB_FINDSTRINGEXACT, -1, (LPARAM)theme);
 +				str = (TCHAR *)SendDlgItemMessage(hwndDlg, IDC_THEME, CB_GETITEMDATA, (WPARAM)item, 0);
 +				if (str) {
 +					GetDlgItemText(hwndDlg, IDC_CUSTOMSTRING, str, MAX_PATH);
 +					SetDlgItemText(hwndDlg, IDC_CUSTOMSTRING, normalizeCustomString(str));
 +				}
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), FALSE);
 +				}
 +				SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0);
 +				return TRUE;
 +			case IDC_DELETE:
 +				{
 +				int item;
 +				TCHAR theme[MAX_PATH+1];
 +
 +				GetDlgItemText(hwndDlg, IDC_THEME, theme, sizeof(theme));
 +				item = SendDlgItemMessage(hwndDlg, IDC_THEME, CB_FINDSTRINGEXACT, -1, (LPARAM)theme);
 +				str = (TCHAR *)SendDlgItemMessage(hwndDlg, IDC_THEME, CB_GETITEMDATA, (WPARAM)item, 0);
 +				if (str)
 +					free(str);
 +				SendDlgItemMessage(hwndDlg, IDC_THEME, CB_DELETESTRING, (WPARAM)item, 0);
 +				if (SendDlgItemMessage(hwndDlg, IDC_THEME, CB_GETCOUNT, 0, 0) == 0) {
 +					SetDlgItemText(hwndDlg, IDC_THEME, _T(""));
 +					SetDlgItemText(hwndDlg, IDC_CUSTOMSTRING, _T(""));
 +					EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE), FALSE);
 +				} else {
 +					SendDlgItemMessage(hwndDlg, IDC_THEME, CB_SETCURSEL, 0, 0);
 +					str = (TCHAR *)SendDlgItemMessage(hwndDlg, IDC_THEME, CB_GETITEMDATA, 0, 0);
 +					if (str)
 +						SetDlgItemText(hwndDlg, IDC_CUSTOMSTRING, str);
 +				}
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), FALSE);
 +				}
 +				SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0);
 +				return TRUE;
 +			case IDC_EXPORT:
 +				{
 +				TCHAR path[MAX_PATH+1], filter[MAX_PATH+1], *pfilter;
 +				OPENFILENAME ofn={0};
 +
 +				path[0] = _T('\0');
 +				ofn.lStructSize = sizeof(OPENFILENAME);
 +				ofn.hwndOwner = hwndDlg;
 +				ofn.hInstance = NULL;
 +				wcscpy(filter,_T("Keyboard Notify Theme"));
 +				wcscat(filter, _T(" (*.knt)"));
 +				pfilter = filter + wcslen(filter) + 1;
 +				wcscpy(pfilter, _T("*.knt"));
 +				pfilter = pfilter + wcslen(pfilter) + 1;
 +				wcscpy(pfilter, _T("All Files"));
 +				pfilter = pfilter + wcslen(pfilter) + 1;
 +				wcscpy(pfilter, _T("*.*"));
 +				pfilter = pfilter + wcslen(pfilter) + 1;
 +				*pfilter = _T('\0');  
 +				ofn.lpstrFilter = filter;
 +				ofn.lpstrFile = path;
 +				ofn.Flags = OFN_HIDEREADONLY|OFN_NOCHANGEDIR|OFN_NOREADONLYRETURN|OFN_PATHMUSTEXIST;
 +				ofn.nMaxFile = sizeof(path);
 +				ofn.lpstrDefExt = _T("knt");
 +				if(GetSaveFileName(&ofn))
 +					exportThemes(path);
 +				}
 +				return TRUE;
 +			case IDC_IMPORT:
 +				{
 +				TCHAR path[MAX_PATH+1], filter[MAX_PATH+1], *pfilter;
 +				OPENFILENAME ofn={0};
 +
 +				path[0] = _T('\0');
 +				ofn.lStructSize = sizeof(OPENFILENAME);
 +				ofn.hwndOwner = hwndDlg;
 +				ofn.hInstance = NULL;
 +				wcscpy(filter, _T("Keyboard Notify Theme"));
 +				wcscat(filter, _T(" (*.knt)"));
 +				pfilter = filter + wcslen(filter) + 1;
 +				wcscpy(pfilter, _T("*.knt"));
 +				pfilter = pfilter + wcslen(pfilter) + 1;
 +				wcscpy(pfilter, _T("All Files"));
 +				pfilter = pfilter + wcslen(pfilter) + 1;
 +				wcscpy(pfilter, _T("*.*"));
 +				pfilter = pfilter + wcslen(pfilter) + 1;
 +				*pfilter = _T('\0');  
 +				ofn.lpstrFilter = filter;
 +				ofn.lpstrFile = path;
 +				ofn.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
 +				ofn.nMaxFile = sizeof(path);
 +				ofn.lpstrDefExt = _T("knt");
 +				if(GetOpenFileName(&ofn)) {
 +					importThemes(path, IsDlgButtonChecked(hwndDlg, IDC_OVERRIDE) == BST_CHECKED);
 +					SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0);
 +				}
 +				}
 +				return TRUE;
 +			case IDC_OVERRIDE:
 +				SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0);
 +				return TRUE;
 +			}
 +			break;
 +
 +		case WM_NOTIFY:
 +			{
 +				int count;
 +				TCHAR theme[MAX_PATH+1], themeAux[MAX_PATH+1], *str;
 +				//Here we have pressed either the OK or the APPLY button.
 +				switch(((LPNMHDR)lParam)->idFrom) {
 +				case 0:
 +					switch (((LPNMHDR)lParam)->code) {
 +					case PSN_APPLY:
 +						if (!DBGetContactSetting(NULL, KEYBDMODULE, fmtDBSettingName("theme%d", wCustomTheme), &dbv))
 +							wcscpy(theme, dbv.ptszVal);
 +						else
 +							theme[0] = _T('\0');
 +
 +						// Here we will delete all the items in the theme combo on the Flashing tab: we will load them again later
 +						for (i=0; SendDlgItemMessage(hwndEffect, IDC_SCUSTOM, CB_DELETESTRING, 0, (LPARAM)i) != CB_ERR; i++);
 +
 +						count = SendDlgItemMessage(hwndDlg, IDC_THEME, CB_GETCOUNT, 0, 0);
 +						for (i=0, wCustomTheme=0; i < count; i++) {
 +							SendDlgItemMessage(hwndDlg, IDC_THEME, CB_GETLBTEXT, (WPARAM)i, (LPARAM)themeAux);
 +							DBWriteContactSettingWString(NULL, KEYBDMODULE, fmtDBSettingName("theme%d", i), themeAux);
 +							str = (TCHAR *)SendDlgItemMessage(hwndDlg, IDC_THEME, CB_GETITEMDATA, (WPARAM)i, 0);
 +							if (str)
 +								DBWriteContactSettingWString(NULL, KEYBDMODULE, fmtDBSettingName("custom%d", i), str);
 +							else
 +								DBWriteContactSettingWString(NULL, KEYBDMODULE, fmtDBSettingName("custom%d", i), _T(""));
 +
 +							if (!wcscmp(theme, themeAux))
 +								wCustomTheme = i;
 +
 +							// Here we will update the theme combo on the Flashing tab: horrible but can't imagine a better way right now
 +							SendDlgItemMessage(hwndEffect, IDC_SCUSTOM, CB_INSERTSTRING, (WPARAM)i, (LPARAM)themeAux);
 +							SendDlgItemMessage(hwndEffect, IDC_SCUSTOM, CB_SETITEMDATA, (WPARAM)i, (LPARAM)i);
 +						}
 +						for (i=count; !DBDeleteContactSetting(NULL, KEYBDMODULE, fmtDBSettingName("theme%d", i)); i++)
 +							DBDeleteContactSetting(NULL, KEYBDMODULE, fmtDBSettingName("custom%d", i));
 +
 +						DBWriteContactSettingWord(NULL, KEYBDMODULE, "custom", wCustomTheme);
 +						// Still updating here the the Flashing tab's controls
 +						SendDlgItemMessage(hwndEffect, IDC_SCUSTOM, CB_SETCURSEL, (WPARAM)wCustomTheme, 0);
 +
 +						DBWriteContactSettingByte(NULL, KEYBDMODULE, "override", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_OVERRIDE) == BST_CHECKED ? 1:0));
 +
 +						return TRUE;
 +					} // switch code
 +					break;
 +				} //switch idFrom
 +			}
 +			break; //End WM_NOTIFY
 +
 +			case WM_DESTROY:
 +			{
 +			int item, count = SendDlgItemMessage(hwndDlg, IDC_THEME, CB_GETCOUNT, 0, 0);
 +
 +			for (item=0; item < count; item++) {
 +				str = (TCHAR *)SendDlgItemMessage(hwndDlg, IDC_THEME, CB_GETITEMDATA, (WPARAM)item, 0);
 +				if (str)
 +					free(str);
 +			}
 +			break;
 +			}
 +					
 +			default:
 +			break;
 +	}
 +
 +	return FALSE;
 +}
 +
 +
 +void exportThemes(const TCHAR *filename)
 +{
 +	int i;
 +	FILE *fExport;
 +	DBVARIANT dbv;
 +
 +	if (!(fExport = _wfopen(filename, _T("wt"))))
 +		return;
 +
 +	fwprintf(fExport, TranslateT("\n; Automatically generated Keyboard Notify Theme file\n\n\n"));
 +
 +	for (i=0; !DBGetContactSetting(NULL, KEYBDMODULE, fmtDBSettingName("theme%d", i), &dbv); i++) {
 +		fwprintf(fExport, _T("[%s]\n"), dbv.ptszVal);
 +		DBFreeVariant(&dbv);
 +		if (DBGetContactSetting(NULL, KEYBDMODULE, fmtDBSettingName("custom%d", i), &dbv))
 +			fwprintf(fExport, _T("0\n\n"));
 +		else {
 +			fwprintf(fExport, _T("%s\n\n"), dbv.ptszVal);
 +			DBFreeVariant(&dbv);
 +		}
 +	}
 +
 +	fwprintf(fExport, TranslateT("\n; End of automatically generated Keyboard Notify Theme file\n"));
 +
 +	fclose(fExport);
 +}
 +
 +
 +void importThemes(const TCHAR *filename, BOOL overrideExisting)
 +{
 +	int i, status=0;
 +	FILE *fImport;
 +	TCHAR buffer[MAX_PATH+1], theme[MAX_PATH+1], *str;
 +
 +	if (!(fImport = _wfopen(filename, _T("rt"))))
 +		return;
 +
 +	while (fgetws(buffer, MAX_PATH, fImport) != NULL) {
 +		for (str=buffer; *str && isspace(*str); str++); //ltrim
 +		if (!*str || *str == ';') //empty line or comment
 +			continue;
 +		for (i=wcslen(str)-1; isspace(str[i]); str[i--]='\0'); //rtrim
 +		switch (status) {
 +			case 0:
 +				if (i > 1 && str[0] == '[' && str[i] == ']') {
 +					status = 1;
 +					wcscpy(theme, str+1);
 +					theme[i-1] = '\0';
 +				}
 +				break;
 +			case 1:
 +				status = 0;
 +				writeThemeToCombo(theme, normalizeCustomString(str), overrideExisting);
 +				break;
 +		}
 +	}
 +
 +	fclose(fImport);
 +}
 +
 +
 +void writeThemeToCombo(const TCHAR *theme, const TCHAR *custom, BOOL overrideExisting)
 +{
 +	int item;
 +	TCHAR *str;
 +
 +	item = SendDlgItemMessage(hwndTheme, IDC_THEME, CB_FINDSTRINGEXACT, -1, (LPARAM)theme);
 +	if (item == CB_ERR) {
 +		item = SendDlgItemMessage(hwndTheme, IDC_THEME, CB_ADDSTRING, 0, (LPARAM)theme);
 +		str = (TCHAR *)malloc(MAX_PATH+1);
 +		if (str)
 +			wcscpy(str, custom);
 +		SendDlgItemMessage(hwndTheme, IDC_THEME, CB_SETITEMDATA, (WPARAM)item, (LPARAM)str);
 +	} else
 +		if (overrideExisting) {
 +			str = (TCHAR *)SendDlgItemMessage(hwndTheme, IDC_THEME, CB_GETITEMDATA, (WPARAM)item, 0);
 +			if (str)
 +				wcscpy(str, custom);
 +		}
 +}
 +
 +
 +INT_PTR CALLBACK DlgProcProcesses(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
 +{
 +	unsigned int i;
 +
 +	switch (msg) {
 +
 +		case WM_INITDIALOG:
 +			TranslateDialogDefault(hwndDlg);
 +
 +			SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, EM_LIMITTEXT, MAX_PATH, 0);
 +
 +			for (i=0; i < ProcessListAux.count; i++)
 +				if (ProcessListAux.szFileName[i]) {
 +					int index = SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_INSERTSTRING, (WPARAM)-1, (LPARAM)ProcessListAux.szFileName[i]);
 +					if (index != CB_ERR && index != CB_ERRSPACE)
 +						SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_SETITEMDATA, (WPARAM)index, (LPARAM)i);
 +				}
 +
 +			EnableWindow(GetDlgItem(hwndDlg, IDC_ADDPGM), FALSE);
 +			if (SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_GETCOUNT, 0, 0) == 0)
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_DELETEPGM), FALSE);
 +			else
 +				SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_SETCURSEL, 0, 0);
 +
 +			return TRUE;
 +
 +		case WM_COMMAND:
 +			switch (LOWORD(wParam)) {
 +			case IDC_PROGRAMS:
 +				switch (HIWORD(wParam)) {
 +				int item;
 +				TCHAR szFileName[MAX_PATH+1];
 +
 +				case CBN_SELENDOK:
 +				case CBN_SELCHANGE:
 +					EnableWindow(GetDlgItem(hwndDlg, IDC_ADDPGM), FALSE);
 +					EnableWindow(GetDlgItem(hwndDlg, IDC_DELETEPGM), TRUE);
 +					break;
 +				case CBN_EDITCHANGE:
 +					GetDlgItemText(hwndDlg, IDC_PROGRAMS, szFileName, sizeof(szFileName));
 +					if ((item = SendMessage((HWND)lParam, CB_FINDSTRINGEXACT, -1, (LPARAM)szFileName)) == CB_ERR) {	//new program
 +						EnableWindow(GetDlgItem(hwndDlg, IDC_ADDPGM), TRUE);
 +						EnableWindow(GetDlgItem(hwndDlg, IDC_DELETEPGM), FALSE);
 +					} else {
 +						EnableWindow(GetDlgItem(hwndDlg, IDC_ADDPGM), FALSE);
 +						EnableWindow(GetDlgItem(hwndDlg, IDC_DELETEPGM), TRUE);
 +					}
 +					break;
 +				}
 +				break;
 +			case IDC_ADDPGM:
 +				{
 +				int item;
 +				TCHAR szFileName[MAX_PATH+1];
 +
 +				GetDlgItemText(hwndDlg, IDC_PROGRAMS, szFileName, sizeof(szFileName));
 +				if (!szFileName[0])
 +					break;
 +				item = SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_ADDSTRING, 0, (LPARAM)szFileName);
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_ADDPGM), FALSE);
 +				EnableWindow(GetDlgItem(hwndDlg, IDC_DELETEPGM), TRUE);
 +				}
 +				break;
 +			case IDC_DELETEPGM:
 +				{
 +				int item;
 +				TCHAR szFileName[MAX_PATH+1];
 +
 +				GetDlgItemText(hwndDlg, IDC_PROGRAMS, szFileName, sizeof(szFileName));
 +				item = SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_FINDSTRINGEXACT, -1, (LPARAM)szFileName);
 +				SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_DELETESTRING, (WPARAM)item, 0);
 +				if (SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_GETCOUNT, 0, 0) == 0) {
 +					SetDlgItemText(hwndDlg, IDC_PROGRAMS, _T(""));
 +					EnableWindow(GetDlgItem(hwndDlg, IDC_DELETEPGM), FALSE);
 +				} else
 +					SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_SETCURSEL, 0, 0);
 +				}
 +				break;
 +			case IDC_OKPGM:
 +				destroyProcessListAux();
 +
 +				ProcessListAux.count = SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_GETCOUNT, 0, 0);
 +				ProcessListAux.szFileName = (TCHAR **)malloc(ProcessListAux.count * sizeof(TCHAR *));
 +				if (!ProcessListAux.szFileName)
 +					ProcessListAux.count = 0;
 +				else
 +					for (i=0; i < ProcessListAux.count; i++) {
 +						TCHAR szFileNameAux[MAX_PATH+1];
 +
 +						SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_GETLBTEXT, (WPARAM)i, (LPARAM)szFileNameAux);
 +						ProcessListAux.szFileName[i] = (TCHAR *)malloc(wcslen(szFileNameAux) + 1);
 +						if (ProcessListAux.szFileName[i])
 +							wcscpy(ProcessListAux.szFileName[i], szFileNameAux);
 +					}
 +	
 +			case IDC_CANCELPGM:
 +				EndDialog(hwndDlg, LOWORD(wParam));
 +				break;
 +			}
 +			break;
 +	}
 +
 +	return FALSE;
 +}
 +
 +
 +void createProcessListAux(void)
 +{
 +	unsigned int i;
 +
 +	ProcessListAux.count = ProcessList.count;
 +	ProcessListAux.szFileName = (TCHAR **)malloc(ProcessListAux.count * sizeof(char *));
 +	if (!ProcessListAux.szFileName)
 +		ProcessListAux.count = 0;
 +	else
 +		for (i=0; i < ProcessListAux.count; i++)
 +			if (!ProcessList.szFileName[i])
 +				ProcessListAux.szFileName[i] = NULL;
 +			else {
 +				ProcessListAux.szFileName[i] = (TCHAR *)malloc(wcslen(ProcessList.szFileName[i]) + 1);
 +				if (ProcessListAux.szFileName[i])
 +					wcscpy(ProcessListAux.szFileName[i], ProcessList.szFileName[i]);
 +			}
 +
 +}
 +
 +
 +void destroyProcessListAux(void)
 +{
 +	unsigned int i;
 +
 +	for(i=0; i < ProcessListAux.count; i++)
 +		if (ProcessListAux.szFileName[i])
 +			free(ProcessListAux.szFileName[i]);
 +
 +	if (ProcessListAux.szFileName)
 +		free(ProcessListAux.szFileName);
 +
 +	ProcessListAux.count = 0;
 +	ProcessListAux.szFileName = NULL;
 +}
 +
 +
 +INT_PTR CALLBACK DlgProcEventLeds(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
 +{
 +	switch (msg) {
 +
 +		case WM_INITDIALOG:
 +			TranslateDialogDefault(hwndDlg);
 +
 +			CheckDlgButton(hwndDlg, IDC_MSGLEDNUM, trillianLedsMsg&2 ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_MSGLEDCAPS, trillianLedsMsg&4 ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_MSGLEDSCROLL, trillianLedsMsg&1 ? BST_CHECKED:BST_UNCHECKED);
 +
 +			CheckDlgButton(hwndDlg, IDC_FILELEDNUM, trillianLedsFile&2 ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_FILELEDCAPS, trillianLedsFile&4 ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_FILELEDSCROLL, trillianLedsFile&1 ? BST_CHECKED:BST_UNCHECKED);
 +
 +			CheckDlgButton(hwndDlg, IDC_URLLEDNUM, trillianLedsURL&2 ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_URLLEDCAPS, trillianLedsURL&4 ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_URLLEDSCROLL, trillianLedsURL&1 ? BST_CHECKED:BST_UNCHECKED);
 +
 +			CheckDlgButton(hwndDlg, IDC_OTHERLEDNUM, trillianLedsOther&2 ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_OTHERLEDCAPS, trillianLedsOther&4 ? BST_CHECKED:BST_UNCHECKED);
 +			CheckDlgButton(hwndDlg, IDC_OTHERLEDSCROLL, trillianLedsOther&1 ? BST_CHECKED:BST_UNCHECKED);
 +
 +			return TRUE;
 +
 +		case WM_COMMAND:
 +			switch (LOWORD(wParam)) {
 +			case IDC_OK:
 +				trillianLedsMsg = 0;
 +				if(IsDlgButtonChecked(hwndDlg, IDC_MSGLEDNUM) == BST_CHECKED)
 +					trillianLedsMsg |= 2;
 +				if(IsDlgButtonChecked(hwndDlg, IDC_MSGLEDCAPS) == BST_CHECKED)
 +					trillianLedsMsg |= 4;
 +				if(IsDlgButtonChecked(hwndDlg, IDC_MSGLEDSCROLL) == BST_CHECKED)
 +					trillianLedsMsg |= 1;
 +
 +				trillianLedsFile = 0;
 +				if(IsDlgButtonChecked(hwndDlg, IDC_FILELEDNUM) == BST_CHECKED)
 +					trillianLedsFile |= 2;
 +				if(IsDlgButtonChecked(hwndDlg, IDC_FILELEDCAPS) == BST_CHECKED)
 +					trillianLedsFile |= 4;
 +				if(IsDlgButtonChecked(hwndDlg, IDC_FILELEDSCROLL) == BST_CHECKED)
 +					trillianLedsFile |= 1;
 +
 +				trillianLedsURL = 0;
 +				if(IsDlgButtonChecked(hwndDlg, IDC_URLLEDNUM) == BST_CHECKED)
 +					trillianLedsURL |= 2;
 +				if(IsDlgButtonChecked(hwndDlg, IDC_URLLEDCAPS) == BST_CHECKED)
 +					trillianLedsURL |= 4;
 +				if(IsDlgButtonChecked(hwndDlg, IDC_URLLEDSCROLL) == BST_CHECKED)
 +					trillianLedsURL |= 1;
 +
 +				trillianLedsOther = 0;
 +				if(IsDlgButtonChecked(hwndDlg, IDC_OTHERLEDNUM) == BST_CHECKED)
 +					trillianLedsOther |= 2;
 +				if(IsDlgButtonChecked(hwndDlg, IDC_OTHERLEDCAPS) == BST_CHECKED)
 +					trillianLedsOther |= 4;
 +				if(IsDlgButtonChecked(hwndDlg, IDC_OTHERLEDSCROLL) == BST_CHECKED)
 +					trillianLedsOther |= 1;
 +
 +			case IDC_CANCEL:
 +				EndDialog(hwndDlg, LOWORD(wParam));
 +				break;
 +			}
 +			break;
 +	}
 +
 +	return FALSE;
 +}
 +
 +
 +void createXstatusListAux(void)
 +{
 +	unsigned int i, j;
 +
 +	XstatusListAux = (XSTATUS_INFO *)malloc(ProtoList.protoCount * sizeof(XSTATUS_INFO));
 +	if (XstatusListAux)
 +		for (i=0; i < ProtoList.protoCount; i++) {
 +			XstatusListAux[i].count = ProtoList.protoInfo[i].xstatus.count;
 +			if (!XstatusListAux[i].count)
 +				XstatusListAux[i].enabled = NULL;
 +			else {
 +				XstatusListAux[i].enabled = (BOOL *)malloc(XstatusListAux[i].count * sizeof(BOOL));
 +				if (!XstatusListAux[i].enabled)
 +					XstatusListAux[i].count = 0;
 +				else
 +					for(j=0; j < XstatusListAux[i].count; j++)
 +						XstatusListAux[i].enabled[j] = ProtoList.protoInfo[i].xstatus.enabled[j];
 +			}
 +		}
 +
 +}
 +
 +
 +void destroyXstatusListAux(void)
 +{
 +	unsigned int i;
 +
 +	if (XstatusListAux) {
 +		for(i=0; i < ProtoList.protoCount; i++)
 +			if (XstatusListAux[i].enabled)
 +				free(XstatusListAux[i].enabled);
 +
 +		free(XstatusListAux);
 +		XstatusListAux = NULL;
 +	}
 +
 +}
 +
 +
 +INT_PTR CALLBACK DlgProcXstatusList(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
 +{
 +	switch (msg) {
 +
 +		case WM_INITDIALOG:
 +
 +		{
 +			unsigned int i, j;
 +			int imageCount;
 +			HICON hIconAux;
 +			HIMAGELIST hImageList;
 +			TVINSERTSTRUCT tvis={0};
 +			TVITEM tvi={0};
 +			HTREEITEM hSectionItem, hItem;
 +			HWND hwndTree = GetDlgItem(hwndDlg, IDC_TREE_XSTATUS);
 +
 +			TranslateDialogDefault(hwndDlg);
 +			SetWindowLong(hwndTree, GWL_STYLE, GetWindowLong(hwndTree, GWL_STYLE)|TVS_NOHSCROLL|TVS_CHECKBOXES);
 +
 +			if (!XstatusListAux) return TRUE;
 +
 +			// Calculate hImageList size
 +			for (i=0, imageCount=1; i < ProtoList.protoCount; i++)
 +				if (ProtoList.protoInfo[i].enabled && XstatusListAux[i].count)
 +					imageCount += XstatusListAux[i].count;
 +	
 +			hImageList = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), (bWindowsNT && dWinVer >= 5.01?ILC_COLOR32:ILC_COLOR16)|ILC_MASK, imageCount, imageCount);
 +			TreeView_SetImageList(hwndTree, hImageList, TVSIL_NORMAL);
 +
 +			ImageList_AddIcon(hImageList, hIconAux=(HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_BLANK), IMAGE_ICON, 0, 0, 0));
 +			if (hIconAux) DestroyIcon(hIconAux);
 +
 +			TreeView_SelectItem(hwndTree, NULL);
 +			ShowWindow(hwndTree, SW_HIDE);
 +			TreeView_DeleteAllItems(hwndTree);
 +
 +			for (i=0; i < ProtoList.protoCount; i++)
 +				if (ProtoList.protoInfo[i].enabled && XstatusListAux[i].count) {
 +					HTREEITEM hParent;
 +
 +					int count; PROTOACCOUNT** protos;
 +					ProtoEnumAccounts( &count, &protos );
 +
 +					tvis.hParent = NULL;
 +					tvis.hInsertAfter = TVI_LAST;
 +					tvis.item.mask = TVIF_TEXT|TVIF_PARAM|TVIF_STATE|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
 +					tvis.item.pszText = protos[i] -> tszAccountName; 
 +					tvis.item.lParam = (LPARAM)i;
 +					tvis.item.stateMask = TVIS_BOLD|TVIS_EXPANDED;
 +					tvis.item.state = TVIS_BOLD|TVIS_EXPANDED;
 +					tvis.item.iImage = tvis.item.iSelectedImage = ImageList_AddIcon(hImageList, hIconAux=(HICON)CallProtoService(ProtoList.protoInfo[i].szProto, PS_LOADICON, PLI_PROTOCOL, 0));
 +					if (hIconAux) DestroyIcon(hIconAux);
 +					hParent = TreeView_InsertItem(hwndTree, &tvis);
 +					for(j=0; j < XstatusListAux[i].count; j++) {
 +						TCHAR szDefaultName[1024];
 +						ICQ_CUSTOM_STATUS xstatus={0};
 +
 +						tvis.hParent = hParent;
 +						tvis.item.mask = TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
 +						if (!j){
 +							tvis.item.pszText = TranslateT("None"); }
 +						else {
 +							xstatus.cbSize = sizeof(ICQ_CUSTOM_STATUS);
 +							xstatus.flags = CSSF_MASK_NAME|CSSF_DEFAULT_NAME|CSSF_UNICODE;
 +							xstatus.ptszName = szDefaultName;
 +							xstatus.wParam = &j;
 +							CallProtoService(ProtoList.protoInfo[i].szProto, PS_ICQ_GETCUSTOMSTATUSEX, 0, (LPARAM)&xstatus);
 +							tvis.item.pszText = szDefaultName;
 +						}
 +						tvis.item.lParam = (LPARAM)j;
 +						tvis.item.iImage = tvis.item.iSelectedImage = j?ImageList_AddIcon(hImageList, hIconAux=(HICON)CallProtoService(ProtoList.protoInfo[i].szProto, PS_ICQ_GETCUSTOMSTATUSICON, (WPARAM)j, 0)):0;
 +						if (hIconAux) DestroyIcon(hIconAux);
 +						TreeView_InsertItem(hwndTree, &tvis);
 +					}
 +				}
 +
 +			tvi.mask = TVIF_HANDLE|TVIF_PARAM;
 +			for (hSectionItem=TreeView_GetRoot(hwndTree); hSectionItem; hSectionItem=TreeView_GetNextSibling(hwndTree, hSectionItem)) {
 +				tvi.hItem = hSectionItem;
 +				TreeView_GetItem(hwndTree, &tvi);
 +				i = (unsigned int)tvi.lParam;
 +				TreeView_SetItemState(hwndTree, hSectionItem, INDEXTOSTATEIMAGEMASK(0), TVIS_STATEIMAGEMASK);
 +				for (hItem=TreeView_GetChild(hwndTree, hSectionItem); hItem; hItem=TreeView_GetNextSibling(hwndTree, hItem)) {
 +					tvi.hItem = hItem;
 +					TreeView_GetItem(hwndTree, &tvi);
 +					j = (unsigned int)tvi.lParam;
 +					TreeView_SetItemState(hwndTree, hItem, INDEXTOSTATEIMAGEMASK(XstatusListAux[i].enabled[j]?2:1), TVIS_STATEIMAGEMASK);
 +				}
 +			}
 +
 +			ShowWindow(hwndTree, SW_SHOW);
 +			TreeView_SetItemState(hwndTree, 0, TVIS_SELECTED, TVIS_SELECTED);
 +			return TRUE;
 +		}
 +
 +		case WM_DESTROY:
 +		{
 +			HIMAGELIST hImageList;
 +
 +			// Destroy tree view imagelist since it does not get destroyed automatically (see msdn docs)
 +			hImageList = TreeView_GetImageList(GetDlgItem(hwndDlg, IDC_TREE_XSTATUS), TVSIL_STATE);
 +			if (hImageList) {
 +				TreeView_SetImageList(GetDlgItem(hwndDlg, IDC_TREE_XSTATUS), NULL, TVSIL_STATE);
 +				ImageList_Destroy(hImageList);
 +			}
 +			hImageList = TreeView_GetImageList(GetDlgItem(hwndDlg, IDC_TREE_XSTATUS), TVSIL_NORMAL);
 +			if (hImageList) {
 +				TreeView_SetImageList(GetDlgItem(hwndDlg, IDC_TREE_XSTATUS), NULL, TVSIL_NORMAL);
 +				ImageList_Destroy(hImageList);
 +			}
 +			return TRUE;
 +		}
 +
 +		case WM_COMMAND:
 +			switch (LOWORD(wParam)) {
 +			case IDC_OKXST:
 +			{
 +				unsigned int i, j;
 +				HTREEITEM hSectionItem, hItem;
 +				TVITEM tvi={0};
 +				HWND hwndTree = GetDlgItem(hwndDlg, IDC_TREE_XSTATUS);
 +
 +				tvi.mask = TVIF_HANDLE|TVIF_PARAM;
 +				for (hSectionItem=TreeView_GetRoot(hwndTree); hSectionItem; hSectionItem=TreeView_GetNextSibling(hwndTree, hSectionItem)) {
 +					tvi.hItem = hSectionItem;
 +					TreeView_GetItem(hwndTree, &tvi);
 +					i = (unsigned int)tvi.lParam;
 +					for (hItem=TreeView_GetChild(hwndTree, hSectionItem); hItem; hItem=TreeView_GetNextSibling(hwndTree, hItem)) {
 +						tvi.hItem = hItem;
 +						TreeView_GetItem(hwndTree, &tvi);
 +						j = (unsigned int)tvi.lParam;
 +						XstatusListAux[i].enabled[j] = !!(TreeView_GetItemState(hwndTree, hItem, TVIS_STATEIMAGEMASK)&INDEXTOSTATEIMAGEMASK(2));
 +					}
 +				}
 +			}
 +
 +			case IDC_CANCELXST:
 +				EndDialog(hwndDlg, LOWORD(wParam));
 +				return TRUE;
 +			}
 +			break;
 +	}
 +
 +	return FALSE;
 +}
  | 
