Adapted for use on cluster (using MPI/OMP) parallelised gpiv_rr from gpivtools)
[gpiv.git] / src / utils.c
blob3efed625f1323fa7d443f23f69aa9f4f0894ef92
1 /* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */
3 /*----------------------------------------------------------------------
5 gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome
6 libraries.
8 Copyright (C) 2002 Gerber van der Graaf
10 This file is part of gpiv.
12 Gpiv is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2, or (at your option)
15 any later version.
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software Foundation,
24 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26 ----------------------------------------------------------------------*/
29 * utility functions for gpiv
30 * $Log: utils.c,v $
31 * Revision 1.22 2008-04-28 12:00:58 gerber
32 * hdf-formatted files are now with .hdf extension (previously: .gpi)
34 * Revision 1.21 2007-12-19 08:42:35 gerber
35 * debugged
37 * Revision 1.20 2007-11-23 16:24:08 gerber
38 * release 0.5.0: Kafka
40 * Revision 1.19 2007-06-06 17:00:48 gerber
41 * Retreives images/data from URI using Gnome Virtual File System.
43 * Revision 1.18 2007-03-22 16:00:32 gerber
44 * Added image processing tabulator
46 * Revision 1.17 2007-01-29 11:27:44 gerber
47 * added image formats png, gif, tif png, bmp, improved buffer display
49 * Revision 1.16 2006-09-18 07:27:06 gerber
50 * *** empty log message ***
52 * Revision 1.15 2006/01/29 15:36:56 gerber
53 * repaired a few annoying bugs
55 * Revision 1.13 2005/03/03 16:21:09 gerber
56 * version number
58 * Revision 1.12 2005/02/26 09:43:31 gerber
59 * parameter flags (parameter_logic) defined as gboolean
61 * Revision 1.11 2005/02/26 09:17:14 gerber
62 * structured of interrogate function by using gpiv_piv_isiadapt
64 * Revision 1.10 2005/01/19 15:53:43 gerber
65 * Initiation of Data Acquisition (DAC); trigerring of lasers and camera
66 * by using RTAI and Realtime Linux, recording images from IEEE1394
67 * (Firewire) IIDC compliant camera's
69 * Revision 1.9 2004/10/15 19:24:05 gerber
70 * GPIV_ and Gpiv prefix to defines and structure names of libgpiv
72 * Revision 1.8 2004/06/14 21:19:23 gerber
73 * Image depth up to 16 bits.
74 * Improvement "single int" and "drag int" in Eval tab.
75 * Viewer's pop-up menu.
76 * Adaption for gpiv_matrix_* and gpiv_vector_*.
77 * Resizing console.
78 * See Changelog for further info.
80 * Revision 1.7 2003/09/04 13:31:55 gerber
81 * init of printing (unfinished)
83 * Revision 1.6 2003/09/01 11:17:15 gerber
84 * improved monitoring of interrogation process
86 * Revision 1.5 2003/08/22 15:24:53 gerber
87 * interactive spatial scaling
89 * Revision 1.4 2003/07/31 11:43:26 gerber
90 * display images in gnome canvas (HOERAreset)
92 * Revision 1.3 2003/07/25 15:40:24 gerber
93 * removed/disabled setting of correlation in Eval tab, Correlation type in Image info tab
95 * Revision 1.2 2003/06/27 13:47:26 gerber
96 * display ruler, line/point evaluation
98 * Revision 1.1.1.1 2003/06/17 17:10:52 gerber
99 * Imported gpiv
103 #include "gpiv_gui.h"
104 #include "utils.h"
105 #include "display.h"
106 #include "dialog_interface.h"
107 #include "console_interface.h"
108 #ifdef ENABLE_DAC
109 #include "dac_interface.h"
110 #endif
112 void
113 update_imgh_entries (GpivConsole *gpiv,
114 GpivImagePar *image_par
116 /*-----------------------------------------------------------------------------
117 * DESCRIPTION:
118 * Refreshes image header entries and labels (when a different buffer is
119 * selected)
121 * PROTOTYPE LOCATATION:
122 * gpiv_img.h
124 * INPUTS:
125 * gpiv: console structure
126 * image_par: image parameters
128 * OUTPUTS:
129 *---------------------------------------------------------------------------*/
131 gchar label[GPIV_MAX_CHARS];
132 gchar *tmp_name, *text_uri;
133 GnomeVFSURI* uri = NULL;
135 if (display_act != NULL) {
136 g_snprintf (label, GPIV_MAX_CHARS,"%d", display_act->id);
137 gtk_label_set_text (GTK_LABEL (gpiv->imgh->label_bufno),
138 (char *) label);
140 text_uri = gnome_vfs_make_uri_from_input
141 ((const gchar *) display_act->file_uri_name);
142 if ((uri = gnome_vfs_uri_new (text_uri)) == NULL) return;
143 g_free (text_uri);
144 if (gnome_vfs_uri_is_local (uri)) {
145 gtk_label_set_text (GTK_LABEL (gpiv->imgh->label_label_name),
146 "file: ");
147 } else {
148 gtk_label_set_text (GTK_LABEL (gpiv->imgh->label_label_name),
149 "uri: ");
151 gtk_label_set_text (GTK_LABEL (gpiv->imgh->label_name),
152 display_act->file_uri_name);
153 g_snprintf (label, GPIV_MAX_CHARS, "%d", display_act->img->image->header->ncolumns);
154 gtk_label_set_text (GTK_LABEL (gpiv->imgh->label_ncols),
155 (char *) label);
156 g_snprintf (label, GPIV_MAX_CHARS, "%d", display_act->img->image->header->nrows);
157 gtk_label_set_text (GTK_LABEL (gpiv->imgh->label_nrows),
158 (char *) label);
162 gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_imgtitle),
163 image_par->title);
166 gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->imgh->spinbutton_colpos),
167 image_par->z_off_x);
168 gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->imgh->spinbutton_rowpos),
169 image_par->z_off_y);
170 gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->imgh->spinbutton_sscale),
171 image_par->s_scale);
172 gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->imgh->spinbutton_tscale),
173 image_par->t_scale);
176 gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_crdate),
177 image_par->creation_date);
178 gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_location),
179 image_par->location);
180 gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_author),
181 image_par->author);
182 gtk_entry_set_text (GTK_ENTRY(gpiv->imgh->entry_software),
183 image_par->software);
184 gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_source),
185 image_par->source);
186 gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_usertext),
187 image_par->usertext);
188 gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_warning),
189 image_par->warning);
190 gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_disclaimer),
191 image_par->disclaimer);
192 gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_comment),
193 image_par->comment);
194 gtk_entry_set_text (GTK_ENTRY(gpiv->imgh->entry_copyright),
195 image_par->copyright);
196 gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_email),
197 image_par->email);
198 gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_url),
199 image_par->url);
204 void
205 update_eval_entries (GpivConsole *gpiv,
206 GpivImagePar *image_par
208 /*-----------------------------------------------------------------------------
209 * DESCRIPTION:
210 * Refreshes spinners of col/row start/ end/ shift for image size
211 * (when a different buffer is selected)
213 * PROTOTYPE LOCATATION:
214 * gpiv_img.h
216 * INPUTS:
217 * gpiv: console structure
218 * image_par: image parameters
220 * OUTPUTS:
221 *---------------------------------------------------------------------------*/
223 if (display_act != NULL) {
224 gtk_spin_button_set_range (GTK_SPIN_BUTTON
225 (gpiv->piveval->spinbutton_colstart),
226 0.0,
227 image_par->ncolumns - 1);
228 gtk_spin_button_set_range (GTK_SPIN_BUTTON
229 (gpiv->piveval->spinbutton_colend),
230 0.0,
231 image_par->ncolumns - 1);
232 gtk_spin_button_set_range (GTK_SPIN_BUTTON
233 (gpiv->piveval->spinbutton_preshiftcol),
234 0.0 - (image_par->ncolumns - 1),
235 image_par->ncolumns - 1);
236 gtk_spin_button_set_range (GTK_SPIN_BUTTON
237 (gpiv->piveval->spinbutton_rowstart),
238 0.0,
239 image_par->nrows - 1);
240 gtk_spin_button_set_range (GTK_SPIN_BUTTON
241 (gpiv->piveval->spinbutton_rowend),
242 0.0,
243 display_act->img->image->header->nrows - 1);
244 gtk_spin_button_set_range (GTK_SPIN_BUTTON
245 (gpiv->piveval->spinbutton_preshiftrow),
246 0.0 - (image_par->nrows - 1),
247 image_par->nrows - 1);
251 * Adjust spinbutton values if they are invalid
252 * Columns
254 if (gl_piv_par->col_start > image_par->ncolumns - 1) {
255 gl_piv_par->col_start = image_par->ncolumns - 1;
256 gtk_spin_button_set_value (GTK_SPIN_BUTTON
257 (gpiv->piveval->spinbutton_colstart),
258 gl_piv_par->col_start);
261 if (gl_piv_par->col_end > image_par->ncolumns - 1) {
262 gl_piv_par->col_end = image_par->ncolumns - 1;
263 gtk_spin_button_set_value (GTK_SPIN_BUTTON
264 (gpiv->piveval->spinbutton_colend),
265 gl_piv_par->col_end);
269 if (gl_piv_par->pre_shift_col > image_par->ncolumns - 1) {
270 gl_piv_par->pre_shift_col = image_par->ncolumns - 1;
271 gtk_spin_button_set_value (GTK_SPIN_BUTTON
272 (gpiv->piveval->spinbutton_preshiftcol),
273 gl_piv_par->pre_shift_col);
276 if (gl_piv_par->pre_shift_col < (0.0 - (image_par->ncolumns - 1))) {
277 gl_piv_par->pre_shift_col = - (image_par->ncolumns - 1);
278 gtk_spin_button_set_value (GTK_SPIN_BUTTON
279 (gpiv->piveval->spinbutton_preshiftcol),
280 gl_piv_par->pre_shift_col);
284 * Rows
286 if (gl_piv_par->row_start > image_par->nrows - 1) {
287 gl_piv_par->row_start = image_par->nrows - 1;
288 gtk_spin_button_set_value (GTK_SPIN_BUTTON
289 (gpiv->piveval->spinbutton_rowstart),
290 gl_piv_par->row_start);
293 if (gl_piv_par->row_end > image_par->nrows - 1) {
294 gl_piv_par->row_end = image_par->nrows - 1;
295 gtk_spin_button_set_value (GTK_SPIN_BUTTON
296 (gpiv->piveval->spinbutton_rowend),
297 gl_piv_par->row_end);
301 if (gl_piv_par->pre_shift_row > image_par->nrows - 1) {
302 gl_piv_par->pre_shift_row = image_par->nrows - 1;
303 gtk_spin_button_set_value (GTK_SPIN_BUTTON
304 (gpiv->piveval->spinbutton_preshiftrow),
305 gl_piv_par->pre_shift_row);
308 if (gl_piv_par->pre_shift_row < (0.0 - (image_par->nrows - 1))) {
309 gl_piv_par->pre_shift_row = - (image_par->nrows - 1);
310 gtk_spin_button_set_value (GTK_SPIN_BUTTON
311 (gpiv->piveval->spinbutton_preshiftrow),
312 gl_piv_par->pre_shift_row);
320 gchar *
321 month_name (GDateMonth month)
322 /*--------------------------------------------------------------------
323 * returns the month name
326 gchar *name = NULL;
328 if (month == G_DATE_JANUARY) {
329 name = g_strdup ( _("January"));
330 } else if (month == G_DATE_FEBRUARY) {
331 name = g_strdup ( _("February"));
332 } else if (month == G_DATE_MARCH) {
333 name = g_strdup ( _("March"));
334 } else if (month == G_DATE_APRIL) {
335 name = g_strdup ( _("April"));
336 } else if (month == G_DATE_MAY) {
337 name = g_strdup ( _("May"));
338 } else if (month == G_DATE_JUNE) {
339 name = g_strdup ( _("June"));
340 } else if (month == G_DATE_JULY) {
341 name = g_strdup ( _("July"));
342 } else if (month == G_DATE_AUGUST) {
343 name = g_strdup ( _("August"));
344 } else if (month == G_DATE_SEPTEMBER) {
345 name = g_strdup ( _("September"));
346 } else if (month == G_DATE_OCTOBER) {
347 name = g_strdup ( _("October"));
348 } else if (month == G_DATE_NOVEMBER) {
349 name = g_strdup ( _("November"));
350 } else if (month == G_DATE_DECEMBER) {
351 name = g_strdup ( _("December"));
352 } else if (month == G_DATE_BAD_MONTH) {
353 name = g_strdup ( _("Bad month"));
354 } else {
355 name = g_strdup ( _("month_name: Unvalid month"));
358 return name;
363 void
364 free_all_mems (void)
365 /*--------------------------------------------------------------------
366 * Frees all allocated memory data from the application
369 gint i = 0;
371 for (i = 1; i < gpiv_var->number_fnames_last; i++) {
372 g_free (gpiv_var->fn_last[i]);
378 void
379 push_list_lastfnames (gchar *fname
381 /*--------------------------------------------------------------------
382 * Pushes fname on gpiv_var fn_last[0]
383 * Eventually removes fn_last[MAX_LIST]
386 gchar fname_nr[GPIV_MAX_CHARS];
387 gint i;
389 gnome_config_push_prefix ("/gpiv/RuntimeVariables/");
390 if (gpiv_var->number_fnames_last < MAX_LIST) {
391 gpiv_var->number_fnames_last++;
392 gnome_config_set_int ("number_fnames_last",
393 gpiv_var->number_fnames_last);
396 for (i = gpiv_var->number_fnames_last - 1; i > 0; i--) {
397 gpiv_var->fn_last[i] = g_strdup (gpiv_var->fn_last[i - 1]);
400 gpiv_var->fn_last[0] = g_strdup (fname);
401 for (i = 0; i < gpiv_var->number_fnames_last; i++) {
402 g_snprintf (fname_nr, GPIV_MAX_CHARS,"fname_last_%d", i);
403 gnome_config_set_string (fname_nr, gpiv_var->fn_last[i]);
405 if (gpiv_par->verbose)
406 g_message ("push_list_lastfnames: fn_last[0]=%s", gpiv_var->fn_last[0]);
408 gnome_config_pop_prefix ();
409 gnome_config_sync ();
414 guint
415 get_row_from_id (GpivConsole *gpiv,
416 Display *disp
418 /*-----------------------------------------------------------------------------
419 * Searches the row of buffer clist that belongs to deplay identity.
422 guint i, row;
423 Display *display_loc = NULL;
426 for (i = 0; i < nbufs; i++) {
427 display_loc = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), i);
428 if (disp->id == display_loc->id) row = i;
432 return row;
437 void
438 point_to_existbuffer (GpivConsole *gpiv
440 /*-----------------------------------------------------------------------------
441 * Point display_act to first existing buffer
444 guint i;
447 if (nbufs > 0) {
448 display_act = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), 0);
449 gtk_clist_select_row (GTK_CLIST (gpiv->clist_buf), 0, 0);
455 void
456 close_buffer__check_saved (GpivConsole *gpiv,
457 Display *disp
459 /*-----------------------------------------------------------------------------
460 * closes buffer, checks if (modified) image and data have been saved.
461 * If unsaved, close_buffer_dialog will direct to on_close_buffer_response,
462 * found in dialog.c.
465 char message[2 * GPIV_MAX_CHARS];
466 GtkDialog *close_buffer_dialog;
467 guint row = get_row_from_id (gpiv, disp);
470 if (disp == NULL) return;
472 #ifdef DEBUG
473 g_message ("close_buffer__check_saved:: id = %d saved_img = %d",
474 disp->id, display_act->img->saved_img);
475 #endif
477 if (!disp->img->saved_img
478 || !disp->pida->saved_piv
479 || !disp->pida->saved_histo
480 || !disp->pida->saved_vor
481 || !disp->pida->saved_nstrain
482 || !disp->pida->saved_sstrain) {
484 * Data not stored, deleting buffer only after permission
486 g_snprintf (message, 2 * GPIV_MAX_CHARS,
487 _("There are unsaved data that will be lost.\n\
488 Are you sure you want to close buffer #%d ?"),
489 disp->id);
490 close_buffer_dialog = create_close_buffer_dialog (gpiv, disp, message);
491 gtk_widget_show (GTK_WIDGET (close_buffer_dialog));
493 } else {
495 * No modified / new data or already stored, deleting buffer unconditionally
497 close_buffer (gpiv, disp);
504 void
505 close_buffer (GpivConsole *gpiv,
506 Display *disp
508 /*-----------------------------------------------------------------------------
509 * closes all data of a display and cleans up clist of buffer
512 guint row = get_row_from_id (gpiv, disp);
514 free_all_bufmems (disp);
515 g_free (disp->file_uri_name);
516 gtk_widget_destroy (GTK_WIDGET (disp->mwin));
517 disp = NULL;
520 * Cleaning up clist
522 gtk_clist_remove (GTK_CLIST (gpiv->clist_buf),
523 row);
524 nbufs--;
527 * Point display to an existing buffer
529 if (nbufs == 0) {
530 update_imgh_entries (gpiv, gl_image_par);
532 } else {
533 point_to_existbuffer (gpiv);
540 gfloat
541 image_mean (guint16 **img,
542 gint ncols,
543 gint nrows)
544 /*-----------------------------------------------------------------------------
547 int i, j, ncount = ncols * nrows;
548 float img_sum = 0.0, mean = 0.0;
550 for (i = 0; i < nrows; i++) {
551 for (j = 0; j < ncols; j++) {
552 img_sum += (float) img[i][j];
556 mean = img_sum / (float) ncount;
557 return mean;
562 GnomeCanvasItem
563 **alloc_gci_matrix (long nr,
564 long nc
566 /*-----------------------------------------------------------------------------
567 * Allocates 2-dimensional array for GnomeCanvasItem
570 long i;
571 GnomeCanvasItem **item;
575 * allocate pointers to rows
577 item = (GnomeCanvasItem **) g_malloc ((size_t) ((nr - 1) *
578 sizeof (GnomeCanvasItem*)));
579 if (!item) gpiv_error ("%s: allocation failure 1 in g_malloc()",
580 "alloc_gci_matrix");
581 item += 1;
584 * allocate rows and set pointers to them
586 item[0] = (GnomeCanvasItem *) g_malloc ((size_t) ((nr * nc - 1) *
587 sizeof (GnomeCanvasItem)));
588 if (!item[0]) gpiv_error ("%s: allocation failure 2 in g_malloc()",
589 "alloc_gci_matrix");
590 item[0] += 1;
592 for (i = 1; i <= nr; i++) item[i] = item[i-1] + 1;
595 * return pointer to array of pointers to rows
597 return item;
602 void
603 free_gci_matrix (GnomeCanvasItem **item,
604 long nr,
605 long nc
607 /*-----------------------------------------------------------------------------
608 * Frees 2-dimensional array for GnomeCanvasItem
611 assert (item[0] != NULL);
613 free ((char*) (item[0] - 1));
614 free ((char*) (item - 1));
619 void
620 free_all_bufmems (Display * disp)
621 /*-----------------------------------------------------------------------------
622 * Frees all dynamic memory of Buffer structure
625 if (disp != NULL) {
626 free_img_bufmems (disp);
627 free_eval_bufmems (disp);
628 free_valid_bufmems (disp);
629 free_post_bufmems (disp);
635 void
636 free_img_bufmems (Display * disp)
637 /*-----------------------------------------------------------------------------
638 * Frees all dynamic memory of Buffer structure of img
641 /* char *foo = '\0'; */
642 /* g_snprintf (disp->file_uri_name, GPIV_MAX_CHARS, ""); */
644 if (disp != NULL) {
645 if (disp->img->exist_img) {
646 gdk_pixbuf_unref (disp->img->pixbuf1);
647 if (disp->img->rgbbuf_img1 != NULL) {
648 g_free (disp->img->rgbbuf_img1);
649 disp->img->rgbbuf_img1 = NULL;
652 gdk_pixbuf_unref (disp->img->pixbuf2);
653 if (disp->img->rgbbuf_img2 != NULL) {
654 g_free (disp->img->rgbbuf_img2);
655 disp->img->rgbbuf_img2 = NULL;
659 gpiv_free_img (disp->img->image);
660 destroy_img (disp);
661 disp->img->exist_img = FALSE;
664 /* destroy_background (disp); */
665 destroy_background(display_act->gci_bg);
666 if (disp->intreg->exist_int) {
667 destroy_all_intregs (disp);
668 disp->intreg->exist_int = FALSE;
675 void
676 free_eval_bufmems (Display * disp)
677 /*-----------------------------------------------------------------------------
678 * Frees all dynamic memory of Buffer structure of evaluation processing
681 if (disp != NULL) {
682 if (disp->pida->exist_piv) {
683 destroy_all_vectors (disp->pida);
684 gpiv_free_pivdata (disp->pida->piv_data);
685 disp->pida->exist_piv = FALSE;
688 if (disp->pida->scaled_piv) {
689 gpiv_free_pivdata (disp->pida->piv_data_scaled);
690 disp->pida->scaled_piv = FALSE;
693 disp->pida->averaged_piv = FALSE;
698 void
699 free_valid_bufmems (Display * disp)
700 /*-----------------------------------------------------------------------------
701 * Frees all dynamic memory of Buffer structure of validation processing
704 if (disp != NULL) {
705 if (disp->pida->exist_histo) {
706 gpiv_free_bindata (disp->pida->klass);
707 disp->pida->exist_valid = FALSE;
713 void
714 free_post_bufmems (Display * disp
716 /*-----------------------------------------------------------------------------
717 * Frees all dynamic memory of Buffer structure of post processing
720 if (disp != NULL) {
721 if (disp->pida->exist_vor) {
722 destroy_all_scalars (disp, GPIV_VORTICITY);
723 gpiv_free_scdata (disp->pida->vor_data);
724 disp->pida->exist_vor = FALSE;
725 disp->pida->post_par->diff_type__set = FALSE;
726 disp->pida->post_par->operator_vorstra__set = FALSE;
729 if (disp->pida->exist_vor_scaled) {
730 gpiv_free_scdata (disp->pida->vor_data_scaled);
731 disp->pida->exist_vor_scaled = FALSE;
734 if (disp->pida->exist_sstrain) {
735 destroy_all_scalars (disp, GPIV_S_STRAIN);
736 gpiv_free_scdata (disp->pida->sstrain_data);
737 disp->pida->exist_sstrain = FALSE;
738 disp->pida->post_par->diff_type__set = FALSE;
739 disp->pida->post_par->operator_vorstra__set = FALSE;
742 if (disp->pida->exist_sstrain_scaled) {
743 gpiv_free_scdata (disp->pida->sstrain_data_scaled);
744 disp->pida->exist_sstrain_scaled = FALSE;
747 if (disp->pida->exist_nstrain) {
748 destroy_all_scalars (disp, GPIV_N_STRAIN);
749 gpiv_free_scdata (disp->pida->nstrain_data);
750 disp->pida->exist_nstrain = FALSE;
751 disp->pida->post_par->diff_type__set = FALSE;
752 disp->pida->post_par->operator_vorstra__set = FALSE;
755 if (disp->pida->exist_nstrain_scaled) {
756 gpiv_free_scdata (disp->pida->nstrain_data_scaled);
757 disp->pida->exist_nstrain_scaled = FALSE;
764 * gtk routines
768 void
769 on_widget_leave (GtkContainer * container,
770 GtkDirectionType direction,
771 gpointer user_data
773 /*-----------------------------------------------------------------------------
774 * Resets text in application bar to default after poiner leaves
775 * container object
778 GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (container), "gpiv");
779 gnome_appbar_push (GNOME_APPBAR (gpiv->appbar), msg_default);
784 void
785 sensitive (GpivConsole *gpiv,
786 enum WidgetSet wi_set,
787 gboolean sense)
788 /*-----------------------------------------------------------------------------
789 * Changes the sensitivity of a set of witgets
793 #ifdef ENABLE_CAM
794 Dac *dac = gpiv->dac;
795 Cam *cam = dac->cam;
796 Trig *trig = dac->trig;
797 #else
798 #ifdef ENABLE_TRIG
799 Dac *dac = gpiv->dac;
800 Trig *trig = dac->trig;
801 #endif /* ENABLE_TRIG */
802 #endif /* ENABLE_CAM */
804 * Setting sensitivity of Dac witgets
806 #ifdef ENABLE_DAC
807 if (wi_set == DAC) {
808 gtk_widget_set_sensitive (gpiv->tablabel_dac, sense);
809 gtk_widget_set_sensitive (gpiv->dac->label_title, sense);
810 gtk_widget_set_sensitive (gpiv->dac->label_fname, sense);
811 gtk_widget_set_sensitive (gpiv->dac->entry_fname, sense);
813 #endif /* DAC */
815 #ifdef ENABLE_TRIG
816 if (wi_set == DAC_TRIG) {
817 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
818 (gpiv->button_toolbar_trig),
819 gpiv_par->process__trig);
820 gtk_widget_set_sensitive (gpiv->button_toolbar_trig, sense);
821 gtk_widget_set_sensitive (trig->frame_trigger, sense);
822 gtk_widget_set_sensitive (trig->radiobutton_mouse_3, sense);
823 gtk_widget_set_sensitive (trig->radiobutton_mouse_4, sense);
824 gtk_widget_set_sensitive (trig->radiobutton_mouse_5, sense);
825 gtk_widget_set_sensitive (trig->radiobutton_mouse_6, sense);
826 gtk_widget_set_sensitive (trig->label_trigger_dt, sense);
827 gtk_widget_set_sensitive (trig->spinbutton_trigger_dt, sense);
828 gtk_widget_set_sensitive (trig->label_trigger_incrdt, sense);
829 gtk_widget_set_sensitive (trig->spinbutton_trigger_incrdt, sense);
830 gtk_widget_set_sensitive (trig->label_trigger_cap, sense);
831 gtk_widget_set_sensitive (trig->spinbutton_trigger_cap, sense);
832 gtk_widget_set_sensitive (trig->button_trigger_start, sense);
833 gtk_widget_set_sensitive (trig->button_trigger_stop, sense);
835 #endif /* ENABLE_TRIG */
837 #ifdef ENABLE_CAM
838 if (wi_set == DAC_TIMING) {
839 gtk_widget_set_sensitive (trig->frame_trigger, sense);
840 gtk_widget_set_sensitive (trig->radiobutton_mouse_1, sense);
841 gtk_widget_set_sensitive (trig->radiobutton_mouse_2, sense);
842 gtk_widget_set_sensitive (trig->label_trigger_nf, sense);
843 gtk_widget_set_sensitive (trig->spinbutton_trigger_nf, sense);
845 #else
846 #ifdef ENABLE_TRIG
847 if (wi_set == DAC_TIMING) {
848 gtk_widget_set_sensitive (trig->frame_trigger, sense);
849 gtk_widget_set_sensitive (trig->radiobutton_mouse_1, sense);
850 gtk_widget_set_sensitive (trig->radiobutton_mouse_2, sense);
851 gtk_widget_set_sensitive (trig->label_trigger_nf, sense);
852 gtk_widget_set_sensitive (trig->spinbutton_trigger_nf, sense);
854 #endif /* ENABLE_TRIG */
855 #endif /* ENABLE_CAM */
858 #ifdef ENABLE_CAM
859 if (wi_set == DAC_CAM) {
860 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
861 (gpiv->button_toolbar_cam),
862 gpiv_par->process__cam);
863 gtk_widget_set_sensitive (gpiv->button_toolbar_cam, sense);
864 gtk_widget_set_sensitive (cam->frame_cam, sense);
865 gtk_widget_set_sensitive (cam->camera_select, sense);
866 gtk_widget_set_sensitive (cam->camera_select_menu, sense);
867 gtk_widget_set_sensitive (cam->menu_item, sense);
868 gtk_widget_set_sensitive (cam->label_temp, sense);
869 gtk_widget_set_sensitive (cam->label_label_temp, sense);
870 gtk_widget_set_sensitive (cam->button_cam_start, sense);
871 gtk_widget_set_sensitive (cam->button_cam_stop, sense);
873 #endif /* ENABLE_CAM */
876 * Setting sensitivity of Image witgets
878 if (wi_set == IMG) {
880 /* gtk_widget_set_sensitive (gpiv->imgh->label_name, sense); */
881 /* gtk_widget_set_sensitive (gpiv->imgh->entry_name, sense); */
882 /* gtk_widget_set_sensitive (gpiv->imgh->spinbutton_ncols, sense); */
884 gtk_widget_set_sensitive (gpiv->imgh->label_colpos, sense);
885 gtk_widget_set_sensitive (gpiv->imgh->label_sscale, sense);
886 gtk_widget_set_sensitive (gpiv->imgh->label_ncols, sense);
887 gtk_widget_set_sensitive (gpiv->imgh->label_nrows, sense);
888 gtk_widget_set_sensitive (gpiv->imgh->label_depth, sense);
889 gtk_widget_set_sensitive (gpiv->imgh->label_rowpos, sense);
890 gtk_widget_set_sensitive (gpiv->imgh->label_tscale, sense);
891 gtk_widget_set_sensitive (gpiv->imgh->label_imgtitle, sense);
892 gtk_widget_set_sensitive (gpiv->imgh->label_crdate, sense);
893 gtk_widget_set_sensitive (gpiv->imgh->label_location, sense);
894 gtk_widget_set_sensitive (gpiv->imgh->label_author, sense);
895 gtk_widget_set_sensitive (gpiv->imgh->label_software, sense);
896 gtk_widget_set_sensitive (gpiv->imgh->label_source, sense);
897 gtk_widget_set_sensitive (gpiv->imgh->label_usertext, sense);
898 gtk_widget_set_sensitive (gpiv->imgh->label_warning, sense);
899 gtk_widget_set_sensitive (gpiv->imgh->label_disclaimer, sense);
900 gtk_widget_set_sensitive (gpiv->imgh->label_comment, sense);
901 gtk_widget_set_sensitive (gpiv->imgh->label_copyright, sense);
902 gtk_widget_set_sensitive (gpiv->imgh->label_email, sense);
903 gtk_widget_set_sensitive (gpiv->imgh->label_url, sense);
905 gtk_widget_set_sensitive (gpiv->imgh->spinbutton_colpos, sense);
906 gtk_widget_set_sensitive (gpiv->imgh->spinbutton_sscale, sense);
907 gtk_widget_set_sensitive (gpiv->imgh->spinbutton_rowpos, sense);
908 gtk_widget_set_sensitive (gpiv->imgh->spinbutton_tscale, sense);
909 gtk_widget_set_sensitive (gpiv->imgh->entry_imgtitle, sense);
910 gtk_widget_set_sensitive (gpiv->imgh->entry_crdate, sense);
911 gtk_widget_set_sensitive (gpiv->imgh->entry_location, sense);
912 gtk_widget_set_sensitive (gpiv->imgh->entry_author, sense);
913 gtk_widget_set_sensitive (gpiv->imgh->entry_software, sense);
914 gtk_widget_set_sensitive (gpiv->imgh->entry_source, sense);
915 gtk_widget_set_sensitive (gpiv->imgh->entry_usertext, sense);
916 gtk_widget_set_sensitive (gpiv->imgh->entry_warning, sense);
917 gtk_widget_set_sensitive (gpiv->imgh->entry_disclaimer, sense);
918 gtk_widget_set_sensitive (gpiv->imgh->entry_comment, sense);
919 gtk_widget_set_sensitive (gpiv->imgh->entry_copyright, sense);
920 gtk_widget_set_sensitive (gpiv->imgh->entry_email, sense);
921 gtk_widget_set_sensitive (gpiv->imgh->entry_url, sense);
926 * Setting sensitivity of Image Processing witgets
928 if (wi_set == IMGPROC) {
933 * Setting sensitivity of PIV witgets
935 if (wi_set == EVAL) {
936 gtk_widget_set_sensitive (gpiv->piveval->spinbutton_colstart, sense);
937 gtk_widget_set_sensitive (gpiv->piveval->spinbutton_colend, sense);
938 gtk_widget_set_sensitive (gpiv->piveval->spinbutton_preshiftcol, sense);
939 gtk_widget_set_sensitive (gpiv->piveval->spinbutton_rowstart, sense);
940 gtk_widget_set_sensitive (gpiv->piveval->spinbutton_rowend, sense);
941 gtk_widget_set_sensitive (gpiv->piveval->spinbutton_preshiftrow, sense);
943 /* gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_f_1, sense); */
944 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_f_2, sense);
945 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_f_3, sense);
947 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_f_4, sense);
948 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_f_5, sense);
950 /* gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_i_1, sense); */
951 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_i_2, sense);
952 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_i_3, sense);
953 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_i_4, sense);
954 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_i_5, sense);
956 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intshift_1, sense);
957 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intshift_2, sense);
958 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intshift_3, sense);
959 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intshift_4, sense);
960 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intshift_5, sense);
962 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_fit_none, sense);
963 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_fit_gauss, sense);
964 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_fit_power, sense);
965 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_fit_gravity, sense);
967 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_mouse_1, sense);
968 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_mouse_2, sense);
969 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_mouse_3, sense);
970 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_mouse_4, sense);
972 gtk_widget_set_sensitive (gpiv->piveval->checkbutton_monitor, sense);
974 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_peak_1, sense);
975 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_peak_2, sense);
976 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_peak_3, sense);
978 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_weightkernel, sense);
979 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_zerooff, sense);
980 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_centraldiff, sense);
982 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_cross_1, FALSE);
983 gtk_widget_set_sensitive (gpiv->piveval->radiobutton_cross_2, FALSE);
985 gtk_widget_set_sensitive (gpiv->piveval->button, sense);
990 * Setting sensitivity of a slection of PIV witgets
992 if (wi_set == INTREGS) {
993 /* if (piv_par->int_size_f >= 16) { */
994 /* gtk_widget_set_sensitive (GTK_WIDGET */
995 /* (gpiv->piveval->radiobutton_intsize_i_1), sense); */
996 if (gl_piv_par->int_size_f >= 32) {
997 gtk_widget_set_sensitive (GTK_WIDGET
998 (gpiv->piveval->radiobutton_intsize_i_2),
999 sense);
1000 if (gl_piv_par->int_size_f >= 64) {
1001 gtk_widget_set_sensitive (GTK_WIDGET
1002 (gpiv->piveval->radiobutton_intsize_i_3),
1003 sense);
1004 if (gl_piv_par->int_size_f >= 128) {
1005 gtk_widget_set_sensitive (GTK_WIDGET
1006 (gpiv->piveval->radiobutton_intsize_i_4),
1007 sense);
1011 /* } */
1017 * Setting sensitivity of Validation witgets
1019 if (wi_set == VALID) {
1020 gtk_widget_set_sensitive (gpiv->pivvalid->radiobutton_errvec_residu_snr, sense);
1021 gtk_widget_set_sensitive (gpiv->pivvalid->radiobutton_errvec_residu_median, sense);
1022 gtk_widget_set_sensitive (gpiv->pivvalid->radiobutton_errvec_residu_normmedian, sense);
1023 gtk_widget_set_sensitive (gpiv->pivvalid->radiobutton_disable_1, sense);
1024 gtk_widget_set_sensitive (gpiv->pivvalid->label_errvec_res, sense);
1025 gtk_widget_set_sensitive (gpiv->pivvalid->spinbutton_errvec_res, sense);
1026 gtk_widget_set_sensitive (gpiv->pivvalid->checkbutton_errvec_disres, sense);
1027 gtk_widget_set_sensitive (gpiv->pivvalid->button_errvec_resstats, sense);
1029 gtk_widget_set_sensitive (gpiv->pivvalid->radiobutton_errvec_subst_1, sense);
1030 /* gtk_widget_set_sensitive (gpiv->pivvalid->radiobutton_errvec_subst_2, sense); */
1031 gtk_widget_set_sensitive (gpiv->pivvalid->radiobutton_errvec_subst_3, sense);
1032 gtk_widget_set_sensitive (gpiv->pivvalid->button_errvec, sense);
1034 gtk_widget_set_sensitive (gpiv->pivvalid->spinbutton_histo_bins, sense);
1035 gtk_widget_set_sensitive (gpiv->pivvalid->button_peaklck, sense);
1036 gtk_widget_set_sensitive (gpiv->pivvalid->button_uhisto, sense);
1037 gtk_widget_set_sensitive (gpiv->pivvalid->button_vhisto, sense);
1042 * Setting sensitivity of Post processing witgets
1044 if (wi_set == POST) {
1045 gtk_widget_set_sensitive (gpiv->pivpost->radiobutton_vorstra_output_1, sense);
1046 gtk_widget_set_sensitive (gpiv->pivpost->radiobutton_vorstra_output_2, sense);
1047 gtk_widget_set_sensitive (gpiv->pivpost->radiobutton_vorstra_output_3, sense);
1049 gtk_widget_set_sensitive (gpiv->pivpost->radiobutton_vorstra_diffscheme_1,
1050 sense);
1051 gtk_widget_set_sensitive (gpiv->pivpost->radiobutton_vorstra_diffscheme_2,
1052 sense);
1053 gtk_widget_set_sensitive (gpiv->pivpost->radiobutton_vorstra_diffscheme_3,
1054 sense);
1055 gtk_widget_set_sensitive (gpiv->pivpost->radiobutton_vorstra_diffscheme_4,
1056 sense);
1057 gtk_widget_set_sensitive (gpiv->pivpost->button_vorstra, sense);
1064 gint
1065 on_my_popup_handler (GtkWidget *widget,
1066 GdkEvent *event)
1067 /*-----------------------------------------------------------------------------
1068 * Callback function for pop-up menus
1071 GtkMenu *menu;
1072 GdkEventButton *event_button;
1074 g_return_val_if_fail (widget != NULL, FALSE);
1075 g_return_val_if_fail (GTK_IS_MENU (widget), FALSE);
1076 g_return_val_if_fail (event != NULL, FALSE);
1078 /* The "widget" is the menu that was supplied when
1079 * gtk_signal_connect_object was called.
1081 menu = GTK_MENU (widget);
1083 if (event->type == GDK_BUTTON_PRESS)
1085 event_button = (GdkEventButton *) event;
1086 if (event_button->button == 3)
1088 gtk_menu_popup (menu, NULL, NULL, NULL, NULL,
1089 event_button->button, event_button->time);
1090 return TRUE;
1094 return FALSE;
1099 gchar *
1100 replace_home_dir_with_tilde (const gchar *uri)
1101 /*-----------------------------------------------------------------------------
1102 * I stole this from gedit
1103 * return value will have to be freed
1106 gchar *tmp;
1107 gchar *home;
1109 g_return_val_if_fail (uri != NULL, NULL);
1111 /* Note that g_get_home_dir returns a const string */
1112 tmp = (gchar *)g_get_home_dir ();
1114 if (tmp == NULL)
1115 return g_strdup (uri);
1117 home = g_filename_to_utf8 (tmp, -1, NULL, NULL, NULL);
1118 if (home == NULL)
1119 return g_strdup (uri);
1121 if (strcmp (uri, home) == 0) {
1122 g_free (home);
1124 return g_strdup ("~");
1127 tmp = home;
1128 home = g_strdup_printf ("%s/", tmp);
1129 g_free (tmp);
1131 if (g_str_has_prefix (uri, home))
1133 gchar *res;
1135 res = g_strdup_printf ("~/%s", uri + strlen (home));
1137 g_free (home);
1139 return res;
1142 g_free (home);
1144 return g_strdup (uri);
1149 gchar *
1150 replace_tilde_with_home_dir (const gchar *uri)
1151 /*-----------------------------------------------------------------------------
1152 * And wrote this by myself :) (What a genius that guy)
1155 gchar *tmp;
1156 gchar *home;
1157 gchar* home_name;
1159 g_return_val_if_fail (uri != NULL, NULL);
1161 if ((tmp =(gchar *)g_get_home_dir ()) == NULL) {
1162 return g_strdup (uri);
1165 if ((home = g_filename_to_utf8 (tmp, -1, NULL, NULL, NULL)) == NULL) {
1166 g_free (tmp);
1167 return g_strdup (uri);
1170 if (g_str_has_prefix (uri, "~/")) {
1171 home_name = g_strdup_printf ("%s/%s", home, uri + strlen ("~/"));
1172 } else {
1173 g_free (home);
1174 return g_strdup (uri);
1177 g_free (home);
1178 return (home_name);
1182 void
1183 destroy (GtkWidget * widget,
1184 gpointer data)
1185 /*-----------------------------------------------------------------------------
1186 * Destroys widget
1189 gtk_widget_destroy (widget);
1194 void message_gpiv (gchar * msg, ...)
1195 /*-----------------------------------------------------------------------------
1196 * Message box with warning
1199 /* GtkWidget */ GtkDialog *gtk_message_wi;
1200 va_list args;
1201 char local_msg[3 * GPIV_MAX_CHARS];
1203 va_start (args, msg);
1204 g_vsnprintf (local_msg, 3 * GPIV_MAX_CHARS, msg, args);
1205 gtk_message_wi = create_message_dialog (local_msg);
1206 gtk_widget_show (GTK_WIDGET (gtk_message_wi));
1207 /* gtk_widget_show_all (gtk_message_wi); */
1208 va_end (args);
1213 void warning_gpiv (gchar * msg, ...)
1214 /*-----------------------------------------------------------------------------
1215 * Message box with warning
1218 GtkDialog *gtk_warning_wi;
1219 va_list args;
1220 char lo_msg[3 * GPIV_MAX_CHARS];
1222 va_start (args, msg);
1223 g_vsnprintf (lo_msg, 3 * GPIV_MAX_CHARS, msg, args);
1224 gtk_warning_wi = create_message_dialog (lo_msg);
1225 gtk_widget_show (GTK_WIDGET (gtk_warning_wi));
1226 va_end (args);
1231 void error_gpiv (gchar * msg, ...)
1232 /*-----------------------------------------------------------------------------
1233 * Message box with error
1236 GtkDialog *gtk_error_wi;
1237 va_list args;
1238 char lo_msg[2 * GPIV_MAX_CHARS];
1240 va_start (args, msg);
1241 g_vsnprintf (lo_msg, 2 * GPIV_MAX_CHARS, msg, args);
1242 gtk_error_wi = create_error_dialog (lo_msg);
1243 gtk_widget_show (GTK_WIDGET (gtk_error_wi));
1244 va_end (args);