mirror of
https://github.com/rn10950/RetroZilla.git
synced 2024-11-14 03:30:17 +01:00
305 lines
9.7 KiB
C++
305 lines
9.7 KiB
C++
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||
|
*
|
||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||
|
* the License. You may obtain a copy of the License at
|
||
|
* http://www.mozilla.org/MPL/
|
||
|
*
|
||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||
|
* for the specific language governing rights and limitations under the
|
||
|
* License.
|
||
|
*
|
||
|
* The Original Code is mozilla.org code.
|
||
|
*
|
||
|
* The Initial Developer of the Original Code is
|
||
|
* Netscape Communications Corporation.
|
||
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
||
|
* the Initial Developer. All Rights Reserved.
|
||
|
*
|
||
|
* Contributor(s):
|
||
|
*
|
||
|
* Alternatively, the contents of this file may be used under the terms of
|
||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||
|
* of those above. If you wish to allow use of your version of this file only
|
||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||
|
* use your version of this file under the terms of the MPL, indicate your
|
||
|
* decision by deleting the provisions above and replace them with the notice
|
||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||
|
* the provisions above, a recipient may use your version of this file under
|
||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||
|
*
|
||
|
* ***** END LICENSE BLOCK ***** */
|
||
|
|
||
|
#include "xp.h"
|
||
|
#include <windowsx.h>
|
||
|
|
||
|
#include "resource.h"
|
||
|
#include "loggerw.h"
|
||
|
#include "profilew.h"
|
||
|
|
||
|
extern HINSTANCE hInst;
|
||
|
extern char * ActionName[];
|
||
|
extern char szAppName[];
|
||
|
|
||
|
BOOL CALLBACK GeneralPageProc(HWND, UINT, WPARAM, LPARAM);
|
||
|
BOOL CALLBACK LogPageProc(HWND, UINT, WPARAM, LPARAM);
|
||
|
BOOL CALLBACK FilterPageProc(HWND, UINT, WPARAM, LPARAM);
|
||
|
BOOL CALLBACK AdvancedPageProc(HWND, UINT, WPARAM, LPARAM);
|
||
|
|
||
|
static void onOptions(HWND hWnd, Logger * logger)
|
||
|
{
|
||
|
if(!logger)
|
||
|
return;
|
||
|
|
||
|
PROPSHEETPAGE psp[4];
|
||
|
|
||
|
psp[0].dwSize = sizeof(psp[0]);
|
||
|
psp[0].dwFlags = PSP_DEFAULT;
|
||
|
psp[0].hInstance = hInst;
|
||
|
psp[0].pszTemplate = MAKEINTRESOURCE(IDD_PAGE_GENERAL);
|
||
|
psp[0].pszIcon = 0;
|
||
|
psp[0].pfnDlgProc = GeneralPageProc;
|
||
|
psp[0].pszTitle = 0;
|
||
|
psp[0].lParam = (LPARAM)logger;
|
||
|
psp[0].pfnCallback = NULL;
|
||
|
|
||
|
psp[1].dwSize = sizeof(psp[1]);
|
||
|
psp[1].dwFlags = PSP_DEFAULT;
|
||
|
psp[1].hInstance = hInst;
|
||
|
psp[1].pszTemplate = MAKEINTRESOURCE(IDD_PAGE_LOG);
|
||
|
psp[1].pszIcon = 0;
|
||
|
psp[1].pfnDlgProc = LogPageProc;
|
||
|
psp[1].pszTitle = 0;
|
||
|
psp[1].lParam = (LPARAM)logger;
|
||
|
psp[1].pfnCallback = NULL;
|
||
|
|
||
|
psp[2].dwSize = sizeof(psp[2]);
|
||
|
psp[2].dwFlags = PSP_DEFAULT;
|
||
|
psp[2].hInstance = hInst;
|
||
|
psp[2].pszTemplate = MAKEINTRESOURCE(IDD_PAGE_FILTER);
|
||
|
psp[2].pszIcon = 0;
|
||
|
psp[2].pfnDlgProc = FilterPageProc;
|
||
|
psp[2].pszTitle = 0;
|
||
|
psp[2].lParam = (LPARAM)logger;
|
||
|
psp[2].pfnCallback = NULL;
|
||
|
|
||
|
psp[3].dwSize = sizeof(psp[3]);
|
||
|
psp[3].dwFlags = PSP_DEFAULT;
|
||
|
psp[3].hInstance = hInst;
|
||
|
psp[3].pszTemplate = MAKEINTRESOURCE(IDD_PAGE_ADVANCED);
|
||
|
psp[3].pszIcon = 0;
|
||
|
psp[3].pfnDlgProc = AdvancedPageProc;
|
||
|
psp[3].pszTitle = 0;
|
||
|
psp[3].lParam = (LPARAM)logger;
|
||
|
psp[3].pfnCallback = NULL;
|
||
|
|
||
|
PROPSHEETHEADER psh;
|
||
|
psh.dwSize = sizeof(PROPSHEETHEADER);
|
||
|
psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
|
||
|
psh.hwndParent = hWnd;
|
||
|
psh.hInstance = hInst;
|
||
|
psh.pszIcon = 0;
|
||
|
psh.pszCaption = "Settings";
|
||
|
psh.nPages = sizeof(psp) / sizeof(psp[0]);
|
||
|
psh.nStartPage = 0;
|
||
|
psh.ppsp = psp;
|
||
|
psh.pfnCallback = NULL;
|
||
|
|
||
|
logger->bSaveSettings = FALSE;
|
||
|
|
||
|
int rv = PropertySheet(&psh);
|
||
|
if(rv == -1)
|
||
|
return;
|
||
|
|
||
|
if(logger->bSaveSettings)
|
||
|
{
|
||
|
ProfileWin profile;
|
||
|
|
||
|
if(hWnd != NULL)
|
||
|
{
|
||
|
RECT rc;
|
||
|
if(GetWindowRect(hWnd, &rc))
|
||
|
profile.setSizeAndPosition(rc.right - rc.left, rc.bottom - rc.top, rc.left, rc.top);
|
||
|
}
|
||
|
|
||
|
profile.setBool(NPSPY_REG_KEY_ONTOP, logger->bOnTop);
|
||
|
profile.setBool(NPSPY_REG_KEY_LOGTOWINDOW, logger->bToWindow);
|
||
|
profile.setBool(NPSPY_REG_KEY_LOGTOCONSOLE, logger->bToConsole);
|
||
|
profile.setBool(NPSPY_REG_KEY_LOGTOFILE, logger->bToFile);
|
||
|
profile.setBool(NPSPY_REG_KEY_SPALID, logger->bSPALID);
|
||
|
profile.setString(NPSPY_REG_KEY_LOGFILENAME, logger->szFile);
|
||
|
|
||
|
for(int i = 1; i < TOTAL_NUMBER_OF_API_CALLS; i++)
|
||
|
profile.setBool(ActionName[i], !logger->bMutedCalls[i]);
|
||
|
|
||
|
SetWindowPos(hWnd, logger->bOnTop ? HWND_TOPMOST : HWND_NOTOPMOST, 0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
|
||
|
}
|
||
|
|
||
|
logger->bSaveSettings = FALSE;
|
||
|
}
|
||
|
|
||
|
static void onCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify)
|
||
|
{
|
||
|
LoggerWin * logger = (LoggerWin *)GetWindowLong(hWnd, DWL_USER);
|
||
|
switch (id)
|
||
|
{
|
||
|
case IDC_CHECK_MUTE:
|
||
|
if(logger)
|
||
|
logger->bMutedAll = (BST_CHECKED == IsDlgButtonChecked(hWnd, IDC_CHECK_MUTE));
|
||
|
break;
|
||
|
case IDC_BUTTON_OPTIONS:
|
||
|
onOptions(hWnd, logger);
|
||
|
break;
|
||
|
case IDC_BUTTON_CLEAR:
|
||
|
if(logger)
|
||
|
logger->onClear();
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static BOOL onInitDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam)
|
||
|
{
|
||
|
LoggerWin * logger = (LoggerWin *)lParam;
|
||
|
SetWindowLong(hWnd, DWL_USER, (long)logger);
|
||
|
SetWindowText(hWnd, szAppName);
|
||
|
HFONT hFont = GetStockFont(ANSI_FIXED_FONT);
|
||
|
SetWindowFont(GetDlgItem(hWnd, IDC_MAIN_OUTPUT), hFont, FALSE);
|
||
|
|
||
|
if(logger)
|
||
|
{
|
||
|
CheckDlgButton(hWnd, IDC_CHECK_MUTE, logger->bMutedAll ? BST_CHECKED : BST_UNCHECKED);
|
||
|
if(logger->width && logger->height)
|
||
|
SetWindowPos(hWnd, NULL, logger->x, logger->y, logger->width, logger->height, SWP_NOZORDER);
|
||
|
|
||
|
SetWindowPos(hWnd, logger->bOnTop ? HWND_TOPMOST : HWND_NOTOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
static void onDestroy(HWND hWnd)
|
||
|
{
|
||
|
LoggerWin * logger = (LoggerWin *)GetWindowLong(hWnd, DWL_USER);
|
||
|
if(logger)
|
||
|
logger->onDestroyWindow();
|
||
|
}
|
||
|
|
||
|
static void onSize(HWND hWnd, UINT state, int cx, int cy)
|
||
|
{
|
||
|
long bu = GetDialogBaseUnits();
|
||
|
int bux = LOWORD(bu);
|
||
|
int buy = HIWORD(bu);
|
||
|
int factorx = bux/4;
|
||
|
int factory = buy/8;
|
||
|
|
||
|
int marginLeft = 7 * factorx;
|
||
|
int marginRight = 0 * factorx;
|
||
|
int marginTop = 0 * factory;
|
||
|
int marginBottom = 7 * factory;
|
||
|
int spaceHor = 4 * factorx;
|
||
|
int spaceVer = 7 * factory;
|
||
|
|
||
|
HWND hWndOutput = GetDlgItem(hWnd, IDC_MAIN_OUTPUT);
|
||
|
HWND hWndCheckMute = GetDlgItem(hWnd, IDC_CHECK_MUTE);
|
||
|
HWND hWndCheckOntop = GetDlgItem(hWnd, IDC_CHECK_ONTOP);
|
||
|
HWND hWndButtonOptions = GetDlgItem(hWnd, IDC_BUTTON_OPTIONS);
|
||
|
HWND hWndClear = GetDlgItem(hWnd, IDC_BUTTON_CLEAR);
|
||
|
|
||
|
RECT rcMain;
|
||
|
GetClientRect(hWnd, &rcMain);
|
||
|
|
||
|
int width = rcMain.right - rcMain.left;
|
||
|
int height = rcMain.bottom - rcMain.top;
|
||
|
|
||
|
RECT rcButtonOptions;
|
||
|
GetWindowRect(hWndButtonOptions, &rcButtonOptions);
|
||
|
SetWindowPos(hWndButtonOptions, NULL,
|
||
|
width - marginLeft - rcButtonOptions.right + rcButtonOptions.left,
|
||
|
height - rcButtonOptions.bottom + rcButtonOptions.top - marginBottom,
|
||
|
0, 0, SWP_NOZORDER | SWP_NOSIZE);
|
||
|
|
||
|
RECT rcClear;
|
||
|
GetWindowRect(hWndClear, &rcClear);
|
||
|
SetWindowPos(hWndClear, NULL,
|
||
|
width - marginLeft - rcClear.right + rcClear.left - rcButtonOptions.right + rcButtonOptions.left - spaceHor,
|
||
|
height - rcClear.bottom + rcClear.top - marginBottom,
|
||
|
0, 0, SWP_NOZORDER | SWP_NOSIZE);
|
||
|
|
||
|
RECT rcCheckMute;
|
||
|
GetWindowRect(hWndCheckMute, &rcCheckMute);
|
||
|
SetWindowPos(hWndCheckMute, NULL,
|
||
|
marginLeft,
|
||
|
height - rcCheckMute.bottom + rcCheckMute.top - marginBottom,
|
||
|
0, 0, SWP_NOZORDER | SWP_NOSIZE);
|
||
|
|
||
|
RECT rcCheckOntop;
|
||
|
GetWindowRect(hWndCheckOntop, &rcCheckOntop);
|
||
|
SetWindowPos(hWndCheckOntop, NULL,
|
||
|
marginLeft + rcCheckMute.right - rcCheckMute.left + spaceHor,
|
||
|
height - rcCheckOntop.bottom + rcCheckOntop.top - marginBottom,
|
||
|
0, 0, SWP_NOZORDER | SWP_NOSIZE);
|
||
|
|
||
|
SetWindowPos(hWndOutput, NULL,
|
||
|
0, 0,
|
||
|
width,
|
||
|
height - rcButtonOptions.bottom + rcButtonOptions.top - marginBottom - marginTop - spaceVer,
|
||
|
SWP_NOZORDER | SWP_NOMOVE);
|
||
|
|
||
|
// somehow the Clear button doesn't redraw itself well, so force it
|
||
|
InvalidateRect(hWndClear, NULL, TRUE);
|
||
|
UpdateWindow(hWndClear);
|
||
|
}
|
||
|
|
||
|
BOOL CALLBACK MainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
switch(msg)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
return (BOOL)HANDLE_WM_INITDIALOG(hWnd, wParam, lParam, onInitDialog);
|
||
|
case WM_COMMAND:
|
||
|
HANDLE_WM_COMMAND(hWnd, wParam, lParam, onCommand);
|
||
|
break;
|
||
|
case WM_CLOSE:
|
||
|
DestroyWindow(hWnd);
|
||
|
break;
|
||
|
case WM_DESTROY:
|
||
|
HANDLE_WM_DESTROY(hWnd, wParam, lParam, onDestroy);
|
||
|
break;
|
||
|
case WM_SIZE:
|
||
|
HANDLE_WM_SIZE(hWnd, wParam, lParam, onSize);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return FALSE;
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
// This is exported function which allows to access Settings GUI from other applications
|
||
|
void WINAPI SPY_Setup()
|
||
|
{
|
||
|
LoggerWin logger;
|
||
|
ProfileWin profile;
|
||
|
|
||
|
profile.getBool(NPSPY_REG_KEY_ONTOP, &logger.bOnTop);
|
||
|
profile.getBool(NPSPY_REG_KEY_LOGTOWINDOW, &logger.bToWindow);
|
||
|
profile.getBool(NPSPY_REG_KEY_LOGTOCONSOLE, &logger.bToConsole);
|
||
|
profile.getBool(NPSPY_REG_KEY_LOGTOFILE, &logger.bToFile);
|
||
|
profile.getBool(NPSPY_REG_KEY_SPALID, &logger.bSPALID);
|
||
|
profile.getString(NPSPY_REG_KEY_LOGFILENAME, logger.szFile, strlen(logger.szFile));
|
||
|
|
||
|
for(int i = 1; i < TOTAL_NUMBER_OF_API_CALLS; i++)
|
||
|
{
|
||
|
BOOL selected = TRUE;
|
||
|
if(profile.getBool(ActionName[i], &selected))
|
||
|
logger.bMutedCalls[i] = !selected;
|
||
|
}
|
||
|
|
||
|
onOptions(NULL, &logger);
|
||
|
}
|