nkeynes@435: /** nkeynes@480: * $Id: gtkcb.c,v 1.7 2007-10-31 11:53:35 nkeynes Exp $ nkeynes@435: * nkeynes@435: * Action callbacks from the main window nkeynes@435: * nkeynes@435: * Copyright (c) 2005 Nathan Keynes. nkeynes@435: * nkeynes@435: * This program is free software; you can redistribute it and/or modify nkeynes@435: * it under the terms of the GNU General Public License as published by nkeynes@435: * the Free Software Foundation; either version 2 of the License, or nkeynes@435: * (at your option) any later version. nkeynes@435: * nkeynes@435: * This program is distributed in the hope that it will be useful, nkeynes@435: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@435: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@435: * GNU General Public License for more details. nkeynes@435: */ nkeynes@435: nkeynes@435: #include "dream.h" nkeynes@450: #include "config.h" nkeynes@435: #include "dreamcast.h" nkeynes@435: #include "gdrom/gdrom.h" nkeynes@435: #include "gui/gtkui.h" nkeynes@455: #include "pvr2/pvr2.h" nkeynes@435: nkeynes@435: nkeynes@435: nkeynes@435: static void add_file_pattern( GtkFileChooser *chooser, char *pattern, char *patname ) nkeynes@435: { nkeynes@435: if( pattern != NULL ) { nkeynes@435: GtkFileFilter *filter = gtk_file_filter_new(); nkeynes@435: gtk_file_filter_add_pattern( filter, pattern ); nkeynes@435: gtk_file_filter_set_name( filter, patname ); nkeynes@435: gtk_file_chooser_add_filter( chooser, filter ); nkeynes@435: filter = gtk_file_filter_new(); nkeynes@435: gtk_file_filter_set_name( filter, "All files" ); nkeynes@435: gtk_file_filter_add_pattern( filter, "*" ); nkeynes@435: gtk_file_chooser_add_filter( chooser, filter ); nkeynes@435: } nkeynes@435: } nkeynes@435: nkeynes@435: void open_file_dialog( char *title, file_callback_t action, char *pattern, char *patname, nkeynes@435: gchar const *initial_dir ) nkeynes@435: { nkeynes@435: GtkWidget *file; nkeynes@435: file = gtk_file_chooser_dialog_new( title, NULL, nkeynes@435: GTK_FILE_CHOOSER_ACTION_OPEN, nkeynes@435: GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, nkeynes@435: GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nkeynes@435: NULL ); nkeynes@435: add_file_pattern( GTK_FILE_CHOOSER(file), pattern, patname ); nkeynes@435: gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(file), initial_dir ); nkeynes@435: gtk_window_set_modal( GTK_WINDOW(file), TRUE ); nkeynes@477: gtk_dialog_set_default_response( GTK_DIALOG(file), GTK_RESPONSE_ACCEPT ); nkeynes@477: int result = gtk_dialog_run( GTK_DIALOG(file) ); nkeynes@477: if( result == GTK_RESPONSE_ACCEPT ) { nkeynes@477: gchar *filename = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER(file) ); nkeynes@477: action( filename ); nkeynes@477: } nkeynes@477: gtk_widget_destroy(file); nkeynes@435: } nkeynes@435: nkeynes@435: void save_file_dialog( char *title, file_callback_t action, char *pattern, char *patname, nkeynes@435: gchar const *initial_dir ) nkeynes@435: { nkeynes@435: GtkWidget *file; nkeynes@435: file = gtk_file_chooser_dialog_new( title, NULL, nkeynes@435: GTK_FILE_CHOOSER_ACTION_SAVE, nkeynes@435: GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, nkeynes@435: GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, nkeynes@435: NULL ); nkeynes@435: add_file_pattern( GTK_FILE_CHOOSER(file), pattern, patname ); nkeynes@435: gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(file), initial_dir ); nkeynes@435: gtk_window_set_modal( GTK_WINDOW(file), TRUE ); nkeynes@477: gtk_dialog_set_default_response( GTK_DIALOG(file), GTK_RESPONSE_ACCEPT ); nkeynes@477: int result = gtk_dialog_run( GTK_DIALOG(file) ); nkeynes@477: if( result == GTK_RESPONSE_ACCEPT ) { nkeynes@477: gchar *filename = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER(file) ); nkeynes@477: action( filename ); nkeynes@477: } nkeynes@477: gtk_widget_destroy(file); nkeynes@435: } nkeynes@435: nkeynes@435: void mount_action_callback( GtkAction *action, gpointer user_data) nkeynes@435: { nkeynes@450: const gchar *dir = lxdream_get_config_value(CONFIG_DEFAULT_PATH); nkeynes@435: open_file_dialog( "Open...", gdrom_mount_image, NULL, NULL, dir ); nkeynes@435: } nkeynes@435: void reset_action_callback( GtkAction *action, gpointer user_data) nkeynes@435: { nkeynes@435: dreamcast_reset(); nkeynes@435: } nkeynes@435: nkeynes@435: void pause_action_callback( GtkAction *action, gpointer user_data) nkeynes@435: { nkeynes@435: dreamcast_stop(); nkeynes@435: } nkeynes@435: nkeynes@435: void resume_action_callback( GtkAction *action, gpointer user_data) nkeynes@435: { nkeynes@435: dreamcast_run(); nkeynes@435: } nkeynes@435: nkeynes@477: void load_state_preview_callback( GtkFileChooser *chooser, gpointer user_data ) nkeynes@477: { nkeynes@477: GtkWidget *preview = GTK_WIDGET(user_data); nkeynes@477: gchar *filename = gtk_file_chooser_get_preview_filename(chooser); nkeynes@477: nkeynes@477: frame_buffer_t data = dreamcast_load_preview(filename); nkeynes@477: if( data != NULL ) { nkeynes@477: GdkPixbuf *pixbuf = gdk_pixbuf_new_from_frame_buffer(data); nkeynes@477: GdkPixbuf *scaled = gdk_pixbuf_scale_simple(pixbuf, 320, 240, nkeynes@477: GDK_INTERP_BILINEAR); nkeynes@477: g_object_unref(pixbuf); nkeynes@477: gtk_image_set_from_pixbuf( GTK_IMAGE(preview), scaled ); nkeynes@477: g_object_unref(scaled); nkeynes@477: gtk_widget_show(preview); nkeynes@477: } else { nkeynes@477: gtk_widget_hide(preview); nkeynes@477: } nkeynes@477: } nkeynes@477: nkeynes@435: void load_state_action_callback( GtkAction *action, gpointer user_data) nkeynes@435: { nkeynes@477: GtkWidget *file, *preview, *frame, *align; nkeynes@477: GtkRequisition size; nkeynes@450: const gchar *dir = lxdream_get_config_value(CONFIG_SAVE_PATH); nkeynes@477: file = gtk_file_chooser_dialog_new( "Load state...", NULL, nkeynes@477: GTK_FILE_CHOOSER_ACTION_OPEN, nkeynes@477: GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, nkeynes@477: GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nkeynes@477: NULL ); nkeynes@477: add_file_pattern( GTK_FILE_CHOOSER(file), "*.dst", "lxDream Save State (*.dst)" ); nkeynes@477: gtk_object_set_data( GTK_OBJECT(file), "file_action", action ); nkeynes@477: nkeynes@477: preview = gtk_image_new( ); nkeynes@477: nkeynes@477: frame = gtk_frame_new(NULL); nkeynes@477: gtk_frame_set_shadow_type( GTK_FRAME(frame), GTK_SHADOW_IN ); nkeynes@477: gtk_container_add( GTK_CONTAINER(frame), preview ); nkeynes@477: gtk_widget_show(frame); nkeynes@477: gtk_widget_size_request(frame, &size); nkeynes@477: gtk_widget_set_size_request(frame, size.width + 320, size.height + 240); nkeynes@477: align = gtk_alignment_new(0.5, 0.5, 0, 0 ); nkeynes@477: gtk_container_add( GTK_CONTAINER(align), frame ); nkeynes@477: gtk_widget_show( align ); nkeynes@477: gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(file), align); nkeynes@477: g_signal_connect( file, "update-preview", G_CALLBACK(load_state_preview_callback), nkeynes@477: preview ); nkeynes@477: gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(file), dir ); nkeynes@477: gtk_window_set_modal( GTK_WINDOW(file), TRUE ); nkeynes@477: int result = gtk_dialog_run( GTK_DIALOG(file) ); nkeynes@477: if( result == GTK_RESPONSE_ACCEPT ) { nkeynes@477: gchar *filename = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER(file) ); nkeynes@477: dreamcast_load_state( filename ); nkeynes@477: } nkeynes@477: gtk_widget_destroy(file); nkeynes@435: } nkeynes@477: nkeynes@435: void save_state_action_callback( GtkAction *action, gpointer user_data) nkeynes@435: { nkeynes@450: const gchar *dir = lxdream_get_config_value(CONFIG_SAVE_PATH); nkeynes@435: save_file_dialog( "Save state...", dreamcast_save_state, "*.dst", "lxDream Save State (*.dst)", dir ); nkeynes@435: } nkeynes@435: void about_action_callback( GtkAction *action, gpointer user_data) nkeynes@435: { nkeynes@435: nkeynes@435: GtkWidget *dialog = g_object_new (GTK_TYPE_ABOUT_DIALOG, nkeynes@435: "name", APP_NAME, nkeynes@435: "version", APP_VERSION, nkeynes@435: "copyright", "(C) 2003-2007 Nathan Keynes", nkeynes@435: NULL); nkeynes@435: gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); nkeynes@447: gtk_dialog_run(GTK_DIALOG(dialog)); nkeynes@447: gtk_widget_destroy(dialog); nkeynes@435: nkeynes@435: } nkeynes@435: nkeynes@435: void exit_action_callback( GtkAction *action, gpointer user_data) nkeynes@435: { nkeynes@435: exit(0); nkeynes@435: } nkeynes@435: nkeynes@447: void path_settings_callback( GtkAction *action, gpointer user_data) nkeynes@447: { nkeynes@450: path_dialog_run(); nkeynes@447: } nkeynes@447: nkeynes@435: void audio_settings_callback( GtkAction *action, gpointer user_data) nkeynes@435: { nkeynes@435: } nkeynes@435: nkeynes@455: void maple_settings_callback( GtkAction *action, gpointer user_data) nkeynes@435: { nkeynes@455: maple_dialog_run( ); nkeynes@435: } nkeynes@435: nkeynes@435: void network_settings_callback( GtkAction *action, gpointer user_data) nkeynes@435: { nkeynes@435: } nkeynes@435: nkeynes@435: void video_settings_callback( GtkAction *action, gpointer user_data) nkeynes@435: { nkeynes@435: } nkeynes@435: nkeynes@435: void fullscreen_toggle_callback( GtkToggleAction *action, gpointer user_data) nkeynes@435: { nkeynes@435: } nkeynes@455: nkeynes@455: void debugger_action_callback( GtkAction *action, gpointer user_data) nkeynes@455: { nkeynes@455: gtk_gui_show_debugger(); nkeynes@455: } nkeynes@455: nkeynes@455: void debug_memory_action_callback( GtkAction *action, gpointer user_data) nkeynes@455: { nkeynes@455: dump_window_new( APP_NAME " " APP_VERSION " :: Memory dump" ); nkeynes@455: } nkeynes@455: nkeynes@455: void debug_mmio_action_callback( GtkAction *action, gpointer user_data) nkeynes@455: { nkeynes@455: gtk_gui_show_mmio(); nkeynes@455: } nkeynes@455: nkeynes@455: void save_scene_action_callback( GtkAction *action, gpointer user_data) nkeynes@455: { nkeynes@455: const gchar *dir = lxdream_get_config_value(CONFIG_SAVE_PATH); nkeynes@455: save_file_dialog( "Save next scene...", pvr2_save_next_scene, "*.dsc", "lxdream scene file (*.dsc)", dir ); nkeynes@455: } nkeynes@455: nkeynes@480: int debug_window_get_selected_row( debug_window_t data ); nkeynes@480: nkeynes@455: void debug_step_action_callback( GtkAction *action, gpointer user_data) nkeynes@455: { nkeynes@455: debug_window_single_step(gtk_gui_get_debugger()); nkeynes@455: } nkeynes@455: nkeynes@455: void debug_runto_action_callback( GtkAction *action, gpointer user_data) nkeynes@455: { nkeynes@455: debug_window_t debug = gtk_gui_get_debugger(); nkeynes@455: int selected_row = debug_window_get_selected_row(debug); nkeynes@455: if( selected_row == -1 ) { nkeynes@455: WARN( "No address selected, so can't run to it", NULL ); nkeynes@455: } else { nkeynes@455: debug_window_set_oneshot_breakpoint( debug, selected_row ); nkeynes@455: dreamcast_run(); nkeynes@455: } nkeynes@455: } nkeynes@455: nkeynes@455: void debug_breakpoint_action_callback( GtkAction *action, gpointer user_data) nkeynes@455: { nkeynes@455: debug_window_t debug = gtk_gui_get_debugger(); nkeynes@455: int selected_row = debug_window_get_selected_row(debug); nkeynes@455: if( selected_row != -1 ) { nkeynes@455: debug_window_toggle_breakpoint( debug, selected_row ); nkeynes@455: } nkeynes@455: }