mirror of
https://git.code.sf.net/p/fuse-emulator/fuse
synced 2026-01-27 01:41:34 +03:00
317 lines
10 KiB
C
317 lines
10 KiB
C
/* ui.h: General UI event handling routines
|
|
Copyright (c) 2000-2015 Philip Kendall
|
|
Copyright (c) 2016 BogDan Vatra
|
|
|
|
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.,
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
Author contact information:
|
|
|
|
E-mail: philip-fuse@shadowmagic.org.uk
|
|
|
|
*/
|
|
|
|
#ifndef FUSE_UI_H
|
|
#define FUSE_UI_H
|
|
|
|
#include <stdarg.h>
|
|
|
|
#ifdef HAVE_LIB_GLIB
|
|
#include <glib.h>
|
|
#endif
|
|
|
|
#include <libspectrum.h>
|
|
|
|
#include "compat.h"
|
|
#include "machines/specplus3.h"
|
|
#include "peripherals/disk/beta.h"
|
|
#include "peripherals/disk/didaktik.h"
|
|
#include "peripherals/disk/disciple.h"
|
|
#include "peripherals/disk/opus.h"
|
|
#include "peripherals/disk/plusd.h"
|
|
#include "svg.h"
|
|
#include "ui/scaler/scaler.h"
|
|
|
|
/* The various severities of error level, increasing downwards */
|
|
typedef enum ui_error_level {
|
|
|
|
UI_ERROR_INFO, /* Informational message */
|
|
UI_ERROR_WARNING, /* Something is wrong, but it's not that
|
|
important */
|
|
UI_ERROR_ERROR, /* An actual error */
|
|
|
|
} ui_error_level;
|
|
|
|
int ui_init(int *argc, char ***argv);
|
|
int ui_event(void);
|
|
int ui_end(void);
|
|
|
|
/* Error handling routines */
|
|
int ui_error( ui_error_level severity, const char *format, ... )
|
|
GCC_PRINTF( 2, 3 );
|
|
libspectrum_error ui_libspectrum_error( libspectrum_error error,
|
|
const char *format, va_list ap )
|
|
GCC_PRINTF( 2, 0 );
|
|
int ui_verror( ui_error_level severity, const char *format, va_list ap )
|
|
GCC_PRINTF( 2, 0 );
|
|
int ui_error_specific( ui_error_level severity, const char *message );
|
|
void ui_error_frame( void );
|
|
|
|
/* Callbacks used by the debugger */
|
|
int ui_debugger_activate( void );
|
|
int ui_debugger_deactivate( int interruptable );
|
|
int ui_debugger_update( void );
|
|
int ui_debugger_disassemble( libspectrum_word address );
|
|
void ui_breakpoints_updated();
|
|
|
|
/* Reset anything in the UI which needs to be reset on machine selection */
|
|
int ui_widgets_reset( void );
|
|
|
|
/* Functions defined in ../ui.c */
|
|
|
|
/* Confirm whether we want to save some data before overwriting it */
|
|
typedef enum ui_confirm_save_t {
|
|
|
|
UI_CONFIRM_SAVE_SAVE, /* Save the data */
|
|
UI_CONFIRM_SAVE_DONTSAVE, /* Don't save the data */
|
|
UI_CONFIRM_SAVE_CANCEL, /* Cancel the action */
|
|
|
|
} ui_confirm_save_t;
|
|
|
|
ui_confirm_save_t ui_confirm_save( const char *format, ... )
|
|
GCC_PRINTF( 1, 2 );
|
|
ui_confirm_save_t ui_confirm_save_specific( const char *message );
|
|
|
|
/* Confirm whether we want to change a joystick setting */
|
|
typedef enum ui_confirm_joystick_t {
|
|
|
|
UI_CONFIRM_JOYSTICK_NONE, /* Don't map joystick */
|
|
UI_CONFIRM_JOYSTICK_KEYBOARD, /* Map the joystick to the keyboard */
|
|
UI_CONFIRM_JOYSTICK_JOYSTICK_1, /* Map the joystick to joystick 1 */
|
|
UI_CONFIRM_JOYSTICK_JOYSTICK_2, /* Map the joystick to joystick 2 */
|
|
|
|
} ui_confirm_joystick_t;
|
|
|
|
ui_confirm_joystick_t
|
|
ui_confirm_joystick( libspectrum_joystick libspectrum_type, int inputs );
|
|
|
|
/* Mouse handling */
|
|
|
|
extern int ui_mouse_present, ui_mouse_grabbed;
|
|
void ui_mouse_suspend( void );
|
|
void ui_mouse_resume( void );
|
|
void ui_mouse_button( int button, int down );
|
|
void ui_mouse_motion( int dx, int dy );
|
|
int ui_mouse_grab( int startup ); /* UI: grab, return 1 if done */
|
|
int ui_mouse_release( int suspend ); /* UI: ungrab, return 0 if done */
|
|
|
|
/* Write the current tape out */
|
|
int ui_tape_write( void );
|
|
|
|
int ui_mdr_write( int which, int saveas );
|
|
|
|
/* Get a rollback point from the given list */
|
|
int ui_get_rollback_point( GSList *points );
|
|
|
|
/* Routines to (de)activate certain menu items */
|
|
|
|
typedef enum ui_menu_item {
|
|
|
|
UI_MENU_ITEM_INVALID = 0,
|
|
UI_MENU_ITEM_FILE_SVG_CAPTURE,
|
|
UI_MENU_ITEM_FILE_MOVIE_RECORDING,
|
|
UI_MENU_ITEM_FILE_MOVIE_PAUSE,
|
|
UI_MENU_ITEM_MACHINE_PROFILER,
|
|
UI_MENU_ITEM_MACHINE_MULTIFACE,
|
|
UI_MENU_ITEM_MACHINE_DIDAKTIK80_SNAP,
|
|
UI_MENU_ITEM_MEDIA_CARTRIDGE,
|
|
UI_MENU_ITEM_MEDIA_CARTRIDGE_DOCK,
|
|
UI_MENU_ITEM_MEDIA_CARTRIDGE_DOCK_EJECT,
|
|
UI_MENU_ITEM_MEDIA_IF1,
|
|
UI_MENU_ITEM_MEDIA_IF1_M1_EJECT,
|
|
UI_MENU_ITEM_MEDIA_IF1_M1_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_IF1_M2_EJECT,
|
|
UI_MENU_ITEM_MEDIA_IF1_M2_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_IF1_M3_EJECT,
|
|
UI_MENU_ITEM_MEDIA_IF1_M3_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_IF1_M4_EJECT,
|
|
UI_MENU_ITEM_MEDIA_IF1_M4_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_IF1_M5_EJECT,
|
|
UI_MENU_ITEM_MEDIA_IF1_M5_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_IF1_M6_EJECT,
|
|
UI_MENU_ITEM_MEDIA_IF1_M6_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_IF1_M7_EJECT,
|
|
UI_MENU_ITEM_MEDIA_IF1_M7_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_IF1_M8_EJECT,
|
|
UI_MENU_ITEM_MEDIA_IF1_M8_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_IF1_RS232_UNPLUG_R,
|
|
UI_MENU_ITEM_MEDIA_IF1_RS232_UNPLUG_T,
|
|
UI_MENU_ITEM_MEDIA_IF1_SNET_UNPLUG,
|
|
UI_MENU_ITEM_MEDIA_CARTRIDGE_IF2,
|
|
UI_MENU_ITEM_MEDIA_CARTRIDGE_IF2_EJECT,
|
|
UI_MENU_ITEM_MEDIA_DISK,
|
|
UI_MENU_ITEM_MEDIA_DISK_PLUS3,
|
|
UI_MENU_ITEM_MEDIA_DISK_PLUS3_A_EJECT,
|
|
UI_MENU_ITEM_MEDIA_DISK_PLUS3_A_FLIP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_PLUS3_A_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_PLUS3_B,
|
|
UI_MENU_ITEM_MEDIA_DISK_PLUS3_B_EJECT,
|
|
UI_MENU_ITEM_MEDIA_DISK_PLUS3_B_FLIP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_PLUS3_B_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_BETA,
|
|
UI_MENU_ITEM_MEDIA_DISK_BETA_A,
|
|
UI_MENU_ITEM_MEDIA_DISK_BETA_A_EJECT,
|
|
UI_MENU_ITEM_MEDIA_DISK_BETA_A_FLIP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_BETA_A_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_BETA_B,
|
|
UI_MENU_ITEM_MEDIA_DISK_BETA_B_EJECT,
|
|
UI_MENU_ITEM_MEDIA_DISK_BETA_B_FLIP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_BETA_B_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_BETA_C,
|
|
UI_MENU_ITEM_MEDIA_DISK_BETA_C_EJECT,
|
|
UI_MENU_ITEM_MEDIA_DISK_BETA_C_FLIP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_BETA_C_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_BETA_D,
|
|
UI_MENU_ITEM_MEDIA_DISK_BETA_D_EJECT,
|
|
UI_MENU_ITEM_MEDIA_DISK_BETA_D_FLIP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_BETA_D_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_PLUSD,
|
|
UI_MENU_ITEM_MEDIA_DISK_PLUSD_1,
|
|
UI_MENU_ITEM_MEDIA_DISK_PLUSD_1_EJECT,
|
|
UI_MENU_ITEM_MEDIA_DISK_PLUSD_1_FLIP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_PLUSD_1_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_PLUSD_2,
|
|
UI_MENU_ITEM_MEDIA_DISK_PLUSD_2_EJECT,
|
|
UI_MENU_ITEM_MEDIA_DISK_PLUSD_2_FLIP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_PLUSD_2_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_DIDAKTIK,
|
|
UI_MENU_ITEM_MEDIA_DISK_DIDAKTIK_A,
|
|
UI_MENU_ITEM_MEDIA_DISK_DIDAKTIK_A_EJECT,
|
|
UI_MENU_ITEM_MEDIA_DISK_DIDAKTIK_A_FLIP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_DIDAKTIK_A_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_DIDAKTIK_B,
|
|
UI_MENU_ITEM_MEDIA_DISK_DIDAKTIK_B_EJECT,
|
|
UI_MENU_ITEM_MEDIA_DISK_DIDAKTIK_B_FLIP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_DIDAKTIK_B_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_DISCIPLE,
|
|
UI_MENU_ITEM_MEDIA_DISK_DISCIPLE_1,
|
|
UI_MENU_ITEM_MEDIA_DISK_DISCIPLE_1_EJECT,
|
|
UI_MENU_ITEM_MEDIA_DISK_DISCIPLE_1_FLIP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_DISCIPLE_1_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_DISCIPLE_2,
|
|
UI_MENU_ITEM_MEDIA_DISK_DISCIPLE_2_EJECT,
|
|
UI_MENU_ITEM_MEDIA_DISK_DISCIPLE_2_FLIP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_DISCIPLE_2_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_OPUS,
|
|
UI_MENU_ITEM_MEDIA_DISK_OPUS_1,
|
|
UI_MENU_ITEM_MEDIA_DISK_OPUS_1_EJECT,
|
|
UI_MENU_ITEM_MEDIA_DISK_OPUS_1_FLIP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_OPUS_1_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_OPUS_2,
|
|
UI_MENU_ITEM_MEDIA_DISK_OPUS_2_EJECT,
|
|
UI_MENU_ITEM_MEDIA_DISK_OPUS_2_FLIP_SET,
|
|
UI_MENU_ITEM_MEDIA_DISK_OPUS_2_WP_SET,
|
|
UI_MENU_ITEM_MEDIA_IDE,
|
|
UI_MENU_ITEM_MEDIA_IDE_SIMPLE8BIT,
|
|
UI_MENU_ITEM_MEDIA_IDE_SIMPLE8BIT_MASTER_EJECT,
|
|
UI_MENU_ITEM_MEDIA_IDE_SIMPLE8BIT_SLAVE_EJECT,
|
|
UI_MENU_ITEM_MEDIA_IDE_ZXATASP,
|
|
UI_MENU_ITEM_MEDIA_IDE_ZXATASP_MASTER_EJECT,
|
|
UI_MENU_ITEM_MEDIA_IDE_ZXATASP_SLAVE_EJECT,
|
|
UI_MENU_ITEM_MEDIA_IDE_ZXCF,
|
|
UI_MENU_ITEM_MEDIA_IDE_ZXCF_EJECT,
|
|
UI_MENU_ITEM_MEDIA_IDE_DIVIDE,
|
|
UI_MENU_ITEM_MEDIA_IDE_DIVIDE_MASTER_EJECT,
|
|
UI_MENU_ITEM_MEDIA_IDE_DIVIDE_SLAVE_EJECT,
|
|
UI_MENU_ITEM_MEDIA_IDE_DIVMMC,
|
|
UI_MENU_ITEM_MEDIA_IDE_DIVMMC_EJECT,
|
|
UI_MENU_ITEM_MEDIA_IDE_ZXMMC,
|
|
UI_MENU_ITEM_MEDIA_IDE_ZXMMC_EJECT,
|
|
UI_MENU_ITEM_RECORDING,
|
|
UI_MENU_ITEM_RECORDING_ROLLBACK,
|
|
UI_MENU_ITEM_AY_LOGGING,
|
|
UI_MENU_ITEM_TAPE_RECORDING,
|
|
|
|
} ui_menu_item;
|
|
|
|
int ui_menu_activate( ui_menu_item item, int active );
|
|
int ui_menu_item_set_active( const char *path, int active );
|
|
|
|
void ui_menu_disk_update( void );
|
|
|
|
/* Functions to update the statusbar */
|
|
|
|
typedef enum ui_statusbar_item {
|
|
|
|
UI_STATUSBAR_ITEM_DISK,
|
|
UI_STATUSBAR_ITEM_MICRODRIVE,
|
|
UI_STATUSBAR_ITEM_MOUSE,
|
|
UI_STATUSBAR_ITEM_PAUSED,
|
|
UI_STATUSBAR_ITEM_TAPE,
|
|
|
|
} ui_statusbar_item;
|
|
|
|
typedef enum ui_statusbar_state {
|
|
|
|
UI_STATUSBAR_STATE_NOT_AVAILABLE,
|
|
UI_STATUSBAR_STATE_INACTIVE,
|
|
UI_STATUSBAR_STATE_ACTIVE,
|
|
|
|
} ui_statusbar_state;
|
|
|
|
int ui_statusbar_update( ui_statusbar_item item, ui_statusbar_state state );
|
|
int ui_statusbar_update_speed( float speed );
|
|
|
|
typedef enum ui_tape_browser_update_type {
|
|
|
|
UI_TAPE_BROWSER_NEW_TAPE, /* Whole tape image has changed
|
|
implies modified reset */
|
|
UI_TAPE_BROWSER_SELECT_BLOCK, /* Tape block selected has changed */
|
|
UI_TAPE_BROWSER_NEW_BLOCK, /* A new block has been appended,
|
|
implies modified set */
|
|
UI_TAPE_BROWSER_MODIFIED, /* Tape modified status has changed */
|
|
|
|
} ui_tape_browser_update_type;
|
|
|
|
/* Cause the tape browser to be updated */
|
|
int ui_tape_browser_update( ui_tape_browser_update_type change,
|
|
libspectrum_tape_block *block );
|
|
|
|
char *ui_get_open_filename( const char *title );
|
|
char *ui_get_save_filename( const char *title );
|
|
int ui_query( const char *message );
|
|
|
|
#ifdef USE_WIDGET
|
|
#include "ui/widget/widget.h"
|
|
#define ui_widget_finish() widget_finish()
|
|
#else /* #ifdef USE_WIDGET */
|
|
#define ui_widget_finish()
|
|
#endif /* #ifdef USE_WIDGET */
|
|
|
|
/* Code called at start and end of emulation if widget system is used */
|
|
int ui_widget_init( void );
|
|
int ui_widget_end( void );
|
|
|
|
/* How many levels deep have we recursed through widgets; -1 => none */
|
|
extern int ui_widget_level;
|
|
|
|
/* widget system popup the apropriate menu */
|
|
void ui_popup_menu( int native_key );
|
|
|
|
void ui_widget_keyhandler( int native_key );
|
|
|
|
void ui_pokemem_selector( const char *filename );
|
|
|
|
#endif /* #ifndef FUSE_UI_H */
|