From c8bba5fa123e79c25c3ed0f6355f511ed84b88b2 Mon Sep 17 00:00:00 2001 From: compudj Date: Fri, 6 Aug 2004 06:05:13 +0000 Subject: [PATCH] authors in about git-svn-id: http://ltt.polymtl.ca/svn@667 04897980-b3bd-0310-b5e0-8ef037075253 --- ltt/branches/poly/AUTHORS | 4 +- .../lttv/modules/gui/controlflow/drawitem.c | 254 +++++++++--------- .../lttv/modules/gui/controlflow/drawitem.h | 49 ++-- .../lttv/modules/gui/controlflow/eventhooks.c | 107 +++++++- .../gui/lttvwindow/lttvwindow/callbacks.c | 19 +- 5 files changed, 261 insertions(+), 172 deletions(-) diff --git a/ltt/branches/poly/AUTHORS b/ltt/branches/poly/AUTHORS index eff2bd6c..5cc6fa1f 100644 --- a/ltt/branches/poly/AUTHORS +++ b/ltt/branches/poly/AUTHORS @@ -4,7 +4,9 @@ Contributors : Michel Dagenais (New trace format, lttv main) Mathieu Desnoyers (Directory structure, build with automake/conf, - lttv gui, control flow view) + lttv gui, control flow view, gui green threads + with interruptible foreground and background computation, + detailed event list) Benoit Des Ligneris (Cluster adaptation) Xang-Xiu Yang (new trace reading library and converter, lttv gui, detailed event list and statistics view) diff --git a/ltt/branches/poly/lttv/modules/gui/controlflow/drawitem.c b/ltt/branches/poly/lttv/modules/gui/controlflow/drawitem.c index 9445141e..2c72660a 100644 --- a/ltt/branches/poly/lttv/modules/gui/controlflow/drawitem.c +++ b/ltt/branches/poly/lttv/modules/gui/controlflow/drawitem.c @@ -114,50 +114,50 @@ gboolean draw_text( void *hook_data, void *call_data) { PropertiesText *Properties = (PropertiesText*)hook_data; - DrawContext *Draw_Context = (DrawContext*)call_data; + DrawContext *draw_context = (DrawContext*)call_data; PangoContext *context; PangoLayout *layout; PangoAttribute *attribute; - PangoFontDescription *FontDesc;// = pango_font_description_new(); - gint Font_Size; + PangoFontDescription *font_desc;// = pango_font_description_new(); + gint font_size; PangoRectangle ink_rect; - layout = Draw_Context->pango_layout; + layout = draw_context->pango_layout; context = pango_layout_get_context(layout); - FontDesc = pango_context_get_font_description(context); + font_desc = pango_context_get_font_description(context); - pango_font_description_set_size(FontDesc, Properties->size*PANGO_SCALE); + pango_font_description_set_size(font_desc, Properties->size*PANGO_SCALE); pango_layout_context_changed(layout); pango_layout_set_text(layout, Properties->text, -1); pango_layout_get_pixel_extents(layout, &ink_rect, NULL); switch(Properties->position) { case OVER: - gdk_draw_layout_with_colors(Draw_Context->drawable, - Draw_Context->gc, - Draw_Context->current->modify_over->x, - Draw_Context->current->modify_over->y, + gdk_draw_layout_with_colors(draw_context->drawable, + draw_context->gc, + draw_context->drawinfo.modify_over.x, + draw_context->drawinfo.modify_over.y, layout, Properties->foreground, Properties->background); - Draw_Context->current->modify_over->x += ink_rect.width; + draw_context->drawinfo.modify_over.x += ink_rect.width; break; case MIDDLE: - gdk_draw_layout_with_colors(Draw_Context->drawable, - Draw_Context->gc, - Draw_Context->current->modify_middle->x, - Draw_Context->current->modify_middle->y, + gdk_draw_layout_with_colors(draw_context->drawable, + draw_context->gc, + draw_context->drawinfo.modify_middle.x, + draw_context->drawinfo.modify_middle.y, layout, Properties->foreground, Properties->background); - Draw_Context->current->modify_middle->x += ink_rect.width; + draw_context->drawinfo.modify_middle.x += ink_rect.width; break; case UNDER: - gdk_draw_layout_with_colors(Draw_Context->drawable, - Draw_Context->gc, - Draw_Context->current->modify_under->x, - Draw_Context->current->modify_under->y, + gdk_draw_layout_with_colors(draw_context->drawable, + draw_context->gc, + draw_context->drawinfo.modify_under.x, + draw_context->drawinfo.modify_under.y, layout, Properties->foreground, Properties->background); - Draw_Context->current->modify_under->x += ink_rect.width; + draw_context->drawinfo.modify_under.x += ink_rect.width; break; } @@ -170,15 +170,15 @@ gboolean draw_text( void *hook_data, void *call_data) */ gboolean draw_icon( void *hook_data, void *call_data) { - PropertiesIcon *Properties = (PropertiesIcon*)hook_data; - DrawContext *Draw_Context = (DrawContext*)call_data; + PropertiesIcon *properties = (PropertiesIcon*)hook_data; + DrawContext *draw_context = (DrawContext*)call_data; LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes()); LttvAttributeValue value; gchar icon_name[MAX_PATH_LEN] = "icons/"; IconStruct *icon_info; - strcat(icon_name, Properties->icon_name); + strcat(icon_name, properties->icon_name); g_assert(lttv_iattribute_find_by_path(attributes, icon_name, LTTV_POINTER, &value)); @@ -186,118 +186,118 @@ gboolean draw_icon( void *hook_data, void *call_data) { *(value.v_pointer) = icon_info = g_new(IconStruct,1); - icon_info->pixmap = gdk_pixmap_create_from_xpm(Draw_Context->drawable, - &icon_info->mask, NULL, Properties->icon_name); + icon_info->pixmap = gdk_pixmap_create_from_xpm(draw_context->drawable, + &icon_info->mask, NULL, properties->icon_name); } else { icon_info = *(value.v_pointer); } - gdk_gc_set_clip_mask(Draw_Context->gc, icon_info->mask); + gdk_gc_set_clip_mask(draw_context->gc, icon_info->mask); - switch(Properties->position) { + switch(properties->position) { case OVER: gdk_gc_set_clip_origin( - Draw_Context->gc, - Draw_Context->current->modify_over->x, - Draw_Context->current->modify_over->y); - gdk_draw_drawable(Draw_Context->drawable, - Draw_Context->gc, + draw_context->gc, + draw_context->drawinfo.modify_over.x, + draw_context->drawinfo.modify_over.y); + gdk_draw_drawable(draw_context->drawable, + draw_context->gc, icon_info->pixmap, 0, 0, - Draw_Context->current->modify_over->x, - Draw_Context->current->modify_over->y, - Properties->width, Properties->height); + draw_context->drawinfo.modify_over.x, + draw_context->drawinfo.modify_over.y, + properties->width, properties->height); - Draw_Context->current->modify_over->x += Properties->width; + draw_context->drawinfo.modify_over.x += properties->width; break; case MIDDLE: gdk_gc_set_clip_origin( - Draw_Context->gc, - Draw_Context->current->modify_middle->x, - Draw_Context->current->modify_middle->y); - gdk_draw_drawable(Draw_Context->drawable, - Draw_Context->gc, + draw_context->gc, + draw_context->drawinfo.modify_middle.x, + draw_context->drawinfo.modify_middle.y); + gdk_draw_drawable(draw_context->drawable, + draw_context->gc, icon_info->pixmap, 0, 0, - Draw_Context->current->modify_middle->x, - Draw_Context->current->modify_middle->y, - Properties->width, Properties->height); + draw_context->drawinfo.modify_middle.x, + draw_context->drawinfo.modify_middle.y, + properties->width, properties->height); - Draw_Context->current->modify_middle->x += Properties->width; + draw_context->drawinfo.modify_middle.x += properties->width; break; case UNDER: gdk_gc_set_clip_origin( - Draw_Context->gc, - Draw_Context->current->modify_under->x, - Draw_Context->current->modify_under->y); - gdk_draw_drawable(Draw_Context->drawable, - Draw_Context->gc, + draw_context->gc, + draw_context->drawinfo.modify_under.x, + draw_context->drawinfo.modify_under.y); + gdk_draw_drawable(draw_context->drawable, + draw_context->gc, icon_info->pixmap, 0, 0, - Draw_Context->current->modify_under->x, - Draw_Context->current->modify_under->y, - Properties->width, Properties->height); + draw_context->drawinfo.modify_under.x, + draw_context->drawinfo.modify_under.y, + properties->width, properties->height); - Draw_Context->current->modify_under->x += Properties->width; + draw_context->drawinfo.modify_under.x += properties->width; break; } - gdk_gc_set_clip_origin(Draw_Context->gc, 0, 0); - gdk_gc_set_clip_mask(Draw_Context->gc, NULL); + gdk_gc_set_clip_origin(draw_context->gc, 0, 0); + gdk_gc_set_clip_mask(draw_context->gc, NULL); return 0; } gboolean draw_line( void *hook_data, void *call_data) { - PropertiesLine *Properties = (PropertiesLine*)hook_data; - DrawContext *Draw_Context = (DrawContext*)call_data; - //GdkGC *gc = gdk_gc_new(Draw_Context->drawable); + PropertiesLine *properties = (PropertiesLine*)hook_data; + DrawContext *draw_context = (DrawContext*)call_data; + //GdkGC *gc = gdk_gc_new(draw_context->drawable); - //gdk_gc_set_foreground(Draw_Context->gc, Properties->color); - gdk_gc_set_rgb_fg_color(Draw_Context->gc, Properties->color); - //gdk_gc_set_foreground(gc, Properties->color); - gdk_gc_set_line_attributes( Draw_Context->gc, - Properties->line_width, - Properties->style, + //gdk_gc_set_foreground(draw_context->gc, properties->color); + gdk_gc_set_rgb_fg_color(draw_context->gc, &properties->color); + //gdk_gc_set_foreground(gc, properties->color); + gdk_gc_set_line_attributes( draw_context->gc, + properties->line_width, + properties->style, GDK_CAP_BUTT, GDK_JOIN_MITER); //g_critical("DRAWING LINE : x1: %i, y1: %i, x2:%i, y2:%i", - // Draw_Context->previous->middle->x, - // Draw_Context->previous->middle->y, - // Draw_Context->current->middle->x, - // Draw_Context->current->middle->y); + // draw_context->previous->middle->x, + // draw_context->previous->middle->y, + // draw_context->drawinfo.middle.x, + // draw_context->drawinfo.middle.y); - switch(Properties->position) { + switch(properties->position) { case OVER: drawing_draw_line( - NULL, Draw_Context->drawable, - Draw_Context->previous->over->x, - Draw_Context->previous->over->y, - Draw_Context->current->over->x, - Draw_Context->current->over->y, - Draw_Context->gc); + NULL, draw_context->drawable, + draw_context->previous->over->x, + draw_context->previous->over->y, + draw_context->drawinfo.over.x, + draw_context->current->over->y, + draw_context->gc); break; case MIDDLE: drawing_draw_line( - NULL, Draw_Context->drawable, - Draw_Context->previous->middle->x, - Draw_Context->previous->middle->y, - Draw_Context->current->middle->x, - Draw_Context->current->middle->y, - Draw_Context->gc); + NULL, draw_context->drawable, + draw_context->previous->middle->x, + draw_context->previous->middle->y, + draw_context->drawinfo.middle.x, + draw_context->drawinfo.middle.y, + draw_context->gc); break; case UNDER: drawing_draw_line( - NULL, Draw_Context->drawable, - Draw_Context->previous->under->x, - Draw_Context->previous->under->y, - Draw_Context->current->under->x, - Draw_Context->current->under->y, - Draw_Context->gc); + NULL, draw_context->drawable, + draw_context->previous->under->x, + draw_context->previous->under->y, + draw_context->drawinfo.under.x, + draw_context->drawinfo.under.y, + draw_context->gc); break; } @@ -309,37 +309,37 @@ gboolean draw_line( void *hook_data, void *call_data) gboolean draw_arc( void *hook_data, void *call_data) { - PropertiesArc *Properties = (PropertiesArc*)hook_data; - DrawContext *Draw_Context = (DrawContext*)call_data; + PropertiesArc *properties = (PropertiesArc*)hook_data; + DrawContext *draw_context = (DrawContext*)call_data; - //gdk_gc_set_foreground(Draw_Context->gc, Properties->color); - gdk_gc_set_rgb_fg_color(Draw_Context->gc, Properties->color); + //gdk_gc_set_foreground(draw_context->gc, properties->color); + gdk_gc_set_rgb_fg_color(draw_context->gc, properties->color); - switch(Properties->position) { + switch(properties->position) { case OVER: - gdk_draw_arc(Draw_Context->drawable, Draw_Context->gc, - Properties->filled, - Draw_Context->current->modify_over->x, - Draw_Context->current->modify_over->y, - Properties->size, Properties->size, 0, 360*64); - Draw_Context->current->modify_over->x += Properties->size; + gdk_draw_arc(draw_context->drawable, draw_context->gc, + properties->filled, + draw_context->drawinfo.modify_over.x, + draw_context->drawinfo.modify_over.y, + properties->size, properties->size, 0, 360*64); + draw_context->drawinfo.modify_over.x += properties->size; break; case MIDDLE: - gdk_draw_arc(Draw_Context->drawable, Draw_Context->gc, - Properties->filled, - Draw_Context->current->modify_middle->x, - Draw_Context->current->modify_middle->y, - Properties->size, Properties->size, 0, 360*64); - Draw_Context->current->modify_middle->x += Properties->size; + gdk_draw_arc(draw_context->drawable, draw_context->gc, + properties->filled, + draw_context->drawinfo.modify_middle.x, + draw_context->drawinfo.modify_middle.y, + properties->size, properties->size, 0, 360*64); + draw_context->drawinfo.modify_middle.x += properties->size; break; case UNDER: - gdk_draw_arc(Draw_Context->drawable, Draw_Context->gc, - Properties->filled, - Draw_Context->current->modify_under->x, - Draw_Context->current->modify_under->y, - Properties->size, Properties->size, 0, 360*64); - Draw_Context->current->modify_under->x += Properties->size; + gdk_draw_arc(draw_context->drawable, draw_context->gc, + properties->filled, + draw_context->drawinfo.modify_under.x, + draw_context->drawinfo.modify_under.y, + properties->size, properties->size, 0, 360*64); + draw_context->drawinfo.modify_under.x += properties->size; break; } @@ -350,25 +350,25 @@ gboolean draw_arc( void *hook_data, void *call_data) gboolean draw_bg( void *hook_data, void *call_data) { - PropertiesBG *Properties = (PropertiesBG*)hook_data; - DrawContext *Draw_Context = (DrawContext*)call_data; + PropertiesBG *properties = (PropertiesBG*)hook_data; + DrawContext *draw_context = (DrawContext*)call_data; - //gdk_gc_set_foreground(Draw_Context->gc, Properties->color); - gdk_gc_set_rgb_fg_color(Draw_Context->gc, Properties->color); + //gdk_gc_set_foreground(draw_context->gc, properties->color); + gdk_gc_set_rgb_fg_color(draw_context->gc, properties->color); //g_critical("DRAWING RECT : x: %i, y: %i, w:%i, h:%i, val1 :%i, val2:%i ", - // Draw_Context->previous->over->x, - // Draw_Context->previous->over->y, - // Draw_Context->current->over->x - Draw_Context->previous->over->x, - // Draw_Context->previous->under->y-Draw_Context->previous->over->y, - // Draw_Context->current->over->x, - // Draw_Context->previous->over->x); - gdk_draw_rectangle(Draw_Context->drawable, Draw_Context->gc, + // draw_context->previous->over->x, + // draw_context->previous->over->y, + // draw_context->drawinfo.over.x - draw_context->previous->over->x, + // draw_context->previous->under->y-draw_context->previous->over->y, + // draw_context->drawinfo.over.x, + // draw_context->previous->over->x); + gdk_draw_rectangle(draw_context->drawable, draw_context->gc, TRUE, - Draw_Context->previous->over->x, - Draw_Context->previous->over->y, - Draw_Context->current->over->x - Draw_Context->previous->over->x, - Draw_Context->previous->under->y-Draw_Context->previous->over->y); + draw_context->previous->over->x, + draw_context->previous->over->y, + draw_context->drawinfo.over.x - draw_context->previous->over->x, + draw_context->previous->under->y-draw_context->previous->over->y); return 0; } diff --git a/ltt/branches/poly/lttv/modules/gui/controlflow/drawitem.h b/ltt/branches/poly/lttv/modules/gui/controlflow/drawitem.h index 1fca9ae7..fe46c062 100644 --- a/ltt/branches/poly/lttv/modules/gui/controlflow/drawitem.h +++ b/ltt/branches/poly/lttv/modules/gui/controlflow/drawitem.h @@ -59,6 +59,8 @@ typedef enum _RelPos { * when we draw a text, an arc or an icon, while it's unneeded when we * draw a line or background. * + * The modify_* positions are altered by the draw item functions. + * */ @@ -67,42 +69,23 @@ struct _DrawContext { GdkGC *gc; PangoLayout *pango_layout; - DrawInfo *current; - DrawInfo *previous; -}; + struct { + gint x_start; + gint x_end; -/* LttvExecutionState is accessible through the LttvTracefileState. Is has - * a pointer to the LttvProcessState which points to the top of stack - * execution state : LttvExecutionState *state. - * - * LttvExecutionState contains (useful here): - * LttvExecutionMode t, - * LttvExecutionSubmode n, - * LttvProcessStatus s - * - * - * LttvTraceState will be used in the case we need the string of the - * different processes, eventtype_names, syscall_names, trap_names, irq_names. - * - * LttvTracefileState also gives the cpu_name and, as it herits from - * LttvTracefileContext, it gives the LttEvent structure, which is needed - * to get facility name and event name. - */ -struct _DrawInfo { - ItemInfo *over; - ItemInfo *middle; - ItemInfo *under; - - ItemInfo *modify_over; - ItemInfo *modify_middle; - ItemInfo *modify_under; - LttvProcessStatus status; -}; + gint y_over; + gint y_middle; + gint y_under; -struct _ItemInfo { - gint x, y; + gint x_modify_over; + gint x_modify_middle; + gint x_modify_under; + } drawinfo; }; + + + /* * Structure used to keep information about icons. */ @@ -163,7 +146,7 @@ struct _PropertiesIcon { }; struct _PropertiesLine { - GdkColor *color; + GdkColor color; gint line_width; GdkLineStyle style; RelPos position; diff --git a/ltt/branches/poly/lttv/modules/gui/controlflow/eventhooks.c b/ltt/branches/poly/lttv/modules/gui/controlflow/eventhooks.c index 19d004b9..ed2e3309 100644 --- a/ltt/branches/poly/lttv/modules/gui/controlflow/eventhooks.c +++ b/ltt/branches/poly/lttv/modules/gui/controlflow/eventhooks.c @@ -279,6 +279,66 @@ int event_selected_hook(void *hook_data, void *call_data) } + +static __inline PropertiesLine prepare_line(LttvProcessState *process) +{ + PropertiesLine prop_line; + prop_line.line_width = 2; + prop_line.style = GDK_LINE_SOLID; + prop_line.position = MIDDLE; + + g_debug("prepare_line for state : %s", g_quark_to_string(process->state->s)); + + /* color of line : status of the process */ + if(process->state->s == LTTV_STATE_UNNAMED) + { + prop_line.color.red = 0xffff; + prop_line.color.green = 0xffff; + prop_line.color.blue = 0xffff; + } + else if(process->state->s == LTTV_STATE_WAIT_FORK) + { + prop_line.color.red = 0x0fff; + prop_line.color.green = 0xffff; + prop_line.color.blue = 0xfff0; + } + else if(process->state->s == LTTV_STATE_WAIT_CPU) + { + prop_line.color.red = 0xffff; + prop_line.color.green = 0xffff; + prop_line.color.blue = 0x0000; + } + else if(process->state->s == LTTV_STATE_EXIT) + { + prop_line.color.red = 0xffff; + prop_line.color.green = 0x0000; + prop_line.color.blue = 0xffff; + } + else if(process->state->s == LTTV_STATE_WAIT) + { + prop_line.color.red = 0xffff; + prop_line.color.green = 0x0000; + prop_line.color.blue = 0x0000; + } + else if(process->state->s == LTTV_STATE_RUN) + { + prop_line.color.red = 0x0000; + prop_line.color.green = 0xffff; + prop_line.color.blue = 0x0000; + } + else + { + prop_line.color.red = 0xffff; + prop_line.color.green = 0xffff; + prop_line.color.blue = 0xffff; + } + + return prop_line; + +} + + + /* draw_before_hook * * This function basically draw lines and icons. Two types of lines are drawn : @@ -301,6 +361,7 @@ int draw_before_hook(void *hook_data, void *call_data) { EventsRequest *events_request = (EventsRequest*)hook_data; ControlFlowData *control_flow_data = events_request->viewer_data; + Drawing_t *drawing = control_flow_data->drawing; LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; @@ -321,7 +382,7 @@ int draw_before_hook(void *hook_data, void *call_data) || ltt_time_compare(evtime, end_time) == 1) return; - guint width = control_flow_data->drawing->width; + guint width = drawing->width; if(strcmp(ltt_eventtype_name(ltt_event_eventtype(e)),"schedchange") == 0) { @@ -355,7 +416,7 @@ int draw_before_hook(void *hook_data, void *call_data) * or add it, and draw its items. */ /* Add process to process list (if not present) */ - guint y_out = 0, height = 0, pl_height = 0; + guint y = 0, height = 0, pl_height = 0; HashedProcessData *hashed_process_data = NULL; ProcessList *process_list = guicontrolflow_get_process_list(control_flow_data); @@ -366,7 +427,7 @@ int draw_before_hook(void *hook_data, void *call_data) pid_out, &birth, tfc->t_context->index, - &y_out, + &y, &height, &hashed_process_data) == 1) { @@ -382,10 +443,10 @@ int draw_before_hook(void *hook_data, void *call_data) pid_out, &birth, tfc->t_context->index, - &y_out, + &y, &height, &hashed_process_data); - drawing_insert_square( control_flow_data->drawing, y_out, height); + drawing_insert_square( drawing, y, height); } /* Now, the process is in the state hash and our own process hash. @@ -398,8 +459,39 @@ int draw_before_hook(void *hook_data, void *call_data) * value. */ g_assert(hashed_process_data->x != -1); - - + { + guint x; + DrawContext draw_context; + + convert_time_to_pixels( + time_window.start_time, + end_time, + evtime, + width, + &x); + + /* Now create the drawing context that will be used to draw + * items related to the last state. */ + draw_context.drawable = drawing->pixmap; + draw_context.gc = drawing->gc; + draw_context.pango_layout = drawing->pango_layout; + draw_context.drawinfo.x_start = hashed_process_data->x; + draw_context.drawinfo.x_end = x; + + draw_context.drawinfo.y_over = y; + draw_context.drawinfo.y_middle = y+(height/4); + draw_context.drawinfo.y_under = y+(height/2)+2; + + draw_context.drawinfo.x_modify_over = hashed_process_data->x; + draw_context.drawinfo.x_modify_middle = hashed_process_data->x; + draw_context.drawinfo.x_modify_under = hashed_process_data->x; + + { + /* Draw the line */ + PropertiesLine prop_line = prepare_line(process); + draw_line((void*)&prop_line, (void*)&draw_context); + } + } } } @@ -407,7 +499,6 @@ int draw_before_hook(void *hook_data, void *call_data) return 0; - #if 0 EventsRequest *events_request = (EventsRequest*)hook_data; ControlFlowData *control_flow_data = diff --git a/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c b/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c index b0d4b4ca..c101c9c6 100644 --- a/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c +++ b/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c @@ -2896,26 +2896,39 @@ on_about_activate (GtkMenuItem *menuitem, /* Text to show */ GtkWidget *label1 = gtk_label_new(""); + gtk_misc_set_padding(GTK_MISC(label1), 10, 20); gtk_label_set_markup(GTK_LABEL(label1), "\ -Linux Trace Toolkit"); +Linux Trace Toolkit"); gtk_label_set_justify(GTK_LABEL(label1), GTK_JUSTIFY_CENTER); GtkWidget *label2 = gtk_label_new(""); + gtk_misc_set_padding(GTK_MISC(label2), 10, 20); gtk_label_set_markup(GTK_LABEL(label2), "\ -\n\n\ Project author: Karim Yaghmour\n\ \n\ Contributors :\n\ \n\ Michel Dagenais (New trace format, lttv main)\n\ Mathieu Desnoyers (Directory structure, build with automake/conf,\n\ - lttv gui, control flow view)\n\ + lttv gui, control flow view, gui green threads\n\ + with interruptible foreground and background computation,\n\ + detailed event list)\n\ Benoit Des Ligneris (Cluster adaptation)\n\ Xang-Xiu Yang (new trace reading library and converter, lttv gui, \n\ detailed event list and statistics view)\n\ Tom Zanussi (RelayFS)"); + + GtkWidget *label3 = gtk_label_new(""); + gtk_label_set_markup(GTK_LABEL(label3), "\ +Linux Trace Toolkit, Copyright (C) 2004 Karim Yaghmour\n\ +Linux Trace Toolkit comes with ABSOLUTELY NO WARRANTY.\n\ +This is free software, and you are welcome to redistribute it\n\ +under certain conditions. See COPYING for details."); + gtk_misc_set_padding(GTK_MISC(label3), 10, 20); + gtk_box_pack_start_defaults(GTK_BOX(vbox), label1); gtk_box_pack_start_defaults(GTK_BOX(vbox), label2); + gtk_box_pack_start_defaults(GTK_BOX(vbox), label3); GtkWidget *hbox = gtk_hbox_new(TRUE, 0); gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); -- 2.34.1