};
+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;
}
}
+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)
}
+
+
* 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).
*/
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,
&birth,
&height);
- for(i=0; i<150; i++)
+ for(i=0; i<10; i++)
{
birth.tv_sec = i*12000;
birth.tv_nsec = i*55700;
+++ /dev/null
-/*****************************************************************************
- * 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);
-
-
-
-}
-
-
--- /dev/null
+/*****************************************************************************
+ * 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);
+
+
+
+}
+
+
+++ /dev/null
-//FIXME by including ltt.h
-#include <time.h>
-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);
-
-
-/*\@}*/
--- /dev/null
+//FIXME by including ltt.h
+#include <time.h>
+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);
+
+
+/*\@}*/