1 //*! \defgroup GuiEvents libGuiEvents: The GUI Events display plugin */
5 * \brief Graphical plugin for showing events.
7 * This plugin lists all the events contained in the current time interval
10 * This plugin adds a Events Viewer functionnality to Linux TraceToolkit
11 * GUI when this plugin is loaded. The init and destroy functions add the
12 * viewer's insertion menu item and toolbar icon by calling gtkTraceSet's
13 * API functions. Then, when a viewer's object is created, the constructor
14 * creates ans register through API functions what is needed to interact
15 * with the TraceSet window.
24 * Author : Karim Yaghmour
25 * Integrated to LTTng by Mathieu Desnoyers, June 2003
33 #include <lttv/module.h>
34 //#include <lttv/gtkTraceSet.h>
37 #include "icons/hGuiEventsInsert.xpm"
39 /** Array containing instanced objects. Used when module is unloaded */
40 static GSList
*sEvent_Viewer_Data_List
= NULL
;
42 typedef struct _EventViewerData
{
44 /* Model containing list data */
45 GtkListStore
*Store_M
;
48 /* Widget to display the data in a columned list */
50 GtkAdjustment
*VTree_Adjust_C
;
51 GdkWindow
*TreeWindow
;
53 /* Vertical scrollbar and it's adjustment */
54 GtkWidget
*VScroll_VC
;
55 GtkAdjustment
*VAdjust_C
;
57 /* Selection handler */
58 GtkTreeSelection
*Select_C
;
64 //! Event Viewer's constructor hook
65 GtkWidget
*hGuiEvents(GtkWidget
*pmParentWindow
);
66 //! Event Viewer's constructor
67 EventViewerData
*GuiEvents(void);
68 //! Event Viewer's destructor
69 void GuiEvents_Destructor(EventViewerData
*Event_Viewer_Data
);
71 /* Prototype for selection handler callback */
72 static void tree_selection_changed_cb (GtkTreeSelection
*selection
, gpointer data
);
73 static void v_scroll_cb (GtkAdjustment
*adjustment
, gpointer data
);
74 static void Tree_V_size_allocate_cb (GtkWidget
*widget
, GtkAllocation
*alloc
, gpointer data
);
75 static void Tree_V_size_request_cb (GtkWidget
*widget
, GtkRequisition
*requisition
, gpointer data
);
78 void add_test_data(EventViewerData
*Event_Viewer_Data
);
80 /* TEST DATA, TO BE READ FROM THE TRACE */
81 static int Number_Of_Events
= 1000;
83 //FIXME: use the size of the widget to get number of rows.
84 static int Number_Of_Rows
= 50 ;
86 static int Cell_Height
= 52;
89 * plugin's init function
91 * This function initializes the Event Viewer functionnality through the
94 G_MODULE_EXPORT
void init() {
95 g_critical("GUI Event Viewer init()");
97 /* Register the toolbar insert button */
98 //ToolbarItemReg(hGuiEventsInsert_xpm, "Insert Event Viewer", hGuiEvents);
100 /* Register the menu item insert entry */
101 //MenuItemReg("/", "Insert Event Viewer", hGuiEvents);
104 void destroy_walk(gpointer data
, gpointer user_data
)
106 GuiEvents_Destructor((EventViewerData
*)data
);
110 * plugin's destroy function
112 * This function releases the memory reserved by the module and unregisters
113 * everything that has been registered in the gtkTraceSet API.
115 G_MODULE_EXPORT
void destroy() {
118 EventViewerData
*Event_Viewer_Data
;
120 g_critical("GUI Event Viewer destroy()");
122 g_slist_foreach(sEvent_Viewer_Data_List
, destroy_walk
, NULL
);
124 /* Unregister the toolbar insert button */
125 //ToolbarItemUnreg(hGuiEvents);
127 /* Unregister the menu item insert entry */
128 //MenuItemUnreg(hGuiEvents);
131 /* Enumeration of the columns */
145 * Event Viewer's constructor hook
147 * This constructor is given as a parameter to the menuitem and toolbar button
148 * registration. It creates the list.
149 * @param pmParentWindow A pointer to the parent window.
150 * @return The widget created.
153 hGuiEvents(GtkWidget
*pmParentWindow
)
155 EventViewerData
* Event_Viewer_Data
= GuiEvents() ;
157 return Event_Viewer_Data
->HBox_V
;
162 * Event Viewer's constructor
164 * This constructor is used to create EventViewerData data structure.
165 * @return The Event viewer data created.
170 GtkTreeViewColumn
*column
;
171 GtkCellRenderer
*renderer
;
172 EventViewerData
* Event_Viewer_Data
= g_new(EventViewerData
,1) ;
174 /* Create a model for storing the data list */
175 Event_Viewer_Data
->Store_M
= gtk_list_store_new (N_COLUMNS
, /* Total number of columns */
176 G_TYPE_INT
, /* CPUID */
177 G_TYPE_STRING
, /* Event */
178 G_TYPE_INT
, /* Time */
179 G_TYPE_INT
, /* PID */
180 G_TYPE_INT
, /* Entry length */
181 G_TYPE_STRING
); /* Event's description */
183 /* Create the viewer widget for the columned list */
184 Event_Viewer_Data
->Tree_V
= gtk_tree_view_new_with_model (GTK_TREE_MODEL (Event_Viewer_Data
->Store_M
));
186 g_signal_connect (G_OBJECT (Event_Viewer_Data
->Tree_V
), "size-allocate",
187 G_CALLBACK (Tree_V_size_allocate_cb
),
189 g_signal_connect (G_OBJECT (Event_Viewer_Data
->Tree_V
), "size-request",
190 G_CALLBACK (Tree_V_size_request_cb
),
194 // Use on each column!
195 //gtk_tree_view_column_set_sizing(Event_Viewer_Data->Tree_V, GTK_TREE_VIEW_COLUMN_FIXED);
197 /* The view now holds a reference. We can get rid of our own
199 g_object_unref (G_OBJECT (Event_Viewer_Data
->Store_M
));
202 /* Create a column, associating the "text" attribute of the
203 * cell_renderer to the first column of the model */
204 /* Columns alignment : 0.0 : Left 0.5 : Center 1.0 : Right */
205 renderer
= gtk_cell_renderer_text_new ();
206 column
= gtk_tree_view_column_new_with_attributes ("CPUID",
208 "text", CPUID_COLUMN
,
210 gtk_tree_view_column_set_alignment (column
, 0.0);
211 gtk_tree_view_column_set_fixed_width (column
, 45);
212 gtk_tree_view_append_column (GTK_TREE_VIEW (Event_Viewer_Data
->Tree_V
), column
);
214 renderer
= gtk_cell_renderer_text_new ();
215 column
= gtk_tree_view_column_new_with_attributes ("Event",
217 "text", EVENT_COLUMN
,
219 gtk_tree_view_column_set_alignment (column
, 0.0);
220 gtk_tree_view_column_set_fixed_width (column
, 120);
221 gtk_tree_view_append_column (GTK_TREE_VIEW (Event_Viewer_Data
->Tree_V
), column
);
223 renderer
= gtk_cell_renderer_text_new ();
224 column
= gtk_tree_view_column_new_with_attributes ("Time",
228 gtk_tree_view_column_set_alignment (column
, 1.0);
229 gtk_tree_view_column_set_fixed_width (column
, 120);
230 gtk_tree_view_append_column (GTK_TREE_VIEW (Event_Viewer_Data
->Tree_V
), column
);
232 renderer
= gtk_cell_renderer_text_new ();
233 column
= gtk_tree_view_column_new_with_attributes ("PID",
237 gtk_tree_view_column_set_alignment (column
, 1.0);
238 gtk_tree_view_column_set_fixed_width (column
, 45);
239 gtk_tree_view_append_column (GTK_TREE_VIEW (Event_Viewer_Data
->Tree_V
), column
);
241 renderer
= gtk_cell_renderer_text_new ();
242 column
= gtk_tree_view_column_new_with_attributes ("Entry Length",
244 "text", ENTRY_LEN_COLUMN
,
246 gtk_tree_view_column_set_alignment (column
, 1.0);
247 gtk_tree_view_column_set_fixed_width (column
, 60);
248 gtk_tree_view_append_column (GTK_TREE_VIEW (Event_Viewer_Data
->Tree_V
), column
);
250 renderer
= gtk_cell_renderer_text_new ();
251 column
= gtk_tree_view_column_new_with_attributes ("Event's Description",
253 "text", EVENT_DESCR_COLUMN
,
255 gtk_tree_view_column_set_alignment (column
, 0.0);
256 gtk_tree_view_append_column (GTK_TREE_VIEW (Event_Viewer_Data
->Tree_V
), column
);
259 gtk_cell_renderer_get_size(renderer
, GTK_WIDGET(Event_Viewer_Data
->Tree_V
), NULL
, NULL
, NULL
, &width
, &height
);
260 g_critical("first size h : %i",height
);
261 /* Setup the selection handler */
262 Event_Viewer_Data
->Select_C
= gtk_tree_view_get_selection (GTK_TREE_VIEW (Event_Viewer_Data
->Tree_V
));
263 gtk_tree_selection_set_mode (Event_Viewer_Data
->Select_C
, GTK_SELECTION_SINGLE
);
264 g_signal_connect (G_OBJECT (Event_Viewer_Data
->Select_C
), "changed",
265 G_CALLBACK (tree_selection_changed_cb
),
268 Event_Viewer_Data
->HBox_V
= gtk_hbox_new(0, 0);
269 gtk_box_pack_start(GTK_BOX(Event_Viewer_Data
->HBox_V
), Event_Viewer_Data
->Tree_V
, TRUE
, TRUE
, 0);
271 /* Create vertical scrollbar and pack it */
272 Event_Viewer_Data
->VScroll_VC
= gtk_vscrollbar_new(NULL
);
273 gtk_box_pack_start(GTK_BOX(Event_Viewer_Data
->HBox_V
), Event_Viewer_Data
->VScroll_VC
, FALSE
, TRUE
, 0);
275 /* Get the vertical scrollbar's adjustment */
276 Event_Viewer_Data
->VAdjust_C
= gtk_range_get_adjustment(GTK_RANGE(Event_Viewer_Data
->VScroll_VC
));
277 Event_Viewer_Data
->VTree_Adjust_C
= gtk_tree_view_get_vadjustment(
278 GTK_TREE_VIEW (Event_Viewer_Data
->Tree_V
));
280 g_signal_connect (G_OBJECT (Event_Viewer_Data
->VAdjust_C
), "value-changed",
281 G_CALLBACK (v_scroll_cb
),
283 /* Set the upper bound to the last event number */
284 Event_Viewer_Data
->VAdjust_C
->lower
= 0;
285 Event_Viewer_Data
->VAdjust_C
->upper
= Number_Of_Events
;
286 Event_Viewer_Data
->VAdjust_C
->value
= 0;
287 Event_Viewer_Data
->VAdjust_C
->step_increment
= 1;
288 Event_Viewer_Data
->VAdjust_C
->page_increment
=
289 Event_Viewer_Data
->VTree_Adjust_C
->upper
;
290 //FIXME change page size dynamically to fit event list size
291 Event_Viewer_Data
->VAdjust_C
->page_size
=
292 Event_Viewer_Data
->VTree_Adjust_C
->upper
;
293 g_critical("value : %u",Event_Viewer_Data
->VTree_Adjust_C
->upper
);
294 /* Raw event trace */
295 gtk_widget_show(Event_Viewer_Data
->HBox_V
);
296 gtk_widget_show(Event_Viewer_Data
->Tree_V
);
297 gtk_widget_show(Event_Viewer_Data
->VScroll_VC
);
299 /* Add the object's information to the module's array */
300 g_slist_append(sEvent_Viewer_Data_List
, Event_Viewer_Data
);
303 add_test_data(Event_Viewer_Data
);
305 return Event_Viewer_Data
;
308 void v_scroll_cb (GtkAdjustment
*adjustment
, gpointer data
)
310 g_critical("DEBUG : scroll signal");
314 void Tree_V_size_allocate_cb (GtkWidget
*widget
, GtkAllocation
*alloc
, gpointer data
)
316 EventViewerData
*Event_Viewer_Data
= (EventViewerData
*)data
;
318 g_critical("size-allocate");
320 Event_Viewer_Data
->Visible_Events
= alloc
->y
;
321 g_critical("num of event shown : %u",Event_Viewer_Data
->Visible_Events
);
326 void Tree_V_size_request_cb (GtkWidget
*widget
, GtkRequisition
*requisition
, gpointer data
)
331 EventViewerData
*Event_Viewer_Data
= (EventViewerData
*)data
;
332 GtkTreeViewColumn
*Column
= gtk_tree_view_get_column(GTK_TREE_VIEW(Event_Viewer_Data
->Tree_V
), 1);
333 GList
*Render_List
= gtk_tree_view_column_get_cell_renderers(Column
);
334 GtkCellRenderer
*Renderer
= g_list_first(Render_List
)->data
;
336 g_critical("size-request");
338 //gtk_tree_view_column_cell_get_size(Column, NULL, NULL, NULL, &width, &height);
340 //gtk_cell_renderer_get_size(Renderer, GTK_WIDGET(Event_Viewer_Data->Tree_V), NULL, NULL, NULL, &width, &height);
342 //gtk_cell_renderer_get_fixed_size(Renderer,w,h);
344 gtk_tree_view_tree_to_widget_coords(GTK_TREE_VIEW(Event_Viewer_Data
->Tree_V
),
345 1,1,&width
, &height
);
348 //requisition->height = Cell_Height;
349 requisition
->height
= 46;
350 g_critical("width : %i height : %i", w
, h
);
356 void add_test_data(EventViewerData
*Event_Viewer_Data
)
363 /* Add a new row to the model */
364 gtk_list_store_append (Event_Viewer_Data
->Store_M
, &iter
);
365 gtk_list_store_set (Event_Viewer_Data
->Store_M
, &iter
,
367 EVENT_COLUMN
, "event irq",
370 ENTRY_LEN_COLUMN
, 17,
371 EVENT_DESCR_COLUMN
, "Detailed information",
379 GuiEvents_Destructor(EventViewerData
*Event_Viewer_Data
)
383 /* May already been done by GTK window closing */
384 if(GTK_IS_WIDGET(Event_Viewer_Data
->HBox_V
))
385 gtk_widget_destroy(Event_Viewer_Data
->HBox_V
);
387 /* Destroy the Tree View */
388 //gtk_widget_destroy(Event_Viewer_Data->Tree_V);
390 /* Clear raw event list */
391 //gtk_list_store_clear(Event_Viewer_Data->Store_M);
392 //gtk_widget_destroy(GTK_WIDGET(Event_Viewer_Data->Store_M));
394 g_slist_remove(sEvent_Viewer_Data_List
,Event_Viewer_Data
);
397 //FIXME : call hGuiEvents_Destructor for corresponding data upon widget destroy
400 tree_selection_changed_cb (GtkTreeSelection
*selection
, gpointer data
)
406 if (gtk_tree_selection_get_selected (selection
, &model
, &iter
))
408 gtk_tree_model_get (model
, &iter
, EVENT_COLUMN
, &Event
, -1);
410 g_print ("Event selected : %s\n", Event
);
419 /* Imported code from LTT 0.9.6pre2 tracevisualizer */
422 /******************************************************************
424 * WDI_gtk_clist_set_last_row_data_full()
426 * Appends data to the last row of a GtkClist.
431 * J.H.D., 27/08/99, Initial typing.
433 * Based on gtk_clist_set_row_data_full() version 1.2.3.
434 * Much faster than using gtk_clist_set_row_data_full().
435 ******************************************************************/
436 static void WDI_gtk_clist_set_last_row_data_full(GtkCList
* pmClist
,
438 GtkDestroyNotify pmDestroy
)
440 GtkCListRow
*pClistRow
;
442 g_return_if_fail (pmClist
!= NULL
);
443 g_return_if_fail (GTK_IS_CLIST (pmClist
));
444 g_return_if_fail (pmClist
->row_list_end
!= NULL
);
446 pClistRow
= pmClist
->row_list_end
->data
;
447 pClistRow
->data
= pmData
;
448 pClistRow
->destroy
= pmDestroy
;
452 /******************************************************************
460 ******************************************************************/
461 static void SHRTEventSelect(GtkWidget
* pmCList
,
464 GdkEventButton
* pmEvent
,
467 systemView
* pSysView
; /* The system being displayed */
469 /* Do we have anything meaningfull */
470 if((pSysView
= (systemView
*) pmData
) == NULL
)
473 /* Store the selected event */
474 pSysView
->Window
->LastSelectedEvent
= *(event
*) gtk_clist_get_row_data(GTK_CLIST(pmCList
), pmRow
);
475 pSysView
->Window
->EventSelected
= TRUE
;
478 /******************************************************************
480 * SHRTEventButtonPress()
486 ******************************************************************/
487 static void SHRTEventButtonPress(GtkWidget
* pmCList
,
488 GdkEventButton
* pmEvent
,
491 systemView
* pSysView
; /* The system being displayed */
492 gint row
, column
; /* The clicked row and column */
494 /* Do we have anything meaningfull */
495 if((pSysView
= (systemView
*) pmData
) == NULL
)
498 /* if we have a right-click event */
499 if(pmEvent
->button
== 3)
500 /* If we clicked on an item, get its row and column values */
501 if(gtk_clist_get_selection_info(GTK_CLIST(pmCList
), pmEvent
->x
, pmEvent
->y
, &row
, &column
))
503 /* Highlight the selected row */
504 gtk_clist_select_row(GTK_CLIST(pmCList
), row
, column
);
506 /* Store the selected event */
507 pSysView
->Window
->LastSelectedEvent
= *(event
*) gtk_clist_get_row_data(GTK_CLIST(pmCList
), row
);
508 pSysView
->Window
->EventSelected
= TRUE
;
510 /* Display the popup menu */
511 gtk_menu_popup(GTK_MENU(pSysView
->Window
->RawEventPopup
),
512 NULL
, NULL
, NULL
, NULL
,
513 pmEvent
->button
, GDK_CURRENT_TIME
);
518 /******************************************************************
520 * SHRTVAdjustValueChanged()
526 ******************************************************************/
527 static void SHRTVAdjustValueChanged(GtkAdjustment
* pmVAdjust
,
530 event lEvent
; /* Event used for searching */
531 guint32 lPosition
; /* The position to scroll to */
532 systemView
* pSysView
; /* The system being displayed */
534 /* Do we have anything meaningfull */
535 if((pSysView
= (systemView
*) pmData
) == NULL
)
538 /* Is there an event database? */
539 if(pSysView
->EventDB
== NULL
)
542 /* Set the pointer to the first event */
543 if(pSysView
->EventDB
->TraceStart
== NULL
)
546 /* Are we closer to the beginning? */
547 if((pmVAdjust
->value
- (pmVAdjust
->upper
/ 2)) < 0)
549 /* Set the navigation pointer to the beginning of the list */
550 lEvent
= pSysView
->EventDB
->FirstEvent
;
552 /* Calculate distance from beginning */
553 lPosition
= (guint32
) pmVAdjust
->value
;
555 /* Find the event in the event database */
559 if(DBEventNext(pSysView
->EventDB
, &lEvent
) != TRUE
)
565 /* Set the navigation pointer to the end of the list */
566 lEvent
= pSysView
->EventDB
->LastEvent
;
568 /* Calculate distance from end */
569 lPosition
= (guint32
) (pmVAdjust
->upper
- pmVAdjust
->value
);
571 /* Find the event in the event database */
575 if(DBEventPrev(pSysView
->EventDB
, &lEvent
) != TRUE
)
580 /* Fill the event list according to what was found */
581 WDFillEventList(pSysView
->Window
->RTCList
,
585 &(pSysView
->Window
->LastSelectedEvent
));
590 /******************************************************************
594 * Attaches signal handlers to the window items.
596 * pmSysView, System view for which signals have to be connected
601 * This function attaches a pointer to the main window during
602 * the connect. This means that the handlers will get a pointer
603 * to the window in the data argument.
604 ******************************************************************/
605 static void WDConnectSignals(systemView
* pmSysView
)
607 /* Raw event Popup menu */
608 gtk_signal_connect(GTK_OBJECT(pmSysView
->Window
->RawGotoProcess
),
610 GTK_SIGNAL_FUNC(SHGotoProcAnalysis
),
612 gtk_signal_connect(GTK_OBJECT(pmSysView
->Window
->RawViewEvent
),
614 GTK_SIGNAL_FUNC(SHViewEventInEG
),
617 /* Set event list callbacks */
618 gtk_signal_connect(GTK_OBJECT(pmSysView
->Window
->RTCList
),
620 GTK_SIGNAL_FUNC(SHRTEventSelect
),
622 gtk_signal_connect(GTK_OBJECT(pmSysView
->Window
->RTCList
),
623 "button-press-event",
624 GTK_SIGNAL_FUNC(SHRTEventButtonPress
),
626 gtk_signal_connect(GTK_OBJECT(pmSysView
->Window
->RTVAdjust
),
628 GTK_SIGNAL_FUNC(SHRTVAdjustValueChanged
),
635 /******************************************************************
639 * Fills the window's event list using the trace database.
641 * pmList, The list to be filled.
642 * pmTraceDB, The database of events.
643 * pmSystem, The system to which this list belongs.
644 * pmEvent, Event from which we start drawing.
645 * pmSelectedEvent, Event selected if any.
649 * K.Y., 18/06/99, Initial typing.
651 ******************************************************************/
652 static void WDFillEventList(GtkWidget
* pmList
,
654 systemInfo
* pmSystem
,
656 event
* pmSelectedEvent
)
658 gint i
= 0; /* Generic index */
659 event lEvent
; /* Generic event */
660 gchar lTimeStr
[TIME_STR_LEN
]; /* Time of event */
661 static gchar
* lString
[RTCLIST_NB_COLUMNS
]={'\0'}; /* Strings describing event */
662 process
* pProcess
; /* Generic process pointer */
664 RTAItask
* pTask
= NULL
; /* Generic task pointer */
665 #endif /* SUPP_RTAI */
666 eventDescription lEventDesc
; /* Description of event */
668 /* Did we allocate space for strings */
669 if(lString
[0] == NULL
)
670 /* Allocate space for strings */
671 for (i
= 0; i
< RTCLIST_NB_COLUMNS
- 1; i
++)
672 lString
[i
] = (char*) g_malloc(MW_DEFAULT_STRLEN
);
674 /* Allocate space for description string */
675 lString
[RTCLIST_NB_COLUMNS
- 1] = (char*) g_malloc(MW_LONG_STRLEN
);
677 /* If no event was supplied, start at the beginning */
679 lEvent
= pmTraceDB
->FirstEvent
;
683 /* Freeze and clear clist */
684 gtk_clist_freeze(GTK_CLIST(pmList
));
685 gtk_clist_clear(GTK_CLIST(pmList
));
690 /* Go through the event list */
693 /* Get the event description */
694 DBEventDescription(pmTraceDB
, &lEvent
, TRUE
, &lEventDesc
);
696 /* Get the event's process */
697 pProcess
= DBEventProcess(pmTraceDB
, &lEvent
, pmSystem
, FALSE
);
700 /* Does this trace contain RTAI information */
701 if(pmTraceDB
->SystemType
== TRACE_SYS_TYPE_RTAI_LINUX
)
702 /* Get the RTAI task to which this event belongs */
703 pTask
= RTAIDBEventTask(pmTraceDB
, &lEvent
, pmSystem
, FALSE
);
704 #endif /* SUPP_RTAI */
706 /* Set the event's entry in the list of raw events displayed */
707 sRawEventsDisplayed
[i
] = lEvent
;
709 /* Add text describing the event */
711 if(pmTraceDB
->LogCPUID
== TRUE
)
712 snprintf(lString
[0], MW_DEFAULT_STRLEN
, "%d", lEventDesc
.CPUID
);
714 snprintf(lString
[0], MW_DEFAULT_STRLEN
, "0");
717 snprintf(lString
[1], MW_DEFAULT_STRLEN
, "%s", pmTraceDB
->EventString(pmTraceDB
, lEventDesc
.ID
, &lEvent
));
719 /* The event's time of occurence */
720 DBFormatTimeInReadableString(lTimeStr
,
721 lEventDesc
.Time
.tv_sec
,
722 lEventDesc
.Time
.tv_usec
);
723 snprintf(lString
[2], MW_DEFAULT_STRLEN
, "%s", lTimeStr
);
725 /* Is this an RT event */
726 if(lEventDesc
.ID
<= TRACE_MAX
)
728 /* The PID of the process to which the event belongs */
730 snprintf(lString
[3], MW_DEFAULT_STRLEN
, "%d", pProcess
->PID
);
732 snprintf(lString
[3], MW_DEFAULT_STRLEN
, "N/A");
737 /* The TID of the task to which the event belongs */
739 snprintf(lString
[3], MW_DEFAULT_STRLEN
, "RT:%d", pTask
->TID
);
741 snprintf(lString
[3], MW_DEFAULT_STRLEN
, "RT:N/A");
743 #endif /* SUPP_RTAI */
745 /* The size of the entry */
746 snprintf(lString
[4], MW_DEFAULT_STRLEN
, "%d", lEventDesc
.Size
);
748 /* The string describing the event */
749 snprintf(lString
[5], MW_LONG_STRLEN
, "%s", lEventDesc
.String
);
751 /* Insert the entry into the list */
752 gtk_clist_append(GTK_CLIST(pmList
), lString
);
754 /* Set the row's data to point to the current event */
755 WDI_gtk_clist_set_last_row_data_full(GTK_CLIST(pmList
), (gpointer
) &(sRawEventsDisplayed
[i
]), NULL
);
757 /* Was this the last selected event */
758 if(DBEventsEqual(lEvent
, (*pmSelectedEvent
)))
759 gtk_clist_select_row(GTK_CLIST(pmList
), i
, 0);
763 } while((DBEventNext(pmTraceDB
, &lEvent
) == TRUE
) && (i
< RTCLIST_NB_ROWS
));
765 /* Resize the list's length */
766 gtk_widget_queue_resize(pmList
);
769 gtk_clist_thaw(GTK_CLIST(pmList
));
774 static void destroy_cb( GtkWidget
*widget
,
782 int main(int argc
, char **argv
)
785 GtkWidget
*ListViewer
;
787 EventViewerData
*Event_Viewer_Data
;
789 /* Initialize i18n support */
792 /* Initialize the widget set */
793 gtk_init (&argc
, &argv
);
797 Window
= gtk_window_new (GTK_WINDOW_TOPLEVEL
);
798 gtk_window_set_title (GTK_WINDOW (Window
), ("Test Window"));
800 g_signal_connect (G_OBJECT (Window
), "destroy",
801 G_CALLBACK (destroy_cb
), NULL
);
804 VBox_V
= gtk_vbox_new(0, 0);
805 gtk_container_add (GTK_CONTAINER (Window
), VBox_V
);
807 ListViewer
= hGuiEvents(Window
);
808 gtk_box_pack_start(GTK_BOX(VBox_V
), ListViewer
, TRUE
, TRUE
, 0);
810 ListViewer
= hGuiEvents(Window
);
811 gtk_box_pack_start(GTK_BOX(VBox_V
), ListViewer
, FALSE
, TRUE
, 0);
813 gtk_widget_show (VBox_V
);
814 gtk_widget_show (Window
);
818 g_critical("main loop finished");
820 //hGuiEvents_Destructor(ListViewer);
822 //g_critical("GuiEvents Destructor finished");