lsnes/include/core/window.hpp

222 lines
5.2 KiB
C++
Raw Normal View History

#ifndef _window__hpp__included__
#define _window__hpp__included__
#include "interface/romtype.hpp"
#include "library/keyboard.hpp"
2012-10-13 15:55:00 +03:00
#include "library/messagebuffer.hpp"
2012-06-20 17:40:27 +03:00
#include "library/framebuffer.hpp"
#include <string>
#include <map>
#include <list>
#include <stdexcept>
2014-05-28 20:11:09 +03:00
class rom_request;
//Various methods corresponding to graphics_driver_*
struct _graphics_driver
{
void (*init)();
void (*quit)();
void (*notify_message)();
2013-07-19 17:21:52 +03:00
void (*error_message)(const std::string& text);
void (*fatal_error)();
const char* (*name)();
void (*action_updated)();
void (*request_rom)(rom_request& req);
};
struct graphics_driver
{
graphics_driver(_graphics_driver drv);
};
//Is dummy graphics plugin.
bool graphics_driver_is_dummy();
2012-01-06 17:28:01 +02:00
/**
* Graphics initialization function.
2011-10-31 21:05:54 +02:00
*
2012-01-06 17:28:01 +02:00
* - The first initialization function to be called by platform::init().
*/
void graphics_driver_init() throw();
2012-01-06 17:28:01 +02:00
/**
* Graphics quit function.
*
* - The last quit function to be called by platform::quit().
*/
void graphics_driver_quit() throw();
2012-01-06 17:28:01 +02:00
/**
* Notification when messages get updated.
*/
void graphics_driver_notify_message() throw();
2012-01-06 17:28:01 +02:00
/**
2013-07-19 17:21:52 +03:00
* Show error message dialog when UI thread is free.
2012-01-06 17:28:01 +02:00
*
* Parameter text: The text for dialog.
*/
2013-07-19 17:21:52 +03:00
void graphics_driver_error_message(const std::string& text) throw();
2012-01-06 17:28:01 +02:00
/**
* Displays fatal error message.
*
* - After this routine returns, the program will quit.
* - The call can occur in any thread.
*/
void graphics_driver_fatal_error() throw();
2012-01-06 17:28:01 +02:00
/**
* Identification for graphics plugin.
*/
const char* graphics_driver_name();
2013-06-30 13:20:23 +03:00
/**
* Enable/Disable an action.
*/
void graphics_driver_action_updated();
/**
* Request a ROM image.
*/
void graphics_driver_request_rom(rom_request& req);
2012-01-06 17:28:01 +02:00
/**
* Platform-specific-related functions.
*/
struct platform
{
/**
* Initialize the system.
2011-09-15 15:12:26 +03:00
*/
static void init();
2011-09-15 15:12:26 +03:00
/**
2012-01-06 17:28:01 +02:00
* Shut down the system.
2011-09-15 15:12:26 +03:00
*/
static void quit();
/**
2011-10-31 21:05:54 +02:00
* Get output stream printing into message queue.
2011-09-15 22:56:33 +03:00
*
2011-10-31 21:05:54 +02:00
* Note that lines printed there should be terminated by '\n'.
*
* Implemented by the generic window code.
*
* returns: The output stream.
2011-09-15 15:12:26 +03:00
* throws std::bad_alloc: Not enough memory.
*/
2011-10-31 21:05:54 +02:00
static std::ostream& out() throw(std::bad_alloc);
/**
* Message buffer.
*/
static messagebuffer msgbuf;
2012-01-06 17:28:01 +02:00
/**
* Get message buffer lock.
*/
static threads::lock& msgbuf_lock() throw();
2011-10-31 21:05:54 +02:00
/**
* Adds a messages to mesage queue to be shown.
2011-09-15 22:56:33 +03:00
*
* Implemented by the generic window code.
2011-10-31 21:05:54 +02:00
*
* parameter msg: The messages to add (split by '\n').
2011-09-15 15:12:26 +03:00
* throws std::bad_alloc: Not enough memory.
*/
2011-10-31 21:05:54 +02:00
static void message(const std::string& msg) throw(std::bad_alloc);
/**
* Displays fatal error message, quitting after the user acks it (called by fatal_error()).
*
* Needs to be implemented by the graphics plugin.
*/
static void fatal_error() throw();
/**
* Enable or disable sound.
*
* Implemented by the generic window code.
*
* parameter enable: Enable sounds if true, otherwise disable sounds.
*/
static void sound_enable(bool enable) throw();
/**
* Are sounds enabled?
*/
static bool is_sound_enabled() throw();
/**
* Set sound device.
*/
2013-01-28 13:01:05 +02:00
static void set_sound_device(const std::string& pdev, const std::string& rdev) throw();
/**
2013-07-19 17:21:52 +03:00
* Show error message dialog after UI thread becomes free.
2011-10-31 21:05:54 +02:00
*
2012-01-06 17:28:01 +02:00
* Parameter text: The text for dialog.
*/
2013-07-19 17:21:52 +03:00
static void error_message(const std::string& text) throw()
2012-01-06 17:28:01 +02:00
{
2013-07-19 17:21:52 +03:00
return graphics_driver_error_message(text);
2012-01-06 17:28:01 +02:00
}
/**
2012-01-06 17:28:01 +02:00
* Process command and keypress queues.
2011-11-03 17:57:46 +02:00
*
2012-01-06 17:28:01 +02:00
* - If emulating normally, this routine returns fast.
* - If emulator is in pause mode, this routine will block until emulator has left pause mode.
* - If emulator is in some special mode, this routine can block until said mode is left.
*/
2012-01-06 17:28:01 +02:00
static void flush_command_queue() throw();
/**
2011-09-15 15:12:26 +03:00
* Enable/Disable pause mode.
2011-09-15 22:56:33 +03:00
*
2012-01-06 17:28:01 +02:00
* - This function doesn't actually block. For actual paused blocking, use flush_command_queue().
2011-10-31 21:05:54 +02:00
*
2012-01-06 17:28:01 +02:00
* Parameter enable: Enable pause mode if true, disable pause mode if false.
*/
2012-01-06 17:28:01 +02:00
static void set_paused(bool enable) throw();
/**
2012-01-06 17:28:01 +02:00
* Wait specified number of milliseconds before returning.
2011-09-15 22:56:33 +03:00
*
2012-01-06 17:28:01 +02:00
* - The command and keypresses queues are processed while waiting.
2011-11-03 17:57:46 +02:00
*
2012-01-06 17:28:01 +02:00
* Parameter usec: The number of microseconds to wait.
*/
2012-01-06 17:28:01 +02:00
static void wait(uint64_t usec) throw();
/**
2012-01-06 17:28:01 +02:00
* Cause call to wait() to return immediately.
2011-09-15 15:12:26 +03:00
*/
static void cancel_wait() throw();
2011-09-15 15:12:26 +03:00
/**
2012-01-06 17:28:01 +02:00
* Notify received message.
*/
2012-01-06 17:28:01 +02:00
static void notify_message() throw()
{
2013-01-21 14:03:40 +02:00
graphics_driver_notify_message();
2012-01-06 17:28:01 +02:00
}
/**
2012-01-06 17:28:01 +02:00
* Set modal pause mode.
2011-10-31 21:05:54 +02:00
*
2012-01-06 17:28:01 +02:00
* - Modal pause works like ordinary pause, except it uses a separate flag.
*
* Parameter enable: If true, enable modal pause, else disable it.
*/
2012-01-06 17:28:01 +02:00
static void set_modal_pause(bool enable) throw();
2011-10-31 21:05:54 +02:00
/**
2012-01-06 17:28:01 +02:00
* Run all queues.
2011-10-31 21:05:54 +02:00
*/
2012-01-06 17:28:01 +02:00
static void run_queues() throw();
2012-01-23 01:30:24 +02:00
static bool pausing_allowed;
2012-03-26 21:55:02 +03:00
static double global_volume;
static volatile bool do_exit_dummy_event_loop;
static void dummy_event_loop() throw();
static void exit_dummy_event_loop() throw();
};
2012-01-20 14:09:38 +02:00
class modal_pause_holder
{
public:
modal_pause_holder();
~modal_pause_holder();
private:
modal_pause_holder(const modal_pause_holder&);
modal_pause_holder& operator=(const modal_pause_holder&);
};
/**
* If set, queueing synchronous function produces a warning.
*/
extern volatile bool queue_synchronous_fn_warning;
2011-10-28 21:01:29 +03:00
#endif