Fix the wireless settings button for AirPCap devices in the
[obnox/wireshark/wip.git] / gtk / iax2_analysis.c
index 7e98758663df65ea44235e8fae7ef5bd9ebf2234..75446ed115adaa765a0c93b58b0b3ffa72d19363 100644 (file)
@@ -70,7 +70,6 @@
 #include "../simple_dialog.h"
 #include "../stat_menu.h"
 #include "../progress_dlg.h"
-#include "../color.h"
 #include "../tempfile.h"
 #include <wsutil/file_util.h>
 
@@ -86,6 +85,8 @@
 #include "gtk/rtp_stream_dlg.h"
 #include "gtk/utf8_entities.h"
 
+#include "gtk/old-gtk-compat.h"
+
 enum
 {
        PACKET_COLUMN,
@@ -101,13 +102,6 @@ enum
 };
 
 /****************************************************************************/
-
-typedef struct column_arrows {
-       GtkWidget *table;
-       GtkWidget *ascend_pm;
-       GtkWidget *descend_pm;
-} column_arrows;
-
 #define NUM_COLS 7
 #define NUM_GRAPH_ITEMS 100000
 #define MAX_YSCALE 16
@@ -140,8 +134,10 @@ typedef struct _dialog_graph_graph_t {
        gboolean display;
        GtkWidget *display_button;
        int hf_index;
+#if GTK_CHECK_VERSION(3,0,0)
+       GdkRGBA rgba_color;
+#endif
        GdkColor color;
-       GdkGC *gc;
        gchar title[100];
 } dialog_graph_graph_t;
 
@@ -156,11 +152,15 @@ typedef struct _dialog_graph_t {
        struct _dialog_graph_graph_t graph[MAX_GRAPHS];
        GtkWidget *window;
        GtkWidget *draw_area;
+#if GTK_CHECK_VERSION(2,22,0)
+       cairo_surface_t *surface;
+#else
        GdkPixmap *pixmap;
+#endif
        GtkAdjustment *scrollbar_adjustment;
        GtkWidget *scrollbar;
-       int pixmap_width;
-       int pixmap_height;
+       int surface_width;
+       int surface_height;
        int pixels_per_tick_index; /* index into pixels_per_tick array */
        int pixels_per_tick;
        int max_y_units_index;     /* index into yscale_max array      */
@@ -358,40 +358,40 @@ iax2_reset(void *user_data_arg)
 }
 
 /****************************************************************************/
-static int iax2_packet_add_graph(dialog_graph_graph_t *dgg, tap_iax2_stat_t *statinfo, packet_info *pinfo, guint32 value)
+static gboolean iax2_packet_add_graph(dialog_graph_graph_t *dgg, tap_iax2_stat_t *statinfo, packet_info *pinfo, guint32 value)
 {
        dialog_graph_graph_item_t *it;
-       int idx;
+       guint32 idx;
        double rtp_time;
 
        /* we sometimes get called when dgg is disabled.
        this is a bug since the tap listener should be removed first */
        if(!dgg->display){
-               return 0;
+               return FALSE;
        }
 
        dgg->ud->dlg.dialog_graph.needs_redraw=TRUE;
 
        /*
-       * Find which interval this is supposed to to in and store the
+       * Find which interval this is supposed to go in and store the
        * interval index as idx
        */
        if (dgg->ud->dlg.dialog_graph.start_time == -1){ /* it is the first */
                dgg->ud->dlg.dialog_graph.start_time = statinfo->start_time;
        }
-       rtp_time = nstime_to_sec(&pinfo->fd->rel_ts) - dgg->ud->dlg.dialog_graph.start_time;
+       rtp_time = nstime_to_msec(&pinfo->fd->rel_ts) - dgg->ud->dlg.dialog_graph.start_time;
        if(rtp_time<0){
                return FALSE;
        }
-       idx = (guint32)(rtp_time*1000)/dgg->ud->dlg.dialog_graph.interval;
+       idx = (guint32)(rtp_time)/dgg->ud->dlg.dialog_graph.interval;
 
        /* some sanity checks */
-       if((idx<0)||(idx>=NUM_GRAPH_ITEMS)){
+       if(idx>=NUM_GRAPH_ITEMS){
                return FALSE;
        }
 
        /* update num_items */
-       if((guint32)idx > dgg->ud->dlg.dialog_graph.num_items){
+       if(idx > dgg->ud->dlg.dialog_graph.num_items){
                dgg->ud->dlg.dialog_graph.num_items=idx;
                dgg->ud->dlg.dialog_graph.max_interval=idx*dgg->ud->dlg.dialog_graph.interval;
        }
@@ -920,6 +920,8 @@ static void dialog_graph_draw(user_data_t* user_data)
        int label_width_mid, label_height_mid;
        guint32 draw_width, draw_height;
        char label_string[15];
+       GtkAllocation widget_alloc;
+       cairo_t *cr;
 
        /* new variables */
        guint32 num_time_intervals;
@@ -972,12 +974,20 @@ static void dialog_graph_draw(user_data_t* user_data)
        /*
         * Clear out old plot
         */
-       gdk_draw_rectangle(user_data->dlg.dialog_graph.pixmap,
-                          user_data->dlg.dialog_graph.draw_area->style->white_gc,
-                          TRUE,
-                          0, 0,
-                          user_data->dlg.dialog_graph.draw_area->allocation.width,
-                          user_data->dlg.dialog_graph.draw_area->allocation.height);
+#if GTK_CHECK_VERSION(2,22,0)
+       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+       cairo_set_source_rgb (cr, 1, 1, 1);
+       gtk_widget_get_allocation(user_data->dlg.dialog_graph.draw_area, &widget_alloc);
+       cairo_rectangle (cr,
+               0,
+               0,
+               widget_alloc.width,
+               widget_alloc.height);
+       cairo_fill (cr);
+       cairo_destroy (cr);
 
 
        /*
@@ -1020,19 +1030,25 @@ static void dialog_graph_draw(user_data_t* user_data)
        /*
         * Calculate the size of the drawing area for the actual plot
         */
-       draw_width=user_data->dlg.dialog_graph.pixmap_width-right_x_border-left_x_border;
-       draw_height=user_data->dlg.dialog_graph.pixmap_height-top_y_border-bottom_y_border;
+       draw_width=user_data->dlg.dialog_graph.surface_width-right_x_border-left_x_border;
+       draw_height=user_data->dlg.dialog_graph.surface_height-top_y_border-bottom_y_border;
 
 
        /*
         * Draw the y axis and labels
         * (we always draw the y scale with 11 ticks along the axis)
         */
-       gdk_draw_line(user_data->dlg.dialog_graph.pixmap, user_data->dlg.dialog_graph.draw_area->style->black_gc,
-               user_data->dlg.dialog_graph.pixmap_width-right_x_border+1,
-               top_y_border,
-               user_data->dlg.dialog_graph.pixmap_width-right_x_border+1,
-               user_data->dlg.dialog_graph.pixmap_height-bottom_y_border);
+#if GTK_CHECK_VERSION(2,22,0)
+       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+       cairo_set_line_width (cr, 1.0);
+       cairo_move_to(cr, user_data->dlg.dialog_graph.surface_width-right_x_border+1.5, top_y_border+0.5);
+       cairo_line_to(cr, user_data->dlg.dialog_graph.surface_width-right_x_border+1.5, user_data->dlg.dialog_graph.surface_height-bottom_y_border+0.5);
+       cairo_stroke(cr);
+       cairo_destroy(cr);
+
        for(i=0;i<=10;i++){
                int xwidth;
 
@@ -1042,41 +1058,69 @@ static void dialog_graph_draw(user_data_t* user_data)
                        xwidth=10;
                }
                /* draw the tick */
-               gdk_draw_line(user_data->dlg.dialog_graph.pixmap, user_data->dlg.dialog_graph.draw_area->style->black_gc,
-                       user_data->dlg.dialog_graph.pixmap_width-right_x_border+1,
-                       user_data->dlg.dialog_graph.pixmap_height-bottom_y_border-draw_height*i/10,
-                       user_data->dlg.dialog_graph.pixmap_width-right_x_border+1+xwidth,
-                       user_data->dlg.dialog_graph.pixmap_height-bottom_y_border-draw_height*i/10);
+#if GTK_CHECK_VERSION(2,22,0)
+               cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+               cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+               cairo_set_line_width (cr, 1.0);
+               cairo_move_to(cr, 
+                       user_data->dlg.dialog_graph.surface_width-right_x_border+1.5, 
+                       user_data->dlg.dialog_graph.surface_height-bottom_y_border-draw_height*i/10+0.5);
+               
+               cairo_line_to(cr, 
+                       user_data->dlg.dialog_graph.surface_width-right_x_border+1.5+xwidth,
+                       user_data->dlg.dialog_graph.surface_height-bottom_y_border-draw_height*i/10+0.5);
+               cairo_stroke(cr);
+               cairo_destroy(cr);
                /* draw the labels */
                if(i==0){
                        print_time_scale_string(label_string, sizeof(label_string), (max_y*i/10));
                        pango_layout_set_text(layout, label_string, -1);
                        pango_layout_get_pixel_size(layout, &lwidth, NULL);
-                       gdk_draw_layout(user_data->dlg.dialog_graph.pixmap,
-                                       user_data->dlg.dialog_graph.draw_area->style->black_gc,
-                                       user_data->dlg.dialog_graph.pixmap_width-right_x_border+15+label_width-lwidth,
-                                       user_data->dlg.dialog_graph.pixmap_height-bottom_y_border-draw_height*i/10-label_height/2,
-                                       layout);
+#if GTK_CHECK_VERSION(2,22,0)
+                       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+                       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+                       cairo_move_to (cr, 
+                               user_data->dlg.dialog_graph.surface_width-right_x_border+15+label_width-lwidth, 
+                               user_data->dlg.dialog_graph.surface_height-bottom_y_border-draw_height*i/10-label_height/2);
+                       pango_cairo_show_layout (cr, layout);
+                       cairo_destroy (cr);
+                       cr = NULL;
                }
                if(i==5){
                        print_time_scale_string(label_string, sizeof(label_string), (max_y*i/10));
                        pango_layout_set_text(layout, label_string, -1);
                        pango_layout_get_pixel_size(layout, &lwidth, NULL);
-                       gdk_draw_layout(user_data->dlg.dialog_graph.pixmap,
-                                       user_data->dlg.dialog_graph.draw_area->style->black_gc,
-                                       user_data->dlg.dialog_graph.pixmap_width-right_x_border+15+label_width-lwidth,
-                                       user_data->dlg.dialog_graph.pixmap_height-bottom_y_border-draw_height*i/10-label_height/2,
-                                       layout);
+#if GTK_CHECK_VERSION(2,22,0)
+                       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+                       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+                       cairo_move_to (cr, 
+                               user_data->dlg.dialog_graph.surface_width-right_x_border+15+label_width-lwidth, 
+                               user_data->dlg.dialog_graph.surface_height-bottom_y_border-draw_height*i/10-label_height/2);
+                       pango_cairo_show_layout (cr, layout);
+                       cairo_destroy (cr);
+                       cr = NULL;
                }
                if(i==10){
                        print_time_scale_string(label_string, sizeof(label_string), (max_y*i/10));
                        pango_layout_set_text(layout, label_string, -1);
                        pango_layout_get_pixel_size(layout, &lwidth, NULL);
-                       gdk_draw_layout(user_data->dlg.dialog_graph.pixmap,
-                                       user_data->dlg.dialog_graph.draw_area->style->black_gc,
-                                       user_data->dlg.dialog_graph.pixmap_width-right_x_border+15+label_width-lwidth,
-                                       user_data->dlg.dialog_graph.pixmap_height-bottom_y_border-draw_height*i/10-label_height/2,
-                                       layout);
+#if GTK_CHECK_VERSION(2,22,0)
+                       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+                       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+                       cairo_move_to (cr, 
+                               user_data->dlg.dialog_graph.surface_width-right_x_border+15+label_width-lwidth, 
+                               user_data->dlg.dialog_graph.surface_height-bottom_y_border-draw_height*i/10-label_height/2);
+                       pango_cairo_show_layout (cr, layout);
+                       cairo_destroy (cr);
+                       cr = NULL;
                }
        }
 
@@ -1098,7 +1142,16 @@ static void dialog_graph_draw(user_data_t* user_data)
 
 /*XXX*/
        /* plot the x-scale */
-       gdk_draw_line(user_data->dlg.dialog_graph.pixmap, user_data->dlg.dialog_graph.draw_area->style->black_gc, left_x_border, user_data->dlg.dialog_graph.pixmap_height-bottom_y_border+1, user_data->dlg.dialog_graph.pixmap_width-right_x_border+1, user_data->dlg.dialog_graph.pixmap_height-bottom_y_border+1);
+#if GTK_CHECK_VERSION(2,22,0)
+       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+       cairo_set_line_width (cr, 1.0);
+       cairo_move_to(cr, left_x_border+0.5, user_data->dlg.dialog_graph.surface_height-bottom_y_border+1.5);
+       cairo_line_to(cr, user_data->dlg.dialog_graph.surface_width-right_x_border+1.5,user_data->dlg.dialog_graph.surface_height-bottom_y_border+1.5);
+       cairo_stroke(cr);
+       cairo_destroy(cr);
 
        if((last_interval/user_data->dlg.dialog_graph.interval)>draw_width/user_data->dlg.dialog_graph.pixels_per_tick+1){
                first_interval=(last_interval/user_data->dlg.dialog_graph.interval)-draw_width/user_data->dlg.dialog_graph.pixels_per_tick+1;
@@ -1133,11 +1186,16 @@ static void dialog_graph_draw(user_data_t* user_data)
                }
 
                x=draw_width+left_x_border-((last_interval-current_interval)/user_data->dlg.dialog_graph.interval)*user_data->dlg.dialog_graph.pixels_per_tick;
-               gdk_draw_line(user_data->dlg.dialog_graph.pixmap, user_data->dlg.dialog_graph.draw_area->style->black_gc,
-                             x-1-user_data->dlg.dialog_graph.pixels_per_tick/2,
-                             user_data->dlg.dialog_graph.pixmap_height-bottom_y_border+1,
-                             x-1-user_data->dlg.dialog_graph.pixels_per_tick/2,
-                             user_data->dlg.dialog_graph.pixmap_height-bottom_y_border+xlen+1);
+#if GTK_CHECK_VERSION(2,22,0)
+               cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+               cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+               cairo_set_line_width (cr, 1.0);
+               cairo_move_to(cr, x-1-user_data->dlg.dialog_graph.pixels_per_tick/2+0.5, user_data->dlg.dialog_graph.surface_height-bottom_y_border+1.5);
+               cairo_line_to(cr, x-1-user_data->dlg.dialog_graph.pixels_per_tick/2+0.5, user_data->dlg.dialog_graph.surface_height-bottom_y_border+xlen+1.5);
+               cairo_stroke(cr);
+               cairo_destroy(cr);
 
                if(xlen==17){
                        if(user_data->dlg.dialog_graph.interval>=1000){
@@ -1154,11 +1212,17 @@ static void dialog_graph_draw(user_data_t* user_data)
                        }
                        pango_layout_set_text(layout, label_string, -1);
                        pango_layout_get_pixel_size(layout, &lwidth, NULL);
-                       gdk_draw_layout(user_data->dlg.dialog_graph.pixmap,
-                                       user_data->dlg.dialog_graph.draw_area->style->black_gc,
-                                       x-1-user_data->dlg.dialog_graph.pixels_per_tick/2-lwidth/2,
-                                       user_data->dlg.dialog_graph.pixmap_height-bottom_y_border+20,
-                                       layout);
+#if GTK_CHECK_VERSION(2,22,0)
+                       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+                       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+                       cairo_move_to (cr, 
+                               x-1-user_data->dlg.dialog_graph.pixels_per_tick/2-lwidth/2, 
+                               user_data->dlg.dialog_graph.surface_height-bottom_y_border+20);
+                       pango_cairo_show_layout (cr, layout);
+                       cairo_destroy (cr);
+                       cr = NULL;
                }
 
        }
@@ -1172,22 +1236,35 @@ static void dialog_graph_draw(user_data_t* user_data)
         * Draw "x" for Sequence Errors and "m" for Marks
         */
        /* Draw the labels Fwd and Rev */
-       g_strlcpy(label_string, UTF8_LEFTWARDS_ARROW "Fwd", sizeof(label_string));
+       g_strlcpy(label_string, UTF8_LEFTWARDS_ARROW "Fwd",sizeof(label_string));
        pango_layout_set_text(layout, label_string, -1);
        pango_layout_get_pixel_size(layout, &lwidth, NULL);
-       gdk_draw_layout(user_data->dlg.dialog_graph.pixmap,
-                       user_data->dlg.dialog_graph.draw_area->style->black_gc,
-                       user_data->dlg.dialog_graph.pixmap_width-right_x_border+33-lwidth,
-                       user_data->dlg.dialog_graph.pixmap_height-bottom_y_border+3,
-                       layout);
-       g_strlcpy(label_string, UTF8_LEFTWARDS_ARROW "Rev", sizeof(label_string));
+#if GTK_CHECK_VERSION(2,22,0)
+       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+       cairo_move_to (cr, 
+               user_data->dlg.dialog_graph.surface_width-right_x_border+33-lwidth, 
+               user_data->dlg.dialog_graph.surface_height-bottom_y_border+3);
+       pango_cairo_show_layout (cr, layout);
+       cairo_destroy (cr);
+       cr = NULL;
+
+       g_strlcpy(label_string, UTF8_LEFTWARDS_ARROW "Rev",sizeof(label_string));
        pango_layout_set_text(layout, label_string, -1);
        pango_layout_get_pixel_size(layout, &lwidth, NULL);
-       gdk_draw_layout(user_data->dlg.dialog_graph.pixmap,
-                       user_data->dlg.dialog_graph.draw_area->style->black_gc,
-                       user_data->dlg.dialog_graph.pixmap_width-right_x_border+33-lwidth,
-                       user_data->dlg.dialog_graph.pixmap_height-bottom_y_border+3+9,
-                       layout);
+#if GTK_CHECK_VERSION(2,22,0)
+       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+       cairo_move_to (cr, 
+               user_data->dlg.dialog_graph.surface_width-right_x_border+33-lwidth, 
+               user_data->dlg.dialog_graph.surface_height-bottom_y_border+3+9);
+       pango_cairo_show_layout (cr, layout);
+       cairo_destroy (cr);
+       cr = NULL;
 
        /* Draw the marks */
        for(i=MAX_GRAPHS-1;i>=0;i--){
@@ -1213,11 +1290,17 @@ static void dialog_graph_draw(user_data_t* user_data)
 
                                pango_layout_set_text(layout, label_string, -1);
                                pango_layout_get_pixel_size(layout, &lwidth, NULL);
-                               gdk_draw_layout(user_data->dlg.dialog_graph.pixmap,
-                                       user_data->dlg.dialog_graph.draw_area->style->black_gc,
-                                       x_pos-1-lwidth/2,
-                                       user_data->dlg.dialog_graph.pixmap_height-bottom_y_border+3+7*(i/2),
-                                       layout);
+#if GTK_CHECK_VERSION(2,22,0)
+                               cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+                               cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+                               cairo_move_to (cr, 
+                                       x_pos-1-lwidth/2, 
+                                       user_data->dlg.dialog_graph.surface_height-bottom_y_border+3+7*(i/2));
+                               pango_cairo_show_layout (cr, layout);
+                               cairo_destroy (cr);
+                               cr = NULL;
                        }
 
                        /* prev_x_pos=x_pos; */
@@ -1259,9 +1342,17 @@ static void dialog_graph_draw(user_data_t* user_data)
                        }
 
                        if(val){
-                               gdk_draw_line(user_data->dlg.dialog_graph.pixmap, user_data->dlg.dialog_graph.graph[i].gc,
-                               x_pos, draw_height-1+top_y_border,
-                               x_pos, y_pos);
+#if GTK_CHECK_VERSION(2,22,0)
+                               cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+                               cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+                               gdk_cairo_set_source_color (cr, &user_data->dlg.dialog_graph.graph[i].color);
+                               cairo_set_line_width (cr, 1.0);
+                               cairo_move_to(cr, x_pos+0.5, draw_height-1+top_y_border+0.5);
+                               cairo_line_to(cr, x_pos+0.5, y_pos+0.5);
+                               cairo_stroke(cr);
+                               cairo_destroy(cr);
                        }
 
                        prev_y_pos=y_pos;
@@ -1270,20 +1361,20 @@ static void dialog_graph_draw(user_data_t* user_data)
        }
 
 
-       gdk_draw_pixmap(user_data->dlg.dialog_graph.draw_area->window,
-#if GTK_CHECK_VERSION(2,18,0)
-                       user_data->dlg.dialog_graph.draw_area->style->fg_gc[gtk_widget_get_state(user_data->dlg.dialog_graph.draw_area)],
+       cr = gdk_cairo_create (gtk_widget_get_window(user_data->dlg.dialog_graph.draw_area));
+
+#if GTK_CHECK_VERSION(2,22,0)
+       cairo_set_source_surface (cr, user_data->dlg.dialog_graph.surface, 0, 0); 
 #else
-                       user_data->dlg.dialog_graph.draw_area->style->fg_gc[GTK_WIDGET_STATE(user_data->dlg.dialog_graph.draw_area)],
+       gdk_cairo_set_source_pixmap (cr, user_data->dlg.dialog_graph.pixmap, 0, 0);
 #endif
-                       user_data->dlg.dialog_graph.pixmap,
-                       0, 0,
-                       0, 0,
-                       user_data->dlg.dialog_graph.pixmap_width, user_data->dlg.dialog_graph.pixmap_height);
+       cairo_rectangle (cr, 0, 0, user_data->dlg.dialog_graph.surface_width, user_data->dlg.dialog_graph.surface_height);
+       cairo_fill (cr);
+
+       cairo_destroy (cr);
 
 
        /* update the scrollbar */
-#if GTK_CHECK_VERSION(2,14,0)
        gtk_adjustment_set_upper(user_data->dlg.dialog_graph.scrollbar_adjustment, (gfloat) user_data->dlg.dialog_graph.max_interval);
        gtk_adjustment_set_step_increment(user_data->dlg.dialog_graph.scrollbar_adjustment, (gfloat) ((last_interval-first_interval)/10));
        gtk_adjustment_set_page_increment(user_data->dlg.dialog_graph.scrollbar_adjustment, (gfloat) (last_interval-first_interval));
@@ -1293,17 +1384,6 @@ static void dialog_graph_draw(user_data_t* user_data)
                gtk_adjustment_set_page_size(user_data->dlg.dialog_graph.scrollbar_adjustment, (gfloat) (last_interval-first_interval));
        }
        gtk_adjustment_set_value(user_data->dlg.dialog_graph.scrollbar_adjustment, last_interval - gtk_adjustment_get_page_size(user_data->dlg.dialog_graph.scrollbar_adjustment));
-#else
-       user_data->dlg.dialog_graph.scrollbar_adjustment->upper=(gfloat) user_data->dlg.dialog_graph.max_interval;
-       user_data->dlg.dialog_graph.scrollbar_adjustment->step_increment=(gfloat) ((last_interval-first_interval)/10);
-       user_data->dlg.dialog_graph.scrollbar_adjustment->page_increment=(gfloat) (last_interval-first_interval);
-       if((last_interval-first_interval)*100 < user_data->dlg.dialog_graph.max_interval){
-               user_data->dlg.dialog_graph.scrollbar_adjustment->page_size=(gfloat) (user_data->dlg.dialog_graph.max_interval/100);
-       } else {
-               user_data->dlg.dialog_graph.scrollbar_adjustment->page_size=(gfloat) (last_interval-first_interval);
-       }
-       user_data->dlg.dialog_graph.scrollbar_adjustment->value=last_interval-user_data->dlg.dialog_graph.scrollbar_adjustment->page_size;
-#endif
        gtk_adjustment_changed(user_data->dlg.dialog_graph.scrollbar_adjustment);
        gtk_adjustment_value_changed(user_data->dlg.dialog_graph.scrollbar_adjustment);
 
@@ -1326,54 +1406,80 @@ static void draw_area_destroy_cb(GtkWidget *widget _U_, gpointer data)
 }
 
 /****************************************************************************/
+#if GTK_CHECK_VERSION(3,0,0)
+static gboolean draw_area_draw(GtkWidget *widget, cairo_t *cr, gpointer data)
+{
+       user_data_t *user_data = data;
+       GtkAllocation allocation;
+
+       gtk_widget_get_allocation (widget, &allocation);
+
+       cairo_set_source_surface (cr, user_data->dlg.dialog_graph.surface, 0, 0); 
+       cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
+       cairo_fill (cr);
+
+       return FALSE;
+}
+#else
 static gboolean draw_area_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
 {
        user_data_t *user_data = data;
+       cairo_t *cr = gdk_cairo_create (gtk_widget_get_window(widget));
 
-       gdk_draw_pixmap(widget->window,
-#if GTK_CHECK_VERSION(2,18,0)
-                       widget->style->fg_gc[gtk_widget_get_state(widget)],
+#if GTK_CHECK_VERSION(2,22,0)
+       cairo_set_source_surface (cr, user_data->dlg.dialog_graph.surface, 0, 0); 
 #else
-                       widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
+       gdk_cairo_set_source_pixmap (cr, user_data->dlg.dialog_graph.pixmap, 0, 0);
 #endif
-                       user_data->dlg.dialog_graph.pixmap,
-                       event->area.x, event->area.y,
-                       event->area.x, event->area.y,
-                       event->area.width, event->area.height);
+       cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height);
+       cairo_fill (cr);
+
+       cairo_destroy (cr);
 
        return FALSE;
 }
-
+#endif
 /****************************************************************************/
 static gboolean draw_area_configure_event(GtkWidget *widget, GdkEventConfigure *event _U_, gpointer data)
 {
        user_data_t *user_data = data;
-       int i;
-
+       GtkAllocation widget_alloc;
+       cairo_t *cr;
+
+#if GTK_CHECK_VERSION(2,22,0)
+       if(user_data->dlg.dialog_graph.surface){
+               g_object_unref(user_data->dlg.dialog_graph.surface);
+               user_data->dlg.dialog_graph.surface=NULL;
+       }
+       gtk_widget_get_allocation(widget, &widget_alloc);
+       user_data->dlg.dialog_graph.surface = gdk_window_create_similar_surface (gtk_widget_get_window(widget),
+                       CAIRO_CONTENT_COLOR,
+                       widget_alloc.width,
+                       widget_alloc.height);
+#else
        if(user_data->dlg.dialog_graph.pixmap){
                g_object_unref(user_data->dlg.dialog_graph.pixmap);
                user_data->dlg.dialog_graph.pixmap=NULL;
        }
 
-       user_data->dlg.dialog_graph.pixmap=gdk_pixmap_new(widget->window,
-                       widget->allocation.width,
-                       widget->allocation.height,
+       gtk_widget_get_allocation(widget, &widget_alloc);
+       user_data->dlg.dialog_graph.pixmap=gdk_pixmap_new(gtk_widget_get_window(widget),
+                       widget_alloc.width,
+                       widget_alloc.height,
                        -1);
-       user_data->dlg.dialog_graph.pixmap_width=widget->allocation.width;
-       user_data->dlg.dialog_graph.pixmap_height=widget->allocation.height;
-
-       gdk_draw_rectangle(user_data->dlg.dialog_graph.pixmap,
-                       widget->style->white_gc,
-                       TRUE,
-                       0, 0,
-                       widget->allocation.width,
-                       widget->allocation.height);
+#endif
+       user_data->dlg.dialog_graph.surface_width=widget_alloc.width;
+       user_data->dlg.dialog_graph.surface_height=widget_alloc.height;
 
-       /* set up the colors and the GC structs for this pixmap */
-       for(i=0;i<MAX_GRAPHS;i++){
-               user_data->dlg.dialog_graph.graph[i].gc=gdk_gc_new(user_data->dlg.dialog_graph.pixmap);
-               gdk_gc_set_rgb_fg_color(user_data->dlg.dialog_graph.graph[i].gc, &user_data->dlg.dialog_graph.graph[i].color);
-       }
+#if GTK_CHECK_VERSION(2,22,0)
+       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+       cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
+       cairo_set_source_rgb (cr, 1, 1, 1);
+       cairo_fill (cr);
+       cairo_destroy (cr);
 
        dialog_graph_redraw(user_data);
        return TRUE;
@@ -1385,11 +1491,7 @@ static void scrollbar_changed(GtkWidget *widget _U_, gpointer data)
        user_data_t *user_data = data;
        guint32 mi;
 
-#if GTK_CHECK_VERSION(2,14,0)
        mi=(guint32) (gtk_adjustment_get_value(user_data->dlg.dialog_graph.scrollbar_adjustment) + gtk_adjustment_get_page_size(user_data->dlg.dialog_graph.scrollbar_adjustment));
-#else
-       mi=(guint32) (user_data->dlg.dialog_graph.scrollbar_adjustment->value+user_data->dlg.dialog_graph.scrollbar_adjustment->page_size);
-#endif
        if(user_data->dlg.dialog_graph.last_interval==mi){
                return;
        }
@@ -1410,10 +1512,14 @@ static void create_draw_area(user_data_t* user_data, GtkWidget *box)
        user_data->dlg.dialog_graph.draw_area=gtk_drawing_area_new();
        g_signal_connect(user_data->dlg.dialog_graph.draw_area, "destroy", G_CALLBACK(draw_area_destroy_cb), user_data);
 
-       gtk_widget_set_size_request(user_data->dlg.dialog_graph.draw_area, user_data->dlg.dialog_graph.pixmap_width, user_data->dlg.dialog_graph.pixmap_height);
+       gtk_widget_set_size_request(user_data->dlg.dialog_graph.draw_area, user_data->dlg.dialog_graph.surface_width, user_data->dlg.dialog_graph.surface_height);
 
        /* signals needed to handle backing pixmap */
+#if GTK_CHECK_VERSION(3,0,0)
+       g_signal_connect(user_data->dlg.dialog_graph.draw_area, "draw", G_CALLBACK(draw_area_draw), user_data);
+#else
        g_signal_connect(user_data->dlg.dialog_graph.draw_area, "expose_event", G_CALLBACK(draw_area_expose_event), user_data);
+#endif
        g_signal_connect(user_data->dlg.dialog_graph.draw_area, "configure_event", G_CALLBACK(draw_area_configure_event), user_data);
 
        gtk_widget_show(user_data->dlg.dialog_graph.draw_area);
@@ -1478,13 +1584,19 @@ static void create_filter_box(dialog_graph_graph_t *dgg, GtkWidget *box, int num
        label=gtk_label_new(dgg->title);
        gtk_widget_show(label);
        gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-
+#if GTK_CHECK_VERSION(3,0,0)
+       gtk_widget_override_color(label, GTK_STATE_NORMAL, &dgg->rgba_color);
+       gtk_widget_override_color(label, GTK_STATE_ACTIVE, &dgg->rgba_color);
+       gtk_widget_override_color(label, GTK_STATE_PRELIGHT, &dgg->rgba_color);
+       gtk_widget_override_color(label, GTK_STATE_SELECTED, &dgg->rgba_color);
+       gtk_widget_override_color(label, GTK_STATE_INSENSITIVE, &dgg->rgba_color);
+#else
        gtk_widget_modify_fg(label, GTK_STATE_NORMAL, &dgg->color);
        gtk_widget_modify_fg(label, GTK_STATE_ACTIVE, &dgg->color);
        gtk_widget_modify_fg(label, GTK_STATE_PRELIGHT, &dgg->color);
        gtk_widget_modify_fg(label, GTK_STATE_SELECTED, &dgg->color);
        gtk_widget_modify_fg(label, GTK_STATE_INSENSITIVE, &dgg->color);
-
+#endif
        return;
 }
 
@@ -1565,7 +1677,7 @@ create_yscale_max_menu_items(user_data_t* user_data)
        GtkWidget *combo_box;
        int i;
 
-       combo_box = gtk_combo_box_new_text ();
+       combo_box = gtk_combo_box_text_new();
 
        for(i=0;i<MAX_YSCALE;i++){
                if(yscale_max[i]==AUTO_MAX_YSCALE){
@@ -1575,7 +1687,7 @@ create_yscale_max_menu_items(user_data_t* user_data)
                } else {
                        g_snprintf(str, sizeof(str), "%u s", yscale_max[i]/1000000);
                }
-               gtk_combo_box_append_text (GTK_COMBO_BOX (combo_box), str);
+                gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), str);
        }
        gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), user_data->dlg.dialog_graph.max_y_units_index);
        g_signal_connect(combo_box, "changed", G_CALLBACK(yscale_select), user_data);
@@ -1591,11 +1703,11 @@ create_pixels_per_tick_menu_items(user_data_t *user_data)
        GtkWidget *combo_box;
        int i;
 
-       combo_box = gtk_combo_box_new_text ();
+       combo_box = gtk_combo_box_text_new();
 
        for(i=0;i<MAX_PIXELS_PER_TICK;i++){
                g_snprintf(str, sizeof(str), "%u", pixels_per_tick[i]);
-               gtk_combo_box_append_text (GTK_COMBO_BOX (combo_box), str);
+                gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), str);
        }
        gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), user_data->dlg.dialog_graph.pixels_per_tick_index);
 
@@ -1612,7 +1724,7 @@ create_tick_interval_menu_items(user_data_t *user_data)
        char str[15];
        int i;
 
-       combo_box = gtk_combo_box_new_text ();
+       combo_box = gtk_combo_box_text_new();
 
        for(i=0;i<MAX_TICK_VALUES;i++){
                if(tick_interval_values[i]>=1000){
@@ -1624,7 +1736,7 @@ create_tick_interval_menu_items(user_data_t *user_data)
                } else {
                        g_snprintf(str, sizeof(str), "0.%03u sec", (tick_interval_values[i])%10);
                }
-               gtk_combo_box_append_text (GTK_COMBO_BOX (combo_box), str);
+                gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), str);
        }
        gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), user_data->dlg.dialog_graph.interval_index);
        g_signal_connect(combo_box, "changed", G_CALLBACK(tick_interval_select), user_data);
@@ -3387,12 +3499,21 @@ void iax2_analysis(
        user_data_t *user_data;
        int fd;
        int i;
-       static color_t col[MAX_GRAPHS] = {
+       static GdkColor col[MAX_GRAPHS] = {
                {0,     0x0000, 0x0000, 0x0000},
                {0,     0xffff, 0x0000, 0x0000},
                {0,     0x0000, 0xffff, 0x0000},
                {0,     0x0000, 0x0000, 0xffff}
        };
+#if GTK_CHECK_VERSION(3,0,0)
+       static GdkRGBA rgba_col[MAX_GRAPHS] = {
+               {0.0, 0.0,   0.0,   1.0}, /* Black */
+               {1.0, 0.0,   0.1,   1.0}, /* Red */
+               {0.0, 1.0,   0.0,   1.0}, /* Green */
+               {0.0, 0.0,   1.0,   1.0}, /* Blue */
+       };
+#endif
+
        char *tempname;
 
        /* init */
@@ -3427,11 +3548,15 @@ void iax2_analysis(
        user_data->dlg.dialog_graph.interval_index=DEFAULT_TICK_INTERVAL_VALUES_INDEX;
        user_data->dlg.dialog_graph.interval=tick_interval_values[DEFAULT_TICK_INTERVAL_VALUES_INDEX];
        user_data->dlg.dialog_graph.draw_area=NULL;
+#if GTK_CHECK_VERSION(2,22,0)
+       user_data->dlg.dialog_graph.surface=NULL;
+#else
        user_data->dlg.dialog_graph.pixmap=NULL;
+#endif
        user_data->dlg.dialog_graph.scrollbar=NULL;
        user_data->dlg.dialog_graph.scrollbar_adjustment=NULL;
-       user_data->dlg.dialog_graph.pixmap_width=500;
-       user_data->dlg.dialog_graph.pixmap_height=200;
+       user_data->dlg.dialog_graph.surface_width=500;
+       user_data->dlg.dialog_graph.surface_height=200;
        user_data->dlg.dialog_graph.pixels_per_tick_index=DEFAULT_PIXELS_PER_TICK_INDEX;
        user_data->dlg.dialog_graph.pixels_per_tick=pixels_per_tick[DEFAULT_PIXELS_PER_TICK_INDEX];
        user_data->dlg.dialog_graph.max_y_units_index=AUTO_MAX_YSCALE_INDEX;
@@ -3442,11 +3567,16 @@ void iax2_analysis(
        user_data->dlg.dialog_graph.start_time = -1;
 
        for(i=0;i<MAX_GRAPHS;i++){
-               user_data->dlg.dialog_graph.graph[i].gc=NULL;
                user_data->dlg.dialog_graph.graph[i].color.pixel=0;
                user_data->dlg.dialog_graph.graph[i].color.red=col[i].red;
                user_data->dlg.dialog_graph.graph[i].color.green=col[i].green;
                user_data->dlg.dialog_graph.graph[i].color.blue=col[i].blue;
+#if GTK_CHECK_VERSION(3,0,0)
+               user_data->dlg.dialog_graph.graph[i].rgba_color.red=rgba_col[i].red;
+               user_data->dlg.dialog_graph.graph[i].rgba_color.green=rgba_col[i].green;
+               user_data->dlg.dialog_graph.graph[i].rgba_color.blue=rgba_col[i].blue;
+               user_data->dlg.dialog_graph.graph[i].rgba_color.alpha=rgba_col[i].alpha;
+#endif
                user_data->dlg.dialog_graph.graph[i].display=TRUE;
                user_data->dlg.dialog_graph.graph[i].display_button=NULL;
                user_data->dlg.dialog_graph.graph[i].ud=user_data;
@@ -3508,7 +3638,6 @@ static void iax2_analysis_cb(GtkWidget *w _U_, gpointer data _U_)
        epan_dissect_init(&edt, TRUE, FALSE);
        epan_dissect_prime_dfilter(&edt, sfcode);
        epan_dissect_run(&edt, &cf->pseudo_header, cf->pd, fdata, NULL);
-       frame_matched = dfilter_apply_edt(sfcode, &edt);
 
        /* if it is not an iax2 frame, show an error dialog */
        frame_matched = dfilter_apply_edt(sfcode, &edt);