detailed event list partially works
[lttv.git] / ltt / branches / poly / lttv / modules / gui / detailedevents / events.c
CommitLineData
ce0214a6 1/* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2003-2004 Mathieu Desnoyers and XangXiu Yang
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
16 * MA 02111-1307, USA.
17 */
18
19
fbbb2697 20//*! \defgroup GuiEvents libGuiEvents: The GUI Events display plugin */
5c7463ed 21/*\@{*/
22
fbbb2697 23/*! \file GuiEvents.c
5c7463ed 24 * \brief Graphical plugin for showing events.
25 *
17abcce3 26 * This plugin lists all the events contained in the current time interval
27 * in a list.
28 *
5c7463ed 29 * This plugin adds a Events Viewer functionnality to Linux TraceToolkit
30 * GUI when this plugin is loaded. The init and destroy functions add the
5ac76b22 31 * viewer's insertion menu item and toolbar icon by calling viewer.h's
5c7463ed 32 * API functions. Then, when a viewer's object is created, the constructor
33 * creates ans register through API functions what is needed to interact
b72d54c9 34 * with the lttvwindow.
5c7463ed 35 *
8a949012 36 * Authors : Mathieu Desnoyers and XangXiu Yang, June to December 2003
37 * Inspired from original LTT, made by Karim Yaghmour
5c7463ed 38 */
39
4e4d11b3 40#ifdef HAVE_CONFIG_H
41#include <config.h>
42#endif
43
b26121f4 44#include <math.h>
45
5c7463ed 46#include <glib.h>
fbbb2697 47#include <gtk/gtk.h>
48#include <gdk/gdk.h>
eb6b1024 49#include <string.h>
5c7463ed 50
675f8f58 51#include <ltt/ltt.h>
52#include <ltt/event.h>
53#include <ltt/type.h>
54#include <ltt/trace.h>
ed3b99b6 55#include <ltt/facility.h>
8ce1db6f 56#include <lttv/module.h>
57#include <lttv/hook.h>
58#include <lttv/tracecontext.h>
59#include <lttv/state.h>
852f16bb 60#include <lttv/filter.h>
5290ec02 61#include <lttv/print.h>
8ce1db6f 62#include <lttvwindow/lttvwindow.h>
5c7463ed 63
0c56e138 64#include "hGuiEventsInsert.xpm"
5c7463ed 65
b72d54c9 66#define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format)
5290ec02 67
68#ifndef g_debug
b72d54c9 69#define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format)
5290ec02 70#endif
71
72#define abs(a) (((a)<0)?(-a):(a))
e921c965 73
675f8f58 74
fcdf0ec2 75/** Array containing instanced objects. Used when module is unloaded */
cc41a00f 76static GSList *g_event_viewer_data_list = NULL ;
fbbb2697 77
a60b01ef 78typedef enum _ScrollDirection{
b671bb09 79 SCROLL_STEP_UP,
80 SCROLL_STEP_DOWN,
81 SCROLL_PAGE_UP,
82 SCROLL_PAGE_DOWN,
83 SCROLL_JUMP,
84 SCROLL_NONE
a60b01ef 85} ScrollDirection;
86
fbbb2697 87typedef struct _EventViewerData {
88
8ce1db6f 89 Tab * tab;
8ce1db6f 90 LttvHooks * event_hooks;
675f8f58 91
b72d54c9 92 /* previous value is used to determine if it is a page up/down or
93 * step up/down, in which case we move of a certain amount of events (one or
94 * the number of events shown on the screen) instead of changing begin time.
95 */
96 double previous_value;
a8c0f09d 97
8b9fdc80 98 //scroll window containing Tree View
cc41a00f 99 GtkWidget * scroll_win;
8b9fdc80 100
675f8f58 101 /* Model containing list data */
cc41a00f 102 GtkListStore *store_m;
5290ec02 103
104 GPtrArray *pos; /* Array of LttvTracesetContextPosition * */
675f8f58 105
cc41a00f 106 GtkWidget *hbox_v;
675f8f58 107 /* Widget to display the data in a columned list */
cc41a00f 108 GtkWidget *tree_v;
109 GtkAdjustment *vtree_adjust_c ;
b72d54c9 110 GtkWidget *button; /* a button of the header, used to get the header_height */
8ce1db6f 111 gint header_height;
675f8f58 112
b72d54c9 113 /* Vertical scrollbar and its adjustment */
cc41a00f 114 GtkWidget *vscroll_vc;
b72d54c9 115 GtkAdjustment *vadjust_c;
8a949012 116
675f8f58 117 /* Selection handler */
cc41a00f 118 GtkTreeSelection *select_c;
675f8f58 119
eb6b1024 120 gint num_visible_events;
675f8f58 121
eb6b1024 122 gint currently_selected_event;
682c6edb 123
fbbb2697 124} EventViewerData ;
125
a8c0f09d 126/** hook functions for update time interval, current time ... */
a8c0f09d 127gboolean update_current_time(void * hook_data, void * call_data);
8ce1db6f 128//gboolean show_event_detail(void * hook_data, void * call_data);
a8c0f09d 129gboolean traceset_changed(void * hook_data, void * call_data);
a8c0f09d 130
fbbb2697 131//! Event Viewer's constructor hook
d47b33d2 132GtkWidget *h_gui_events(Tab *tab);
5c7463ed 133//! Event Viewer's constructor
d47b33d2 134EventViewerData *gui_events(Tab *tab);
fbbb2697 135//! Event Viewer's destructor
cc41a00f 136void gui_events_destructor(EventViewerData *event_viewer_data);
137void gui_events_free(EventViewerData *event_viewer_data);
fbbb2697 138
8ce1db6f 139static gboolean
140header_size_allocate(GtkWidget *widget,
141 GtkAllocation *allocation,
142 gpointer user_data);
143
cc41a00f 144void tree_v_set_cursor(EventViewerData *event_viewer_data);
145void tree_v_get_cursor(EventViewerData *event_viewer_data);
682c6edb 146
fbbb2697 147/* Prototype for selection handler callback */
5290ec02 148static void tree_selection_changed_cb (GtkTreeSelection *selection,
149 gpointer data);
fbbb2697 150static void v_scroll_cb (GtkAdjustment *adjustment, gpointer data);
5290ec02 151static void tree_v_size_allocate_cb (GtkWidget *widget, GtkAllocation *alloc,
152 gpointer data);
153static void tree_v_size_request_cb (GtkWidget *widget,
154 GtkRequisition *requisition, gpointer data);
cc41a00f 155static void tree_v_cursor_changed_cb (GtkWidget *widget, gpointer data);
5290ec02 156static void tree_v_move_cursor_cb (GtkWidget *widget, GtkMovementStep arg1,
157 gint arg2, gpointer data);
fbbb2697 158
202f6c8f 159
5290ec02 160static void get_events(double time, EventViewerData *event_viewer_data);
b72d54c9 161
5290ec02 162int event_hook(void *hook_data, void *call_data);
675f8f58 163
fbbb2697 164/* Enumeration of the columns */
165enum
166{
5290ec02 167 TRACE_NAME_COLUMN,
168 TRACEFILE_NAME_COLUMN,
675f8f58 169 CPUID_COLUMN,
170 EVENT_COLUMN,
5290ec02 171 FACILITY_COLUMN,
172 TIME_S_COLUMN,
173 TIME_NS_COLUMN,
675f8f58 174 PID_COLUMN,
675f8f58 175 EVENT_DESCR_COLUMN,
5290ec02 176 POSITION_COLUMN,
675f8f58 177 N_COLUMNS
fbbb2697 178};
179
5c7463ed 180/**
fbbb2697 181 * Event Viewer's constructor hook
5c7463ed 182 *
183 * This constructor is given as a parameter to the menuitem and toolbar button
fbbb2697 184 * registration. It creates the list.
cc41a00f 185 * @param parent_window A pointer to the parent window.
5c7463ed 186 * @return The widget created.
187 */
fbbb2697 188GtkWidget *
d47b33d2 189h_gui_events(Tab * tab)
fbbb2697 190{
d47b33d2 191 EventViewerData* event_viewer_data = gui_events(tab) ;
cc41a00f 192 if(event_viewer_data)
193 return event_viewer_data->hbox_v;
f9334f6f 194 else return NULL;
8a949012 195
fbbb2697 196}
197
198/**
199 * Event Viewer's constructor
200 *
201 * This constructor is used to create EventViewerData data structure.
202 * @return The Event viewer data created.
203 */
204EventViewerData *
d47b33d2 205gui_events(Tab *tab)
5c7463ed 206{
b9a010a2 207 LttTime end;
675f8f58 208 GtkTreeViewColumn *column;
209 GtkCellRenderer *renderer;
cc41a00f 210 EventViewerData* event_viewer_data = g_new(EventViewerData,1) ;
675f8f58 211
8ce1db6f 212 event_viewer_data->tab = tab;
675f8f58 213
8ce1db6f 214 event_viewer_data->event_hooks = lttv_hooks_new();
5290ec02 215 lttv_hooks_add(event_viewer_data->event_hooks,
216 event_hook,
217 event_viewer_data,
218 LTTV_PRIO_DEFAULT);
b671bb09 219
8ce1db6f 220 lttvwindow_register_current_time_notify(tab,
224446ce 221 update_current_time,event_viewer_data);
8ce1db6f 222 lttvwindow_register_traceset_notify(tab,
224446ce 223 traceset_changed,event_viewer_data);
675f8f58 224
cc41a00f 225 event_viewer_data->scroll_win = gtk_scrolled_window_new (NULL, NULL);
224446ce 226 gtk_widget_show (event_viewer_data->scroll_win);
227 gtk_scrolled_window_set_policy(
228 GTK_SCROLLED_WINDOW(event_viewer_data->scroll_win),
229 GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER);
8b9fdc80 230
5290ec02 231 event_viewer_data->currently_selected_event = -1;
675f8f58 232
233 /* Create a model for storing the data list */
cc41a00f 234 event_viewer_data->store_m = gtk_list_store_new (
224446ce 235 N_COLUMNS, /* Total number of columns */
5290ec02 236 G_TYPE_STRING, /* Trace name */
237 G_TYPE_STRING, /* Tracefile name */
238 G_TYPE_UINT, /* CPUID */
224446ce 239 G_TYPE_STRING, /* Event */
5290ec02 240 G_TYPE_STRING, /* Facility */
241 G_TYPE_UINT, /* Time s */
242 G_TYPE_UINT, /* Time ns */
224446ce 243 G_TYPE_INT, /* PID */
5290ec02 244 G_TYPE_STRING, /* Event's description */
245 G_TYPE_POINTER);/* Position (not shown) */
246
247 event_viewer_data->pos = g_ptr_array_sized_new(10);
8a949012 248
675f8f58 249 /* Create the viewer widget for the columned list */
224446ce 250 event_viewer_data->tree_v =
251 gtk_tree_view_new_with_model (GTK_TREE_MODEL (event_viewer_data->store_m));
8a949012 252
cc41a00f 253 g_signal_connect (G_OBJECT (event_viewer_data->tree_v), "size-allocate",
8a949012 254 G_CALLBACK (tree_v_size_allocate_cb),
255 event_viewer_data);
cc41a00f 256 g_signal_connect (G_OBJECT (event_viewer_data->tree_v), "size-request",
8a949012 257 G_CALLBACK (tree_v_size_request_cb),
258 event_viewer_data);
675f8f58 259
cc41a00f 260 g_signal_connect (G_OBJECT (event_viewer_data->tree_v), "cursor-changed",
8a949012 261 G_CALLBACK (tree_v_cursor_changed_cb),
262 event_viewer_data);
263
cc41a00f 264 g_signal_connect (G_OBJECT (event_viewer_data->tree_v), "move-cursor",
8a949012 265 G_CALLBACK (tree_v_move_cursor_cb),
266 event_viewer_data);
675f8f58 267
675f8f58 268 // Use on each column!
5290ec02 269 //gtk_tree_view_column_set_sizing(event_viewer_data->tree_v,
270 //GTK_TREE_VIEW_COLUMN_FIXED);
8a949012 271
675f8f58 272 /* The view now holds a reference. We can get rid of our own
273 * reference */
cc41a00f 274 g_object_unref (G_OBJECT (event_viewer_data->store_m));
675f8f58 275
fcdf0ec2 276
fbbb2697 277 /* Create a column, associating the "text" attribute of the
278 * cell_renderer to the first column of the model */
675f8f58 279 /* Columns alignment : 0.0 : Left 0.5 : Center 1.0 : Right */
fbbb2697 280 renderer = gtk_cell_renderer_text_new ();
5290ec02 281 column = gtk_tree_view_column_new_with_attributes ("Trace",
8a949012 282 renderer,
5290ec02 283 "text", TRACE_NAME_COLUMN,
8a949012 284 NULL);
675f8f58 285 gtk_tree_view_column_set_alignment (column, 0.0);
5290ec02 286 gtk_tree_view_column_set_fixed_width (column, 120);
287 gtk_tree_view_append_column (GTK_TREE_VIEW (event_viewer_data->tree_v),
288 column);
fbbb2697 289
8ce1db6f 290 event_viewer_data->button = column->button;
291
292 g_signal_connect (G_OBJECT(event_viewer_data->button),
293 "size-allocate",
294 G_CALLBACK(header_size_allocate),
295 (gpointer)event_viewer_data);
296
5290ec02 297
298
299 renderer = gtk_cell_renderer_text_new ();
300 column = gtk_tree_view_column_new_with_attributes ("Tracefile",
301 renderer,
302 "text", TRACEFILE_NAME_COLUMN,
303 NULL);
304 gtk_tree_view_column_set_alignment (column, 0.0);
305 gtk_tree_view_column_set_fixed_width (column, 120);
306 gtk_tree_view_append_column (GTK_TREE_VIEW (event_viewer_data->tree_v),
307 column);
308
309
310 renderer = gtk_cell_renderer_text_new ();
311 column = gtk_tree_view_column_new_with_attributes ("CPUID",
312 renderer,
313 "text", CPUID_COLUMN,
314 NULL);
315 gtk_tree_view_column_set_alignment (column, 0.0);
316 gtk_tree_view_column_set_fixed_width (column, 45);
317 gtk_tree_view_append_column (GTK_TREE_VIEW (event_viewer_data->tree_v),
318 column);
319
fbbb2697 320 renderer = gtk_cell_renderer_text_new ();
321 column = gtk_tree_view_column_new_with_attributes ("Event",
8a949012 322 renderer,
323 "text", EVENT_COLUMN,
324 NULL);
675f8f58 325 gtk_tree_view_column_set_alignment (column, 0.0);
326 gtk_tree_view_column_set_fixed_width (column, 120);
5290ec02 327 gtk_tree_view_append_column (GTK_TREE_VIEW (event_viewer_data->tree_v),
328 column);
329
fbbb2697 330 renderer = gtk_cell_renderer_text_new ();
5290ec02 331 column = gtk_tree_view_column_new_with_attributes ("Facility",
8a949012 332 renderer,
5290ec02 333 "text", FACILITY_COLUMN,
8a949012 334 NULL);
5290ec02 335 gtk_tree_view_column_set_alignment (column, 0.0);
675f8f58 336 gtk_tree_view_column_set_fixed_width (column, 120);
5290ec02 337 gtk_tree_view_append_column (GTK_TREE_VIEW (event_viewer_data->tree_v),
338 column);
fbbb2697 339
340 renderer = gtk_cell_renderer_text_new ();
5290ec02 341 column = gtk_tree_view_column_new_with_attributes ("Time (s)",
8a949012 342 renderer,
5290ec02 343 "text", TIME_S_COLUMN,
8a949012 344 NULL);
675f8f58 345 gtk_tree_view_column_set_alignment (column, 1.0);
5290ec02 346 gtk_tree_view_column_set_fixed_width (column, 120);
347 gtk_tree_view_append_column (GTK_TREE_VIEW (event_viewer_data->tree_v),
348 column);
675f8f58 349
fbbb2697 350 renderer = gtk_cell_renderer_text_new ();
5290ec02 351 column = gtk_tree_view_column_new_with_attributes ("Time (ns)",
8a949012 352 renderer,
5290ec02 353 "text", TIME_NS_COLUMN,
8a949012 354 NULL);
675f8f58 355 gtk_tree_view_column_set_alignment (column, 1.0);
5290ec02 356 gtk_tree_view_column_set_fixed_width (column, 120);
357 gtk_tree_view_append_column (GTK_TREE_VIEW (event_viewer_data->tree_v),
358 column);
359
360
361 renderer = gtk_cell_renderer_text_new ();
362 column = gtk_tree_view_column_new_with_attributes ("PID",
363 renderer,
364 "text", PID_COLUMN,
365 NULL);
366 gtk_tree_view_column_set_alignment (column, 1.0);
367 gtk_tree_view_column_set_fixed_width (column, 45);
368 gtk_tree_view_append_column (GTK_TREE_VIEW (event_viewer_data->tree_v),
369 column);
675f8f58 370
fbbb2697 371 renderer = gtk_cell_renderer_text_new ();
8ce1db6f 372 column = gtk_tree_view_column_new_with_attributes ("Event Description",
8a949012 373 renderer,
374 "text", EVENT_DESCR_COLUMN,
375 NULL);
675f8f58 376 gtk_tree_view_column_set_alignment (column, 0.0);
5290ec02 377 gtk_tree_view_append_column (GTK_TREE_VIEW (event_viewer_data->tree_v),
378 column);
fbbb2697 379
380
675f8f58 381 /* Setup the selection handler */
5290ec02 382 event_viewer_data->select_c =
383 gtk_tree_view_get_selection (GTK_TREE_VIEW (event_viewer_data->tree_v));
384 gtk_tree_selection_set_mode (event_viewer_data->select_c,
385 GTK_SELECTION_SINGLE);
cc41a00f 386 g_signal_connect (G_OBJECT (event_viewer_data->select_c), "changed",
8a949012 387 G_CALLBACK (tree_selection_changed_cb),
388 event_viewer_data);
389
5290ec02 390 gtk_container_add (GTK_CONTAINER (event_viewer_data->scroll_win),
391 event_viewer_data->tree_v);
8b9fdc80 392
cc41a00f 393 event_viewer_data->hbox_v = gtk_hbox_new(0, 0);
5290ec02 394 gtk_box_pack_start(GTK_BOX(event_viewer_data->hbox_v),
395 event_viewer_data->scroll_win, TRUE, TRUE, 0);
fcdf0ec2 396
397 /* Create vertical scrollbar and pack it */
cc41a00f 398 event_viewer_data->vscroll_vc = gtk_vscrollbar_new(NULL);
607177be 399 gtk_range_set_update_policy (GTK_RANGE(event_viewer_data->vscroll_vc),
8a949012 400 GTK_UPDATE_CONTINUOUS);
401 // Changed by MD : more user friendly :)
402 //GTK_UPDATE_DISCONTINUOUS);
5290ec02 403 gtk_box_pack_start(GTK_BOX(event_viewer_data->hbox_v),
404 event_viewer_data->vscroll_vc, FALSE, TRUE, 0);
675f8f58 405
fcdf0ec2 406 /* Get the vertical scrollbar's adjustment */
5290ec02 407 event_viewer_data->vadjust_c =
408 gtk_range_get_adjustment(GTK_RANGE(event_viewer_data->vscroll_vc));
cc41a00f 409 event_viewer_data->vtree_adjust_c = gtk_tree_view_get_vadjustment(
8a949012 410 GTK_TREE_VIEW (event_viewer_data->tree_v));
675f8f58 411
cc41a00f 412 g_signal_connect (G_OBJECT (event_viewer_data->vadjust_c), "value-changed",
8a949012 413 G_CALLBACK (v_scroll_cb),
414 event_viewer_data);
675f8f58 415 /* Set the upper bound to the last event number */
cc41a00f 416 event_viewer_data->previous_value = 0;
417 event_viewer_data->vadjust_c->lower = 0.0;
418 //event_viewer_data->vadjust_c->upper = event_viewer_data->number_of_events;
419 event_viewer_data->vadjust_c->value = 0.0;
420 event_viewer_data->vadjust_c->step_increment = 1.0;
421 event_viewer_data->vadjust_c->page_increment = 2.0;
422 // event_viewer_data->vtree_adjust_c->upper;
423 event_viewer_data->vadjust_c->page_size = 2.0;
424 // event_viewer_data->vtree_adjust_c->upper;
fbbb2697 425 /* Raw event trace */
cc41a00f 426 gtk_widget_show(event_viewer_data->hbox_v);
427 gtk_widget_show(event_viewer_data->tree_v);
428 gtk_widget_show(event_viewer_data->vscroll_vc);
fbbb2697 429
675f8f58 430 /* Add the object's information to the module's array */
5290ec02 431 g_event_viewer_data_list = g_slist_append(g_event_viewer_data_list,
432 event_viewer_data);
fbbb2697 433
cc41a00f 434 event_viewer_data->num_visible_events = 1;
675f8f58 435
b671bb09 436 //get the life span of the traceset and set the upper of the scroll bar
f7afe191 437
8ce1db6f 438 LttvTracesetContext * tsc =
439 lttvwindow_get_traceset_context(event_viewer_data->tab);
440 TimeInterval time_span = tsc->time_span;
b9a010a2 441 end = ltt_time_sub(time_span.end_time, time_span.start_time);
8ce1db6f 442
224446ce 443 event_viewer_data->vadjust_c->upper =
c74e0cf9 444 ltt_time_to_double(end);
b671bb09 445
675f8f58 446 /* Set the Selected Event */
cc41a00f 447 // tree_v_set_cursor(event_viewer_data);
8af8e4c5 448
ee06e0e2 449 // event_viewer_data->current_time_updated = FALSE;
5290ec02 450 //
8af8e4c5 451 g_object_set_data_full(
8a949012 452 G_OBJECT(event_viewer_data->hbox_v),
453 "event_viewer_data",
454 event_viewer_data,
455 (GDestroyNotify)gui_events_free);
675f8f58 456
8ce1db6f 457
cc41a00f 458 return event_viewer_data;
fbbb2697 459}
fcdf0ec2 460
8ce1db6f 461
462
463static gboolean
464header_size_allocate(GtkWidget *widget,
465 GtkAllocation *allocation,
466 gpointer user_data)
467{
468 EventViewerData *event_viewer_data = (EventViewerData*)user_data;
469
470 event_viewer_data->header_height = allocation->height;
471
472 return 0;
473}
474
475
cc41a00f 476void tree_v_set_cursor(EventViewerData *event_viewer_data)
682c6edb 477{
675f8f58 478 GtkTreePath *path;
479
5290ec02 480 if(event_viewer_data->currently_selected_event != -1)
675f8f58 481 {
675f8f58 482 path = gtk_tree_path_new_from_indices(
5290ec02 483 event_viewer_data->currently_selected_event,
8a949012 484 -1);
675f8f58 485
5290ec02 486 gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v),
487 path, NULL, FALSE);
675f8f58 488 gtk_tree_path_free(path);
489 }
682c6edb 490}
491
cc41a00f 492void tree_v_get_cursor(EventViewerData *event_viewer_data)
682c6edb 493{
675f8f58 494 GtkTreePath *path;
495 gint *indices;
8a949012 496
5290ec02 497 gtk_tree_view_get_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v),
498 &path, NULL);
675f8f58 499 indices = gtk_tree_path_get_indices(path);
500
501 if(indices != NULL)
5290ec02 502 event_viewer_data->currently_selected_event = indices[0];
503 else
504 event_viewer_data->currently_selected_event = -1;
675f8f58 505
506 gtk_tree_path_free(path);
682c6edb 507
508}
509
510
511
224446ce 512void tree_v_move_cursor_cb (GtkWidget *widget,
513 GtkMovementStep arg1,
514 gint arg2,
515 gpointer data)
fbbb2697 516{
675f8f58 517 GtkTreePath *path; // = gtk_tree_path_new();
518 gint *indices;
519 gdouble value;
cc41a00f 520 EventViewerData *event_viewer_data = (EventViewerData*)data;
675f8f58 521
224446ce 522 gtk_tree_view_get_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v),
523 &path, NULL);
675f8f58 524 if(path == NULL)
224446ce 525 {
526 /* No prior cursor, put it at beginning of page
527 * and let the execution do */
528 path = gtk_tree_path_new_from_indices(0, -1);
529 gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v),
530 path, NULL, FALSE);
531 }
532
675f8f58 533 indices = gtk_tree_path_get_indices(path);
534
cc41a00f 535 value = gtk_adjustment_get_value(event_viewer_data->vadjust_c);
675f8f58 536
5290ec02 537 g_debug("tree view move cursor : arg1 is %u and arg2 is %d",
538 (guint)arg1, arg2);
539
540#if 0
675f8f58 541 if(arg1 == GTK_MOVEMENT_DISPLAY_LINES)
8a949012 542 {
224446ce 543 /* Move one line */
544 if(arg2 == 1)
545 {
546 /* move one line down */
5290ec02 547 if(indices[0]) // Do we need an empty field here (before first)?
8a949012 548 {
549 if(value + event_viewer_data->num_visible_events <=
224446ce 550 event_viewer_data->number_of_events -1)
551 {
552 event_viewer_data->currently_selected_event += 1;
553 // gtk_adjustment_set_value(event_viewer_data->vadjust_c, value+1);
554 //gtk_tree_path_free(path);
555 //path = gtk_tree_path_new_from_indices(event_viewer_data->num_visible_events-1, -1);
556 //gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), path, NULL, FALSE);
557 g_signal_stop_emission_by_name(G_OBJECT(widget), "move-cursor");
558 }
8a949012 559 }
224446ce 560 } else {
561 /* Move one line up */
562 if(indices[0] == 0)
8a949012 563 {
564 if(value - 1 >= 0 )
224446ce 565 {
566 event_viewer_data->currently_selected_event -= 1;
567 // gtk_adjustment_set_value(event_viewer_data->vadjust_c, value-1);
568 //gtk_tree_path_free(path);
569 //path = gtk_tree_path_new_from_indices(0, -1);
570 //gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), path, NULL, FALSE);
571 g_signal_stop_emission_by_name(G_OBJECT(widget), "move-cursor");
572 }
8a949012 573 }
675f8f58 574 }
224446ce 575 }
675f8f58 576
577 if(arg1 == GTK_MOVEMENT_PAGES)
8a949012 578 {
224446ce 579 /* Move one page */
580 if(arg2 == 1)
581 {
582 if(event_viewer_data->num_visible_events == 1)
583 value += 1 ;
584 /* move one page down */
585 if(value + event_viewer_data->num_visible_events-1 <=
586 event_viewer_data->number_of_events )
8a949012 587 {
224446ce 588 event_viewer_data->currently_selected_event +=
589 event_viewer_data->num_visible_events-1;
8a949012 590 // gtk_adjustment_set_value(event_viewer_data->vadjust_c,
591 // value+(event_viewer_data->num_visible_events-1));
592 //gtk_tree_path_free(path);
593 //path = gtk_tree_path_new_from_indices(0, -1);
594 //gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), path, NULL, FALSE);
595 g_signal_stop_emission_by_name(G_OBJECT(widget), "move-cursor");
596 }
224446ce 597 } else {
598 /* Move one page up */
599 if(event_viewer_data->num_visible_events == 1)
600 value -= 1 ;
8a949012 601
224446ce 602 if(indices[0] < event_viewer_data->num_visible_events - 2 )
8a949012 603 {
604 if(value - (event_viewer_data->num_visible_events-1) >= 0)
224446ce 605 {
606 event_viewer_data->currently_selected_event -=
607 event_viewer_data->num_visible_events-1;
8a949012 608
224446ce 609 // gtk_adjustment_set_value(event_viewer_data->vadjust_c,
610 // value-(event_viewer_data->num_visible_events-1));
611 //gtk_tree_path_free(path);
612 //path = gtk_tree_path_new_from_indices(0, -1);
613 //gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), path, NULL, FALSE);
614 g_signal_stop_emission_by_name(G_OBJECT(widget), "move-cursor");
8a949012 615
224446ce 616 } else {
617 /* Go to first Event */
618 event_viewer_data->currently_selected_event == 0 ;
619 // gtk_adjustment_set_value(event_viewer_data->vadjust_c,
620 // 0);
621 //gtk_tree_path_free(path);
622 //path = gtk_tree_path_new_from_indices(0, -1);
623 //gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), path, NULL, FALSE);
624 g_signal_stop_emission_by_name(G_OBJECT(widget), "move-cursor");
8a949012 625
224446ce 626 }
8a949012 627 }
675f8f58 628 }
224446ce 629 }
675f8f58 630
631 if(arg1 == GTK_MOVEMENT_BUFFER_ENDS)
8a949012 632 {
224446ce 633 /* Move to the ends of the buffer */
634 if(arg2 == 1)
635 {
636 /* move end of buffer */
637 event_viewer_data->currently_selected_event =
638 event_viewer_data->number_of_events-1 ;
639 // gtk_adjustment_set_value(event_viewer_data->vadjust_c,
640 // event_viewer_data->number_of_events -
641 // event_viewer_data->num_visible_events);
8a949012 642 //gtk_tree_path_free(path);
224446ce 643 //path = gtk_tree_path_new_from_indices(event_viewer_data->num_visible_events-1, -1);
8a949012 644 //gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), path, NULL, FALSE);
224446ce 645 g_signal_stop_emission_by_name(G_OBJECT(widget), "move-cursor");
646 } else {
647 /* Move beginning of buffer */
648 event_viewer_data->currently_selected_event = 0 ;
649 // gtk_adjustment_set_value(event_viewer_data->vadjust_c, 0);
650 //gtk_tree_path_free(path);
651 //path = gtk_tree_path_new_from_indices(0, -1);
652 //gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), path, NULL, FALSE);
653 g_signal_stop_emission_by_name(G_OBJECT(widget), "move-cursor");
675f8f58 654 }
224446ce 655 }
5290ec02 656#endif //0
675f8f58 657 gtk_tree_path_free(path);
b26121f4 658}
659
cc41a00f 660void tree_v_cursor_changed_cb (GtkWidget *widget, gpointer data)
b26121f4 661{
cc41a00f 662 EventViewerData *event_viewer_data = (EventViewerData*) data;
8ce1db6f 663 Tab *tab = event_viewer_data->tab;
675f8f58 664 GtkTreeIter iter;
cc41a00f 665 GtkTreeModel* model = GTK_TREE_MODEL(event_viewer_data->store_m);
675f8f58 666 GtkTreePath *path;
5290ec02 667 LttvTracesetContextPosition *pos;
668
8a949012 669
675f8f58 670 /* On cursor change, modify the currently selected event by calling
671 * the right API function */
cc41a00f 672 tree_v_get_cursor(event_viewer_data);
52548e33 673
5290ec02 674 gtk_tree_view_get_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v),
675 &path, NULL);
675f8f58 676 if(gtk_tree_model_get_iter(model,&iter,path)){
5290ec02 677 gtk_tree_model_get(model, &iter, POSITION_COLUMN, &pos, -1);
675f8f58 678
5290ec02 679 lttvwindow_report_current_position(tab, pos);
675f8f58 680 }else{
681 g_warning("Can not get iter\n");
682 }
52548e33 683
b26121f4 684}
685
686
687void v_scroll_cb (GtkAdjustment *adjustment, gpointer data)
688{
cc41a00f 689 EventViewerData *event_viewer_data = (EventViewerData*)data;
690 GtkTreePath *tree_path;
675f8f58 691
5290ec02 692 get_events(adjustment->value, event_viewer_data);
675f8f58 693
5290ec02 694 if(event_viewer_data->currently_selected_event != -1) {
675f8f58 695
cc41a00f 696 tree_path = gtk_tree_path_new_from_indices(
5290ec02 697 event_viewer_data->currently_selected_event,
8a949012 698 -1);
675f8f58 699
c20b7777 700 // gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), tree_path,
8a949012 701 // NULL, FALSE);
cc41a00f 702 gtk_tree_path_free(tree_path);
5290ec02 703 }
fbbb2697 704}
fcdf0ec2 705
54d8f654 706static __inline gint get_cell_height(GtkTreeView *TreeView)
6601bf27 707{
eb6b1024 708 gint height;
cc41a00f 709 GtkTreeViewColumn *column = gtk_tree_view_get_column(TreeView, 0);
675f8f58 710
cc41a00f 711 gtk_tree_view_column_cell_get_size(column, NULL, NULL, NULL, NULL, &height);
675f8f58 712
713 return height;
6601bf27 714}
715
cc41a00f 716void tree_v_size_allocate_cb (GtkWidget *widget, GtkAllocation *alloc, gpointer data)
fbbb2697 717{
cc41a00f 718 EventViewerData *event_viewer_data = (EventViewerData*)data;
719 gint cell_height = get_cell_height(GTK_TREE_VIEW(event_viewer_data->tree_v));
720 gint last_num_visible_events = event_viewer_data->num_visible_events;
721 gdouble exact_num_visible;
675f8f58 722
cc41a00f 723 exact_num_visible = ( alloc->height -
8ce1db6f 724 event_viewer_data->header_height )
725 / (double)cell_height ;
675f8f58 726
cc41a00f 727 event_viewer_data->num_visible_events = ceil(exact_num_visible) ;
675f8f58 728
b671bb09 729/*
cc41a00f 730 event_viewer_data->vadjust_c->page_increment =
731 floor(exact_num_visible);
732 event_viewer_data->vadjust_c->page_size =
733 floor(exact_num_visible);
b671bb09 734*/
b72d54c9 735
eb6b1024 736 g_debug("size allocate : last_num_visible_events : %d,\
737 num_visible_events : %d",
b72d54c9 738 last_num_visible_events,
739 event_viewer_data->num_visible_events);
cc41a00f 740 if(event_viewer_data->num_visible_events != last_num_visible_events)
675f8f58 741 {
5290ec02 742 get_events(event_viewer_data->vadjust_c->value, event_viewer_data);
675f8f58 743 }
744
6601bf27 745
fbbb2697 746}
747
cc41a00f 748void tree_v_size_request_cb (GtkWidget *widget, GtkRequisition *requisition, gpointer data)
fbbb2697 749{
675f8f58 750 gint h;
cc41a00f 751 EventViewerData *event_viewer_data = (EventViewerData*)data;
752 gint cell_height = get_cell_height(GTK_TREE_VIEW(event_viewer_data->tree_v));
8a949012 753
8ce1db6f 754 h = cell_height + event_viewer_data->header_height;
675f8f58 755 requisition->height = h;
8a949012 756
fcdf0ec2 757}
758
8ce1db6f 759#if 0
202f6c8f 760gboolean show_event_detail(void * hook_data, void * call_data)
761{
762 EventViewerData *event_viewer_data = (EventViewerData*) hook_data;
8ce1db6f 763 LttvTracesetContext * tsc = lttvwindow_get_traceset_context(event_viewer_data->tab);
202f6c8f 764
b72d54c9 765 if(event_viewer_data->event_fields_queue_tmp->length == 0 &&
766 event_viewer_data->event_fields_queue->length == 0){
912be9a5 767 event_viewer_data->shown = FALSE;
768 return FALSE;
769 }
770
202f6c8f 771 if(event_viewer_data->shown == FALSE){
772 event_viewer_data->shown = TRUE;
773 update_raw_data_array(event_viewer_data,
b72d54c9 774 event_viewer_data->event_fields_queue_tmp->length);
202f6c8f 775
b72d54c9 776 get_data(event_viewer_data->vadjust_c->value,
8a949012 777 event_viewer_data->num_visible_events,
778 event_viewer_data);
a8c0f09d 779
780 remove_context_hooks(event_viewer_data,tsc);
202f6c8f 781 }
782
783 return FALSE;
784}
8ce1db6f 785#endif //0
786
202f6c8f 787
a6b3623e 788
b72d54c9 789
8ce1db6f 790
8ce1db6f 791
8ce1db6f 792
5290ec02 793static void get_events(double new_value, EventViewerData *event_viewer_data)
b26121f4 794{
5290ec02 795 LttvTracesetStats *tss =
796 lttvwindow_get_traceset_stats(event_viewer_data->tab);
797 LttvTracesetContext *tsc = (LttvTracesetContext*)tss;
798 guint i;
799
800 double value = new_value - event_viewer_data->previous_value;
801 event_viewer_data->previous_value = new_value;
8ce1db6f 802
5290ec02 803 /* See where we have to scroll... */
804 ScrollDirection direction;
805 gint relative_position;
806
807 if(value < 0.0) {
808 if(value >= -1.0) direction = SCROLL_STEP_UP;
809 else {
810 if(value >= -2.0) direction = SCROLL_PAGE_UP;
eb6b1024 811 else direction = SCROLL_JUMP;
8a949012 812 }
5290ec02 813 } else if(value > 0.0) {
814 if(value <= 1.0) direction = SCROLL_STEP_DOWN;
b72d54c9 815 else {
5290ec02 816 if(value <= 2.0) direction = SCROLL_PAGE_DOWN;
817 else direction = SCROLL_JUMP;
8a949012 818 }
5290ec02 819 } else direction = SCROLL_NONE; /* 0.0 */
820
821
822 switch(direction) {
823 case SCROLL_STEP_UP:
824 g_debug("get_events : SCROLL_STEP_UP");
825 relative_position = -1;
8a949012 826 break;
5290ec02 827 case SCROLL_STEP_DOWN:
828 g_debug("get_events : SCROLL_STEP_DOWN");
829 relative_position = 1;
830 break;
831 case SCROLL_PAGE_UP:
832 g_debug("get_events : SCROLL_PAGE_UP");
833 relative_position = -(event_viewer_data->num_visible_events);
834 break;
835 case SCROLL_PAGE_DOWN:
836 g_debug("get_events : SCROLL_PAGE_DOWN");
837 relative_position = event_viewer_data->num_visible_events;
838 break;
839 case SCROLL_JUMP:
840 g_debug("get_events : SCROLL_JUMP");
841 relative_position = 0;
842 break;
843 case SCROLL_NONE:
844 g_debug("get_events : SCROLL_NONE");
845 goto end;
846 break;
847 }
675f8f58 848
5290ec02 849 LttTime time = ltt_time_from_double(new_value);
850 time = ltt_time_add(tsc->time_span.start_time, time);
675f8f58 851
5290ec02 852 if(relative_position) {
853
854 LttvTracesetContextPosition *pos =
855 lttv_traceset_context_position_new(tsc);
856
857 /* Remember the beginning position */
858 if(event_viewer_data->pos->len > 0) {
859 LttvTracesetContextPosition *first_pos =
860 (LttvTracesetContextPosition*)g_ptr_array_index(event_viewer_data->pos,
861 0);
862 lttv_traceset_context_position_copy(pos, first_pos);
863 g_assert(lttv_process_traceset_seek_position(tsc, pos) == 0);
864 } else {
865 /* There is nothing in the list : simply seek to the time value. */
866 lttv_state_traceset_seek_time_closest((LttvTracesetState*)tsc,
867 time);
ed3b99b6 868 }
5290ec02 869
870 /* Clear the model (don't forget to free the TCS positions!) */
cc41a00f 871 gtk_list_store_clear(event_viewer_data->store_m);
5290ec02 872 for(i=0;i<event_viewer_data->pos->len;i++) {
873 LttvTracesetContextPosition *cur_pos =
874 (LttvTracesetContextPosition*)g_ptr_array_index(event_viewer_data->pos,
875 i);
876 lttv_traceset_context_position_destroy(cur_pos);
877 }
878 g_ptr_array_set_size(event_viewer_data->pos, 0);
eb6b1024 879
5290ec02 880 /* Note that, as we mess with the tsc position, this function CANNOT be called
881 * from a hook inside the lttv_process_traceset_middle. */
882 /* As the lttvwindow API keeps a sync_position inside the tsc to go back at
883 * the right spot after being interrupted, it's ok to change the tsc position,
884 * as long as we do not touch the sync_position. */
675f8f58 885
5290ec02 886 /* Get the beginning position of the read (with seek backward or seek forward)
887 */
888 if(relative_position > 0) {
889 guint count;
890 count = lttv_process_traceset_seek_n_forward(tsc, relative_position,
891 lttvwindow_get_filter(event_viewer_data->tab));
892 } else { /* < 0 */
893 guint count;
894 count = lttv_process_traceset_seek_n_backward(tsc, abs(relative_position),
895 seek_back_default_offset, lttv_process_traceset_seek_time,
896 lttvwindow_get_filter(event_viewer_data->tab));
897 }
682c6edb 898
5290ec02 899 lttv_traceset_context_position_destroy(pos);
900 } else {
901 /* Seek by time */
902 lttv_state_traceset_seek_time_closest((LttvTracesetState*)tsc,
903 time);
904 }
905
906 /* Mathieu :
907 * I make the choice not to use the mainwindow lttvwindow API here : it will
908 * be faster to read the events ourself from lttv_process_traceset_middle, as
909 * we are already at the right read position. It would be costier to use the
910 * seek time closest for nothing, as we only have few events to read.
911 */
fbbb2697 912
5290ec02 913 lttv_process_traceset_begin(tsc,
914 NULL, NULL, NULL, event_viewer_data->event_hooks, NULL);
675f8f58 915
5290ec02 916 lttv_process_traceset_middle(tsc, ltt_time_infinite, G_MAXUINT, NULL);
917
918 lttv_process_traceset_end(tsc,
919 NULL, NULL, NULL, event_viewer_data->event_hooks, NULL);
675f8f58 920
5290ec02 921end:
922 return;
fbbb2697 923}
8ce1db6f 924
f1d41644 925
f1d41644 926
5290ec02 927int event_hook(void *hook_data, void *call_data)
fbbb2697 928{
5290ec02 929 EventViewerData *event_viewer_data = (EventViewerData*)hook_data;
930 LttvTracefileContext *tfc = (LttvTracefileContext*)call_data;
931 LttEvent *e = ltt_tracefile_get_event(tfc->tf);
932 LttFacility *facility = ltt_event_facility(e);
933 LttEventType *event_type = ltt_event_eventtype(e);
934 LttField *field = ltt_event_field(e);
935 LttTime time = ltt_event_time(e);
936
937 guint cpu = ltt_tracefile_num(tfc->tf);
938 LttvTraceState *ts = (LttvTraceState*)tfc->t_context;
939 LttvProcessState *process = ts->running_process[cpu];
940
941 GtkTreeIter iter;
675f8f58 942
5290ec02 943 GString *desc = g_string_new("");
fbbb2697 944
5290ec02 945 LttvTracesetContextPosition *pos =
946 lttv_traceset_context_position_new(tfc->t_context->ts_context);
fbbb2697 947
5290ec02 948 if(field)
949 lttv_print_field(e, field, desc, TRUE);
fbbb2697 950
5290ec02 951 g_info("field : %s", desc->str);
a8c0f09d 952
5290ec02 953 gtk_list_store_append (event_viewer_data->store_m, &iter);
954 gtk_list_store_set (event_viewer_data->store_m, &iter,
955 TRACE_NAME_COLUMN, g_quark_to_string(ltt_trace_name(tfc->t_context->t)),
956 TRACEFILE_NAME_COLUMN, g_quark_to_string(ltt_tracefile_name(tfc->tf)),
957 CPUID_COLUMN, cpu,
958 FACILITY_COLUMN, g_quark_to_string(ltt_facility_name(facility)),
959 EVENT_COLUMN, g_quark_to_string(ltt_eventtype_name(event_type)),
960 TIME_S_COLUMN, time.tv_sec,
961 TIME_NS_COLUMN, time.tv_nsec,
962 PID_COLUMN, process->pid,
963 EVENT_DESCR_COLUMN, desc->str,
964 POSITION_COLUMN, pos,
965 -1);
ed3b99b6 966
5290ec02 967 g_ptr_array_add(event_viewer_data->pos, pos);
a8c0f09d 968
5290ec02 969 g_string_free(desc, TRUE);
970
971 if(event_viewer_data->pos->len >= event_viewer_data->num_visible_events)
972 return TRUE;
973 else
974 return FALSE;
a8c0f09d 975}
976
977
5290ec02 978
675f8f58 979
cc41a00f 980gboolean update_current_time(void * hook_data, void * call_data)
675f8f58 981{
cc41a00f 982 EventViewerData *event_viewer_data = (EventViewerData*) hook_data;
224446ce 983 const LttTime * current_time = (LttTime*)call_data;
8ce1db6f 984 LttvTracesetContext * tsc =
985 lttvwindow_get_traceset_context(event_viewer_data->tab);
5290ec02 986
987 LttTime time = ltt_time_sub(*current_time, tsc->time_span.start_time);
988 double new_value = ltt_time_to_double(time);
989 GtkTreePath *path;
c46519c8 990
5290ec02 991 gtk_adjustment_set_value(event_viewer_data->vadjust_c, new_value);
992
993 event_viewer_data->currently_selected_event = 0;
a6b3623e 994
5290ec02 995 path = gtk_tree_path_new_from_indices(
996 event_viewer_data->currently_selected_event,
997 -1);
a6b3623e 998 gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), path, NULL, FALSE);
0c5dbe3b 999 //g_signal_stop_emission_by_name(G_OBJECT(event_viewer_data->tree_v), "cursor-changed");
a6b3623e 1000 gtk_tree_path_free(path);
1001
675f8f58 1002 return FALSE;
1003}
1004
a8c0f09d 1005gboolean traceset_changed(void * hook_data, void * call_data)
1006{
1007 EventViewerData *event_viewer_data = (EventViewerData*) hook_data;
8ce1db6f 1008 LttvTracesetContext * tsc =
1009 lttvwindow_get_traceset_context(event_viewer_data->tab);
1010 TimeInterval time_span = tsc->time_span;
852f16bb 1011
b9a010a2 1012 LttTime end;
a8c0f09d 1013 gtk_list_store_clear(event_viewer_data->store_m);
5290ec02 1014 g_ptr_array_set_size(event_viewer_data->pos, 0);
a8c0f09d 1015
b9a010a2 1016 end = ltt_time_sub(time_span.end_time, time_span.start_time);
c74e0cf9 1017 event_viewer_data->vadjust_c->upper = ltt_time_to_double(end);
2e2e4a2f 1018 g_signal_emit_by_name(event_viewer_data->vadjust_c, "value-changed");
a8c0f09d 1019 // event_viewer_data->vadjust_c->value = 0;
1020
1021 return FALSE;
1022}
1023
1024
8a949012 1025
b671bb09 1026
682c6edb 1027
5290ec02 1028void gui_events_free(EventViewerData *event_viewer_data)
202f6c8f 1029{
8ce1db6f 1030 Tab *tab = event_viewer_data->tab;
5290ec02 1031 guint i;
1032
1033 if(event_viewer_data){
1034 lttv_hooks_remove(event_viewer_data->event_hooks,event_hook);
1035 lttv_hooks_destroy(event_viewer_data->event_hooks);
1036
1037 for(i=0;i<event_viewer_data->pos->len;i++) {
1038 LttvTracesetContextPosition *cur_pos =
1039 (LttvTracesetContextPosition*)g_ptr_array_index(event_viewer_data->pos,
1040 i);
1041 lttv_traceset_context_position_destroy(cur_pos);
1042 }
1043 g_ptr_array_free(event_viewer_data->pos, TRUE);
1044
1045 lttvwindow_unregister_current_time_notify(tab,
1046 update_current_time, event_viewer_data);
1047 //lttvwindow_unregister_show_notify(tab,
1048 // show_event_detail, event_viewer_data);
1049 lttvwindow_unregister_traceset_notify(tab,
1050 traceset_changed, event_viewer_data);
8ce1db6f 1051
5290ec02 1052 g_event_viewer_data_list = g_slist_remove(g_event_viewer_data_list,
1053 event_viewer_data);
1054 g_free(event_viewer_data);
675f8f58 1055 }
1056}
682c6edb 1057
675f8f58 1058
682c6edb 1059
5290ec02 1060void gui_events_destructor(EventViewerData *event_viewer_data)
a60b01ef 1061{
5290ec02 1062 /* May already been done by GTK window closing */
1063 if(GTK_IS_WIDGET(event_viewer_data->hbox_v)){
1064 gtk_widget_destroy(event_viewer_data->hbox_v);
a60b01ef 1065 }
b671bb09 1066}
1067
682c6edb 1068
c46519c8 1069
08b1c66e 1070/**
1071 * plugin's init function
1072 *
1073 * This function initializes the Event Viewer functionnality through the
1074 * gtkTraceSet API.
1075 */
1076static void init() {
1077
e025a729 1078 lttvwindow_register_constructor("guievents",
1079 "/",
8ce1db6f 1080 "Insert Event Viewer",
1081 hGuiEventsInsert_xpm,
1082 "Insert Event Viewer",
1083 h_gui_events);
08b1c66e 1084}
1085
1086void event_destroy_walk(gpointer data, gpointer user_data)
1087{
1088 gui_events_destructor((EventViewerData*)data);
1089}
1090
1091/**
1092 * plugin's destroy function
1093 *
1094 * This function releases the memory reserved by the module and unregisters
1095 * everything that has been registered in the gtkTraceSet API.
1096 */
1097static void destroy() {
08b1c66e 1098
8ce1db6f 1099 g_slist_foreach(g_event_viewer_data_list, event_destroy_walk, NULL );
1100 g_slist_free(g_event_viewer_data_list);
08b1c66e 1101
8ce1db6f 1102 lttvwindow_unregister_constructor(h_gui_events);
08b1c66e 1103
08b1c66e 1104}
1105
1106
5290ec02 1107
1108
08b1c66e 1109LTTV_MODULE("guievents", "Detailed events view", \
1110 "Graphical module to display a detailed event list", \
5290ec02 1111 init, destroy, "lttvwindow", "print")
This page took 0.103897 seconds and 4 git commands to generate.