From 0fec1e14ddf2af984a8b75b3caccb73e125127f9 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Sun, 27 Feb 2011 22:52:27 +0100 Subject: hdfsee: Tidy up lots of exit paths --- src/displaywindow.c | 160 +++++++++++++++++++--------------------------------- src/displaywindow.h | 5 +- src/hdfsee.c | 11 +++- 3 files changed, 73 insertions(+), 103 deletions(-) diff --git a/src/displaywindow.c b/src/displaywindow.c index ae83a6c5..e19b1995 100644 --- a/src/displaywindow.c +++ b/src/displaywindow.c @@ -177,6 +177,8 @@ static gboolean displaywindow_expose(GtkWidget *da, GdkEventExpose *event, cairo_set_source_rgb(cr, 0.5, 0.5, 0.5); cairo_fill(cr); + if ( dw->image == NULL ) return 0; + /* Set up basic coordinate system * - origin in the centre, y upwards. */ cairo_identity_matrix(cr); @@ -666,13 +668,11 @@ static int load_geometry_file(DisplayWindow *dw, struct image *image, if ( dw->loaded_geom != NULL ) free_detector_geometry(dw->loaded_geom); dw->loaded_geom = geom; - w = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindow/view/usegeom"); gtk_widget_set_sensitive(GTK_WIDGET(w), TRUE); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(w), TRUE); dw->use_geom = 1; - displaywindow_update(dw); return 0; } @@ -777,7 +777,6 @@ static gint displaywindow_set_rings(GtkWidget *d, DisplayWindow *dw) } - struct savedialog { DisplayWindow *dw; GtkWidget *cb; @@ -852,7 +851,8 @@ static gint displaywindow_save(GtkWidget *widget, DisplayWindow *dw) gtk_combo_box_append_text(GTK_COMBO_BOX(cb), "TIFF - Floating point (mono, unbinned, filtered, not boosted)"); gtk_combo_box_append_text(GTK_COMBO_BOX(cb), - "TIFF - 16 bit signed integer (mono, unbinned, filtered, boosted)"); + "TIFF - 16 bit signed integer " + "(mono, unbinned, filtered, boosted)"); gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 0); cd = malloc(sizeof(*cd)); @@ -1156,6 +1156,8 @@ struct newhdf { static gint displaywindow_newhdf(GtkMenuItem *item, struct newhdf *nh) { + if ( nh->dw->not_ready_yet ) return 0; + hdfile_set_image(nh->dw->hdfile, nh->name); hdf5_read(nh->dw->hdfile, nh->dw->image, 0, 0.0); @@ -1233,7 +1235,7 @@ static GtkWidget *displaywindow_addhdfgroup(struct hdfile *hdfile, nh = malloc(sizeof(struct newhdf)); if ( nh != NULL ) { - strncpy(nh->name, names[i], 1023); + strncpy(nh->name, names[i], 1023); nh->dw = dw; g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(displaywindow_newhdf), nh); @@ -1241,7 +1243,7 @@ static GtkWidget *displaywindow_addhdfgroup(struct hdfile *hdfile, if ( (selectme != NULL) && (strcmp(names[i], selectme) == 0) ) { - gtk_check_menu_item_set_active( + gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(item), TRUE); } else { gtk_check_menu_item_set_active( @@ -1299,66 +1301,22 @@ static GtkWidget *displaywindow_createhdfmenus(struct hdfile *hdfile, } -static void displaywindow_update_menus(DisplayWindow *dw, const char *selectme) +static int displaywindow_update_menus(DisplayWindow *dw, const char *selectme) { GtkWidget *ms; GtkWidget *w; ms = displaywindow_createhdfmenus(dw->hdfile, dw, selectme); - if ( ms == NULL ) { - - /* Too bad. You'd better hope that /data/data exists... */ - ERROR("Couldn't get list of images in HDF file\n"); - w = gtk_ui_manager_get_widget(dw->ui, - "/ui/displaywindow/view/images"); - gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE); - - /* Add a dummy menu so that the user knows what's going on */ - ms = gtk_menu_new(); - w = gtk_ui_manager_get_widget(dw->ui, - "/ui/displaywindow/view/images"); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(w), ms); - - return; - - } + if ( ms == NULL ) return 1; /* Make new menu be the submenu for File->Images */ w = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindow/view/images"); gtk_menu_item_set_submenu(GTK_MENU_ITEM(w), ms); gtk_widget_show_all(ms); -} - - -static void displaywindow_disable(DisplayWindow *dw) -{ - GtkWidget *w; - - w = gtk_ui_manager_get_widget(dw->ui, - "/ui/displaywindow/file/images"); - gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE); - - w = gtk_ui_manager_get_widget(dw->ui, - "/ui/displaywindow/file/rings"); - gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE); - - w = gtk_ui_manager_get_widget(dw->ui, - "/ui/displaywindow/view/binning"); - gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE); - w = gtk_ui_manager_get_widget(dw->ui, - "/ui/displaywindow/view/boostint"); - gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE); - - w = gtk_ui_manager_get_widget(dw->ui, - "/ui/displaywindow/tools/numbers"); - gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE); - - w = gtk_ui_manager_get_widget(dw->ui, - "/ui/displaywindow/tools/peaks"); - gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE); + return 0; } @@ -1428,7 +1386,7 @@ static gint displaywindow_press(GtkWidget *widget, GdkEventButton *event, DisplayWindow *displaywindow_open(const char *filename, const char *peaks, int boost, int binning, int cmfilter, int noisefilter, int colscale, - const char *element) + const char *element, const char *geometry) { DisplayWindow *dw; char *title; @@ -1448,32 +1406,12 @@ DisplayWindow *displaywindow_open(const char *filename, const char *peaks, dw->image = NULL; dw->use_geom = 0; dw->show_rings = 0; - - dw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - - if ( filename == NULL ) { - title = strdup("No file - hdfsee"); - } else { - char *bn = safe_basename(filename); - title = malloc(strlen(bn)+14); - sprintf(title, "%s - hdfsee", bn); - free(bn); - } - gtk_window_set_title(GTK_WINDOW(dw->window), title); - free(title); - - g_signal_connect(G_OBJECT(dw->window), "destroy", - G_CALLBACK(displaywindow_closed), dw); - - vbox = gtk_vbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(dw->window), vbox); - displaywindow_addmenubar(dw, vbox, colscale); - - dw->drawingarea = gtk_drawing_area_new(); - gtk_box_pack_start(GTK_BOX(vbox), dw->drawingarea, TRUE, TRUE, 0); - - g_signal_connect(GTK_OBJECT(dw->drawingarea), "expose-event", - G_CALLBACK(displaywindow_expose), dw); + dw->scale = colscale; + dw->binning = binning; + dw->boostint = boost; + dw->cmfilter = cmfilter; + dw->noisefilter = noisefilter; + dw->not_ready_yet = 1; /* Open the file, if any */ if ( filename != NULL ) { @@ -1481,7 +1419,8 @@ DisplayWindow *displaywindow_open(const char *filename, const char *peaks, dw->hdfile = hdfile_open(filename); if ( dw->hdfile == NULL ) { ERROR("Couldn't open file '%s'\n", filename); - displaywindow_disable(dw); + free(dw); + return NULL; } else { int fail = -1; @@ -1496,39 +1435,57 @@ DisplayWindow *displaywindow_open(const char *filename, const char *peaks, hdf5_read(dw->hdfile, dw->image, 0, 0.0); } else { ERROR("Couldn't select path\n"); - displaywindow_disable(dw); + free(dw); + return NULL; } } } else { - dw->hdfile = NULL; - displaywindow_disable(dw); + free(dw); + return NULL; } - gtk_window_set_resizable(GTK_WINDOW(dw->window), FALSE); - gtk_widget_show_all(dw->window); - - /* No geometry loaded initially */ - w = gtk_ui_manager_get_widget(dw->ui, - "/ui/displaywindow/view/usegeom"); - gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE); dw->loaded_geom = NULL; dw->simple_geom = simple_geometry(dw->image); dw->image->det = dw->simple_geom; - dw->scale = colscale; - dw->binning = binning; - dw->boostint = boost; - dw->cmfilter = cmfilter; - dw->noisefilter = noisefilter; - displaywindow_update(dw); - /* Peak list provided at startup? */ - if ( (dw->hdfile != NULL) && (peaks != NULL) ) { + if ( peaks != NULL ) { load_features_from_file(dw->image, peaks); - displaywindow_update(dw); } + dw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + char *bn = safe_basename(filename); + title = malloc(strlen(bn)+14); + sprintf(title, "%s - hdfsee", bn); + free(bn); + gtk_window_set_title(GTK_WINDOW(dw->window), title); + free(title); + + g_signal_connect(G_OBJECT(dw->window), "destroy", + G_CALLBACK(displaywindow_closed), dw); + + vbox = gtk_vbox_new(FALSE, 0); + gtk_container_add(GTK_CONTAINER(dw->window), vbox); + displaywindow_addmenubar(dw, vbox, colscale); + + dw->drawingarea = gtk_drawing_area_new(); + gtk_box_pack_start(GTK_BOX(vbox), dw->drawingarea, TRUE, TRUE, 0); + + g_signal_connect(GTK_OBJECT(dw->drawingarea), "expose-event", + G_CALLBACK(displaywindow_expose), dw); + + gtk_window_set_resizable(GTK_WINDOW(dw->window), FALSE); + gtk_widget_show_all(dw->window); + + w = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindow/view/usegeom"); + gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE); + if ( geometry != NULL ) { + load_geometry_file(dw, dw->image, geometry); + } + + displaywindow_update(dw); + gtk_widget_add_events(GTK_WIDGET(dw->drawingarea), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK @@ -1540,7 +1497,8 @@ DisplayWindow *displaywindow_open(const char *filename, const char *peaks, g_signal_connect(GTK_OBJECT(dw->drawingarea), "button-release-event", G_CALLBACK(displaywindow_release), dw); - if ( dw->hdfile != NULL ) displaywindow_update_menus(dw, element); + displaywindow_update_menus(dw, element); + dw->not_ready_yet = 0; return dw; } diff --git a/src/displaywindow.h b/src/displaywindow.h index b19f2b99..097efa5c 100644 --- a/src/displaywindow.h +++ b/src/displaywindow.h @@ -51,6 +51,8 @@ typedef struct { GdkPixbuf **pixbufs; gulong motion_callback; + int not_ready_yet; + struct detector *loaded_geom; struct detector *simple_geom; @@ -87,7 +89,8 @@ extern DisplayWindow *displaywindow_open(const char *filename, const char *peaks, int boost, int binning, int cmfilter, int noisefilter, int colscale, - const char *element); + const char *element, + const char *geometry); #endif /* DISPLAYWINDOW_H */ diff --git a/src/hdfsee.c b/src/hdfsee.c index a7a3631f..282d0cc7 100644 --- a/src/hdfsee.c +++ b/src/hdfsee.c @@ -95,6 +95,7 @@ int main(int argc, char *argv[]) int colscale = SCALE_COLOUR; char *cscale = NULL; char *element = NULL; + char *geometry = NULL; /* Long options */ const struct option longopts[] = { @@ -106,6 +107,7 @@ int main(int argc, char *argv[]) {"filter-noise", 0, &config_noisefilter, 1}, {"colscale", 1, NULL, 'c'}, {"image", 1, NULL, 'e'}, + {"geometry", 1, NULL, 'g'}, {0, 0, NULL, 0} }; @@ -147,6 +149,10 @@ int main(int argc, char *argv[]) element = strdup(optarg); break; + case 'g' : + geometry = strdup(optarg); + break; + case 0 : break; @@ -183,13 +189,16 @@ int main(int argc, char *argv[]) boost, binning, config_cmfilter, config_noisefilter, - colscale, element); + colscale, element, + geometry); if ( main_window_list[i] == NULL ) { ERROR("Couldn't open display window\n"); } else { main_n_windows++; } } + + if ( main_n_windows == 0 ) return 0; gtk_main(); return 0; -- cgit v1.2.3