diff options
-rw-r--r-- | gtk/gsm_map_stat.c | 515 | ||||
-rw-r--r-- | gtk/gsm_map_stat.h | 4 | ||||
-rw-r--r-- | gtk/gui_utils.c | 35 | ||||
-rw-r--r-- | gtk/gui_utils.h | 7 | ||||
-rw-r--r-- | gtk/rtp_analysis.c | 36 |
5 files changed, 308 insertions, 289 deletions
diff --git a/gtk/gsm_map_stat.c b/gtk/gsm_map_stat.c index f4f15cfa22..742b6cce2a 100644 --- a/gtk/gsm_map_stat.c +++ b/gtk/gsm_map_stat.c @@ -57,42 +57,215 @@ #include "gtk/filter_dlg.h" #include "gtk/gsm_map_stat.h" -#include "image/clist_ascend.xpm" -#include "image/clist_descend.xpm" - -typedef struct column_arrows { - GtkWidget *table; - GtkWidget *ascend_pm; - GtkWidget *descend_pm; -} column_arrows; - -#define GSM_MAP_INIT_TABLE_NUM_COLUMNS 10 - -typedef struct _my_columns_t { - guint32 value; - const gchar *strptr; - GtkJustification just; -} my_columns_t; - -static my_columns_t columns[GSM_MAP_INIT_TABLE_NUM_COLUMNS] = { - { 40, "ID", GTK_JUSTIFY_LEFT }, - { 210, "Operation Code", GTK_JUSTIFY_LEFT }, - { 60, "Invokes", GTK_JUSTIFY_RIGHT }, - { 100, "Num Bytes", GTK_JUSTIFY_RIGHT }, - { 80, "Avg Bytes", GTK_JUSTIFY_RIGHT }, - { 60, "RetResult", GTK_JUSTIFY_RIGHT }, - { 100, "Num Bytes", GTK_JUSTIFY_RIGHT }, - { 80, "Avg Bytes", GTK_JUSTIFY_RIGHT }, - { 100, "Total Bytes", GTK_JUSTIFY_RIGHT }, - { 80, "Avg Bytes", GTK_JUSTIFY_RIGHT } +enum +{ + ID_COLUMN, + OP_CODE_COLUMN, + INVOKES_COLUMN, + NUM_BYTES_FWD_COLUMN, + AVG_BYTES_FWD_COLUMN, + RET_RES_COLUMN, + NUM_BYTES_REV_COLUMN, + AVG_BYTES_REV_COLUMN, + TOT_BYTES_COLUMN, + AVG_BYTES_COLUMN, + N_COLUMN /* The number of columns */ }; +/* Create list */ +static +GtkWidget* create_list() +{ + + GtkListStore *list_store; + GtkWidget *list; + GtkTreeViewColumn *column; + GtkCellRenderer *renderer; + GtkTreeSortable *sortable; + GtkTreeView *list_view; + GtkTreeSelection *selection; + + /* Create the store */ + list_store = gtk_list_store_new(N_COLUMN, /* Total number of columns XXX*/ + G_TYPE_UINT, /* ID */ + G_TYPE_STRING, /* Operation Code */ + G_TYPE_INT, /* Invokes */ + G_TYPE_INT, /* Num Bytes */ + G_TYPE_FLOAT, /* Avg Bytes */ + G_TYPE_INT, /* RetResult */ + G_TYPE_INT, /* Num Bytes */ + G_TYPE_FLOAT, /* Avg Bytes */ + G_TYPE_INT, /* Total Bytes */ + G_TYPE_FLOAT); /* Avg Bytes */ + + /* Create a view */ + list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store)); + + list_view = GTK_TREE_VIEW(list); + sortable = GTK_TREE_SORTABLE(list_store); + +#if GTK_CHECK_VERSION(2,6,0) + /* Speed up the list display */ + gtk_tree_view_set_fixed_height_mode(list_view, TRUE); +#endif + + /* Setup the sortable columns */ + gtk_tree_sortable_set_sort_column_id(sortable, ID_COLUMN, GTK_SORT_ASCENDING); + gtk_tree_view_set_headers_clickable(list_view, FALSE); + + /* The view now holds a reference. We can get rid of our own reference */ + g_object_unref (G_OBJECT (list_store)); + + /* + * Create the first column packet, associating the "text" attribute of the + * cell_renderer to the first column of the model + */ + /* 1:st column */ + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("ID", renderer, + "text", ID_COLUMN, + NULL); + + gtk_tree_view_column_set_sort_column_id(column, ID_COLUMN); + 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_min_width(column, 40); + + /* Add the column to the view. */ + gtk_tree_view_append_column (list_view, column); + + /* 2:nd column..Operation Code. */ + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("Operation Code", renderer, + "text", OP_CODE_COLUMN, + NULL); + gtk_tree_view_column_set_sort_column_id(column, OP_CODE_COLUMN); + 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_min_width(column, 210); + gtk_tree_view_append_column (list_view, column); + + /* 3:d column..Invokes. */ + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("Invokes", renderer, + "text", INVOKES_COLUMN, + NULL); + gtk_tree_view_column_set_sort_column_id(column, INVOKES_COLUMN); + 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_min_width(column, 60); + gtk_tree_view_append_column (list_view, column); + + /* 4:th column.. Num Bytes. */ + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("Num Bytes", renderer, + "text", NUM_BYTES_FWD_COLUMN, + NULL); + + + gtk_tree_view_column_set_sort_column_id(column, NUM_BYTES_FWD_COLUMN); + 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_min_width(column, 100); + gtk_tree_view_append_column (list_view, column); + + /* 5:th column.. Avg Bytes. */ + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("Avg Bytes", renderer, + "text", AVG_BYTES_FWD_COLUMN, + NULL); + gtk_tree_view_column_set_cell_data_func(column, renderer, float_data_func, + GINT_TO_POINTER(AVG_BYTES_FWD_COLUMN), NULL); + + gtk_tree_view_column_set_sort_column_id(column, AVG_BYTES_FWD_COLUMN); + 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_min_width(column, 80); + gtk_tree_view_append_column (list_view, column); + + /* 6:d column..Invokes. */ + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("ReturnResult", renderer, + "text", RET_RES_COLUMN, + NULL); + gtk_tree_view_column_set_sort_column_id(column, RET_RES_COLUMN); + 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_min_width(column, 60); + gtk_tree_view_append_column (list_view, column); + + /* 7:th column.. Num Bytes. */ + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("Num Bytes", renderer, + "text", NUM_BYTES_REV_COLUMN, + NULL); + + + gtk_tree_view_column_set_sort_column_id(column, NUM_BYTES_FWD_COLUMN); + 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_min_width(column, 100); + gtk_tree_view_append_column (list_view, column); + + /* 8:th column.. Avg Bytes. */ + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("Avg Bytes", renderer, + "text", AVG_BYTES_REV_COLUMN, + NULL); + gtk_tree_view_column_set_cell_data_func(column, renderer, float_data_func, + GINT_TO_POINTER(AVG_BYTES_REV_COLUMN), NULL); + + + gtk_tree_view_column_set_sort_column_id(column, AVG_BYTES_REV_COLUMN); + 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_min_width(column, 80); + gtk_tree_view_append_column (list_view, column); + + /* 9:th column.. Total Bytes. */ + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("Total Bytes", renderer, + "text", TOT_BYTES_COLUMN, + NULL); + + + gtk_tree_view_column_set_sort_column_id(column, NUM_BYTES_FWD_COLUMN); + 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_min_width(column, 100); + gtk_tree_view_append_column (list_view, column); + + /* 10:th column.. Avg Bytes. */ + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("Avg Bytes", renderer, + "text", AVG_BYTES_COLUMN, + NULL); + gtk_tree_view_column_set_cell_data_func(column, renderer, float_data_func, + GINT_TO_POINTER(AVG_BYTES_COLUMN), NULL); + + gtk_tree_view_column_set_sort_column_id(column, AVG_BYTES_COLUMN); + 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_min_width(column, 60); + gtk_tree_view_append_column (list_view, column); + + /* Now enable the sorting of each column */ + gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(list_view), TRUE); + gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(list_view), TRUE); + + /* Setup the selection handler */ + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list)); + gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); + + return list; + +} + typedef struct _gsm_map_stat_dlg_t { GtkWidget *win; GtkWidget *scrolled_win; GtkWidget *table; - char *entries[GSM_MAP_INIT_TABLE_NUM_COLUMNS]; } gsm_map_stat_dlg_t; static gsm_map_stat_dlg_t dlg; @@ -153,153 +326,65 @@ gsm_map_stat_draw( void *tapdata) { gsm_map_stat_t *stat_p = tapdata; - int i, j; - char *strp; + int i; + GtkListStore *list_store; + GtkTreeIter iter; + guint id; if (dlg.win && tapdata) { - i = 0; - - while (gsm_map_opr_code_strings[i].strptr) - { - j = gtk_clist_find_row_from_data(GTK_CLIST(dlg.table), (gpointer)(long) i); - - strp = g_strdup_printf("%d", stat_p->opr_code[i]); - gtk_clist_set_text(GTK_CLIST(dlg.table), j, 2, strp); - g_free(strp); - - strp = g_strdup_printf("%.0f", stat_p->size[i]); - gtk_clist_set_text(GTK_CLIST(dlg.table), j, 3, strp); - g_free(strp); - - if (stat_p->opr_code[i] >0) - strp = g_strdup_printf("%.2f",stat_p->size[i]/stat_p->opr_code[i]); - else strp=g_strdup_printf("--"); - gtk_clist_set_text(GTK_CLIST(dlg.table), j, 4, strp); - g_free(strp); - - strp = g_strdup_printf("%u", stat_p->opr_code_rr[i]); - gtk_clist_set_text(GTK_CLIST(dlg.table), j, 5, strp); - g_free(strp); - - strp = g_strdup_printf("%.0f", stat_p->size_rr[i]); - gtk_clist_set_text(GTK_CLIST(dlg.table), j, 6, strp); - g_free(strp); - - if (stat_p->opr_code_rr[i]>0) - strp = g_strdup_printf("%.2f",stat_p->size_rr[i]/stat_p->opr_code_rr[i]); - else strp=g_strdup_printf("--"); - gtk_clist_set_text(GTK_CLIST(dlg.table), j, 7, strp); - g_free(strp); - - strp = g_strdup_printf("%.0f", stat_p->size[i] + stat_p->size_rr[i]); - gtk_clist_set_text(GTK_CLIST(dlg.table), j, 8, strp); - g_free(strp); - - if ((stat_p->opr_code[i] + stat_p->opr_code_rr[i])>0) - strp = g_strdup_printf("%.2f", - (stat_p->size[i] +stat_p->size_rr[i])/(stat_p->opr_code[i] + stat_p->opr_code_rr[i])); - else strp=g_strdup_printf("--"); - gtk_clist_set_text(GTK_CLIST(dlg.table), j, 9, strp); - g_free(strp); - - i++; + list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (dlg.table))); /* Get store */ + + i = 0; + while (gsm_map_opr_code_strings[i].strptr){ + /* Creates a new row at position. iter will be changed to point to this new row. + * If position is larger than the number of rows on the list, then the new row will be appended to the list. + * The row will be filled with the values given to this function. + * : + * should generally be preferred when inserting rows in a sorted list store. + */ + float avrage_bytes_fwd; + float avrage_bytes_rev; + float avrage_bytes_tot; + + id = gsm_map_opr_code_strings[i].value; + if (stat_p->opr_code[i] >0){ + avrage_bytes_fwd =(float)stat_p->size[i]/(float)stat_p->opr_code[i]; + }else{ + avrage_bytes_fwd = 0; + } + if (stat_p->opr_code_rr[i] >0){ + avrage_bytes_rev = (float)stat_p->size_rr[i]/(float)stat_p->opr_code_rr[i]; + }else{ + avrage_bytes_rev = 0; + } + if ((stat_p->opr_code[i] + stat_p->opr_code_rr[i])>0){ + avrage_bytes_tot = (float)(stat_p->size[i] +stat_p->size_rr[i])/(float)(stat_p->opr_code[i] + stat_p->opr_code_rr[i]); + }else{ + avrage_bytes_tot = 0; + } +#if GTK_CHECK_VERSION(2,6,0) + gtk_list_store_insert_with_values( list_store , &iter, G_MAXINT, +#else + gtk_list_store_append (list_store, &iter); + gtk_list_store_set (list_store, &iter, +#endif + ID_COLUMN, gsm_map_opr_code_strings[i].value, + OP_CODE_COLUMN, (char*)gsm_map_opr_code_strings[i].strptr, + INVOKES_COLUMN, stat_p->opr_code[i], + NUM_BYTES_FWD_COLUMN, (gint)stat_p->size[i], + AVG_BYTES_FWD_COLUMN, avrage_bytes_fwd, + RET_RES_COLUMN, stat_p->opr_code_rr[i], + NUM_BYTES_REV_COLUMN, stat_p->size_rr[i], + AVG_BYTES_REV_COLUMN, avrage_bytes_rev, + TOT_BYTES_COLUMN, stat_p->size[i] + stat_p->size_rr[i], + AVG_BYTES_COLUMN, avrage_bytes_tot, + -1); + i++; + } } - - gtk_clist_sort(GTK_CLIST(dlg.table)); - } } - -static void -gsm_map_stat_gtk_click_column_cb( - GtkCList *clist, - gint column, - gpointer data) -{ - column_arrows *col_arrows = (column_arrows *) data; - int i; - - - gtk_clist_freeze(clist); - - for (i=0; i < GSM_MAP_INIT_TABLE_NUM_COLUMNS; i++) - { - gtk_widget_hide(col_arrows[i].ascend_pm); - gtk_widget_hide(col_arrows[i].descend_pm); - } - - if (column == clist->sort_column) - { - if (clist->sort_type == GTK_SORT_ASCENDING) - { - clist->sort_type = GTK_SORT_DESCENDING; - gtk_widget_show(col_arrows[column].descend_pm); - } - else - { - clist->sort_type = GTK_SORT_ASCENDING; - gtk_widget_show(col_arrows[column].ascend_pm); - } - } - else - { - /* - * Columns 0-1 sorted in descending order by default - */ - if (column <= 1) - { - clist->sort_type = GTK_SORT_ASCENDING; - gtk_widget_show(col_arrows[column].ascend_pm); - } - else - { - clist->sort_type = GTK_SORT_DESCENDING; - gtk_widget_show(col_arrows[column].descend_pm); - } - - gtk_clist_set_sort_column(clist, column); - } - - gtk_clist_thaw(clist); - gtk_clist_sort(clist); -} - - -static gint -gsm_map_stat_gtk_sort_column( - GtkCList *clist, - gconstpointer ptr1, - gconstpointer ptr2) -{ - const GtkCListRow *row1 = (const GtkCListRow *) ptr1; - const GtkCListRow *row2 = (const GtkCListRow *) ptr2; - char *text1 = NULL; - char *text2 = NULL; - int i1, i2; - - text1 = GTK_CELL_TEXT(row1->cell[clist->sort_column])->text; - text2 = GTK_CELL_TEXT(row2->cell[clist->sort_column])->text; - - switch (clist->sort_column) - { - case 1: - /* text columns */ - return(strcmp(text1, text2)); - - default: - /* number columns */ - i1 = strtol(text1, NULL, 0); - i2 = strtol(text2, NULL, 0); - return(i1 - i2); - } - - g_assert_not_reached(); - - return(0); -} - - static void gsm_map_stat_gtk_win_destroy_cb( GtkWindow *win _U_, @@ -314,9 +399,6 @@ gsm_map_stat_gtk_win_create( gsm_map_stat_dlg_t *dlg_p, const char *title) { - int i; - column_arrows *col_arrows; - GtkWidget *column_lb; GtkWidget *vbox; GtkWidget *bt_close; GtkWidget *bbox; @@ -332,62 +414,11 @@ gsm_map_stat_gtk_win_create( dlg_p->scrolled_win = scrolled_window_new(NULL, NULL); gtk_box_pack_start(GTK_BOX(vbox), dlg_p->scrolled_win, TRUE, TRUE, 0); - dlg_p->table = gtk_clist_new(GSM_MAP_INIT_TABLE_NUM_COLUMNS); - - col_arrows = - (column_arrows *) g_malloc(sizeof(column_arrows) * GSM_MAP_INIT_TABLE_NUM_COLUMNS); - - for (i = 0; i < GSM_MAP_INIT_TABLE_NUM_COLUMNS; i++) - { - col_arrows[i].table = gtk_table_new(2, 2, FALSE); - - gtk_table_set_col_spacings(GTK_TABLE(col_arrows[i].table), 5); - - column_lb = gtk_label_new(columns[i].strptr); - - gtk_table_attach(GTK_TABLE(col_arrows[i].table), column_lb, - 0, 1, 0, 2, GTK_SHRINK, GTK_SHRINK, 0, 0); - - gtk_widget_show(column_lb); - - col_arrows[i].ascend_pm = xpm_to_widget(clist_ascend_xpm); - - gtk_table_attach(GTK_TABLE(col_arrows[i].table), col_arrows[i].ascend_pm, - 1, 2, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0); + dlg_p->table = create_list(); + gtk_widget_show(dlg_p->table); - col_arrows[i].descend_pm = xpm_to_widget(clist_descend_xpm); - - gtk_table_attach(GTK_TABLE(col_arrows[i].table), col_arrows[i].descend_pm, - 1, 2, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0); - - if (i == 0) - { - /* default column sorting */ - gtk_widget_show(col_arrows[i].ascend_pm); - } - - gtk_clist_set_column_justification(GTK_CLIST(dlg_p->table), i, columns[i].just); - - gtk_clist_set_column_widget(GTK_CLIST(dlg_p->table), i, col_arrows[i].table); - gtk_widget_show(col_arrows[i].table); - } - gtk_clist_column_titles_show(GTK_CLIST(dlg_p->table)); - - gtk_clist_set_compare_func(GTK_CLIST(dlg_p->table), gsm_map_stat_gtk_sort_column); - gtk_clist_set_sort_column(GTK_CLIST(dlg_p->table), 0); - gtk_clist_set_sort_type(GTK_CLIST(dlg_p->table), GTK_SORT_ASCENDING); - - for (i = 0; i < GSM_MAP_INIT_TABLE_NUM_COLUMNS; i++) - { - gtk_clist_set_column_width(GTK_CLIST(dlg_p->table), i, columns[i].value); - } - - gtk_clist_set_shadow_type(GTK_CLIST(dlg_p->table), GTK_SHADOW_IN); - gtk_clist_column_titles_show(GTK_CLIST(dlg_p->table)); gtk_container_add(GTK_CONTAINER(dlg_p->scrolled_win), dlg_p->table); - g_signal_connect(dlg_p->table, "click-column", G_CALLBACK(gsm_map_stat_gtk_click_column_cb), col_arrows); - /* Button row. */ bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL); gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); @@ -408,43 +439,19 @@ gsm_map_stat_gtk_cb( GtkWidget *w _U_, gpointer d _U_) { - int i,j; /* * if the window is already open, bring it to front */ - if (dlg.win) - { - gdk_window_raise(dlg.win->window); - return; + if (dlg.win){ + gdk_window_raise(dlg.win->window); + return; } gsm_map_stat_gtk_win_create(&dlg, "GSM MAP Operation Statistics"); - i = 0; - while (gsm_map_opr_code_strings[i].strptr) - { - dlg.entries[0] = g_strdup_printf("%u", - gsm_map_opr_code_strings[i].value); - - dlg.entries[1] = g_strdup(gsm_map_opr_code_strings[i].strptr); - - /* - * set the rest of the columns - */ - for (j = 2; j < GSM_MAP_INIT_TABLE_NUM_COLUMNS; j++) - { - dlg.entries[j] = g_strdup("0"); - } - - gtk_clist_insert(GTK_CLIST(dlg.table), i, dlg.entries); - gtk_clist_set_row_data(GTK_CLIST(dlg.table), i, (gpointer)(long) i); - - i++; - } - - gsm_map_stat_draw(&gsm_map_stat); + gsm_map_stat_draw(&gsm_map_stat); } diff --git a/gtk/gsm_map_stat.h b/gtk/gsm_map_stat.h index 39d3d6d4d3..c10bdb3b01 100644 --- a/gtk/gsm_map_stat.h +++ b/gtk/gsm_map_stat.h @@ -31,10 +31,10 @@ /** Gsm map statistic data */ typedef struct _gsm_map_stat_t { int opr_code[GSM_MAP_MAX_NUM_OPR_CODES]; - double size[GSM_MAP_MAX_NUM_OPR_CODES]; + int size[GSM_MAP_MAX_NUM_OPR_CODES]; int opr_code_rr[GSM_MAP_MAX_NUM_OPR_CODES]; - double size_rr[GSM_MAP_MAX_NUM_OPR_CODES]; + int size_rr[GSM_MAP_MAX_NUM_OPR_CODES]; } gsm_map_stat_t; /** Global gsm map statistic data */ diff --git a/gtk/gui_utils.c b/gtk/gui_utils.c index 5453b4cdab..417ed41165 100644 --- a/gtk/gui_utils.c +++ b/gtk/gui_utils.c @@ -29,6 +29,7 @@ #endif #include <string.h> +#include <locale.h> #include <gtk/gtk.h> #include <gdk/gdkkeysyms.h> @@ -1136,4 +1137,38 @@ tree_view_key_pressed_cb(GtkWidget *tree, GdkEventKey *event, gpointer user_data return FALSE; } +/* + * This function can be called from gtk_tree_view_column_set_cell_data_func() + * the user data must be the colum number. + * Present floats with two decimals + */ +void +float_data_func (GtkTreeViewColumn *column _U_, + GtkCellRenderer *renderer, + GtkTreeModel *model, + GtkTreeIter *iter, + gpointer user_data) + { + gfloat float_val; + gchar buf[20]; + char *savelocale; + + /* the col to get data from is in userdata */ + gint float_col = GPOINTER_TO_INT(user_data); + + gtk_tree_model_get(model, iter, float_col, &float_val, -1); + + /* save the current locale */ + savelocale = setlocale(LC_NUMERIC, NULL); + /* switch to "C" locale to avoid problems with localized decimal separators + * in g_snprintf("%f") functions + */ + setlocale(LC_NUMERIC, "C"); + + g_snprintf(buf, sizeof(buf), "%.2f", float_val); + /* restore previous locale setting */ + setlocale(LC_NUMERIC, savelocale); + + g_object_set(renderer, "text", buf, NULL); + } diff --git a/gtk/gui_utils.h b/gtk/gui_utils.h index 780886a408..2fbeccb8da 100644 --- a/gtk/gui_utils.h +++ b/gtk/gui_utils.h @@ -303,4 +303,11 @@ extern void copy_binary_to_clipboard(const guint8* data_p, int len); */ extern gchar *create_user_window_title(const gchar *caption); +/* + * This function can be called from gtk_tree_view_column_set_cell_data_func() + * the user data must be the colum number. + * Present floats with two decimals + */ +void float_data_func (GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data); + #endif /* __GTKGUIUI_UTIL_H__ */ diff --git a/gtk/rtp_analysis.c b/gtk/rtp_analysis.c index 5bbd869f3d..8567313322 100644 --- a/gtk/rtp_analysis.c +++ b/gtk/rtp_analysis.c @@ -2892,36 +2892,6 @@ static void add_to_list(GtkWidget *list, user_data_t * user_data, guint32 number * Functions needed to present values from the list */ -/* Present floats with two decimals */ -static void -rtp_float_data_func (GtkTreeViewColumn *column _U_, - GtkCellRenderer *renderer, - GtkTreeModel *model, - GtkTreeIter *iter, - gpointer user_data) - { - gfloat float_val; - gchar buf[20]; - char *savelocale; - - /* the col to get data from is in userdata */ - gint float_col = GPOINTER_TO_INT(user_data); - - gtk_tree_model_get(model, iter, float_col, &float_val, -1); - - /* save the current locale */ - savelocale = setlocale(LC_NUMERIC, NULL); - /* switch to "C" locale to avoid problems with localized decimal separators - * in g_snprintf("%f") functions - */ - setlocale(LC_NUMERIC, "C"); - - g_snprintf(buf, sizeof(buf), "%.2f", float_val); - /* restore previous locale setting */ - setlocale(LC_NUMERIC, savelocale); - - g_object_set(renderer, "text", buf, NULL); - } /* Present boolean value */ void @@ -3033,7 +3003,7 @@ GtkWidget* create_list(user_data_t* user_data) "background", BACKGROUND_COLOR_COL, NULL); - gtk_tree_view_column_set_cell_data_func(column, renderer, rtp_float_data_func, + gtk_tree_view_column_set_cell_data_func(column, renderer, float_data_func, GINT_TO_POINTER(DELTA_COLUMN), NULL); gtk_tree_view_column_set_sort_column_id(column, DELTA_COLUMN); @@ -3050,7 +3020,7 @@ GtkWidget* create_list(user_data_t* user_data) "background", BACKGROUND_COLOR_COL, NULL); - gtk_tree_view_column_set_cell_data_func(column, renderer, rtp_float_data_func, + gtk_tree_view_column_set_cell_data_func(column, renderer, float_data_func, GINT_TO_POINTER(JITTER_COLUMN), NULL); gtk_tree_view_column_set_sort_column_id(column, JITTER_COLUMN); @@ -3067,7 +3037,7 @@ GtkWidget* create_list(user_data_t* user_data) "background", BACKGROUND_COLOR_COL, NULL); - gtk_tree_view_column_set_cell_data_func(column, renderer, rtp_float_data_func, + gtk_tree_view_column_set_cell_data_func(column, renderer, float_data_func, GINT_TO_POINTER(IPBW_COLUMN), NULL); gtk_tree_view_column_set_sort_column_id(column, IPBW_COLUMN); |