change function names, fixes
[lttv.git] / ltt / branches / poly / lttv / modules / gui / mainWin / src / callbacks.c
CommitLineData
561eba2a 1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <gtk/gtk.h>
6#include <gmodule.h>
7
8#include "callbacks.h"
9#include "interface.h"
10#include "support.h"
95cd67ef 11#include <lttv/mainWindow.h>
37d0eca6 12#include <lttv/menu.h>
13#include <lttv/toolbar.h>
58960b51 14#include <lttv/gtkTraceSet.h>
6b1d3120 15#include <lttv/module.h>
fc188b78 16#include <lttv/gtkdirsel.h>
f7afe191 17#include <lttv/iattribute.h>
49bf71b5 18#include <lttv/lttvfilter.h>
a5dcde2f 19#include <ltt/trace.h>
6b1d3120 20
f7afe191 21#define PATH_LENGTH 256
22#define DEFAULT_TIME_WIDTH_S 1
23
49bf71b5 24extern LttvTrace *g_init_trace ;
561eba2a 25
ec25ff5e 26
27/** Array containing instanced objects. */
68b48a45 28extern GSList * g_main_window_list;
561eba2a 29
68b48a45 30static int g_win_count = 0;
7a859036 31
bca3b81f 32MainWindow * get_window_data_struct(GtkWidget * widget);
36b3c068 33char * get_unload_module(char ** loaded_module_name, int nb_module);
2176f952 34char * get_remove_trace(char ** all_trace_name, int nb_trace);
35char * get_selection(char ** all_name, int nb, char *title, char * column_title);
49bf71b5 36void get_filter_selection(LttvTracesetSelector *s, char *title, char * column_title);
716e4367 37void * create_tab(MainWindow * parent, MainWindow * current_window,
38 GtkNotebook * notebook, char * label);
561eba2a 39
68b48a45 40void insert_viewer(GtkWidget* widget, view_constructor constructor);
49bf71b5 41void update_filter(LttvTracesetSelector *s, GtkTreeStore *store );
42
43void checkbox_changed(GtkTreeView *treeview,
44 GtkTreePath *arg1,
45 GtkTreeViewColumn *arg2,
46 gpointer user_data);
47void remove_trace_from_traceset_selector(GtkMultiVPaned * paned, unsigned i);
48void add_trace_into_traceset_selector(GtkMultiVPaned * paned, LttTrace * trace);
49
50LttvTracesetSelector * construct_traceset_selector(LttvTraceset * traceset);
51
52enum {
53 CHECKBOX_COLUMN,
54 NAME_COLUMN,
55 TOTAL_COLUMNS
56};
561eba2a 57
36b3c068 58enum
59{
60 MODULE_COLUMN,
61 N_COLUMNS
62};
63
561eba2a 64
49bf71b5 65LttvTracesetSelector * construct_traceset_selector(LttvTraceset * traceset)
66{
67 LttvTracesetSelector * s;
68 LttvTraceSelector * trace;
69 LttvTracefileSelector * tracefile;
70 int i, j, nb_trace, nb_tracefile, nb_control, nb_per_cpu;
71 LttvTrace * trace_v;
72 LttTrace * t;
73 LttTracefile *tf;
74
75 s = lttv_traceset_selector_new(lttv_traceset_name(traceset));
76 nb_trace = lttv_traceset_number(traceset);
77 for(i=0;i<nb_trace;i++){
78 trace_v = lttv_traceset_get(traceset, i);
79 t = lttv_trace(trace_v);
80 trace = lttv_trace_selector_new(t);
81 lttv_traceset_selector_add(s, trace);
82 nb_control = ltt_trace_control_tracefile_number(t);
83 nb_per_cpu = ltt_trace_per_cpu_tracefile_number(t);
84 nb_tracefile = nb_control + nb_per_cpu;
85
86 for(j = 0 ; j < nb_tracefile ; j++) {
87 if(j < nb_control)
88 tf = ltt_trace_control_tracefile_get(t, j);
89 else
90 tf = ltt_trace_per_cpu_tracefile_get(t, j - nb_control);
91 tracefile = lttv_tracefile_selector_new(tf);
92 lttv_trace_selector_add(trace, tracefile);
93 }
94 }
95 return s;
96}
97
561eba2a 98void
606309a4 99insert_viewer_wrap(GtkWidget *menuitem, gpointer user_data)
561eba2a 100{
606309a4 101 GdkWindow * win;
102 GdkCursor * new;
561eba2a 103 guint val = 20;
606309a4 104 GtkWidget* widget = menuitem;
606309a4 105
106 new = gdk_cursor_new(GDK_X_CURSOR);
107 if(GTK_IS_MENU_ITEM(menuitem)){
108 widget = lookup_widget(menuitem, "MToolbar2");
109 }
110 win = gtk_widget_get_parent_window(widget);
111 gdk_window_set_cursor(win, new);
112 gdk_cursor_unref(new);
113 gdk_window_stick(win);
114 gdk_window_unstick(win);
115
68b48a45 116 insert_viewer((GtkWidget*)menuitem, (view_constructor)user_data);
37d0eca6 117 // selected_hook(&val);
606309a4 118
119 gdk_window_set_cursor(win, NULL);
561eba2a 120}
121
561eba2a 122
123/* internal functions */
68b48a45 124void insert_viewer(GtkWidget* widget, view_constructor constructor)
561eba2a 125{
daecc161 126 GtkMultiVPaned * multi_vpaned;
bca3b81f 127 MainWindow * mw_data;
f9334f6f 128 GtkWidget * viewer;
49bf71b5 129 LttvTracesetSelector * s;
561eba2a 130
68b48a45 131 mw_data = get_window_data_struct(widget);
bca3b81f 132 if(!mw_data->current_tab) return;
daecc161 133 multi_vpaned = mw_data->current_tab->multi_vpaned;
561eba2a 134
49bf71b5 135 s = construct_traceset_selector(mw_data->current_tab->traceset_info->traceset);
136 viewer = (GtkWidget*)constructor(mw_data, s, "Traceset_Selector");
f9334f6f 137 if(viewer)
f0d936c0 138 {
daecc161 139 gtk_multi_vpaned_widget_add(multi_vpaned, viewer);
f0d936c0 140 // Added by MD
8af8e4c5 141 // g_object_unref(G_OBJECT(viewer));
f0d936c0 142 }
561eba2a 143}
144
145void get_label_string (GtkWidget * text, gchar * label)
146{
147 GtkEntry * entry = (GtkEntry*)text;
148 if(strlen(gtk_entry_get_text(entry))!=0)
149 strcpy(label,gtk_entry_get_text(entry));
150}
151
716e4367 152void get_label(MainWindow * mw, gchar * str, gchar* dialogue_title, gchar * label_str)
561eba2a 153{
154 GtkWidget * dialogue;
155 GtkWidget * text;
156 GtkWidget * label;
157 gint id;
158
5723fa24 159 dialogue = gtk_dialog_new_with_buttons(dialogue_title,NULL,
561eba2a 160 GTK_DIALOG_MODAL,
161 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
162 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
163 NULL);
164
6b1d3120 165 label = gtk_label_new(label_str);
561eba2a 166 gtk_widget_show(label);
167
168 text = gtk_entry_new();
169 gtk_widget_show(text);
170
171 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), label,TRUE, TRUE,0);
172 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), text,FALSE, FALSE,0);
173
174 id = gtk_dialog_run(GTK_DIALOG(dialogue));
175 switch(id){
176 case GTK_RESPONSE_ACCEPT:
177 get_label_string(text,str);
178 gtk_widget_destroy(dialogue);
179 break;
180 case GTK_RESPONSE_REJECT:
181 default:
182 gtk_widget_destroy(dialogue);
183 break;
184 }
185}
186
bca3b81f 187MainWindow * get_window_data_struct(GtkWidget * widget)
561eba2a 188{
189 GtkWidget * mw;
bca3b81f 190 MainWindow * mw_data;
561eba2a 191
192 mw = lookup_widget(widget, "MWindow");
193 if(mw == NULL){
194 g_printf("Main window does not exist\n");
195 return;
196 }
197
bca3b81f 198 mw_data = (MainWindow *) g_object_get_data(G_OBJECT(mw),"mainWindow");
68b48a45 199 if(mw_data == NULL){
561eba2a 200 g_printf("Main window data does not exist\n");
201 return;
202 }
68b48a45 203 return mw_data;
561eba2a 204}
205
68b48a45 206void create_new_window(GtkWidget* widget, gpointer user_data, gboolean clone)
561eba2a 207{
bca3b81f 208 MainWindow * parent = get_window_data_struct(widget);
561eba2a 209
561eba2a 210 if(clone){
211 g_printf("Clone : use the same traceset\n");
716e4367 212 construct_main_window(parent, NULL);
561eba2a 213 }else{
214 g_printf("Empty : traceset is set to NULL\n");
716e4367 215 construct_main_window(NULL, parent->win_creation_data);
561eba2a 216 }
217}
218
219void move_up_viewer(GtkWidget * widget, gpointer user_data)
220{
bca3b81f 221 MainWindow * mw = get_window_data_struct(widget);
222 if(!mw->current_tab) return;
daecc161 223 gtk_multi_vpaned_widget_move_up(mw->current_tab->multi_vpaned);
561eba2a 224}
225
226void move_down_viewer(GtkWidget * widget, gpointer user_data)
227{
bca3b81f 228 MainWindow * mw = get_window_data_struct(widget);
229 if(!mw->current_tab) return;
daecc161 230 gtk_multi_vpaned_widget_move_down(mw->current_tab->multi_vpaned);
561eba2a 231}
232
233void delete_viewer(GtkWidget * widget, gpointer user_data)
234{
bca3b81f 235 MainWindow * mw = get_window_data_struct(widget);
236 if(!mw->current_tab) return;
daecc161 237 gtk_multi_vpaned_widget_delete(mw->current_tab->multi_vpaned);
561eba2a 238}
239
240void open_traceset(GtkWidget * widget, gpointer user_data)
241{
2176f952 242 char ** dir;
243 gint id;
244 LttvTraceset * traceset;
bca3b81f 245 MainWindow * mw_data = get_window_data_struct(widget);
68b48a45 246 GtkFileSelection * file_selector =
2176f952 247 (GtkFileSelection *)gtk_file_selection_new("Select a traceset");
248
68b48a45 249 gtk_file_selection_hide_fileop_buttons(file_selector);
c64c7ea1 250
68b48a45 251 id = gtk_dialog_run(GTK_DIALOG(file_selector));
2176f952 252 switch(id){
253 case GTK_RESPONSE_ACCEPT:
254 case GTK_RESPONSE_OK:
68b48a45 255 dir = gtk_file_selection_get_selections (file_selector);
2176f952 256 traceset = lttv_traceset_load(dir[0]);
257 g_printf("Open a trace set %s\n", dir[0]);
258 //Not finished yet
259 g_strfreev(dir);
260 case GTK_RESPONSE_REJECT:
261 case GTK_RESPONSE_CANCEL:
262 default:
68b48a45 263 gtk_widget_destroy((GtkWidget*)file_selector);
2176f952 264 break;
265 }
c64c7ea1 266
561eba2a 267}
268
49bf71b5 269void add_trace_into_traceset_selector(GtkMultiVPaned * paned, LttTrace * t)
270{
271 int j, nb_tracefile, nb_control, nb_per_cpu;
272 LttvTracesetSelector * s;
273 LttvTraceSelector * trace;
274 LttvTracefileSelector * tracefile;
275 LttTracefile * tf;
276 GtkWidget * w;
277
278 w = gtk_multi_vpaned_get_first_widget(paned);
279 while(w){
280 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
281
282 trace = lttv_trace_selector_new(t);
283 lttv_traceset_selector_add(s, trace);
284 nb_control = ltt_trace_control_tracefile_number(t);
285 nb_per_cpu = ltt_trace_per_cpu_tracefile_number(t);
286 nb_tracefile = nb_control + nb_per_cpu;
287
288 for(j = 0 ; j < nb_tracefile ; j++) {
289 if(j < nb_control)
290 tf = ltt_trace_control_tracefile_get(t, j);
291 else
292 tf = ltt_trace_per_cpu_tracefile_get(t, j - nb_control);
293 tracefile = lttv_tracefile_selector_new(tf);
294 lttv_trace_selector_add(trace, tracefile);
295 }
296
297 w = gtk_multi_vpaned_get_next_widget(paned);
298 }
299}
300
561eba2a 301void add_trace(GtkWidget * widget, gpointer user_data)
302{
2176f952 303 LttTrace *trace;
304 LttvTrace * trace_v;
305 LttvTraceset * traceset;
306 char * dir;
307 gint id;
bca3b81f 308 MainWindow * mw_data = get_window_data_struct(widget);
68b48a45 309 GtkDirSelection * file_selector = (GtkDirSelection *)gtk_dir_selection_new("Select a trace");
310 gtk_dir_selection_hide_fileop_buttons(file_selector);
2176f952 311
68b48a45 312 id = gtk_dialog_run(GTK_DIALOG(file_selector));
2176f952 313 switch(id){
314 case GTK_RESPONSE_ACCEPT:
315 case GTK_RESPONSE_OK:
68b48a45 316 dir = gtk_dir_selection_get_dir (file_selector);
2176f952 317 trace = ltt_trace_open(dir);
318 if(trace == NULL) g_critical("cannot open trace %s", dir);
319 trace_v = lttv_trace_new(trace);
716e4367 320 traceset = mw_data->current_tab->traceset_info->traceset;
321 if(mw_data->current_tab->traceset_info->traceset_context != NULL){
322 lttv_context_fini(LTTV_TRACESET_CONTEXT(mw_data->current_tab->
323 traceset_info->traceset_context));
324 g_object_unref(mw_data->current_tab->traceset_info->traceset_context);
2176f952 325 }
326 lttv_traceset_add(traceset, trace_v);
716e4367 327 mw_data->current_tab->traceset_info->traceset_context =
2176f952 328 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
329 lttv_context_init(
716e4367 330 LTTV_TRACESET_CONTEXT(mw_data->current_tab->traceset_info->
49bf71b5 331 traceset_context),traceset);
332 add_trace_into_traceset_selector(mw_data->current_tab->multi_vpaned, trace);
333
334 gtk_widget_destroy((GtkWidget*)file_selector);
335
336 //update current tab
337 // set_current_time(mw_data, &(mw_data->current_tab->current_time));
338 break;
2176f952 339 case GTK_RESPONSE_REJECT:
340 case GTK_RESPONSE_CANCEL:
341 default:
68b48a45 342 gtk_widget_destroy((GtkWidget*)file_selector);
2176f952 343 break;
344 }
49bf71b5 345}
346
347void remove_trace_from_traceset_selector(GtkMultiVPaned * paned, unsigned i)
348{
349 LttvTracesetSelector * s;
350 LttvTraceSelector * t;
351 GtkWidget * w;
352
353 w = gtk_multi_vpaned_get_first_widget(paned);
354 while(w){
355 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
356 t = lttv_traceset_selector_get(s,i);
357 lttv_traceset_selector_remove(s, i);
358 lttv_trace_selector_destroy(t);
359 w = gtk_multi_vpaned_get_next_widget(paned);
360 }
561eba2a 361}
362
363void remove_trace(GtkWidget * widget, gpointer user_data)
364{
2176f952 365 LttTrace *trace;
366 LttvTrace * trace_v;
367 LttvTraceset * traceset;
368 gint i, nb_trace;
369 char ** name, *remove_trace_name;
bca3b81f 370 MainWindow * mw_data = get_window_data_struct(widget);
49bf71b5 371 LttvTracesetSelector * s;
372 LttvTraceSelector * t;
373 GtkWidget * w;
374 gboolean selected;
2176f952 375
716e4367 376 nb_trace =lttv_traceset_number(mw_data->current_tab->traceset_info->traceset);
2176f952 377 name = g_new(char*,nb_trace);
378 for(i = 0; i < nb_trace; i++){
716e4367 379 trace_v = lttv_traceset_get(mw_data->current_tab->
380 traceset_info->traceset, i);
2176f952 381 trace = lttv_trace(trace_v);
a5dcde2f 382 name[i] = ltt_trace_name(trace);
2176f952 383 }
384
385 remove_trace_name = get_remove_trace(name, nb_trace);
386
387 if(remove_trace_name){
388 for(i=0; i<nb_trace; i++){
389 if(strcmp(remove_trace_name,name[i]) == 0){
49bf71b5 390 //unselect the trace from the current viewer
391 w = gtk_multi_vpaned_get_widget(mw_data->current_tab->multi_vpaned);
392 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
393 t = lttv_traceset_selector_get(s,i);
394 lttv_trace_selector_set_selected(t, FALSE);
395
396 //check if other viewers select the trace
397 w = gtk_multi_vpaned_get_first_widget(mw_data->current_tab->multi_vpaned);
398 while(w){
399 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
400 t = lttv_traceset_selector_get(s,i);
401 selected = lttv_trace_selector_get_selected(t);
402 if(selected)break;
403 w = gtk_multi_vpaned_get_next_widget(mw_data->current_tab->multi_vpaned);
404 }
405
406 //if no viewer selects the trace, remove it
407 if(!selected){
408 remove_trace_from_traceset_selector(mw_data->current_tab->multi_vpaned, i);
409
410 traceset = mw_data->current_tab->traceset_info->traceset;
411 trace_v = lttv_traceset_get(traceset, i);
412 if(lttv_trace_get_ref_number(trace_v) <= 1)
413 ltt_trace_close(lttv_trace(trace_v));
414
415 if(mw_data->current_tab->traceset_info->traceset_context != NULL){
416 lttv_context_fini(LTTV_TRACESET_CONTEXT(mw_data->current_tab->
417 traceset_info->traceset_context));
418 g_object_unref(mw_data->current_tab->traceset_info->traceset_context);
419 }
420 lttv_traceset_remove(traceset, i);
421 lttv_trace_destroy(trace_v);
422 mw_data->current_tab->traceset_info->traceset_context =
423 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
424 lttv_context_init(
425 LTTV_TRACESET_CONTEXT(mw_data->current_tab->
426 traceset_info->traceset_context),traceset);
427 //update current tab
428 // set_current_time(mw_data, &(mw_data->current_tab->current_time));
2176f952 429 }
2176f952 430 break;
431 }
432 }
433 }
434
435 g_free(name);
561eba2a 436}
437
438void save(GtkWidget * widget, gpointer user_data)
439{
440 g_printf("Save\n");
441}
442
443void save_as(GtkWidget * widget, gpointer user_data)
444{
445 g_printf("Save as\n");
446}
447
1f1ae829 448void zoom(GtkWidget * widget, double size)
449{
450 TimeInterval *time_span;
451 TimeWindow time_window;
452 LttTime current_time, time_delta, time_s, time_e;
453 MainWindow * mw_data = get_window_data_struct(widget);
454
716e4367 455 time_span = LTTV_TRACESET_CONTEXT(mw_data->current_tab->
456 traceset_info->traceset_context)->Time_Span;
1f1ae829 457 time_window = mw_data->current_tab->time_window;
458 current_time = mw_data->current_tab->current_time;
459
460 time_delta = ltt_time_sub(time_span->endTime,time_span->startTime);
461 if(size == 0){
462 time_window.start_time = time_span->startTime;
463 time_window.time_width = time_delta;
464 }else{
465 time_window.time_width = ltt_time_div(time_window.time_width, size);
466 if(ltt_time_compare(time_window.time_width,time_delta) > 0)
467 time_window.time_width = time_delta;
468
469 time_s = ltt_time_sub(current_time,ltt_time_div(time_window.time_width, 2));
470 time_e = ltt_time_add(current_time,ltt_time_div(time_window.time_width, 2));
471 if(ltt_time_compare(time_span->startTime, time_s) > 0){
472 time_s = time_span->startTime;
473 }else if(ltt_time_compare(time_span->endTime, time_e) < 0){
474 time_e = time_span->endTime;
475 time_s = ltt_time_sub(time_e,time_window.time_width);
476 }
477 time_window.start_time = time_s;
478 }
479 set_time_window(mw_data, &time_window);
daecc161 480 gtk_multi_vpaned_set_adjust(mw_data->current_tab->multi_vpaned, FALSE);
1f1ae829 481}
482
561eba2a 483void zoom_in(GtkWidget * widget, gpointer user_data)
484{
1f1ae829 485 zoom(widget, 2);
561eba2a 486}
487
488void zoom_out(GtkWidget * widget, gpointer user_data)
489{
1f1ae829 490 zoom(widget, 0.5);
561eba2a 491}
492
493void zoom_extended(GtkWidget * widget, gpointer user_data)
494{
1f1ae829 495 zoom(widget, 0);
561eba2a 496}
497
498void go_to_time(GtkWidget * widget, gpointer user_data)
499{
500 g_printf("Go to time\n");
501}
502
503void show_time_frame(GtkWidget * widget, gpointer user_data)
504{
505 g_printf("Show time frame\n");
506}
507
508
509/* callback function */
510
511void
512on_empty_traceset_activate (GtkMenuItem *menuitem,
513 gpointer user_data)
514{
68b48a45 515 create_new_window((GtkWidget*)menuitem, user_data, FALSE);
561eba2a 516}
517
518
519void
520on_clone_traceset_activate (GtkMenuItem *menuitem,
521 gpointer user_data)
522{
68b48a45 523 create_new_window((GtkWidget*)menuitem, user_data, TRUE);
561eba2a 524}
525
526
527void
528on_tab_activate (GtkMenuItem *menuitem,
529 gpointer user_data)
530{
6b1d3120 531 gchar label[PATH_LENGTH];
716e4367 532 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
561eba2a 533 GtkNotebook * notebook = (GtkNotebook *)lookup_widget((GtkWidget*)menuitem, "MNotebook");
534 if(notebook == NULL){
535 g_printf("Notebook does not exist\n");
536 return;
537 }
538
6b1d3120 539 strcpy(label,"Page");
716e4367 540 get_label(mw_data, label,"Get the name of the tab","Please input tab's name");
561eba2a 541
716e4367 542 create_tab (mw_data, mw_data, notebook, label);
561eba2a 543}
544
545
546void
547on_open_activate (GtkMenuItem *menuitem,
548 gpointer user_data)
549{
550 open_traceset((GtkWidget*)menuitem, user_data);
551}
552
553
554void
555on_close_activate (GtkMenuItem *menuitem,
556 gpointer user_data)
557{
bca3b81f 558 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
68b48a45 559 main_window_destructor(mw_data);
561eba2a 560}
561
562
563void
564on_close_tab_activate (GtkMenuItem *menuitem,
565 gpointer user_data)
566{
2061e03d 567 int count = 0;
568 GtkWidget * notebook;
bca3b81f 569 Tab * tmp;
570 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
2061e03d 571 notebook = lookup_widget((GtkWidget*)menuitem, "MNotebook");
572 if(notebook == NULL){
573 g_printf("Notebook does not exist\n");
574 return;
575 }
576
bca3b81f 577 if(mw_data->tab == mw_data->current_tab){
578 // tmp = mw_data->current_tb;
579 // mw_data->tab = mw_data->current_tab->next;
2061e03d 580 g_printf("The default TAB can not be deleted\n");
581 return;
582 }else{
bca3b81f 583 tmp = mw_data->tab;
584 while(tmp != mw_data->current_tab){
585 tmp = tmp->next;
2061e03d 586 count++;
587 }
588 }
589
590 gtk_notebook_remove_page((GtkNotebook*)notebook, count);
561eba2a 591}
592
593
594void
595on_add_trace_activate (GtkMenuItem *menuitem,
596 gpointer user_data)
597{
598 add_trace((GtkWidget*)menuitem, user_data);
599}
600
601
602void
603on_remove_trace_activate (GtkMenuItem *menuitem,
604 gpointer user_data)
605{
606 remove_trace((GtkWidget*)menuitem, user_data);
607}
608
609
610void
611on_save_activate (GtkMenuItem *menuitem,
612 gpointer user_data)
613{
614 save((GtkWidget*)menuitem, user_data);
615}
616
617
618void
619on_save_as_activate (GtkMenuItem *menuitem,
620 gpointer user_data)
621{
622 save_as((GtkWidget*)menuitem, user_data);
623}
624
625
626void
627on_quit_activate (GtkMenuItem *menuitem,
628 gpointer user_data)
629{
2061e03d 630 gtk_main_quit ();
561eba2a 631}
632
633
634void
635on_cut_activate (GtkMenuItem *menuitem,
636 gpointer user_data)
637{
638 g_printf("Cut\n");
639}
640
641
642void
643on_copy_activate (GtkMenuItem *menuitem,
644 gpointer user_data)
645{
646 g_printf("Copye\n");
647}
648
649
650void
651on_paste_activate (GtkMenuItem *menuitem,
652 gpointer user_data)
653{
654 g_printf("Paste\n");
655}
656
657
658void
659on_delete_activate (GtkMenuItem *menuitem,
660 gpointer user_data)
661{
662 g_printf("Delete\n");
663}
664
665
666void
667on_zoom_in_activate (GtkMenuItem *menuitem,
668 gpointer user_data)
669{
670 zoom_in((GtkWidget*)menuitem, user_data);
671}
672
673
674void
675on_zoom_out_activate (GtkMenuItem *menuitem,
676 gpointer user_data)
677{
678 zoom_out((GtkWidget*)menuitem, user_data);
679}
680
681
682void
683on_zoom_extended_activate (GtkMenuItem *menuitem,
684 gpointer user_data)
685{
686 zoom_extended((GtkWidget*)menuitem, user_data);
687}
688
689
690void
691on_go_to_time_activate (GtkMenuItem *menuitem,
692 gpointer user_data)
693{
694 go_to_time((GtkWidget*)menuitem, user_data);
695}
696
697
698void
699on_show_time_frame_activate (GtkMenuItem *menuitem,
700 gpointer user_data)
701{
702 show_time_frame((GtkWidget*)menuitem, user_data);
703}
704
705
706void
707on_move_viewer_up_activate (GtkMenuItem *menuitem,
708 gpointer user_data)
709{
710 move_up_viewer((GtkWidget*)menuitem, user_data);
711}
712
713
714void
715on_move_viewer_down_activate (GtkMenuItem *menuitem,
716 gpointer user_data)
717{
718 move_down_viewer((GtkWidget*)menuitem, user_data);
719}
720
721
722void
723on_remove_viewer_activate (GtkMenuItem *menuitem,
724 gpointer user_data)
725{
726 delete_viewer((GtkWidget*)menuitem, user_data);
727}
728
49bf71b5 729void
730on_trace_filter_activate (GtkMenuItem *menuitem,
731 gpointer user_data)
732{
733 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
734 LttvTracesetSelector * s;
735 GtkWidget * w = gtk_multi_vpaned_get_widget(mw_data->current_tab->multi_vpaned);
736
737 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
738 if(!s){
739 g_printf("There is no viewer yet\n");
740 return;
741 }
742 get_filter_selection(s, "Configure trace and tracefile filter", "Select traces and tracefiles");
743}
744
745void
746on_trace_facility_activate (GtkMenuItem *menuitem,
747 gpointer user_data)
748{
749 g_printf("Trace facility selector: %s\n");
750}
561eba2a 751
752void
753on_load_module_activate (GtkMenuItem *menuitem,
754 gpointer user_data)
755{
36b3c068 756 char ** dir;
757 gint id;
3872a20e 758 char str[PATH_LENGTH], *str1;
bca3b81f 759 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
68b48a45 760 GtkFileSelection * file_selector = (GtkFileSelection *)gtk_file_selection_new("Select a module");
761 gtk_file_selection_hide_fileop_buttons(file_selector);
36b3c068 762
763 str[0] = '\0';
68b48a45 764 id = gtk_dialog_run(GTK_DIALOG(file_selector));
36b3c068 765 switch(id){
766 case GTK_RESPONSE_ACCEPT:
767 case GTK_RESPONSE_OK:
68b48a45 768 dir = gtk_file_selection_get_selections (file_selector);
36b3c068 769 sprintf(str,dir[0]);
3872a20e 770 str1 = strrchr(str,'/');
771 if(str1)str1++;
772 else{
773 str1 = strrchr(str,'\\');
774 str1++;
775 }
bca3b81f 776 if(mw_data->win_creation_data)
777 lttv_module_load(str1, mw_data->win_creation_data->argc,mw_data->win_creation_data->argv);
36b3c068 778 else
3872a20e 779 lttv_module_load(str1, 0,NULL);
68b48a45 780 g_slist_foreach(g_main_window_list, insert_menu_toolbar_item, NULL);
36b3c068 781 g_strfreev(dir);
782 case GTK_RESPONSE_REJECT:
783 case GTK_RESPONSE_CANCEL:
784 default:
68b48a45 785 gtk_widget_destroy((GtkWidget*)file_selector);
36b3c068 786 break;
787 }
788 g_printf("Load module: %s\n", str);
561eba2a 789}
790
791
792void
793on_unload_module_activate (GtkMenuItem *menuitem,
794 gpointer user_data)
795{
36b3c068 796 int i;
797 char **name, *unload_module_name;
798 guint nb;
799 LttvModule ** modules, *module;
bca3b81f 800 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
36b3c068 801
802 modules = lttv_module_list(&nb);
803 name = g_new(char*, nb);
804 for(i=0;i<nb;i++){
805 module = modules[i];
806 name[i] = lttv_module_name(module);
807 }
808
809 unload_module_name =get_unload_module(name,nb);
810
811 if(unload_module_name){
812 for(i=0;i<nb;i++){
813 if(strcmp(unload_module_name, name[i]) == 0){
814 lttv_module_unload(modules[i]);
815 break;
816 }
817 }
818 }
819
820 g_free(name);
561eba2a 821}
822
823
824void
825on_add_module_search_path_activate (GtkMenuItem *menuitem,
826 gpointer user_data)
827{
68b48a45 828 GtkDirSelection * file_selector = (GtkDirSelection *)gtk_dir_selection_new("Select module path");
fc188b78 829 char * dir;
830 gint id;
831
bca3b81f 832 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
fc188b78 833
68b48a45 834 id = gtk_dialog_run(GTK_DIALOG(file_selector));
fc188b78 835 switch(id){
836 case GTK_RESPONSE_ACCEPT:
837 case GTK_RESPONSE_OK:
68b48a45 838 dir = gtk_dir_selection_get_dir (file_selector);
fc188b78 839 lttv_module_path_add(dir);
840 case GTK_RESPONSE_REJECT:
841 case GTK_RESPONSE_CANCEL:
842 default:
68b48a45 843 gtk_widget_destroy((GtkWidget*)file_selector);
fc188b78 844 break;
6b1d3120 845 }
561eba2a 846}
847
848
849void
850on_color_activate (GtkMenuItem *menuitem,
851 gpointer user_data)
852{
853 g_printf("Color\n");
854}
855
856
857void
858on_filter_activate (GtkMenuItem *menuitem,
859 gpointer user_data)
860{
861 g_printf("Filter\n");
862}
863
864
865void
866on_save_configuration_activate (GtkMenuItem *menuitem,
867 gpointer user_data)
868{
869 g_printf("Save configuration\n");
870}
871
872
873void
874on_content_activate (GtkMenuItem *menuitem,
875 gpointer user_data)
876{
877 g_printf("Content\n");
878}
879
880
881void
882on_about_activate (GtkMenuItem *menuitem,
883 gpointer user_data)
884{
885 g_printf("About...\n");
886}
887
888
889void
890on_button_new_clicked (GtkButton *button,
891 gpointer user_data)
892{
68b48a45 893 create_new_window((GtkWidget*)button, user_data, FALSE);
561eba2a 894}
895
896
897void
898on_button_open_clicked (GtkButton *button,
899 gpointer user_data)
900{
901 open_traceset((GtkWidget*)button, user_data);
902}
903
904
905void
906on_button_add_trace_clicked (GtkButton *button,
907 gpointer user_data)
908{
909 add_trace((GtkWidget*)button, user_data);
910}
911
912
913void
914on_button_remove_trace_clicked (GtkButton *button,
915 gpointer user_data)
916{
917 remove_trace((GtkWidget*)button, user_data);
918}
919
920
921void
922on_button_save_clicked (GtkButton *button,
923 gpointer user_data)
924{
925 save((GtkWidget*)button, user_data);
926}
927
928
929void
930on_button_save_as_clicked (GtkButton *button,
931 gpointer user_data)
932{
933 save_as((GtkWidget*)button, user_data);
934}
935
936
937void
938on_button_zoom_in_clicked (GtkButton *button,
939 gpointer user_data)
940{
941 zoom_in((GtkWidget*)button, user_data);
942}
943
944
945void
946on_button_zoom_out_clicked (GtkButton *button,
947 gpointer user_data)
948{
949 zoom_out((GtkWidget*)button, user_data);
950}
951
952
953void
954on_button_zoom_extended_clicked (GtkButton *button,
955 gpointer user_data)
956{
957 zoom_extended((GtkWidget*)button, user_data);
958}
959
960
961void
962on_button_go_to_time_clicked (GtkButton *button,
963 gpointer user_data)
964{
965 go_to_time((GtkWidget*)button, user_data);
966}
967
968
969void
970on_button_show_time_frame_clicked (GtkButton *button,
971 gpointer user_data)
972{
973 show_time_frame((GtkWidget*)button, user_data);
974}
975
976
977void
978on_button_move_up_clicked (GtkButton *button,
979 gpointer user_data)
980{
981 move_up_viewer((GtkWidget*)button, user_data);
982}
983
984
985void
986on_button_move_down_clicked (GtkButton *button,
987 gpointer user_data)
988{
989 move_down_viewer((GtkWidget*)button, user_data);
990}
991
992
993void
994on_button_delete_viewer_clicked (GtkButton *button,
995 gpointer user_data)
996{
997 delete_viewer((GtkWidget*)button, user_data);
998}
999
1000void
1001on_MWindow_destroy (GtkObject *object,
1002 gpointer user_data)
1003{
bca3b81f 1004 MainWindow *Main_Window = (MainWindow*)user_data;
f7afe191 1005
68b48a45 1006 g_printf("There are : %d windows\n",g_slist_length(g_main_window_list));
561eba2a 1007
68b48a45 1008 g_win_count--;
1009 if(g_win_count == 0)
7a859036 1010 gtk_main_quit ();
561eba2a 1011}
1012
1013
1014void
1015on_MNotebook_switch_page (GtkNotebook *notebook,
1016 GtkNotebookPage *page,
1017 guint page_num,
1018 gpointer user_data)
1019{
bca3b81f 1020 MainWindow * mw = get_window_data_struct((GtkWidget*)notebook);
1021 Tab * tab = mw->tab;
561eba2a 1022
1023 while(page_num){
bca3b81f 1024 tab = tab->next;
561eba2a 1025 page_num--;
1026 }
bca3b81f 1027 mw->current_tab = tab;
561eba2a 1028}
1029
49bf71b5 1030void checkbox_changed(GtkTreeView *treeview,
1031 GtkTreePath *arg1,
1032 GtkTreeViewColumn *arg2,
1033 gpointer user_data)
1034{
1035 GtkTreeStore * store = (GtkTreeStore *)gtk_tree_view_get_model (treeview);
1036 GtkTreeIter iter;
1037 gboolean value;
1038
1039 if (gtk_tree_model_get_iter ((GtkTreeModel *)store, &iter, arg1)){
1040 gtk_tree_model_get ((GtkTreeModel *)store, &iter, CHECKBOX_COLUMN, &value, -1);
1041 value = value? FALSE : TRUE;
1042 gtk_tree_store_set (GTK_TREE_STORE (store), &iter, CHECKBOX_COLUMN, value, -1);
1043 }
1044
1045}
1046
1047void update_filter(LttvTracesetSelector *s, GtkTreeStore *store )
1048{
1049 GtkTreeIter iter, child_iter;
1050 int i, j;
1051 LttvTraceSelector * trace;
1052 LttvTracefileSelector * tracefile;
1053 gboolean value, value1;
1054
1055 if(gtk_tree_model_get_iter_first((GtkTreeModel*)store, &iter)){
1056 i = 0;
1057 do{
1058 trace = lttv_traceset_selector_get(s, i);
1059 gtk_tree_model_get ((GtkTreeModel*)store, &iter, CHECKBOX_COLUMN, &value,-1);
1060 if(value){
1061 j = 0;
1062 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter, &iter)){
1063 do{
1064 tracefile = lttv_trace_selector_get(trace, j);
1065 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter, CHECKBOX_COLUMN, &value1,-1);
1066 lttv_tracefile_selector_set_selected(tracefile,value1);
1067 j++;
1068 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter));
1069 }
1070 }
1071 lttv_trace_selector_set_selected(trace,value);
1072 i++;
1073 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &iter));
1074 }
1075}
1076
1077void get_filter_selection(LttvTracesetSelector *s,char *title, char * column_title)
1078{
1079 GtkWidget * dialogue;
1080 GtkTreeStore * store;
1081 GtkWidget * tree;
1082 GtkWidget * scroll_win;
1083 GtkCellRenderer * renderer;
1084 GtkTreeViewColumn * column;
1085 GtkTreeIter iter, child_iter;
1086 int i, j, id, nb_trace, nb_tracefile;
1087 LttvTraceSelector * trace;
1088 LttvTracefileSelector * tracefile;
1089 char * name;
1090 gboolean checked;
1091
1092 dialogue = gtk_dialog_new_with_buttons(title,
1093 NULL,
1094 GTK_DIALOG_MODAL,
1095 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
1096 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
1097 NULL);
1098 gtk_window_set_default_size((GtkWindow*)dialogue, 300, 100);
1099
1100 store = gtk_tree_store_new (TOTAL_COLUMNS, G_TYPE_BOOLEAN, G_TYPE_STRING);
1101 tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
1102 g_object_unref (G_OBJECT (store));
1103 g_signal_connect (G_OBJECT (tree), "row-activated",
1104 G_CALLBACK (checkbox_changed),
1105 NULL);
1106
1107
1108 renderer = gtk_cell_renderer_toggle_new ();
1109 gtk_cell_renderer_toggle_set_radio((GtkCellRendererToggle *)renderer, FALSE);
1110
1111 g_object_set (G_OBJECT (renderer),"activatable", TRUE, NULL);
1112
1113 column = gtk_tree_view_column_new_with_attributes ("Checkbox",
1114 renderer,
1115 "active", CHECKBOX_COLUMN,
1116 NULL);
1117 gtk_tree_view_column_set_alignment (column, 0.5);
1118 gtk_tree_view_column_set_fixed_width (column, 20);
1119 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1120
1121 renderer = gtk_cell_renderer_text_new ();
1122 column = gtk_tree_view_column_new_with_attributes (column_title,
1123 renderer,
1124 "text", NAME_COLUMN,
1125 NULL);
1126 gtk_tree_view_column_set_alignment (column, 0.0);
1127 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1128 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (tree), FALSE);
1129
1130 scroll_win = gtk_scrolled_window_new (NULL, NULL);
1131 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
1132 GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
1133 gtk_container_add (GTK_CONTAINER (scroll_win), tree);
1134
1135 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), scroll_win,TRUE, TRUE,0);
1136
1137 gtk_widget_show(scroll_win);
1138 gtk_widget_show(tree);
1139
1140 nb_trace = lttv_traceset_selector_number(s);
1141 for(i=0;i<nb_trace;i++){
1142 trace = lttv_traceset_selector_get(s, i);
1143 name = lttv_trace_selector_get_name(trace);
1144 gtk_tree_store_append (store, &iter, NULL);
1145 checked = lttv_trace_selector_get_selected(trace);
1146 gtk_tree_store_set (store, &iter,
1147 CHECKBOX_COLUMN,checked,
1148 NAME_COLUMN,name,
1149 -1);
1150 nb_tracefile = lttv_trace_selector_number(trace);
1151 for(j=0;j<nb_tracefile;j++){
1152 tracefile = lttv_trace_selector_get(trace, j);
1153 name = lttv_tracefile_selector_get_name(tracefile);
1154 gtk_tree_store_append (store, &child_iter, &iter);
1155 checked = lttv_tracefile_selector_get_selected(tracefile);
1156 gtk_tree_store_set (store, &child_iter,
1157 CHECKBOX_COLUMN, checked,
1158 NAME_COLUMN,name,
1159 -1);
1160 }
1161 }
1162
1163 id = gtk_dialog_run(GTK_DIALOG(dialogue));
1164 switch(id){
1165 case GTK_RESPONSE_ACCEPT:
1166 case GTK_RESPONSE_OK:
1167 update_filter(s, store);
1168 case GTK_RESPONSE_REJECT:
1169 case GTK_RESPONSE_CANCEL:
1170 default:
1171 gtk_widget_destroy(dialogue);
1172 break;
1173 }
1174}
1175
2176f952 1176char * get_remove_trace(char ** all_trace_name, int nb_trace)
1177{
1178 return get_selection(all_trace_name, nb_trace,
1179 "Select a trace", "Trace pathname");
1180}
36b3c068 1181char * get_unload_module(char ** loaded_module_name, int nb_module)
2176f952 1182{
1183 return get_selection(loaded_module_name, nb_module,
1184 "Select an unload module", "Module pathname");
1185}
1186
1187char * get_selection(char ** loaded_module_name, int nb_module,
1188 char *title, char * column_title)
36b3c068 1189{
1190 GtkWidget * dialogue;
1191 GtkWidget * scroll_win;
1192 GtkWidget * tree;
1193 GtkListStore * store;
1194 GtkTreeViewColumn * column;
1195 GtkCellRenderer * renderer;
1196 GtkTreeSelection * select;
1197 GtkTreeIter iter;
1198 gint id, i;
1199 char * unload_module_name = NULL;
1200
2176f952 1201 dialogue = gtk_dialog_new_with_buttons(title,
36b3c068 1202 NULL,
1203 GTK_DIALOG_MODAL,
1204 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
1205 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
1206 NULL);
1207 gtk_window_set_default_size((GtkWindow*)dialogue, 500, 200);
1208
1209 scroll_win = gtk_scrolled_window_new (NULL, NULL);
1210 gtk_widget_show ( scroll_win);
1211 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
1212 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1213
1214 store = gtk_list_store_new (N_COLUMNS,G_TYPE_STRING);
1215 tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL (store));
1216 gtk_widget_show ( tree);
1217 g_object_unref (G_OBJECT (store));
1218
1219 renderer = gtk_cell_renderer_text_new ();
2176f952 1220 column = gtk_tree_view_column_new_with_attributes (column_title,
36b3c068 1221 renderer,
1222 "text", MODULE_COLUMN,
1223 NULL);
1224 gtk_tree_view_column_set_alignment (column, 0.5);
1225 gtk_tree_view_column_set_fixed_width (column, 150);
1226 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1227
1228 select = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree));
1229 gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
1230
1231 gtk_container_add (GTK_CONTAINER (scroll_win), tree);
1232
1233 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), scroll_win,TRUE, TRUE,0);
1234
1235 for(i=0;i<nb_module;i++){
1236 gtk_list_store_append (store, &iter);
1237 gtk_list_store_set (store, &iter, MODULE_COLUMN,loaded_module_name[i],-1);
1238 }
1239
1240 id = gtk_dialog_run(GTK_DIALOG(dialogue));
1241 switch(id){
1242 case GTK_RESPONSE_ACCEPT:
1243 case GTK_RESPONSE_OK:
1244 if (gtk_tree_selection_get_selected (select, (GtkTreeModel**)&store, &iter)){
1245 gtk_tree_model_get ((GtkTreeModel*)store, &iter, MODULE_COLUMN, &unload_module_name, -1);
1246 }
1247 case GTK_RESPONSE_REJECT:
1248 case GTK_RESPONSE_CANCEL:
1249 default:
1250 gtk_widget_destroy(dialogue);
1251 break;
1252 }
1253
1254 return unload_module_name;
1255}
5723fa24 1256
2176f952 1257void main_window_destroy_hash_key(gpointer key)
2061e03d 1258{
1259 g_free(key);
1260}
1261
2176f952 1262void main_window_destroy_hash_data(gpointer data)
2061e03d 1263{
1264}
1265
1266
bca3b81f 1267void insert_menu_toolbar_item(MainWindow * mw, gpointer user_data)
5723fa24 1268{
1269 int i;
1270 GdkPixbuf *pixbuf;
1271 view_constructor constructor;
1272 LttvMenus * menu;
1273 LttvToolbars * toolbar;
68b48a45 1274 lttv_menu_closure *menu_item;
1275 lttv_toolbar_closure *toolbar_item;
5723fa24 1276 LttvAttributeValue value;
1277 LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
68b48a45 1278 GtkWidget * tool_menu_title_menu, *insert_view, *pixmap, *tmp;
5723fa24 1279
1280 g_assert(lttv_iattribute_find_by_path(attributes,
1281 "viewers/menu", LTTV_POINTER, &value));
1282 menu = (LttvMenus*)*(value.v_pointer);
1283
1284 if(menu){
1285 for(i=0;i<menu->len;i++){
68b48a45 1286 menu_item = &g_array_index(menu, lttv_menu_closure, i);
1287 tmp = g_hash_table_lookup(mw->hash_menu_item, g_strdup(menu_item->menuText));
3872a20e 1288 if(tmp)continue;
68b48a45 1289 constructor = menu_item->con;
bca3b81f 1290 tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
68b48a45 1291 insert_view = gtk_menu_item_new_with_mnemonic (menu_item->menuText);
5723fa24 1292 gtk_widget_show (insert_view);
68b48a45 1293 gtk_container_add (GTK_CONTAINER (tool_menu_title_menu), insert_view);
5723fa24 1294 g_signal_connect ((gpointer) insert_view, "activate",
68b48a45 1295 G_CALLBACK (insert_viewer_wrap),
5723fa24 1296 constructor);
68b48a45 1297 g_hash_table_insert(mw->hash_menu_item, g_strdup(menu_item->menuText),
2061e03d 1298 insert_view);
5723fa24 1299 }
1300 }
1301
1302 g_assert(lttv_iattribute_find_by_path(attributes,
1303 "viewers/toolbar", LTTV_POINTER, &value));
1304 toolbar = (LttvToolbars*)*(value.v_pointer);
1305
1306 if(toolbar){
1307 for(i=0;i<toolbar->len;i++){
68b48a45 1308 toolbar_item = &g_array_index(toolbar, lttv_toolbar_closure, i);
1309 tmp = g_hash_table_lookup(mw->hash_toolbar_item, g_strdup(toolbar_item->tooltip));
3872a20e 1310 if(tmp)continue;
68b48a45 1311 constructor = toolbar_item->con;
bca3b81f 1312 tool_menu_title_menu = lookup_widget(mw->mwindow,"MToolbar2");
68b48a45 1313 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char**)toolbar_item->pixmap);
5723fa24 1314 pixmap = gtk_image_new_from_pixbuf(pixbuf);
68b48a45 1315 insert_view = gtk_toolbar_append_element (GTK_TOOLBAR (tool_menu_title_menu),
5723fa24 1316 GTK_TOOLBAR_CHILD_BUTTON,
1317 NULL,
1318 "",
68b48a45 1319 toolbar_item->tooltip, NULL,
5723fa24 1320 pixmap, NULL, NULL);
68b48a45 1321 gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (tool_menu_title_menu)->children)->data))->label), TRUE);
5723fa24 1322 gtk_widget_show (insert_view);
1323 gtk_container_set_border_width (GTK_CONTAINER (insert_view), 1);
68b48a45 1324 g_signal_connect ((gpointer) insert_view, "clicked",G_CALLBACK (insert_viewer_wrap),constructor);
1325 g_hash_table_insert(mw->hash_toolbar_item, g_strdup(toolbar_item->tooltip),
2061e03d 1326 insert_view);
5723fa24 1327 }
1328 }
1329}
1330
716e4367 1331void construct_main_window(MainWindow * parent, WindowCreationData * win_creation_data)
5723fa24 1332{
68b48a45 1333 g_critical("construct_main_window()");
1334 GtkWidget * new_window; /* New generated main window */
bca3b81f 1335 MainWindow * new_m_window;/* New main window structure */
5723fa24 1336 GtkNotebook * notebook;
f7afe191 1337 LttvIAttribute *attributes =
1338 LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
1339 LttvAttributeValue value;
2061e03d 1340
bca3b81f 1341 new_m_window = g_new(MainWindow, 1);
5723fa24 1342
1343 // Add the object's information to the module's array
68b48a45 1344 g_main_window_list = g_slist_append(g_main_window_list, new_m_window);
5723fa24 1345
f7afe191 1346
68b48a45 1347 new_window = create_MWindow();
1348 gtk_widget_show (new_window);
5723fa24 1349
bca3b81f 1350 new_m_window->attributes = attributes;
f7afe191 1351
bca3b81f 1352 new_m_window->mwindow = new_window;
1353 new_m_window->tab = NULL;
1354 new_m_window->current_tab = NULL;
1355 new_m_window->attributes = LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
5723fa24 1356 if(parent){
bca3b81f 1357 new_m_window->win_creation_data = parent->win_creation_data;
5723fa24 1358 }else{
bca3b81f 1359 new_m_window->win_creation_data = win_creation_data;
5723fa24 1360 }
1361
68b48a45 1362 new_m_window->hash_menu_item = g_hash_table_new_full (g_str_hash, g_str_equal,
2176f952 1363 main_window_destroy_hash_key,
1364 main_window_destroy_hash_data);
68b48a45 1365 new_m_window->hash_toolbar_item = g_hash_table_new_full (g_str_hash, g_str_equal,
2176f952 1366 main_window_destroy_hash_key,
1367 main_window_destroy_hash_data);
2061e03d 1368
68b48a45 1369 insert_menu_toolbar_item(new_m_window, NULL);
5723fa24 1370
68b48a45 1371 g_object_set_data(G_OBJECT(new_window), "mainWindow", (gpointer)new_m_window);
5723fa24 1372
1373 //create a default tab
bca3b81f 1374 notebook = (GtkNotebook *)lookup_widget(new_m_window->mwindow, "MNotebook");
5723fa24 1375 if(notebook == NULL){
1376 g_printf("Notebook does not exist\n");
1377 return;
1378 }
1379 //for now there is no name field in LttvTraceset structure
1380 //Use "Traceset" as the label for the default tab
716e4367 1381 create_tab(NULL, new_m_window, notebook,"Traceset");
5723fa24 1382
7a859036 1383 g_object_set_data_full(
bca3b81f 1384 G_OBJECT(new_m_window->mwindow),
7a859036 1385 "Main_Window_Data",
68b48a45 1386 new_m_window,
1387 (GDestroyNotify)main_window_free);
7a859036 1388
68b48a45 1389 g_win_count++;
5723fa24 1390}
1391
bca3b81f 1392void tab_destructor(Tab * tab_instance)
f7afe191 1393{
716e4367 1394 int i, nb, ref_count;
1395 LttvTrace * trace;
1396
bca3b81f 1397 if(tab_instance->attributes)
1398 g_object_unref(tab_instance->attributes);
2061e03d 1399
bca3b81f 1400 if(tab_instance->mw->tab == tab_instance){
1401 tab_instance->mw->tab = tab_instance->next;
2061e03d 1402 }else{
bca3b81f 1403 Tab * tmp1, *tmp = tab_instance->mw->tab;
68b48a45 1404 while(tmp != tab_instance){
2061e03d 1405 tmp1 = tmp;
bca3b81f 1406 tmp = tmp->next;
2061e03d 1407 }
bca3b81f 1408 tmp1->next = tab_instance->next;
2061e03d 1409 }
716e4367 1410
1411 if(tab_instance->traceset_info->traceset_context != NULL){
1412 lttv_context_fini(LTTV_TRACESET_CONTEXT(tab_instance->traceset_info->
1413 traceset_context));
1414 g_object_unref(tab_instance->traceset_info->traceset_context);
1415 }
1416 if(tab_instance->traceset_info->traceset != NULL) {
1417 nb = lttv_traceset_number(tab_instance->traceset_info->traceset);
1418 for(i = 0 ; i < nb ; i++) {
1419 trace = lttv_traceset_get(tab_instance->traceset_info->traceset, i);
1420 ref_count = lttv_trace_get_ref_number(trace);
49bf71b5 1421 if(ref_count <= 1){
716e4367 1422 ltt_trace_close(lttv_trace(trace));
49bf71b5 1423 }
1424 lttv_trace_destroy(trace);
716e4367 1425 }
1426 }
1427 lttv_traceset_destroy(tab_instance->traceset_info->traceset);
1428 g_free(tab_instance->traceset_info);
68b48a45 1429 g_free(tab_instance);
f7afe191 1430}
1431
716e4367 1432void * create_tab(MainWindow * parent, MainWindow* current_window,
1433 GtkNotebook * notebook, char * label)
5723fa24 1434{
1435 GList * list;
bca3b81f 1436 Tab * tmp_tab;
716e4367 1437 MainWindow * mw_data = current_window;
68b48a45 1438 LttTime tmp_time;
1439
bca3b81f 1440 tmp_tab = mw_data->tab;
1441 while(tmp_tab && tmp_tab->next) tmp_tab = tmp_tab->next;
68b48a45 1442 if(!tmp_tab){
bca3b81f 1443 mw_data->current_tab = NULL;
1444 tmp_tab = g_new(Tab,1);
1445 mw_data->tab = tmp_tab;
5723fa24 1446 }else{
bca3b81f 1447 tmp_tab->next = g_new(Tab,1);
1448 tmp_tab = tmp_tab->next;
5723fa24 1449 }
716e4367 1450
1451 tmp_tab->traceset_info = g_new(TracesetInfo,1);
1452 if(parent){
1453 tmp_tab->traceset_info->traceset =
1454 lttv_traceset_copy(parent->current_tab->traceset_info->traceset);
1455 }else{
1456 if(mw_data->current_tab){
1457 tmp_tab->traceset_info->traceset =
1458 lttv_traceset_copy(mw_data->current_tab->traceset_info->traceset);
1459 }else{
1460 tmp_tab->traceset_info->traceset = lttv_traceset_new();
49bf71b5 1461 /* Add the command line trace */
1462 if(g_init_trace != NULL)
1463 lttv_traceset_add(tmp_tab->traceset_info->traceset, g_init_trace);
716e4367 1464 }
716e4367 1465 }
1466 //FIXME copy not implemented in lower level
1467 tmp_tab->traceset_info->traceset_context =
1468 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
1469 lttv_context_init(
1470 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context),
1471 tmp_tab->traceset_info->traceset);
1472
bca3b81f 1473 if(mw_data->current_tab){
716e4367 1474 // Will have to read directly at the main window level, as we want
1475 // to be able to modify a traceset on the fly.
bca3b81f 1476 tmp_tab->time_window = mw_data->current_tab->time_window;
1477 tmp_tab->current_time = mw_data->current_tab->current_time;
5723fa24 1478 }else{
716e4367 1479 // Will have to read directly at the main window level, as we want
1480 // to be able to modify a traceset on the fly.
1481 // get_traceset_time_span(mw_data,&tmp_tab->traceStartTime, &tmp_tab->traceEndTime);
bca3b81f 1482 tmp_tab->time_window.start_time =
716e4367 1483 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->startTime;
f7afe191 1484 if(DEFAULT_TIME_WIDTH_S <
716e4367 1485 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->endTime.tv_sec)
68b48a45 1486 tmp_time.tv_sec = DEFAULT_TIME_WIDTH_S;
f7afe191 1487 else
68b48a45 1488 tmp_time.tv_sec =
716e4367 1489 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->endTime.tv_sec;
68b48a45 1490 tmp_time.tv_nsec = 0;
bca3b81f 1491 tmp_tab->time_window.time_width = tmp_time ;
1492 tmp_tab->current_time.tv_sec = tmp_time.tv_sec / 2;
1493 tmp_tab->current_time.tv_nsec = 0 ;
5723fa24 1494 }
bca3b81f 1495 tmp_tab->attributes = LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
1496 // mw_data->current_tab = tmp_tab;
daecc161 1497 tmp_tab->multi_vpaned = (GtkMultiVPaned*)gtk_multi_vpaned_new();
1498 tmp_tab->multi_vpaned->mw = mw_data;
1499 gtk_widget_show((GtkWidget*)tmp_tab->multi_vpaned);
bca3b81f 1500 tmp_tab->next = NULL;
68b48a45 1501 tmp_tab->mw = mw_data;
5723fa24 1502
68b48a45 1503 tmp_tab->label = gtk_label_new (label);
1504 gtk_widget_show (tmp_tab->label);
5723fa24 1505
f7afe191 1506 g_object_set_data_full(
daecc161 1507 G_OBJECT(tmp_tab->multi_vpaned),
f7afe191 1508 "Tab_Info",
68b48a45 1509 tmp_tab,
1510 (GDestroyNotify)tab_destructor);
5723fa24 1511
daecc161 1512 gtk_notebook_append_page(notebook, (GtkWidget*)tmp_tab->multi_vpaned, tmp_tab->label);
5723fa24 1513 list = gtk_container_get_children(GTK_CONTAINER(notebook));
1514 gtk_notebook_set_current_page(notebook,g_list_length(list)-1);
1515}
2061e03d 1516
1517void remove_menu_item(gpointer main_win, gpointer user_data)
1518{
bca3b81f 1519 MainWindow * mw = (MainWindow *) main_win;
68b48a45 1520 lttv_menu_closure *menu_item = (lttv_menu_closure *)user_data;
1521 GtkWidget * tool_menu_title_menu, *insert_view;
2061e03d 1522
bca3b81f 1523 tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
2061e03d 1524 insert_view = (GtkWidget*)g_hash_table_lookup(mw->hash_menu_item,
68b48a45 1525 menu_item->menuText);
2061e03d 1526 if(insert_view){
68b48a45 1527 g_hash_table_remove(mw->hash_menu_item, menu_item->menuText);
1528 gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu), insert_view);
2061e03d 1529 }
1530}
1531
1532void remove_toolbar_item(gpointer main_win, gpointer user_data)
1533{
bca3b81f 1534 MainWindow * mw = (MainWindow *) main_win;
68b48a45 1535 lttv_toolbar_closure *toolbar_item = (lttv_toolbar_closure *)user_data;
1536 GtkWidget * tool_menu_title_menu, *insert_view;
2061e03d 1537
1538
bca3b81f 1539 tool_menu_title_menu = lookup_widget(mw->mwindow,"MToolbar2");
2061e03d 1540 insert_view = (GtkWidget*)g_hash_table_lookup(mw->hash_toolbar_item,
68b48a45 1541 toolbar_item->tooltip);
2061e03d 1542 if(insert_view){
68b48a45 1543 g_hash_table_remove(mw->hash_toolbar_item, toolbar_item->tooltip);
1544 gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu), insert_view);
2061e03d 1545 }
1546}
1547
1548/**
1549 * Remove menu and toolbar item when a module unloaded
1550 */
2176f952 1551
2061e03d 1552void main_window_remove_menu_item(lttv_constructor constructor)
1553{
1554 int i;
1555 LttvMenus * menu;
68b48a45 1556 lttv_menu_closure *menu_item;
2061e03d 1557 LttvAttributeValue value;
1558 LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
1559
1560 g_assert(lttv_iattribute_find_by_path(attributes,
1561 "viewers/menu", LTTV_POINTER, &value));
1562 menu = (LttvMenus*)*(value.v_pointer);
1563
1564 if(menu){
1565 for(i=0;i<menu->len;i++){
68b48a45 1566 menu_item = &g_array_index(menu, lttv_menu_closure, i);
1567 if(menu_item->con != constructor) continue;
1568 if(g_main_window_list){
1569 g_slist_foreach(g_main_window_list, remove_menu_item, menu_item);
2176f952 1570 }
2061e03d 1571 break;
1572 }
1573 }
1574
1575}
1576
1577void main_window_remove_toolbar_item(lttv_constructor constructor)
1578{
1579 int i;
1580 LttvToolbars * toolbar;
68b48a45 1581 lttv_toolbar_closure *toolbar_item;
2061e03d 1582 LttvAttributeValue value;
1583 LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
1584
1585 g_assert(lttv_iattribute_find_by_path(attributes,
1586 "viewers/toolbar", LTTV_POINTER, &value));
1587 toolbar = (LttvToolbars*)*(value.v_pointer);
1588
1589 if(toolbar){
1590 for(i=0;i<toolbar->len;i++){
68b48a45 1591 toolbar_item = &g_array_index(toolbar, lttv_toolbar_closure, i);
1592 if(toolbar_item->con != constructor) continue;
1593 if(g_main_window_list){
1594 g_slist_foreach(g_main_window_list, remove_toolbar_item, toolbar_item);
2176f952 1595 }
2061e03d 1596 break;
1597 }
1598 }
1599}
This page took 0.09677 seconds and 4 git commands to generate.