From: compudj Date: Mon, 29 Sep 2003 01:22:15 +0000 (+0000) Subject: basic drawing of elementary objects and lines working X-Git-Tag: v0.12.20~3215 X-Git-Url: https://git.lttng.org/?a=commitdiff_plain;h=847b479de75182dfd3f90e4faeefa48c099713ad;hp=76a67e8a7bd87a57452127275bb7208f52f7a17b;p=lttv.git basic drawing of elementary objects and lines working git-svn-id: http://ltt.polymtl.ca/svn@274 04897980-b3bd-0310-b5e0-8ef037075253 --- diff --git a/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c b/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c index 0210b713..82240306 100644 --- a/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c +++ b/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c @@ -36,36 +36,204 @@ struct _Drawing_t { }; +void test_draw(Drawing_t *Drawing) +{ + GdkRectangle update_rect; +// GdkColor color = { 0, 65535, 65535, 65535 }; -Drawing_t *Drawing_construct(void) +// gdk_colormap_alloc_color(gdk_rgb_get_cmap(), &color, 0, 1); + +// GdkGC *gc = +// Drawing->Drawing_Area_V-> +// style->fg_gc[GTK_WIDGET_STATE (Drawing->Drawing_Area_V)]; +// gdk_gc_set_foreground(gc, &color); + update_rect.x = 50; + update_rect.y = 50; + update_rect.width = 1000; + update_rect.height = 1000; + gdk_draw_rectangle (Drawing->Pixmap, + Drawing->Drawing_Area_V->style->black_gc, + TRUE, + 50, 50, + 1000, + 1000); + + + //Drawing_draw_line(Drawing, 10, 10, 50, 10, + // Drawing->Drawing_Area_V->style->black_gc); + gtk_widget_draw (Drawing->Drawing_Area_V, &update_rect); + +// Drawing_Refresh( Drawing, 0, 0, 30, 30); +} + +void Drawing_Data_Request(Drawing_t *Drawing, + GdkPixmap *Pixmap, + gint x, gint y, + gint width, + gint height) +{ + gdk_draw_rectangle (Pixmap, + Drawing->Drawing_Area_V->style->white_gc, + TRUE, + x, y, + width, // do not overlap + height); + + Drawing_draw_line(Drawing, Pixmap, 10, 10, 50, 10, + Drawing->Drawing_Area_V->style->black_gc); + +} + +/* Callbacks */ + + +/* Create a new backing pixmap of the appropriate size */ +static gboolean +configure_event( GtkWidget *widget, GdkEventConfigure *event, + gpointer user_data) { + Drawing_t *Drawing = (Drawing_t*)user_data; + GdkPixmap *Pixmap = gdk_pixmap_new(widget->window, + widget->allocation.width, + widget->allocation.height, + -1); + + if(Drawing->Pixmap == NULL) + { + Drawing->Pixmap = gdk_pixmap_new(widget->window, + widget->allocation.width, + widget->allocation.height, + -1); + Drawing->width = widget->allocation.width; + Drawing->height = widget->allocation.height; + + /* Initial data request */ + Drawing_Data_Request(Drawing, Drawing->Pixmap, 0, 0, + widget->allocation.width, + widget->allocation.height); + + } +// /* Draw empty background */ +// gdk_draw_rectangle (Pixmap, +// widget->style->black_gc, +// TRUE, +// 0, 0, +// widget->allocation.width, +// widget->allocation.height); + + /* Copy old data to new pixmap */ + gdk_draw_drawable (Pixmap, + widget->style->white_gc, + Drawing->Pixmap, + 0, 0, + 0, 0, + -1, -1); + + /* Request data for missing space */ + Drawing_Data_Request(Drawing, Pixmap, Drawing->width, 0, + widget->allocation.width - Drawing->width, + widget->allocation.height); + Drawing_Data_Request(Drawing, Pixmap, 0, Drawing->height, + Drawing->width, + widget->allocation.height - Drawing->height); + +// gdk_draw_rectangle (Pixmap, +// widget->style->white_gc, +// TRUE, +// Drawing->width, 0, +// widget->allocation.width - +// Drawing->width, +// widget->allocation.height); + +// gdk_draw_rectangle (Pixmap, +// widget->style->white_gc, +// TRUE, +// 0, Drawing->height, +// Drawing->width, // do not overlap +// widget->allocation.height - +// Drawing->height); + + + + g_critical("drawing configure event"); + + + if (Drawing->Pixmap) + gdk_pixmap_unref(Drawing->Pixmap); + + Drawing->Pixmap = Pixmap; + Drawing->width = widget->allocation.width; + Drawing->height = widget->allocation.height; + + return TRUE; +} + + +/* Redraw the screen from the backing pixmap */ +static gboolean +expose_event( GtkWidget *widget, GdkEventExpose *event, gpointer user_data ) +{ + Drawing_t *Drawing = (Drawing_t*)user_data; + g_critical("drawing expose event"); + + gdk_draw_pixmap(widget->window, + widget->style->fg_gc[GTK_WIDGET_STATE (widget)], + Drawing->Pixmap, + event->area.x, event->area.y, + event->area.x, event->area.y, + event->area.width, event->area.height); + + return FALSE; +} + +Drawing_t *Drawing_construct(void) +{ Drawing_t *Drawing = g_new(Drawing_t, 1); Drawing->Drawing_Area_V = gtk_drawing_area_new (); - + + //gtk_widget_set_size_request(Drawing->Drawing_Area_V->window, 50, 50); g_object_set_data_full( G_OBJECT(Drawing->Drawing_Area_V), "Link_Drawing_Data", Drawing, (GDestroyNotify)Drawing_destroy); - gtk_widget_modify_bg( Drawing->Drawing_Area_V, - GTK_STATE_NORMAL, - &CF_Colors[BLACK]); - - gdk_window_get_geometry(Drawing->Drawing_Area_V->window, - NULL, NULL, - &(Drawing->width), - &(Drawing->height), - &(Drawing->depth)); - - Drawing->Pixmap = gdk_pixmap_new( - Drawing->Drawing_Area_V->window, - Drawing->width, - Drawing->height, - Drawing->depth); - + //gtk_widget_modify_bg( Drawing->Drawing_Area_V, + // GTK_STATE_NORMAL, + // &CF_Colors[BLACK]); + + //gdk_window_get_geometry(Drawing->Drawing_Area_V->window, + // NULL, NULL, + // &(Drawing->width), + // &(Drawing->height), + // -1); + + //Drawing->Pixmap = gdk_pixmap_new( + // Drawing->Drawing_Area_V->window, + // Drawing->width, + // Drawing->height, + // Drawing->depth); + + Drawing->Pixmap = NULL; + +// Drawing->Pixmap = gdk_pixmap_new(Drawing->Drawing_Area_V->window, +// Drawing->Drawing_Area_V->allocation.width, +// Drawing->Drawing_Area_V->allocation.height, +// -1); + + + g_signal_connect (G_OBJECT(Drawing->Drawing_Area_V), + "configure_event", + G_CALLBACK (configure_event), + (gpointer)Drawing); + + g_signal_connect (G_OBJECT(Drawing->Drawing_Area_V), + "expose_event", + G_CALLBACK (expose_event), + (gpointer)Drawing); + return Drawing; } @@ -132,6 +300,33 @@ void convert_time_to_pixels( } +void Drawing_Refresh ( Drawing_t *Drawing, + guint x, guint y, + guint width, guint height) +{ + gdk_draw_drawable( + Drawing->Drawing_Area_V->window, + Drawing->Drawing_Area_V-> + style->fg_gc[GTK_WIDGET_STATE (Drawing->Drawing_Area_V)], + GDK_DRAWABLE(Drawing->Pixmap), + x, y, + x, y, + width, height); +} + + +void Drawing_draw_line( Drawing_t *Drawing, + GdkPixmap *Pixmap, + guint x1, guint y1, + guint x2, guint y2, + GdkGC *GC) +{ + gdk_draw_line (Pixmap, + GC, + x1, y1, x2, y2); +} + + void Drawing_Resize(Drawing_t *Drawing, guint h, guint w) @@ -145,3 +340,5 @@ void Drawing_Resize(Drawing_t *Drawing, guint h, guint w) } + + diff --git a/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.h b/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.h index 8fb20c20..22d2224b 100644 --- a/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.h +++ b/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.h @@ -10,7 +10,7 @@ * Draw horizontal lines, getting graphic context as arg. * Copy region of the screen into another. * Modify the boundaries to reflect a scale change. (resize) - * + * Refresh the physical screen with the pixmap * A helper function is provided here to convert from time and process * identifier to pixels and the contrary (will be useful for mouse selection). */ @@ -22,16 +22,23 @@ void Drawing_destroy(Drawing_t *Drawing); GtkWidget *Drawing_getWidget(Drawing_t *Drawing); - -void Drawing_draw_line( guint x1, guint y1, guint x2, guint y2, +//void Drawing_Refresh ( Drawing_t *Drawing, +// guint x, guint y, +// guint width, guint height); + +void Drawing_draw_line( Drawing_t *Drawing, + GdkPixmap *Pixmap, + guint x1, guint y1, + guint x2, guint y2, GdkGC *GC); -void Drawing_copy(guint xsrc, guint ysrc, - guint xdest, guint ydest, - guint width, guint height); +//void Drawing_copy( Drawing_t *Drawing, +// guint xsrc, guint ysrc, +// guint xdest, guint ydest, +// guint width, guint height); -void Drawing_Resize(Drawing_t *Drawing, guint h, guint w); +//void Drawing_Resize(Drawing_t *Drawing, guint h, guint w); void convert_pixels_to_time( Drawing_t *Drawing, diff --git a/ltt/branches/poly/lttv/modules/guiControlFlow/Process_List.c b/ltt/branches/poly/lttv/modules/guiControlFlow/Process_List.c index 84c66eca..2e416d07 100644 --- a/ltt/branches/poly/lttv/modules/guiControlFlow/Process_List.c +++ b/ltt/branches/poly/lttv/modules/guiControlFlow/Process_List.c @@ -190,7 +190,7 @@ void send_test_data(ProcessList *Process_List) &birth, &height); - for(i=0; i<150; i++) + for(i=0; i<10; i++) { birth.tv_sec = i*12000; birth.tv_nsec = i*55700; diff --git a/ltt/branches/poly/lttv/modules/guiControlFlow/Widget_Callbacks.c b/ltt/branches/poly/lttv/modules/guiControlFlow/Widget_Callbacks.c deleted file mode 100644 index 11250b2e..00000000 --- a/ltt/branches/poly/lttv/modules/guiControlFlow/Widget_Callbacks.c +++ /dev/null @@ -1,51 +0,0 @@ -/***************************************************************************** - * Callbacks used for the viewer * - *****************************************************************************/ -void expose_event_cb (GtkWidget *widget, GdkEventExpose *expose, gpointer data) -{ - ControlFlowData *Control_Flow_Data = (ControlFlowData*)data; - - EventRequest *Event_Request = g_new(sizeof(EventRequest)); - - Event_Request->Control_Flow_Data = Control_Flow_Data; - - /* Calculate, from pixels in expose, the time interval to get data */ - - get_time_from_pixels(expose->area.x, expose->area.width, - Control_Flow_Data->Drawing_Area_Info.width, - &Control_Flow_Data->Begin_Time, &Control_Flow_Data->End_Time, - &Event_Request->time_begin, &Event_Request->time_end) - - /* Look in statistics of the trace the processes present during the - * whole time interval _shown on the screen_. Modify the list of - * processes to match it. NOTE : modify, not recreate. If recreation is - * needed,keep a pointer to the currently selected event in the list. - */ - - /* Call the reading API to have events sent to drawing hooks */ - lttv_trace_set_process( Control_Flow_Data->Trace_Set, - Draw_Before_Hooks, - Draw_Event_Hooks, - Draw_After_Hooks, - NULL, //FIXME : filter here - Event_Request->time_begin, - Event_Request->time_end); - -} - - -void v_scroll_cb (GtkAdjustment *adjustment, gpointer data) -{ - ControlFlowData *Control_Flow_Data = (ControlFlowData*)data; - GtkTreePath *Tree_Path; - - g_critical("DEBUG : scroll signal, value : %f", adjustment->value); - - //get_test_data((int)adjustment->value, Control_Flow_Data->Num_Visible_Events, - // Control_Flow_Data); - - - -} - - diff --git a/ltt/branches/poly/lttv/modules/guiControlFlow/Widget_Callbacks.c.old b/ltt/branches/poly/lttv/modules/guiControlFlow/Widget_Callbacks.c.old new file mode 100644 index 00000000..11250b2e --- /dev/null +++ b/ltt/branches/poly/lttv/modules/guiControlFlow/Widget_Callbacks.c.old @@ -0,0 +1,51 @@ +/***************************************************************************** + * Callbacks used for the viewer * + *****************************************************************************/ +void expose_event_cb (GtkWidget *widget, GdkEventExpose *expose, gpointer data) +{ + ControlFlowData *Control_Flow_Data = (ControlFlowData*)data; + + EventRequest *Event_Request = g_new(sizeof(EventRequest)); + + Event_Request->Control_Flow_Data = Control_Flow_Data; + + /* Calculate, from pixels in expose, the time interval to get data */ + + get_time_from_pixels(expose->area.x, expose->area.width, + Control_Flow_Data->Drawing_Area_Info.width, + &Control_Flow_Data->Begin_Time, &Control_Flow_Data->End_Time, + &Event_Request->time_begin, &Event_Request->time_end) + + /* Look in statistics of the trace the processes present during the + * whole time interval _shown on the screen_. Modify the list of + * processes to match it. NOTE : modify, not recreate. If recreation is + * needed,keep a pointer to the currently selected event in the list. + */ + + /* Call the reading API to have events sent to drawing hooks */ + lttv_trace_set_process( Control_Flow_Data->Trace_Set, + Draw_Before_Hooks, + Draw_Event_Hooks, + Draw_After_Hooks, + NULL, //FIXME : filter here + Event_Request->time_begin, + Event_Request->time_end); + +} + + +void v_scroll_cb (GtkAdjustment *adjustment, gpointer data) +{ + ControlFlowData *Control_Flow_Data = (ControlFlowData*)data; + GtkTreePath *Tree_Path; + + g_critical("DEBUG : scroll signal, value : %f", adjustment->value); + + //get_test_data((int)adjustment->value, Control_Flow_Data->Num_Visible_Events, + // Control_Flow_Data); + + + +} + + diff --git a/ltt/branches/poly/lttv/modules/guiControlFlow/guiControlFlow.c b/ltt/branches/poly/lttv/modules/guiControlFlow/guiControlFlow.c deleted file mode 100644 index 6bdb9531..00000000 --- a/ltt/branches/poly/lttv/modules/guiControlFlow/guiControlFlow.c +++ /dev/null @@ -1,99 +0,0 @@ -//FIXME by including ltt.h -#include -typedef time_t ltt_time; - -typedef struct _ltt_time_interval -{ - ltt_time time_begin, time_end; -} ltt_time_interval; - -// ??? - - - /* Setup the hooks */ - Draw_Before_Hooks = lttv_hooks_new(); - Draw_Event_Hooks = lttv_hooks_new(); - Draw_After_Hooks = lttv_hooks_new(); - - lttv_hooks_add(Draw_Before_Hooks, Draw_Before_Hook, NULL); - lttv_hooks_add(Draw_Event_Hooks, Draw_Event_Hook, NULL); - lttv_hooks_add(Draw_After_Hooks, Draw_After_Hook, NULL); - - /* Destroy the hooks */ - - lttv_hooks_destroy(Draw_Before_Hooks); - lttv_hooks_destroy(Draw_Event_Hooks); - lttv_hooks_destroy(Draw_After_Hooks); - - - - -/***************************************************************************** - * Definition of structures * - *****************************************************************************/ - -/* Structure used to store and use information relative to one events refresh - * request. Typically filled in by the expose event callback, then passed to the - * library call, then used by the drawing hooks. Then, once all the events are - * sent, it is freed by the hook called after the reading. - */ -typedef struct _EventRequest -{ - ControlFlowData *Control_Flow_Data; - ltt_time time_begin, time_end; - /* Fill the Events_Context during the initial expose, before calling for - * events. - */ - GArray Events_Context; //FIXME -} EventRequest ; - - - -/***************************************************************************** - * Function prototypes * - *****************************************************************************/ -//! Control Flow Viewer's constructor hook -GtkWidget *hGuiControlFlow(GtkWidget *pmParentWindow); -//! Control Flow Viewer's constructor -ControlFlowData *GuiControlFlow(void); -//! Control Flow Viewer's destructor -void GuiControlFlow_Destructor(ControlFlowData *Control_Flow_Data); - - -static int Event_Selected_Hook(void *hook_data, void *call_data); - -static lttv_hooks - *Draw_Before_Hooks, - *Draw_Event_Hooks, - *Draw_After_Hooks; - -Draw_Before_Hook(void *hook_data, void *call_data) -Draw_Event_Hook(void *hook_data, void *call_data) -Draw_After_Hook(void *hook_data, void *call_data) - - -//void Tree_V_set_cursor(ControlFlowData *Control_Flow_Data); -//void Tree_V_get_cursor(ControlFlowData *Control_Flow_Data); - -/* Prototype for selection handler callback */ -//static void tree_selection_changed_cb (GtkTreeSelection *selection, gpointer data); -static void v_scroll_cb (GtkAdjustment *adjustment, gpointer data); -//static void Tree_V_size_allocate_cb (GtkWidget *widget, GtkAllocation *alloc, gpointer data); -//static void Tree_V_size_request_cb (GtkWidget *widget, GtkRequisition *requisition, gpointer data); -//static void Tree_V_cursor_changed_cb (GtkWidget *widget, gpointer data); -//static void Tree_V_move_cursor_cb (GtkWidget *widget, GtkMovementStep arg1, gint arg2, gpointer data); - -static void expose_event_cb (GtkWidget *widget, GdkEventExpose *expose, gpointer data); - -void add_test_process(ControlFlowData *Control_Flow_Data); - -static void get_test_data(guint Event_Number, guint List_Height, - ControlFlowData *Control_Flow_Data); - -void add_test_data(ControlFlowData *Control_Flow_Data); -void test_draw(ControlFlowData *Control_Flow_Data); - -void Drawing_Area_Init(ControlFlowData *Control_Flow_Data); - - -/*\@}*/ diff --git a/ltt/branches/poly/lttv/modules/guiControlFlow/guiControlFlow.c.old b/ltt/branches/poly/lttv/modules/guiControlFlow/guiControlFlow.c.old new file mode 100644 index 00000000..6bdb9531 --- /dev/null +++ b/ltt/branches/poly/lttv/modules/guiControlFlow/guiControlFlow.c.old @@ -0,0 +1,99 @@ +//FIXME by including ltt.h +#include +typedef time_t ltt_time; + +typedef struct _ltt_time_interval +{ + ltt_time time_begin, time_end; +} ltt_time_interval; + +// ??? + + + /* Setup the hooks */ + Draw_Before_Hooks = lttv_hooks_new(); + Draw_Event_Hooks = lttv_hooks_new(); + Draw_After_Hooks = lttv_hooks_new(); + + lttv_hooks_add(Draw_Before_Hooks, Draw_Before_Hook, NULL); + lttv_hooks_add(Draw_Event_Hooks, Draw_Event_Hook, NULL); + lttv_hooks_add(Draw_After_Hooks, Draw_After_Hook, NULL); + + /* Destroy the hooks */ + + lttv_hooks_destroy(Draw_Before_Hooks); + lttv_hooks_destroy(Draw_Event_Hooks); + lttv_hooks_destroy(Draw_After_Hooks); + + + + +/***************************************************************************** + * Definition of structures * + *****************************************************************************/ + +/* Structure used to store and use information relative to one events refresh + * request. Typically filled in by the expose event callback, then passed to the + * library call, then used by the drawing hooks. Then, once all the events are + * sent, it is freed by the hook called after the reading. + */ +typedef struct _EventRequest +{ + ControlFlowData *Control_Flow_Data; + ltt_time time_begin, time_end; + /* Fill the Events_Context during the initial expose, before calling for + * events. + */ + GArray Events_Context; //FIXME +} EventRequest ; + + + +/***************************************************************************** + * Function prototypes * + *****************************************************************************/ +//! Control Flow Viewer's constructor hook +GtkWidget *hGuiControlFlow(GtkWidget *pmParentWindow); +//! Control Flow Viewer's constructor +ControlFlowData *GuiControlFlow(void); +//! Control Flow Viewer's destructor +void GuiControlFlow_Destructor(ControlFlowData *Control_Flow_Data); + + +static int Event_Selected_Hook(void *hook_data, void *call_data); + +static lttv_hooks + *Draw_Before_Hooks, + *Draw_Event_Hooks, + *Draw_After_Hooks; + +Draw_Before_Hook(void *hook_data, void *call_data) +Draw_Event_Hook(void *hook_data, void *call_data) +Draw_After_Hook(void *hook_data, void *call_data) + + +//void Tree_V_set_cursor(ControlFlowData *Control_Flow_Data); +//void Tree_V_get_cursor(ControlFlowData *Control_Flow_Data); + +/* Prototype for selection handler callback */ +//static void tree_selection_changed_cb (GtkTreeSelection *selection, gpointer data); +static void v_scroll_cb (GtkAdjustment *adjustment, gpointer data); +//static void Tree_V_size_allocate_cb (GtkWidget *widget, GtkAllocation *alloc, gpointer data); +//static void Tree_V_size_request_cb (GtkWidget *widget, GtkRequisition *requisition, gpointer data); +//static void Tree_V_cursor_changed_cb (GtkWidget *widget, gpointer data); +//static void Tree_V_move_cursor_cb (GtkWidget *widget, GtkMovementStep arg1, gint arg2, gpointer data); + +static void expose_event_cb (GtkWidget *widget, GdkEventExpose *expose, gpointer data); + +void add_test_process(ControlFlowData *Control_Flow_Data); + +static void get_test_data(guint Event_Number, guint List_Height, + ControlFlowData *Control_Flow_Data); + +void add_test_data(ControlFlowData *Control_Flow_Data); +void test_draw(ControlFlowData *Control_Flow_Data); + +void Drawing_Area_Init(ControlFlowData *Control_Flow_Data); + + +/*\@}*/