Search
lxdream.org :: lxdream/src/gui/gtkcb.c
lxdream 0.9.1
released Jun 29
Download Now
filename src/gui/gtkcb.c
changeset 477:9a373f2ff009
prev455:3080881d00d4
next480:d28c2992f5ee
author nkeynes
date Wed Oct 31 09:10:23 2007 +0000 (16 years ago)
permissions -rw-r--r--
last change Add save/restore of render buffers in save states
Gzip memory blocks in save states
Move front-buffer management back to pvr2
Add screenshot preview when loading save states
Various minor fixes and cleanups
view annotate diff log raw
     1 /**
     2  * $Id: gtkcb.c,v 1.6 2007-10-31 09:10:23 nkeynes Exp $
     3  *
     4  * Action callbacks from the main window
     5  *
     6  * Copyright (c) 2005 Nathan Keynes.
     7  *
     8  * This program is free software; you can redistribute it and/or modify
     9  * it under the terms of the GNU General Public License as published by
    10  * the Free Software Foundation; either version 2 of the License, or
    11  * (at your option) any later version.
    12  *
    13  * This program is distributed in the hope that it will be useful,
    14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    16  * GNU General Public License for more details.
    17  */
    19 #include "dream.h"
    20 #include "config.h"
    21 #include "dreamcast.h"
    22 #include "gdrom/gdrom.h"
    23 #include "gui/gtkui.h"
    24 #include "pvr2/pvr2.h"
    26 typedef gboolean (*file_callback_t)( const gchar *filename );
    28 static gboolean dreamcast_paused = FALSE;
    30 void dreamcast_pause()
    31 {
    32     if( dreamcast_is_running() ) {
    33 	dreamcast_paused = TRUE;
    34 	dreamcast_stop();
    35     }
    36 }
    38 void dreamcast_unpause()
    39 {
    40     if( dreamcast_paused ) {
    41 	dreamcast_paused = FALSE;
    42 	if( !dreamcast_is_running() ) {
    43 	    dreamcast_run();
    44 	}
    45     }
    46 }
    49 static void add_file_pattern( GtkFileChooser *chooser, char *pattern, char *patname )
    50 {
    51     if( pattern != NULL ) {
    52 	GtkFileFilter *filter = gtk_file_filter_new();
    53 	gtk_file_filter_add_pattern( filter, pattern );
    54 	gtk_file_filter_set_name( filter, patname );
    55 	gtk_file_chooser_add_filter( chooser, filter );
    56 	filter = gtk_file_filter_new();
    57 	gtk_file_filter_set_name( filter, "All files" );
    58 	gtk_file_filter_add_pattern( filter, "*" );
    59 	gtk_file_chooser_add_filter( chooser, filter );
    60     }
    61 }
    63 void open_file_dialog( char *title, file_callback_t action, char *pattern, char *patname,
    64 		       gchar const *initial_dir )
    65 {
    66     GtkWidget *file;
    67     file = gtk_file_chooser_dialog_new( title, NULL,
    68 					GTK_FILE_CHOOSER_ACTION_OPEN,
    69 					GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
    70 					GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
    71 					NULL );
    72     add_file_pattern( GTK_FILE_CHOOSER(file), pattern, patname );
    73     gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(file), initial_dir );
    74     gtk_window_set_modal( GTK_WINDOW(file), TRUE );
    75     gtk_dialog_set_default_response( GTK_DIALOG(file), GTK_RESPONSE_ACCEPT );
    76     int result = gtk_dialog_run( GTK_DIALOG(file) );
    77     if( result == GTK_RESPONSE_ACCEPT ) {
    78 	gchar *filename = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER(file) );
    79 	action( filename );
    80     }
    81     gtk_widget_destroy(file);
    82 }
    84 void save_file_dialog( char *title, file_callback_t action, char *pattern, char *patname,
    85 		       gchar const *initial_dir )
    86 {
    87     GtkWidget *file;
    88     file = gtk_file_chooser_dialog_new( title, NULL,
    89 					GTK_FILE_CHOOSER_ACTION_SAVE,
    90 					GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
    91 					GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
    92 					NULL );
    93     add_file_pattern( GTK_FILE_CHOOSER(file), pattern, patname );
    94     gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(file), initial_dir );
    95     gtk_window_set_modal( GTK_WINDOW(file), TRUE );
    96     gtk_dialog_set_default_response( GTK_DIALOG(file), GTK_RESPONSE_ACCEPT );
    97     int result = gtk_dialog_run( GTK_DIALOG(file) );
    98     if( result == GTK_RESPONSE_ACCEPT ) {
    99 	gchar *filename = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER(file) );
   100 	action( filename );
   101     }
   102     gtk_widget_destroy(file);
   103 }
   105 void mount_action_callback( GtkAction *action, gpointer user_data)
   106 {
   107     const gchar *dir = lxdream_get_config_value(CONFIG_DEFAULT_PATH);
   108     open_file_dialog( "Open...", gdrom_mount_image, NULL, NULL, dir );
   109 }
   110 void reset_action_callback( GtkAction *action, gpointer user_data)
   111 {
   112     dreamcast_reset();
   113 }
   115 void pause_action_callback( GtkAction *action, gpointer user_data)
   116 {
   117     dreamcast_stop();
   118 }
   120 void resume_action_callback( GtkAction *action, gpointer user_data)
   121 {
   122     dreamcast_run();
   123 }
   125 void load_state_preview_callback( GtkFileChooser *chooser, gpointer user_data )
   126 {
   127     GtkWidget *preview = GTK_WIDGET(user_data);
   128     gchar *filename = gtk_file_chooser_get_preview_filename(chooser);
   130     frame_buffer_t data = dreamcast_load_preview(filename);
   131     if( data != NULL ) {
   132 	GdkPixbuf *pixbuf = gdk_pixbuf_new_from_frame_buffer(data);
   133 	GdkPixbuf *scaled = gdk_pixbuf_scale_simple(pixbuf, 320, 240,
   134 						    GDK_INTERP_BILINEAR);
   135 	g_object_unref(pixbuf);
   136 	gtk_image_set_from_pixbuf( GTK_IMAGE(preview), scaled );
   137 	g_object_unref(scaled);
   138 	gtk_widget_show(preview);
   139     } else {
   140 	gtk_widget_hide(preview);
   141     }
   142 }
   144 void load_state_action_callback( GtkAction *action, gpointer user_data)
   145 {
   146     GtkWidget *file, *preview, *frame, *align;
   147     GtkRequisition size;
   148     const gchar *dir = lxdream_get_config_value(CONFIG_SAVE_PATH);
   149     file = gtk_file_chooser_dialog_new( "Load state...", NULL,
   150 					GTK_FILE_CHOOSER_ACTION_OPEN,
   151 					GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
   152 					GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
   153 					NULL );
   154     add_file_pattern( GTK_FILE_CHOOSER(file), "*.dst", "lxDream Save State (*.dst)" );
   155     gtk_object_set_data( GTK_OBJECT(file), "file_action", action );
   157     preview = gtk_image_new( );
   159     frame = gtk_frame_new(NULL);
   160     gtk_frame_set_shadow_type( GTK_FRAME(frame), GTK_SHADOW_IN );
   161     gtk_container_add( GTK_CONTAINER(frame), preview );
   162     gtk_widget_show(frame);
   163     gtk_widget_size_request(frame, &size);
   164     gtk_widget_set_size_request(frame, size.width + 320, size.height + 240);
   165     align = gtk_alignment_new(0.5, 0.5, 0, 0 );
   166     gtk_container_add( GTK_CONTAINER(align), frame );
   167     gtk_widget_show( align );
   168     gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(file), align);
   169     g_signal_connect( file, "update-preview", G_CALLBACK(load_state_preview_callback),
   170 		      preview );
   171     gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(file), dir );
   172     gtk_window_set_modal( GTK_WINDOW(file), TRUE );
   173     int result = gtk_dialog_run( GTK_DIALOG(file) );
   174     if( result == GTK_RESPONSE_ACCEPT ) {
   175 	gchar *filename = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER(file) );
   176 	dreamcast_load_state( filename );
   177     }
   178     gtk_widget_destroy(file);
   179 }
   181 void save_state_action_callback( GtkAction *action, gpointer user_data)
   182 {
   183     const gchar *dir = lxdream_get_config_value(CONFIG_SAVE_PATH);
   184     save_file_dialog( "Save state...", dreamcast_save_state, "*.dst", "lxDream Save State (*.dst)", dir );
   185 }
   186 void about_action_callback( GtkAction *action, gpointer user_data)
   187 {
   189     GtkWidget *dialog = g_object_new (GTK_TYPE_ABOUT_DIALOG,
   190 				      "name", APP_NAME, 
   191                                      "version", APP_VERSION,
   192 			             "copyright", "(C) 2003-2007 Nathan Keynes",
   193                                      NULL);
   194     gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
   195     gtk_dialog_run(GTK_DIALOG(dialog));
   196     gtk_widget_destroy(dialog);
   198 }
   200 void exit_action_callback( GtkAction *action, gpointer user_data)
   201 {
   202     exit(0);
   203 }
   205 void path_settings_callback( GtkAction *action, gpointer user_data)
   206 {
   207     path_dialog_run();
   208 }
   210 void audio_settings_callback( GtkAction *action, gpointer user_data)
   211 {
   212 }
   214 void maple_settings_callback( GtkAction *action, gpointer user_data)
   215 {
   216     maple_dialog_run( );
   217 }
   219 void network_settings_callback( GtkAction *action, gpointer user_data)
   220 {
   221 }
   223 void video_settings_callback( GtkAction *action, gpointer user_data)
   224 {
   225 }
   227 void fullscreen_toggle_callback( GtkToggleAction *action, gpointer user_data)
   228 {
   229 }
   231 void debugger_action_callback( GtkAction *action, gpointer user_data)
   232 {
   233     gtk_gui_show_debugger();
   234 }
   236 void debug_memory_action_callback( GtkAction *action, gpointer user_data)
   237 {
   238     dump_window_new( APP_NAME " " APP_VERSION " :: Memory dump" );
   239 }
   241 void debug_mmio_action_callback( GtkAction *action, gpointer user_data)
   242 {
   243     gtk_gui_show_mmio();
   244 }
   246 void save_scene_action_callback( GtkAction *action, gpointer user_data)
   247 {
   248     const gchar *dir = lxdream_get_config_value(CONFIG_SAVE_PATH);
   249     save_file_dialog( "Save next scene...", pvr2_save_next_scene, "*.dsc", "lxdream scene file (*.dsc)", dir );
   250 }
   252 void debug_step_action_callback( GtkAction *action, gpointer user_data)
   253 {
   254     debug_window_single_step(gtk_gui_get_debugger());
   255 }
   257 void debug_runto_action_callback( GtkAction *action, gpointer user_data)
   258 {
   259     debug_window_t debug = gtk_gui_get_debugger();
   260     int selected_row = debug_window_get_selected_row(debug);
   261     if( selected_row == -1 ) {
   262         WARN( "No address selected, so can't run to it", NULL );
   263     } else {
   264 	debug_window_set_oneshot_breakpoint( debug, selected_row );
   265 	dreamcast_run();
   266     }
   267 }
   269 void debug_breakpoint_action_callback( GtkAction *action, gpointer user_data)
   270 {
   271     debug_window_t debug = gtk_gui_get_debugger();
   272     int selected_row = debug_window_get_selected_row(debug);
   273     if( selected_row != -1 ) {
   274 	debug_window_toggle_breakpoint( debug, selected_row );
   275     }
   276 }
.