diff options
author | Joakim Sindholt <opensource@zhasha.com> | 2010-04-06 03:11:58 +0200 |
---|---|---|
committer | Joakim Sindholt <opensource@zhasha.com> | 2010-04-06 03:11:58 +0200 |
commit | 6edcb6a03aec76a99181cd77e8b38ea3e027ed23 (patch) | |
tree | 195614888a04e93e001a2848807b58d2bef0cfef | |
parent | e9f96e863deb3cdf1bea48aba71ca7b0b89fa30b (diff) |
csview: support different chips and allow on-the-fly switching
-rw-r--r-- | src/csview.c | 181 | ||||
-rw-r--r-- | src/csview.vala | 73 | ||||
-rw-r--r-- | src/main.c | 424 | ||||
-rw-r--r-- | src/main.vala | 193 |
4 files changed, 542 insertions, 329 deletions
diff --git a/src/csview.c b/src/csview.c index 512f4df..ab4d7e8 100644 --- a/src/csview.c +++ b/src/csview.c @@ -154,6 +154,9 @@ typedef struct _GUICSView GUICSView; typedef struct _GUICSViewClass GUICSViewClass; typedef struct _GUICSViewPrivate GUICSViewPrivate; +#define EMULATION_TYPE_SPEC_ENTRY (emulation_spec_entry_get_type ()) +typedef struct _EmulationSpecEntry EmulationSpecEntry; + struct _GUICSListModel { GObject parent_instance; GUICSListModelPrivate * priv; @@ -239,12 +242,20 @@ struct _GUICSViewClass { }; struct _GUICSViewPrivate { - GtkButton* m_pkgup; - GtkButton* m_pkgdown; - GUICSListModel* m_pkg_store; + GtkButton* up_btn; + GtkButton* down_btn; + GUICSListModel** models; + gint models_length1; + gint models_size; + GtkTreeView* cs_view; guint m_pos; }; +struct _EmulationSpecEntry { + EmulationSpec* spec; + char* name; +}; + static char** gui_cs_list_model_packet_strings; static gint gui_cs_list_model_packet_strings_length1; @@ -284,6 +295,9 @@ static gint gui_cs_list_model_packet_headers_length_size = 0; static gpointer gui_cs_list_model_cs_iter_parent_class = NULL; static gpointer gui_cs_list_model_parent_class = NULL; static GtkTreeModelIface* gui_cs_list_model_gtk_tree_model_parent_iface = NULL; +extern EmulationSpecEntry* emulation_specs; +extern gint emulation_specs_length1; +extern guint emulation_spec_default; static gpointer gui_cs_view_parent_class = NULL; GType gui_cs_list_model_get_type (void); @@ -395,9 +409,18 @@ enum { }; static void gui_cs_view_current_dword_renderer (GUICSView* self, GtkTreeViewColumn* tree_column, GtkCellRenderer* cell, GtkTreeModel* model, GtkTreeIter* iter); static void _gui_cs_view_current_dword_renderer_gtk_tree_cell_data_func (GtkTreeViewColumn* tree_column, GtkCellRenderer* cell, GtkTreeModel* tree_model, GtkTreeIter* iter, gpointer self); -GUICSView* gui_cs_view_new (EmulationCS* cs, EmulationSpec* spec); -GUICSView* gui_cs_view_construct (GType object_type, EmulationCS* cs, EmulationSpec* spec); +GType emulation_spec_entry_get_type (void); +EmulationSpecEntry* emulation_spec_entry_dup (const EmulationSpecEntry* self); +void emulation_spec_entry_free (EmulationSpecEntry* self); +void emulation_spec_entry_copy (const EmulationSpecEntry* self, EmulationSpecEntry* dest); +void emulation_spec_entry_destroy (EmulationSpecEntry* self); +static void _lambda8_ (GtkComboBox* combo, GUICSView* self); +static void __lambda8__gtk_combo_box_changed (GtkComboBox* _sender, gpointer self); +GUICSView* gui_cs_view_new (EmulationCS* cs); +GUICSView* gui_cs_view_construct (GType object_type, EmulationCS* cs); static void gui_cs_view_finalize (GObject* obj); +static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func); +static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func); @@ -2047,66 +2070,127 @@ static void _gui_cs_view_current_dword_renderer_gtk_tree_cell_data_func (GtkTree } -GUICSView* gui_cs_view_construct (GType object_type, EmulationCS* cs, EmulationSpec* spec) { +static void _lambda8_ (GtkComboBox* combo, GUICSView* self) { + g_return_if_fail (combo != NULL); + gtk_tree_view_set_model (self->priv->cs_view, (GtkTreeModel*) self->priv->models[gtk_combo_box_get_active (combo)]); +} + + +static void __lambda8__gtk_combo_box_changed (GtkComboBox* _sender, gpointer self) { + _lambda8_ (_sender, self); +} + + +GUICSView* gui_cs_view_construct (GType object_type, EmulationCS* cs) { GUICSView * self; - GtkTreeView* cs_list; - GtkCellRendererPixbuf* _tmp0_; - GtkCellRendererText* _tmp1_; - GtkTreeViewColumn* _tmp2_; + GtkTreeView* _tmp0_; + GtkCellRendererPixbuf* _tmp1_; + GtkCellRendererText* _tmp2_; + GtkTreeViewColumn* _tmp3_; GtkTreeViewColumn* ec_name; - GtkCellRendererText* _tmp3_; - GtkTreeViewColumn* _tmp4_; + GtkCellRendererText* _tmp4_; + GtkTreeViewColumn* _tmp5_; GtkTreeViewColumn* ec_value; - GtkCellRendererText* _tmp5_; - GtkTreeViewColumn* _tmp6_; + GtkCellRendererText* _tmp6_; + GtkTreeViewColumn* _tmp7_; GtkTreeViewColumn* ec_target; - GUICSListModel* _tmp7_; + GUICSListModel** _tmp8_; + GtkComboBox* chips; GtkScrolledWindow* cs_sw; + GtkLabel* chip_label; + GtkHBox* chips_box; + GtkButton* _tmp11_; + GtkImage* _tmp12_; + GtkButton* _tmp13_; + GtkImage* _tmp14_; + GtkVBox* btnbox; + GtkHBox* hbl; GtkVBox* vbl; - GtkButton* _tmp8_; - GtkButton* _tmp9_; g_return_val_if_fail (cs != NULL, NULL); - g_return_val_if_fail (spec != NULL, NULL); self = g_object_newv (object_type, 0, NULL); self->priv->m_pos = (guint) 0; - cs_list = g_object_ref_sink ((GtkTreeView*) gtk_tree_view_new ()); - gtk_tree_view_insert_column_with_data_func (cs_list, -1, "", (GtkCellRenderer*) (_tmp0_ = g_object_ref_sink ((GtkCellRendererPixbuf*) gtk_cell_renderer_pixbuf_new ())), _gui_cs_view_current_dword_renderer_gtk_tree_cell_data_func, g_object_ref (self), g_object_unref); - _g_object_unref0 (_tmp0_); - ec_name = (_tmp2_ = g_object_ref_sink (gtk_tree_view_column_new_with_attributes ("Name", (GtkCellRenderer*) (_tmp1_ = g_object_ref_sink ((GtkCellRendererText*) gtk_cell_renderer_text_new ())), "text", GUI_CS_LIST_MODEL_COLUMNS_NAME, NULL, NULL)), _g_object_unref0 (_tmp1_), _tmp2_); - ec_value = (_tmp4_ = g_object_ref_sink (gtk_tree_view_column_new_with_attributes ("Value", (GtkCellRenderer*) (_tmp3_ = g_object_ref_sink ((GtkCellRendererText*) gtk_cell_renderer_text_new ())), "text", GUI_CS_LIST_MODEL_COLUMNS_VALUE, NULL, NULL)), _g_object_unref0 (_tmp3_), _tmp4_); - ec_target = (_tmp6_ = g_object_ref_sink (gtk_tree_view_column_new_with_attributes ("Target", (GtkCellRenderer*) (_tmp5_ = g_object_ref_sink ((GtkCellRendererText*) gtk_cell_renderer_text_new ())), "text", GUI_CS_LIST_MODEL_COLUMNS_TARGET, NULL, NULL)), _g_object_unref0 (_tmp5_), _tmp6_); - gtk_tree_view_insert_column (cs_list, ec_name, -1); - gtk_tree_view_insert_column (cs_list, ec_value, -1); - gtk_tree_view_insert_column (cs_list, ec_target, -1); + self->priv->cs_view = (_tmp0_ = g_object_ref_sink ((GtkTreeView*) gtk_tree_view_new ()), _g_object_unref0 (self->priv->cs_view), _tmp0_); + gtk_tree_view_insert_column_with_data_func (self->priv->cs_view, -1, "", (GtkCellRenderer*) (_tmp1_ = g_object_ref_sink ((GtkCellRendererPixbuf*) gtk_cell_renderer_pixbuf_new ())), _gui_cs_view_current_dword_renderer_gtk_tree_cell_data_func, g_object_ref (self), g_object_unref); + _g_object_unref0 (_tmp1_); + ec_name = (_tmp3_ = g_object_ref_sink (gtk_tree_view_column_new_with_attributes ("Name", (GtkCellRenderer*) (_tmp2_ = g_object_ref_sink ((GtkCellRendererText*) gtk_cell_renderer_text_new ())), "text", GUI_CS_LIST_MODEL_COLUMNS_NAME, NULL, NULL)), _g_object_unref0 (_tmp2_), _tmp3_); + ec_value = (_tmp5_ = g_object_ref_sink (gtk_tree_view_column_new_with_attributes ("Value", (GtkCellRenderer*) (_tmp4_ = g_object_ref_sink ((GtkCellRendererText*) gtk_cell_renderer_text_new ())), "text", GUI_CS_LIST_MODEL_COLUMNS_VALUE, NULL, NULL)), _g_object_unref0 (_tmp4_), _tmp5_); + ec_target = (_tmp7_ = g_object_ref_sink (gtk_tree_view_column_new_with_attributes ("Target", (GtkCellRenderer*) (_tmp6_ = g_object_ref_sink ((GtkCellRendererText*) gtk_cell_renderer_text_new ())), "text", GUI_CS_LIST_MODEL_COLUMNS_TARGET, NULL, NULL)), _g_object_unref0 (_tmp6_), _tmp7_); + gtk_tree_view_insert_column (self->priv->cs_view, ec_name, -1); + gtk_tree_view_insert_column (self->priv->cs_view, ec_value, -1); + gtk_tree_view_insert_column (self->priv->cs_view, ec_target, -1); gtk_tree_view_column_set_resizable (ec_name, TRUE); gtk_tree_view_column_set_resizable (ec_value, TRUE); gtk_tree_view_column_set_resizable (ec_target, TRUE); - gtk_tree_view_set_model (cs_list, (GtkTreeModel*) (self->priv->m_pkg_store = (_tmp7_ = gui_cs_list_model_new (cs, spec), _g_object_unref0 (self->priv->m_pkg_store), _tmp7_))); - gtk_tree_view_set_expander_column (cs_list, ec_name); + self->priv->models = (_tmp8_ = g_new0 (GUICSListModel*, emulation_specs_length1 + 1), self->priv->models = (_vala_array_free (self->priv->models, self->priv->models_length1, (GDestroyNotify) g_object_unref), NULL), self->priv->models_length1 = emulation_specs_length1, self->priv->models_size = self->priv->models_length1, _tmp8_); + chips = g_object_ref_sink ((GtkComboBox*) gtk_combo_box_new_text ()); + { + guint i; + i = (guint) 0; + { + gboolean _tmp9_; + _tmp9_ = TRUE; + while (TRUE) { + GUICSListModel* _tmp10_; + if (!_tmp9_) { + i++; + } + _tmp9_ = FALSE; + if (!(i < emulation_specs_length1)) { + break; + } + gtk_combo_box_append_text (chips, emulation_specs[i].name); + self->priv->models[i] = (_tmp10_ = gui_cs_list_model_new (cs, emulation_specs[i].spec), _g_object_unref0 (self->priv->models[i]), _tmp10_); + } + } + } + gtk_combo_box_set_active (chips, (gint) emulation_spec_default); + g_signal_connect_object (chips, "changed", (GCallback) __lambda8__gtk_combo_box_changed, self, 0); + gtk_tree_view_set_model (self->priv->cs_view, (GtkTreeModel*) self->priv->models[emulation_spec_default]); + gtk_tree_view_set_expander_column (self->priv->cs_view, ec_name); cs_sw = g_object_ref_sink ((GtkScrolledWindow*) gtk_scrolled_window_new (NULL, NULL)); - gtk_container_add ((GtkContainer*) cs_sw, (GtkWidget*) cs_list); + gtk_container_add ((GtkContainer*) cs_sw, (GtkWidget*) self->priv->cs_view); gtk_scrolled_window_set_shadow_type (cs_sw, GTK_SHADOW_ETCHED_IN); g_object_set (cs_sw, "hscrollbar-policy", GTK_POLICY_AUTOMATIC, NULL); g_object_set (cs_sw, "vscrollbar-policy", GTK_POLICY_AUTOMATIC, NULL); + chip_label = g_object_ref_sink ((GtkLabel*) gtk_label_new (NULL)); + gtk_label_set_markup (chip_label, "<b>Emulated chip:</b>"); + chips_box = g_object_ref_sink ((GtkHBox*) gtk_hbox_new (FALSE, 4)); + gtk_box_pack_start ((GtkBox*) chips_box, (GtkWidget*) chip_label, FALSE, FALSE, (guint) 0); + gtk_box_pack_start ((GtkBox*) chips_box, (GtkWidget*) chips, FALSE, FALSE, (guint) 0); + self->priv->up_btn = (_tmp11_ = g_object_ref_sink ((GtkButton*) gtk_button_new ()), _g_object_unref0 (self->priv->up_btn), _tmp11_); + gtk_container_add ((GtkContainer*) self->priv->up_btn, (GtkWidget*) (_tmp12_ = g_object_ref_sink ((GtkImage*) gtk_image_new_from_stock ("gtk-go-up", GTK_ICON_SIZE_BUTTON)))); + _g_object_unref0 (_tmp12_); + self->priv->down_btn = (_tmp13_ = g_object_ref_sink ((GtkButton*) gtk_button_new ()), _g_object_unref0 (self->priv->down_btn), _tmp13_); + gtk_container_add ((GtkContainer*) self->priv->down_btn, (GtkWidget*) (_tmp14_ = g_object_ref_sink ((GtkImage*) gtk_image_new_from_stock ("gtk-go-down", GTK_ICON_SIZE_BUTTON)))); + _g_object_unref0 (_tmp14_); + btnbox = g_object_ref_sink ((GtkVBox*) gtk_vbox_new (FALSE, 0)); + gtk_box_pack_start ((GtkBox*) btnbox, (GtkWidget*) self->priv->up_btn, FALSE, FALSE, (guint) 0); + gtk_box_pack_end ((GtkBox*) btnbox, (GtkWidget*) self->priv->down_btn, FALSE, FALSE, (guint) 0); + hbl = g_object_ref_sink ((GtkHBox*) gtk_hbox_new (FALSE, 4)); + gtk_box_pack_start ((GtkBox*) hbl, (GtkWidget*) cs_sw, TRUE, TRUE, (guint) 0); + gtk_box_pack_start ((GtkBox*) hbl, (GtkWidget*) btnbox, FALSE, TRUE, (guint) 0); vbl = g_object_ref_sink ((GtkVBox*) gtk_vbox_new (FALSE, 4)); - gtk_box_pack_start ((GtkBox*) vbl, (GtkWidget*) (self->priv->m_pkgup = (_tmp8_ = g_object_ref_sink ((GtkButton*) gtk_button_new_from_stock ("gtk-go-up")), _g_object_unref0 (self->priv->m_pkgup), _tmp8_)), FALSE, TRUE, (guint) 0); - gtk_box_pack_start ((GtkBox*) vbl, (GtkWidget*) cs_sw, TRUE, TRUE, (guint) 0); - gtk_box_pack_start ((GtkBox*) vbl, (GtkWidget*) (self->priv->m_pkgdown = (_tmp9_ = g_object_ref_sink ((GtkButton*) gtk_button_new_from_stock ("gtk-go-down")), _g_object_unref0 (self->priv->m_pkgdown), _tmp9_)), FALSE, TRUE, (guint) 0); + gtk_box_pack_start ((GtkBox*) vbl, (GtkWidget*) chips_box, FALSE, TRUE, (guint) 0); + gtk_box_pack_start ((GtkBox*) vbl, (GtkWidget*) hbl, TRUE, TRUE, (guint) 0); gtk_container_add ((GtkContainer*) self, (GtkWidget*) vbl); gtk_container_set_border_width ((GtkContainer*) self, (guint) 10); gtk_window_set_default_size ((GtkWindow*) self, 640, 480); - _g_object_unref0 (cs_list); _g_object_unref0 (ec_name); _g_object_unref0 (ec_value); _g_object_unref0 (ec_target); + _g_object_unref0 (chips); _g_object_unref0 (cs_sw); + _g_object_unref0 (chip_label); + _g_object_unref0 (chips_box); + _g_object_unref0 (btnbox); + _g_object_unref0 (hbl); _g_object_unref0 (vbl); return self; } -GUICSView* gui_cs_view_new (EmulationCS* cs, EmulationSpec* spec) { - return gui_cs_view_construct (GUI_TYPE_CS_VIEW, cs, spec); +GUICSView* gui_cs_view_new (EmulationCS* cs) { + return gui_cs_view_construct (GUI_TYPE_CS_VIEW, cs); } @@ -2133,9 +2217,10 @@ static void gui_cs_view_instance_init (GUICSView * self) { static void gui_cs_view_finalize (GObject* obj) { GUICSView * self; self = GUI_CS_VIEW (obj); - _g_object_unref0 (self->priv->m_pkgup); - _g_object_unref0 (self->priv->m_pkgdown); - _g_object_unref0 (self->priv->m_pkg_store); + _g_object_unref0 (self->priv->up_btn); + _g_object_unref0 (self->priv->down_btn); + self->priv->models = (_vala_array_free (self->priv->models, self->priv->models_length1, (GDestroyNotify) g_object_unref), NULL); + _g_object_unref0 (self->priv->cs_view); G_OBJECT_CLASS (gui_cs_view_parent_class)->finalize (obj); } @@ -2150,5 +2235,23 @@ GType gui_cs_view_get_type (void) { } +static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func) { + if ((array != NULL) && (destroy_func != NULL)) { + int i; + for (i = 0; i < array_length; i = i + 1) { + if (((gpointer*) array)[i] != NULL) { + destroy_func (((gpointer*) array)[i]); + } + } + } +} + + +static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func) { + _vala_array_destroy (array, array_length, destroy_func); + g_free (array); +} + + diff --git a/src/csview.vala b/src/csview.vala index b2c0374..18371fe 100644 --- a/src/csview.vala +++ b/src/csview.vala @@ -3,6 +3,10 @@ using Emulation; namespace GUI { + /* The fantastic thing about this model is that it doesn't copy the + * contents of the given CS, and has virtually no creation overhead. This + * means that we can create as many as we want of them and not really waste + * any space or CPU time. It makes the code a little cumbersome though. */ public class CSListModel : GLib.Object, TreeModel { public enum Columns @@ -669,42 +673,72 @@ namespace GUI public class CSView : Window { //private CS m_cs; - private Button m_pkgup; - private Button m_pkgdown; - private CSListModel m_pkg_store; + private Button up_btn; + private Button down_btn; + private CSListModel[] models; + private TreeView cs_view; //private ListStore m_reg_store; //private ListStore m_raw_store; private uint m_pos; - public CSView(CS cs, Spec spec) + public CSView(CS cs) { //m_cs = cs; m_pos = 0; - var cs_list = new TreeView(); - cs_list.insert_column_with_data_func(-1, "", new Gtk.CellRendererPixbuf(), current_dword_renderer); + cs_view = new TreeView(); + cs_view.insert_column_with_data_func(-1, "", new Gtk.CellRendererPixbuf(), current_dword_renderer); var ec_name = new Gtk.TreeViewColumn.with_attributes("Name", new Gtk.CellRendererText(), "text", CSListModel.Columns.NAME, null); var ec_value = new Gtk.TreeViewColumn.with_attributes("Value", new Gtk.CellRendererText(), "text", CSListModel.Columns.VALUE, null); var ec_target = new Gtk.TreeViewColumn.with_attributes("Target", new Gtk.CellRendererText(), "text", CSListModel.Columns.TARGET, null); - cs_list.insert_column(ec_name, -1); - cs_list.insert_column(ec_value, -1); - cs_list.insert_column(ec_target, -1); + cs_view.insert_column(ec_name, -1); + cs_view.insert_column(ec_value, -1); + cs_view.insert_column(ec_target, -1); ec_name.resizable = true; ec_value.resizable = true; ec_target.resizable = true; - cs_list.set_model(m_pkg_store = new CSListModel(cs, spec)); - cs_list.set_expander_column(ec_name); + + models = new CSListModel[specs.length]; + var chips = new ComboBox.text(); + for (uint i = 0; i < specs.length; i++) { + chips.append_text(specs[i].name); + models[i] = new CSListModel(cs, specs[i].spec); + } + chips.set_active((int)spec_default); + chips.changed.connect((combo) => { cs_view.set_model(models[combo.get_active()]); }); + + cs_view.set_model(models[spec_default]); + cs_view.set_expander_column(ec_name); var cs_sw = new ScrolledWindow(null, null); - cs_sw.add(cs_list); + cs_sw.add(cs_view); cs_sw.shadow_type = ShadowType.ETCHED_IN; cs_sw.hscrollbar_policy = PolicyType.AUTOMATIC; cs_sw.vscrollbar_policy = PolicyType.AUTOMATIC; + var chip_label = new Label(null); + chip_label.set_markup("<b>Emulated chip:</b>"); + + var chips_box = new HBox(false, 4); + chips_box.pack_start(chip_label, false, false, 0); + chips_box.pack_start(chips, false, false, 0); + + up_btn = new Button(); + up_btn.add(new Image.from_stock("gtk-go-up", IconSize.BUTTON)); + down_btn = new Button(); + down_btn.add(new Image.from_stock("gtk-go-down", IconSize.BUTTON)); + + var btnbox = new VBox(false, 0); + btnbox.pack_start(up_btn, false, false, 0); + btnbox.pack_end(down_btn, false, false, 0); + + var hbl = new HBox(false, 4); + hbl.pack_start(cs_sw, true, true, 0); + hbl.pack_start(btnbox, false, true, 0); + var vbl = new VBox(false, 4); - vbl.pack_start(m_pkgup = new Button.from_stock("gtk-go-up"), false, true, 0); - vbl.pack_start(cs_sw, true, true, 0); - vbl.pack_start(m_pkgdown = new Button.from_stock("gtk-go-down"), false, true, 0); + vbl.pack_start(chips_box, false, true, 0); + vbl.pack_start(hbl, true, true, 0); /*var state_reg_list = new TreeView(); state_reg_list.set_model(m_reg_store = new ListStore(2, typeof(string), typeof(uint32))); @@ -735,12 +769,12 @@ namespace GUI paned.position = 400;*/ //this.add(paned); - this.add(vbl); - this.border_width = 10; - this.set_default_size(640, 480); + add(vbl); + border_width = 10; + set_default_size(640, 480); } - private void current_dword_renderer(Gtk.TreeViewColumn tree_column, Gtk.CellRenderer cell, Gtk.TreeModel model, Gtk.TreeIter iter) + private void current_dword_renderer(TreeViewColumn tree_column, CellRenderer cell, TreeModel model, TreeIter iter) { /*if (m_pos == (model as CSListModel).get_packet_num(iter)) { (cell as Gtk.CellRendererPixbuf).stock_id = "gtk-media-record"; @@ -750,4 +784,3 @@ namespace GUI } } } - @@ -24,8 +24,6 @@ typedef struct _GUICActionsClass GUICActionsClass; typedef struct _GUICActionsPrivate GUICActionsPrivate; #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL))) -#define EMULATION_TYPE_CHIP (emulation_chip_get_type ()) - #define GUI_TYPE_CS_IMPORT (gui_cs_import_get_type ()) #define GUI_CS_IMPORT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GUI_TYPE_CS_IMPORT, GUICSImport)) #define GUI_CS_IMPORT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GUI_TYPE_CS_IMPORT, GUICSImportClass)) @@ -82,16 +80,6 @@ typedef struct _EmulationPacketBase EmulationPacketBase; typedef struct _EmulationPacketBaseClass EmulationPacketBaseClass; #define _g_free0(var) (var = (g_free (var), NULL)) -#define EMULATION_TYPE_SPEC (emulation_spec_get_type ()) -#define EMULATION_SPEC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EMULATION_TYPE_SPEC, EmulationSpec)) -#define EMULATION_SPEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EMULATION_TYPE_SPEC, EmulationSpecClass)) -#define EMULATION_IS_SPEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EMULATION_TYPE_SPEC)) -#define EMULATION_IS_SPEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EMULATION_TYPE_SPEC)) -#define EMULATION_SPEC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EMULATION_TYPE_SPEC, EmulationSpecClass)) - -typedef struct _EmulationSpec EmulationSpec; -typedef struct _EmulationSpecClass EmulationSpecClass; - #define GUI_TYPE_CS_VIEW (gui_cs_view_get_type ()) #define GUI_CS_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GUI_TYPE_CS_VIEW, GUICSView)) #define GUI_CS_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GUI_TYPE_CS_VIEW, GUICSViewClass)) @@ -101,18 +89,31 @@ typedef struct _EmulationSpecClass EmulationSpecClass; typedef struct _GUICSView GUICSView; typedef struct _GUICSViewClass GUICSViewClass; +#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL))) -#define TYPE_SPEC_LOAD_DIALOG (spec_load_dialog_get_type ()) -#define SPEC_LOAD_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SPEC_LOAD_DIALOG, SpecLoadDialog)) -#define SPEC_LOAD_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SPEC_LOAD_DIALOG, SpecLoadDialogClass)) -#define IS_SPEC_LOAD_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SPEC_LOAD_DIALOG)) -#define IS_SPEC_LOAD_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SPEC_LOAD_DIALOG)) -#define SPEC_LOAD_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SPEC_LOAD_DIALOG, SpecLoadDialogClass)) +#define EMULATION_TYPE_SPEC_LOAD_DIALOG (emulation_spec_load_dialog_get_type ()) +#define EMULATION_SPEC_LOAD_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EMULATION_TYPE_SPEC_LOAD_DIALOG, EmulationSpecLoadDialog)) +#define EMULATION_SPEC_LOAD_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EMULATION_TYPE_SPEC_LOAD_DIALOG, EmulationSpecLoadDialogClass)) +#define EMULATION_IS_SPEC_LOAD_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EMULATION_TYPE_SPEC_LOAD_DIALOG)) +#define EMULATION_IS_SPEC_LOAD_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EMULATION_TYPE_SPEC_LOAD_DIALOG)) +#define EMULATION_SPEC_LOAD_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EMULATION_TYPE_SPEC_LOAD_DIALOG, EmulationSpecLoadDialogClass)) -typedef struct _SpecLoadDialog SpecLoadDialog; -typedef struct _SpecLoadDialogClass SpecLoadDialogClass; -#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL))) -typedef struct _SpecLoadDialogPrivate SpecLoadDialogPrivate; +typedef struct _EmulationSpecLoadDialog EmulationSpecLoadDialog; +typedef struct _EmulationSpecLoadDialogClass EmulationSpecLoadDialogClass; + +#define EMULATION_TYPE_SPEC_ENTRY (emulation_spec_entry_get_type ()) + +#define EMULATION_TYPE_SPEC (emulation_spec_get_type ()) +#define EMULATION_SPEC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EMULATION_TYPE_SPEC, EmulationSpec)) +#define EMULATION_SPEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EMULATION_TYPE_SPEC, EmulationSpecClass)) +#define EMULATION_IS_SPEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EMULATION_TYPE_SPEC)) +#define EMULATION_IS_SPEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EMULATION_TYPE_SPEC)) +#define EMULATION_SPEC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EMULATION_TYPE_SPEC, EmulationSpecClass)) + +typedef struct _EmulationSpec EmulationSpec; +typedef struct _EmulationSpecClass EmulationSpecClass; +typedef struct _EmulationSpecEntry EmulationSpecEntry; +typedef struct _EmulationSpecLoadDialogPrivate EmulationSpecLoadDialogPrivate; struct _GUICActions { GObject parent_instance; @@ -125,26 +126,18 @@ struct _GUICActions { GtkAction* ImportCS; GtkAction* ExportCS; GtkAction* Quit; - GtkRadioAction* EmulateR300; - GtkRadioAction* EmulateR500; }; struct _GUICActionsClass { GObjectClass parent_class; }; -typedef enum { - EMULATION_CHIP_R300, - EMULATION_CHIP_R500 -} EmulationChip; - struct _GUICMenus { GTypeInstance parent_instance; volatile int ref_count; GUICMenusPrivate * priv; GtkMenu* file; GtkMenu* edit; - GtkMenu* emulation; }; struct _GUICMenusClass { @@ -182,16 +175,21 @@ struct _EmulationCSClass { GObjectClass parent_class; }; -struct _SpecLoadDialog { +struct _EmulationSpecEntry { + EmulationSpec* spec; + char* name; +}; + +struct _EmulationSpecLoadDialog { GtkWindow parent_instance; - SpecLoadDialogPrivate * priv; + EmulationSpecLoadDialogPrivate * priv; }; -struct _SpecLoadDialogClass { +struct _EmulationSpecLoadDialogClass { GtkWindowClass parent_class; }; -struct _SpecLoadDialogPrivate { +struct _EmulationSpecLoadDialogPrivate { GtkLabel* loading; GtkProgressBar* progress; gboolean done; @@ -200,16 +198,18 @@ struct _SpecLoadDialogPrivate { static gpointer gui_cactions_parent_class = NULL; static gpointer gui_cmenus_parent_class = NULL; -extern EmulationSpec* r500_registers; extern GUICActions* gui_actions; static gpointer gui_cmain_parent_class = NULL; GUICActions* gui_actions = NULL; extern GUICMain* gui_main; GUICMain* gui_main = NULL; -extern EmulationSpec* r300_registers; -EmulationSpec* r300_registers = NULL; -EmulationSpec* r500_registers = NULL; -static gpointer spec_load_dialog_parent_class = NULL; +extern EmulationSpecEntry* emulation_specs; +extern gint emulation_specs_length1; +EmulationSpecEntry* emulation_specs = NULL; +gint emulation_specs_length1 = 0; +extern guint emulation_spec_default; +guint emulation_spec_default = (guint) 1; +static gpointer emulation_spec_load_dialog_parent_class = NULL; GType gui_cactions_get_type (void); enum { @@ -217,12 +217,11 @@ enum { }; GUICActions* gui_cactions_new (void); GUICActions* gui_cactions_construct (GType object_type); -GType emulation_chip_get_type (void); GUICSImport* gui_cs_import_new (void); GUICSImport* gui_cs_import_construct (GType object_type); GType gui_cs_import_get_type (void); -static void _lambda8_ (GtkAction* source, GUICActions* self); -static void __lambda8__gtk_action_activate (GtkAction* _sender, gpointer self); +static void _lambda9_ (GtkAction* source, GUICActions* self); +static void __lambda9__gtk_action_activate (GtkAction* _sender, gpointer self); static GObject * gui_cactions_constructor (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties); static void gui_cactions_finalize (GObject* obj); gpointer gui_cmenus_ref (gpointer instance); @@ -245,9 +244,8 @@ static void gui_cmain_add_toolitem (GUICMain* self, GtkAction* action); GType emulation_cs_get_type (void); GType emulation_packet_base_get_type (void); static void gui_cmain_dwords_cellrenderer (GUICMain* self, GtkTreeViewColumn* tree_column, GtkCellRenderer* cell, GtkTreeModel* model, GtkTreeIter* iter); -GType emulation_spec_get_type (void); -GUICSView* gui_cs_view_new (EmulationCS* cs, EmulationSpec* spec); -GUICSView* gui_cs_view_construct (GType object_type, EmulationCS* cs, EmulationSpec* spec); +GUICSView* gui_cs_view_new (EmulationCS* cs); +GUICSView* gui_cs_view_construct (GType object_type, EmulationCS* cs); GType gui_cs_view_get_type (void); static void gui_cmain_open_csview (GUICMain* self, GtkTreePath* path, GtkTreeViewColumn* column); GUICMain* gui_cmain_new (void); @@ -257,23 +255,30 @@ static void _gui_cmain_open_csview_gtk_tree_view_row_activated (GtkTreeView* _se static void _gtk_main_quit_gtk_object_destroy (GtkObject* _sender, gpointer self); static GObject * gui_cmain_constructor (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties); static void gui_cmain_finalize (GObject* obj); -SpecLoadDialog* spec_load_dialog_new (GtkWindow* parent); -SpecLoadDialog* spec_load_dialog_construct (GType object_type, GtkWindow* parent); -GType spec_load_dialog_get_type (void); -void* spec_load_dialog_run (SpecLoadDialog* self); -static void* _spec_load_dialog_run_gthread_func (gpointer self); +EmulationSpecLoadDialog* emulation_spec_load_dialog_new (GtkWindow* parent); +EmulationSpecLoadDialog* emulation_spec_load_dialog_construct (GType object_type, GtkWindow* parent); +GType emulation_spec_load_dialog_get_type (void); +void* emulation_spec_load_dialog_run (EmulationSpecLoadDialog* self); +static void* _emulation_spec_load_dialog_run_gthread_func (gpointer self); void gui_init (char*** args, int* args_length1); -#define SPEC_LOAD_DIALOG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_SPEC_LOAD_DIALOG, SpecLoadDialogPrivate)) +GType emulation_spec_entry_get_type (void); +GType emulation_spec_get_type (void); +EmulationSpecEntry* emulation_spec_entry_dup (const EmulationSpecEntry* self); +void emulation_spec_entry_free (EmulationSpecEntry* self); +void emulation_spec_entry_copy (const EmulationSpecEntry* self, EmulationSpecEntry* dest); +void emulation_spec_entry_destroy (EmulationSpecEntry* self); +#define EMULATION_SPEC_LOAD_DIALOG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), EMULATION_TYPE_SPEC_LOAD_DIALOG, EmulationSpecLoadDialogPrivate)) enum { - SPEC_LOAD_DIALOG_DUMMY_PROPERTY + EMULATION_SPEC_LOAD_DIALOG_DUMMY_PROPERTY }; -static void* spec_load_dialog_pulse_thread (SpecLoadDialog* self); -static void* _spec_load_dialog_pulse_thread_gthread_func (gpointer self); -static void* spec_load_dialog_specload_thread (SpecLoadDialog* self); -static void* _spec_load_dialog_specload_thread_gthread_func (gpointer self); +static void _vala_EmulationSpecEntry_array_free (EmulationSpecEntry* array, gint array_length); +static void* emulation_spec_load_dialog_pulse_thread (EmulationSpecLoadDialog* self); +static void* _emulation_spec_load_dialog_pulse_thread_gthread_func (gpointer self); +static void* emulation_spec_load_dialog_specload_thread (EmulationSpecLoadDialog* self); +static void* _emulation_spec_load_dialog_specload_thread_gthread_func (gpointer self); EmulationSpec* emulation_spec_new (const char* filename, const char* variant); EmulationSpec* emulation_spec_construct (GType object_type, const char* filename, const char* variant); -static void spec_load_dialog_finalize (GObject* obj); +static void emulation_spec_load_dialog_finalize (GObject* obj); gint _main (char** args, int args_length1); @@ -290,7 +295,7 @@ GUICActions* gui_cactions_new (void) { } -static void _lambda8_ (GtkAction* source, GUICActions* self) { +static void _lambda9_ (GtkAction* source, GUICActions* self) { GUICSImport* d; g_return_if_fail (source != NULL); d = g_object_ref_sink (gui_cs_import_new ()); @@ -299,8 +304,8 @@ static void _lambda8_ (GtkAction* source, GUICActions* self) { } -static void __lambda8__gtk_action_activate (GtkAction* _sender, gpointer self) { - _lambda8_ (_sender, self); +static void __lambda9__gtk_action_activate (GtkAction* _sender, gpointer self) { + _lambda9_ (_sender, self); } @@ -320,8 +325,6 @@ static GObject * gui_cactions_constructor (GType type, guint n_construct_propert GtkAction* _tmp5_; GtkAction* _tmp6_; GtkAction* _tmp7_; - GtkRadioAction* _tmp8_; - GtkRadioAction* _tmp9_; self->New = (_tmp0_ = gtk_action_new ("New", NULL, NULL, "gtk-new"), _g_object_unref0 (self->New), _tmp0_); self->Open = (_tmp1_ = gtk_action_new ("Open", NULL, NULL, "gtk-open"), _g_object_unref0 (self->Open), _tmp1_); self->Save = (_tmp2_ = gtk_action_new ("Save", NULL, NULL, "gtk-save"), _g_object_unref0 (self->Save), _tmp2_); @@ -330,11 +333,7 @@ static GObject * gui_cactions_constructor (GType type, guint n_construct_propert self->ImportCS = (_tmp5_ = gtk_action_new ("ImportCS", "Import", "Import a command stream to the list", "gtk-add"), _g_object_unref0 (self->ImportCS), _tmp5_); self->ExportCS = (_tmp6_ = gtk_action_new ("ExportCS", "Export", "Export a CS to a file", "gtk-convert"), _g_object_unref0 (self->ExportCS), _tmp6_); self->Quit = (_tmp7_ = gtk_action_new ("Quit", NULL, NULL, "gtk-quit"), _g_object_unref0 (self->Quit), _tmp7_); - self->EmulateR300 = (_tmp8_ = gtk_radio_action_new ("EmulateR300", "R300", "Emulate the R300 register space", NULL, (gint) EMULATION_CHIP_R300), _g_object_unref0 (self->EmulateR300), _tmp8_); - self->EmulateR500 = (_tmp9_ = gtk_radio_action_new ("EmulateR500", "R500", "Emulate the R500 register space", NULL, (gint) EMULATION_CHIP_R500), _g_object_unref0 (self->EmulateR500), _tmp9_); - gtk_radio_action_set_group (self->EmulateR500, gtk_radio_action_get_group (self->EmulateR300)); - gtk_radio_action_set_current_value (self->EmulateR300, (gint) EMULATION_CHIP_R300); - g_signal_connect_object (self->ImportCS, "activate", (GCallback) __lambda8__gtk_action_activate, self, 0); + g_signal_connect_object (self->ImportCS, "activate", (GCallback) __lambda9__gtk_action_activate, self, 0); } return obj; } @@ -362,8 +361,6 @@ static void gui_cactions_finalize (GObject* obj) { _g_object_unref0 (self->ImportCS); _g_object_unref0 (self->ExportCS); _g_object_unref0 (self->Quit); - _g_object_unref0 (self->EmulateR300); - _g_object_unref0 (self->EmulateR500); G_OBJECT_CLASS (gui_cactions_parent_class)->finalize (obj); } @@ -499,7 +496,6 @@ static void gui_cmenus_finalize (GUICMenus* obj) { self = GUI_CMENUS (obj); _g_object_unref0 (self->file); _g_object_unref0 (self->edit); - _g_object_unref0 (self->emulation); } @@ -577,7 +573,7 @@ static void gui_cmain_open_csview (GUICMain* self, GtkTreePath* path, GtkTreeVie cs = NULL; gtk_tree_model_get_iter ((GtkTreeModel*) self->cs_store, &iter, path); gtk_tree_model_get ((GtkTreeModel*) self->cs_store, &iter, 1, &cs, -1, -1); - csv = g_object_ref_sink (gui_cs_view_new (cs, r500_registers)); + csv = g_object_ref_sink (gui_cs_view_new (cs)); gtk_widget_show_all ((GtkWidget*) csv); _g_object_unref0 (cs); _g_object_unref0 (csv); @@ -621,76 +617,66 @@ static GObject * gui_cmain_constructor (GType type, guint n_construct_properties self = GUI_CMAIN (obj); _inner_error_ = NULL; { - GUICMenus* _tmp10_; - GtkToolbar* _tmp11_; - GtkToolItem* _tmp13_; - GtkSeparatorToolItem* _tmp12_; - GtkMenu* _tmp14_; + GUICMenus* _tmp8_; + GtkToolbar* _tmp9_; + GtkToolItem* _tmp11_; + GtkSeparatorToolItem* _tmp10_; + GtkMenu* _tmp12_; + GtkWidget* _tmp13_; + GtkWidget* _tmp14_; GtkWidget* _tmp15_; GtkWidget* _tmp16_; - GtkWidget* _tmp17_; - GtkWidget* _tmp18_; - GtkMenuItem* _tmp20_; - GtkSeparatorMenuItem* _tmp19_; - GtkWidget* _tmp21_; + GtkMenuItem* _tmp18_; + GtkSeparatorMenuItem* _tmp17_; + GtkWidget* _tmp19_; GtkMenuItem* menu_file_item; - GtkMenu* _tmp22_; + GtkMenu* _tmp20_; + GtkWidget* _tmp21_; + GtkWidget* _tmp22_; GtkWidget* _tmp23_; - GtkWidget* _tmp24_; - GtkWidget* _tmp25_; GtkMenuItem* menu_edit_item; - GtkMenu* _tmp26_; - GtkWidget* _tmp27_; - GtkWidget* _tmp28_; - GtkMenuItem* menu_emulation_item; - GtkMenuBar* _tmp29_; - GtkListStore* _tmp30_; + GtkMenuBar* _tmp24_; + GtkListStore* _tmp25_; GtkTreeView* cslist; - GtkCellRendererText* _tmp31_; - GtkCellRendererText* _tmp32_; + GtkCellRendererText* _tmp26_; + GtkCellRendererText* _tmp27_; GtkScrolledWindow* sw; GtkVBox* mainbox; - self->menu = (_tmp10_ = gui_cmenus_new (), _gui_cmenus_unref0 (self->menu), _tmp10_); - self->toolbar = (_tmp11_ = g_object_ref_sink ((GtkToolbar*) gtk_toolbar_new ()), _g_object_unref0 (self->toolbar), _tmp11_); + self->menu = (_tmp8_ = gui_cmenus_new (), _gui_cmenus_unref0 (self->menu), _tmp8_); + self->toolbar = (_tmp9_ = g_object_ref_sink ((GtkToolbar*) gtk_toolbar_new ()), _g_object_unref0 (self->toolbar), _tmp9_); gui_cmain_add_toolitem (self, gui_actions->New); gui_cmain_add_toolitem (self, gui_actions->Open); gui_cmain_add_toolitem (self, gui_actions->Save); - gtk_toolbar_insert (self->toolbar, _tmp13_ = (_tmp12_ = g_object_ref_sink ((GtkSeparatorToolItem*) gtk_separator_tool_item_new ()), GTK_IS_TOOL_ITEM (_tmp12_) ? ((GtkToolItem*) _tmp12_) : NULL), -1); - _g_object_unref0 (_tmp13_); + gtk_toolbar_insert (self->toolbar, _tmp11_ = (_tmp10_ = g_object_ref_sink ((GtkSeparatorToolItem*) gtk_separator_tool_item_new ()), GTK_IS_TOOL_ITEM (_tmp10_) ? ((GtkToolItem*) _tmp10_) : NULL), -1); + _g_object_unref0 (_tmp11_); gui_cmain_add_toolitem (self, gui_actions->RemoveCS); gui_cmain_add_toolitem (self, gui_actions->ImportCS); gui_cmain_add_toolitem (self, gui_actions->ExportCS); - self->menu->file = (_tmp14_ = g_object_ref_sink ((GtkMenu*) gtk_menu_new ()), _g_object_unref0 (self->menu->file), _tmp14_); - gtk_menu_shell_append ((GtkMenuShell*) self->menu->file, (GtkWidget*) (_tmp15_ = gtk_action_create_menu_item (gui_actions->New), GTK_IS_MENU_ITEM (_tmp15_) ? ((GtkMenuItem*) _tmp15_) : NULL)); - gtk_menu_shell_append ((GtkMenuShell*) self->menu->file, (GtkWidget*) (_tmp16_ = gtk_action_create_menu_item (gui_actions->Open), GTK_IS_MENU_ITEM (_tmp16_) ? ((GtkMenuItem*) _tmp16_) : NULL)); - gtk_menu_shell_append ((GtkMenuShell*) self->menu->file, (GtkWidget*) (_tmp17_ = gtk_action_create_menu_item (gui_actions->Save), GTK_IS_MENU_ITEM (_tmp17_) ? ((GtkMenuItem*) _tmp17_) : NULL)); - gtk_menu_shell_append ((GtkMenuShell*) self->menu->file, (GtkWidget*) (_tmp18_ = gtk_action_create_menu_item (gui_actions->SaveAs), GTK_IS_MENU_ITEM (_tmp18_) ? ((GtkMenuItem*) _tmp18_) : NULL)); - gtk_menu_shell_append ((GtkMenuShell*) self->menu->file, (GtkWidget*) (_tmp20_ = (_tmp19_ = g_object_ref_sink ((GtkSeparatorMenuItem*) gtk_separator_menu_item_new ()), GTK_IS_MENU_ITEM (_tmp19_) ? ((GtkMenuItem*) _tmp19_) : NULL))); - _g_object_unref0 (_tmp20_); - gtk_menu_shell_append ((GtkMenuShell*) self->menu->file, (GtkWidget*) (_tmp21_ = gtk_action_create_menu_item (gui_actions->Quit), GTK_IS_MENU_ITEM (_tmp21_) ? ((GtkMenuItem*) _tmp21_) : NULL)); + self->menu->file = (_tmp12_ = g_object_ref_sink ((GtkMenu*) gtk_menu_new ()), _g_object_unref0 (self->menu->file), _tmp12_); + gtk_menu_shell_append ((GtkMenuShell*) self->menu->file, (GtkWidget*) (_tmp13_ = gtk_action_create_menu_item (gui_actions->New), GTK_IS_MENU_ITEM (_tmp13_) ? ((GtkMenuItem*) _tmp13_) : NULL)); + gtk_menu_shell_append ((GtkMenuShell*) self->menu->file, (GtkWidget*) (_tmp14_ = gtk_action_create_menu_item (gui_actions->Open), GTK_IS_MENU_ITEM (_tmp14_) ? ((GtkMenuItem*) _tmp14_) : NULL)); + gtk_menu_shell_append ((GtkMenuShell*) self->menu->file, (GtkWidget*) (_tmp15_ = gtk_action_create_menu_item (gui_actions->Save), GTK_IS_MENU_ITEM (_tmp15_) ? ((GtkMenuItem*) _tmp15_) : NULL)); + gtk_menu_shell_append ((GtkMenuShell*) self->menu->file, (GtkWidget*) (_tmp16_ = gtk_action_create_menu_item (gui_actions->SaveAs), GTK_IS_MENU_ITEM (_tmp16_) ? ((GtkMenuItem*) _tmp16_) : NULL)); + gtk_menu_shell_append ((GtkMenuShell*) self->menu->file, (GtkWidget*) (_tmp18_ = (_tmp17_ = g_object_ref_sink ((GtkSeparatorMenuItem*) gtk_separator_menu_item_new ()), GTK_IS_MENU_ITEM (_tmp17_) ? ((GtkMenuItem*) _tmp17_) : NULL))); + _g_object_unref0 (_tmp18_); + gtk_menu_shell_append ((GtkMenuShell*) self->menu->file, (GtkWidget*) (_tmp19_ = gtk_action_create_menu_item (gui_actions->Quit), GTK_IS_MENU_ITEM (_tmp19_) ? ((GtkMenuItem*) _tmp19_) : NULL)); menu_file_item = g_object_ref_sink ((GtkMenuItem*) gtk_menu_item_new_with_label ("File")); gtk_menu_item_set_submenu (menu_file_item, self->menu->file); - self->menu->edit = (_tmp22_ = g_object_ref_sink ((GtkMenu*) gtk_menu_new ()), _g_object_unref0 (self->menu->edit), _tmp22_); - gtk_menu_shell_append ((GtkMenuShell*) self->menu->edit, (GtkWidget*) (_tmp23_ = gtk_action_create_menu_item (gui_actions->RemoveCS), GTK_IS_MENU_ITEM (_tmp23_) ? ((GtkMenuItem*) _tmp23_) : NULL)); - gtk_menu_shell_append ((GtkMenuShell*) self->menu->edit, (GtkWidget*) (_tmp24_ = gtk_action_create_menu_item (gui_actions->ImportCS), GTK_IS_MENU_ITEM (_tmp24_) ? ((GtkMenuItem*) _tmp24_) : NULL)); - gtk_menu_shell_append ((GtkMenuShell*) self->menu->edit, (GtkWidget*) (_tmp25_ = gtk_action_create_menu_item (gui_actions->ExportCS), GTK_IS_MENU_ITEM (_tmp25_) ? ((GtkMenuItem*) _tmp25_) : NULL)); + self->menu->edit = (_tmp20_ = g_object_ref_sink ((GtkMenu*) gtk_menu_new ()), _g_object_unref0 (self->menu->edit), _tmp20_); + gtk_menu_shell_append ((GtkMenuShell*) self->menu->edit, (GtkWidget*) (_tmp21_ = gtk_action_create_menu_item (gui_actions->RemoveCS), GTK_IS_MENU_ITEM (_tmp21_) ? ((GtkMenuItem*) _tmp21_) : NULL)); + gtk_menu_shell_append ((GtkMenuShell*) self->menu->edit, (GtkWidget*) (_tmp22_ = gtk_action_create_menu_item (gui_actions->ImportCS), GTK_IS_MENU_ITEM (_tmp22_) ? ((GtkMenuItem*) _tmp22_) : NULL)); + gtk_menu_shell_append ((GtkMenuShell*) self->menu->edit, (GtkWidget*) (_tmp23_ = gtk_action_create_menu_item (gui_actions->ExportCS), GTK_IS_MENU_ITEM (_tmp23_) ? ((GtkMenuItem*) _tmp23_) : NULL)); menu_edit_item = g_object_ref_sink ((GtkMenuItem*) gtk_menu_item_new_with_label ("Edit")); gtk_menu_item_set_submenu (menu_edit_item, self->menu->edit); - self->menu->emulation = (_tmp26_ = g_object_ref_sink ((GtkMenu*) gtk_menu_new ()), _g_object_unref0 (self->menu->emulation), _tmp26_); - gtk_menu_shell_append ((GtkMenuShell*) self->menu->emulation, (GtkWidget*) (_tmp27_ = gtk_action_create_menu_item ((GtkAction*) gui_actions->EmulateR300), GTK_IS_MENU_ITEM (_tmp27_) ? ((GtkMenuItem*) _tmp27_) : NULL)); - gtk_menu_shell_append ((GtkMenuShell*) self->menu->emulation, (GtkWidget*) (_tmp28_ = gtk_action_create_menu_item ((GtkAction*) gui_actions->EmulateR500), GTK_IS_MENU_ITEM (_tmp28_) ? ((GtkMenuItem*) _tmp28_) : NULL)); - menu_emulation_item = g_object_ref_sink ((GtkMenuItem*) gtk_menu_item_new_with_label ("Emulation")); - gtk_menu_item_set_submenu (menu_emulation_item, self->menu->emulation); - self->menubar = (_tmp29_ = g_object_ref_sink ((GtkMenuBar*) gtk_menu_bar_new ()), _g_object_unref0 (self->menubar), _tmp29_); + self->menubar = (_tmp24_ = g_object_ref_sink ((GtkMenuBar*) gtk_menu_bar_new ()), _g_object_unref0 (self->menubar), _tmp24_); gtk_menu_shell_append ((GtkMenuShell*) self->menubar, (GtkWidget*) menu_file_item); gtk_menu_shell_append ((GtkMenuShell*) self->menubar, (GtkWidget*) menu_edit_item); - gtk_menu_shell_append ((GtkMenuShell*) self->menubar, (GtkWidget*) menu_emulation_item); - self->cs_store = (_tmp30_ = gtk_list_store_new (2, G_TYPE_STRING, EMULATION_TYPE_CS, NULL), _g_object_unref0 (self->cs_store), _tmp30_); + self->cs_store = (_tmp25_ = gtk_list_store_new (2, G_TYPE_STRING, EMULATION_TYPE_CS, NULL), _g_object_unref0 (self->cs_store), _tmp25_); cslist = g_object_ref_sink ((GtkTreeView*) gtk_tree_view_new ()); - gtk_tree_view_insert_column_with_data_func (cslist, -1, "DWORDs", (GtkCellRenderer*) (_tmp31_ = g_object_ref_sink ((GtkCellRendererText*) gtk_cell_renderer_text_new ())), _gui_cmain_dwords_cellrenderer_gtk_tree_cell_data_func, g_object_ref (self), g_object_unref); - _g_object_unref0 (_tmp31_); - gtk_tree_view_insert_column_with_attributes (cslist, -1, "Name", (GtkCellRenderer*) (_tmp32_ = g_object_ref_sink ((GtkCellRendererText*) gtk_cell_renderer_text_new ())), "text", 0, NULL, NULL); - _g_object_unref0 (_tmp32_); + gtk_tree_view_insert_column_with_data_func (cslist, -1, "DWORDs", (GtkCellRenderer*) (_tmp26_ = g_object_ref_sink ((GtkCellRendererText*) gtk_cell_renderer_text_new ())), _gui_cmain_dwords_cellrenderer_gtk_tree_cell_data_func, g_object_ref (self), g_object_unref); + _g_object_unref0 (_tmp26_); + gtk_tree_view_insert_column_with_attributes (cslist, -1, "Name", (GtkCellRenderer*) (_tmp27_ = g_object_ref_sink ((GtkCellRendererText*) gtk_cell_renderer_text_new ())), "text", 0, NULL, NULL); + _g_object_unref0 (_tmp27_); gtk_tree_view_set_model (cslist, (GtkTreeModel*) self->cs_store); g_signal_connect_object (cslist, "row-activated", (GCallback) _gui_cmain_open_csview_gtk_tree_view_row_activated, self, 0); sw = g_object_ref_sink ((GtkScrolledWindow*) gtk_scrolled_window_new (NULL, NULL)); @@ -705,11 +691,26 @@ static GObject * gui_cmain_constructor (GType type, guint n_construct_properties gtk_window_set_title ((GtkWindow*) self, "Radeon Simulator"); gtk_container_add ((GtkContainer*) self, (GtkWidget*) mainbox); g_signal_connect ((GtkObject*) self, "destroy", (GCallback) _gtk_main_quit_gtk_object_destroy, NULL); - gtk_window_set_icon_from_file ((GtkWindow*) self, "/usr/share/pixmaps/rsim.png", &_inner_error_); + { + gtk_window_set_icon_from_file ((GtkWindow*) self, "/usr/share/pixmaps/rsim.png", &_inner_error_); + if (_inner_error_ != NULL) { + goto __catch0_g_error; + } + } + goto __finally0; + __catch0_g_error: + { + GError * e; + e = _inner_error_; + _inner_error_ = NULL; + { + _g_error_free0 (e); + } + } + __finally0: if (_inner_error_ != NULL) { _g_object_unref0 (menu_file_item); _g_object_unref0 (menu_edit_item); - _g_object_unref0 (menu_emulation_item); _g_object_unref0 (cslist); _g_object_unref0 (sw); _g_object_unref0 (mainbox); @@ -719,7 +720,6 @@ static GObject * gui_cmain_constructor (GType type, guint n_construct_properties gtk_widget_show_all ((GtkWidget*) self); _g_object_unref0 (menu_file_item); _g_object_unref0 (menu_edit_item); - _g_object_unref0 (menu_emulation_item); _g_object_unref0 (cslist); _g_object_unref0 (sw); _g_object_unref0 (mainbox); @@ -760,8 +760,8 @@ GType gui_cmain_get_type (void) { } -static void* _spec_load_dialog_run_gthread_func (gpointer self) { - return spec_load_dialog_run (self); +static void* _emulation_spec_load_dialog_run_gthread_func (gpointer self) { + return emulation_spec_load_dialog_run (self); } @@ -774,14 +774,14 @@ void gui_init (char*** args, int* args_length1) { gui_actions = (_tmp0_ = gui_cactions_new (), _g_object_unref0 (gui_actions), _tmp0_); gui_main = (_tmp1_ = g_object_ref_sink (gui_cmain_new ()), _g_object_unref0 (gui_main), _tmp1_); { - SpecLoadDialog* specload; + EmulationSpecLoadDialog* specload; gdk_threads_init (); - specload = g_object_ref_sink (spec_load_dialog_new ((GtkWindow*) gui_main)); + specload = g_object_ref_sink (emulation_spec_load_dialog_new ((GtkWindow*) gui_main)); { - g_thread_create (_spec_load_dialog_run_gthread_func, specload, FALSE, &_inner_error_); + g_thread_create (_emulation_spec_load_dialog_run_gthread_func, specload, FALSE, &_inner_error_); if (_inner_error_ != NULL) { if (_inner_error_->domain == G_THREAD_ERROR) { - goto __catch0_g_thread_error; + goto __catch1_g_thread_error; } _g_object_unref0 (specload); g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); @@ -789,8 +789,8 @@ void gui_init (char*** args, int* args_length1) { return; } } - goto __finally0; - __catch0_g_thread_error: + goto __finally1; + __catch1_g_thread_error: { GError * e; e = _inner_error_; @@ -801,7 +801,7 @@ void gui_init (char*** args, int* args_length1) { _g_error_free0 (e); } } - __finally0: + __finally1: if (_inner_error_ != NULL) { _g_object_unref0 (specload); g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); @@ -814,10 +814,57 @@ void gui_init (char*** args, int* args_length1) { } -SpecLoadDialog* spec_load_dialog_construct (GType object_type, GtkWindow* parent) { - SpecLoadDialog * self; - GtkLabel* _tmp0_; - GtkProgressBar* _tmp1_; +void emulation_spec_entry_copy (const EmulationSpecEntry* self, EmulationSpecEntry* dest) { + dest->spec = _g_object_ref0 (self->spec); + dest->name = g_strdup (self->name); +} + + +void emulation_spec_entry_destroy (EmulationSpecEntry* self) { + _g_object_unref0 (self->spec); + _g_free0 (self->name); +} + + +EmulationSpecEntry* emulation_spec_entry_dup (const EmulationSpecEntry* self) { + EmulationSpecEntry* dup; + dup = g_new0 (EmulationSpecEntry, 1); + emulation_spec_entry_copy (self, dup); + return dup; +} + + +void emulation_spec_entry_free (EmulationSpecEntry* self) { + emulation_spec_entry_destroy (self); + g_free (self); +} + + +GType emulation_spec_entry_get_type (void) { + static GType emulation_spec_entry_type_id = 0; + if (emulation_spec_entry_type_id == 0) { + emulation_spec_entry_type_id = g_boxed_type_register_static ("EmulationSpecEntry", (GBoxedCopyFunc) emulation_spec_entry_dup, (GBoxedFreeFunc) emulation_spec_entry_free); + } + return emulation_spec_entry_type_id; +} + + +static void _vala_EmulationSpecEntry_array_free (EmulationSpecEntry* array, gint array_length) { + if (array != NULL) { + int i; + for (i = 0; i < array_length; i = i + 1) { + emulation_spec_entry_destroy (&array[i]); + } + } + g_free (array); +} + + +EmulationSpecLoadDialog* emulation_spec_load_dialog_construct (GType object_type, GtkWindow* parent) { + EmulationSpecLoadDialog * self; + EmulationSpecEntry* _tmp0_; + GtkLabel* _tmp1_; + GtkProgressBar* _tmp2_; GtkVBox* box; self = g_object_newv (object_type, 0, NULL); if (parent != NULL) { @@ -826,8 +873,9 @@ SpecLoadDialog* spec_load_dialog_construct (GType object_type, GtkWindow* parent gtk_window_set_destroy_with_parent ((GtkWindow*) self, TRUE); } gtk_window_set_deletable ((GtkWindow*) self, FALSE); - self->priv->loading = (_tmp0_ = g_object_ref_sink ((GtkLabel*) gtk_label_new ("Loading...")), _g_object_unref0 (self->priv->loading), _tmp0_); - self->priv->progress = (_tmp1_ = g_object_ref_sink ((GtkProgressBar*) gtk_progress_bar_new ()), _g_object_unref0 (self->priv->progress), _tmp1_); + emulation_specs = (_tmp0_ = g_new0 (EmulationSpecEntry, 2), emulation_specs = (_vala_EmulationSpecEntry_array_free (emulation_specs, emulation_specs_length1), NULL), emulation_specs_length1 = 2, _tmp0_); + self->priv->loading = (_tmp1_ = g_object_ref_sink ((GtkLabel*) gtk_label_new ("Loading...")), _g_object_unref0 (self->priv->loading), _tmp1_); + self->priv->progress = (_tmp2_ = g_object_ref_sink ((GtkProgressBar*) gtk_progress_bar_new ()), _g_object_unref0 (self->priv->progress), _tmp2_); self->priv->progress->pulse_fraction = 0.1; box = g_object_ref_sink ((GtkVBox*) gtk_vbox_new (FALSE, 5)); gtk_box_pack_start ((GtkBox*) box, (GtkWidget*) self->priv->loading, FALSE, TRUE, (guint) 0); @@ -840,22 +888,22 @@ SpecLoadDialog* spec_load_dialog_construct (GType object_type, GtkWindow* parent } -SpecLoadDialog* spec_load_dialog_new (GtkWindow* parent) { - return spec_load_dialog_construct (TYPE_SPEC_LOAD_DIALOG, parent); +EmulationSpecLoadDialog* emulation_spec_load_dialog_new (GtkWindow* parent) { + return emulation_spec_load_dialog_construct (EMULATION_TYPE_SPEC_LOAD_DIALOG, parent); } -static void* _spec_load_dialog_pulse_thread_gthread_func (gpointer self) { - return spec_load_dialog_pulse_thread (self); +static void* _emulation_spec_load_dialog_pulse_thread_gthread_func (gpointer self) { + return emulation_spec_load_dialog_pulse_thread (self); } -static void* _spec_load_dialog_specload_thread_gthread_func (gpointer self) { - return spec_load_dialog_specload_thread (self); +static void* _emulation_spec_load_dialog_specload_thread_gthread_func (gpointer self) { + return emulation_spec_load_dialog_specload_thread (self); } -void* spec_load_dialog_run (SpecLoadDialog* self) { +void* emulation_spec_load_dialog_run (EmulationSpecLoadDialog* self) { void* result; GError * _inner_error_; GThread* load; @@ -872,20 +920,20 @@ void* spec_load_dialog_run (SpecLoadDialog* self) { { GThread* _tmp0_; GThread* _tmp1_; - _tmp0_ = g_thread_create (_spec_load_dialog_pulse_thread_gthread_func, self, TRUE, &_inner_error_); + _tmp0_ = g_thread_create (_emulation_spec_load_dialog_pulse_thread_gthread_func, self, TRUE, &_inner_error_); if (_inner_error_ != NULL) { if (_inner_error_->domain == G_THREAD_ERROR) { - goto __catch1_g_thread_error; + goto __catch2_g_thread_error; } g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); g_clear_error (&_inner_error_); return NULL; } pulse = _tmp0_; - _tmp1_ = g_thread_create (_spec_load_dialog_specload_thread_gthread_func, self, TRUE, &_inner_error_); + _tmp1_ = g_thread_create (_emulation_spec_load_dialog_specload_thread_gthread_func, self, TRUE, &_inner_error_); if (_inner_error_ != NULL) { if (_inner_error_->domain == G_THREAD_ERROR) { - goto __catch1_g_thread_error; + goto __catch2_g_thread_error; } g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); g_clear_error (&_inner_error_); @@ -893,8 +941,8 @@ void* spec_load_dialog_run (SpecLoadDialog* self) { } load = _tmp1_; } - goto __finally1; - __catch1_g_thread_error: + goto __finally2; + __catch2_g_thread_error: { GError * e; e = _inner_error_; @@ -907,7 +955,7 @@ void* spec_load_dialog_run (SpecLoadDialog* self) { return result; } } - __finally1: + __finally2: if (_inner_error_ != NULL) { g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); g_clear_error (&_inner_error_); @@ -924,7 +972,7 @@ void* spec_load_dialog_run (SpecLoadDialog* self) { } -static void* spec_load_dialog_pulse_thread (SpecLoadDialog* self) { +static void* emulation_spec_load_dialog_pulse_thread (EmulationSpecLoadDialog* self) { void* result; g_return_val_if_fail (self != NULL, NULL); while (TRUE) { @@ -941,55 +989,65 @@ static void* spec_load_dialog_pulse_thread (SpecLoadDialog* self) { } -static void* spec_load_dialog_specload_thread (SpecLoadDialog* self) { +static void* emulation_spec_load_dialog_specload_thread (EmulationSpecLoadDialog* self) { void* result; + EmulationSpec* r300_registers; + EmulationSpec* r500_registers; EmulationSpec* _tmp0_; - EmulationSpec* _tmp1_; + char* _tmp1_; + EmulationSpec* _tmp2_; + char* _tmp3_; g_return_val_if_fail (self != NULL, NULL); gdk_threads_enter (); gtk_label_set_label (self->priv->loading, "Loading r300 registers..."); gdk_threads_leave (); - r300_registers = (_tmp0_ = emulation_spec_new ("/usr/share/rsim/r300reg.xml", "r300"), _g_object_unref0 (r300_registers), _tmp0_); + r300_registers = emulation_spec_new ("/usr/share/rsim/r300reg.xml", "r300"); gdk_threads_enter (); gtk_label_set_label (self->priv->loading, "Loading r500 registers..."); gdk_threads_leave (); - r500_registers = (_tmp1_ = emulation_spec_new ("/usr/share/rsim/r300reg.xml", "r500"), _g_object_unref0 (r500_registers), _tmp1_); + r500_registers = emulation_spec_new ("/usr/share/rsim/r300reg.xml", "r500"); gdk_threads_enter (); gtk_label_set_label (self->priv->loading, "Done"); gdk_threads_leave (); + emulation_specs[0].spec = (_tmp0_ = _g_object_ref0 (r300_registers), _g_object_unref0 (emulation_specs[0].spec), _tmp0_); + emulation_specs[0].name = (_tmp1_ = g_strdup ("r300"), _g_free0 (emulation_specs[0].name), _tmp1_); + emulation_specs[1].spec = (_tmp2_ = _g_object_ref0 (r500_registers), _g_object_unref0 (emulation_specs[1].spec), _tmp2_); + emulation_specs[1].name = (_tmp3_ = g_strdup ("r500"), _g_free0 (emulation_specs[1].name), _tmp3_); result = (void*) 123; + _g_object_unref0 (r300_registers); + _g_object_unref0 (r500_registers); return result; } -static void spec_load_dialog_class_init (SpecLoadDialogClass * klass) { - spec_load_dialog_parent_class = g_type_class_peek_parent (klass); - g_type_class_add_private (klass, sizeof (SpecLoadDialogPrivate)); - G_OBJECT_CLASS (klass)->finalize = spec_load_dialog_finalize; +static void emulation_spec_load_dialog_class_init (EmulationSpecLoadDialogClass * klass) { + emulation_spec_load_dialog_parent_class = g_type_class_peek_parent (klass); + g_type_class_add_private (klass, sizeof (EmulationSpecLoadDialogPrivate)); + G_OBJECT_CLASS (klass)->finalize = emulation_spec_load_dialog_finalize; } -static void spec_load_dialog_instance_init (SpecLoadDialog * self) { - self->priv = SPEC_LOAD_DIALOG_GET_PRIVATE (self); +static void emulation_spec_load_dialog_instance_init (EmulationSpecLoadDialog * self) { + self->priv = EMULATION_SPEC_LOAD_DIALOG_GET_PRIVATE (self); } -static void spec_load_dialog_finalize (GObject* obj) { - SpecLoadDialog * self; - self = SPEC_LOAD_DIALOG (obj); +static void emulation_spec_load_dialog_finalize (GObject* obj) { + EmulationSpecLoadDialog * self; + self = EMULATION_SPEC_LOAD_DIALOG (obj); _g_object_unref0 (self->priv->loading); _g_object_unref0 (self->priv->progress); - G_OBJECT_CLASS (spec_load_dialog_parent_class)->finalize (obj); + G_OBJECT_CLASS (emulation_spec_load_dialog_parent_class)->finalize (obj); } -GType spec_load_dialog_get_type (void) { - static GType spec_load_dialog_type_id = 0; - if (spec_load_dialog_type_id == 0) { - static const GTypeInfo g_define_type_info = { sizeof (SpecLoadDialogClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) spec_load_dialog_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (SpecLoadDialog), 0, (GInstanceInitFunc) spec_load_dialog_instance_init, NULL }; - spec_load_dialog_type_id = g_type_register_static (GTK_TYPE_WINDOW, "SpecLoadDialog", &g_define_type_info, 0); +GType emulation_spec_load_dialog_get_type (void) { + static GType emulation_spec_load_dialog_type_id = 0; + if (emulation_spec_load_dialog_type_id == 0) { + static const GTypeInfo g_define_type_info = { sizeof (EmulationSpecLoadDialogClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) emulation_spec_load_dialog_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (EmulationSpecLoadDialog), 0, (GInstanceInitFunc) emulation_spec_load_dialog_instance_init, NULL }; + emulation_spec_load_dialog_type_id = g_type_register_static (GTK_TYPE_WINDOW, "EmulationSpecLoadDialog", &g_define_type_info, 0); } - return spec_load_dialog_type_id; + return emulation_spec_load_dialog_type_id; } @@ -1001,8 +1059,24 @@ gint _main (char** args, int args_length1) { return result; } gui_init (&args, &args_length1); - g_object_unref ((GObject*) r300_registers); - g_object_unref ((GObject*) r500_registers); + { + guint i; + i = (guint) 0; + { + gboolean _tmp0_; + _tmp0_ = TRUE; + while (TRUE) { + if (!_tmp0_) { + i++; + } + _tmp0_ = FALSE; + if (!(i < emulation_specs_length1)) { + break; + } + g_object_unref ((GObject*) emulation_specs[i].spec); + } + } + } g_object_unref ((GObject*) gui_actions); g_object_unref ((GObject*) gui_main); result = 0; diff --git a/src/main.vala b/src/main.vala index 399893c..177a198 100644 --- a/src/main.vala +++ b/src/main.vala @@ -14,9 +14,6 @@ namespace GUI public Action ExportCS; public Action Quit; - public RadioAction EmulateR300; - public RadioAction EmulateR500; - construct { New = new Action("New", null, null, "gtk-new"); Open = new Action("Open", null, null, "gtk-open"); @@ -27,11 +24,6 @@ namespace GUI ExportCS = new Action("ExportCS", "Export", "Export a CS to a file", "gtk-convert"); Quit = new Action("Quit", null, null, "gtk-quit"); - EmulateR300 = new RadioAction("EmulateR300", "R300", "Emulate the R300 register space", null, Chip.R300); - EmulateR500 = new RadioAction("EmulateR500", "R500", "Emulate the R500 register space", null, Chip.R500); - EmulateR500.set_group(EmulateR300.get_group()); - EmulateR300.set_current_value(Chip.R300); - ImportCS.activate.connect((source) => { var d = new CSImport(); d.run(); }); } } @@ -40,7 +32,6 @@ namespace GUI { public Menu file; public Menu edit; - public Menu emulation; } public class CMain : Window @@ -79,16 +70,9 @@ namespace GUI var menu_edit_item = new MenuItem.with_label("Edit"); menu_edit_item.submenu = menu.edit; - menu.emulation = new Menu(); - menu.emulation.append(actions.EmulateR300.create_menu_item() as MenuItem); - menu.emulation.append(actions.EmulateR500.create_menu_item() as MenuItem); - var menu_emulation_item = new MenuItem.with_label("Emulation"); - menu_emulation_item.submenu = menu.emulation; - menubar = new MenuBar(); menubar.append(menu_file_item); menubar.append(menu_edit_item); - menubar.append(menu_emulation_item); cs_store = new ListStore(2, typeof(string), typeof(CS)); var cslist = new TreeView(); @@ -111,8 +95,11 @@ namespace GUI title = "Radeon Simulator"; add(mainbox); destroy.connect(main_quit); - /* XXX This shouldn't be hardcoded */ - set_icon_from_file("/usr/share/pixmaps/rsim.png"); + + try { + /* XXX This shouldn't be hardcoded */ + set_icon_from_file("/usr/share/pixmaps/rsim.png"); + } catch (Error e) { /* don't care */ } show_all(); } @@ -139,7 +126,7 @@ namespace GUI cs_store.get_iter(out iter, path); cs_store.get(iter, 1, out cs, -1); - var csv = new CSView(cs, r500_registers); + var csv = new CSView(cs); csv.show_all(); } } @@ -169,99 +156,114 @@ namespace GUI } } -public Spec r300_registers; -public Spec r500_registers; - -class SpecLoadDialog : Window +namespace Emulation { - private Label loading; - private ProgressBar progress; - private bool done; + public struct SpecEntry + { + Spec spec; + string name; + } - public SpecLoadDialog(Window? parent = null) + public SpecEntry[] specs; + public uint spec_default = 1; + + internal class SpecLoadDialog : Window { - if (parent != null) { - set_transient_for(parent); - modal = true; - destroy_with_parent = true; - } - deletable = false; + private Label loading; + private ProgressBar progress; + private bool done; - loading = new Label("Loading..."); + public SpecLoadDialog(Window? parent = null) + { + if (parent != null) { + set_transient_for(parent); + modal = true; + destroy_with_parent = true; + } + deletable = false; - progress = new ProgressBar(); - progress.pulse_fraction = 0.1; + specs = new SpecEntry[2]; + loading = new Label("Loading..."); - var box = new VBox(false, 5); - box.pack_start(loading, false, true, 0); - box.pack_start(progress, false, true, 0); + progress = new ProgressBar(); + progress.pulse_fraction = 0.1; - border_width = 10; - set_default_size(300, 10); + var box = new VBox(false, 5); + box.pack_start(loading, false, true, 0); + box.pack_start(progress, false, true, 0); - add(box); - } + border_width = 10; + set_default_size(300, 10); - public void *run() - { - Gdk.threads_enter(); - show_all(); - Gdk.threads_leave(); - - done = false; - weak Thread load; - weak Thread pulse; - - try { - pulse = Thread.create(pulse_thread, true); - load = Thread.create(specload_thread, true); - } catch (ThreadError e) { - stderr.printf("Unable to start loading thread.\n"); - assert(false); - return null; /* appease vala */ + add(box); } - void *result = load.join(); - done = true; - pulse.join(); + public void *run() + { + Gdk.threads_enter(); + show_all(); + Gdk.threads_leave(); - Gdk.threads_enter(); - hide_all(); - Gdk.threads_leave(); + done = false; + weak Thread load; + weak Thread pulse; - return result; - } + try { + pulse = Thread.create(pulse_thread, true); + load = Thread.create(specload_thread, true); + } catch (ThreadError e) { + stderr.printf("Unable to start loading thread.\n"); + assert(false); + return null; /* appease vala */ + } + + void *result = load.join(); + done = true; + pulse.join(); - private void *pulse_thread() - { - while (!done) { Gdk.threads_enter(); - progress.pulse(); + hide_all(); Gdk.threads_leave(); - Thread.usleep(50000); + return result; } - return null; - } - private void *specload_thread() - { - /* XXX This shouldn't be hardcoded */ - Gdk.threads_enter(); - loading.label = "Loading r300 registers..."; - Gdk.threads_leave(); - r300_registers = new Spec("/usr/share/rsim/r300reg.xml", "r300"); - - Gdk.threads_enter(); - loading.label = "Loading r500 registers..."; - Gdk.threads_leave(); - r500_registers = new Spec("/usr/share/rsim/r300reg.xml", "r500"); - - Gdk.threads_enter(); - loading.label = "Done"; - Gdk.threads_leave(); - - return (void *)123; + private void *pulse_thread() + { + while (!done) { + Gdk.threads_enter(); + progress.pulse(); + Gdk.threads_leave(); + + Thread.usleep(50000); + } + return null; + } + + private void *specload_thread() + { + /* XXX This shouldn't be hardcoded */ + Gdk.threads_enter(); + loading.label = "Loading r300 registers..."; + Gdk.threads_leave(); + var r300_registers = new Spec("/usr/share/rsim/r300reg.xml", "r300"); + + Gdk.threads_enter(); + loading.label = "Loading r500 registers..."; + Gdk.threads_leave(); + var r500_registers = new Spec("/usr/share/rsim/r300reg.xml", "r500"); + + Gdk.threads_enter(); + loading.label = "Done"; + Gdk.threads_leave(); + + specs[0].spec = r300_registers; + specs[0].name = "r300"; + specs[1].spec = r500_registers; + specs[1].name = "r500"; + + return (void *)123; + } } } @@ -275,8 +277,9 @@ public static int main(string[] args) GUI.init(ref args); /* vala doesn't unref globals */ - r300_registers.unref(); - r500_registers.unref(); + for (uint i = 0; i < specs.length; i++) { + specs[i].spec.unref(); + } GUI.actions.unref(); GUI.main.unref(); |