Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/yabause/src/gtk/yuitransfer.c
2 views
1
/* Copyright 2006 Guillaume Duhamel
2
Copyright 2005-2006 Fabien Coulon
3
4
This file is part of Yabause.
5
6
Yabause is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2 of the License, or
9
(at your option) any later version.
10
11
Yabause is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
GNU General Public License for more details.
15
16
You should have received a copy of the GNU General Public License
17
along with Yabause; if not, write to the Free Software
18
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
#include <gtk/gtk.h>
22
23
#include "yuitransfer.h"
24
#include "../core.h"
25
#include "../memory.h"
26
27
static void yui_transfer_class_init (YuiTransferClass * klass);
28
static void yui_transfer_init (YuiTransfer * yfe);
29
static void yui_transfer_browse (GtkWidget * widget, gpointer user_data);
30
static void yui_transfer_exec (GtkWidget * widget, YuiTransfer * yt);
31
static void yui_transfer_load (GtkWidget * entry, YuiTransfer * yt);
32
static void yui_transfer_load_exec (GtkWidget * entry, YuiTransfer * yt);
33
static void yui_transfer_store (GtkWidget * entry, YuiTransfer * yt);
34
static void yui_transfer_check (YuiTransfer * yt);
35
36
GType yui_transfer_get_type (void) {
37
static GType yfe_type = 0;
38
39
if (!yfe_type)
40
{
41
static const GTypeInfo yfe_info =
42
{
43
sizeof (YuiTransferClass),
44
NULL, /* base_init */
45
NULL, /* base_finalize */
46
(GClassInitFunc) yui_transfer_class_init,
47
NULL, /* class_finalize */
48
NULL, /* class_data */
49
sizeof (YuiTransfer),
50
0,
51
(GInstanceInitFunc) yui_transfer_init,
52
NULL,
53
};
54
55
yfe_type = g_type_register_static(GTK_TYPE_WINDOW, "YuiTransfer", &yfe_info, 0);
56
}
57
58
return yfe_type;
59
}
60
61
static void yui_transfer_class_init (UNUSED YuiTransferClass * klass) {
62
}
63
64
static void yui_transfer_init (YuiTransfer * yt) {
65
GtkWidget *vbox1;
66
GtkWidget *hbox1;
67
GtkWidget *label4;
68
GtkWidget *button1;
69
GtkWidget *hbox2;
70
GtkWidget *label2;
71
GtkWidget *hbuttonbox1;
72
GtkWidget *button5;
73
GtkWidget *hbox3;
74
GSList *radiobutton1_group = NULL;
75
GtkWidget *radiobutton1;
76
GtkWidget *radiobutton2;
77
GtkWidget *radiobutton3;
78
const char * tmp;
79
80
gtk_window_set_title (GTK_WINDOW (yt), _("File transfer"));
81
82
vbox1 = gtk_vbox_new (FALSE, 0);
83
gtk_container_add (GTK_CONTAINER (yt), vbox1);
84
85
hbox1 = gtk_hbox_new (FALSE, 10);
86
gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, TRUE, 0);
87
gtk_container_set_border_width (GTK_CONTAINER (hbox1), 10);
88
89
tmp = _("File");
90
label4 = gtk_label_new (tmp);
91
gtk_box_pack_start (GTK_BOX (hbox1), label4, FALSE, FALSE, 0);
92
gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5);
93
gtk_label_set_width_chars (GTK_LABEL (label4), strlen(tmp));
94
95
yt->file_entry = gtk_entry_new ();
96
g_signal_connect_swapped(yt->file_entry, "changed", G_CALLBACK(yui_transfer_check), yt);
97
gtk_box_pack_start (GTK_BOX (hbox1), yt->file_entry, TRUE, TRUE, 0);
98
99
button1 = gtk_button_new_with_mnemonic (_("Browse"));
100
g_signal_connect(button1, "clicked", G_CALLBACK(yui_transfer_browse), yt->file_entry);
101
gtk_box_pack_start (GTK_BOX (hbox1), button1, FALSE, FALSE, 0);
102
103
hbox3 = gtk_hbox_new (FALSE, 10);
104
gtk_box_pack_start (GTK_BOX (vbox1), hbox3, FALSE, FALSE, 0);
105
gtk_container_set_border_width (GTK_CONTAINER (hbox3), 10);
106
107
radiobutton1 = gtk_radio_button_new_with_mnemonic (NULL, _("Load as executable"));
108
g_signal_connect(radiobutton1, "toggled", G_CALLBACK(yui_transfer_load_exec), yt);
109
gtk_box_pack_start (GTK_BOX (hbox3), radiobutton1, FALSE, FALSE, 0);
110
gtk_radio_button_set_group (GTK_RADIO_BUTTON (radiobutton1), radiobutton1_group);
111
radiobutton1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radiobutton1));
112
113
radiobutton2 = gtk_radio_button_new_with_mnemonic (NULL, _("Load"));
114
g_signal_connect(radiobutton2, "toggled", G_CALLBACK(yui_transfer_load), yt);
115
gtk_box_pack_start (GTK_BOX (hbox3), radiobutton2, FALSE, FALSE, 0);
116
gtk_radio_button_set_group (GTK_RADIO_BUTTON (radiobutton2), radiobutton1_group);
117
radiobutton1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radiobutton2));
118
119
radiobutton3 = gtk_radio_button_new_with_mnemonic (NULL, _("Store"));
120
g_signal_connect(radiobutton3, "toggled", G_CALLBACK(yui_transfer_store), yt);
121
gtk_box_pack_start (GTK_BOX (hbox3), radiobutton3, FALSE, FALSE, 0);
122
gtk_radio_button_set_group (GTK_RADIO_BUTTON (radiobutton3), radiobutton1_group);
123
radiobutton1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radiobutton3));
124
125
hbox2 = gtk_hbox_new (FALSE, 10);
126
gtk_box_pack_start (GTK_BOX (vbox1), hbox2, FALSE, TRUE, 0);
127
gtk_container_set_border_width (GTK_CONTAINER (hbox2), 10);
128
129
tmp = _("From");
130
label2 = gtk_label_new (tmp);
131
gtk_box_pack_start (GTK_BOX (hbox2), label2, FALSE, FALSE, 0);
132
gtk_misc_set_alignment (GTK_MISC (label2), 0, 0.5);
133
gtk_label_set_width_chars (GTK_LABEL (label2), strlen(tmp));
134
135
yt->from_entry = gtk_entry_new ();
136
g_signal_connect_swapped(yt->from_entry, "changed", G_CALLBACK(yui_transfer_check), yt);
137
gtk_box_pack_start (GTK_BOX (hbox2), yt->from_entry, TRUE, TRUE, 0);
138
139
tmp = _("To");
140
yt->to_label = gtk_label_new (tmp);
141
gtk_box_pack_start (GTK_BOX (hbox2), yt->to_label, FALSE, FALSE, 0);
142
gtk_misc_set_alignment (GTK_MISC (yt->to_label), 0, 0.5);
143
gtk_label_set_width_chars (GTK_LABEL (yt->to_label), strlen(tmp));
144
145
yt->to_entry = gtk_entry_new ();
146
g_signal_connect_swapped(yt->to_entry, "changed", G_CALLBACK(yui_transfer_check), yt);
147
gtk_box_pack_start (GTK_BOX (hbox2), yt->to_entry, TRUE, TRUE, 0);
148
149
hbuttonbox1 = gtk_hbutton_box_new ();
150
gtk_box_pack_start (GTK_BOX (vbox1), hbuttonbox1, FALSE, TRUE, 0);
151
gtk_container_set_border_width (GTK_CONTAINER (hbuttonbox1), 10);
152
153
yt->transfer_button = gtk_button_new_with_mnemonic (_("Transfer"));
154
gtk_container_add (GTK_CONTAINER (hbuttonbox1), yt->transfer_button);
155
g_signal_connect(yt->transfer_button, "clicked", G_CALLBACK(yui_transfer_exec), yt);
156
GTK_WIDGET_SET_FLAGS (yt->transfer_button, GTK_CAN_DEFAULT);
157
158
button5 = gtk_button_new_from_stock ("gtk-cancel");
159
gtk_container_add (GTK_CONTAINER (hbuttonbox1), button5);
160
g_signal_connect_swapped(button5, "clicked", G_CALLBACK(gtk_widget_destroy), yt);
161
GTK_WIDGET_SET_FLAGS (button5, GTK_CAN_DEFAULT);
162
163
gtk_widget_show_all (GTK_WIDGET(yt));
164
165
gtk_widget_set_sensitive(GTK_WIDGET(yt->to_label), FALSE);
166
gtk_widget_set_sensitive(GTK_WIDGET(yt->to_entry), FALSE);
167
168
yt->mode = YUI_TRANSFER_LOAD_EXEC;
169
170
}
171
172
GtkWidget * yui_transfer_new(YuiWindow * yw) {
173
GtkWidget * entry;
174
YuiTransfer * yfe;
175
176
entry = GTK_WIDGET(g_object_new(yui_transfer_get_type(), NULL));
177
yfe = YUI_TRANSFERT(entry);
178
179
gtk_widget_show_all(entry);
180
181
yui_transfer_check(yfe);
182
183
yui_window_start(yw);
184
185
return entry;
186
}
187
188
static void yui_transfer_browse(UNUSED GtkWidget * widget, gpointer user_data) {
189
GtkWidget * file_selector;
190
gint result;
191
const gchar * filename;
192
193
file_selector = gtk_file_chooser_dialog_new (_("Please choose a file"), NULL, GTK_FILE_CHOOSER_ACTION_OPEN,
194
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
195
filename = gtk_entry_get_text(GTK_ENTRY(user_data));
196
if (filename[0] != '\0')
197
gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(file_selector), filename);
198
199
gtk_widget_show(file_selector);
200
201
result = gtk_dialog_run(GTK_DIALOG(file_selector));
202
203
switch(result) {
204
case GTK_RESPONSE_ACCEPT:
205
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_selector));
206
gtk_entry_set_text(GTK_ENTRY(user_data), filename);
207
break;
208
case GTK_RESPONSE_CANCEL:
209
break;
210
}
211
212
gtk_widget_destroy(file_selector);
213
}
214
215
static void yui_transfer_exec(UNUSED GtkWidget * widget, YuiTransfer * yt) {
216
guint32 from, to;
217
218
switch(yt->mode) {
219
case YUI_TRANSFER_LOAD:
220
sscanf(gtk_entry_get_text(GTK_ENTRY(yt->from_entry)), "%x", &from);
221
MappedMemoryLoad(gtk_entry_get_text(GTK_ENTRY(yt->file_entry)), from);
222
break;
223
case YUI_TRANSFER_LOAD_EXEC:
224
sscanf(gtk_entry_get_text(GTK_ENTRY(yt->from_entry)), "%x", &from);
225
MappedMemoryLoadExec(gtk_entry_get_text(GTK_ENTRY(yt->file_entry)), from);
226
break;
227
case YUI_TRANSFER_STORE:
228
sscanf(gtk_entry_get_text(GTK_ENTRY(yt->from_entry)), "%x", &from);
229
sscanf(gtk_entry_get_text(GTK_ENTRY(yt->to_entry)), "%x", &to);
230
MappedMemorySave(gtk_entry_get_text(GTK_ENTRY(yt->file_entry)), from, to - from);
231
break;
232
}
233
234
gtk_widget_destroy(GTK_WIDGET(yt));
235
}
236
237
static void yui_transfer_load(GtkWidget * entry, YuiTransfer * yt) {
238
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(entry))) {
239
yt->mode = YUI_TRANSFER_LOAD;
240
gtk_widget_set_sensitive(GTK_WIDGET(yt->to_label), FALSE);
241
gtk_widget_set_sensitive(GTK_WIDGET(yt->to_entry), FALSE);
242
yui_transfer_check(yt);
243
}
244
}
245
246
static void yui_transfer_load_exec(GtkWidget * entry, YuiTransfer * yt) {
247
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(entry))) {
248
yt->mode = YUI_TRANSFER_LOAD_EXEC;
249
gtk_widget_set_sensitive(GTK_WIDGET(yt->to_label), FALSE);
250
gtk_widget_set_sensitive(GTK_WIDGET(yt->to_entry), FALSE);
251
yui_transfer_check(yt);
252
}
253
}
254
255
static void yui_transfer_store(GtkWidget * entry, YuiTransfer * yt) {
256
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(entry))) {
257
yt->mode = YUI_TRANSFER_STORE;
258
gtk_widget_set_sensitive(GTK_WIDGET(yt->to_label), TRUE);
259
gtk_widget_set_sensitive(GTK_WIDGET(yt->to_entry), TRUE);
260
yui_transfer_check(yt);
261
}
262
}
263
264
static void yui_transfer_check(YuiTransfer * yt) {
265
gboolean ok = FALSE;
266
267
if (*gtk_entry_get_text(GTK_ENTRY(yt->file_entry)) != '\0') {
268
switch(yt->mode) {
269
case YUI_TRANSFER_LOAD:
270
case YUI_TRANSFER_LOAD_EXEC:
271
if (*gtk_entry_get_text(GTK_ENTRY(yt->from_entry)) != '\0') {
272
ok = TRUE;
273
}
274
break;
275
case YUI_TRANSFER_STORE:
276
if ((*gtk_entry_get_text(GTK_ENTRY(yt->from_entry)) != '\0') && (*gtk_entry_get_text(GTK_ENTRY(yt->to_entry)) != '\0')) {
277
ok = TRUE;
278
}
279
break;
280
}
281
}
282
283
gtk_widget_set_sensitive(yt->transfer_button, ok);
284
}
285
286