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 | |
22 | //extern LttvTracesetContext * gTracesetContext; |
23 | extern LttTrace *gInit_Trace ; |
561eba2a |
24 | |
ec25ff5e |
25 | |
26 | /** Array containing instanced objects. */ |
27 | extern GSList * Main_Window_List; |
561eba2a |
28 | |
7a859036 |
29 | static int gWinCount = 0; |
30 | |
561eba2a |
31 | mainWindow * get_window_data_struct(GtkWidget * widget); |
36b3c068 |
32 | char * get_unload_module(char ** loaded_module_name, int nb_module); |
5723fa24 |
33 | void * create_tab(GtkWidget* parent, GtkNotebook * notebook, char * label); |
561eba2a |
34 | |
35 | /* test part */ |
36 | void insertView(GtkWidget* widget, view_constructor constructor); |
37 | |
36b3c068 |
38 | enum |
39 | { |
40 | MODULE_COLUMN, |
41 | N_COLUMNS |
42 | }; |
43 | |
561eba2a |
44 | void |
45 | on_textview1_grab_focus (GtkTextView *text_view, |
46 | gpointer user_data) |
47 | { |
48 | GtkWidget * widget; |
49 | GtkCustom * custom = (GtkCustom*)user_data; |
50 | widget = gtk_widget_get_parent((GtkWidget*)text_view); |
51 | widget = gtk_widget_get_parent(widget); |
52 | gtk_custom_set_focus((GtkWidget*)custom, (gpointer)widget); |
53 | } |
54 | |
55 | void |
56 | insertViewTest(GtkMenuItem *menuitem, gpointer user_data) |
57 | { |
58 | guint val = 20; |
37d0eca6 |
59 | insertView((GtkWidget*)menuitem, (view_constructor)user_data); |
60 | // selected_hook(&val); |
561eba2a |
61 | } |
62 | |
63 | void |
64 | on_insert_viewer_test_activate (GtkMenuItem *menuitem, |
65 | gpointer user_data) |
66 | { |
67 | GtkWidget *scrolledwindow1, *textview1, *label; |
68 | static int count = 0; |
69 | char str[64]; |
70 | GtkCustom * custom; |
71 | GtkTextBuffer* buf; |
72 | |
73 | mainWindow * mwData; |
74 | mwData = get_window_data_struct((GtkWidget*)menuitem); |
75 | if(!mwData->CurrentTab) return; |
76 | custom = mwData->CurrentTab->custom; |
77 | |
78 | sprintf(str,"label : %d",++count); |
79 | scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL); |
80 | gtk_widget_show (scrolledwindow1); |
81 | label = gtk_label_new(str); |
82 | gtk_widget_show(label); |
83 | |
84 | gtk_custom_widget_add(custom, scrolledwindow1); |
85 | gtk_widget_set_size_request ((GtkWidget*)scrolledwindow1, 800, 100); |
86 | |
87 | textview1 = gtk_text_view_new (); |
88 | gtk_widget_show (textview1); |
89 | gtk_container_add (GTK_CONTAINER (scrolledwindow1), textview1); |
90 | buf = gtk_text_view_get_buffer((GtkTextView*)textview1); |
91 | sprintf(str,"text view : %d",count); |
92 | gtk_text_buffer_set_text(buf,str, -1); |
93 | |
94 | g_signal_connect ((gpointer) textview1, "grab_focus", |
95 | G_CALLBACK (on_textview1_grab_focus), custom); |
96 | } |
97 | |
98 | /* end of test part */ |
99 | |
100 | |
101 | /* internal functions */ |
102 | void insertView(GtkWidget* widget, view_constructor constructor) |
103 | { |
104 | GtkCustom * custom; |
105 | mainWindow * mwData; |
f9334f6f |
106 | GtkWidget * viewer; |
561eba2a |
107 | |
108 | mwData = get_window_data_struct(widget); |
109 | if(!mwData->CurrentTab) return; |
110 | custom = mwData->CurrentTab->custom; |
111 | |
f9334f6f |
112 | viewer = (GtkWidget*)constructor(mwData); |
113 | if(viewer) |
f0d936c0 |
114 | { |
115 | gtk_custom_widget_add(custom, viewer); |
116 | // Added by MD |
8af8e4c5 |
117 | // g_object_unref(G_OBJECT(viewer)); |
f0d936c0 |
118 | } |
561eba2a |
119 | } |
120 | |
121 | void get_label_string (GtkWidget * text, gchar * label) |
122 | { |
123 | GtkEntry * entry = (GtkEntry*)text; |
124 | if(strlen(gtk_entry_get_text(entry))!=0) |
125 | strcpy(label,gtk_entry_get_text(entry)); |
126 | } |
127 | |
6b1d3120 |
128 | void get_label(GtkWindow * mw, gchar * str, gchar* dialogue_title, gchar * label_str) |
561eba2a |
129 | { |
130 | GtkWidget * dialogue; |
131 | GtkWidget * text; |
132 | GtkWidget * label; |
133 | gint id; |
134 | |
5723fa24 |
135 | dialogue = gtk_dialog_new_with_buttons(dialogue_title,NULL, |
561eba2a |
136 | GTK_DIALOG_MODAL, |
137 | GTK_STOCK_OK,GTK_RESPONSE_ACCEPT, |
138 | GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT, |
139 | NULL); |
140 | |
6b1d3120 |
141 | label = gtk_label_new(label_str); |
561eba2a |
142 | gtk_widget_show(label); |
143 | |
144 | text = gtk_entry_new(); |
145 | gtk_widget_show(text); |
146 | |
147 | gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), label,TRUE, TRUE,0); |
148 | gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), text,FALSE, FALSE,0); |
149 | |
150 | id = gtk_dialog_run(GTK_DIALOG(dialogue)); |
151 | switch(id){ |
152 | case GTK_RESPONSE_ACCEPT: |
153 | get_label_string(text,str); |
154 | gtk_widget_destroy(dialogue); |
155 | break; |
156 | case GTK_RESPONSE_REJECT: |
157 | default: |
158 | gtk_widget_destroy(dialogue); |
159 | break; |
160 | } |
161 | } |
162 | |
163 | mainWindow * get_window_data_struct(GtkWidget * widget) |
164 | { |
165 | GtkWidget * mw; |
166 | mainWindow * mwData; |
167 | |
168 | mw = lookup_widget(widget, "MWindow"); |
169 | if(mw == NULL){ |
170 | g_printf("Main window does not exist\n"); |
171 | return; |
172 | } |
173 | |
174 | mwData = (mainWindow *) g_object_get_data(G_OBJECT(mw),"mainWindow"); |
175 | if(mwData == NULL){ |
176 | g_printf("Main window data does not exist\n"); |
177 | return; |
178 | } |
179 | return mwData; |
180 | } |
181 | |
182 | void createNewWindow(GtkWidget* widget, gpointer user_data, gboolean clone) |
183 | { |
5723fa24 |
184 | mainWindow * parent = get_window_data_struct(widget); |
561eba2a |
185 | |
5723fa24 |
186 | constructMainWin(parent, NULL); |
561eba2a |
187 | |
188 | if(clone){ |
189 | g_printf("Clone : use the same traceset\n"); |
190 | }else{ |
191 | g_printf("Empty : traceset is set to NULL\n"); |
192 | } |
193 | } |
194 | |
195 | void move_up_viewer(GtkWidget * widget, gpointer user_data) |
196 | { |
197 | mainWindow * mw = get_window_data_struct(widget); |
198 | if(!mw->CurrentTab) return; |
199 | gtk_custom_widget_move_up(mw->CurrentTab->custom); |
200 | } |
201 | |
202 | void move_down_viewer(GtkWidget * widget, gpointer user_data) |
203 | { |
204 | mainWindow * mw = get_window_data_struct(widget); |
205 | if(!mw->CurrentTab) return; |
206 | gtk_custom_widget_move_down(mw->CurrentTab->custom); |
207 | } |
208 | |
209 | void delete_viewer(GtkWidget * widget, gpointer user_data) |
210 | { |
211 | mainWindow * mw = get_window_data_struct(widget); |
212 | if(!mw->CurrentTab) return; |
213 | gtk_custom_widget_delete(mw->CurrentTab->custom); |
214 | } |
215 | |
216 | void open_traceset(GtkWidget * widget, gpointer user_data) |
217 | { |
218 | g_printf("Open a trace set\n"); |
219 | } |
220 | |
221 | void add_trace(GtkWidget * widget, gpointer user_data) |
222 | { |
223 | g_printf("add a trace to a trace set\n"); |
224 | } |
225 | |
226 | void remove_trace(GtkWidget * widget, gpointer user_data) |
227 | { |
228 | g_printf("remove a trace from a trace set\n"); |
229 | } |
230 | |
231 | void save(GtkWidget * widget, gpointer user_data) |
232 | { |
233 | g_printf("Save\n"); |
234 | } |
235 | |
236 | void save_as(GtkWidget * widget, gpointer user_data) |
237 | { |
238 | g_printf("Save as\n"); |
239 | } |
240 | |
241 | void zoom_in(GtkWidget * widget, gpointer user_data) |
242 | { |
243 | g_printf("Zoom in\n"); |
244 | } |
245 | |
246 | void zoom_out(GtkWidget * widget, gpointer user_data) |
247 | { |
248 | g_printf("Zoom out\n"); |
249 | } |
250 | |
251 | void zoom_extended(GtkWidget * widget, gpointer user_data) |
252 | { |
253 | g_printf("Zoom extended\n"); |
254 | } |
255 | |
256 | void go_to_time(GtkWidget * widget, gpointer user_data) |
257 | { |
258 | g_printf("Go to time\n"); |
259 | } |
260 | |
261 | void show_time_frame(GtkWidget * widget, gpointer user_data) |
262 | { |
263 | g_printf("Show time frame\n"); |
264 | } |
265 | |
266 | |
267 | /* callback function */ |
268 | |
269 | void |
270 | on_empty_traceset_activate (GtkMenuItem *menuitem, |
271 | gpointer user_data) |
272 | { |
273 | createNewWindow((GtkWidget*)menuitem, user_data, FALSE); |
274 | } |
275 | |
276 | |
277 | void |
278 | on_clone_traceset_activate (GtkMenuItem *menuitem, |
279 | gpointer user_data) |
280 | { |
281 | createNewWindow((GtkWidget*)menuitem, user_data, TRUE); |
282 | } |
283 | |
284 | |
285 | void |
286 | on_tab_activate (GtkMenuItem *menuitem, |
287 | gpointer user_data) |
288 | { |
6b1d3120 |
289 | gchar label[PATH_LENGTH]; |
561eba2a |
290 | GtkNotebook * notebook = (GtkNotebook *)lookup_widget((GtkWidget*)menuitem, "MNotebook"); |
291 | if(notebook == NULL){ |
292 | g_printf("Notebook does not exist\n"); |
293 | return; |
294 | } |
295 | |
6b1d3120 |
296 | strcpy(label,"Page"); |
5723fa24 |
297 | get_label(NULL, label,"Get the name of the tab","Please input tab's name"); |
561eba2a |
298 | |
5723fa24 |
299 | create_tab ((GtkWidget*)menuitem, notebook, label); |
561eba2a |
300 | } |
301 | |
302 | |
303 | void |
304 | on_open_activate (GtkMenuItem *menuitem, |
305 | gpointer user_data) |
306 | { |
307 | open_traceset((GtkWidget*)menuitem, user_data); |
308 | } |
309 | |
310 | |
311 | void |
312 | on_close_activate (GtkMenuItem *menuitem, |
313 | gpointer user_data) |
314 | { |
315 | g_printf("Close\n"); |
316 | } |
317 | |
318 | |
319 | void |
320 | on_close_tab_activate (GtkMenuItem *menuitem, |
321 | gpointer user_data) |
322 | { |
323 | g_printf("Close tab\n"); |
324 | } |
325 | |
326 | |
327 | void |
328 | on_add_trace_activate (GtkMenuItem *menuitem, |
329 | gpointer user_data) |
330 | { |
331 | add_trace((GtkWidget*)menuitem, user_data); |
332 | } |
333 | |
334 | |
335 | void |
336 | on_remove_trace_activate (GtkMenuItem *menuitem, |
337 | gpointer user_data) |
338 | { |
339 | remove_trace((GtkWidget*)menuitem, user_data); |
340 | } |
341 | |
342 | |
343 | void |
344 | on_save_activate (GtkMenuItem *menuitem, |
345 | gpointer user_data) |
346 | { |
347 | save((GtkWidget*)menuitem, user_data); |
348 | } |
349 | |
350 | |
351 | void |
352 | on_save_as_activate (GtkMenuItem *menuitem, |
353 | gpointer user_data) |
354 | { |
355 | save_as((GtkWidget*)menuitem, user_data); |
356 | } |
357 | |
358 | |
359 | void |
360 | on_quit_activate (GtkMenuItem *menuitem, |
361 | gpointer user_data) |
362 | { |
7a859036 |
363 | mainWindow * mwData = get_window_data_struct((GtkWidget*)menuitem); |
364 | mainWindow_Destructor(mwData); |
561eba2a |
365 | } |
366 | |
367 | |
368 | void |
369 | on_cut_activate (GtkMenuItem *menuitem, |
370 | gpointer user_data) |
371 | { |
372 | g_printf("Cut\n"); |
373 | } |
374 | |
375 | |
376 | void |
377 | on_copy_activate (GtkMenuItem *menuitem, |
378 | gpointer user_data) |
379 | { |
380 | g_printf("Copye\n"); |
381 | } |
382 | |
383 | |
384 | void |
385 | on_paste_activate (GtkMenuItem *menuitem, |
386 | gpointer user_data) |
387 | { |
388 | g_printf("Paste\n"); |
389 | } |
390 | |
391 | |
392 | void |
393 | on_delete_activate (GtkMenuItem *menuitem, |
394 | gpointer user_data) |
395 | { |
396 | g_printf("Delete\n"); |
397 | } |
398 | |
399 | |
400 | void |
401 | on_zoom_in_activate (GtkMenuItem *menuitem, |
402 | gpointer user_data) |
403 | { |
404 | zoom_in((GtkWidget*)menuitem, user_data); |
405 | } |
406 | |
407 | |
408 | void |
409 | on_zoom_out_activate (GtkMenuItem *menuitem, |
410 | gpointer user_data) |
411 | { |
412 | zoom_out((GtkWidget*)menuitem, user_data); |
413 | } |
414 | |
415 | |
416 | void |
417 | on_zoom_extended_activate (GtkMenuItem *menuitem, |
418 | gpointer user_data) |
419 | { |
420 | zoom_extended((GtkWidget*)menuitem, user_data); |
421 | } |
422 | |
423 | |
424 | void |
425 | on_go_to_time_activate (GtkMenuItem *menuitem, |
426 | gpointer user_data) |
427 | { |
428 | go_to_time((GtkWidget*)menuitem, user_data); |
429 | } |
430 | |
431 | |
432 | void |
433 | on_show_time_frame_activate (GtkMenuItem *menuitem, |
434 | gpointer user_data) |
435 | { |
436 | show_time_frame((GtkWidget*)menuitem, user_data); |
437 | } |
438 | |
439 | |
440 | void |
441 | on_move_viewer_up_activate (GtkMenuItem *menuitem, |
442 | gpointer user_data) |
443 | { |
444 | move_up_viewer((GtkWidget*)menuitem, user_data); |
445 | } |
446 | |
447 | |
448 | void |
449 | on_move_viewer_down_activate (GtkMenuItem *menuitem, |
450 | gpointer user_data) |
451 | { |
452 | move_down_viewer((GtkWidget*)menuitem, user_data); |
453 | } |
454 | |
455 | |
456 | void |
457 | on_remove_viewer_activate (GtkMenuItem *menuitem, |
458 | gpointer user_data) |
459 | { |
460 | delete_viewer((GtkWidget*)menuitem, user_data); |
461 | } |
462 | |
463 | |
464 | void |
465 | on_load_module_activate (GtkMenuItem *menuitem, |
466 | gpointer user_data) |
467 | { |
36b3c068 |
468 | char ** dir; |
469 | gint id; |
470 | char str[PATH_LENGTH]; |
471 | mainWindow * mwData = get_window_data_struct((GtkWidget*)menuitem); |
472 | GtkFileSelection * fileSelector = (GtkFileSelection *)gtk_file_selection_new("Select a module"); |
473 | gtk_file_selection_hide_fileop_buttons(fileSelector); |
474 | |
475 | str[0] = '\0'; |
476 | id = gtk_dialog_run(GTK_DIALOG(fileSelector)); |
477 | switch(id){ |
478 | case GTK_RESPONSE_ACCEPT: |
479 | case GTK_RESPONSE_OK: |
480 | dir = gtk_file_selection_get_selections (fileSelector); |
481 | sprintf(str,dir[0]); |
482 | if(mwData->winCreationData) |
483 | lttv_module_load(str, mwData->winCreationData->argc,mwData->winCreationData->argv); |
484 | else |
485 | lttv_module_load(str, 0,NULL); |
486 | g_strfreev(dir); |
487 | case GTK_RESPONSE_REJECT: |
488 | case GTK_RESPONSE_CANCEL: |
489 | default: |
490 | gtk_widget_destroy((GtkWidget*)fileSelector); |
491 | break; |
492 | } |
493 | g_printf("Load module: %s\n", str); |
561eba2a |
494 | } |
495 | |
496 | |
497 | void |
498 | on_unload_module_activate (GtkMenuItem *menuitem, |
499 | gpointer user_data) |
500 | { |
36b3c068 |
501 | int i; |
502 | char **name, *unload_module_name; |
503 | guint nb; |
504 | LttvModule ** modules, *module; |
505 | mainWindow * mwData = get_window_data_struct((GtkWidget*)menuitem); |
506 | |
507 | modules = lttv_module_list(&nb); |
508 | name = g_new(char*, nb); |
509 | for(i=0;i<nb;i++){ |
510 | module = modules[i]; |
511 | name[i] = lttv_module_name(module); |
512 | } |
513 | |
514 | unload_module_name =get_unload_module(name,nb); |
515 | |
516 | if(unload_module_name){ |
517 | for(i=0;i<nb;i++){ |
518 | if(strcmp(unload_module_name, name[i]) == 0){ |
519 | lttv_module_unload(modules[i]); |
520 | break; |
521 | } |
522 | } |
523 | } |
524 | |
525 | g_free(name); |
561eba2a |
526 | } |
527 | |
528 | |
529 | void |
530 | on_add_module_search_path_activate (GtkMenuItem *menuitem, |
531 | gpointer user_data) |
532 | { |
fc188b78 |
533 | GtkDirSelection * fileSelector = (GtkDirSelection *)gtk_dir_selection_new("Select module path"); |
534 | char * dir; |
535 | gint id; |
536 | |
6b1d3120 |
537 | mainWindow * mwData = get_window_data_struct((GtkWidget*)menuitem); |
fc188b78 |
538 | |
539 | id = gtk_dialog_run(GTK_DIALOG(fileSelector)); |
540 | switch(id){ |
541 | case GTK_RESPONSE_ACCEPT: |
542 | case GTK_RESPONSE_OK: |
543 | dir = gtk_dir_selection_get_dir (fileSelector); |
544 | lttv_module_path_add(dir); |
545 | case GTK_RESPONSE_REJECT: |
546 | case GTK_RESPONSE_CANCEL: |
547 | default: |
548 | gtk_widget_destroy((GtkWidget*)fileSelector); |
549 | break; |
6b1d3120 |
550 | } |
561eba2a |
551 | } |
552 | |
553 | |
554 | void |
555 | on_color_activate (GtkMenuItem *menuitem, |
556 | gpointer user_data) |
557 | { |
558 | g_printf("Color\n"); |
559 | } |
560 | |
561 | |
562 | void |
563 | on_filter_activate (GtkMenuItem *menuitem, |
564 | gpointer user_data) |
565 | { |
566 | g_printf("Filter\n"); |
567 | } |
568 | |
569 | |
570 | void |
571 | on_save_configuration_activate (GtkMenuItem *menuitem, |
572 | gpointer user_data) |
573 | { |
574 | g_printf("Save configuration\n"); |
575 | } |
576 | |
577 | |
578 | void |
579 | on_content_activate (GtkMenuItem *menuitem, |
580 | gpointer user_data) |
581 | { |
582 | g_printf("Content\n"); |
583 | } |
584 | |
585 | |
586 | void |
587 | on_about_activate (GtkMenuItem *menuitem, |
588 | gpointer user_data) |
589 | { |
590 | g_printf("About...\n"); |
591 | } |
592 | |
593 | |
594 | void |
595 | on_button_new_clicked (GtkButton *button, |
596 | gpointer user_data) |
597 | { |
598 | createNewWindow((GtkWidget*)button, user_data, FALSE); |
599 | } |
600 | |
601 | |
602 | void |
603 | on_button_open_clicked (GtkButton *button, |
604 | gpointer user_data) |
605 | { |
606 | open_traceset((GtkWidget*)button, user_data); |
607 | } |
608 | |
609 | |
610 | void |
611 | on_button_add_trace_clicked (GtkButton *button, |
612 | gpointer user_data) |
613 | { |
614 | add_trace((GtkWidget*)button, user_data); |
615 | } |
616 | |
617 | |
618 | void |
619 | on_button_remove_trace_clicked (GtkButton *button, |
620 | gpointer user_data) |
621 | { |
622 | remove_trace((GtkWidget*)button, user_data); |
623 | } |
624 | |
625 | |
626 | void |
627 | on_button_save_clicked (GtkButton *button, |
628 | gpointer user_data) |
629 | { |
630 | save((GtkWidget*)button, user_data); |
631 | } |
632 | |
633 | |
634 | void |
635 | on_button_save_as_clicked (GtkButton *button, |
636 | gpointer user_data) |
637 | { |
638 | save_as((GtkWidget*)button, user_data); |
639 | } |
640 | |
641 | |
642 | void |
643 | on_button_zoom_in_clicked (GtkButton *button, |
644 | gpointer user_data) |
645 | { |
646 | zoom_in((GtkWidget*)button, user_data); |
647 | } |
648 | |
649 | |
650 | void |
651 | on_button_zoom_out_clicked (GtkButton *button, |
652 | gpointer user_data) |
653 | { |
654 | zoom_out((GtkWidget*)button, user_data); |
655 | } |
656 | |
657 | |
658 | void |
659 | on_button_zoom_extended_clicked (GtkButton *button, |
660 | gpointer user_data) |
661 | { |
662 | zoom_extended((GtkWidget*)button, user_data); |
663 | } |
664 | |
665 | |
666 | void |
667 | on_button_go_to_time_clicked (GtkButton *button, |
668 | gpointer user_data) |
669 | { |
670 | go_to_time((GtkWidget*)button, user_data); |
671 | } |
672 | |
673 | |
674 | void |
675 | on_button_show_time_frame_clicked (GtkButton *button, |
676 | gpointer user_data) |
677 | { |
678 | show_time_frame((GtkWidget*)button, user_data); |
679 | } |
680 | |
681 | |
682 | void |
683 | on_button_move_up_clicked (GtkButton *button, |
684 | gpointer user_data) |
685 | { |
686 | move_up_viewer((GtkWidget*)button, user_data); |
687 | } |
688 | |
689 | |
690 | void |
691 | on_button_move_down_clicked (GtkButton *button, |
692 | gpointer user_data) |
693 | { |
694 | move_down_viewer((GtkWidget*)button, user_data); |
695 | } |
696 | |
697 | |
698 | void |
699 | on_button_delete_viewer_clicked (GtkButton *button, |
700 | gpointer user_data) |
701 | { |
702 | delete_viewer((GtkWidget*)button, user_data); |
703 | } |
704 | |
705 | void |
706 | on_MWindow_destroy (GtkObject *object, |
707 | gpointer user_data) |
708 | { |
f7afe191 |
709 | mainWindow *Main_Window = (mainWindow*)user_data; |
710 | |
5723fa24 |
711 | g_printf("There are : %d windows\n",g_slist_length(Main_Window_List)); |
561eba2a |
712 | |
7a859036 |
713 | gWinCount--; |
714 | if(gWinCount == 0) |
715 | gtk_main_quit (); |
561eba2a |
716 | } |
717 | |
718 | |
719 | void |
720 | on_MNotebook_switch_page (GtkNotebook *notebook, |
721 | GtkNotebookPage *page, |
722 | guint page_num, |
723 | gpointer user_data) |
724 | { |
725 | mainWindow * mw = get_window_data_struct((GtkWidget*)notebook); |
726 | tab * Tab = mw->Tab; |
727 | |
728 | while(page_num){ |
729 | Tab = Tab->Next; |
730 | page_num--; |
731 | } |
732 | mw->CurrentTab = Tab; |
733 | } |
734 | |
36b3c068 |
735 | char * get_unload_module(char ** loaded_module_name, int nb_module) |
736 | { |
737 | GtkWidget * dialogue; |
738 | GtkWidget * scroll_win; |
739 | GtkWidget * tree; |
740 | GtkListStore * store; |
741 | GtkTreeViewColumn * column; |
742 | GtkCellRenderer * renderer; |
743 | GtkTreeSelection * select; |
744 | GtkTreeIter iter; |
745 | gint id, i; |
746 | char * unload_module_name = NULL; |
747 | |
748 | dialogue = gtk_dialog_new_with_buttons("Select an unload module", |
749 | NULL, |
750 | GTK_DIALOG_MODAL, |
751 | GTK_STOCK_OK,GTK_RESPONSE_ACCEPT, |
752 | GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT, |
753 | NULL); |
754 | gtk_window_set_default_size((GtkWindow*)dialogue, 500, 200); |
755 | |
756 | scroll_win = gtk_scrolled_window_new (NULL, NULL); |
757 | gtk_widget_show ( scroll_win); |
758 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win), |
759 | GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); |
760 | |
761 | store = gtk_list_store_new (N_COLUMNS,G_TYPE_STRING); |
762 | tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL (store)); |
763 | gtk_widget_show ( tree); |
764 | g_object_unref (G_OBJECT (store)); |
765 | |
766 | renderer = gtk_cell_renderer_text_new (); |
767 | column = gtk_tree_view_column_new_with_attributes ("MODULE NAME", |
768 | renderer, |
769 | "text", MODULE_COLUMN, |
770 | NULL); |
771 | gtk_tree_view_column_set_alignment (column, 0.5); |
772 | gtk_tree_view_column_set_fixed_width (column, 150); |
773 | gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column); |
774 | |
775 | select = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree)); |
776 | gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE); |
777 | |
778 | gtk_container_add (GTK_CONTAINER (scroll_win), tree); |
779 | |
780 | gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), scroll_win,TRUE, TRUE,0); |
781 | |
782 | for(i=0;i<nb_module;i++){ |
783 | gtk_list_store_append (store, &iter); |
784 | gtk_list_store_set (store, &iter, MODULE_COLUMN,loaded_module_name[i],-1); |
785 | } |
786 | |
787 | id = gtk_dialog_run(GTK_DIALOG(dialogue)); |
788 | switch(id){ |
789 | case GTK_RESPONSE_ACCEPT: |
790 | case GTK_RESPONSE_OK: |
791 | if (gtk_tree_selection_get_selected (select, (GtkTreeModel**)&store, &iter)){ |
792 | gtk_tree_model_get ((GtkTreeModel*)store, &iter, MODULE_COLUMN, &unload_module_name, -1); |
793 | } |
794 | case GTK_RESPONSE_REJECT: |
795 | case GTK_RESPONSE_CANCEL: |
796 | default: |
797 | gtk_widget_destroy(dialogue); |
798 | break; |
799 | } |
800 | |
801 | return unload_module_name; |
802 | } |
5723fa24 |
803 | |
804 | void insertMenuToolbarItem(mainWindow * mw) |
805 | { |
806 | int i; |
807 | GdkPixbuf *pixbuf; |
808 | view_constructor constructor; |
809 | LttvMenus * menu; |
810 | LttvToolbars * toolbar; |
811 | lttv_menu_closure *menuItem; |
812 | lttv_toolbar_closure *toolbarItem; |
813 | LttvAttributeValue value; |
814 | LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes()); |
815 | GtkWidget * ToolMenuTitle_menu, *insert_view, *pixmap; |
816 | |
817 | g_assert(lttv_iattribute_find_by_path(attributes, |
818 | "viewers/menu", LTTV_POINTER, &value)); |
819 | menu = (LttvMenus*)*(value.v_pointer); |
820 | |
821 | if(menu){ |
822 | for(i=0;i<menu->len;i++){ |
823 | menuItem = &g_array_index(menu, lttv_menu_closure, i); |
824 | constructor = menuItem->con; |
825 | ToolMenuTitle_menu = lookup_widget(mw->MWindow,"ToolMenuTitle_menu"); |
826 | insert_view = gtk_menu_item_new_with_mnemonic (menuItem->menuText); |
827 | gtk_widget_show (insert_view); |
828 | gtk_container_add (GTK_CONTAINER (ToolMenuTitle_menu), insert_view); |
829 | g_signal_connect ((gpointer) insert_view, "activate", |
830 | G_CALLBACK (insertViewTest), |
831 | constructor); |
832 | } |
833 | } |
834 | |
835 | g_assert(lttv_iattribute_find_by_path(attributes, |
836 | "viewers/toolbar", LTTV_POINTER, &value)); |
837 | toolbar = (LttvToolbars*)*(value.v_pointer); |
838 | |
839 | if(toolbar){ |
840 | for(i=0;i<toolbar->len;i++){ |
841 | toolbarItem = &g_array_index(toolbar, lttv_toolbar_closure, i); |
842 | constructor = toolbarItem->con; |
843 | ToolMenuTitle_menu = lookup_widget(mw->MWindow,"MToolbar2"); |
844 | pixbuf = gdk_pixbuf_new_from_xpm_data ((const char**)toolbarItem->pixmap); |
845 | pixmap = gtk_image_new_from_pixbuf(pixbuf); |
846 | insert_view = gtk_toolbar_append_element (GTK_TOOLBAR (ToolMenuTitle_menu), |
847 | GTK_TOOLBAR_CHILD_BUTTON, |
848 | NULL, |
849 | "", |
850 | toolbarItem->tooltip, NULL, |
851 | pixmap, NULL, NULL); |
852 | gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (ToolMenuTitle_menu)->children)->data))->label), TRUE); |
853 | gtk_widget_show (insert_view); |
854 | gtk_container_set_border_width (GTK_CONTAINER (insert_view), 1); |
855 | g_signal_connect ((gpointer) insert_view, "clicked",G_CALLBACK (insertViewTest),constructor); |
856 | } |
857 | } |
858 | } |
859 | |
860 | void constructMainWin(mainWindow * parent, WindowCreationData * win_creation_data) |
861 | { |
f7afe191 |
862 | g_critical("constructMainWin()"); |
7a859036 |
863 | // systemView * sv = NULL; /* System view */ |
f7afe191 |
864 | //systemView * newSv; /* New system view displayed in the new window */ |
5723fa24 |
865 | GtkWidget * newWindow; /* New generated main window */ |
866 | mainWindow * newMWindow;/* New main window structure */ |
867 | GtkNotebook * notebook; |
f7afe191 |
868 | LttvIAttribute *attributes = |
869 | LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL)); |
870 | LttvAttributeValue value; |
871 | |
7a859036 |
872 | // if(parent) sv = parent->SystemView; |
5723fa24 |
873 | |
874 | newMWindow = g_new(mainWindow, 1); |
875 | |
876 | // Add the object's information to the module's array |
877 | Main_Window_List = g_slist_append(Main_Window_List, newMWindow); |
878 | |
f7afe191 |
879 | |
5723fa24 |
880 | newWindow = create_MWindow(); |
881 | gtk_widget_show (newWindow); |
882 | |
f7afe191 |
883 | //newSv = g_new(systemView, 1); |
7a859036 |
884 | // if(sv){ |
885 | // while(sv->Next) sv = sv->Next; |
886 | // sv->Next = newSv; |
887 | // } |
5723fa24 |
888 | |
f7afe191 |
889 | //newSv->EventDB = NULL; |
890 | //newSv->SystemInfo = NULL; |
891 | //newSv->Options = NULL; |
892 | //newSv->Next = NULL; |
893 | //newSv->Window = newMWindow; |
894 | |
895 | newMWindow->Attributes = attributes; |
896 | |
897 | newMWindow->Traceset_Info = g_new(TracesetInfo,1); |
898 | newMWindow->Traceset_Info->path = NULL ; |
899 | |
900 | |
901 | newMWindow->Traceset_Info->before_traceset = lttv_hooks_new(); |
902 | newMWindow->Traceset_Info->after_traceset = lttv_hooks_new(); |
903 | newMWindow->Traceset_Info->before_trace = lttv_hooks_new(); |
904 | newMWindow->Traceset_Info->after_trace = lttv_hooks_new(); |
905 | newMWindow->Traceset_Info->before_tracefile = lttv_hooks_new(); |
906 | newMWindow->Traceset_Info->after_tracefile = lttv_hooks_new(); |
907 | newMWindow->Traceset_Info->before_event = lttv_hooks_new(); |
908 | newMWindow->Traceset_Info->after_event = lttv_hooks_new(); |
909 | |
910 | g_assert(lttv_iattribute_find_by_path(attributes, "hooks/traceset/before", |
911 | LTTV_POINTER, &value)); |
912 | *(value.v_pointer) = newMWindow->Traceset_Info->before_traceset; |
913 | g_assert(lttv_iattribute_find_by_path(attributes, "hooks/traceset/after", |
914 | LTTV_POINTER, &value)); |
915 | *(value.v_pointer) = newMWindow->Traceset_Info->after_traceset; |
916 | g_assert(lttv_iattribute_find_by_path(attributes, "hooks/trace/before", |
917 | LTTV_POINTER, &value)); |
918 | *(value.v_pointer) = newMWindow->Traceset_Info->before_trace; |
919 | g_assert(lttv_iattribute_find_by_path(attributes, "hooks/trace/after", |
920 | LTTV_POINTER, &value)); |
921 | *(value.v_pointer) = newMWindow->Traceset_Info->after_trace; |
922 | g_assert(lttv_iattribute_find_by_path(attributes, "hooks/tracefile/before", |
923 | LTTV_POINTER, &value)); |
924 | *(value.v_pointer) = newMWindow->Traceset_Info->before_tracefile; |
925 | g_assert(lttv_iattribute_find_by_path(attributes, "hooks/tracefile/after", |
926 | LTTV_POINTER, &value)); |
927 | *(value.v_pointer) = newMWindow->Traceset_Info->after_tracefile; |
928 | g_assert(lttv_iattribute_find_by_path(attributes, "hooks/event/before", |
929 | LTTV_POINTER, &value)); |
930 | *(value.v_pointer) = newMWindow->Traceset_Info->before_event; |
931 | g_assert(lttv_iattribute_find_by_path(attributes, "hooks/event/after", |
932 | LTTV_POINTER, &value)); |
933 | *(value.v_pointer) = newMWindow->Traceset_Info->after_event; |
934 | |
935 | |
5723fa24 |
936 | newMWindow->MWindow = newWindow; |
937 | newMWindow->Tab = NULL; |
938 | newMWindow->CurrentTab = NULL; |
f7afe191 |
939 | //newMWindow->SystemView = newSv; |
5723fa24 |
940 | newMWindow->Attributes = LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL)); |
941 | if(parent){ |
f7afe191 |
942 | newMWindow->Traceset_Info->traceset = |
943 | lttv_traceset_copy(parent->Traceset_Info->traceset); |
944 | |
945 | //FIXME copy not implemented in lower level |
946 | newMWindow->Traceset_Info->TracesetContext = |
947 | g_object_new(LTTV_TRACESET_STATS_TYPE, NULL); |
948 | lttv_context_init( |
949 | LTTV_TRACESET_CONTEXT(newMWindow->Traceset_Info->TracesetContext), |
950 | newMWindow->Traceset_Info->traceset); |
951 | //newMWindow->traceset_context = parent->traceset_context; |
5723fa24 |
952 | newMWindow->winCreationData = parent->winCreationData; |
953 | }else{ |
f7afe191 |
954 | newMWindow->Traceset_Info->traceset = lttv_traceset_new(); |
955 | |
956 | /* Add the command line trace */ |
957 | if(gInit_Trace != NULL) |
958 | lttv_traceset_add(newMWindow->Traceset_Info->traceset, gInit_Trace); |
959 | /* NOTE : the context must be recreated if we change the traceset, |
960 | * ie : adding/removing traces */ |
961 | newMWindow->Traceset_Info->TracesetContext = |
962 | g_object_new(LTTV_TRACESET_STATS_TYPE, NULL); |
963 | lttv_context_init( |
964 | LTTV_TRACESET_CONTEXT(newMWindow->Traceset_Info->TracesetContext), |
965 | newMWindow->Traceset_Info->traceset); |
966 | |
5723fa24 |
967 | newMWindow->winCreationData = win_creation_data; |
968 | } |
969 | |
970 | insertMenuToolbarItem(newMWindow); |
971 | |
f7afe191 |
972 | //g_object_set_data(G_OBJECT(newWindow), "systemView", (gpointer)newSv); |
5723fa24 |
973 | g_object_set_data(G_OBJECT(newWindow), "mainWindow", (gpointer)newMWindow); |
974 | |
975 | //create a default tab |
976 | notebook = (GtkNotebook *)lookup_widget(newMWindow->MWindow, "MNotebook"); |
977 | if(notebook == NULL){ |
978 | g_printf("Notebook does not exist\n"); |
979 | return; |
980 | } |
981 | //for now there is no name field in LttvTraceset structure |
982 | //Use "Traceset" as the label for the default tab |
983 | create_tab(newMWindow->MWindow, notebook,"Traceset"); |
984 | |
7a859036 |
985 | g_object_set_data_full( |
986 | G_OBJECT(newMWindow->MWindow), |
987 | "Main_Window_Data", |
988 | newMWindow, |
989 | (GDestroyNotify)mainWindow_free); |
990 | |
991 | gWinCount++; |
5723fa24 |
992 | } |
993 | |
f7afe191 |
994 | void Tab_Destructor(tab *Tab) |
995 | { |
996 | if(Tab->Attributes) |
997 | g_object_unref(Tab->Attributes); |
998 | g_free(Tab); |
999 | } |
1000 | |
5723fa24 |
1001 | void * create_tab(GtkWidget* parent, GtkNotebook * notebook, char * label) |
1002 | { |
1003 | GList * list; |
1004 | tab * tmpTab; |
1005 | mainWindow * mwData; |
f7afe191 |
1006 | LttTime TmpTime; |
5723fa24 |
1007 | |
1008 | mwData = get_window_data_struct(parent); |
5723fa24 |
1009 | tmpTab = mwData->Tab; |
1010 | while(tmpTab && tmpTab->Next) tmpTab = tmpTab->Next; |
1011 | if(!tmpTab){ |
1012 | mwData->CurrentTab = NULL; |
1013 | tmpTab = g_new(tab,1); |
1014 | mwData->Tab = tmpTab; |
1015 | }else{ |
1016 | tmpTab->Next = g_new(tab,1); |
1017 | tmpTab = tmpTab->Next; |
1018 | } |
1019 | if(mwData->CurrentTab){ |
f7afe191 |
1020 | // Will have to read directly at the main window level, as we want |
1021 | // to be able to modify a traceset on the fly. |
1022 | // tmpTab->traceStartTime = mwData->CurrentTab->traceStartTime; |
1023 | // tmpTab->traceEndTime = mwData->CurrentTab->traceEndTime; |
1024 | tmpTab->Time_Window = mwData->CurrentTab->Time_Window; |
5723fa24 |
1025 | tmpTab->currentTime = mwData->CurrentTab->currentTime; |
1026 | }else{ |
f7afe191 |
1027 | // Will have to read directly at the main window level, as we want |
1028 | // to be able to modify a traceset on the fly. |
1029 | // getTracesetTimeSpan(mwData,&tmpTab->traceStartTime, &tmpTab->traceEndTime); |
1030 | tmpTab->Time_Window.startTime = |
1031 | LTTV_TRACESET_CONTEXT(mwData->Traceset_Info->TracesetContext)->Time_Span->startTime; |
1032 | if(DEFAULT_TIME_WIDTH_S < |
1033 | LTTV_TRACESET_CONTEXT(mwData->Traceset_Info->TracesetContext)->Time_Span->endTime.tv_sec) |
1034 | TmpTime.tv_sec = DEFAULT_TIME_WIDTH_S; |
1035 | else |
1036 | TmpTime.tv_sec = |
1037 | LTTV_TRACESET_CONTEXT(mwData->Traceset_Info->TracesetContext)->Time_Span->endTime.tv_sec; |
1038 | TmpTime.tv_nsec = 0; |
1039 | tmpTab->Time_Window.Time_Width = TmpTime ; |
1040 | tmpTab->currentTime.tv_sec = TmpTime.tv_sec / 2; |
1041 | tmpTab->currentTime.tv_nsec = 0 ; |
5723fa24 |
1042 | } |
1043 | tmpTab->Attributes = LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL)); |
1044 | // mwData->CurrentTab = tmpTab; |
1045 | tmpTab->custom = (GtkCustom*)gtk_custom_new(); |
1046 | tmpTab->custom->mw = mwData; |
1047 | gtk_widget_show((GtkWidget*)tmpTab->custom); |
1048 | tmpTab->Next = NULL; |
1049 | |
1050 | tmpTab->label = gtk_label_new (label); |
1051 | gtk_widget_show (tmpTab->label); |
1052 | |
f7afe191 |
1053 | g_object_set_data_full( |
1054 | G_OBJECT(tmpTab->custom), |
1055 | "Tab_Info", |
1056 | tmpTab, |
1057 | (GDestroyNotify)Tab_Destructor); |
5723fa24 |
1058 | |
f7afe191 |
1059 | gtk_notebook_append_page(notebook, (GtkWidget*)tmpTab->custom, tmpTab->label); |
5723fa24 |
1060 | list = gtk_container_get_children(GTK_CONTAINER(notebook)); |
1061 | gtk_notebook_set_current_page(notebook,g_list_length(list)-1); |
1062 | } |