+GtkWidget *
+memwin_init(char *title, int memory_id)
+{
+ GtkWidget *frame;
+ GtkWidget *scrollwin;
+ GtkListStore *store;
+ GtkWidget *memlist;
+ int data_rows;
+
+ COL_ASCII = cfg->bits_per_row + 1;
+ N_COLUMNS = COL_ASCII + 1;
+
+ frame = gtk_frame_new(title);
+
+ scrollwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrollwin),
+ GTK_SHADOW_ETCHED_OUT);
+
+ /* Automatically add scrollbars when necessary. */
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+
+ gtk_container_add(GTK_CONTAINER(frame), scrollwin);
+
+ data_rows = compute_data_rows(memory_id);
+
+ /* Creating a model */
+ store = memwin_init_store(data_rows);
+
+ /* Creating the view component */
+ memlist = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(memlist), TRUE);
+ gtk_container_add(GTK_CONTAINER(scrollwin), memlist);
+
+ if (memory_id == INT_MEM_ID) {
+ memlist_internal = memlist;
+ } else if (memory_id == EXT_MEM_ID) {
+ memlist_external = memlist;
+ } else {
+ log_fail("Invalid memory type");
+ exit(1);
+ }
+
+ memwin_init_columns(memlist, memory_id);
+
+ /*
+ * The tree view has acquired its own reference to the model, so we can
+ * drop ours. That way the model will be freed automatically when the
+ * tree view is destroyed.
+ */
+ g_object_unref(store);
+
+ return frame;
+}
+
+/* Dump internal or external memory. */