#ifndef types_h #define types_h #include "SDL.h" #include "shader.h" #define tileset_buffer_length 256 * 192 * 4 #define tilemap_buffer_length 256 * 256 * 4 typedef struct{ int16_t x, y; uint16_t w, h; } Rect; typedef struct GuiData { struct CliOptionData { gchar *config_path; gchar *boot_rom_path; gboolean fullscreen; GB_model_t model; gboolean force_software_renderer; } cli_options; GFile *file; gint sample_rate; GDateTime *config_modification_date; char *battery_save_path; char *cheats_save_path; GB_model_t prev_model; const GThread *main_thread; volatile bool running; volatile bool stopping; volatile bool stopped; // GTK pointers GtkApplication *main_application; GtkBuilder *builder; GtkApplicationWindow *main_window; GtkBox *main_window_container; GtkGLArea *gl_area; GtkDrawingArea *fallback_canvas; GtkWindow *preferences; GtkWindow *vram_viewer; GtkWindow *memory_viewer; GtkWindow *console; GtkWindow *printer; // Debugger state GtkTextBuffer *pending_console_output; gboolean in_sync_input; gchar *last_console_input; gboolean log_to_sidebar; gboolean should_clear_sidebar; GMutex debugger_input_mutex; GCond debugger_input_cond; GRecMutex console_output_lock; GPtrArray *debugger_input_queue; bool vram_viewer_visible; bool vram_viewer_updating; gchar *vram_viewer_active_tab; gboolean vram_viewer_is_cgb; uint8_t vram_viewer_palette_data[16][0x40]; GB_oam_info_t oam_info[40]; uint16_t oam_count; uint8_t oam_height; uint32_t tileset_buffer[tileset_buffer_length]; uint32_t tilemap_buffer[tilemap_buffer_length]; GMutex tileset_buffer_mutex; GMutex tilemap_buffer_mutex; Rect scroll_rect; // Audio and video bool audio_initialized; uint32_t *image_buffers[3]; unsigned char current_buffer; Rect viewport; bool border_mode_changed; bool is_fullscreen; bool supports_gl; shader_t shader; unsigned last_screen_width; unsigned last_screen_height; // Fast forward / slow motion bool underclock_down; bool rewind_down; bool do_rewind; bool rewind_paused; bool turbo_down; double clock_mutliplier; double analog_clock_multiplier; bool analog_clock_multiplier_valid; // Input uint8_t pressed_buttons; struct Controller_t { SDL_GameController *controller; SDL_Haptic *haptic; bool ignore_rumble; } *controllers; unsigned controller_count; struct Controller_t *last_used_controller; // Used for rumble } GuiData; typedef enum { INPUT_UP, INPUT_DOWN, INPUT_LEFT, INPUT_RIGHT, INPUT_A, INPUT_B, INPUT_START, INPUT_SELECT, INPUT_TURBO, INPUT_REWIND, INPUT_SLOWDOWN, INPUT_FULLSCREEN, } input_names_t; static unsigned key_map[] = { [INPUT_UP] = GDK_KEY_w, [INPUT_LEFT] = GDK_KEY_a, [INPUT_DOWN] = GDK_KEY_s, [INPUT_RIGHT] = GDK_KEY_d, [INPUT_A] = GDK_KEY_l, [INPUT_B] = GDK_KEY_k, [INPUT_START] = GDK_KEY_h, [INPUT_SELECT] = GDK_KEY_g, [INPUT_TURBO] = GDK_KEY_space, [INPUT_REWIND] = GDK_KEY_Tab, [INPUT_SLOWDOWN] = GDK_KEY_Shift_L, [INPUT_FULLSCREEN] = GDK_KEY_F11, }; #endif