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