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