Add option to specify maximum memory sizes
[emu8051.git] / src / viewmenu.c
index e7fd6b9..99fa0ab 100644 (file)
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
 #if HAVE_CONFIG_H
 #include "emugtk.h" /* For AddMenuSeparator() function. */
 #include "messagebox.h"
 #include "viewmenu.h"
+#include "app-config.h"
 
+extern struct app_config_t *cfg;
 
-static void
-ViewMenuExternalDump( gchar *string )
+void toggle_layout(GtkWidget *widget, gpointer data)
 {
-  ShowMessage( "External Memory Dump", "Not implemented yet!", GTK_JUSTIFY_CENTER,
-              MESSAGE_DIALOG_NORMAL_FONT );
+       int id;
+
+        id = GPOINTER_TO_UINT(data);
+
+       if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) {
+               log_info("  Switching to layout %d", id);
+               cfg->layout = id;
+               emugtk_restart_gui();
+       }
+}
+
+void toggle_bits_per_row(GtkWidget *widget, gpointer data)
+{
+       int bits_per_row;
+
+        bits_per_row = GPOINTER_TO_UINT(data);
+
+       if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) {
+               log_info("  Bits per row = %d", bits_per_row);
+               cfg->bits_per_row = bits_per_row;
+               emugtk_restart_gui();
+       }
 }
 
+void toggle_int_memory(GtkWidget *widget, gpointer data)
+{
+       if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) {
+               log_info("  View internal memory");
+               cfg->view_int_memory = 1;
+       } else {
+               cfg->view_int_memory = 0;
+       }
+
+       emugtk_restart_gui();
+}
 
-static void
-ViewMenuInternalDump( gchar *string )
+void toggle_ext_memory(GtkWidget *widget, gpointer data)
 {
-  ShowMessage( "Internal Memory Dump", "Not implemented yet!", GTK_JUSTIFY_CENTER,
-              MESSAGE_DIALOG_NORMAL_FONT );
+       if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) {
+               log_info("  View external memory");
+               cfg->view_ext_memory = 1;
+       } else {
+               cfg->view_ext_memory = 0;
+       }
+
+       emugtk_restart_gui();
 }
 
+void
+view_add_layout_submenu(GtkWidget *parent)
+{
+       GtkWidget *submenu;
+       GtkWidget *layout;
+       GtkWidget *layout1;
+       GtkWidget *layout2;
+       GSList *group = NULL;
+
+       submenu = gtk_menu_new();
+
+       layout  = gtk_menu_item_new_with_label("Layout");
+
+       layout1 = gtk_radio_menu_item_new_with_label(group, "Layout1");
+       group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(layout1));
+       layout2 = gtk_radio_menu_item_new_with_label(group, "Layout2");
+
+       if (cfg->layout == UI_LAYOUT1)
+               gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(layout1), TRUE);
+       else
+               gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(layout2), TRUE);
+
+       g_signal_connect(G_OBJECT(layout1), "activate",
+                        G_CALLBACK(toggle_layout), (gpointer) UI_LAYOUT1);
+       g_signal_connect(G_OBJECT(layout2), "activate",
+                        G_CALLBACK(toggle_layout), (gpointer) UI_LAYOUT2);
+
+       gtk_menu_item_set_submenu(GTK_MENU_ITEM(layout), submenu);
+       gtk_menu_shell_append(GTK_MENU_SHELL(submenu), layout1);
+       gtk_menu_shell_append(GTK_MENU_SHELL(submenu), layout2);
+       gtk_menu_shell_append(GTK_MENU_SHELL(parent), layout);
+}
 
 void
-ViewAddMenu( GtkWidget *menu_bar )
+view_add_bits_per_row_submenu(GtkWidget *parent)
 {
-  GtkWidget *item;
-  GtkWidget *menu;
-  
-  menu = gtk_menu_new();
-
-  /* Create the 'Viewmenu External Memory Dump' item. */
-  item = gtk_menu_item_new_with_label("External Memory Dump");
-  gtk_menu_append( GTK_MENU(menu), item );
-  /* Attach the callback functions to the activate signal. */
-  gtk_signal_connect_object( GTK_OBJECT(item), "activate",
-                            GTK_SIGNAL_FUNC(ViewMenuExternalDump),
-                            NULL );
-
-  AddMenuSeparator(menu);
-
-  /* Create the 'Viewmenu Internal Memory Dump' item. */
-  item = gtk_menu_item_new_with_label( "Internal Memory Dump" );
-  gtk_menu_append( GTK_MENU(menu), item );
-  /* Attach the callback functions to the activate signal. */
-  gtk_signal_connect_object( GTK_OBJECT(item), "activate",
-                            GTK_SIGNAL_FUNC(ViewMenuInternalDump),
-                            NULL );
-  
-  /* Adding submenu title. */
-  item = gtk_menu_item_new_with_label( "View" );
-  gtk_menu_item_set_submenu( GTK_MENU_ITEM(item), menu );
-  gtk_menu_bar_append( GTK_MENU_BAR( menu_bar ), item );
+       GtkWidget *submenu;
+       GtkWidget *item;
+       GtkWidget *item1;
+       GtkWidget *item2;
+       GSList *group = NULL;
+
+       submenu = gtk_menu_new();
+
+       item  = gtk_menu_item_new_with_label("Bits per row");
+
+       item1 = gtk_radio_menu_item_new_with_label(group, "8");
+       group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(item1));
+       item2 = gtk_radio_menu_item_new_with_label(group, "16");
+
+       if (cfg->bits_per_row == 8)
+               gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item1), TRUE);
+       else
+               gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item2), TRUE);
+
+       g_signal_connect(G_OBJECT(item1), "activate",
+                        G_CALLBACK(toggle_bits_per_row), (gpointer) 8);
+       g_signal_connect(G_OBJECT(item2), "activate",
+                        G_CALLBACK(toggle_bits_per_row), (gpointer) 16);
+
+       gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
+       gtk_menu_shell_append(GTK_MENU_SHELL(submenu), item1);
+       gtk_menu_shell_append(GTK_MENU_SHELL(submenu), item2);
+       gtk_menu_shell_append(GTK_MENU_SHELL(parent), item);
+}
+
+void
+ViewAddMenu(GtkWidget *menu_bar)
+{
+       GtkWidget *item;
+       GtkWidget *menu;
+       GtkWidget *view;
+
+       menu = gtk_menu_new();
+
+       view = gtk_menu_item_new_with_label("View");
+
+       item = gtk_check_menu_item_new_with_label("Internal Memory");
+       gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item),
+                                      cfg->view_int_memory);
+       g_signal_connect(G_OBJECT(item), "activate",
+                        G_CALLBACK(toggle_int_memory), NULL);
+
+       item = gtk_check_menu_item_new_with_label("External Memory");
+       gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item),
+                                      cfg->view_ext_memory);
+       g_signal_connect(G_OBJECT(item), "activate",
+                        G_CALLBACK(toggle_ext_memory), NULL);
+
+       AddMenuSeparator(menu);
+
+       /* Add layout submenu */
+       view_add_layout_submenu(menu);
+
+       AddMenuSeparator(menu);
+
+       /* Add bits per row submenu */
+       view_add_bits_per_row_submenu(menu);
+
+       gtk_menu_item_set_submenu(GTK_MENU_ITEM(view), menu);
+       gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), view);
 }