X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2Fgui%2Fcontrolflow%2Fdrawing.h;h=fc60dcad9640771f7b86bc551ee3c20717694624;hb=0b74aa8307516c05e7f8d99a7df12384dcabc53d;hp=6576a89213ebe016a8283ce9d16f08270904d0b8;hpb=3cb8b205f358d14996003565628dfa70ec95a311;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/gui/controlflow/drawing.h b/ltt/branches/poly/lttv/modules/gui/controlflow/drawing.h index 6576a892..fc60dcad 100644 --- a/ltt/branches/poly/lttv/modules/gui/controlflow/drawing.h +++ b/ltt/branches/poly/lttv/modules/gui/controlflow/drawing.h @@ -24,12 +24,33 @@ #include #include #include +#include +#include +#include #include "cfv.h" #include "drawitem.h" #define SAFETY 50 // safety pixels at right and bottom of pixmap buffer +typedef enum _draw_color { + COL_BLACK, + COL_WHITE, + COL_RUN_USER_MODE,/* green */ + COL_RUN_SYSCALL, /* pale blue */ + COL_RUN_TRAP, /* yellow */ + COL_RUN_IRQ, /* red */ + COL_WAIT, /* dark red */ + COL_WAIT_CPU, /* dark yellow */ + COL_ZOMBIE, /* dark purple */ + COL_WAIT_FORK, /* dark green */ + COL_EXIT, /* "less dark" magenta */ + COL_MODE_UNKNOWN, /* white */ + COL_UNNAMED, /* white */ + NUM_COLORS } draw_color; + +extern GdkColor drawing_colors[NUM_COLORS]; + /* This part of the viewer does : * Draw horizontal lines, getting graphic context as arg. * Copy region of the screen into another. @@ -52,19 +73,45 @@ * of the shown processes. */ +#ifndef TYPE_DRAWING_T_DEFINED +#define TYPE_DRAWING_T_DEFINED typedef struct _Drawing_t Drawing_t; +#endif //TYPE_DRAWING_T_DEFINED + +#ifndef TYPE_CONTROLFLOWDATA_DEFINED +#define TYPE_CONTROLFLOWDATA_DEFINED +typedef struct _ControlFlowData ControlFlowData; +#endif //TYPE_CONTROLFLOWDATA_DEFINED struct _Drawing_t { GtkWidget *vbox; GtkWidget *drawing_area; + //GtkWidget *scrolled_window; + GtkWidget *hbox; + GtkWidget *viewport; + GtkWidget *scrollbar; + + GtkWidget *ruler_hbox; GtkWidget *ruler; + GtkWidget *padding; GdkPixmap *pixmap; ControlFlowData *control_flow_data; PangoLayout *pango_layout; - gint height, width, depth; + gint height, width, depth; + /* height and width of allocated buffer pixmap */ + gint alloc_height, alloc_width; + /* X coordinate of damaged region */ + gint damage_begin, damage_end; /* damaged region to be exposed, + updated per chunk */ + LttTime last_start; + GdkGC *dotted_gc; + GdkGC *gc; + + /* Position of the horizontal selector, -1 for none */ + gint horizontal_sel; }; Drawing_t *drawing_construct(ControlFlowData *control_flow_data); @@ -73,9 +120,12 @@ void drawing_destroy(Drawing_t *drawing); GtkWidget *drawing_get_widget(Drawing_t *drawing); GtkWidget *drawing_get_drawing_area(Drawing_t *drawing); -//void drawing_Refresh ( Drawing_t *drawing, -// guint x, guint y, -// guint width, guint height); + +void drawing_data_request(Drawing_t *drawing, + GdkPixmap **pixmap, + gint x, gint y, + gint width, + gint height); void drawing_draw_line( Drawing_t *drawing, GdkPixmap *pixmap, @@ -88,6 +138,9 @@ void drawing_draw_line( Drawing_t *drawing, // guint xdest, guint ydest, // guint width, guint height); +/* Clear the drawing : make it 1xwidth. */ +void drawing_clear(Drawing_t *drawing); + /* Insert a square corresponding to a new process in the list */ void drawing_insert_square(Drawing_t *drawing, guint y, @@ -98,23 +151,69 @@ void drawing_remove_square(Drawing_t *drawing, guint y, guint height); +void drawing_update_ruler(Drawing_t *drawing, TimeWindow *time_window); + +void drawing_request_expose(EventsRequest *events_request, + LttvTracesetState *tss, + LttTime end_time); + +void drawing_data_request_begin(EventsRequest *events_request, + LttvTracesetState *tss); +void drawing_chunk_begin(EventsRequest *events_request, LttvTracesetState *tss); + + + +void +tree_row_activated(GtkTreeModel *treemodel, + GtkTreePath *arg1, + GtkTreeViewColumn *arg2, + gpointer user_data); -//void drawing_Resize(Drawing_t *drawing, guint h, guint w); -void convert_pixels_to_time( +/* convert_pixels_to_time + * + * Convert from window pixel and time interval to an absolute time. + */ +static inline void convert_pixels_to_time( gint width, guint x, - LttTime *window_time_begin, - LttTime *window_time_end, - LttTime *time); + TimeWindow time_window, + LttTime *time) +{ + double time_d; + + time_d = time_window.time_width_double; + time_d = time_d / (double)width * (double)x; + *time = ltt_time_from_double(time_d); + *time = ltt_time_add(time_window.start_time, *time); +} -void convert_time_to_pixels( - LttTime window_time_begin, - LttTime window_time_end, + +static inline void convert_time_to_pixels( + TimeWindow time_window, LttTime time, - gint width, - guint *x); + int width, + guint *x) +{ + double time_d; +#ifdef EXTRA_CHECK + g_assert(ltt_time_compare(window_time_begin, time) <= 0 && + ltt_time_compare(window_time_end, time) >= 0); +#endif //EXTRA_CHECK + + time = ltt_time_sub(time, time_window.start_time); + + time_d = ltt_time_to_double(time); + + if(time_window.time_width_double == 0.0) { + g_assert(time_d == 0.0); + *x = 0; + } else { + *x = (guint)(time_d / time_window.time_width_double * (double)width); + } + +} + -void drawing_update_ruler(Drawing_t *drawing, TimeWindow *time_window); #endif // _DRAWING_H