From 5252d45ed7bdba77eea58a5f3f0ac039308eada3 Mon Sep 17 00:00:00 2001 From: arcum42 Date: Fri, 13 Feb 2009 12:50:01 +0000 Subject: [PATCH] Linux: A bit of work on memcard support in Linux. Disabled for the moment because it seemed like the emulator wasn't seeing memcards being swapped till after restarting pcsx2, and I was worried about memcard corruption. I also made it put in default values for memcards if you didn't have them in preferences already. git-svn-id: http://pcsx2.googlecode.com/svn/trunk@486 96395faa-99c1-11dd-bbfe-3dabce05a288 --- build.sh | 4 +- pcsx2/Linux/LnxMain.cpp | 175 ++++++++++++++----------------- pcsx2/Linux/LnxMain.h | 4 +- pcsx2/Linux/LnxSysExec.cpp | 105 +++++++++++++++++++ pcsx2/Linux/LnxSysExec.h | 3 +- pcsx2/Linux/Pref.cpp | 3 + pcsx2/Linux/callbacks.h | 8 ++ pcsx2/Linux/interface.c | 105 +++++++++++++++++++ pcsx2/Linux/interface.h | 1 + pcsx2/Linux/pcsx2.glade | 204 +++++++++++++++++++++++++++++++++++++ 10 files changed, 507 insertions(+), 105 deletions(-) diff --git a/build.sh b/build.sh index 378d4b9979..f46dad8a8e 100644 --- a/build.sh +++ b/build.sh @@ -6,11 +6,11 @@ # Uncomment if building by itself, rather then with all the plugins #Normal -#export PCSX2OPTIONS="--enable-sse3 --enable-sse4 --prefix `pwd`" +export PCSX2OPTIONS="--enable-sse3 --enable-sse4 --prefix `pwd`" #Optimized, but a devbuild -export PCSX2OPTIONS="--enable-sse3 --enable-sse4 --enable-devbuild --prefix `pwd`" +#export PCSX2OPTIONS="--enable-sse3 --enable-sse4 --enable-devbuild --prefix `pwd`" #Debug / Devbuild version #export PCSX2OPTIONS="--enable-debug --enable-devbuild --enable-sse3 --prefix `pwd`" diff --git a/pcsx2/Linux/LnxMain.cpp b/pcsx2/Linux/LnxMain.cpp index d4acef6d2c..1f4081e4e8 100644 --- a/pcsx2/Linux/LnxMain.cpp +++ b/pcsx2/Linux/LnxMain.cpp @@ -39,7 +39,6 @@ int main(int argc, char *argv[]) { char *file = NULL; char elfname[g_MaxPath]; - int i = 1; efile = 0; #ifdef ENABLE_NLS @@ -56,106 +55,8 @@ int main(int argc, char *argv[]) #ifdef PCSX2_DEVBUILD memset(&g_TestRun, 0, sizeof(g_TestRun)); #endif - - while (i < argc) - { - char* token = argv[i++]; - - if (stricmp(token, "-help") == 0 || stricmp(token, "--help") == 0 || stricmp(token, "-h") == 0) - { - //Msgbox::Alert( phelpmsg ); - return 0; - } - else if (stricmp(token, "-efile") == 0) - { - token = argv[i++]; - if (token != NULL) - { - efile = atoi(token); - } - } - else if (stricmp(token, "-nogui") == 0) - { - UseGui = FALSE; - } - else if (stricmp(token, "-loadgs") == 0) - { - g_pRunGSState = argv[i++]; - } -#ifdef PCSX2_DEVBUILD - else if (stricmp(token, "-image") == 0) - { - g_TestRun.pimagename = argv[i++]; - } - else if (stricmp(token, "-log") == 0) - { - g_TestRun.plogname = argv[i++]; - } - else if (stricmp(token, "-logopt") == 0) - { - token = argv[i++]; - if (token != NULL) - { - if (token[0] == '0' && token[1] == 'x') token += 2; - sscanf(token, "%x", &varLog); - } - } - else if (stricmp(token, "-frame") == 0) - { - token = argv[i++]; - if (token != NULL) - { - g_TestRun.frame = atoi(token); - } - } - else if (stricmp(token, "-numimages") == 0) - { - token = argv[i++]; - if (token != NULL) - { - g_TestRun.numimages = atoi(token); - } - } - else if (stricmp(token, "-jpg") == 0) - { - g_TestRun.jpgcapture = 1; - } - else if (stricmp(token, "-gs") == 0) - { - token = argv[i++]; - g_TestRun.pgsdll = token; - } - else if (stricmp(token, "-cdvd") == 0) - { - token = argv[i++]; - g_TestRun.pcdvddll = token; - } - else if (stricmp(token, "-spu") == 0) - { - token = argv[i++]; - g_TestRun.pspudll = token; - } - else if (stricmp(token, "-test") == 0) - { - g_TestRun.enabled = 1; - } -#endif - else if (stricmp(token, "-pad") == 0) - { - token = argv[i++]; - printf("-pad ignored\n"); - } - else if (stricmp(token, "-loadgs") == 0) - { - token = argv[i++]; - g_pRunGSState = token; - } - else - { - file = token; - printf("opening file %s\n", file); - } - } + + if (!ParseCommandLine(argc, argv, file)) return 0; #ifdef PCSX2_DEVBUILD g_TestRun.efile = efile; @@ -180,6 +81,8 @@ int main(int argc, char *argv[]) memset(&Config, 0, sizeof(Config)); strcpy(Config.BiosDir, DEFAULT_BIOS_DIR "/"); strcpy(Config.PluginsDir, DEFAULT_PLUGINS_DIR "/"); + strcpy(Config.Mcd1, MEMCARDS_DIR "/" DEFAULT_MEMCARD1); + strcpy(Config.Mcd2, MEMCARDS_DIR "/" DEFAULT_MEMCARD2); Config.Patch = 0; Config.PsxOut = 1; Config.Options = PCSX2_EEREC | PCSX2_VU0REC | PCSX2_VU1REC | PCSX2_FRAMELIMIT_LIMIT; @@ -358,6 +261,7 @@ void StartGui() // disable anything not implemented or not working properly. gtk_widget_set_sensitive(GTK_WIDGET(lookup_widget(MainWindow, "patch_browser1")), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(lookup_widget(MainWindow, "patch_finder2")), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(lookup_widget(MainWindow, "GtkMenuItem_Memcards")), FALSE); #ifndef PCSX2_DEVBUILD gtk_widget_set_sensitive(GTK_WIDGET(lookup_widget(MainWindow, "GtkMenuItem_Logging")), FALSE); #endif @@ -622,6 +526,75 @@ void OnDebug_Logging(GtkMenuItem *menuitem, gpointer user_data) gtk_main(); } +void OnConf_Memcards(GtkMenuItem *menuitem, gpointer user_data) +{ + char file[g_MaxPath], card[g_MaxPath]; + DIR *dir; + struct dirent *entry; + struct stat statinfo; + GtkWidget *memcombo1, *memcombo2; + int i = 0; + + MemDlg = create_MemDlg(); + memcombo1 = lookup_widget(MemDlg, "memcard1combo"); + memcombo2 = lookup_widget(MemDlg, "memcard2combo"); + + getcwd(file, ARRAYSIZE(file)); /* store current dir */ + sprintf( card, "%s/%s", file, MEMCARDS_DIR ); + chdir(card); /* change dirs so that plugins can find their config file*/ + + if ((dir = opendir(card)) == NULL) + { + Console::Error("ERROR: Could not open directory %s\n", params card); + return; + } + + while ((entry = readdir(dir)) != NULL) + { + stat(entry->d_name, &statinfo); + + if (S_ISREG(statinfo.st_mode)) + { + char path[g_MaxPath]; + + sprintf( path, "%s/%s", MEMCARDS_DIR, entry->d_name); + gtk_combo_box_append_text(GTK_COMBO_BOX(memcombo1), entry->d_name); + gtk_combo_box_append_text(GTK_COMBO_BOX(memcombo2), entry->d_name); + + if (strcmp(Config.Mcd1, path) == 0) + gtk_combo_box_set_active(GTK_COMBO_BOX(memcombo1), i); + if (strcmp(Config.Mcd2, path) == 0) + gtk_combo_box_set_active(GTK_COMBO_BOX(memcombo2), i); + + i++; + } + } + + closedir(dir); + + chdir(file); + gtk_widget_show_all(MemDlg); + gtk_widget_set_sensitive(MainWindow, FALSE); + gtk_main(); + +} + +void OnMemcards_Ok(GtkButton *button, gpointer user_data) +{ + + strcpy(Config.Mcd1, MEMCARDS_DIR "/"); + strcpy(Config.Mcd2, MEMCARDS_DIR "/"); + + strcat(Config.Mcd1, gtk_combo_box_get_active_text(GTK_COMBO_BOX(lookup_widget(MemDlg, "memcard1combo")))); + strcat(Config.Mcd2, gtk_combo_box_get_active_text(GTK_COMBO_BOX(lookup_widget(MemDlg, "memcard2combo")))); + + SaveConfig(); + + gtk_widget_destroy(MemDlg); + gtk_widget_set_sensitive(MainWindow, TRUE); + gtk_main_quit(); +} + void on_patch_browser1_activate(GtkMenuItem *menuitem, gpointer user_data) {} void on_patch_finder2_activate(GtkMenuItem *menuitem, gpointer user_data) {} diff --git a/pcsx2/Linux/LnxMain.h b/pcsx2/Linux/LnxMain.h index 615d631d7a..be691877c0 100644 --- a/pcsx2/Linux/LnxMain.h +++ b/pcsx2/Linux/LnxMain.h @@ -32,6 +32,8 @@ void OnLanguage(GtkMenuItem *menuitem, gpointer user_data); extern void ExecuteCpu(); extern void CheckSlots(); extern bool isSlotUsed(int num); +extern bool ParseCommandLine(int argc, char *argv[], char *file); +extern void MemoryCard_Init(); void InitLanguages(); char *GetLanguageNext(); @@ -43,7 +45,7 @@ GtkWidget *MainWindow; GtkWidget *pStatusBar = NULL, *Status_Box; GtkWidget *CmdLine; //2002-09-28 (Florin) GtkWidget *widgetCmdLine; -GtkWidget *LogDlg; +GtkWidget *LogDlg, *MemDlg; GtkAccelGroup *AccelGroup; diff --git a/pcsx2/Linux/LnxSysExec.cpp b/pcsx2/Linux/LnxSysExec.cpp index 673c176484..97377b3caf 100644 --- a/pcsx2/Linux/LnxSysExec.cpp +++ b/pcsx2/Linux/LnxSysExec.cpp @@ -30,6 +30,111 @@ bool g_EmulationInProgress = false; // Set TRUE if a game is actively running (s static bool sinit = false; GtkWidget *FileSel; +bool ParseCommandLine(int argc, char *argv[], char *file) +{ + int i = 1; + + while (i < argc) + { + char* token = argv[i++]; + + if (stricmp(token, "-help") == 0 || stricmp(token, "--help") == 0 || stricmp(token, "-h") == 0) + { + //Msgbox::Alert( phelpmsg ); + return false; + } + else if (stricmp(token, "-efile") == 0) + { + token = argv[i++]; + if (token != NULL) + { + efile = atoi(token); + } + } + else if (stricmp(token, "-nogui") == 0) + { + UseGui = FALSE; + } + else if (stricmp(token, "-loadgs") == 0) + { + g_pRunGSState = argv[i++]; + } +#ifdef PCSX2_DEVBUILD + else if (stricmp(token, "-image") == 0) + { + g_TestRun.pimagename = argv[i++]; + } + else if (stricmp(token, "-log") == 0) + { + g_TestRun.plogname = argv[i++]; + } + else if (stricmp(token, "-logopt") == 0) + { + token = argv[i++]; + if (token != NULL) + { + if (token[0] == '0' && token[1] == 'x') token += 2; + sscanf(token, "%x", &varLog); + } + } + else if (stricmp(token, "-frame") == 0) + { + token = argv[i++]; + if (token != NULL) + { + g_TestRun.frame = atoi(token); + } + } + else if (stricmp(token, "-numimages") == 0) + { + token = argv[i++]; + if (token != NULL) + { + g_TestRun.numimages = atoi(token); + } + } + else if (stricmp(token, "-jpg") == 0) + { + g_TestRun.jpgcapture = 1; + } + else if (stricmp(token, "-gs") == 0) + { + token = argv[i++]; + g_TestRun.pgsdll = token; + } + else if (stricmp(token, "-cdvd") == 0) + { + token = argv[i++]; + g_TestRun.pcdvddll = token; + } + else if (stricmp(token, "-spu") == 0) + { + token = argv[i++]; + g_TestRun.pspudll = token; + } + else if (stricmp(token, "-test") == 0) + { + g_TestRun.enabled = 1; + } +#endif + else if (stricmp(token, "-pad") == 0) + { + token = argv[i++]; + printf("-pad ignored\n"); + } + else if (stricmp(token, "-loadgs") == 0) + { + token = argv[i++]; + g_pRunGSState = token; + } + else + { + file = token; + printf("opening file %s\n", file); + } + } + return true; +} void SysPrintf(const char *fmt, ...) { va_list list; diff --git a/pcsx2/Linux/LnxSysExec.h b/pcsx2/Linux/LnxSysExec.h index 853c8345d5..1c2dc54fa8 100644 --- a/pcsx2/Linux/LnxSysExec.h +++ b/pcsx2/Linux/LnxSysExec.h @@ -25,5 +25,6 @@ extern void StartGui(); extern void CheckSlots(); - +extern const char* g_pRunGSState; +extern int efile; #endif \ No newline at end of file diff --git a/pcsx2/Linux/Pref.cpp b/pcsx2/Linux/Pref.cpp index dba493b14d..7e06579589 100644 --- a/pcsx2/Linux/Pref.cpp +++ b/pcsx2/Linux/Pref.cpp @@ -77,6 +77,9 @@ int LoadConfig() GetValue("BiosDir", Config.BiosDir); GetValue("Mcd1", Config.Mcd1); GetValue("Mcd2", Config.Mcd2); + + if (strcmp(Config.Mcd1,"") == 0) strcpy(Config.Mcd1, MEMCARDS_DIR "/" DEFAULT_MEMCARD1); + if (strcmp(Config.Mcd2,"") == 0) strcpy(Config.Mcd2, MEMCARDS_DIR "/" DEFAULT_MEMCARD2); GetValue("GS", Config.GS); GetValue("SPU2", Config.SPU2); diff --git a/pcsx2/Linux/callbacks.h b/pcsx2/Linux/callbacks.h index 26ef407557..3d35b16927 100644 --- a/pcsx2/Linux/callbacks.h +++ b/pcsx2/Linux/callbacks.h @@ -302,6 +302,10 @@ void OnConf_Fw (GtkMenuItem *menuitem, gpointer user_data); +void +OnConf_Memcards (GtkMenuItem *menuitem, + gpointer user_data); + void OnConf_Cpu (GtkMenuItem *menuitem, gpointer user_data); @@ -353,3 +357,7 @@ OnCpu_Ok (GtkButton *button, void OnLogging_Ok (GtkButton *button, gpointer user_data); + +void +OnMemcards_Ok (GtkButton *button, + gpointer user_data); diff --git a/pcsx2/Linux/interface.c b/pcsx2/Linux/interface.c index 15dea4fa6a..78924a1232 100644 --- a/pcsx2/Linux/interface.c +++ b/pcsx2/Linux/interface.c @@ -2433,6 +2433,7 @@ create_MainWindow (void) GtkWidget *GtkMenuItem_USB; GtkWidget *GtkMenuItem_FW; GtkWidget *separator4; + GtkWidget *GtkMenuItem_Memcards; GtkWidget *GtkMenuItem_Cpu; GtkWidget *GtkMenuItem_Game_Fixes; GtkWidget *GtkMenuItem_Speed_Hacks; @@ -2628,6 +2629,10 @@ create_MainWindow (void) gtk_container_add (GTK_CONTAINER (GtkMenuItem_Configuration_menu), separator4); gtk_widget_set_sensitive (separator4, FALSE); + GtkMenuItem_Memcards = gtk_menu_item_new_with_mnemonic (_("Memcards")); + gtk_widget_show (GtkMenuItem_Memcards); + gtk_container_add (GTK_CONTAINER (GtkMenuItem_Configuration_menu), GtkMenuItem_Memcards); + GtkMenuItem_Cpu = gtk_menu_item_new_with_mnemonic (_("C_pu")); gtk_widget_show (GtkMenuItem_Cpu); gtk_container_add (GTK_CONTAINER (GtkMenuItem_Configuration_menu), GtkMenuItem_Cpu); @@ -2795,6 +2800,9 @@ create_MainWindow (void) g_signal_connect ((gpointer) GtkMenuItem_FW, "activate", G_CALLBACK (OnConf_Fw), NULL); + g_signal_connect ((gpointer) GtkMenuItem_Memcards, "activate", + G_CALLBACK (OnConf_Memcards), + NULL); g_signal_connect ((gpointer) GtkMenuItem_Cpu, "activate", G_CALLBACK (OnConf_Cpu), NULL); @@ -2874,6 +2882,7 @@ create_MainWindow (void) GLADE_HOOKUP_OBJECT (MainWindow, GtkMenuItem_USB, "GtkMenuItem_USB"); GLADE_HOOKUP_OBJECT (MainWindow, GtkMenuItem_FW, "GtkMenuItem_FW"); GLADE_HOOKUP_OBJECT (MainWindow, separator4, "separator4"); + GLADE_HOOKUP_OBJECT (MainWindow, GtkMenuItem_Memcards, "GtkMenuItem_Memcards"); GLADE_HOOKUP_OBJECT (MainWindow, GtkMenuItem_Cpu, "GtkMenuItem_Cpu"); GLADE_HOOKUP_OBJECT (MainWindow, GtkMenuItem_Game_Fixes, "GtkMenuItem_Game_Fixes"); GLADE_HOOKUP_OBJECT (MainWindow, GtkMenuItem_Speed_Hacks, "GtkMenuItem_Speed_Hacks"); @@ -4015,3 +4024,99 @@ create_Logging (void) return Logging; } +GtkWidget* +create_MemDlg (void) +{ + GtkWidget *MemDlg; + GtkWidget *dialog_vbox7; + GtkWidget *hbox40; + GtkWidget *vbox62; + GtkWidget *hbox42; + GtkWidget *label99; + GtkWidget *label100; + GtkWidget *hbox41; + GtkWidget *memcard1combo; + GtkWidget *memcard2combo; + GtkWidget *dialog_action_area7; + GtkWidget *memcardcancelbutton; + GtkWidget *okbutton1; + + MemDlg = gtk_dialog_new (); + gtk_window_set_title (GTK_WINDOW (MemDlg), _("Memcards")); + gtk_window_set_type_hint (GTK_WINDOW (MemDlg), GDK_WINDOW_TYPE_HINT_DIALOG); + + dialog_vbox7 = GTK_DIALOG (MemDlg)->vbox; + gtk_widget_show (dialog_vbox7); + + hbox40 = gtk_hbox_new (FALSE, 0); + gtk_widget_show (hbox40); + gtk_box_pack_start (GTK_BOX (dialog_vbox7), hbox40, TRUE, TRUE, 0); + + vbox62 = gtk_vbox_new (FALSE, 0); + gtk_widget_show (vbox62); + gtk_box_pack_start (GTK_BOX (hbox40), vbox62, TRUE, TRUE, 0); + + hbox42 = gtk_hbox_new (FALSE, 0); + gtk_widget_show (hbox42); + gtk_box_pack_start (GTK_BOX (vbox62), hbox42, TRUE, TRUE, 0); + + label99 = gtk_label_new (_("Memcard 1")); + gtk_widget_show (label99); + gtk_box_pack_start (GTK_BOX (hbox42), label99, TRUE, TRUE, 0); + + label100 = gtk_label_new (_("Memcard 2")); + gtk_widget_show (label100); + gtk_box_pack_start (GTK_BOX (hbox42), label100, TRUE, TRUE, 0); + gtk_label_set_justify (GTK_LABEL (label100), GTK_JUSTIFY_RIGHT); + + hbox41 = gtk_hbox_new (FALSE, 0); + gtk_widget_show (hbox41); + gtk_box_pack_start (GTK_BOX (vbox62), hbox41, TRUE, TRUE, 0); + + memcard1combo = gtk_combo_box_new_text (); + gtk_widget_show (memcard1combo); + gtk_box_pack_start (GTK_BOX (hbox41), memcard1combo, TRUE, TRUE, 0); + + memcard2combo = gtk_combo_box_new_text (); + gtk_widget_show (memcard2combo); + gtk_box_pack_start (GTK_BOX (hbox41), memcard2combo, TRUE, TRUE, 0); + + dialog_action_area7 = GTK_DIALOG (MemDlg)->action_area; + gtk_widget_show (dialog_action_area7); + gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area7), GTK_BUTTONBOX_END); + + memcardcancelbutton = gtk_button_new_from_stock ("gtk-ok"); + gtk_widget_show (memcardcancelbutton); + gtk_dialog_add_action_widget (GTK_DIALOG (MemDlg), memcardcancelbutton, GTK_RESPONSE_OK); + GTK_WIDGET_SET_FLAGS (memcardcancelbutton, GTK_CAN_DEFAULT); + + okbutton1 = gtk_button_new_from_stock ("gtk-cancel"); + gtk_widget_show (okbutton1); + gtk_dialog_add_action_widget (GTK_DIALOG (MemDlg), okbutton1, GTK_RESPONSE_CANCEL); + GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT); + + g_signal_connect ((gpointer) memcardcancelbutton, "clicked", + G_CALLBACK (OnMemcards_Ok), + NULL); + g_signal_connect ((gpointer) okbutton1, "clicked", + G_CALLBACK (OnMemcards_Ok), + NULL); + + /* Store pointers to all widgets, for use by lookup_widget(). */ + GLADE_HOOKUP_OBJECT_NO_REF (MemDlg, MemDlg, "MemDlg"); + GLADE_HOOKUP_OBJECT_NO_REF (MemDlg, dialog_vbox7, "dialog_vbox7"); + GLADE_HOOKUP_OBJECT (MemDlg, hbox40, "hbox40"); + GLADE_HOOKUP_OBJECT (MemDlg, vbox62, "vbox62"); + GLADE_HOOKUP_OBJECT (MemDlg, hbox42, "hbox42"); + GLADE_HOOKUP_OBJECT (MemDlg, label99, "label99"); + GLADE_HOOKUP_OBJECT (MemDlg, label100, "label100"); + GLADE_HOOKUP_OBJECT (MemDlg, hbox41, "hbox41"); + GLADE_HOOKUP_OBJECT (MemDlg, memcard1combo, "memcard1combo"); + GLADE_HOOKUP_OBJECT (MemDlg, memcard2combo, "memcard2combo"); + GLADE_HOOKUP_OBJECT_NO_REF (MemDlg, dialog_action_area7, "dialog_action_area7"); + GLADE_HOOKUP_OBJECT (MemDlg, memcardcancelbutton, "memcardcancelbutton"); + GLADE_HOOKUP_OBJECT (MemDlg, okbutton1, "okbutton1"); + + return MemDlg; +} + diff --git a/pcsx2/Linux/interface.h b/pcsx2/Linux/interface.h index 744699086e..89335b8d04 100644 --- a/pcsx2/Linux/interface.h +++ b/pcsx2/Linux/interface.h @@ -20,3 +20,4 @@ GtkWidget* create_PatchBrowserWindow (void); GtkWidget* create_PatchFinderWindow (void); GtkWidget* create_CpuDlg (void); GtkWidget* create_Logging (void); +GtkWidget* create_MemDlg (void); diff --git a/pcsx2/Linux/pcsx2.glade b/pcsx2/Linux/pcsx2.glade index 83574d8ab3..536ade8481 100644 --- a/pcsx2/Linux/pcsx2.glade +++ b/pcsx2/Linux/pcsx2.glade @@ -5071,6 +5071,15 @@ Version x.x + + + True + Memcards + True + + + + True @@ -8019,4 +8028,199 @@ Version x.x + + True + Memcards + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + True + False + True + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + True + -5 + + + + + + + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + True + -6 + + + + + + 0 + False + True + GTK_PACK_END + + + + + + True + False + 0 + + + + True + False + 0 + + + + True + False + 0 + + + + True + Memcard 1 + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + True + True + + + + + + True + Memcard 2 + False + False + GTK_JUSTIFY_RIGHT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + True + True + + + + + 0 + True + True + + + + + + True + False + 0 + + + + True + False + True + + + 0 + True + True + + + + + + True + False + True + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + True + True + + + + + +