Enable support for opening multiple trace
[lttv.git] / 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
1193dd68 3 * 2005 Mathieu Desnoyers
ce0214a6 4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License Version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
17 * MA 02111-1307, USA.
18 */
19
20
fbbb2697 21//*! \defgroup GuiEvents libGuiEvents: The GUI Events display plugin */
5c7463ed 22/*\@{*/
23
fbbb2697 24/*! \file GuiEvents.c
5c7463ed 25 * \brief Graphical plugin for showing events.
26 *
17abcce3 27 * This plugin lists all the events contained in the current time interval
28 * in a list.
29 *
5c7463ed 30 * This plugin adds a Events Viewer functionnality to Linux TraceToolkit
31 * GUI when this plugin is loaded. The init and destroy functions add the
5ac76b22 32 * viewer's insertion menu item and toolbar icon by calling viewer.h's
5c7463ed 33 * API functions. Then, when a viewer's object is created, the constructor
34 * creates ans register through API functions what is needed to interact
b72d54c9 35 * with the lttvwindow.
5c7463ed 36 *
8a949012 37 * Authors : Mathieu Desnoyers and XangXiu Yang, June to December 2003
38 * Inspired from original LTT, made by Karim Yaghmour
1193dd68 39 *
40 * Mostly rewritten by Mathieu Desnoyers, August 2005.
5c7463ed 41 */
42
4e4d11b3 43#ifdef HAVE_CONFIG_H
44#include <config.h>
45#endif
46
b26121f4 47#include <math.h>
48
5c7463ed 49#include <glib.h>
8d8c5ea7 50#include <glib/gprintf.h>
fbbb2697 51#include <gtk/gtk.h>
52#include <gdk/gdk.h>
5e96e7e3 53#include <gdk/gdkx.h>
eb6b1024 54#include <string.h>
5c7463ed 55
675f8f58 56#include <ltt/ltt.h>
57#include <ltt/event.h>
675f8f58 58#include <ltt/trace.h>
43ed82b5 59#include <lttv/lttv.h>
8ce1db6f 60#include <lttv/module.h>
61#include <lttv/hook.h>
9a366873 62#include <lttv/traceset.h>
8ce1db6f 63#include <lttv/state.h>
9a366873 64#ifdef BABEL_CLEANUP
852f16bb 65#include <lttv/filter.h>
9a366873 66#endif //babel_cleanup
5290ec02 67#include <lttv/print.h>
8ce1db6f 68#include <lttvwindow/lttvwindow.h>
d2cdf874 69#include <lttvwindow/lttvwindowtraces.h>
e433e6d6 70#include <lttvwindow/lttv_plugin_tab.h>
b139ad2a 71#include <lttvwindow/support.h>
72#include "lttv_plugin_evd.h"
5c7463ed 73
b139ad2a 74#include "events.h"
0c56e138 75#include "hGuiEventsInsert.xpm"
5c7463ed 76
b72d54c9 77#define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format)
5290ec02 78
79#ifndef g_debug
b72d54c9 80#define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format)
5290ec02 81#endif
82
83#define abs(a) (((a)<0)?(-a):(a))
9d7e0c25 84#define max(a,b) ((a)>(b)?(a):(b))
04f2543e 85#define min(a,b) ((a)<(b)?(a):(b))
675f8f58 86
fcdf0ec2 87/** Array containing instanced objects. Used when module is unloaded */
cc41a00f 88static GSList *g_event_viewer_data_list = NULL ;
fbbb2697 89
a60b01ef 90typedef enum _ScrollDirection{
b671bb09 91 SCROLL_STEP_UP,
92 SCROLL_STEP_DOWN,
93 SCROLL_PAGE_UP,
94 SCROLL_PAGE_DOWN,
95 SCROLL_JUMP,
96 SCROLL_NONE
a60b01ef 97} ScrollDirection;
98
a8c0f09d 99/** hook functions for update time interval, current time ... */
a8c0f09d 100gboolean update_current_time(void * hook_data, void * call_data);
49024c2c 101gboolean update_current_position(void * hook_data, void * call_data);
8ce1db6f 102//gboolean show_event_detail(void * hook_data, void * call_data);
a8c0f09d 103gboolean traceset_changed(void * hook_data, void * call_data);
1e3594a3 104gboolean timespan_changed(void * hook_data, void * call_data);
9a366873 105#ifdef BABEL_CLEANUP
a998b781 106gboolean filter_changed(void * hook_data, void * call_data);
9a366873 107#endif // babel_cleanup
d2cdf874 108static void request_background_data(EventViewerData *event_viewer_data);
109
fbbb2697 110//! Event Viewer's constructor hook
e433e6d6 111GtkWidget *h_gui_events(LttvPlugin *plugin);
5c7463ed 112//! Event Viewer's constructor
e433e6d6 113EventViewerData *gui_events(LttvPluginTab *ptab);
fbbb2697 114//! Event Viewer's destructor
b139ad2a 115void gui_events_destructor(gpointer data);
116void gui_events_free(gpointer data);
fbbb2697 117
8ce1db6f 118static gboolean
119header_size_allocate(GtkWidget *widget,
120 GtkAllocation *allocation,
121 gpointer user_data);
122
cc41a00f 123void tree_v_set_cursor(EventViewerData *event_viewer_data);
124void tree_v_get_cursor(EventViewerData *event_viewer_data);
5df80e1b 125static void redraw(EventViewerData *event_viewer_data);
682c6edb 126
fbbb2697 127/* Prototype for selection handler callback */
5290ec02 128static void tree_selection_changed_cb (GtkTreeSelection *selection,
129 gpointer data);
fbbb2697 130static void v_scroll_cb (GtkAdjustment *adjustment, gpointer data);
5290ec02 131static void tree_v_size_allocate_cb (GtkWidget *widget, GtkAllocation *alloc,
132 gpointer data);
133static void tree_v_size_request_cb (GtkWidget *widget,
134 GtkRequisition *requisition, gpointer data);
cc41a00f 135static void tree_v_cursor_changed_cb (GtkWidget *widget, gpointer data);
5290ec02 136static void tree_v_move_cursor_cb (GtkWidget *widget, GtkMovementStep arg1,
137 gint arg2, gpointer data);
b139ad2a 138static void filter_button (GtkToolButton *toolbutton,
139 gpointer user_data);
864a5a1c 140static gboolean tree_v_scroll_handler (GtkWidget *widget, GdkEventScroll *event, gpointer data);
540066bf 141static gboolean key_handler(GtkWidget *widget, GdkEventKey *event,
142 gpointer user_data);
fbbb2697 143
5df80e1b 144static void adjust_event_viewer(double time, EventViewerData *event_viewer_data);
b72d54c9 145
5290ec02 146int event_hook(void *hook_data, void *call_data);
675f8f58 147
fbbb2697 148/* Enumeration of the columns */
149enum
150{
5290ec02 151 TRACE_NAME_COLUMN,
675f8f58 152 CPUID_COLUMN,
153 EVENT_COLUMN,
5290ec02 154 TIME_S_COLUMN,
155 TIME_NS_COLUMN,
675f8f58 156 PID_COLUMN,
675f8f58 157 EVENT_DESCR_COLUMN,
5290ec02 158 POSITION_COLUMN,
675f8f58 159 N_COLUMNS
fbbb2697 160};
161
5c7463ed 162/**
fbbb2697 163 * Event Viewer's constructor hook
5c7463ed 164 *
165 * This constructor is given as a parameter to the menuitem and toolbar button
fbbb2697 166 * registration. It creates the list.
cc41a00f 167 * @param parent_window A pointer to the parent window.
5c7463ed 168 * @return The widget created.
169 */
fbbb2697 170GtkWidget *
e433e6d6 171h_gui_events(LttvPlugin *plugin)
fbbb2697 172{
e433e6d6 173 LttvPluginTab *ptab = LTTV_PLUGIN_TAB(plugin);
174 EventViewerData* event_viewer_data = gui_events(ptab) ;
cc41a00f 175 if(event_viewer_data)
49024c2c 176 return event_viewer_data->top_widget;
f9334f6f 177 else return NULL;
8a949012 178
fbbb2697 179}
180
181/**
182 * Event Viewer's constructor
183 *
184 * This constructor is used to create EventViewerData data structure.
185 * @return The Event viewer data created.
186 */
187EventViewerData *
e433e6d6 188gui_events(LttvPluginTab *ptab)
5c7463ed 189{
d42da122
F
190 /*To disable the error bell when we reach the end(or the top) of the list of
191 event. Since we overload the management of the list*/
192 GtkSettings* gtk_settings = gtk_settings_get_default();
193 g_object_set(gtk_settings, "gtk-error-bell", FALSE, NULL);
194
9a366873 195
b9a010a2 196 LttTime end;
675f8f58 197 GtkTreeViewColumn *column;
198 GtkCellRenderer *renderer;
b139ad2a 199 EventViewerData* event_viewer_data = g_new(EventViewerData,1);
200 LttvPluginEVD *plugin_evd = g_object_new(LTTV_TYPE_PLUGIN_EVD, NULL);
2dd5f7c5 201 GtkTooltips *tooltips = gtk_tooltips_new();
b139ad2a 202 plugin_evd->evd = event_viewer_data;
e433e6d6 203 Tab *tab = ptab->tab;
8ce1db6f 204 event_viewer_data->tab = tab;
e433e6d6 205 event_viewer_data->ptab = ptab;
b139ad2a 206 GtkWidget *tmp_toolbar_icon;
675f8f58 207
9a366873
FD
208 LttvTraceset *ts =lttvwindow_get_traceset(event_viewer_data->tab);
209
8ce1db6f 210 event_viewer_data->event_hooks = lttv_hooks_new();
5290ec02 211 lttv_hooks_add(event_viewer_data->event_hooks,
212 event_hook,
213 event_viewer_data,
214 LTTV_PRIO_DEFAULT);
b671bb09 215
8ce1db6f 216 lttvwindow_register_current_time_notify(tab,
224446ce 217 update_current_time,event_viewer_data);
49024c2c 218 lttvwindow_register_current_position_notify(tab,
219 update_current_position,event_viewer_data);
8ce1db6f 220 lttvwindow_register_traceset_notify(tab,
224446ce 221 traceset_changed,event_viewer_data);
68764dff 222 lttvwindow_register_timespan_notify(tab,
1e3594a3 223 timespan_changed,event_viewer_data);
9a366873 224#ifdef BABEL_CLEANUP
a998b781 225 lttvwindow_register_filter_notify(tab,
226 filter_changed, event_viewer_data);
9a366873 227#endif
d2cdf874 228 lttvwindow_register_redraw_notify(tab,
b139ad2a 229 evd_redraw_notify, event_viewer_data);
cc41a00f 230 event_viewer_data->scroll_win = gtk_scrolled_window_new (NULL, NULL);
224446ce 231 gtk_widget_show (event_viewer_data->scroll_win);
232 gtk_scrolled_window_set_policy(
233 GTK_SCROLLED_WINDOW(event_viewer_data->scroll_win),
234 GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER);
8b9fdc80 235
49024c2c 236 event_viewer_data->currently_selected_position =
68573dd0 237 lttv_traceset_create_current_position(ts);
49024c2c 238 event_viewer_data->first_event =
68573dd0 239 lttv_traceset_create_current_position(ts);
49024c2c 240 event_viewer_data->last_event =
68573dd0 241 lttv_traceset_create_current_position(ts);
c790dfd9 242 event_viewer_data->main_win_filter = lttvwindow_get_filter(tab);
a998b781 243
dfb5dd45 244 event_viewer_data->update_cursor = TRUE;
15894378 245 event_viewer_data->report_position = TRUE;
dfb5dd45 246
540066bf 247 event_viewer_data->last_tree_update_time = 0;
248
fb3d6047 249 event_viewer_data->init_done = 0;
250
675f8f58 251 /* Create a model for storing the data list */
cc41a00f 252 event_viewer_data->store_m = gtk_list_store_new (
224446ce 253 N_COLUMNS, /* Total number of columns */
5290ec02 254 G_TYPE_STRING, /* Trace name */
5290ec02 255 G_TYPE_UINT, /* CPUID */
224446ce 256 G_TYPE_STRING, /* Event */
5290ec02 257 G_TYPE_UINT, /* Time s */
258 G_TYPE_UINT, /* Time ns */
224446ce 259 G_TYPE_INT, /* PID */
5290ec02 260 G_TYPE_STRING, /* Event's description */
261 G_TYPE_POINTER);/* Position (not shown) */
262
263 event_viewer_data->pos = g_ptr_array_sized_new(10);
8a949012 264
675f8f58 265 /* Create the viewer widget for the columned list */
224446ce 266 event_viewer_data->tree_v =
267 gtk_tree_view_new_with_model (GTK_TREE_MODEL (event_viewer_data->store_m));
8a949012 268
cc41a00f 269 g_signal_connect (G_OBJECT (event_viewer_data->tree_v), "size-allocate",
8a949012 270 G_CALLBACK (tree_v_size_allocate_cb),
271 event_viewer_data);
cc41a00f 272 g_signal_connect (G_OBJECT (event_viewer_data->tree_v), "size-request",
8a949012 273 G_CALLBACK (tree_v_size_request_cb),
274 event_viewer_data);
675f8f58 275
cc41a00f 276 g_signal_connect (G_OBJECT (event_viewer_data->tree_v), "cursor-changed",
8a949012 277 G_CALLBACK (tree_v_cursor_changed_cb),
278 event_viewer_data);
279
cc41a00f 280 g_signal_connect (G_OBJECT (event_viewer_data->tree_v), "move-cursor",
8a949012 281 G_CALLBACK (tree_v_move_cursor_cb),
282 event_viewer_data);
675f8f58 283
540066bf 284 g_signal_connect (G_OBJECT(event_viewer_data->tree_v), "key-press-event",
285 G_CALLBACK(key_handler),
286 event_viewer_data);
287
9d7e0c25 288 g_signal_connect (G_OBJECT(event_viewer_data->tree_v), "scroll-event",
289 G_CALLBACK(tree_v_scroll_handler),
290 event_viewer_data);
291
b139ad2a 292
293
675f8f58 294 // Use on each column!
5290ec02 295 //gtk_tree_view_column_set_sizing(event_viewer_data->tree_v,
296 //GTK_TREE_VIEW_COLUMN_FIXED);
8a949012 297
675f8f58 298 /* The view now holds a reference. We can get rid of our own
299 * reference */
cc41a00f 300 g_object_unref (G_OBJECT (event_viewer_data->store_m));
675f8f58 301
fcdf0ec2 302
fbbb2697 303 /* Create a column, associating the "text" attribute of the
304 * cell_renderer to the first column of the model */
675f8f58 305 /* Columns alignment : 0.0 : Left 0.5 : Center 1.0 : Right */
fbbb2697 306 renderer = gtk_cell_renderer_text_new ();
5290ec02 307 column = gtk_tree_view_column_new_with_attributes ("Trace",
8a949012 308 renderer,
5290ec02 309 "text", TRACE_NAME_COLUMN,
8a949012 310 NULL);
675f8f58 311 gtk_tree_view_column_set_alignment (column, 0.0);
5290ec02 312 gtk_tree_view_column_set_fixed_width (column, 120);
313 gtk_tree_view_append_column (GTK_TREE_VIEW (event_viewer_data->tree_v),
314 column);
fbbb2697 315
8ce1db6f 316 event_viewer_data->button = column->button;
317
318 g_signal_connect (G_OBJECT(event_viewer_data->button),
319 "size-allocate",
320 G_CALLBACK(header_size_allocate),
321 (gpointer)event_viewer_data);
322
5290ec02 323 renderer = gtk_cell_renderer_text_new ();
324 column = gtk_tree_view_column_new_with_attributes ("CPUID",
325 renderer,
326 "text", CPUID_COLUMN,
327 NULL);
328 gtk_tree_view_column_set_alignment (column, 0.0);
329 gtk_tree_view_column_set_fixed_width (column, 45);
330 gtk_tree_view_append_column (GTK_TREE_VIEW (event_viewer_data->tree_v),
331 column);
332
fbbb2697 333 renderer = gtk_cell_renderer_text_new ();
334 column = gtk_tree_view_column_new_with_attributes ("Event",
8a949012 335 renderer,
336 "text", EVENT_COLUMN,
337 NULL);
675f8f58 338 gtk_tree_view_column_set_alignment (column, 0.0);
339 gtk_tree_view_column_set_fixed_width (column, 120);
5290ec02 340 gtk_tree_view_append_column (GTK_TREE_VIEW (event_viewer_data->tree_v),
341 column);
342
fbbb2697 343 renderer = gtk_cell_renderer_text_new ();
5290ec02 344 column = gtk_tree_view_column_new_with_attributes ("Time (s)",
8a949012 345 renderer,
5290ec02 346 "text", TIME_S_COLUMN,
8a949012 347 NULL);
675f8f58 348 gtk_tree_view_column_set_alignment (column, 1.0);
5290ec02 349 gtk_tree_view_column_set_fixed_width (column, 120);
350 gtk_tree_view_append_column (GTK_TREE_VIEW (event_viewer_data->tree_v),
351 column);
675f8f58 352
fbbb2697 353 renderer = gtk_cell_renderer_text_new ();
5290ec02 354 column = gtk_tree_view_column_new_with_attributes ("Time (ns)",
8a949012 355 renderer,
5290ec02 356 "text", TIME_NS_COLUMN,
8a949012 357 NULL);
675f8f58 358 gtk_tree_view_column_set_alignment (column, 1.0);
5290ec02 359 gtk_tree_view_column_set_fixed_width (column, 120);
360 gtk_tree_view_append_column (GTK_TREE_VIEW (event_viewer_data->tree_v),
361 column);
362
363
364 renderer = gtk_cell_renderer_text_new ();
365 column = gtk_tree_view_column_new_with_attributes ("PID",
366 renderer,
367 "text", PID_COLUMN,
368 NULL);
369 gtk_tree_view_column_set_alignment (column, 1.0);
370 gtk_tree_view_column_set_fixed_width (column, 45);
371 gtk_tree_view_append_column (GTK_TREE_VIEW (event_viewer_data->tree_v),
372 column);
675f8f58 373
fbbb2697 374 renderer = gtk_cell_renderer_text_new ();
8ce1db6f 375 column = gtk_tree_view_column_new_with_attributes ("Event Description",
8a949012 376 renderer,
377 "text", EVENT_DESCR_COLUMN,
378 NULL);
675f8f58 379 gtk_tree_view_column_set_alignment (column, 0.0);
5290ec02 380 gtk_tree_view_append_column (GTK_TREE_VIEW (event_viewer_data->tree_v),
381 column);
fbbb2697 382
383
675f8f58 384 /* Setup the selection handler */
5290ec02 385 event_viewer_data->select_c =
386 gtk_tree_view_get_selection (GTK_TREE_VIEW (event_viewer_data->tree_v));
387 gtk_tree_selection_set_mode (event_viewer_data->select_c,
388 GTK_SELECTION_SINGLE);
cc41a00f 389 g_signal_connect (G_OBJECT (event_viewer_data->select_c), "changed",
8a949012 390 G_CALLBACK (tree_selection_changed_cb),
391 event_viewer_data);
392
5290ec02 393 gtk_container_add (GTK_CONTAINER (event_viewer_data->scroll_win),
394 event_viewer_data->tree_v);
8b9fdc80 395
cc41a00f 396 event_viewer_data->hbox_v = gtk_hbox_new(0, 0);
49024c2c 397 event_viewer_data->top_widget = event_viewer_data->hbox_v;
b139ad2a 398 plugin_evd->parent.top_widget = event_viewer_data->hbox_v;
399
400 event_viewer_data->toolbar = gtk_toolbar_new();
401 gtk_toolbar_set_orientation(GTK_TOOLBAR(event_viewer_data->toolbar),
402 GTK_ORIENTATION_VERTICAL);
403
404 tmp_toolbar_icon = create_pixmap (main_window_get_widget(tab),
405 "guifilter16x16.png");
406 gtk_widget_show(tmp_toolbar_icon);
407 event_viewer_data->button_filter = gtk_tool_button_new(tmp_toolbar_icon,
408 "Filter");
409 g_signal_connect (G_OBJECT(event_viewer_data->button_filter),
410 "clicked",
411 G_CALLBACK (filter_button),
412 (gpointer)plugin_evd);
2dd5f7c5 413 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(event_viewer_data->button_filter),
414 tooltips, "Open the filter window", NULL);
b139ad2a 415 gtk_toolbar_insert(GTK_TOOLBAR(event_viewer_data->toolbar),
416 event_viewer_data->button_filter,
417 0);
418 gtk_toolbar_set_style(GTK_TOOLBAR(event_viewer_data->toolbar),
419 GTK_TOOLBAR_ICONS);
420 gtk_box_pack_start(GTK_BOX(event_viewer_data->hbox_v),
421 event_viewer_data->toolbar, FALSE, FALSE, 0);
422 event_viewer_data->filter = NULL;
423
5290ec02 424 gtk_box_pack_start(GTK_BOX(event_viewer_data->hbox_v),
425 event_viewer_data->scroll_win, TRUE, TRUE, 0);
fcdf0ec2 426
203eb6f7 427 gtk_container_set_border_width(GTK_CONTAINER(event_viewer_data->hbox_v), 1);
428
fcdf0ec2 429 /* Create vertical scrollbar and pack it */
cc41a00f 430 event_viewer_data->vscroll_vc = gtk_vscrollbar_new(NULL);
607177be 431 gtk_range_set_update_policy (GTK_RANGE(event_viewer_data->vscroll_vc),
8a949012 432 GTK_UPDATE_CONTINUOUS);
433 // Changed by MD : more user friendly :)
434 //GTK_UPDATE_DISCONTINUOUS);
5290ec02 435 gtk_box_pack_start(GTK_BOX(event_viewer_data->hbox_v),
436 event_viewer_data->vscroll_vc, FALSE, TRUE, 0);
675f8f58 437
fcdf0ec2 438 /* Get the vertical scrollbar's adjustment */
5290ec02 439 event_viewer_data->vadjust_c =
440 gtk_range_get_adjustment(GTK_RANGE(event_viewer_data->vscroll_vc));
cc41a00f 441 event_viewer_data->vtree_adjust_c = gtk_tree_view_get_vadjustment(
8a949012 442 GTK_TREE_VIEW (event_viewer_data->tree_v));
675f8f58 443
cc41a00f 444 g_signal_connect (G_OBJECT (event_viewer_data->vadjust_c), "value-changed",
8a949012 445 G_CALLBACK (v_scroll_cb),
446 event_viewer_data);
1e3594a3 447 //TODO ybrosseau 2011-01-06: Fix comment
675f8f58 448 /* Set the upper bound to the last event number */
cc41a00f 449 event_viewer_data->previous_value = 0;
450 event_viewer_data->vadjust_c->lower = 0.0;
451 //event_viewer_data->vadjust_c->upper = event_viewer_data->number_of_events;
9a366873 452
fb3d6047 453 LttTime time = lttvwindow_get_current_time(tab);
9a366873
FD
454 TimeInterval time_span = lttv_traceset_get_time_span_real(ts);
455 time = ltt_time_sub(time, time_span.start_time);
1e3594a3 456 //TODO ybrosseau 2011-01-06: Which one do we keep?
9a366873 457#ifdef BABEL_CLEANUP
fb3d6047 458 event_viewer_data->vadjust_c->value = ltt_time_to_double(time);
9a366873 459#endif //babel_cleanup
cc41a00f 460 event_viewer_data->vadjust_c->value = 0.0;
461 event_viewer_data->vadjust_c->step_increment = 1.0;
462 event_viewer_data->vadjust_c->page_increment = 2.0;
463 // event_viewer_data->vtree_adjust_c->upper;
464 event_viewer_data->vadjust_c->page_size = 2.0;
465 // event_viewer_data->vtree_adjust_c->upper;
fbbb2697 466 /* Raw event trace */
b139ad2a 467 gtk_widget_show(GTK_WIDGET(event_viewer_data->button_filter));
468 gtk_widget_show(event_viewer_data->toolbar);
cc41a00f 469 gtk_widget_show(event_viewer_data->hbox_v);
470 gtk_widget_show(event_viewer_data->tree_v);
471 gtk_widget_show(event_viewer_data->vscroll_vc);
fbbb2697 472
675f8f58 473 /* Add the object's information to the module's array */
5290ec02 474 g_event_viewer_data_list = g_slist_append(g_event_viewer_data_list,
b139ad2a 475 plugin_evd);
fbbb2697 476
cc41a00f 477 event_viewer_data->num_visible_events = 1;
675f8f58 478
b671bb09 479 //get the life span of the traceset and set the upper of the scroll bar
f7afe191 480
b9a010a2 481 end = ltt_time_sub(time_span.end_time, time_span.start_time);
8ce1db6f 482
9a366873 483 event_viewer_data->vadjust_c->upper = ltt_time_to_double(end);
b671bb09 484
675f8f58 485 /* Set the Selected Event */
cc41a00f 486 // tree_v_set_cursor(event_viewer_data);
8af8e4c5 487
ee06e0e2 488 // event_viewer_data->current_time_updated = FALSE;
5290ec02 489 //
8af8e4c5 490 g_object_set_data_full(
8a949012 491 G_OBJECT(event_viewer_data->hbox_v),
b139ad2a 492 "plugin_data",
493 plugin_evd,
8a949012 494 (GDestroyNotify)gui_events_free);
b139ad2a 495
496 g_object_set_data(
497 G_OBJECT(event_viewer_data->hbox_v),
498 "event_viewer_data",
499 event_viewer_data);
675f8f58 500
d2cdf874 501 event_viewer_data->background_info_waiting = 0;
502
fb3d6047 503
d2cdf874 504 request_background_data(event_viewer_data);
cc41a00f 505 return event_viewer_data;
fbbb2697 506}
fcdf0ec2 507
8ce1db6f 508
509
d2cdf874 510static gint background_ready(void *hook_data, void *call_data)
511{
512 EventViewerData *event_viewer_data = (EventViewerData *)hook_data;
d2cdf874 513
514 event_viewer_data->background_info_waiting--;
515
516 if(event_viewer_data->background_info_waiting == 0) {
517 g_message("event viewer : background computation data ready.");
518
b139ad2a 519 evd_redraw_notify(event_viewer_data, NULL);
d2cdf874 520 }
521
522 return 0;
523}
524
525
526static void request_background_data(EventViewerData *event_viewer_data)
527{
9a366873
FD
528 LttvTraceset * ts =
529 lttvwindow_get_traceset(event_viewer_data->tab);
530 gint num_traces = ts->traces->len;
d2cdf874 531 gint i;
532 LttvTrace *trace;
7df20ca4 533 LttvTraceState *tstate;
d2cdf874 534
535 LttvHooks *background_ready_hook =
536 lttv_hooks_new();
537 lttv_hooks_add(background_ready_hook, background_ready, event_viewer_data,
538 LTTV_PRIO_DEFAULT);
539 event_viewer_data->background_info_waiting = 0;
9a366873 540
d2cdf874 541 for(i=0;i<num_traces;i++) {
9a366873
FD
542 trace = g_ptr_array_index(ts->traces,i);
543#ifdef BABEL_CLEANUP
7df20ca4 544 tstate = LTTV_TRACE_STATE(tsc->traces[i]);
9a366873 545#endif /*babel_cleanup*/
d2cdf874 546
7df20ca4 547 if(lttvwindowtraces_get_ready(g_quark_from_string("state"),trace)==FALSE
9a366873 548 /*&& !tstate->has_precomputed_states*/) {
d2cdf874 549
550 if(lttvwindowtraces_get_in_progress(g_quark_from_string("state"),
551 trace) == FALSE) {
552 /* We first remove requests that could have been done for the same
553 * information. Happens when two viewers ask for it before servicing
554 * starts.
555 */
93ac601b 556 if(!lttvwindowtraces_background_request_find(trace, "state"))
b5e17af5 557 lttvwindowtraces_background_request_queue(
558 main_window_get_widget(event_viewer_data->tab), trace, "state");
d2cdf874 559 lttvwindowtraces_background_notify_queue(event_viewer_data,
560 trace,
561 ltt_time_infinite,
562 NULL,
563 background_ready_hook);
564 event_viewer_data->background_info_waiting++;
565 } else { /* in progress */
566
567 lttvwindowtraces_background_notify_current(event_viewer_data,
568 trace,
569 ltt_time_infinite,
570 NULL,
571 background_ready_hook);
572 event_viewer_data->background_info_waiting++;
573 }
574 } else {
7df20ca4 575 /* Data ready. By its nature, this viewer doesn't need to have
55046569 576 * its data ready hook called there, because a background
d2cdf874 577 * request is always linked with a redraw.
578 */
579 }
580
581 }
582
583 lttv_hooks_destroy(background_ready_hook);
d2cdf874 584}
585
8ce1db6f 586static gboolean
587header_size_allocate(GtkWidget *widget,
588 GtkAllocation *allocation,
589 gpointer user_data)
590{
591 EventViewerData *event_viewer_data = (EventViewerData*)user_data;
592
593 event_viewer_data->header_height = allocation->height;
594
595 return 0;
596}
597
598
cc41a00f 599void tree_v_set_cursor(EventViewerData *event_viewer_data)
682c6edb 600{
5df80e1b 601 g_debug("set cursor cb - do nothing");
49024c2c 602
682c6edb 603}
604
cc41a00f 605void tree_v_get_cursor(EventViewerData *event_viewer_data)
682c6edb 606{
5df80e1b 607 g_debug("get cursor cb - do nothing");
49024c2c 608
609
682c6edb 610}
611
540066bf 612/* Filter out the key repeats that come too fast */
613static gboolean key_handler(GtkWidget *widget, GdkEventKey *event,
614 gpointer user_data)
615{
616 EventViewerData *evd = (EventViewerData *)user_data;
617
618 g_debug("event time : %u , last time : %u", event->time,
619 evd->last_tree_update_time);
620
1b1c6755 621 if(guint32_before(event->time, evd->last_tree_update_time))
540066bf 622 return TRUE;
623 else
624 return FALSE;
625}
682c6edb 626
224446ce 627void tree_v_move_cursor_cb (GtkWidget *widget,
5df80e1b 628 GtkMovementStep stepType,
224446ce 629 gint arg2,
630 gpointer data)
fbbb2697 631{
9a366873 632
675f8f58 633 GtkTreePath *path; // = gtk_tree_path_new();
cc41a00f 634 EventViewerData *event_viewer_data = (EventViewerData*)data;
675f8f58 635
49024c2c 636 g_debug("move cursor cb");
6206a993 637 //gtk_tree_view_get_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v),
638 // &path, NULL);
639 //if(path == NULL)
640 //{
224446ce 641 /* No prior cursor, put it at beginning of page
642 * and let the execution do */
6206a993 643 // path = gtk_tree_path_new_from_indices(0, -1);
644 // gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v),
645 // path, NULL, FALSE);
646 //}
647
648 //indices = gtk_tree_path_get_indices(path);
649
650 //value = gtk_adjustment_get_value(event_viewer_data->vadjust_c);
efcd775d 651
652 /* If events request pending, do nothing*/
653 if(lttvwindow_events_request_pending(event_viewer_data->tab)) return;
6206a993 654
655 /* If no prior position... */
6206a993 656
9a366873 657
5df80e1b
YB
658 g_debug("tree view move cursor : stepType is %u and arg2 is %d",
659 (guint)stepType, arg2);
6206a993 660
5df80e1b 661 switch(stepType) {
6206a993 662 case GTK_MOVEMENT_DISPLAY_LINES:
663 if(arg2 == 1) {
664 /* Move one line down */
5df80e1b 665 LttvTracesetPosition *end_pos = 0;
6206a993 666 if(event_viewer_data->pos->len > 0) {
5df80e1b 667 end_pos =
9a366873 668 (LttvTracesetPosition*)g_ptr_array_index(
6206a993 669 event_viewer_data->pos,
6f43371e 670 event_viewer_data->pos->len-1);
5df80e1b
YB
671 }
672 if(!end_pos || lttv_traceset_position_compare(end_pos,
6206a993 673 event_viewer_data->currently_selected_position) == 0) {
674 /* Must get down one event and select the last one */
675 gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(
676 GTK_TREE_VIEW(event_viewer_data->tree_v)));
9d7e0c25 677 event_viewer_data->update_cursor = FALSE;
678 gtk_adjustment_set_value(event_viewer_data->vadjust_c,
679 gtk_adjustment_get_value(event_viewer_data->vadjust_c) + 1);
680 event_viewer_data->update_cursor = TRUE;
681 if(event_viewer_data->pos->len > 0) {
682 path = gtk_tree_path_new_from_indices(
683 max(0, event_viewer_data->pos->len - 1), -1);
684 if(path) {
685 gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v),
9a366873 686 path, NULL, FALSE);
9d7e0c25 687 gtk_tree_path_free(path);
688 }
689 }
690 }
5df80e1b 691
6206a993 692 } else {
5df80e1b
YB
693 LttvTracesetPosition *begin_pos = 0;
694
6206a993 695 if(event_viewer_data->pos->len > 0) {
696 /* Move one line up */
5df80e1b 697 begin_pos =
9a366873 698 (LttvTracesetPosition*)g_ptr_array_index(
5df80e1b
YB
699 event_viewer_data->pos,
700 0);
701 }
702 if(!begin_pos || lttv_traceset_position_compare(begin_pos,
703 event_viewer_data->currently_selected_position) == 0)
704
705
706 {
707 /* Must get up one event and select the first one */
708 gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(
709 GTK_TREE_VIEW(event_viewer_data->tree_v)));
710 event_viewer_data->update_cursor = FALSE;
711 gtk_adjustment_set_value(event_viewer_data->vadjust_c,
712 gtk_adjustment_get_value(event_viewer_data->vadjust_c) - 1);
713 event_viewer_data->update_cursor = TRUE;
714 if(event_viewer_data->pos->len > 0) {
715 path = gtk_tree_path_new_from_indices(
716 0, -1);
717 if(path) {
718 gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v),
719 path, NULL, FALSE);
720 gtk_tree_path_free(path);
721 }
722 }
723 }
724
6206a993 725 }
726 break;
727 case GTK_MOVEMENT_PAGES:
728 if(arg2 == 1) {
729 /* Move one page down */
5df80e1b 730 LttvTracesetPosition *end_pos = 0;
6206a993 731 if(event_viewer_data->pos->len > 0) {
5df80e1b 732 end_pos =
9a366873 733 (LttvTracesetPosition*)g_ptr_array_index(
6206a993 734 event_viewer_data->pos,
6f43371e 735 event_viewer_data->pos->len-1);
5df80e1b
YB
736 }
737 if(!end_pos || lttv_traceset_position_compare(end_pos,
6206a993 738 event_viewer_data->currently_selected_position) == 0) {
739 /* Must get down one page and select the last one */
740 gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(
741 GTK_TREE_VIEW(event_viewer_data->tree_v)));
9d7e0c25 742 event_viewer_data->update_cursor = FALSE;
743 gtk_adjustment_set_value(event_viewer_data->vadjust_c,
744 gtk_adjustment_get_value(event_viewer_data->vadjust_c) + 2);
745 event_viewer_data->update_cursor = TRUE;
746 if(event_viewer_data->pos->len > 0) {
747 path = gtk_tree_path_new_from_indices(
748 event_viewer_data->pos->len - 1, -1);
749 if(path) {
750 gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v),
751 path, NULL, FALSE);
752 gtk_tree_path_free(path);
753 }
754 }
755 }
6206a993 756 } else {
757 /* Move one page up */
5df80e1b
YB
758 LttvTracesetPosition *begin_pos = 0;
759
6206a993 760 if(event_viewer_data->pos->len > 0) {
5df80e1b 761 begin_pos =
9a366873 762 (LttvTracesetPosition*)g_ptr_array_index(
6206a993 763 event_viewer_data->pos,
764 0);
5df80e1b
YB
765 }
766 if(!begin_pos || lttv_traceset_position_compare(begin_pos,
6206a993 767 event_viewer_data->currently_selected_position) == 0) {
768 /* Must get up one page and select the first one */
769 gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(
770 GTK_TREE_VIEW(event_viewer_data->tree_v)));
9d7e0c25 771 event_viewer_data->update_cursor = FALSE;
772 gtk_adjustment_set_value(event_viewer_data->vadjust_c,
773 gtk_adjustment_get_value(event_viewer_data->vadjust_c) - 2);
774 event_viewer_data->update_cursor = TRUE;
775 if(event_viewer_data->pos->len > 0) {
776 path = gtk_tree_path_new_from_indices(
777 0, -1);
778 if(path) {
779 gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v),
780 path, NULL, FALSE);
781 gtk_tree_path_free(path);
782 }
783 }
784 }
6206a993 785 }
786 break;
787 default:
788 break;
789 }
6206a993 790 //gtk_tree_path_free(path);
8a949012 791
b26121f4 792}
793
b139ad2a 794static void filter_button (GtkToolButton *toolbutton,
795 gpointer user_data)
796{
797 LttvPluginEVD *plugin_evd = (LttvPluginEVD*)user_data;
798 LttvAttribute *attribute;
799 LttvAttributeValue value;
800 gboolean ret;
801 g_printf("Filter button clicked\n");
802
803 attribute = LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(
804 LTTV_IATTRIBUTE(lttv_global_attributes()),
805 LTTV_VIEWER_CONSTRUCTORS));
806 g_assert(attribute);
807
808 ret = lttv_iattribute_find_by_path(LTTV_IATTRIBUTE(attribute),
809 "guifilter", LTTV_POINTER, &value);
810 g_assert(ret);
811 lttvwindow_viewer_constructor constructor =
812 (lttvwindow_viewer_constructor)*(value.v_pointer);
813 if(constructor) constructor(&plugin_evd->parent);
814 else g_warning("Filter module not loaded.");
815
816 //FIXME : viewer returned.
817}
9d7e0c25 818
819gboolean tree_v_scroll_handler (GtkWidget *widget, GdkEventScroll *event, gpointer data)
820{
821 EventViewerData *event_viewer_data = (EventViewerData*) data;
9d7e0c25 822
823 switch(event->direction) {
824 case GDK_SCROLL_UP:
825 gtk_adjustment_set_value(event_viewer_data->vadjust_c,
826 gtk_adjustment_get_value(event_viewer_data->vadjust_c) - 1);
827 break;
828 case GDK_SCROLL_DOWN:
829 gtk_adjustment_set_value(event_viewer_data->vadjust_c,
830 gtk_adjustment_get_value(event_viewer_data->vadjust_c) + 1);
831 break;
5e96e7e3 832 default:
833 g_error("Only scroll up and down expected");
9d7e0c25 834 }
835 return TRUE;
836}
837
cc41a00f 838void tree_v_cursor_changed_cb (GtkWidget *widget, gpointer data)
b26121f4 839{
9a366873 840
cc41a00f 841 EventViewerData *event_viewer_data = (EventViewerData*) data;
9a366873 842
8ce1db6f 843 Tab *tab = event_viewer_data->tab;
675f8f58 844 GtkTreeIter iter;
cc41a00f 845 GtkTreeModel* model = GTK_TREE_MODEL(event_viewer_data->store_m);
675f8f58 846 GtkTreePath *path;
9a366873 847 LttvTracesetPosition *pos;
5290ec02 848
49024c2c 849 g_debug("cursor changed cb");
9a366873 850
675f8f58 851 /* On cursor change, modify the currently selected event by calling
852 * the right API function */
79735ac2 853 if(event_viewer_data->report_position) {
9d7e0c25 854 if(event_viewer_data->pos->len > 0) {
855 gtk_tree_view_get_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v),
856 &path, NULL);
857 if(path) {
858 if(gtk_tree_model_get_iter(model,&iter,path)){
859 gtk_tree_model_get(model, &iter, POSITION_COLUMN, &pos, -1);
860
9a366873 861 if(lttv_traceset_position_compare(pos,
5df80e1b 862 event_viewer_data->currently_selected_position) != 0) {
9d7e0c25 863 lttvwindow_report_current_position(tab, pos);
5df80e1b 864 }
9d7e0c25 865 }else{
866 g_warning("Can not get iter\n");
867 }
868 gtk_tree_path_free(path);
869 }
870 }
871 }
49024c2c 872}
873
52548e33 874
49024c2c 875static void tree_selection_changed_cb (GtkTreeSelection *selection,
876 gpointer data)
877{
5df80e1b
YB
878 g_debug("tree sel changed cb - do nothing");
879
fb3d6047 880
b26121f4 881}
882
540066bf 883#if 0
884static gint key_snooper(GtkWidget *grab_widget, GdkEventKey *event,
885 gpointer func_data)
886{
887 return TRUE;
888}
889#endif //0
49024c2c 890
891/* This callback may be recalled after a step up/down, but we don't want to lose
892 * the exact position : what we do is that we only set the value if it has
893 * changed : a step up/down that doesn't change the time value of the first
894 * event won't trigger a scrollbar change. */
895
b26121f4 896void v_scroll_cb (GtkAdjustment *adjustment, gpointer data)
897{
cc41a00f 898 EventViewerData *event_viewer_data = (EventViewerData*)data;
49024c2c 899 g_debug("SCROLL begin");
900 g_debug("SCROLL values : %g , %g, %g",
901 adjustment->value, event_viewer_data->previous_value,
902 (adjustment->value - event_viewer_data->previous_value));
903
904 LttTime new_time_off = ltt_time_from_double(adjustment->value);
905 LttTime old_time_off = ltt_time_from_double(event_viewer_data->previous_value);
906 g_debug("SCROLL time values %lu.%lu, %lu.%lu", new_time_off.tv_sec,
907 new_time_off.tv_nsec, old_time_off.tv_sec, old_time_off.tv_nsec);
908 /* If same value : nothing to update */
909 if(ltt_time_compare(new_time_off, old_time_off) == 0)
910 return;
911
912 //LttTime old_time = event_viewer_data->first_event;
913
540066bf 914
915 //gint snoop = gtk_key_snooper_install(key_snooper, NULL);
916
5df80e1b 917 adjust_event_viewer(adjustment->value, event_viewer_data);
540066bf 918
919 //gtk_key_snooper_remove(snoop);
5df80e1b 920
49024c2c 921 g_debug("SCROLL end");
fbbb2697 922}
fcdf0ec2 923
54d8f654 924static __inline gint get_cell_height(GtkTreeView *TreeView)
6601bf27 925{
eb6b1024 926 gint height;
cc41a00f 927 GtkTreeViewColumn *column = gtk_tree_view_get_column(TreeView, 0);
675f8f58 928
cc41a00f 929 gtk_tree_view_column_cell_get_size(column, NULL, NULL, NULL, NULL, &height);
675f8f58 930
6871f7d1 931 gint vertical_separator;
932 gtk_widget_style_get (GTK_WIDGET (TreeView),
933 "vertical-separator", &vertical_separator,
934 NULL);
935
936 height += vertical_separator;
7a336641 937
675f8f58 938 return height;
6601bf27 939}
940
cc41a00f 941void tree_v_size_allocate_cb (GtkWidget *widget, GtkAllocation *alloc, gpointer data)
fbbb2697 942{
cc41a00f 943 EventViewerData *event_viewer_data = (EventViewerData*)data;
944 gint cell_height = get_cell_height(GTK_TREE_VIEW(event_viewer_data->tree_v));
945 gint last_num_visible_events = event_viewer_data->num_visible_events;
946 gdouble exact_num_visible;
675f8f58 947
cc41a00f 948 exact_num_visible = ( alloc->height -
8ce1db6f 949 event_viewer_data->header_height )
950 / (double)cell_height ;
675f8f58 951
cc41a00f 952 event_viewer_data->num_visible_events = ceil(exact_num_visible) ;
9a366873 953
cc41a00f 954 event_viewer_data->vadjust_c->page_increment =
9a366873 955 floor(exact_num_visible);
cc41a00f 956 event_viewer_data->vadjust_c->page_size =
9a366873
FD
957 floor(exact_num_visible);
958
b72d54c9 959
fb3d6047 960 g_debug("size allocate %p : last_num_visible_events : %d",
961 event_viewer_data, last_num_visible_events);
43ed82b5 962 g_debug("num_visible_events : %d, value %f",
fb3d6047 963 event_viewer_data->num_visible_events,
964 event_viewer_data->vadjust_c->value);
965
966 if(event_viewer_data->num_visible_events != last_num_visible_events) {
5df80e1b
YB
967 //TODO ybrosseau do a proper initialisation here, so we can use the redraw
968 adjust_event_viewer(event_viewer_data->vadjust_c->value, event_viewer_data);
969 //redraw(event_viewer_data);
fb3d6047 970 }
675f8f58 971
6601bf27 972
fbbb2697 973}
974
cc41a00f 975void tree_v_size_request_cb (GtkWidget *widget, GtkRequisition *requisition, gpointer data)
fbbb2697 976{
675f8f58 977 gint h;
cc41a00f 978 EventViewerData *event_viewer_data = (EventViewerData*)data;
979 gint cell_height = get_cell_height(GTK_TREE_VIEW(event_viewer_data->tree_v));
8a949012 980
8ce1db6f 981 h = cell_height + event_viewer_data->header_height;
675f8f58 982 requisition->height = h;
8a949012 983
fcdf0ec2 984}
985
fb3d6047 986static gboolean events_check_handler(guint count, gboolean *stop_flag,
987 gpointer data)
04f2543e 988{
fb3d6047 989 EventViewerData *evd = (EventViewerData*)data;
04f2543e 990 if(count % CHECK_GDK_INTERVAL == 0) {
fb3d6047 991 GdkEvent *event;
992 GtkWidget *widget;
993 while((event = gdk_event_get()) != NULL) {
994 widget = gtk_get_event_widget(event);
995 if(widget ==
996 lookup_widget(main_window_get_widget(evd->tab),
80f2ed12 997 "StopProcessingButton")
998 || widget == evd->vscroll_vc) {
fb3d6047 999 gtk_main_do_event(event);
1000 gdk_window_process_all_updates();
1001 }
1002 gdk_event_free(event);
1003 }
04f2543e 1004 if(*stop_flag)
1005 return TRUE;
1006 else
1007 return FALSE;
d20f7ef6 1008 } else return FALSE;
04f2543e 1009}
8ce1db6f 1010
5df80e1b
YB
1011
1012/* This function will adjust the first event position for the viewer which
1013 will be used by the redraw to seek and display all the events
1014 */
1015static void adjust_event_viewer(double new_value, EventViewerData *event_viewer_data)
b26121f4 1016{
9a366873 1017#ifdef BABEL_CLEANUP
5290ec02 1018 LttvTracesetStats *tss =
1019 lttvwindow_get_traceset_stats(event_viewer_data->tab);
9a366873
FD
1020#endif //babel_cleanup
1021 LttvTraceset *ts = lttvwindow_get_traceset(event_viewer_data->tab);
5df80e1b 1022
49024c2c 1023 gboolean seek_by_time;
9a366873 1024
efada953 1025 if(lttvwindow_preempt_count > 0) return;
04f2543e 1026
5290ec02 1027 double value = new_value - event_viewer_data->previous_value;
9a366873 1028
5698740e 1029 /* Set stop button status for foreground processing */
1030 event_viewer_data->tab->stop_foreground = FALSE;
3c456a8a 1031 lttvwindow_events_request_disable();
5698740e 1032
5290ec02 1033 /* See where we have to scroll... */
1034 ScrollDirection direction;
1035 gint relative_position;
1036
d2cdf874 1037 if(value < -0.8) {
5290ec02 1038 if(value >= -1.0) direction = SCROLL_STEP_UP;
1039 else {
1040 if(value >= -2.0) direction = SCROLL_PAGE_UP;
eb6b1024 1041 else direction = SCROLL_JUMP;
8a949012 1042 }
d2cdf874 1043 } else if(value > 0.8) {
5290ec02 1044 if(value <= 1.0) direction = SCROLL_STEP_DOWN;
b72d54c9 1045 else {
5290ec02 1046 if(value <= 2.0) direction = SCROLL_PAGE_DOWN;
1047 else direction = SCROLL_JUMP;
8a949012 1048 }
5290ec02 1049 } else direction = SCROLL_NONE; /* 0.0 */
5df80e1b 1050
5290ec02 1051 switch(direction) {
1052 case SCROLL_STEP_UP:
5df80e1b 1053 g_debug("adjust_event_viewer : SCROLL_STEP_UP");
5290ec02 1054 relative_position = -1;
49024c2c 1055 seek_by_time = 0;
8a949012 1056 break;
5290ec02 1057 case SCROLL_STEP_DOWN:
5df80e1b 1058 g_debug("adjust_event_viewer : SCROLL_STEP_DOWN");
5290ec02 1059 relative_position = 1;
49024c2c 1060 seek_by_time = 0;
5290ec02 1061 break;
1062 case SCROLL_PAGE_UP:
5df80e1b 1063 g_debug("adjust_event_viewer : SCROLL_PAGE_UP");
5290ec02 1064 relative_position = -(event_viewer_data->num_visible_events);
49024c2c 1065 seek_by_time = 0;
5290ec02 1066 break;
1067 case SCROLL_PAGE_DOWN:
5df80e1b 1068 g_debug("adjust_event_viewer : SCROLL_PAGE_DOWN");
5290ec02 1069 relative_position = event_viewer_data->num_visible_events;
49024c2c 1070 seek_by_time = 0;
5290ec02 1071 break;
1072 case SCROLL_JUMP:
5df80e1b 1073 g_debug("adjust_event_viewer : SCROLL_JUMP");
43ed82b5 1074 relative_position = 0;
49024c2c 1075 seek_by_time = 1;
5290ec02 1076 break;
1077 case SCROLL_NONE:
5df80e1b 1078 g_debug("adjust_event_viewer : SCROLL_NONE");
49024c2c 1079 relative_position = 0;
1080 seek_by_time = 0;
5290ec02 1081 break;
1082 }
675f8f58 1083
5290ec02 1084 LttTime time = ltt_time_from_double(new_value);
9a366873
FD
1085 TimeInterval time_span = lttv_traceset_get_time_span_real(ts);
1086 time = ltt_time_add(time_span.start_time, time);
1087
1088 LttvTracesetPosition *timePos = lttv_traceset_create_time_position(ts,time);
1089
675f8f58 1090
49024c2c 1091 if(!seek_by_time) {
9a366873 1092
aaecaa99 1093 /* Remember the beginning position */
5290ec02 1094 if(event_viewer_data->pos->len > 0) {
9a366873
FD
1095
1096 if(relative_position != 0)
1097 {
1098 LttvTracesetPosition *pos = 0;
1099 pos = (LttvTracesetPosition*)g_ptr_array_index(
1100 event_viewer_data->pos,
1101 0);
58b4e4ae 1102 lttv_state_traceset_seek_position(ts,pos);
aaecaa99 1103 }
58b4e4ae
YB
1104 } else {
1105 lttv_state_traceset_seek_time(ts,time);
1106
1107 }
9a366873 1108
5290ec02 1109 /* Note that, as we mess with the tsc position, this function CANNOT be called
1110 * from a hook inside the lttv_process_traceset_middle. */
1111 /* As the lttvwindow API keeps a sync_position inside the tsc to go back at
1112 * the right spot after being interrupted, it's ok to change the tsc position,
1113 * as long as we do not touch the sync_position. */
675f8f58 1114
5290ec02 1115 /* Get the beginning position of the read (with seek backward or seek forward)
1116 */
1117 if(relative_position > 0) {
9a366873 1118 lttv_process_traceset_seek_n_forward(ts, relative_position,
b139ad2a 1119 events_check_handler,
1120 &event_viewer_data->tab->stop_foreground,
1121 event_viewer_data->main_win_filter,
fb3d6047 1122 event_viewer_data->filter, NULL, event_viewer_data);
49024c2c 1123 } else if(relative_position < 0) {
e80eae6d 1124 /* Get an idea of currently shown event dispersion */
9a366873
FD
1125 guint64 first_event_time_stamp =
1126 lttv_traceset_position_get_timestamp(event_viewer_data->first_event);
1127 guint64 last_event_time_stamp =
1128 lttv_traceset_position_get_timestamp(event_viewer_data->last_event);
1129 guint64 timeSpan = (last_event_time_stamp - first_event_time_stamp);
1130 gdouble ratio = (gdouble)timeSpan / (gdouble)event_viewer_data->num_visible_events;
1131 if(ratio <= 0){
1132 ratio = SEEK_BACK_DEFAULT_RATIO;
1133 }
1134
1135 lttv_process_traceset_seek_n_backward(ts,
1136 (guint)abs(relative_position),
1137 ratio,
04f2543e 1138 events_check_handler,
b139ad2a 1139 &event_viewer_data->tab->stop_foreground,
1140 event_viewer_data->main_win_filter,
fb3d6047 1141 event_viewer_data->filter, NULL, event_viewer_data);
49024c2c 1142 } /* else 0 : do nothing : we are already at the beginning position */
682c6edb 1143
0bb72393 1144 /* Save the first event position */
9a366873 1145
68573dd0 1146 event_viewer_data->first_event = lttv_traceset_create_current_position(ts);
9a366873
FD
1147
1148 time = ltt_time_from_uint64(lttv_traceset_position_get_timestamp(
1149 event_viewer_data->first_event));
7cf3c9f3 1150 //if(ltt_time_compare(time, tsc->time_span.end_time) > 0)
1151 // time = tsc->time_span.end_time;
1152
9a366873 1153 LttTime time_val = ltt_time_sub(time,time_span.start_time);
0bb72393 1154 event_viewer_data->previous_value = ltt_time_to_double(time_val);
9a366873 1155
0bb72393 1156
5290ec02 1157 } else {
1158 /* Seek by time */
9a366873
FD
1159
1160 LttTime time_val = ltt_time_sub(time,time_span.start_time);
0bb72393 1161 event_viewer_data->previous_value = ltt_time_to_double(time_val);
9a366873 1162 event_viewer_data->first_event = timePos;
5290ec02 1163 }
5df80e1b
YB
1164 lttvwindow_events_request_enable();
1165
1166 redraw(event_viewer_data);
1167}
1168
1169static void redraw(EventViewerData *event_viewer_data) {
1170 guint i;
1171 LttvTraceset *ts = lttvwindow_get_traceset(event_viewer_data->tab);
1172
1173 g_debug("EventViewer redraw");
1174
1175 //TODO ybrosseau verify its still required
1176 lttvwindow_events_request_disable();
1177
1178
49024c2c 1179 /* Clear the model (don't forget to free the TCS positions!) */
1180 gtk_list_store_clear(event_viewer_data->store_m);
1181 for(i=0;i<event_viewer_data->pos->len;i++) {
9a366873
FD
1182 LttvTracesetPosition *cur_pos =
1183 (LttvTracesetPosition*)g_ptr_array_index(event_viewer_data->pos,
49024c2c 1184 i);
9a366873 1185 lttv_traceset_destroy_position(cur_pos);
49024c2c 1186 }
1187 g_ptr_array_set_size(event_viewer_data->pos, 0);
1188
5df80e1b 1189 lttv_state_traceset_seek_position(ts, event_viewer_data->first_event);
49024c2c 1190
5290ec02 1191 /* Mathieu :
dfb5dd45 1192 * I make the choice not to use the mainwindow lttvwindow API here : the idle
1193 * loop might have a too low priority, and we want good update while
5698740e 1194 * scrolling. However, we call the gdk loop to get events periodically so the
1195 * processing can be stopped.
5290ec02 1196 */
0bb72393 1197
9a366873
FD
1198 lttv_process_traceset_begin(ts,
1199 NULL, NULL, event_viewer_data->event_hooks);
5698740e 1200
1201 event_viewer_data->num_events = 0;
675f8f58 1202
9a366873 1203 lttv_process_traceset_middle(ts, ltt_time_infinite, G_MAXUINT, NULL);
5290ec02 1204
9a366873 1205 lttv_process_traceset_end(ts, NULL, NULL, event_viewer_data->event_hooks);
675f8f58 1206
e80eae6d 1207 /* Get the end position */
49024c2c 1208 if(event_viewer_data->pos->len > 0) {
9a366873
FD
1209 LttvTracesetPosition *cur_pos =
1210 (LttvTracesetPosition*)g_ptr_array_index(event_viewer_data->pos,
49024c2c 1211 event_viewer_data->pos->len - 1);
9a366873 1212 event_viewer_data->last_event = cur_pos;
49024c2c 1213 } else
68573dd0 1214 event_viewer_data->last_event =lttv_traceset_create_current_position(ts);
9a366873 1215
49024c2c 1216 gtk_adjustment_set_value(event_viewer_data->vadjust_c,
1217 event_viewer_data->previous_value);
1218
0bb72393 1219 //g_signal_emit_by_name(G_OBJECT (event_viewer_data->select_c),
1220 // "changed");
49024c2c 1221
540066bf 1222 event_viewer_data->last_tree_update_time =
1223 gdk_x11_get_server_time(
1224 gtk_widget_get_parent_window(event_viewer_data->tree_v));
49024c2c 1225
3c456a8a 1226 lttvwindow_events_request_enable();
9a366873 1227
5290ec02 1228 return;
fbbb2697 1229}
8ce1db6f 1230
f1d41644 1231
5290ec02 1232int event_hook(void *hook_data, void *call_data)
fbbb2697 1233{
9a366873 1234
5290ec02 1235 EventViewerData *event_viewer_data = (EventViewerData*)hook_data;
9a366873
FD
1236
1237 LttvEvent * e = (LttvEvent *)call_data;
19e250a0 1238
5698740e 1239 if(event_viewer_data->num_events % CHECK_GDK_INTERVAL == 0) {
fb3d6047 1240 GdkEvent *event;
1241 GtkWidget *widget;
1242 while((event = gdk_event_get()) != NULL) {
1243 widget = gtk_get_event_widget(event);
1244 if(widget ==
1245 lookup_widget(main_window_get_widget(event_viewer_data->tab),
80f2ed12 1246 "StopProcessingButton")
1247 || widget == event_viewer_data->vscroll_vc) {
fb3d6047 1248 gtk_main_do_event(event);
1249 gdk_window_process_all_updates();
1250 }
1251 gdk_event_free(event);
1252 }
1253 //gtk_main_iteration_do(FALSE);
5698740e 1254 if(event_viewer_data->tab->stop_foreground)
1255 return TRUE;
1256 }
9a366873 1257
3c456a8a 1258 event_viewer_data->num_events++;
9a366873 1259#ifdef BABEL_CLEANUP
a998b781 1260 LttvFilter *filter = event_viewer_data->main_win_filter;
19e250a0 1261 if(filter != NULL && filter->head != NULL)
1262 if(!lttv_filter_tree_parse(filter->head,e,tfc->tf,
b6ef18af 1263 tfc->t_context->t,tfc,NULL,NULL))
19e250a0 1264 return FALSE;
1265
b139ad2a 1266 filter = event_viewer_data->filter;
1267 if(filter != NULL && filter->head != NULL)
1268 if(!lttv_filter_tree_parse(filter->head,e,tfc->tf,
b6ef18af 1269 tfc->t_context->t,tfc,NULL,NULL))
b139ad2a 1270 return FALSE;
9a366873
FD
1271#endif //babel_cleanup
1272
dd455fb8 1273// LttFacility *facility = ltt_event_facility(e);
1274// LttEventType *event_type = ltt_event_eventtype(e);
9a366873
FD
1275 LttTime time = lttv_event_get_timestamp(e);
1276 gint cpu = lttv_traceset_get_cpuid_from_event(e);
1277
1278 LttvTraceState *traceState = e->state;
1279 LttvProcessState *process = traceState->running_process[cpu];
5290ec02 1280
5290ec02 1281 GtkTreeIter iter;
675f8f58 1282
5290ec02 1283 GString *desc = g_string_new("");
6db3427f 1284 GString *name = g_string_new("");
19e250a0 1285
68573dd0 1286 LttvTracesetPosition *pos = lttv_traceset_create_current_position(traceState->trace->traceset);
fbbb2697 1287
6db3427f
FD
1288 lttv_event_to_string(e, desc, TRUE, FALSE);
1289 lttv_event_get_name(e,name);
fbbb2697 1290
1835cc5d 1291 g_info("detail : %s", desc->str);
9a366873 1292
5290ec02 1293 gtk_list_store_append (event_viewer_data->store_m, &iter);
9a366873 1294
5290ec02 1295 gtk_list_store_set (event_viewer_data->store_m, &iter,
8284135e 1296 TRACE_NAME_COLUMN, traceState->trace->short_name,
9a366873 1297 CPUID_COLUMN, cpu,
6db3427f 1298 EVENT_COLUMN,name->str,
9a366873
FD
1299 TIME_S_COLUMN, time.tv_sec,
1300 TIME_NS_COLUMN, time.tv_nsec,
1301 PID_COLUMN, process->pid,
1302 EVENT_DESCR_COLUMN, desc->str,
1303 POSITION_COLUMN, pos,
1304 -1);
ed3b99b6 1305
5290ec02 1306 g_ptr_array_add(event_viewer_data->pos, pos);
a8c0f09d 1307
5290ec02 1308 g_string_free(desc, TRUE);
6db3427f 1309 g_string_free(name, TRUE);
5290ec02 1310
dfb5dd45 1311 if(event_viewer_data->update_cursor) {
9a366873 1312 if(lttv_traceset_position_compare(pos,
dfb5dd45 1313 event_viewer_data->currently_selected_position) == 0) {
1314 GtkTreePath *path = gtk_tree_path_new_from_indices(
1315 event_viewer_data->pos->len - 1, -1);
9d7e0c25 1316 if(path) {
1317 gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v),
1318 path, NULL, FALSE);
1319 gtk_tree_path_free(path);
1320 }
dfb5dd45 1321 }
1193dd68 1322 }
6f43371e 1323 if(event_viewer_data->pos->len >= event_viewer_data->num_visible_events )
5290ec02 1324 return TRUE;
1325 else
1326 return FALSE;
9a366873 1327
a8c0f09d 1328}
1329
1330
5290ec02 1331
1193dd68 1332static void event_update_selection(EventViewerData *event_viewer_data)
1333{
9a366873 1334
1193dd68 1335 guint i;
1336 GPtrArray *positions = event_viewer_data->pos;
ffd088ef 1337 g_info("event_update_selection");
c73ce169
FD
1338
1339 int isFound = FALSE;
1340
1193dd68 1341
1342 for(i=0;i<positions->len;i++) {
9a366873
FD
1343 LttvTracesetPosition *cur_pos =
1344 (LttvTracesetPosition*)g_ptr_array_index(positions, i);
1345 if(lttv_traceset_position_compare(cur_pos,
1193dd68 1346 event_viewer_data->currently_selected_position) == 0) {
1347 GtkTreePath *path = gtk_tree_path_new_from_indices(i, -1);
9d7e0c25 1348 if(path) {
1349 gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v),
1350 path, NULL, FALSE);
88bf15f0 1351 gtk_widget_grab_focus(event_viewer_data->tree_v );
9d7e0c25 1352 gtk_tree_path_free(path);
c73ce169 1353 isFound = TRUE;
9a366873
FD
1354 break;
1355 }
1193dd68 1356 }
9a366873 1357 }
c73ce169
FD
1358 if(isFound){
1359 return;
1360 }
1361 /* If the current selection is not in the currently displayed events*/
1362 LttTime currentTime = lttv_traceset_position_get_time(
1363 event_viewer_data->currently_selected_position);
1364 LttTime time;
1365
1366 LttvTraceset * ts = lttvwindow_get_traceset(event_viewer_data->tab);
1367 TimeInterval time_span = lttv_traceset_get_time_span_real(ts);
1368 time = ltt_time_sub(currentTime, time_span.start_time);
1369 gtk_adjustment_set_value(event_viewer_data->vadjust_c,
1370 ltt_time_to_double(time));
1371 gtk_widget_grab_focus(event_viewer_data->tree_v );
1372
1193dd68 1373}
5df80e1b 1374#ifdef BABEL_CLEANUP
2df7f94b 1375static int current_time_get_first_event_hook(void *hook_data, void *call_data)
1376{
5df80e1b 1377
2df7f94b 1378 EventViewerData *event_viewer_data = (EventViewerData*)hook_data;
9a366873 1379
2df7f94b 1380 LttvTracefileContext *tfc = (LttvTracefileContext*)call_data;
1381 LttEvent *e = ltt_tracefile_get_event(tfc->tf);
1382
1383 LttvFilter *filter = event_viewer_data->main_win_filter;
1384 if(filter != NULL && filter->head != NULL)
1385 if(!lttv_filter_tree_parse(filter->head,e,tfc->tf,
b6ef18af 1386 tfc->t_context->t,tfc,NULL,NULL))
2df7f94b 1387 return FALSE;
1388
b139ad2a 1389 filter = event_viewer_data->filter;
1390 if(filter != NULL && filter->head != NULL)
1391 if(!lttv_filter_tree_parse(filter->head,e,tfc->tf,
b6ef18af 1392 tfc->t_context->t,tfc,NULL,NULL))
b139ad2a 1393 return FALSE;
1394
2df7f94b 1395 lttv_traceset_context_position_save(tfc->t_context->ts_context,
1396 event_viewer_data->current_time_get_first);
1397 return TRUE;
5df80e1b 1398
9a366873 1399
2df7f94b 1400}
5df80e1b 1401#endif // BABEL_CLEANUP
675f8f58 1402
cc41a00f 1403gboolean update_current_time(void * hook_data, void * call_data)
675f8f58 1404{
9a366873
FD
1405
1406 //LttvEvent * e = (LttvEvent *)call_data;
ffd088ef 1407 g_info("update_current_time");
cc41a00f 1408 EventViewerData *event_viewer_data = (EventViewerData*) hook_data;
9a366873 1409
224446ce 1410 const LttTime * current_time = (LttTime*)call_data;
88bf15f0 1411 LttvTraceset * ts = lttvwindow_get_traceset(event_viewer_data->tab);
5290ec02 1412
49024c2c 1413 /* If the currently selected event time != current time, set the first event
1414 * with this time as currently selected. */
9a366873
FD
1415 LttTime pos_time = lttv_traceset_position_get_time(
1416 event_viewer_data->currently_selected_position);
1417
49024c2c 1418 if(ltt_time_compare(pos_time, *current_time) != 0) {
9a366873 1419 /*create position*/
5df80e1b
YB
1420 //LttvTracesetPosition *currentPosition =
1421 // lttv_traceset_create_time_position(ts,*current_time );
9a366873 1422 /*seek to current position*/
58b4e4ae 1423 lttv_state_traceset_seek_time(ts, *current_time);
9a366873 1424
5df80e1b
YB
1425 event_viewer_data->currently_selected_position =
1426 lttv_traceset_create_current_position(ts);
1427 g_debug("update_current_time: %p %d", event_viewer_data->currently_selected_position, event_viewer_data->currently_selected_position->timestamp);
49024c2c 1428 }
c46519c8 1429
15894378 1430 event_viewer_data->report_position = FALSE;
9a366873 1431
15894378 1432 /* Simply update the current time : it is in the list */
9a366873 1433 event_update_selection(event_viewer_data);
15894378 1434 event_viewer_data->report_position = TRUE;
1193dd68 1435
49024c2c 1436 return FALSE;
1437}
1438
1439gboolean update_current_position(void * hook_data, void * call_data)
1440{
9a366873 1441
ffd088ef 1442 g_info("update_current_position");
49024c2c 1443 EventViewerData *event_viewer_data = (EventViewerData*) hook_data;
9a366873 1444 const LttvTracesetPosition *current_pos = (LttvTracesetPosition*)call_data;
49024c2c 1445
9a366873 1446 if(lttv_traceset_position_compare(
49024c2c 1447 event_viewer_data->currently_selected_position, current_pos) != 0) {
5df80e1b 1448 g_debug("Update current pos: %p, %d", current_pos, current_pos->timestamp);
9a366873 1449 event_viewer_data->currently_selected_position = current_pos;
1193dd68 1450 /* Simply update the current time : it is in the list */
1451 event_update_selection(event_viewer_data);
49024c2c 1452 }
675f8f58 1453 return FALSE;
9a366873 1454
675f8f58 1455}
1456
1e3594a3
YB
1457gboolean timespan_changed(void * hook_data, void * call_data)
1458{
9a366873 1459
1e3594a3 1460 EventViewerData *event_viewer_data = (EventViewerData*) hook_data;
9a366873 1461 LttvTraceset * ts = lttvwindow_get_traceset(event_viewer_data->tab);
8924e3e4 1462 TimeInterval time_span = lttv_traceset_get_time_span_real(ts);
1e3594a3
YB
1463
1464 LttTime end;
49024c2c 1465
1e3594a3
YB
1466 end = ltt_time_sub(time_span.end_time, time_span.start_time);
1467 event_viewer_data->vadjust_c->upper = ltt_time_to_double(end);
1468
1469 if(event_viewer_data->pos->len < event_viewer_data->num_visible_events ) {
1470
1471
5df80e1b 1472 redraw(event_viewer_data);
1e3594a3
YB
1473
1474 request_background_data(event_viewer_data);
1475 }
1476 return FALSE;
1477}
49024c2c 1478
a8c0f09d 1479gboolean traceset_changed(void * hook_data, void * call_data)
1480{
9a366873 1481
a8c0f09d 1482 EventViewerData *event_viewer_data = (EventViewerData*) hook_data;
9a366873 1483 LttvTraceset * ts = lttvwindow_get_traceset(event_viewer_data->tab);
8924e3e4 1484 TimeInterval time_span = lttv_traceset_get_time_span_real(ts);
9a366873 1485
b9a010a2 1486 LttTime end;
a8c0f09d 1487 gtk_list_store_clear(event_viewer_data->store_m);
5290ec02 1488 g_ptr_array_set_size(event_viewer_data->pos, 0);
9a366873 1489
b9a010a2 1490 end = ltt_time_sub(time_span.end_time, time_span.start_time);
c74e0cf9 1491 event_viewer_data->vadjust_c->upper = ltt_time_to_double(end);
9a366873 1492#ifdef BABEL_CLEANUP
4249a3e8 1493 /* Reset the positions */
9a366873
FD
1494 lttv_traceset_destroy_position(event_viewer_data->currently_selected_position);
1495 lttv_traceset_destroy_position(event_viewer_data->first_event);
1496 lttv_traceset_destroy_position(event_viewer_data->last_event);
88bf15f0 1497
4249a3e8 1498 event_viewer_data->currently_selected_position =
68573dd0 1499 lttv_traceset_create_current_position(ts);
4249a3e8 1500 event_viewer_data->first_event =
68573dd0 1501 lttv_traceset_create_current_position(ts);
4249a3e8 1502 event_viewer_data->last_event =
68573dd0 1503 lttv_traceset_create_current_position(ts);
4249a3e8 1504
5df80e1b 1505 redraw(event_viewer_data);
88bf15f0 1506
9a366873 1507#endif //babel_cleanup
a8c0f09d 1508 // event_viewer_data->vadjust_c->value = 0;
1509
fadb18a9 1510 request_background_data(event_viewer_data);
9a366873 1511
a8c0f09d 1512 return FALSE;
1513}
1514
a998b781 1515gboolean filter_changed(void * hook_data, void * call_data)
1516{
1517 EventViewerData *event_viewer_data = (EventViewerData*) hook_data;
a998b781 1518
1519 event_viewer_data->main_win_filter =
1520 (LttvFilter*)call_data;
5df80e1b 1521 redraw(event_viewer_data);
a998b781 1522
1523 return FALSE;
1524}
1525
a8c0f09d 1526
b139ad2a 1527gint evd_redraw_notify(void *hook_data, void *call_data)
d2cdf874 1528{
1529 EventViewerData *event_viewer_data = (EventViewerData*) hook_data;
8a949012 1530
5df80e1b 1531 redraw(event_viewer_data);
5e96e7e3 1532 return 0;
d2cdf874 1533}
682c6edb 1534
b139ad2a 1535void gui_events_free(gpointer data)
202f6c8f 1536{
9a366873 1537#ifdef BABEL_CLEANUP
b139ad2a 1538 LttvPluginEVD *plugin_evd = (LttvPluginEVD*)data;
1539 Tab *tab = plugin_evd->evd->tab;
1540 EventViewerData *event_viewer_data = plugin_evd->evd;
5290ec02 1541 guint i;
1542
b139ad2a 1543 lttv_filter_destroy(plugin_evd->evd->filter);
1544
1545 if(tab != NULL){
5290ec02 1546 lttv_hooks_remove(event_viewer_data->event_hooks,event_hook);
1547 lttv_hooks_destroy(event_viewer_data->event_hooks);
1548
1549 for(i=0;i<event_viewer_data->pos->len;i++) {
1550 LttvTracesetContextPosition *cur_pos =
1551 (LttvTracesetContextPosition*)g_ptr_array_index(event_viewer_data->pos,
1552 i);
1553 lttv_traceset_context_position_destroy(cur_pos);
1554 }
49024c2c 1555 lttv_traceset_context_position_destroy(
1556 event_viewer_data->currently_selected_position);
1557 lttv_traceset_context_position_destroy(
1558 event_viewer_data->first_event);
1559 lttv_traceset_context_position_destroy(
1560 event_viewer_data->last_event);
5290ec02 1561 g_ptr_array_free(event_viewer_data->pos, TRUE);
1562
1563 lttvwindow_unregister_current_time_notify(tab,
1564 update_current_time, event_viewer_data);
49024c2c 1565 lttvwindow_unregister_current_position_notify(tab,
1566 update_current_position, event_viewer_data);
5290ec02 1567 //lttvwindow_unregister_show_notify(tab,
1568 // show_event_detail, event_viewer_data);
1569 lttvwindow_unregister_traceset_notify(tab,
1570 traceset_changed, event_viewer_data);
68764dff 1571 lttvwindow_unregister_timespan_notify(tab,
1e3594a3 1572 timespan_changed,event_viewer_data);
a998b781 1573 lttvwindow_unregister_filter_notify(tab,
1574 filter_changed, event_viewer_data);
d2cdf874 1575 lttvwindow_unregister_redraw_notify(tab,
b139ad2a 1576 evd_redraw_notify, event_viewer_data);
efbd5182 1577
675f8f58 1578 }
b139ad2a 1579 lttvwindowtraces_background_notify_remove(event_viewer_data);
1580
1581 g_event_viewer_data_list = g_slist_remove(g_event_viewer_data_list,
1582 event_viewer_data);
1583 //g_free(event_viewer_data);
1584 g_object_unref(plugin_evd);
9a366873 1585#endif // BABEL_CLEANUP
675f8f58 1586}
682c6edb 1587
675f8f58 1588
682c6edb 1589
b139ad2a 1590void gui_events_destructor(gpointer data)
a60b01ef 1591{
b139ad2a 1592 LttvPluginEVD *plugin_evd = (LttvPluginEVD*)data;
5290ec02 1593 /* May already been done by GTK window closing */
b139ad2a 1594 if(GTK_IS_WIDGET(plugin_evd->parent.top_widget)){
1595 gtk_widget_destroy(plugin_evd->parent.top_widget);
a60b01ef 1596 }
b671bb09 1597}
1598
682c6edb 1599
c46519c8 1600
08b1c66e 1601/**
1602 * plugin's init function
1603 *
1604 * This function initializes the Event Viewer functionnality through the
1605 * gtkTraceSet API.
1606 */
1607static void init() {
1608
e025a729 1609 lttvwindow_register_constructor("guievents",
1610 "/",
8ce1db6f 1611 "Insert Event Viewer",
1612 hGuiEventsInsert_xpm,
1613 "Insert Event Viewer",
1614 h_gui_events);
08b1c66e 1615}
1616
1617void event_destroy_walk(gpointer data, gpointer user_data)
1618{
b139ad2a 1619 gui_events_destructor((LttvPluginEVD*)data);
08b1c66e 1620}
1621
1622/**
1623 * plugin's destroy function
1624 *
1625 * This function releases the memory reserved by the module and unregisters
1626 * everything that has been registered in the gtkTraceSet API.
1627 */
1628static void destroy() {
08b1c66e 1629
8ce1db6f 1630 g_slist_foreach(g_event_viewer_data_list, event_destroy_walk, NULL );
1631 g_slist_free(g_event_viewer_data_list);
08b1c66e 1632
8ce1db6f 1633 lttvwindow_unregister_constructor(h_gui_events);
08b1c66e 1634
08b1c66e 1635}
1636
1637
5290ec02 1638
1639
08b1c66e 1640LTTV_MODULE("guievents", "Detailed events view", \
1641 "Graphical module to display a detailed event list", \
5290ec02 1642 init, destroy, "lttvwindow", "print")
This page took 0.189852 seconds and 4 git commands to generate.