#include #include #include #include #include #include #include "tmalloc.h" #include "xgalaxy.h" #include "gtkcellrendererbutton.h" XGlalaxyStruct XGalaxy; gint delete( GtkWidget *widget, GtkWidget *event, gpointer data ) { if ( XGalaxy.runing && !XGalaxy.paused ) { XGalaxy.request_to_exit = 1; /* wait thread */ while(XGalaxy.request_to_exit); } gtk_main_quit(); return(FALSE); } gboolean check_number(GtkWidget *widget, GdkEventFocus *event, gpointer user_data) { char buf[128]; if ( atof(gtk_entry_get_text(GTK_ENTRY(widget))) <= 0 ) sprintf(buf, "%G", *(double*)user_data ); else sprintf(buf, "%G", atof(gtk_entry_get_text(GTK_ENTRY(widget))) ); gtk_entry_set_text(GTK_ENTRY(widget), buf); return FALSE; } typedef struct { GtkListStore *store; int colnumber; } ColInfo; void set_edited_data(GtkCellRendererText *cellrenderertext, gchar *arg1, gchar *arg2, gpointer user_data) { GtkTreeIter iter; GtkTreePath *path; ColInfo *info = (ColInfo*)user_data; char buf[128]; double val = atof(arg2); if ( XGalaxy.runing ) return; path = gtk_tree_path_new_from_string (arg1); gtk_tree_model_get_iter(GTK_TREE_MODEL (info->store), &iter, path); gtk_tree_path_free (path); if ( info->colnumber==1 && val < 0 ) val=-val; sprintf(buf,"%G", val); gtk_list_store_set( info->store, &iter, info->colnumber, buf, -1); editEntry(atoi(arg1), info->colnumber, val); cntEntry(); } static int row_to_delete=-1; void cell_toggled(GtkCellRendererButton *cell_renderer, gchar *path, gpointer user_data) { GtkTreePath *treepath; GtkTreeIter iter; GtkListStore *store = GTK_LIST_STORE(user_data); if ( XGalaxy.runing || row_to_delete>=0 ) return; row_to_delete = atoi(path); treepath = gtk_tree_path_new_from_string (path); gtk_tree_model_get_iter(GTK_TREE_MODEL (store), &iter, treepath); gtk_tree_path_free (treepath); gtk_list_store_set (GTK_LIST_STORE (store), &iter, 0, TRUE, -1); } gboolean button_release(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { char path[16]; GtkTreePath *treepath; GtkTreeIter iter; GtkListStore *store = GTK_LIST_STORE(user_data); if (row_to_delete<0) return FALSE; sprintf(path,"%d", row_to_delete); treepath = gtk_tree_path_new_from_string (path); gtk_tree_model_get_iter(GTK_TREE_MODEL (store), &iter, treepath); gtk_tree_path_free (treepath); gtk_list_store_remove(store, &iter); deleteEntry(row_to_delete); cntEntry(); row_to_delete=-1; return FALSE; } void append_row(GtkTreeViewColumn *treeviewcolumn, gpointer user_data) { GtkTreeIter iter; GtkListStore *store = GTK_LIST_STORE(user_data); int i; if ( XGalaxy.runing ) return; gtk_list_store_append( store, &iter ); for(i=1;i<8;i++) gtk_list_store_set( store, &iter, i, "0", -1); addEntry(NULL); } static int size_allocation_treelist_oldwidth=0; static gint size_allocation_treelist(GtkWidget *widget, GtkAllocation *allocation, gpointer user_data) { /* workaround to prevent size-allocation storm */ if ( size_allocation_treelist_oldwidth != allocation->width ) { int i; int colwidth = (allocation->width-18)/7; for(i=1;i<8;i++) gtk_tree_view_column_set_fixed_width( gtk_tree_view_get_column(GTK_TREE_VIEW(widget), i), colwidth ); size_allocation_treelist_oldwidth=allocation->width; } return TRUE; } static double default_delta=3600; static double default_error=1e-8; GtkWidget* inputPage() { GtkWidget *table, *frame; GtkWidget *scrolled; GtkWidget *label, *subtable, *aligment; gchar *titles[8] = { "+", "Mass", "X", "Y", "Z", "Vx", "Vy", "Vz" }; table = gtk_table_new(3,100,FALSE); frame=gtk_frame_new("Options"); gtk_container_set_border_width(GTK_CONTAINER (frame), 5); gtk_table_attach_defaults(GTK_TABLE(table), frame, 0, 1, 0, 1); gtk_widget_show (frame); subtable = gtk_table_new(3,3,FALSE); label = gtk_label_new("Delta T (secs):"); gtk_label_set_line_wrap(GTK_LABEL(label), FALSE); gtk_widget_show(label); aligment=gtk_alignment_new(1,1,0,0); gtk_container_add(GTK_CONTAINER(aligment), label); gtk_container_set_border_width(GTK_CONTAINER (aligment), 3); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 0,1,0,1); XGalaxy.deltaField = gtk_entry_new_with_max_length(15); gtk_entry_set_text(GTK_ENTRY(XGalaxy.deltaField), "3600"); gtk_signal_connect (GTK_OBJECT(XGalaxy.deltaField),"focus-out-event", (GtkSignalFunc) check_number, (gpointer)&default_delta); gtk_widget_show(XGalaxy.deltaField); aligment=gtk_alignment_new(0,1,0,0); gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.deltaField); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 1,2,0,1); label = gtk_label_new("Quality:"); gtk_label_set_line_wrap(GTK_LABEL(label), FALSE); gtk_widget_show(label); aligment=gtk_alignment_new(1,0,0,0); gtk_container_add(GTK_CONTAINER(aligment), label); gtk_container_set_border_width(GTK_CONTAINER (aligment), 3); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 0,1,1,2); XGalaxy.errorField = gtk_entry_new_with_max_length(15); gtk_entry_set_text(GTK_ENTRY(XGalaxy.errorField), "1e-8"); gtk_signal_connect (GTK_OBJECT(XGalaxy.errorField),"focus-out-event", (GtkSignalFunc) check_number, (gpointer)&default_error); gtk_widget_show(XGalaxy.errorField); aligment=gtk_alignment_new(0,0,0,0); gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.errorField); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 1,2,1,2); gtk_widget_show(subtable); gtk_container_add(GTK_CONTAINER(frame), subtable); frame=gtk_frame_new("Summary information"); gtk_container_set_border_width(GTK_CONTAINER (frame), 5); gtk_table_attach_defaults(GTK_TABLE(table), frame, 1, 2, 0, 1); gtk_widget_show (frame); subtable = gtk_table_new(4,2,FALSE); label = gtk_label_new("Energy:"); gtk_label_set_line_wrap(GTK_LABEL(label), FALSE); gtk_widget_show(label); aligment=gtk_alignment_new(1,0.5,0,0); gtk_container_add(GTK_CONTAINER(aligment), label); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 0,1,0,1); XGalaxy.dataEnergyField = gtk_label_new("0"); gtk_label_set_line_wrap(GTK_LABEL(XGalaxy.dataEnergyField), FALSE); gtk_widget_show(XGalaxy.dataEnergyField); aligment=gtk_alignment_new(0,0.5,0,0); gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.dataEnergyField); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 1,2,0,1); label = gtk_label_new("Impulse:"); gtk_label_set_line_wrap(GTK_LABEL(label), FALSE); gtk_widget_show(label); aligment=gtk_alignment_new(1,0.5,0,0); gtk_container_add(GTK_CONTAINER(aligment), label); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 0,1,1,2); XGalaxy.dataImpulseField = gtk_label_new("0"); gtk_label_set_line_wrap(GTK_LABEL(XGalaxy.dataImpulseField), FALSE); gtk_widget_show(XGalaxy.dataImpulseField); aligment=gtk_alignment_new(0,0.5,0,0); gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.dataImpulseField); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 1,2,1,2); label = gtk_label_new("Moment:"); gtk_label_set_line_wrap(GTK_LABEL(label), FALSE); gtk_widget_show(label); aligment=gtk_alignment_new(1,0.5,0,0); gtk_container_add(GTK_CONTAINER(aligment), label); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 0,1,2,3); XGalaxy.dataMomentField = gtk_label_new("0"); gtk_label_set_line_wrap(GTK_LABEL(XGalaxy.dataMomentField), FALSE); gtk_widget_show(XGalaxy.dataMomentField); aligment=gtk_alignment_new(0,0.5,0,0); gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.dataMomentField); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 1,2,2,3); gtk_widget_show(subtable); gtk_container_add(GTK_CONTAINER(frame), subtable); scrolled = gtk_scrolled_window_new(NULL,NULL); gtk_container_set_border_width(GTK_CONTAINER (scrolled), 5); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_table_attach_defaults(GTK_TABLE(table), scrolled, 0, 2, 1, 99); gtk_widget_show (scrolled); do { int i; GtkListStore *store = gtk_list_store_new (8, G_TYPE_BOOLEAN, /* + */ G_TYPE_STRING, /* mass */ G_TYPE_STRING, /* X */ G_TYPE_STRING, /* Y */ G_TYPE_STRING, /* Z */ G_TYPE_STRING, /* Vx */ G_TYPE_STRING, /* Vy */ G_TYPE_STRING /* Vz */ ); XGalaxy.dataField = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); for(i=0;i<8;i++) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; if ( i>0 ) { ColInfo *info = tmalloc(sizeof(ColInfo)); info->store=store; info->colnumber=i; renderer = gtk_cell_renderer_text_new (); g_object_set (G_OBJECT (renderer), "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL); g_object_set (G_OBJECT (renderer), "editable", TRUE, NULL); g_object_set (G_OBJECT (renderer), "editable-set", TRUE, NULL); g_object_set (G_OBJECT (renderer), "single-paragraph-mode", TRUE, NULL); gtk_signal_connect (GTK_OBJECT(renderer),"edited", (GtkSignalFunc) set_edited_data, info); column = gtk_tree_view_column_new_with_attributes( titles[i], renderer, "text", i, NULL ); gtk_tree_view_column_set_clickable(column, FALSE); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_fixed_width(column, (640-56)/7); } else { renderer = gtk_cell_renderer_button_new(); g_object_set (G_OBJECT (renderer), "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL); g_object_set (G_OBJECT (renderer), "activatable", TRUE, NULL); gtk_signal_connect (GTK_OBJECT(renderer), "toggled", (GtkSignalFunc) cell_toggled, store); column = gtk_tree_view_column_new_with_attributes( titles[i], renderer, "active", 0, NULL ); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_fixed_width(column, 20); gtk_tree_view_column_set_clickable(column, TRUE); gtk_tree_view_column_set_resizable(column, FALSE); gtk_signal_connect (GTK_OBJECT(column), "clicked", (GtkSignalFunc) append_row, store); } gtk_tree_view_append_column (GTK_TREE_VIEW (XGalaxy.dataField), column); } gtk_signal_connect (GTK_OBJECT(XGalaxy.dataField),"button-release-event", (GtkSignalFunc) button_release, store); } while(0); gtk_signal_connect (GTK_OBJECT(XGalaxy.dataField),"size-allocate", (GtkSignalFunc) size_allocation_treelist, NULL); gtk_widget_show(XGalaxy.dataField); gtk_container_add(GTK_CONTAINER(scrolled), XGalaxy.dataField); gtk_widget_show(table); return table; } static gint size_allocation_clist(GtkWidget *widget, GtkAllocation *allocation, gpointer user_data) { int i; int colwidth = (allocation->width-52)/8; for(i=0;i<8;i++) gtk_clist_set_column_width (GTK_CLIST(widget), i, colwidth); return FALSE; } GtkWidget* resPage() { GtkWidget *scrolled, *frame, *label, *aligment, *subtable, *vbox; gchar *titles[11] = { "Mass", "X", "Y", "Z", "Vx", "Vy", "Vz", "|V|", "A", "E", "I" }; vbox = gtk_vbox_new (FALSE, 1); gtk_container_set_border_width (GTK_CONTAINER (vbox), 0); gtk_widget_show (vbox); frame=gtk_frame_new("Summary information"); gtk_container_set_border_width(GTK_CONTAINER (frame), 5); gtk_widget_show (frame); subtable = gtk_table_new(1,10,FALSE); label = gtk_label_new("Energy:"); gtk_label_set_line_wrap(GTK_LABEL(label), FALSE); gtk_widget_show(label); aligment=gtk_alignment_new(1,0.5,0,0); gtk_container_add(GTK_CONTAINER(aligment), label); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 0,1,0,1); XGalaxy.resEnergyField = gtk_label_new("0"); gtk_label_set_line_wrap(GTK_LABEL(XGalaxy.resEnergyField), FALSE); gtk_widget_show(XGalaxy.resEnergyField); aligment=gtk_alignment_new(0.05,0.5,0,0); gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.resEnergyField); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 1,2,0,1); label = gtk_label_new("Impulse:"); gtk_label_set_line_wrap(GTK_LABEL(label), FALSE); gtk_widget_show(label); aligment=gtk_alignment_new(1,0.5,0,0); gtk_container_add(GTK_CONTAINER(aligment), label); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 2,3,0,1); XGalaxy.resImpulseField = gtk_label_new("0"); gtk_label_set_line_wrap(GTK_LABEL(XGalaxy.resImpulseField), FALSE); gtk_widget_show(XGalaxy.resImpulseField); aligment=gtk_alignment_new(0.05,0.5,0,0); gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.resImpulseField); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 3,4,0,1); label = gtk_label_new("Moment:"); gtk_label_set_line_wrap(GTK_LABEL(label), FALSE); gtk_widget_show(label); aligment=gtk_alignment_new(1,0.5,0,0); gtk_container_add(GTK_CONTAINER(aligment), label); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 4,5,0,1); XGalaxy.resMomentField = gtk_label_new("0"); gtk_label_set_line_wrap(GTK_LABEL(XGalaxy.resMomentField), FALSE); gtk_widget_show(XGalaxy.resMomentField); aligment=gtk_alignment_new(0.05,0.5,0,0); gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.resMomentField); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 5,6,0,1); label = gtk_label_new("Delta:"); gtk_label_set_line_wrap(GTK_LABEL(label), FALSE); gtk_widget_show(label); aligment=gtk_alignment_new(1,0.5,0,0); gtk_container_add(GTK_CONTAINER(aligment), label); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 6,7,0,1); XGalaxy.resDeltaField = gtk_label_new("0"); gtk_label_set_line_wrap(GTK_LABEL(XGalaxy.resDeltaField), FALSE); gtk_widget_show(XGalaxy.resDeltaField); aligment=gtk_alignment_new(0.05,0.5,0,0); gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.resDeltaField); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 7,8,0,1); label = gtk_label_new("Elapsed:"); gtk_label_set_line_wrap(GTK_LABEL(label), FALSE); gtk_widget_show(label); aligment=gtk_alignment_new(1,0.5,0,0); gtk_container_add(GTK_CONTAINER(aligment), label); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 8,9,0,1); XGalaxy.resTimeField = gtk_label_new("0"); gtk_label_set_line_wrap(GTK_LABEL(XGalaxy.resTimeField), FALSE); gtk_widget_show(XGalaxy.resTimeField); aligment=gtk_alignment_new(0.05,0.5,0,0); gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.resTimeField); gtk_widget_show(aligment); gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 9,10,0,1); gtk_widget_show(subtable); gtk_container_add(GTK_CONTAINER(frame), subtable); gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0); scrolled = gtk_scrolled_window_new(NULL,NULL); gtk_container_set_border_width(GTK_CONTAINER (scrolled), 5); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_widget_show (scrolled); XGalaxy.resField = gtk_clist_new_with_titles( 8, titles); gtk_signal_connect (GTK_OBJECT(XGalaxy.resField),"size-allocate", (GtkSignalFunc) size_allocation_clist, NULL); gtk_signal_connect (GTK_OBJECT(XGalaxy.resField),"hide", (GtkSignalFunc) show_resCList, NULL); gtk_clist_set_selection_mode(GTK_CLIST(XGalaxy.resField),GTK_SELECTION_SINGLE); gtk_container_add(GTK_CONTAINER(scrolled), XGalaxy.resField); gtk_widget_show(XGalaxy.resField); gtk_box_pack_start (GTK_BOX (vbox), scrolled, TRUE, TRUE, 0); return vbox; } static void scale_clicked (GtkButton *button, gpointer user_data) { if ( XGalaxy.trace ) return; if ( (int)user_data ) XGalaxy.Scale *= 1.5; else XGalaxy.Scale /= 1.5; drawGalaxy(); } static void trace_clicked (GtkToggleButton *button, gpointer user_data) { XGalaxy.trace = gtk_toggle_button_get_active(button); drawGalaxy(); } static void axis_clicked (GtkToggleButton *button, gpointer user_data) { if ( XGalaxy.locksignal ) return; if ( XGalaxy.trace ) { XGalaxy.locksignal=1; gtk_toggle_button_set_active( button, !gtk_toggle_button_get_active(button) ); XGalaxy.locksignal=0; return; } XGalaxy.drawaxis = gtk_toggle_button_get_active(button); drawGalaxy(); } static gboolean mouse_button_press(GtkWidget *widget, GdkEventButton *event) { XGalaxy.beginx = event->x; XGalaxy.beginy = event->y; memset( &(XGalaxy.motion.d), 0, sizeof(Vector)); XGalaxy.motion.w=1.0; return FALSE; } GtkWidget* viewPage() { GtkWidget *vbox, *hbox, *separator, *button, *table; GtkTooltips *button_bar_tips; button_bar_tips = gtk_tooltips_new (); vbox = gtk_vbox_new (FALSE, 1); gtk_container_set_border_width (GTK_CONTAINER (vbox), 0); gtk_widget_show (vbox); hbox=gtk_hbutton_box_new(); gtk_widget_show (hbox); XGalaxy.buttonRun = gtk_toggle_button_new_with_label("Go!"); gtk_signal_connect (GTK_OBJECT(XGalaxy.buttonRun),"toggled", (GtkSignalFunc) actionRun, NULL); gtk_container_set_border_width(GTK_CONTAINER (XGalaxy.buttonRun), 5); gtk_widget_show(XGalaxy.buttonRun); gtk_box_pack_start (GTK_BOX (hbox), XGalaxy.buttonRun, FALSE, TRUE, 0); gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), XGalaxy.buttonRun, "Start modeling", ""); XGalaxy.buttonPause = gtk_toggle_button_new_with_label("Pause"); gtk_signal_connect (GTK_OBJECT(XGalaxy.buttonPause),"toggled", (GtkSignalFunc) actionPause, NULL); gtk_container_set_border_width(GTK_CONTAINER (XGalaxy.buttonPause), 5); gtk_widget_show(XGalaxy.buttonPause); gtk_box_pack_start (GTK_BOX (hbox), XGalaxy.buttonPause, FALSE, TRUE, 0); gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), XGalaxy.buttonPause, "Pause modeling", ""); button = gtk_button_new_with_label("Stop"); gtk_signal_connect (GTK_OBJECT(button),"clicked", (GtkSignalFunc) actionStop, NULL); gtk_container_set_border_width(GTK_CONTAINER (button), 5); gtk_widget_show(button); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0); gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), button, "Stop modeling", ""); //button = gtk_button_new_from_stock(GTK_STOCK_ZOOM_IN); button = gtk_button_new_with_label("Scale +"); gtk_container_set_border_width(GTK_CONTAINER (button), 5); gtk_widget_show(button); gtk_signal_connect (GTK_OBJECT(button),"clicked", (GtkSignalFunc) scale_clicked, (gpointer)1); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0); gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), button, "Increase scale", ""); //button = gtk_button_new_from_stock(GTK_STOCK_ZOOM_OUT); button = gtk_button_new_with_label("Scale -"); gtk_container_set_border_width(GTK_CONTAINER (button), 5); gtk_widget_show(button); gtk_signal_connect (GTK_OBJECT(button),"clicked", (GtkSignalFunc) scale_clicked, (gpointer)0); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0); gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), button, "Decrease scale", ""); button = gtk_toggle_button_new_with_label("Trace"); gtk_container_set_border_width(GTK_CONTAINER (button), 5); gtk_widget_show(button); gtk_signal_connect (GTK_OBJECT(button),"toggled", (GtkSignalFunc) trace_clicked, (gpointer)0); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0); gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), button, "Turn on/off trace of stars", ""); button = gtk_toggle_button_new_with_label("Axis"); gtk_container_set_border_width(GTK_CONTAINER (button), 5); gtk_widget_show(button); gtk_signal_connect (GTK_OBJECT(button),"toggled", (GtkSignalFunc) axis_clicked, (gpointer)0); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0); gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), button, "Axis show on/off", ""); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); separator = gtk_hseparator_new(); gtk_widget_show(separator); gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0); table = gtk_table_new(1000,1000,FALSE); XGalaxy.YSlider = gtk_hscale_new_with_range(-180, 180, 1); gtk_scale_set_draw_value(GTK_SCALE(XGalaxy.YSlider), FALSE); gtk_range_set_value(GTK_RANGE(XGalaxy.YSlider), 0); gtk_signal_connect (GTK_OBJECT(XGalaxy.YSlider),"value-changed", (GtkSignalFunc) angle_changed, (gpointer)'Y'); gtk_widget_show (XGalaxy.YSlider); gtk_table_attach_defaults(GTK_TABLE(table), XGalaxy.YSlider, 1,999, 999,1000); gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), XGalaxy.YSlider, "Turn around Y-axis", ""); XGalaxy.XSlider = gtk_vscale_new_with_range(-180, 180, 1); gtk_scale_set_draw_value(GTK_SCALE(XGalaxy.XSlider), FALSE); gtk_range_set_value(GTK_RANGE(XGalaxy.XSlider), 0); gtk_signal_connect (GTK_OBJECT(XGalaxy.XSlider),"value-changed", (GtkSignalFunc) angle_changed, (gpointer)'X'); gtk_widget_show (XGalaxy.XSlider); gtk_table_attach_defaults(GTK_TABLE(table), XGalaxy.XSlider, 0,1, 0,999); gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), XGalaxy.XSlider, "Turn around X-axis", ""); XGalaxy.ZSlider = gtk_vscale_new_with_range(-180, 180, 1); gtk_scale_set_draw_value(GTK_SCALE(XGalaxy.ZSlider), FALSE); gtk_range_set_value(GTK_RANGE(XGalaxy.ZSlider), 0); gtk_signal_connect (GTK_OBJECT(XGalaxy.ZSlider),"value-changed", (GtkSignalFunc) angle_changed, (gpointer)'Z'); gtk_widget_show (XGalaxy.ZSlider); gtk_table_attach_defaults(GTK_TABLE(table), XGalaxy.ZSlider, 999, 1000, 0, 999 ); gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), XGalaxy.ZSlider, "Turn around Z-axis", ""); XGalaxy.drawing_area = gtk_drawing_area_new (); gtk_widget_set_events(XGalaxy.drawing_area, GDK_EXPOSURE_MASK| GDK_BUTTON_PRESS_MASK| GDK_BUTTON_RELEASE_MASK| GDK_POINTER_MOTION_MASK| GDK_POINTER_MOTION_HINT_MASK); gtk_drawing_area_size (GTK_DRAWING_AREA (XGalaxy.drawing_area), 100,100); gtk_widget_show (XGalaxy.drawing_area); gtk_signal_connect (GTK_OBJECT (XGalaxy.drawing_area), "expose_event", (GtkSignalFunc) expose_event, NULL); gtk_signal_connect (GTK_OBJECT(XGalaxy.drawing_area),"configure_event", (GtkSignalFunc) configure_event, NULL); gtk_signal_connect (GTK_OBJECT(XGalaxy.drawing_area),"button_press_event", (GtkSignalFunc) mouse_button_press, NULL); gtk_signal_connect (GTK_OBJECT(XGalaxy.drawing_area),"motion_notify_event", (GtkSignalFunc) mouse_motion_notify, NULL); gtk_table_attach_defaults(GTK_TABLE(table), XGalaxy.drawing_area, 1,999, 0,999); gtk_widget_show(table); gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 0); return vbox; } static GtkItemFactoryEntry menu_items[] = { { "/_File", NULL, NULL, 0, "" }, { "/File/_Open", "O", openFile, 0, NULL }, { "/File/_Save", "S", saveFile, 0, NULL }, { "/File/Save _As", NULL, saveAsFile, 0, NULL }, { "/File/sep1", NULL, NULL, 0, "" }, { "/File/Quit", "Q", gtk_main_quit, 0, NULL }, { "/_Options", NULL, NULL, 0, "" }, { "/Options/Clear", NULL, clearData, 0, NULL }, { "/Options/Fill", NULL, NULL, 0, NULL }, { "/_Help", NULL, NULL, 0, "" }, { "/_Help/About", NULL, showAbout, 0, NULL }, }; static GtkWidget* get_main_menu(GtkWidget *window) { GtkItemFactory *item_factory; GtkAccelGroup *accel_group; GtkWidget *menubar; gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]); accel_group = gtk_accel_group_new (); item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "
", accel_group); gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL); gtk_window_add_accel_group (GTK_WINDOW (window), accel_group); menubar = gtk_item_factory_get_widget (item_factory, "
"); return menubar; } void page_switched(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer user_data) { XGalaxy.page_active = page_num; } int main( int argc, char *argv[] ) { GtkWidget *window, *notebook, *menubar, *main_vbox; int rc; memset(&XGalaxy, 0, sizeof(XGalaxy)); XGalaxy.angle.w=1; XGalaxy.motion.w=1.0; XGalaxy.Scale=1.0; gtk_init (&argc, &argv); if ( (rc=pthread_mutex_init(&(XGalaxy.mutex), NULL)) != 0 ) { g_print("pthread_mutex_init returns %d: %s\n", rc, g_strerror(errno)); exit(1); } XGalaxy.window = window = gtk_window_new (GTK_WINDOW_TOPLEVEL); galaxy_set_title(); gtk_window_set_default_size (GTK_WINDOW(window), 640, 480); gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (delete), NULL); main_vbox = gtk_vbox_new (FALSE, 1); gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 2); gtk_container_add(GTK_CONTAINER(window), main_vbox); gtk_widget_show (main_vbox); menubar = get_main_menu(window); gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, TRUE, 0); gtk_widget_show (menubar); notebook = gtk_notebook_new (); gtk_notebook_set_tab_pos(GTK_NOTEBOOK (notebook), GTK_POS_TOP); gtk_widget_show(notebook); gtk_notebook_append_page( GTK_NOTEBOOK (notebook), inputPage(), gtk_label_new("Input") ); gtk_notebook_append_page( GTK_NOTEBOOK (notebook), viewPage(), gtk_label_new("View") ); gtk_notebook_append_page( GTK_NOTEBOOK (notebook), resPage(), gtk_label_new("Data View") ); gtk_signal_connect (GTK_OBJECT(notebook),"switch-page", (GtkSignalFunc) page_switched, NULL); XGalaxy.notebook = notebook; gtk_box_pack_start (GTK_BOX (main_vbox), notebook, TRUE, TRUE, 0); setlocale(LC_NUMERIC, "C"); gtk_widget_show(window); gtk_main (); return 0; }