/**
** Supermodel
** A Sega Model 3 Arcade Emulator.
** Copyright 2011 Bart Trzynadlowski, Nik Henson
**
** This file is part of Supermodel.
**
** Supermodel 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 3 of the License, or (at your option)
** any later version.
**
** Supermodel 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 Supermodel. If not, see .
**/
/*
* WinOutputs.h
*
* Implementation of COutputs that sends MAMEHooker compatible messages via Windows messages.
*/
#ifndef INCLUDED_WINOUTPUTS_H
#define INCLUDED_WINOUTPUTS_H
#define WIN32_LEAN_AND_MEAN
#include
#include "OSD/Outputs.h"
#include
using namespace std;
// Struct that represents a client (eg MAMEHooker) currently registered with the emulator
struct RegisteredClient
{
LPARAM id; // Client-specified id
HWND hwnd; // Client HWND
};
struct CopyDataIdString
{
UINT32 id; // Id that was requested
char string[1]; // String containing data
};
class CWinOutputs : public COutputs
{
public:
/*
* CWinOutputs():
* ~CWinOutputs():
*
* Constructor and destructor.
*/
CWinOutputs();
virtual ~CWinOutputs();
/*
* Initialize():
*
* Initializes this class.
*/
bool Initialize();
/*
* Attached():
*
* Lets the class know that it has been attached to the emulator.
*/
void Attached();
protected:
/*
* SendOutput():
*
* Sends the appropriate output message to all registered clients.
*/
void SendOutput(EOutputs output, UINT8 prevValue, UINT8 value);
private:
static bool s_createdClass;
/*
* CreateWindowClass():
*
* Registers the window class and sets up OutputWindowProcCallback to process all messages sent to the emulator window.
*/
static bool CreateWindowClass();
/*
* OutputWindowProcCallback(hwnd, msg, wParam, lParam):
*
* Receives all messages sent to the emulator window and passes them on to the CWinOutputs object (whose pointer is passed
* via GWLP_USERDATA).
*/
static LRESULT CALLBACK OutputWindowProcCallback(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
HWND m_hwnd;
UINT m_onStart;
UINT m_onStop;
UINT m_updateState;
UINT m_regClient;
UINT m_unregClient;
UINT m_getIdString;
vector m_clients;
/*
* AllocateMessageId(regId, str):
*
* Defines a new window message type with the given name and returns the allocated message id.
*/
bool AllocateMessageId(UINT ®Id, LPCSTR str);
/*
* OutputWindowProc(hwnd, msg, wParam, lParam):
*
* Processes the messages sent to the emulator window.
*/
LRESULT OutputWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
/*
* RegisterClient(hwnd, id):
*
* Registers a client (eg MAMEHooker) with the emulator.
*/
LRESULT RegisterClient(HWND hwnd, LPARAM id);
/*
* SendAllToClient(client):
*
* Sends the current state of all the outputs to the given registered client.
* Called whenever a client is registered with the emulator.
*/
void SendAllToClient(RegisteredClient &client);
/*
* UnregisterClient(hwnd, id):
*
* Unregisters a client from the emulator.
*/
LRESULT UnregisterClient(HWND hwnd, LPARAM id);
/*
* SendIdString(hwnd, id):
*
* Sends the name of the requested output back to a client, or the name of the current running game if an id of zero is requested.
*/
LRESULT SendIdString(HWND hwnd, LPARAM id);
/*
* MapIdToName(id):
*
* Maps the given id to an output's name.
*/
const char *MapIdToName(LPARAM id);
/*
* MapNameToId(name):
*
* Maps the given name to an output's id.
*/
LPARAM MapNameToId(const char *name);
};
#endif // INCLUDED_WINOUTPUTS_H