summaryrefslogtreecommitdiff
path: root/plugins/KeyboardNotify/options.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/KeyboardNotify/options.c')
-rw-r--r--plugins/KeyboardNotify/options.c1569
1 files changed, 1569 insertions, 0 deletions
diff --git a/plugins/KeyboardNotify/options.c b/plugins/KeyboardNotify/options.c
new file mode 100644
index 0000000000..57ea559a99
--- /dev/null
+++ b/plugins/KeyboardNotify/options.c
@@ -0,0 +1,1569 @@
+/*
+
+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 char *);
+void importThemes(const char *, BOOL);
+void writeThemeToCombo(const char *, const char *, 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;
+
+char *AttendedName[]={"Miranda", "Windows"};
+char *OrderName[]={"left->right", "right->left", "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("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 = MAKEINTRESOURCE(IDD_OPTIONS);
+ odp.pszTitle = Translate("Keyboard Flash");
+ odp.pszGroup = Translate("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 = Translate("Protocols");
+ TabCtrl_InsertItem(tc, 0, &tci);
+ tci.pszText = Translate("Rules");
+ TabCtrl_InsertItem(tc, 1, &tci);
+ tci.pszText = Translate("Flashing");
+ TabCtrl_InsertItem(tc, 2, &tci);
+ tci.pszText = Translate("Themes");
+ TabCtrl_InsertItem(tc, 3, &tci);
+ tci.pszText = Translate("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 = Translate("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++) {
+ char protoName[MAX_PATH+1];
+
+ if(ProtoList.protoInfo[i].visible) {
+ lvItem.lParam = (LPARAM)ProtoList.protoInfo[i].szProto;
+ CallProtoService(ProtoList.protoInfo[i].szProto, PS_GETNAME, sizeof(protoName), (LPARAM)protoName);
+ lvItem.pszText = protoName;
+ 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])
+ DBWriteContactSettingString(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)Translate(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.pszVal);
+ 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;
+ char *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 = (char *)malloc(MAX_PATH+1);
+ if (str)
+ if (DBGetContactSetting(NULL, KEYBDMODULE, fmtDBSettingName("custom%d", i), &dbv))
+ str[0] = '\0';
+ else {
+ strcpy(str, dbv.pszVal);
+ 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 = (char *)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;
+ char theme[MAX_PATH+1];
+
+ case CBN_SELENDOK:
+ case CBN_SELCHANGE:
+ str = (char *)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, "");
+ 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, "");
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ADD), TRUE);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE), FALSE);
+ } else {
+ str = (char *)SendMessage((HWND)lParam, CB_GETITEMDATA, (WPARAM)item, 0);
+ if (str)
+ SetDlgItemText(hwndDlg, IDC_CUSTOMSTRING, str);
+ else
+ SetDlgItemText(hwndDlg, IDC_CUSTOMSTRING, "");
+ 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;
+ char 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 = (char *)SendDlgItemMessage(hwndDlg, IDC_THEME, CB_GETITEMDATA, (WPARAM)item, 0);
+ if (str) {
+ GetDlgItemText(hwndDlg, IDC_CUSTOMSTRING, customAux, MAX_PATH);
+ if (strcmp(str, customAux))
+ EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), TRUE);
+ else
+ EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), FALSE);
+ }
+ }
+ return TRUE;
+ case IDC_TEST:
+ {
+ char 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;
+ char 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 = (char *)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;
+ char theme[MAX_PATH+1];
+
+ GetDlgItemText(hwndDlg, IDC_THEME, theme, sizeof(theme));
+ item = SendDlgItemMessage(hwndDlg, IDC_THEME, CB_FINDSTRINGEXACT, -1, (LPARAM)theme);
+ str = (char *)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;
+ char theme[MAX_PATH+1];
+
+ GetDlgItemText(hwndDlg, IDC_THEME, theme, sizeof(theme));
+ item = SendDlgItemMessage(hwndDlg, IDC_THEME, CB_FINDSTRINGEXACT, -1, (LPARAM)theme);
+ str = (char *)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, "");
+ SetDlgItemText(hwndDlg, IDC_CUSTOMSTRING, "");
+ EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE), FALSE);
+ } else {
+ SendDlgItemMessage(hwndDlg, IDC_THEME, CB_SETCURSEL, 0, 0);
+ str = (char *)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:
+ {
+ char path[MAX_PATH+1], filter[MAX_PATH+1], *pfilter;
+ OPENFILENAME ofn={0};
+
+ path[0] = '\0';
+ ofn.lStructSize = sizeof(OPENFILENAME);
+ ofn.hwndOwner = hwndDlg;
+ ofn.hInstance = NULL;
+ strcpy(filter, Translate("Keyboard Notify Theme"));
+ strcat(filter, " (*.knt)");
+ pfilter = filter + strlen(filter) + 1;
+ strcpy(pfilter, "*.knt");
+ pfilter = pfilter + strlen(pfilter) + 1;
+ strcpy(pfilter, Translate("All Files"));
+ pfilter = pfilter + strlen(pfilter) + 1;
+ strcpy(pfilter, "*.*");
+ pfilter = pfilter + strlen(pfilter) + 1;
+ *pfilter = '\0';
+ ofn.lpstrFilter = filter;
+ ofn.lpstrFile = path;
+ ofn.Flags = OFN_HIDEREADONLY|OFN_NOCHANGEDIR|OFN_NOREADONLYRETURN|OFN_PATHMUSTEXIST;
+ ofn.nMaxFile = sizeof(path);
+ ofn.lpstrDefExt = "knt";
+ if(GetSaveFileName(&ofn))
+ exportThemes(path);
+ }
+ return TRUE;
+ case IDC_IMPORT:
+ {
+ char path[MAX_PATH+1], filter[MAX_PATH+1], *pfilter;
+ OPENFILENAME ofn={0};
+
+ path[0] = '\0';
+ ofn.lStructSize = sizeof(OPENFILENAME);
+ ofn.hwndOwner = hwndDlg;
+ ofn.hInstance = NULL;
+ strcpy(filter, Translate("Keyboard Notify Theme"));
+ strcat(filter, " (*.knt)");
+ pfilter = filter + strlen(filter) + 1;
+ strcpy(pfilter, "*.knt");
+ pfilter = pfilter + strlen(pfilter) + 1;
+ strcpy(pfilter, Translate("All Files"));
+ pfilter = pfilter + strlen(pfilter) + 1;
+ strcpy(pfilter, "*.*");
+ pfilter = pfilter + strlen(pfilter) + 1;
+ *pfilter = '\0';
+ ofn.lpstrFilter = filter;
+ ofn.lpstrFile = path;
+ ofn.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
+ ofn.nMaxFile = sizeof(path);
+ ofn.lpstrDefExt = "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;
+ char 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))
+ strcpy(theme, dbv.pszVal);
+ else
+ theme[0] = '\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);
+ DBWriteContactSettingString(NULL, KEYBDMODULE, fmtDBSettingName("theme%d", i), themeAux);
+ str = (char *)SendDlgItemMessage(hwndDlg, IDC_THEME, CB_GETITEMDATA, (WPARAM)i, 0);
+ if (str)
+ DBWriteContactSettingString(NULL, KEYBDMODULE, fmtDBSettingName("custom%d", i), str);
+ else
+ DBWriteContactSettingString(NULL, KEYBDMODULE, fmtDBSettingName("custom%d", i), "");
+
+ if (!strcmp(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 = (char *)SendDlgItemMessage(hwndDlg, IDC_THEME, CB_GETITEMDATA, (WPARAM)item, 0);
+ if (str)
+ free(str);
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ return FALSE;
+}
+
+
+void exportThemes(const char *filename)
+{
+ int i;
+ FILE *fExport;
+ DBVARIANT dbv;
+
+ if (!(fExport = fopen(filename, "wt")))
+ return;
+
+ fprintf(fExport, "\n; Automatically generated Keyboard Notify Theme file\n\n\n");
+
+ for (i=0; !DBGetContactSetting(NULL, KEYBDMODULE, fmtDBSettingName("theme%d", i), &dbv); i++) {
+ fprintf(fExport, "[%s]\n", dbv.pszVal);
+ DBFreeVariant(&dbv);
+ if (DBGetContactSetting(NULL, KEYBDMODULE, fmtDBSettingName("custom%d", i), &dbv))
+ fprintf(fExport, "0\n\n");
+ else {
+ fprintf(fExport, "%s\n\n", dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ }
+
+ fprintf(fExport, "\n; End of automatically generated Keyboard Notify Theme file\n");
+
+ fclose(fExport);
+}
+
+
+void importThemes(const char *filename, BOOL overrideExisting)
+{
+ int i, status=0;
+ FILE *fImport;
+ char buffer[MAX_PATH+1], theme[MAX_PATH+1], *str;
+
+ if (!(fImport = fopen(filename, "rt")))
+ return;
+
+ while (fgets(buffer, MAX_PATH, fImport) != NULL) {
+ for (str=buffer; *str && isspace(*str); str++); //ltrim
+ if (!*str || *str == ';') //empty line or comment
+ continue;
+ for (i=strlen(str)-1; isspace(str[i]); str[i--]='\0'); //rtrim
+ switch (status) {
+ case 0:
+ if (i > 1 && str[0] == '[' && str[i] == ']') {
+ status = 1;
+ strcpy(theme, str+1);
+ theme[i-1] = '\0';
+ }
+ break;
+ case 1:
+ status = 0;
+ writeThemeToCombo(theme, normalizeCustomString(str), overrideExisting);
+ break;
+ }
+ }
+
+ fclose(fImport);
+}
+
+
+void writeThemeToCombo(const char *theme, const char *custom, BOOL overrideExisting)
+{
+ int item;
+ char *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 = (char *)malloc(MAX_PATH+1);
+ if (str)
+ strcpy(str, custom);
+ SendDlgItemMessage(hwndTheme, IDC_THEME, CB_SETITEMDATA, (WPARAM)item, (LPARAM)str);
+ } else
+ if (overrideExisting) {
+ str = (char *)SendDlgItemMessage(hwndTheme, IDC_THEME, CB_GETITEMDATA, (WPARAM)item, 0);
+ if (str)
+ strcpy(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;
+ char 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;
+ char 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;
+ char 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, "");
+ 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 = (char **)malloc(ProcessListAux.count * sizeof(char *));
+ if (!ProcessListAux.szFileName)
+ ProcessListAux.count = 0;
+ else
+ for (i=0; i < ProcessListAux.count; i++) {
+ char szFileNameAux[MAX_PATH+1];
+
+ SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_GETLBTEXT, (WPARAM)i, (LPARAM)szFileNameAux);
+ ProcessListAux.szFileName[i] = (char *)malloc(strlen(szFileNameAux) + 1);
+ if (ProcessListAux.szFileName[i])
+ strcpy(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 = (char **)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] = (char *)malloc(strlen(ProcessList.szFileName[i]) + 1);
+ if (ProcessListAux.szFileName[i])
+ strcpy(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=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;
+ char szProtoName[MAXMODULELABELLENGTH];
+
+ CallProtoService(ProtoList.protoInfo[i].szProto, PS_GETNAME, sizeof(szProtoName), (LPARAM)szProtoName);
+
+ tvis.hParent = NULL;
+ tvis.hInsertAfter = TVI_LAST;
+ tvis.item.mask = TVIF_TEXT|TVIF_PARAM|TVIF_STATE|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+ tvis.item.pszText = szProtoName;
+ 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++) {
+ char 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 = Translate("None");
+ else {
+ xstatus.cbSize = sizeof(ICQ_CUSTOM_STATUS);
+ xstatus.flags = CSSF_MASK_NAME|CSSF_DEFAULT_NAME;
+ xstatus.pszName = 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;
+}