filename | src/gui/gtkcb.c |
changeset | 477:9a373f2ff009 |
prev | 455:3080881d00d4 |
next | 480: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 }
.