nkeynes@435: /** nkeynes@450: * $Id: gtkcb.c,v 1.4 2007-10-17 11:26:45 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@435: nkeynes@435: typedef gboolean (*file_callback_t)( const gchar *filename ); nkeynes@435: nkeynes@435: static gboolean dreamcast_paused = FALSE; nkeynes@435: nkeynes@435: void dreamcast_pause() nkeynes@435: { nkeynes@435: if( dreamcast_is_running() ) { nkeynes@435: dreamcast_paused = TRUE; nkeynes@435: dreamcast_stop(); nkeynes@435: } nkeynes@435: } nkeynes@435: nkeynes@435: void dreamcast_unpause() nkeynes@435: { nkeynes@435: if( dreamcast_paused ) { nkeynes@435: dreamcast_paused = FALSE; nkeynes@435: if( !dreamcast_is_running() ) { nkeynes@435: dreamcast_run(); nkeynes@435: } nkeynes@435: } nkeynes@435: } nkeynes@435: nkeynes@435: nkeynes@435: void open_file_callback(GtkWidget *btn, gint result, gpointer user_data) { nkeynes@435: GtkFileChooser *file = GTK_FILE_CHOOSER(user_data); nkeynes@435: if( result == GTK_RESPONSE_ACCEPT ) { nkeynes@435: gchar *filename =gtk_file_chooser_get_filename( nkeynes@435: GTK_FILE_CHOOSER(file) ); nkeynes@435: file_callback_t action = (file_callback_t)gtk_object_get_data( GTK_OBJECT(file), "file_action" ); nkeynes@435: gtk_widget_destroy(GTK_WIDGET(file)); nkeynes@435: action( filename ); nkeynes@435: g_free(filename); nkeynes@435: } else { nkeynes@435: gtk_widget_destroy(GTK_WIDGET(file)); nkeynes@435: } nkeynes@435: dreamcast_unpause(); 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: dreamcast_pause(); 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: g_signal_connect( GTK_OBJECT(file), "response", nkeynes@435: GTK_SIGNAL_FUNC(open_file_callback), file ); nkeynes@435: gtk_object_set_data( GTK_OBJECT(file), "file_action", action ); 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@435: gtk_widget_show( 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: dreamcast_pause(); 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: g_signal_connect( GTK_OBJECT(file), "response", nkeynes@435: GTK_SIGNAL_FUNC(open_file_callback), file ); nkeynes@435: gtk_object_set_data( GTK_OBJECT(file), "file_action", action ); 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@435: gtk_widget_show( 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@435: void load_state_action_callback( GtkAction *action, gpointer user_data) nkeynes@435: { nkeynes@450: const gchar *dir = lxdream_get_config_value(CONFIG_SAVE_PATH); nkeynes@435: open_file_dialog( "Load state...", dreamcast_load_state, "*.dst", "lxDream Save State (*.dst)", dir ); nkeynes@435: } 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@437: void debugger_action_callback( GtkAction *action, gpointer user_data) nkeynes@437: { nkeynes@437: gtk_gui_show_debugger(); nkeynes@437: } 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@435: void controller_settings_callback( GtkAction *action, gpointer user_data) nkeynes@435: { nkeynes@450: controller_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: }