- Use cairo_surface_t

- rename variables refering to the surface.

svn path=/trunk/; revision=38495
This commit is contained in:
Anders Broman 2011-08-12 12:32:18 +00:00
parent 47977a8039
commit dc681c67a0
2 changed files with 347 additions and 48 deletions

View File

@ -137,15 +137,21 @@ static void graph_analysis_init_dlg(graph_analysis_data_t *user_data)
user_data->dlg.needs_redraw=TRUE;
user_data->dlg.draw_area_time=NULL;
user_data->dlg.draw_area=NULL;
user_data->dlg.draw_area_comments=NULL;
#if GTK_CHECK_VERSION(2,22,0)
user_data->dlg.surface_main=NULL;
user_data->dlg.surface_time=NULL;
user_data->dlg.surface_comments=NULL;
#else
user_data->dlg.pixmap_main=NULL;
user_data->dlg.pixmap_time=NULL;
user_data->dlg.draw_area_comments=NULL;
user_data->dlg.pixmap_comments=NULL;
#endif
user_data->dlg.v_scrollbar=NULL;
user_data->dlg.v_scrollbar_adjustment=NULL;
user_data->dlg.hpane=NULL;
user_data->dlg.pixmap_width = 350;
user_data->dlg.pixmap_height=400;
user_data->dlg.surface_width = 350;
user_data->dlg.surface_width=400;
user_data->dlg.first_node=0;
user_data->dlg.first_item=0;
user_data->dlg.left_x_border=0;
@ -186,6 +192,31 @@ static void on_destroy(GtkWidget *win _U_, graph_analysis_data_t *user_data)
#define HEIGHT_ARROW 6
/****************************************************************************/
#if GTK_CHECK_VERSION(2,22,0)
static void draw_arrow(cairo_surface_t *surface, GdkColor *color, gint x, gint y, gboolean arrow_type)
{
cairo_t *cr;
cr = cairo_create (surface);
gdk_cairo_set_source_color (cr, color);
if (arrow_type == LEFT_ARROW)
{
cairo_move_to (cr, x + WIDTH_ARROW, y);
cairo_line_to (cr, x + WIDTH_ARROW, y + HEIGHT_ARROW);
cairo_line_to (cr, x, y + HEIGHT_ARROW / 2.);
}
else if (arrow_type == RIGHT_ARROW)
{
cairo_move_to (cr, x, y);
cairo_line_to (cr, x + WIDTH_ARROW, y + HEIGHT_ARROW / 2.);
cairo_line_to (cr, x, y + HEIGHT_ARROW);
}
cairo_close_path (cr);
cairo_fill (cr);
cairo_destroy (cr);
}
#else
static void draw_arrow(GdkDrawable *pixmap, GdkColor *color, gint x, gint y, gboolean arrow_type)
{
cairo_t *cr;
@ -211,6 +242,7 @@ static void draw_arrow(GdkDrawable *pixmap, GdkColor *color, gint x, gint y, gbo
cairo_destroy (cr);
}
}
#endif
/****************************************************************************/
/* Adds trailing characters to complete the requested length. */
@ -673,6 +705,26 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
gtk_widget_get_allocation(user_data->dlg.draw_area_comments, &draw_area_comments_alloc);
/* Clear out old plot */
#if GTK_CHECK_VERSION(2,22,0)
cr = cairo_create (user_data->dlg.surface_time);
cairo_set_source_rgb (cr, 1, 1, 1);
cairo_rectangle (cr, 0, 0, draw_area_time_alloc.width,draw_area_time_alloc.height);
cairo_fill (cr);
cairo_destroy (cr);
cr = cairo_create (user_data->dlg.surface_main);
cairo_set_source_rgb (cr, 1, 1, 1);
cairo_rectangle (cr, 0, 0, draw_area_alloc.width,draw_area_alloc.height);
cairo_fill (cr);
cairo_destroy (cr);
cr = cairo_create (user_data->dlg.surface_comments);
cairo_set_source_rgb (cr, 1, 1, 1);
cairo_rectangle (cr, 0, 0, draw_area_comments_alloc.width,draw_area_comments_alloc.height);
cairo_fill (cr);
cairo_destroy (cr);
#else
if ( GDK_IS_DRAWABLE(user_data->dlg.pixmap_time) ){
cr = gdk_cairo_create (user_data->dlg.pixmap_time);
cairo_set_source_rgb (cr, 1, 1, 1);
@ -696,7 +748,7 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
cairo_fill (cr);
cairo_destroy (cr);
}
#endif
/* Calculate the y border */
top_y_border=TOP_Y_BORDER; /* to display the node address */
bottom_y_border=BOTTOM_Y_BORDER;
@ -780,10 +832,35 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
user_data->dlg.left_x_border = left_x_border;
right_x_border=0;
draw_width=user_data->dlg.pixmap_width-right_x_border-left_x_border;
draw_width=user_data->dlg.surface_width-right_x_border-left_x_border;
#if GTK_CHECK_VERSION(2,22,0)
/* Paint time title background */
if ( GDK_IS_DRAWABLE(user_data->dlg.pixmap_time) ){
cr = cairo_create (user_data->dlg.surface_time);
gdk_cairo_set_source_pixbuf (cr, bg_pixbuf, 0, 0);
cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
cairo_rectangle (cr, 0, 0, draw_area_time_alloc.width, top_y_border);
cairo_fill (cr);
cairo_destroy (cr);
/* Paint main title background */
cr = cairo_create (user_data->dlg.surface_main);
gdk_cairo_set_source_pixbuf (cr, bg_pixbuf, 0, 0);
cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
cairo_rectangle (cr, 0, 0, draw_area_alloc.width, top_y_border);
cairo_fill (cr);
cairo_destroy (cr);
/* Paint main comment background */
cr = cairo_create (user_data->dlg.surface_comments);
gdk_cairo_set_source_pixbuf (cr, bg_pixbuf, 0, 0);
cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
cairo_rectangle (cr, 0, 0, draw_area_comments_alloc.width, top_y_border);
cairo_fill (cr);
cairo_destroy (cr);
#else
/* Paint time title background */
if ( GDK_IS_DRAWABLE(user_data->dlg.surface_time) ){
cr = gdk_cairo_create (user_data->dlg.pixmap_time);
gdk_cairo_set_source_pixbuf (cr, bg_pixbuf, 0, 0);
cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
@ -812,11 +889,18 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
cairo_destroy (cr);
}
#endif
/* Draw the word "Time" on top of time column */
g_snprintf(label_string, label_width, "%s", " Time");
pango_layout_set_text(layout, label_string, -1);
pango_layout_get_pixel_size(layout, &label_width, &label_height);
#if GTK_CHECK_VERSION(2,22,0)
cr = cairo_create (user_data->dlg.surface_time);
cairo_move_to (cr, left_x_border, top_y_border/2-label_height/2);
pango_cairo_show_layout (cr, layout);
cairo_destroy (cr);
cr = NULL;
#else
if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_time)) {
cr = gdk_cairo_create (user_data->dlg.pixmap_time);
cairo_move_to (cr, left_x_border, top_y_border/2-label_height/2);
@ -824,19 +908,18 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
cairo_destroy (cr);
cr = NULL;
}
#endif
/* Draw the word "Comment" on top of comment column */
g_snprintf(label_string, label_width, "%s", "Comment");
pango_layout_set_text(layout, label_string, -1);
pango_layout_get_pixel_size(layout, &label_width, &label_height);
if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_comments)) {
cr = gdk_cairo_create (user_data->dlg.pixmap_comments);
cairo_move_to (cr, MAX_COMMENT/2-label_width/2, top_y_border/2-((i&1)?0:label_height));
pango_cairo_show_layout (cr, layout);
cairo_destroy (cr);
cr = NULL;
}
#if GTK_CHECK_VERSION(2,22,0)
cr = cairo_create (user_data->dlg.surface_comments);
cairo_move_to (cr, MAX_COMMENT/2-label_width/2, top_y_border/2-((i&1)?0:label_height));
pango_cairo_show_layout (cr, layout);
cairo_destroy (cr);
cr = NULL;
#endif
/* Paint the background items */
for (current_item=0; current_item<display_items; current_item++){
/*select the color. if it is the selected item select blue color */
@ -845,6 +928,14 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
} else {
bg_color_p = &background_color[1+user_data->dlg.items[current_item].conv_num%MAX_NUM_COL_CONV];
}
#if GTK_CHECK_VERSION(2,22,0)
/* Paint background */
cr = cairo_create (user_data->dlg.surface_main);
gdk_cairo_set_source_color (cr, bg_color_p);
cairo_rectangle (cr, left_x_border, top_y_border+current_item*ITEM_HEIGHT, draw_width, ITEM_HEIGHT);
cairo_fill (cr);
cairo_destroy (cr);
#else
if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_main)) {
/* Paint background */
cr = gdk_cairo_create (user_data->dlg.pixmap_main);
@ -853,6 +944,7 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
cairo_fill (cr);
cairo_destroy (cr);
}
#endif
}
/* Draw the node names on top and the division lines */
for (i=0; i<user_data->num_nodes; i++){
@ -861,6 +953,13 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
g_strlcpy(label_string, get_addr_name(&(user_data->nodes[i])), NODE_WIDTH/5);
pango_layout_set_text(layout, label_string, -1);
pango_layout_get_pixel_size(layout, &label_width, &label_height);
#if GTK_CHECK_VERSION(2,22,0)
cr = cairo_create (user_data->dlg.surface_main);
cairo_move_to (cr, left_x_border+NODE_WIDTH/2-label_width/2+NODE_WIDTH*i, top_y_border/2-((i&1)?0:label_height));
pango_cairo_show_layout (cr, layout);
cairo_destroy (cr);
cr = NULL;
#else
if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_main)) {
cr = gdk_cairo_create (user_data->dlg.pixmap_main);
cairo_move_to (cr, left_x_border+NODE_WIDTH/2-label_width/2+NODE_WIDTH*i, top_y_border/2-((i&1)?0:label_height));
@ -868,7 +967,19 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
cairo_destroy (cr);
cr = NULL;
}
#endif
#if GTK_CHECK_VERSION(2,22,0)
/* draw the node division lines */
cr = cairo_create (user_data->dlg.surface_main);
gdk_cairo_set_source_color (cr, &grey_color0);
cairo_set_line_width (cr, 1.0);
cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
cairo_set_dash(cr, dashed1, len1, 0);
cairo_move_to(cr, left_x_border+NODE_WIDTH/2+NODE_WIDTH*i, top_y_border);
cairo_line_to(cr, (left_x_border+NODE_WIDTH/2+NODE_WIDTH*i),draw_area_alloc.height-bottom_y_border);
cairo_stroke(cr);
cairo_destroy(cr);
#else
/* draw the node division lines */
if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_main) ) {
cr = gdk_cairo_create (user_data->dlg.pixmap_main);
@ -881,7 +992,7 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
cairo_stroke(cr);
cairo_destroy(cr);
}
#endif
}
/* Draw the items */
@ -890,6 +1001,22 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
g_snprintf(label_string, MAX_LABEL, "%.3f", user_data->dlg.items[current_item].time);
pango_layout_set_text(layout, label_string, -1);
pango_layout_get_pixel_size(layout, &label_width, &label_height);
#if GTK_CHECK_VERSION(2,22,0)
cr = cairo_create (user_data->dlg.surface_time);
cairo_move_to (cr, 3, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2-label_height/2);
pango_cairo_show_layout (cr, layout);
cairo_destroy (cr);
cr = NULL;
/*draw the comments */
g_snprintf(label_string, MAX_COMMENT, "%s", user_data->dlg.items[current_item].comment);
pango_layout_set_text(middle_layout, label_string, -1);
pango_layout_get_pixel_size(middle_layout, &label_width, &label_height);
cr = cairo_create (user_data->dlg.surface_comments);
cairo_move_to (cr, 2, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2-label_height/2);
pango_cairo_show_layout (cr, middle_layout);
cairo_destroy (cr);
cr = NULL;
#else
if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_time)) {
cr = gdk_cairo_create (user_data->dlg.pixmap_time);
cairo_move_to (cr, 3, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2-label_height/2);
@ -897,24 +1024,50 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
cairo_destroy (cr);
cr = NULL;
}
/*draw the comments */
g_snprintf(label_string, MAX_COMMENT, "%s", user_data->dlg.items[current_item].comment);
pango_layout_set_text(middle_layout, label_string, -1);
pango_layout_get_pixel_size(middle_layout, &label_width, &label_height);
#endif
#if GTK_CHECK_VERSION(2,22,0)
cr = cairo_create (user_data->dlg.surface_comments);
cairo_move_to (cr, 2, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2-label_height/2);
pango_cairo_show_layout (cr, middle_layout);
cairo_destroy (cr);
cr = NULL;
#else
if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_comments)) {
cr = gdk_cairo_create (user_data->dlg.pixmap_comments);
cairo_move_to (cr, 2, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2-label_height/2);
pango_cairo_show_layout (cr, middle_layout);
cairo_destroy (cr);
cr = NULL;
}
#endif
/* draw the arrow line */
start_arrow = left_x_border+(user_data->dlg.items[current_item].src_node)*NODE_WIDTH+NODE_WIDTH/2;
end_arrow = left_x_border+(user_data->dlg.items[current_item].dst_node)*NODE_WIDTH+NODE_WIDTH/2;
#if GTK_CHECK_VERSION(2,22,0)
cr = cairo_create (user_data->dlg.surface_main);
if (user_data->dlg.items[current_item].line_style == 2) {
/* draw a line thick */
cairo_set_line_width (cr, 2.0);
}else{
cairo_set_line_width (cr, 1.0);
}
if ( current_item+first_item == user_data->dlg.selected_item ){
/* draw white line */
cairo_set_source_rgb (cr, 1, 1, 1);
}else{
/* draw black line */
cairo_set_source_rgb (cr, 0, 0, 0);
}
cairo_move_to(cr, start_arrow, (top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7)+0.5);
cairo_line_to(cr, end_arrow, (top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7)+0.5);
cairo_stroke(cr);
cairo_destroy(cr);
#else
if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_main) ) {
cr = gdk_cairo_create (user_data->dlg.pixmap_main);
if (user_data->dlg.items[current_item].line_style == 2) {
@ -935,7 +1088,7 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
cairo_stroke(cr);
cairo_destroy(cr);
}
#endif
/* select colors */
if ( current_item+first_item == user_data->dlg.selected_item ){
color_p = &white_color;
@ -943,11 +1096,17 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
color_p = &black_color;
}
/* draw the arrow */
#if GTK_CHECK_VERSION(2,22,0)
if (start_arrow<end_arrow)
draw_arrow(user_data->dlg.surface_main, color_p, end_arrow-WIDTH_ARROW, (top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7)-(HEIGHT_ARROW/2), RIGHT_ARROW);
else
draw_arrow(user_data->dlg.surface_main, color_p, end_arrow, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7-(HEIGHT_ARROW/2), LEFT_ARROW);
#else
if (start_arrow<end_arrow)
draw_arrow(user_data->dlg.pixmap_main, color_p, end_arrow-WIDTH_ARROW, (top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7)-(HEIGHT_ARROW/2), RIGHT_ARROW);
else
draw_arrow(user_data->dlg.pixmap_main, color_p, end_arrow, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7-(HEIGHT_ARROW/2), LEFT_ARROW);
#endif
/* draw the frame comment */
g_snprintf(label_string, MAX_LABEL, "%s", user_data->dlg.items[current_item].frame_label);
pango_layout_set_text(layout, label_string, -1);
@ -966,6 +1125,14 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
if ((int)left_x_border > ((int)label_x-(int)label_width/2))
label_x = left_x_border + label_width/2;
#if GTK_CHECK_VERSION(2,22,0)
cr = cairo_create (user_data->dlg.surface_main);
gdk_cairo_set_source_color (cr, color_p);
cairo_move_to (cr, label_x - label_width/2, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2-label_height/2-3);
pango_cairo_show_layout (cr, layout);
cairo_destroy (cr);
cr = NULL;
#else
if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_main)) {
cr = gdk_cairo_create (user_data->dlg.pixmap_main);
gdk_cairo_set_source_color (cr, color_p);
@ -974,7 +1141,7 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
cairo_destroy (cr);
cr = NULL;
}
#endif
/* draw the source port number */
g_snprintf(label_string, MAX_LABEL, "(%i)", user_data->dlg.items[current_item].port_src);
pango_layout_set_text(small_layout, label_string, -1);
@ -985,6 +1152,19 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
else {
src_port_x = start_arrow + 2;
}
#if GTK_CHECK_VERSION(2,22,0)
cr = cairo_create (user_data->dlg.surface_main);
/* select color */
if ( current_item+first_item == user_data->dlg.selected_item ){
gdk_cairo_set_source_color (cr, &grey_color1);
} else {
gdk_cairo_set_source_color (cr, &grey_color0);
}
gdk_cairo_set_source_color (cr, &grey_color0);
cairo_move_to (cr, src_port_x, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-2-label_height/2-2);
pango_cairo_show_layout (cr, small_layout);
cairo_destroy (cr);
#else
if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_main)) {
cr = gdk_cairo_create (user_data->dlg.pixmap_main);
/* select color */
@ -998,7 +1178,7 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
pango_cairo_show_layout (cr, small_layout);
cairo_destroy (cr);
}
#endif
/* draw the destination port number */
g_snprintf(label_string, MAX_LABEL, "(%i)", user_data->dlg.items[current_item].port_dst);
pango_layout_set_text(small_layout, label_string, -1);
@ -1009,6 +1189,18 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
else {
dst_port_x = end_arrow - label_width - 2;
}
#if GTK_CHECK_VERSION(2,22,0)
cr = cairo_create (user_data->dlg.surface_main);
/* select color */
if ( current_item+first_item == user_data->dlg.selected_item ){
gdk_cairo_set_source_color (cr, &grey_color1);
} else {
gdk_cairo_set_source_color (cr, &grey_color0);
}
cairo_move_to (cr, dst_port_x, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-2-label_height/2-2);
pango_cairo_show_layout (cr, small_layout);
cairo_destroy (cr);
#else
if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_main)) {
cr = gdk_cairo_create (user_data->dlg.pixmap_main);
/* select color */
@ -1021,9 +1213,21 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
pango_cairo_show_layout (cr, small_layout);
cairo_destroy (cr);
}
#endif
/* draw the div line of the selected item with soft gray*/
if ( current_item+first_item == user_data->dlg.selected_item )
for (i=0; i<user_data->num_nodes; i++){
#if GTK_CHECK_VERSION(2,22,0)
cr = cairo_create (user_data->dlg.surface_main);
gdk_cairo_set_source_color (cr, &grey_color1);
cairo_set_line_width (cr, 1.0);
cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
cairo_set_dash(cr, dashed1, len1, 0);
cairo_move_to(cr, left_x_border+NODE_WIDTH/2+NODE_WIDTH*i, (user_data->dlg.selected_item-first_item)*ITEM_HEIGHT+TOP_Y_BORDER);
cairo_line_to(cr, (left_x_border+NODE_WIDTH/2+NODE_WIDTH*i),(user_data->dlg.selected_item-first_item)*ITEM_HEIGHT+TOP_Y_BORDER+ITEM_HEIGHT);
cairo_stroke(cr);
cairo_destroy(cr);
#else
if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_main) ) {
cr = gdk_cairo_create (user_data->dlg.pixmap_main);
gdk_cairo_set_source_color (cr, &grey_color1);
@ -1035,6 +1239,7 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
cairo_stroke(cr);
cairo_destroy(cr);
}
#endif
}
}
@ -1043,7 +1248,11 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
/* refresh the draw areas */
if (gtk_widget_is_drawable(user_data->dlg.draw_area_time) ){
cr = gdk_cairo_create (gtk_widget_get_window(user_data->dlg.draw_area_time));
#if GTK_CHECK_VERSION(2,22,0)
cairo_set_source_surface (cr, user_data->dlg.surface_time, 0, 0);
#else
gdk_cairo_set_source_pixmap (cr, user_data->dlg.pixmap_time, 0, 0);
#endif
cairo_rectangle (cr, 0, 0, draw_area_time_alloc.width, draw_area_time_alloc.height);
cairo_fill (cr);
cairo_destroy (cr);
@ -1052,7 +1261,11 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
if (gtk_widget_is_drawable(user_data->dlg.draw_area) ){
cr = gdk_cairo_create (gtk_widget_get_window(user_data->dlg.draw_area));
#if GTK_CHECK_VERSION(2,22,0)
cairo_set_source_surface (cr, user_data->dlg.surface_main, 0, 0);
#else
gdk_cairo_set_source_pixmap (cr, user_data->dlg.pixmap_main, 0, 0);
#endif
cairo_rectangle (cr, 0, 0, draw_area_alloc.width, draw_area_alloc.height);
cairo_fill (cr);
cairo_destroy (cr);
@ -1061,7 +1274,11 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data)
if (gtk_widget_is_drawable(user_data->dlg.draw_area_comments) ){
cr = gdk_cairo_create (gtk_widget_get_window(user_data->dlg.draw_area_comments));
#if GTK_CHECK_VERSION(2,22,0)
cairo_set_source_surface (cr, user_data->dlg.surface_comments, 0, 0);
#else
gdk_cairo_set_source_pixmap (cr, user_data->dlg.pixmap_comments, 0, 0);
#endif
cairo_rectangle (cr, 0, 0, draw_area_comments_alloc.width, draw_area_comments_alloc.height);
cairo_fill (cr);
cairo_destroy (cr);
@ -1180,7 +1397,11 @@ static gboolean expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer
cairo_t *cr = gdk_cairo_create (gtk_widget_get_window(widget));
if (gtk_widget_is_drawable(widget)){
#if GTK_CHECK_VERSION(2,22,0)
cairo_set_source_surface (cr, user_data->dlg.surface_main, event->area.x, event->area.y);
#else
gdk_cairo_set_source_pixmap (cr, user_data->dlg.pixmap_main, event->area.x, event->area.y);
#endif
cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height);
cairo_fill (cr);
@ -1197,7 +1418,11 @@ static gboolean expose_event_comments(GtkWidget *widget, GdkEventExpose *event,
cairo_t *cr = gdk_cairo_create (gtk_widget_get_window(widget));
if (gtk_widget_is_drawable(widget)){
#if GTK_CHECK_VERSION(2,22,0)
cairo_set_source_surface (cr, user_data->dlg.surface_comments, event->area.x, event->area.y);
#else
gdk_cairo_set_source_pixmap (cr, user_data->dlg.pixmap_comments, event->area.x, event->area.y);
#endif
cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height);
cairo_fill (cr);
@ -1214,7 +1439,11 @@ static gboolean expose_event_time(GtkWidget *widget, GdkEventExpose *event, gpoi
cairo_t *cr = gdk_cairo_create (gtk_widget_get_window(widget));
if (gtk_widget_is_drawable(widget) ){
#if GTK_CHECK_VERSION(2,22,0)
cairo_set_source_surface (cr, user_data->dlg.surface_time, event->area.x, event->area.y);
#else
gdk_cairo_set_source_pixmap (cr, user_data->dlg.pixmap_time, event->area.x, event->area.y);
#endif
cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height);
cairo_fill (cr);
@ -1231,18 +1460,36 @@ static gboolean configure_event(GtkWidget *widget, GdkEventConfigure *event _U_,
GtkAllocation widget_alloc;
cairo_t *cr;
#if GTK_CHECK_VERSION(2,22,0)
if(user_data->dlg.surface_main){
cairo_surface_destroy (user_data->dlg.surface_main);
user_data->dlg.surface_main=NULL;
}
#else
if(user_data->dlg.pixmap_main){
g_object_unref(user_data->dlg.pixmap_main);
user_data->dlg.pixmap_main=NULL;
}
#endif
gtk_widget_get_allocation(widget, &widget_alloc);
#if GTK_CHECK_VERSION(2,22,0)
user_data->dlg.surface_main = gdk_window_create_similar_surface (gtk_widget_get_window(widget),
CAIRO_CONTENT_COLOR,
widget_alloc.width,
widget_alloc.height);
cr = cairo_create (user_data->dlg.surface_main);
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);
cr = NULL;
#else
user_data->dlg.pixmap_main=gdk_pixmap_new(gtk_widget_get_window(widget),
widget_alloc.width,
widget_alloc.height,
-1);
if ( GDK_IS_DRAWABLE(user_data->dlg.pixmap_main) ){
cr = gdk_cairo_create (user_data->dlg.pixmap_main);
cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
@ -1251,6 +1498,7 @@ static gboolean configure_event(GtkWidget *widget, GdkEventConfigure *event _U_,
cairo_destroy (cr);
cr = NULL;
}
#endif
dialog_graph_redraw(user_data);
@ -1266,11 +1514,31 @@ static gboolean configure_event_comments(GtkWidget *widget, GdkEventConfigure *e
gtk_widget_get_allocation(widget, &widget_alloc);
#if GTK_CHECK_VERSION(2,22,0)
if(user_data->dlg.surface_comments){
cairo_surface_destroy (user_data->dlg.surface_comments);
user_data->dlg.surface_comments=NULL;
}
#else
if(user_data->dlg.pixmap_comments){
g_object_unref(user_data->dlg.pixmap_comments);
user_data->dlg.pixmap_comments=NULL;
}
#endif
#if GTK_CHECK_VERSION(2,22,0)
user_data->dlg.surface_comments=gdk_window_create_similar_surface (gtk_widget_get_window(widget),
CAIRO_CONTENT_COLOR,
widget_alloc.width,
widget_alloc.height);
cr = cairo_create (user_data->dlg.surface_comments);
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);
cr = NULL;
#else
user_data->dlg.pixmap_comments=gdk_pixmap_new(gtk_widget_get_window(widget),
widget_alloc.width,
widget_alloc.height,
@ -1284,7 +1552,7 @@ static gboolean configure_event_comments(GtkWidget *widget, GdkEventConfigure *e
cairo_destroy (cr);
cr = NULL;
}
#endif
dialog_graph_redraw(user_data);
return TRUE;
}
@ -1298,11 +1566,30 @@ static gboolean configure_event_time(GtkWidget *widget, GdkEventConfigure *event
gtk_widget_get_allocation(widget, &widget_alloc);
#if GTK_CHECK_VERSION(2,22,0)
if(user_data->dlg.surface_time){
cairo_surface_destroy (user_data->dlg.surface_main);
user_data->dlg.surface_main=NULL;
}
#else
if(user_data->dlg.pixmap_time){
g_object_unref(user_data->dlg.pixmap_time);
user_data->dlg.pixmap_time=NULL;
}
#endif
#if GTK_CHECK_VERSION(2,22,0)
user_data->dlg.surface_time=gdk_window_create_similar_surface(gtk_widget_get_window(widget),
CAIRO_CONTENT_COLOR,
widget_alloc.width,
widget_alloc.height);
cr = cairo_create (user_data->dlg.surface_time);
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);
cr = NULL;
#else
user_data->dlg.pixmap_time=gdk_pixmap_new(gtk_widget_get_window(widget),
widget_alloc.width,
widget_alloc.height,
@ -1316,6 +1603,7 @@ static gboolean configure_event_time(GtkWidget *widget, GdkEventConfigure *event
cairo_destroy (cr);
cr = NULL;
}
#endif
dialog_graph_redraw(user_data);
@ -1329,8 +1617,8 @@ static gboolean pane_callback(GtkWidget *widget _U_, GParamSpec *pspec _U_, gpoi
GtkAllocation draw_area_comments_alloc;
cairo_t *cr;
if (gtk_paned_get_position(GTK_PANED(user_data->dlg.hpane)) > user_data->dlg.pixmap_width)
gtk_paned_set_position(GTK_PANED(user_data->dlg.hpane), user_data->dlg.pixmap_width);
if (gtk_paned_get_position(GTK_PANED(user_data->dlg.hpane)) > user_data->dlg.surface_width)
gtk_paned_set_position(GTK_PANED(user_data->dlg.hpane), user_data->dlg.surface_width);
else if (gtk_paned_get_position(GTK_PANED(user_data->dlg.hpane)) < NODE_WIDTH*2)
gtk_paned_set_position(GTK_PANED(user_data->dlg.hpane), NODE_WIDTH*2);
@ -1340,7 +1628,11 @@ static gboolean pane_callback(GtkWidget *widget _U_, GParamSpec *pspec _U_, gpoi
if (gtk_widget_is_drawable(user_data->dlg.draw_area_comments)){
cr = gdk_cairo_create (gtk_widget_get_window(user_data->dlg.draw_area_comments));
#if GTK_CHECK_VERSION(2,22,0)
cairo_set_source_surface (cr, user_data->dlg.surface_comments, 0, 0);
#else
gdk_cairo_set_source_pixmap (cr, user_data->dlg.pixmap_comments, 0, 0);
#endif
cairo_rectangle (cr, 0, 0, draw_area_comments_alloc.width, draw_area_comments_alloc.height);
cairo_fill (cr);
cairo_destroy (cr);
@ -1386,16 +1678,16 @@ static void create_draw_area(graph_analysis_data_t *user_data, GtkWidget *box)
/* create "time" draw area */
user_data->dlg.draw_area_time=gtk_drawing_area_new();
gtk_widget_set_size_request(user_data->dlg.draw_area_time, TIME_WIDTH, user_data->dlg.pixmap_height);
gtk_widget_set_size_request(user_data->dlg.draw_area_time, TIME_WIDTH, user_data->dlg.surface_width);
frame_time = gtk_frame_new(NULL);
gtk_widget_show(frame_time);
gtk_container_add(GTK_CONTAINER(frame_time),user_data->dlg.draw_area_time);
/* create "comments" draw area */
user_data->dlg.draw_area_comments=gtk_drawing_area_new();
gtk_widget_set_size_request(user_data->dlg.draw_area_comments, COMMENT_WIDTH, user_data->dlg.pixmap_height);
gtk_widget_set_size_request(user_data->dlg.draw_area_comments, COMMENT_WIDTH, user_data->dlg.surface_width);
scroll_window_comments=gtk_scrolled_window_new(NULL, NULL);
gtk_widget_set_size_request(scroll_window_comments, (gint)(COMMENT_WIDTH/1.5), user_data->dlg.pixmap_height);
gtk_widget_set_size_request(scroll_window_comments, (gint)(COMMENT_WIDTH/1.5), user_data->dlg.surface_width);
/*
* Set the scrollbar policy for the horizontal and vertical scrollbars
* The policy determines when the scrollbar should appear
@ -1419,15 +1711,15 @@ static void create_draw_area(graph_analysis_data_t *user_data, GtkWidget *box)
/* create main Graph draw area */
user_data->dlg.draw_area=gtk_drawing_area_new();
if (user_data->num_nodes < 2)
user_data->dlg.pixmap_width = 2 * NODE_WIDTH;
user_data->dlg.surface_width = 2 * NODE_WIDTH;
else
user_data->dlg.pixmap_width = user_data->num_nodes * NODE_WIDTH;
gtk_widget_set_size_request(user_data->dlg.draw_area, user_data->dlg.pixmap_width, user_data->dlg.pixmap_height);
user_data->dlg.surface_width = user_data->num_nodes * NODE_WIDTH;
gtk_widget_set_size_request(user_data->dlg.draw_area, user_data->dlg.surface_width, user_data->dlg.surface_width);
user_data->dlg.scroll_window=gtk_scrolled_window_new(NULL, NULL);
if ( user_data->num_nodes < 6)
gtk_widget_set_size_request(user_data->dlg.scroll_window, NODE_WIDTH*user_data->num_nodes, user_data->dlg.pixmap_height);
gtk_widget_set_size_request(user_data->dlg.scroll_window, NODE_WIDTH*user_data->num_nodes, user_data->dlg.surface_width);
else
gtk_widget_set_size_request(user_data->dlg.scroll_window, NODE_WIDTH*5, user_data->dlg.pixmap_height);
gtk_widget_set_size_request(user_data->dlg.scroll_window, NODE_WIDTH*5, user_data->dlg.surface_width);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(user_data->dlg.scroll_window),
GTK_POLICY_ALWAYS,
@ -1673,12 +1965,12 @@ void graph_analysis_update(graph_analysis_data_t *user_data)
/* get nodes (each node is an address) */
get_nodes(user_data);
user_data->dlg.pixmap_width = user_data->num_nodes * NODE_WIDTH;
gtk_widget_set_size_request(user_data->dlg.draw_area, user_data->dlg.pixmap_width, user_data->dlg.pixmap_height);
user_data->dlg.surface_width = user_data->num_nodes * NODE_WIDTH;
gtk_widget_set_size_request(user_data->dlg.draw_area, user_data->dlg.surface_width, user_data->dlg.surface_width);
if (user_data->num_nodes < 6)
gtk_widget_set_size_request(user_data->dlg.scroll_window, NODE_WIDTH*user_data->num_nodes, user_data->dlg.pixmap_height);
gtk_widget_set_size_request(user_data->dlg.scroll_window, NODE_WIDTH*user_data->num_nodes, user_data->dlg.surface_width);
else
gtk_widget_set_size_request(user_data->dlg.scroll_window, NODE_WIDTH*5, user_data->dlg.pixmap_height);
gtk_widget_set_size_request(user_data->dlg.scroll_window, NODE_WIDTH*5, user_data->dlg.surface_width);
/* redraw the graph */
dialog_graph_redraw(user_data);
@ -1694,12 +1986,12 @@ void graph_analysis_redraw(graph_analysis_data_t *user_data)
/* get nodes (each node is an address) */
get_nodes(user_data);
user_data->dlg.pixmap_width = user_data->num_nodes * NODE_WIDTH;
gtk_widget_set_size_request(user_data->dlg.draw_area, user_data->dlg.pixmap_width, user_data->dlg.pixmap_height);
user_data->dlg.surface_width = user_data->num_nodes * NODE_WIDTH;
gtk_widget_set_size_request(user_data->dlg.draw_area, user_data->dlg.surface_width, user_data->dlg.surface_width);
if (user_data->num_nodes < 6)
gtk_widget_set_size_request(user_data->dlg.scroll_window, NODE_WIDTH*user_data->num_nodes, user_data->dlg.pixmap_height);
gtk_widget_set_size_request(user_data->dlg.scroll_window, NODE_WIDTH*user_data->num_nodes, user_data->dlg.surface_width);
else
gtk_widget_set_size_request(user_data->dlg.scroll_window, NODE_WIDTH*5, user_data->dlg.pixmap_height);
gtk_widget_set_size_request(user_data->dlg.scroll_window, NODE_WIDTH*5, user_data->dlg.surface_width);
/* redraw the graph */

View File

@ -87,16 +87,23 @@ typedef struct _graph_analysis_dialog_data_t {
GtkWidget *draw_area_time;
GtkWidget *draw_area;
GtkWidget *draw_area_comments;
#if GTK_CHECK_VERSION(2,22,0)
cairo_surface_t *surface_time;
cairo_surface_t *surface_main;
cairo_surface_t *surface_comments;
cairo_surface_t *surface_tile_select;
#else
GdkPixmap *pixmap_time;
GdkPixmap *pixmap_main;
GdkPixmap *pixmap_comments;
GdkPixmap *pixmap_tile_select;
#endif
GtkWidget *scroll_window;
GtkWidget *v_scrollbar;
GtkAdjustment *v_scrollbar_adjustment;
GtkWidget *hpane;
int pixmap_width;
int pixmap_height;
int surface_width;
int surface_height;
guint16 first_node; /* the first node on the left to show in the screen */
guint32 first_item; /* the first item (row) to show from the top */
guint32 selected_item; /* the selected item */