1 /* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2003-2004 XangXiu Yang
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;
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.
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,
19 /*! \file lttvviewer.c
20 * \brief API used by the graphical viewers to interact with their top window.
22 * Main window (gui module) is the place to contain and display viewers.
23 * Viewers (lttv plugins) interacte with main window through this API and
25 * This header file should be included in each graphic module.
26 * This library is used by graphical modules to interact with the
32 #include <lttv/lttv.h>
33 #include <lttv/state.h>
34 #include <lttv/stats.h>
35 #include <lttv/tracecontext.h>
36 #include <lttvwindow/common.h>
37 #include <lttvwindow/mainwindow.h>
38 #include <lttvwindow/viewer.h>
39 #include <lttvwindow/toolbar.h>
40 #include <lttvwindow/menu.h>
41 #include <lttvwindow/callbacks.h> // for execute_time_requests
45 * Internal function parts
49 * Function to set/update traceset for the viewers
50 * @param main_win main window
51 * @param traceset traceset of the main window.
54 * 0 : traceset updated
55 * 1 : no traceset hooks to update; not an error.
58 int SetTraceset(MainWindow
* main_win
, gpointer traceset
)
61 LttvAttributeValue value
;
63 if( lttv_iattribute_find_by_path(main_win
->attributes
,
64 "hooks/updatetraceset", LTTV_POINTER
, &value
) != 0)
67 tmp
= (LttvHooks
*)*(value
.v_pointer
);
68 if(tmp
== NULL
) return 1;
71 lttv_hooks_call(tmp
,traceset
);
78 * Function to set/update filter for the viewers
79 * @param main_win main window
80 * @param filter filter of the main window.
84 * 1 : no filter hooks to update; not an error.
87 int SetFilter(MainWindow
* main_win
, gpointer filter
)
90 LttvAttributeValue value
;
92 if(lttv_iattribute_find_by_path(main_win
->attributes
,
93 "hooks/updatefilter", LTTV_POINTER
, &value
) != 0)
96 tmp
= (LttvHooks
*)*(value
.v_pointer
);
98 if(tmp
== NULL
) return 1;
99 lttv_hooks_call(tmp
,filter
);
105 * Function to redraw each viewer belonging to the current tab
106 * @param main_win the main window the viewer belongs to.
109 void update_traceset(MainWindow
* main_win
)
111 LttvAttributeValue value
;
113 g_assert(lttv_iattribute_find_by_path(main_win
->current_tab
->attributes
,
114 "hooks/updatetraceset", LTTV_POINTER
, &value
));
115 tmp
= (LttvHooks
*)*(value
.v_pointer
);
116 if(tmp
== NULL
) return;
117 lttv_hooks_call(tmp
, NULL
);
120 void set_time_window_adjustment(MainWindow
* main_win
, const TimeWindow
* new_time_window
)
122 gtk_multi_vpaned_set_adjust(main_win
->current_tab
->multi_vpaned
, new_time_window
, FALSE
);
126 void set_time_window(MainWindow
* main_win
, const TimeWindow
*time_window
)
128 LttvAttributeValue value
;
131 TimeWindowNotifyData time_window_notify_data
;
132 TimeWindow old_time_window
= main_win
->current_tab
->time_window
;
133 time_window_notify_data
.old_time_window
= &old_time_window
;
134 main_win
->current_tab
->time_window
= *time_window
;
135 time_window_notify_data
.new_time_window
=
136 &(main_win
->current_tab
->time_window
);
138 g_assert(lttv_iattribute_find_by_path(main_win
->current_tab
->attributes
,
139 "hooks/updatetimewindow", LTTV_POINTER
, &value
));
140 tmp
= (LttvHooks
*)*(value
.v_pointer
);
141 if(tmp
== NULL
) return;
142 lttv_hooks_call(tmp
, &time_window_notify_data
);
152 * Function to register a view constructor so that main window can generate
153 * a toolbar item for the viewer in order to generate a new instance easily.
154 * It will be called by init function of the module.
155 * @param ButtonPixmap image shown on the toolbar item.
156 * @param tooltip tooltip of the toolbar item.
157 * @param view_constructor constructor of the viewer.
160 void lttvwindow_register_toolbar(char ** pixmap
, char *tooltip
, lttvwindow_viewer_constructor view_constructor
)
162 LttvIAttribute
*attributes_global
= LTTV_IATTRIBUTE(lttv_global_attributes());
163 LttvToolbars
* toolbar
;
164 LttvAttributeValue value
;
166 g_assert(lttv_iattribute_find_by_path(attributes_global
,
167 "viewers/toolbar", LTTV_POINTER
, &value
));
168 toolbar
= (LttvToolbars
*)*(value
.v_pointer
);
171 toolbar
= lttv_toolbars_new();
172 *(value
.v_pointer
) = toolbar
;
174 lttv_toolbars_add(toolbar
, view_constructor
, tooltip
, pixmap
);
179 * Function to unregister the viewer's constructor, release the space
180 * occupied by pixmap, tooltip and constructor of the viewer.
181 * It will be called when a module is unloaded.
182 * @param view_constructor constructor of the viewer which is used as
183 * a reference to find out where the pixmap and tooltip are.
186 void lttvwindow_unregister_toolbar(lttvwindow_viewer_constructor view_constructor
)
188 LttvIAttribute
*attributes_global
= LTTV_IATTRIBUTE(lttv_global_attributes());
189 LttvToolbars
* toolbar
;
190 LttvAttributeValue value
;
192 g_assert(lttv_iattribute_find_by_path(attributes_global
,
193 "viewers/toolbar", LTTV_POINTER
, &value
));
194 toolbar
= (LttvToolbars
*)*(value
.v_pointer
);
196 main_window_remove_toolbar_item(view_constructor
);
198 lttv_toolbars_remove(toolbar
, view_constructor
);
203 * Function to register a view constructor so that main window can generate
204 * a menu item for the viewer in order to generate a new instance easily.
205 * It will be called by init function of the module.
206 * @param menu_path path of the menu item.
207 * @param menu_text text of the menu item.
208 * @param view_constructor constructor of the viewer.
211 void lttvwindow_register_menu(char *menu_path
, char *menu_text
, lttvwindow_viewer_constructor view_constructor
)
213 LttvIAttribute
*attributes_global
= LTTV_IATTRIBUTE(lttv_global_attributes());
215 LttvAttributeValue value
;
217 g_assert(lttv_iattribute_find_by_path(attributes_global
,
218 "viewers/menu", LTTV_POINTER
, &value
));
219 menu
= (LttvMenus
*)*(value
.v_pointer
);
222 menu
= lttv_menus_new();
223 *(value
.v_pointer
) = menu
;
225 lttv_menus_add(menu
, view_constructor
, menu_path
, menu_text
);
229 * Function to unregister the viewer's constructor, release the space
230 * occupied by menu_path, menu_text and constructor of the viewer.
231 * It will be called when a module is unloaded.
232 * @param view_constructor constructor of the viewer which is used as
233 * a reference to find out where the menu_path and menu_text are.
236 void lttvwindow_unregister_menu(lttvwindow_viewer_constructor view_constructor
)
238 LttvIAttribute
*attributes_global
= LTTV_IATTRIBUTE(lttv_global_attributes());
240 LttvAttributeValue value
;
242 g_assert(lttv_iattribute_find_by_path(attributes_global
,
243 "viewers/menu", LTTV_POINTER
, &value
));
244 menu
= (LttvMenus
*)*(value
.v_pointer
);
246 main_window_remove_menu_item(view_constructor
);
248 lttv_menus_remove(menu
, view_constructor
);
252 * Function to register a hook function for a viewer to set/update its
254 * @param hook hook function of the viewer.
255 * @param hook_data hook data associated with the hook function.
256 * @param main_win the main window the viewer belongs to.
258 void lttvwindow_register_time_window_notify(MainWindow
* main_win
,
259 LttvHook hook
, gpointer hook_data
)
261 LttvAttributeValue value
;
263 g_assert(lttv_iattribute_find_by_path(main_win
->current_tab
->attributes
,
264 "hooks/updatetimewindow", LTTV_POINTER
, &value
));
265 tmp
= (LttvHooks
*)*(value
.v_pointer
);
267 tmp
= lttv_hooks_new();
268 *(value
.v_pointer
) = tmp
;
270 lttv_hooks_add(tmp
, hook
,hook_data
);
275 * Function to unregister a viewer's hook function which is used to
276 * set/update the time interval of the viewer.
277 * @param hook hook function of the viewer.
278 * @param hook_data hook data associated with the hook function.
279 * @param main_win the main window the viewer belongs to.
282 void lttvwindow_unregister_time_window_notify(MainWindow
* main_win
,
283 LttvHook hook
, gpointer hook_data
)
285 LttvAttributeValue value
;
287 g_assert(lttv_iattribute_find_by_path(main_win
->current_tab
->attributes
,
288 "hooks/updatetimewindow", LTTV_POINTER
, &value
));
289 tmp
= (LttvHooks
*)*(value
.v_pointer
);
290 if(tmp
== NULL
) return;
291 lttv_hooks_remove_data(tmp
, hook
, hook_data
);
295 * Function to register a hook function for a viewer to set/update its
297 * @param hook hook function of the viewer.
298 * @param hook_data hook data associated with the hook function.
299 * @param main_win the main window the viewer belongs to.
302 void lttvwindow_register_traceset_notify(MainWindow
* main_win
,
303 LttvHook hook
, gpointer hook_data
)
305 LttvAttributeValue value
;
307 g_assert(lttv_iattribute_find_by_path(main_win
->current_tab
->attributes
,
308 "hooks/updatetraceset", LTTV_POINTER
, &value
));
309 tmp
= (LttvHooks
*)*(value
.v_pointer
);
311 tmp
= lttv_hooks_new();
312 *(value
.v_pointer
) = tmp
;
314 lttv_hooks_add(tmp
, hook
, hook_data
);
319 * Function to unregister a viewer's hook function which is used to
320 * set/update the traceset of the viewer.
321 * @param hook hook function of the viewer.
322 * @param hook_data hook data associated with the hook function.
323 * @param main_win the main window the viewer belongs to.
326 void lttvwindow_unregister_traceset_notify(MainWindow
* main_win
,
327 LttvHook hook
, gpointer hook_data
)
329 LttvAttributeValue value
;
331 g_assert(lttv_iattribute_find_by_path(main_win
->current_tab
->attributes
,
332 "hooks/updatetraceset", LTTV_POINTER
, &value
));
333 tmp
= (LttvHooks
*)*(value
.v_pointer
);
334 if(tmp
== NULL
) return;
335 lttv_hooks_remove_data(tmp
, hook
, hook_data
);
339 * Function to register a hook function for a viewer to set/update its
341 * @param hook hook function of the viewer.
342 * @param hook_data hook data associated with the hook function.
343 * @param main_win the main window the viewer belongs to.
346 void lttvwindow_register_filter_notify(MainWindow
*main_win
,
347 LttvHook hook
, gpointer hook_data
)
349 LttvAttributeValue value
;
351 g_assert(lttv_iattribute_find_by_path(main_win
->attributes
,
352 "hooks/updatefilter", LTTV_POINTER
, &value
));
353 tmp
= (LttvHooks
*)*(value
.v_pointer
);
355 tmp
= lttv_hooks_new();
356 *(value
.v_pointer
) = tmp
;
358 lttv_hooks_add(tmp
, hook
, hook_data
);
363 * Function to unregister a viewer's hook function which is used to
364 * set/update the filter of the viewer.
365 * @param hook hook function of the viewer.
366 * @param hook_data hook data associated with the hook function.
367 * @param main_win the main window the viewer belongs to.
370 void lttvwindow_unregister_filter_notify(LttvHook hook
, gpointer hook_data
,
371 MainWindow
* main_win
)
373 LttvAttributeValue value
;
375 g_assert(lttv_iattribute_find_by_path(main_win
->attributes
,
376 "hooks/updatefilter", LTTV_POINTER
, &value
));
377 tmp
= (LttvHooks
*)*(value
.v_pointer
);
378 if(tmp
== NULL
) return;
379 lttv_hooks_remove_data(tmp
, hook
, hook_data
);
383 * Function to register a hook function for a viewer to set/update its
385 * @param hook hook function of the viewer.
386 * @param hook_data hook data associated with the hook function.
387 * @param main_win the main window the viewer belongs to.
390 void lttvwindow_register_current_time_notify(MainWindow
*main_win
,
391 LttvHook hook
, gpointer hook_data
)
393 LttvAttributeValue value
;
395 g_assert(lttv_iattribute_find_by_path(main_win
->current_tab
->attributes
,
396 "hooks/updatecurrenttime", LTTV_POINTER
, &value
));
397 tmp
= (LttvHooks
*)*(value
.v_pointer
);
399 tmp
= lttv_hooks_new();
400 *(value
.v_pointer
) = tmp
;
402 lttv_hooks_add(tmp
, hook
, hook_data
);
407 * Function to unregister a viewer's hook function which is used to
408 * set/update the current time of the viewer.
409 * @param hook hook function of the viewer.
410 * @param hook_data hook data associated with the hook function.
411 * @param main_win the main window the viewer belongs to.
414 void lttvwindow_unregister_current_time_notify(MainWindow
* main_win
,
415 LttvHook hook
, gpointer hook_data
)
417 LttvAttributeValue value
;
419 g_assert(lttv_iattribute_find_by_path(main_win
->current_tab
->attributes
,
420 "hooks/updatecurrenttime", LTTV_POINTER
, &value
));
421 tmp
= (LttvHooks
*)*(value
.v_pointer
);
422 if(tmp
== NULL
) return;
423 lttv_hooks_remove_data(tmp
, hook
, hook_data
);
428 * Function to register a hook function for a viewer to show
429 * the content of the viewer.
430 * @param hook hook function of the viewer.
431 * @param hook_data hook data associated with the hook function.
432 * @param main_win the main window the viewer belongs to.
435 void lttvwindow_register_show_notify(MainWindow
*main_win
,
436 LttvHook hook
, gpointer hook_data
)
438 LttvAttributeValue value
;
440 g_assert(lttv_iattribute_find_by_path(main_win
->current_tab
->attributes
,
441 "hooks/showviewer", LTTV_POINTER
, &value
));
442 tmp
= (LttvHooks
*)*(value
.v_pointer
);
444 tmp
= lttv_hooks_new();
445 *(value
.v_pointer
) = tmp
;
447 lttv_hooks_add(tmp
, hook
, hook_data
);
452 * Function to unregister a viewer's hook function which is used to
453 * show the content of the viewer..
454 * @param hook hook function of the viewer.
455 * @param hook_data hook data associated with the hook function.
456 * @param main_win the main window the viewer belongs to.
459 void lttvwindow_unregister_show_notify(MainWindow
* main_win
,
460 LttvHook hook
, gpointer hook_data
)
462 LttvAttributeValue value
;
464 g_assert(lttv_iattribute_find_by_path(main_win
->current_tab
->attributes
,
465 "hooks/showviewer", LTTV_POINTER
, &value
));
466 tmp
= (LttvHooks
*)*(value
.v_pointer
);
467 if(tmp
== NULL
) return;
468 lttv_hooks_remove_data(tmp
, hook
, hook_data
);
472 * Function to register a hook function for a viewer to set/update the
473 * dividor of the hpane.
474 * @param hook hook function of the viewer.
475 * @param hook_data hook data associated with the hook function.
476 * @param main_win the main window the viewer belongs to.
479 void lttvwindow_register_dividor(MainWindow
*main_win
,
480 LttvHook hook
, gpointer hook_data
)
482 LttvAttributeValue value
;
484 g_assert(lttv_iattribute_find_by_path(main_win
->current_tab
->attributes
,
485 "hooks/hpanedividor", LTTV_POINTER
, &value
));
486 tmp
= (LttvHooks
*)*(value
.v_pointer
);
488 tmp
= lttv_hooks_new();
489 *(value
.v_pointer
) = tmp
;
491 lttv_hooks_add(tmp
, hook
, hook_data
);
496 * Function to unregister a viewer's hook function which is used to
497 * set/update hpane's dividor of the viewer.
498 * It will be called by the destructor of the viewer.
499 * @param hook hook function of the viewer.
500 * @param hook_data hook data associated with the hook function.
501 * @param main_win the main window the viewer belongs to.
504 void lttvwindow_unregister_dividor(MainWindow
*main_win
,
505 LttvHook hook
, gpointer hook_data
)
507 LttvAttributeValue value
;
509 g_assert(lttv_iattribute_find_by_path(main_win
->current_tab
->attributes
,
510 "hooks/hpanedividor", LTTV_POINTER
, &value
));
511 tmp
= (LttvHooks
*)*(value
.v_pointer
);
512 if(tmp
== NULL
) return;
513 lttv_hooks_remove_data(tmp
, hook
, hook_data
);
518 * Update the status bar whenever something changed in the viewer.
519 * @param main_win the main window the viewer belongs to.
520 * @param info the message which will be shown in the status bar.
523 void lttvwindow_report_status(MainWindow
*main_win
, char *info
)
526 g_warning("update_status not implemented in viewer.c");
530 * Function to set the time interval of the current tab.
531 * It will be called by a viewer's signal handle associated with
532 * the move_slider signal
533 * @param main_win the main window the viewer belongs to.
534 * @param time_interval a pointer where time interval is stored.
537 void lttvwindow_report_time_window(MainWindow
*main_win
,
538 TimeWindow
*time_window
)
540 set_time_window(main_win
, time_window
);
541 set_time_window_adjustment(main_win
, time_window
);
546 * Function to set the current time/event of the current tab.
547 * It will be called by a viewer's signal handle associated with
548 * the button-release-event signal
549 * @param main_win the main window the viewer belongs to.
550 * @param time a pointer where time is stored.
553 void lttvwindow_report_current_time(MainWindow
*main_win
, LttTime
*time
)
555 LttvAttributeValue value
;
557 main_win
->current_tab
->current_time
= *time
;
558 g_assert(lttv_iattribute_find_by_path(main_win
->current_tab
->attributes
,
559 "hooks/updatecurrenttime", LTTV_POINTER
, &value
));
560 tmp
= (LttvHooks
*)*(value
.v_pointer
);
562 if(tmp
== NULL
)return;
563 lttv_hooks_call(tmp
, time
);
567 * Function to set the position of the hpane's dividor (viewer).
568 * It will be called by a viewer's signal handle associated with
569 * the motion_notify_event event/signal
570 * @param main_win the main window the viewer belongs to.
571 * @param position position of the hpane's dividor.
574 void lttvwindow_report_dividor(MainWindow
*main_win
, gint position
)
576 LttvAttributeValue value
;
578 g_assert(lttv_iattribute_find_by_path(main_win
->current_tab
->attributes
,
579 "hooks/hpanedividor", LTTV_POINTER
, &value
));
580 tmp
= (LttvHooks
*)*(value
.v_pointer
);
581 if(tmp
== NULL
) return;
582 lttv_hooks_call(tmp
, &position
);
586 * Function to set the focused pane (viewer).
587 * It will be called by a viewer's signal handle associated with
588 * the grab_focus signal
589 * @param main_win the main window the viewer belongs to.
590 * @param paned a pointer to a pane where the viewer is contained.
593 void lttvwindow_report_focus(MainWindow
*main_win
, gpointer paned
)
595 gtk_multi_vpaned_set_focus((GtkWidget
*)main_win
->current_tab
->multi_vpaned
,paned
);
600 * Function to request data in a specific time interval to the main window.
601 * The main window will use this time interval and the others present
602 * to get the data from the process trace.
603 * @param main_win the main window the viewer belongs to.
604 * @param paned a pointer to a pane where the viewer is contained.
607 void lttvwindow_time_interval_request(MainWindow
*main_win
,
608 TimeWindow time_requested
, guint num_events
,
609 LttvHook after_process_traceset
,
610 gpointer after_process_traceset_data
)
612 TimeRequest time_request
;
614 time_request
.time_window
= time_requested
;
615 time_request
.num_events
= num_events
;
616 time_request
.after_hook
= after_process_traceset
;
617 time_request
.after_hook_data
= after_process_traceset_data
;
619 g_array_append_val(main_win
->current_tab
->time_requests
, time_request
);
621 if(!main_win
->current_tab
->time_request_pending
)
623 /* Redraw has +20 priority. We want a prio higher than that, so +19 */
624 g_idle_add_full((G_PRIORITY_HIGH_IDLE
+ 19),
625 (GSourceFunc
)execute_time_requests
,
628 main_win
->current_tab
->time_request_pending
= TRUE
;
635 * Function to get the current time interval of the current traceset.
636 * It will be called by a viewer's hook function to update the
637 * time interval of the viewer and also be called by the constructor
639 * @param main_win the main window the viewer belongs to.
640 * @param time_interval a pointer where time interval will be stored.
643 const TimeInterval
*lttvwindow_get_time_span(MainWindow
*main_win
)
645 //time_window->start_time = main_win->current_tab->time_window.start_time;
646 //time_window->time_width = main_win->current_tab->time_window.time_width;
647 return (LTTV_TRACESET_CONTEXT(main_win
->current_tab
->traceset_info
->
648 traceset_context
)->Time_Span
);
654 * Function to get the current time interval shown on the current tab.
655 * It will be called by a viewer's hook function to update the
656 * shown time interval of the viewer and also be called by the constructor
658 * @param main_win the main window the viewer belongs to.
659 * @param time_interval a pointer where time interval will be stored.
662 const TimeWindow
*lttvwindow_get_time_window(MainWindow
*main_win
)
664 //time_window->start_time = main_win->current_tab->time_window.start_time;
665 //time_window->time_width = main_win->current_tab->time_window.time_width;
666 return &(main_win
->current_tab
->time_window
);
672 * Function to get the current time/event of the current tab.
673 * It will be called by a viewer's hook function to update the
674 * current time/event of the viewer.
675 * @param main_win the main window the viewer belongs to.
676 * @param time a pointer where time will be stored.
679 const LttTime
*lttvwindow_get_current_time(MainWindow
*main_win
)
681 return &(main_win
->current_tab
->current_time
);
686 * Function to get the traceset from the current tab.
687 * It will be called by the constructor of the viewer and also be
688 * called by a hook funtion of the viewer to update its traceset.
689 * @param main_win the main window the viewer belongs to.
690 * @param traceset a pointer to a traceset.
692 const LttvTraceset
*lttvwindow_get_traceset(MainWindow
*main_win
)
694 return main_win
->current_tab
->traceset_info
->traceset
;
698 * Function to get the filter of the current tab.
699 * It will be called by the constructor of the viewer and also be
700 * called by a hook funtion of the viewer to update its filter.
701 * @param main_win, the main window the viewer belongs to.
702 * @param filter, a pointer to a filter.
704 const lttv_filter
*lttvwindow_get_filter(MainWindow
*main_win
)
707 g_warning("lttvwindow_get_filter not implemented in viewer.c");
712 * Function to get the stats of the traceset
713 * @param main_win the main window the viewer belongs to.
716 LttvTracesetStats
* lttvwindow_get_traceset_stats(MainWindow
*main_win
)
718 return main_win
->current_tab
->traceset_info
->traceset_context
;
722 LttvTracesetContext
* lttvwindow_get_traceset_context(MainWindow
*main_win
)
724 return (LttvTracesetContext
*)main_win
->current_tab
->traceset_info
->traceset_context
;