TSP: The Transport Sample Protocol



Main Page | Modules | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

interface.c

00001 /*
00002  * DO NOT EDIT THIS FILE - it is generated by Glade.
00003  */
00004 
00005 #ifdef HAVE_CONFIG_H
00006 #  include <config.h>
00007 #endif
00008 
00009 #include <sys/types.h>
00010 #include <sys/stat.h>
00011 #include <unistd.h>
00012 #include <string.h>
00013 #include <assert.h>
00014 
00015 #include <gdk/gdkkeysyms.h>
00016 #include <gtk/gtk.h>
00017 #include <gtk/gtkhscale.h>
00018 
00019 #include <math.h>
00020 #include <pthread.h>
00021 
00022 #include "interface.h"
00023 #include "support.h"
00024 #include "page.h"
00025 #include "tsp_consumer.h"
00026 #include "tsp_abs_types.h"
00027 #include "plotwindow.h"
00028 
00029 #include "tnt_rotate.xpm"
00030 #include "animation.h"
00031 
00032 
00033 #define LABEL_DOUBLE_FORMAT "%17s : %-14.8lg"
00034 #define LABEL_HEXA_FORMAT "%17s : 0x%08x"
00035 #define LABEL_BIN_FORMAT "%17s : 0b%8s\n                      %8s\n                      %8s\n                      %8s"
00036 
00037 extern display_page* pages;
00038 extern TSP_provider_t tsp;
00039 extern variable*** index2vars;
00040 
00041 static anim_data_t* anim_data = 0;
00042 static guint timeout_id=-1;
00043 
00044 static GtkStyle* X_style_variable;
00045 static GtkStyle* X_style_title;
00046 
00047 
00048 #define MAX_REFRESH_FREQUENCY_HZ 10.0 
00049 #define MIN_REFRESH_FREQUENCY_HZ 0.1
00050 
00051 #define FREQUENCY_TO_GUI_SCALE(frequency) log10(frequency)
00052 #define GUI_SCALE_TO_FREQUENCY(gui_value) pow(10, gui_value)
00053 
00054 static void init_style(void)
00055 {
00056   GdkColor col_bg;
00057   GdkColor col_fg;
00058   GdkFont* font;
00059 
00060   font = gdk_font_load ("-misc-fixed-*-*-normal-*-*-*-*-*-*-*-*-*");
00061   
00062   /* Variables */
00063   gdk_color_parse("yellow", &col_fg);
00064   gdk_color_parse("black", &col_bg);
00065   X_style_variable  = gtk_style_new();
00066   X_style_variable->bg[GTK_STATE_NORMAL] = col_bg;
00067   X_style_variable->fg[GTK_STATE_NORMAL] = col_fg;
00068   X_style_variable->font = font;
00069 
00070   /* Titles */
00071   gdk_color_parse("white", &col_fg);
00072   gdk_color_parse("#444444", &col_bg);
00073   X_style_title  = gtk_style_new();
00074   X_style_title->bg[GTK_STATE_NORMAL] = col_bg;
00075   X_style_title->fg[GTK_STATE_NORMAL] = col_fg;
00076   X_style_title->font = font;
00077   gdk_font_ref(font);
00078 
00079 
00080 }
00081 
00082 
00083 static void on_button_quit_clicked                 (GtkButton       *button,
00084                                                     gpointer         user_data)
00085 {
00086   gtk_exit(0);
00087 
00088 }
00089 
00090 static void on_togglebutton_toggled                (GtkToggleButton *togglebutton,
00091                                                     gpointer         user_data)
00092 {
00093   GtkWindow *current;
00094   int i;
00095 
00096   i = (gint)user_data-1;
00097 
00098   if (i < 0 || i >= conf_data.nb_page) return;
00099   
00100   current = pages[i].window;
00101 
00102   /*
00103    * Update window position and size, sync it with the pages structure
00104    */
00105   if (is_visible(GTK_WIDGET(pages[i].window)))
00106     {
00107       gtk_widget_hide(GTK_WIDGET(pages[i].window));
00108     }
00109   else
00110     {
00111       gtk_widget_show(GTK_WIDGET(pages[i].window));
00112 
00113     }
00114       
00115 }
00116 
00117 void convert_to_bin(uint32_t anuint32, char binstr[4][9]) {
00118   int i;
00119   static uint8_t mask[8] = {0x01,0x02,0x04,0x08,
00120                             0x10,0x20,0x40,0x80};
00121 
00122   for (i=0;i<8;++i) {
00123     binstr[0][7-i] = ((anuint32 & 0xFF000000) >> 24) & mask[i] ? '1' : '0';
00124     binstr[1][7-i] = ((anuint32 & 0x00FF0000) >> 16) & mask[i] ? '1' : '0';
00125     binstr[2][7-i] = ((anuint32 & 0x0000FF00) >> 8) & mask[i] ? '1' : '0';
00126     binstr[3][7-i] = ((anuint32 & 0x000000FF) >> 0) & mask[i] ? '1' : '0';
00127   }
00128   binstr[0][8] = '\0';
00129   binstr[1][8] = '\0';
00130   binstr[2][8] = '\0';
00131   binstr[3][8] = '\0';
00132 }
00133 
00134 gint
00135 redraw_widgets (gpointer data)
00136 {
00137   GtkLabel *label;
00138   char buffer[512];
00139   int var_index, var_offset, var_drvnum;
00140   
00141   double val_double = 0;
00142   int i, j;
00143   TSP_sample_t sample;
00144   int new_sample;
00145   unsigned long ulong_value;
00146   DoublePoint pt;
00147 
00148   variable** ptr_var;
00149   variable* var;
00150 
00151   
00152   const TSP_consumer_information_t*  tsp_info;
00153 
00154   /* Get the TSP information structure to retreive the base frequency */
00155   tsp_info = TSP_consumer_get_information(tsp);
00156 
00157   /* Animate arrows to say we're alive */
00158   animation_next(anim_data); 
00159 
00160   /* now get variables from TSP and refresh data for all widget for each variables */
00161   while(TSP_consumer_read_sample(tsp, &sample, &new_sample) && new_sample )
00162     {
00163       for( ptr_var = index2vars[sample.provider_global_index]; (*ptr_var) != 0 ; ptr_var++)
00164         {
00165           var = *ptr_var;
00166 
00167           if(var->widget_type == WIDGET_VIEW)
00168             {
00169               var->double_value = sample.user_value;
00170             }
00171           else
00172             {
00173               assert( var->widget_type == WIDGET_DRAW );
00174               pt.x = ((gdouble)sample.time)/(tsp_info->base_frequency ? tsp_info->base_frequency : 1);
00175               pt.y = sample.user_value;
00176               add_point(PLOTWINDOW(var->widget),&pt);
00177             }
00178         }                      
00179     }
00180 
00181   /* Refresh all variables in all the windows */
00182   for (i=0; i < conf_data.nb_page; i++) {
00183     for (j=0; j < pages[i].variables->len; j++) {
00184       int color_index;
00185       uint32_t myuint32;
00186       uint8_t myuint32str[4][9];
00187       var = g_ptr_array_index(pages[i].variables, j);
00188 
00189       switch (var->type) {
00190       case VAR_DOUBLE:
00191         /*TODO*/
00192         if(IS_PLOTWINDOW(var->widget))
00193           {
00194             gtk_widget_draw (var->widget, NULL);
00195           }
00196         else
00197           {
00198             label = GTK_LABEL(var->widget);
00199             if(var->legend)
00200               sprintf(buffer, LABEL_DOUBLE_FORMAT, var->legend, var->double_value);
00201             else
00202               sprintf(buffer, LABEL_DOUBLE_FORMAT, var->text, var->double_value);
00203             gtk_label_set_text(label, buffer);
00204                
00205           }
00206         break;
00207       case VAR_TITLE:
00208         label = GTK_LABEL(var->widget);
00209         gtk_label_set_text(label, var->text);
00210         break;
00211       case VAR_STRING:
00212         label = GTK_LABEL(var->widget);
00213         gtk_label_set_text(label, "FIXME : VAR_STRING");
00214         break;
00215       case VAR_HEXA:
00216         label = GTK_LABEL(var->widget);
00217         sprintf(buffer, LABEL_HEXA_FORMAT, var->legend == NULL ? var->text : var->legend, (unsigned long) rint(var->double_value));
00218         gtk_label_set_text(label, buffer);
00219         break;
00220       case VAR_BIN:
00221         /*TODO*/
00222         myuint32 = (unsigned long) rint(var->double_value);     
00223         convert_to_bin(myuint32,myuint32str);
00224         label = GTK_LABEL(var->widget);
00225         sprintf(buffer, LABEL_BIN_FORMAT, var->legend == NULL ? var->text : var->legend, 
00226                 myuint32str[0],myuint32str[1],myuint32str[2],myuint32str[3]);
00227         gtk_label_set_text(label, buffer);
00228         break;  
00229       default:
00230         g_warning("update_variables: unknown variable type : %d", var->type);
00231         continue;
00232       }
00233       /*TODO*/
00234       /*color_index = bstable_get_color_index(var->text);
00235         if (color_index<0 || color_index > MAX_COLORS ) */
00236       /*color_index = DEFAULT_COLOR_INDEX;
00237         gdk_color_parse(colors[color_index], &yellow);*/
00238       /* Apply the desired color */
00239       /*set_style_recursively(GTK_WIDGET(GTK_WIDGET(var->widget)->parent)->parent, style);*/
00240 
00241     }
00242 
00243     /* gtk_style_unref(*/
00244 
00245   }
00246 
00247  
00248   
00249   
00250   
00251   return TRUE;
00252 }
00253 
00254 
00255 
00256 static void  page_variables_add (int page) {
00257 
00258   GtkWidget *event_box;
00259   variable *var;
00260   guint row, col;
00261   GtkTable *table;
00262   double val_double = 0.0;
00263   int i;
00264 
00265   const TSP_consumer_information_t*  tsp_info;
00266 
00267   /* Get the TSP information structure to retreive the base frequency */
00268   tsp_info = TSP_consumer_get_information(tsp);
00269 
00270   /* Get the table from the window (we know its the only container) */
00271   table = GTK_TABLE(GTK_BIN(pages[page].window)->child);
00272 
00273   for (i=0; i < pages[page].variables->len; i++)
00274     {
00275       
00276       var = g_ptr_array_index(pages[page].variables, i);
00277 
00278       /* Set up the label, justification seems to have problems ... */
00279       switch(var->widget_type)
00280         {
00281         case WIDGET_VIEW :
00282           var->widget = gtk_label_new("");
00283           gtk_misc_set_alignment(GTK_MISC(var->widget), 0.5f, 0.5f);      
00284           break;
00285         case WIDGET_DRAW :
00286           var->widget = plotwindow_new ();
00287           if(var->legend)
00288             {
00289               set_title(PLOTWINDOW(var->widget),var->legend );    
00290             }
00291           else
00292             {
00293             set_title(PLOTWINDOW(var->widget),var->text );        
00294             }
00295           /* Set time mode with frequency and number of points */
00296           set_time_mode(PLOTWINDOW(var->widget),var->duration, tsp_info->base_frequency/var->period);
00297           break;
00298 
00299         default:
00300           assert(0);
00301         }
00302 
00303       gtk_widget_show(var->widget);
00304 
00305       event_box = gtk_event_box_new ();
00306       gtk_container_add(GTK_CONTAINER(event_box), var->widget);
00307       gtk_widget_show(GTK_WIDGET(event_box));
00308 
00309       /* Set colors */
00310       if(var->type == VAR_TITLE )
00311         {
00312           gtk_widget_set_style(var->widget, X_style_title);
00313           gtk_widget_set_style(event_box, X_style_title);
00314         }
00315       else
00316         {
00317           gtk_widget_set_style(var->widget, X_style_variable);
00318           gtk_widget_set_style(event_box, X_style_variable);
00319         }
00320 
00321       /* Compute the cell where we're going to put the widget */
00322       row = i % pages[page].rows;
00323       col = floor(i / pages[page].rows);
00324 
00325       gtk_table_attach (GTK_TABLE (table), GTK_WIDGET(event_box), col, col+1, row, row+1, 
00326                         (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
00327                         (GtkAttachOptions) (GTK_FILL | GTK_EXPAND), 3, 3);
00328     }
00329 
00330 }
00331 
00332 
00333 GtkWidget*
00334 create_page_window (int page_number) 
00335 {
00336   GtkWidget *window;
00337   GtkWidget *table;
00338   GtkWidget *button;
00339   guint row, col;
00340   int i;
00341   gchar *title;
00342   GtkStyle *style;
00343   GdkColor yellow;
00344   GdkColor black;
00345 
00346   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
00347 
00348   gtk_object_set_data (GTK_OBJECT (window), "window", window);
00349   title = g_strdup_printf("Page %d", page_number);
00350   gtk_window_set_title (GTK_WINDOW (window), title);
00351                            
00352 
00353   table = gtk_table_new (0, 0, FALSE);
00354   gtk_widget_show (table);
00355   gtk_container_add (GTK_CONTAINER (window), table);
00356 
00357   gtk_widget_set_events(window, gtk_widget_get_events(window ) |
00358                         GDK_BUTTON_PRESS_MASK |
00359                         GDK_POINTER_MOTION_MASK |
00360                         GDK_BUTTON_RELEASE_MASK |
00361                         GDK_KEY_PRESS_MASK
00362                         );
00363   GTK_WIDGET_SET_FLAGS(window, GTK_CAN_FOCUS);
00364 
00365 
00366   /* Borders or not */
00367   if(pages[page_number].no_border)
00368     {
00369       gtk_widget_realize (window);
00370       
00371       gdk_window_set_decorations (window->window, 0);
00372     }
00373 
00374   /* Set colors */
00375   gtk_widget_set_style(GTK_WIDGET(window), X_style_variable);
00376   gtk_widget_set_style(GTK_WIDGET(table), X_style_variable);
00377 
00378   return window;
00379 }
00380 
00381 
00382 static void initialize_display_timer(GtkAdjustment* adj_freq, gfloat display_frequency)
00383 {
00384   /* This line will start the refresh timer, as the
00385      callback for the adjustment will be called */
00386   gtk_adjustment_set_value(adj_freq, FREQUENCY_TO_GUI_SCALE(display_frequency));
00387   /* We must force a signal (the frequency  could have been the same) */
00388   gtk_adjustment_value_changed(adj_freq);
00389 }
00390 
00391 
00392 static void cb_timer_frequency_changed(GtkAdjustment* adj_freq, GtkLabel* label_freq)
00393 {
00394   gchar buf[256];
00395   gfloat frequency;
00396   frequency = GUI_SCALE_TO_FREQUENCY(adj_freq->value);
00397   sprintf(buf, "%.2g Hz", frequency);
00398   gtk_label_set_text(label_freq, buf);
00399 
00400   if (timeout_id != -1) {
00401     gtk_timeout_remove(timeout_id);
00402   }
00403 
00404   timeout_id = gtk_timeout_add((1000/frequency), (GtkFunction)redraw_widgets, NULL);
00405   
00406 
00407 }
00408 
00409 
00410 GtkWidget*
00411 create_mainwin (conf_data_t* conf_data, const gchar* conf_file_name)
00412 {
00413 
00414 
00415 
00416   GtkWidget *displayer_button_box;
00417   GtkWidget *frame;
00418   GtkWidget *mainvbox;
00419   GtkWidget *vbox;
00420   GtkWidget *button_hbox;
00421   GtkWidget *hbox;
00422 
00423   GtkAdjustment *adj_freq;
00424   GtkWidget *scale_freq;
00425   GtkWidget *label_freq;
00426 
00427   GtkWidget *mainwin;
00428   GtkWidget *button_quit;
00429   GtkWidget *label_disp_mesg;
00430   GtkWidget *label_points_disp;
00431   GtkWidget *label_disp_pages;
00432   GtkWidget *label_cur_conf_file;
00433   GtkWidget *checkbutton_disp_mesg;
00434   GtkWidget *checkbutton_status;
00435   GtkWidget *label_disp_freq;
00436   GtkWidget *statusbar;
00437   GtkWidget *label_status;
00438   GtkWidget *label;
00439   GtkWidget *separator;
00440 
00441   GdkPixmap *img_tnt;
00442   GdkBitmap *mask_tnt;
00443   GtkWidget *pixmap_tnt;
00444 
00445 
00446 
00447 
00448   gchar mainwin_title[1024];
00449 
00450   GtkAdjustment   *adj;
00451 
00452 
00453   /* initialize global style */
00454   init_style();
00455 
00456   /* Create mainwin */
00457   mainwin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
00458   gtk_object_set_data (GTK_OBJECT (mainwin), "mainwin", mainwin);
00459   gtk_window_set_title (GTK_WINDOW (mainwin), "Generic Draw");
00460   /*gtk_window_set_default_size (GTK_WINDOW (mainwin), 522, 217);*/
00461 
00462   /*--------------------*/
00463   
00464   mainvbox = gtk_vbox_new(FALSE, 6);
00465   gtk_container_add (GTK_CONTAINER (mainwin), mainvbox);
00466   gtk_widget_show (mainvbox);
00467 
00468   button_hbox = gtk_hbox_new(FALSE, 3);
00469   gtk_container_add (GTK_CONTAINER (mainvbox), button_hbox);
00470   gtk_widget_show (button_hbox);
00471 
00472   /*-----------------------*/
00473   /*     Quit Button       */
00474   /*-----------------------*/  
00475 
00476   button_quit = gtk_button_new();
00477   gtk_container_add (GTK_CONTAINER (button_hbox), button_quit); 
00478   gtk_widget_show (button_quit);
00479   gtk_widget_set_usize (button_quit, 57, 57);  
00480 
00481   vbox = gtk_vbox_new(FALSE, 3);
00482   gtk_container_add (GTK_CONTAINER (button_quit), vbox);
00483   gtk_widget_show (vbox);
00484 
00485   /* TNT logo */
00486   img_tnt = gdk_pixmap_colormap_create_from_xpm_d(NULL, 
00487                                                   gtk_widget_get_colormap(GTK_WIDGET(mainvbox)),
00488                                                   &mask_tnt,
00489                                                   NULL, 
00490                                                   tnt_rotate_xpm);  
00491   pixmap_tnt = gtk_pixmap_new(img_tnt, mask_tnt);
00492   gtk_container_add (GTK_CONTAINER (vbox), pixmap_tnt); 
00493   gtk_widget_show (pixmap_tnt);  
00494 
00495   label = gtk_label_new ("Quit");
00496   gtk_container_add (GTK_CONTAINER (vbox), label); 
00497   gtk_widget_show (label);  
00498   
00499   /*-----------------------*/
00500   /* Displayer button frame */
00501   /*-----------------------*/
00502   frame = gtk_frame_new("Displayed pages");
00503   gtk_frame_set_label_align(GTK_FRAME(frame),0.05, 0);
00504   gtk_container_add (GTK_CONTAINER (button_hbox), frame); 
00505   gtk_frame_set_label_align(GTK_FRAME(frame),0.05, 0);
00506   gtk_widget_show (frame);
00507 
00508   displayer_button_box = gtk_hbox_new(FALSE, 3);
00509   gtk_container_set_border_width(GTK_CONTAINER(displayer_button_box), 3);  
00510   gtk_container_add (GTK_CONTAINER (frame), displayer_button_box); 
00511   gtk_widget_show (displayer_button_box);  
00512   
00513   separator = gtk_hseparator_new();
00514   gtk_container_add (GTK_CONTAINER (mainvbox), separator);
00515   gtk_widget_show (separator);
00516 
00517   /*-----------------------*/
00518   /* Refresh Frequency */
00519   /*-----------------------*/
00520 
00521   hbox = gtk_hbox_new(FALSE, 3);
00522   gtk_container_add (GTK_CONTAINER (mainvbox), hbox);
00523   gtk_widget_show (hbox);
00524 
00525   label = gtk_label_new ("Refresh frequency :");
00526   gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); 
00527   gtk_widget_show (label);  
00528 
00529   label_freq = gtk_label_new ("");
00530   gtk_box_pack_start (GTK_BOX (hbox), label_freq, FALSE, FALSE, 0); 
00531   gtk_widget_show (label_freq);  
00532 
00533   adj_freq = GTK_ADJUSTMENT(gtk_adjustment_new (0,
00534                                                 FREQUENCY_TO_GUI_SCALE(MIN_REFRESH_FREQUENCY_HZ),
00535                                                 FREQUENCY_TO_GUI_SCALE(MAX_REFRESH_FREQUENCY_HZ),
00536                                                 0.1, 1, 0.0));
00537   scale_freq = gtk_hscale_new (adj_freq);  
00538   gtk_range_set_update_policy (GTK_RANGE (scale_freq),
00539                                GTK_UPDATE_CONTINUOUS);
00540   gtk_scale_set_draw_value (GTK_SCALE(scale_freq), FALSE);
00541 
00542   gtk_container_add (GTK_CONTAINER (mainvbox), scale_freq);
00543   gtk_widget_show (scale_freq);
00544 
00545   gtk_signal_connect(GTK_OBJECT(adj_freq), "value_changed",
00546                      GTK_SIGNAL_FUNC (cb_timer_frequency_changed), label_freq);
00547 
00548 
00549   separator = gtk_hseparator_new();
00550   gtk_container_add (GTK_CONTAINER (mainvbox), separator);
00551   gtk_widget_show (separator);
00552 
00553   
00554   /*-----------------------*/
00555   /* Bottom bare */
00556   /*-----------------------*/
00557   hbox = gtk_hbox_new(FALSE, 3);
00558   gtk_container_add (GTK_CONTAINER (mainvbox), hbox);
00559   gtk_widget_show (hbox);
00560 
00561   /* animation */
00562   anim_data = animation_create(gtk_widget_get_colormap(GTK_WIDGET(mainvbox)));
00563   gtk_widget_show(GTK_WIDGET( anim_data->pixmap));
00564   gtk_box_pack_start(GTK_BOX(hbox),GTK_WIDGET( anim_data->pixmap), FALSE, FALSE, 0);
00565 
00566 
00567   /* status bar */
00568   statusbar = gtk_statusbar_new ();
00569   gtk_widget_show (statusbar);
00570   gtk_box_pack_start(GTK_BOX(hbox),GTK_WIDGET(statusbar), TRUE, TRUE, 0);
00571 
00572 
00573   /* ----------------------- */
00574   /* Create pages for display */
00575   /* ----------------------- */
00576   {
00577     GtkWidget* togglebutton;
00578     int i;
00579     gchar slabel[256];
00580     for(i = 0 ; i< conf_data->nb_page ; i++)
00581       {
00582         /* Create window */
00583         pages[i].window = GTK_WINDOW(create_page_window(i));
00584         gtk_window_set_title(GTK_WINDOW (pages[i].window), pages[i].title);
00585       
00586         /* Create button */
00587         sprintf(slabel, "%d", i+1);
00588         togglebutton = gtk_toggle_button_new_with_label (slabel);
00589         gtk_widget_show (togglebutton);
00590         gtk_container_add( GTK_CONTAINER(displayer_button_box), togglebutton);
00591         gtk_widget_set_usize (togglebutton, 27, 24);
00592         gtk_signal_connect (GTK_OBJECT (togglebutton), "toggled",
00593                             GTK_SIGNAL_FUNC (on_togglebutton_toggled),
00594                             (gpointer)(i+1));
00595 
00596 
00597         /* Add variables in page */
00598         page_variables_add(i);
00599 
00600         /* Manage window */
00601         if(pages[i].default_is_visible)
00602           {
00603 
00604 
00605             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(togglebutton), TRUE);
00606             gtk_widget_set_uposition(GTK_WIDGET(pages[i].window), 
00607                                      pages[i].position.x, 
00608                                      pages[i].position.y);
00609             gtk_window_set_default_size (GTK_WINDOW (pages[i].window),
00610                                          pages[i].position.width, 
00611                                          pages[i].position.height);
00612 
00613 
00614           
00615 
00616           }
00617       
00618       }
00619   }
00620 
00621 
00622  
00623 
00624   gtk_signal_connect (GTK_OBJECT (button_quit), "clicked",
00625                       GTK_SIGNAL_FUNC (on_button_quit_clicked),
00626                       NULL);
00627 
00628   /*-------------*/
00629   /* FIXME */
00630   sprintf(mainwin_title, "TSP GDISP (%s)", conf_file_name);
00631   gtk_window_set_title(GTK_WINDOW(mainwin), mainwin_title);
00632 
00633   /*--------------------------------*/
00634   /* Initialise display timer value */
00635   /*--------------------------------*/
00636   initialize_display_timer(adj_freq, conf_data->display_frequency);
00637 
00638   gtk_widget_show(mainwin);
00639   return mainwin;
00640 }
00641 
Framework Home Page.

Beware !! TSP wave is coming...