1 /* GSequencer - Advanced GTK Sequencer
2  * Copyright (C) 2005-2020 Joël Krähemann
3  *
4  * This file is part of GSequencer.
5  *
6  * GSequencer is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * GSequencer is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with GSequencer.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include <ags/X/ags_menu_bar.h>
21 #include <ags/X/ags_menu_action_callbacks.h>
22 
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <sys/types.h>
27 #include <unistd.h>
28 
29 #include <ladspa.h>
30 #include <lv2.h>
31 #include <dssi.h>
32 
33 #include <ags/config.h>
34 #include <ags/i18n.h>
35 
36 void ags_menu_bar_class_init(AgsMenuBarClass *menu_bar);
37 void ags_menu_bar_connectable_interface_init(AgsConnectableInterface *connectable);
38 void ags_menu_bar_init(AgsMenuBar *menu_bar);
39 void ags_menu_bar_set_property(GObject *gobject,
40 			       guint prop_id,
41 			       const GValue *value,
42 			       GParamSpec *param_spec);
43 void ags_menu_bar_get_property(GObject *gobject,
44 			       guint prop_id,
45 			       GValue *value,
46 			       GParamSpec *param_spec);
47 
48 void ags_menu_bar_connect(AgsConnectable *connectable);
49 void ags_menu_bar_disconnect(AgsConnectable *connectable);
50 
51 /**
52  * SECTION:ags_menu_bar
53  * @short_description: the menu bar.
54  * @title: AgsMenuBar
55  * @section_id:
56  * @include: ags/X/ags_menu_bar.h
57  *
58  * #AgsMenuBar is a composite widget to be used as application's menu bar.
59  */
60 
61 GType
ags_menu_bar_get_type(void)62 ags_menu_bar_get_type(void)
63 {
64   static volatile gsize g_define_type_id__volatile = 0;
65 
66   if(g_once_init_enter (&g_define_type_id__volatile)){
67     GType ags_type_menu_bar = 0;
68 
69     static const GTypeInfo ags_menu_bar_info = {
70       sizeof (AgsMenuBarClass),
71       NULL, /* base_init */
72       NULL, /* base_finalize */
73       (GClassInitFunc) ags_menu_bar_class_init,
74       NULL, /* class_finalize */
75       NULL, /* class_data */
76       sizeof (AgsMenuBar),
77       0,    /* n_preallocs */
78       (GInstanceInitFunc) ags_menu_bar_init,
79     };
80 
81     static const GInterfaceInfo ags_connectable_interface_info = {
82       (GInterfaceInitFunc) ags_menu_bar_connectable_interface_init,
83       NULL, /* interface_finalize */
84       NULL, /* interface_data */
85     };
86 
87     ags_type_menu_bar = g_type_register_static(GTK_TYPE_MENU_BAR,
88 					       "AgsMenuBar", &ags_menu_bar_info,
89 					       0);
90 
91     g_type_add_interface_static(ags_type_menu_bar,
92 				AGS_TYPE_CONNECTABLE,
93 				&ags_connectable_interface_info);
94 
95     g_once_init_leave(&g_define_type_id__volatile, ags_type_menu_bar);
96   }
97 
98   return g_define_type_id__volatile;
99 }
100 
101 void
ags_menu_bar_connectable_interface_init(AgsConnectableInterface * connectable)102 ags_menu_bar_connectable_interface_init(AgsConnectableInterface *connectable)
103 {
104   connectable->is_ready = NULL;
105   connectable->is_connected = NULL;
106   connectable->connect = ags_menu_bar_connect;
107   connectable->disconnect = ags_menu_bar_disconnect;
108 }
109 
110 void
ags_menu_bar_class_init(AgsMenuBarClass * menu_bar)111 ags_menu_bar_class_init(AgsMenuBarClass *menu_bar)
112 {
113 }
114 
115 void
ags_menu_bar_init(AgsMenuBar * menu_bar)116 ags_menu_bar_init(AgsMenuBar *menu_bar)
117 {
118   GtkMenuItem *item;
119 
120   menu_bar->flags = 0;
121 
122   /* File */
123   item = (GtkMenuItem *) gtk_menu_item_new_with_mnemonic(i18n("_File"));
124   gtk_menu_shell_append((GtkMenuShell*) menu_bar, (GtkWidget*) item);
125 
126   menu_bar->file = (GtkMenu *) gtk_menu_new();
127   gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) menu_bar->file);
128 
129   item = (GtkMenuItem *) gtk_menu_item_new_with_mnemonic(i18n("_Open"));
130   gtk_menu_shell_append((GtkMenuShell*) menu_bar->file, (GtkWidget*) item);
131 
132   item = (GtkMenuItem *) gtk_menu_item_new_with_mnemonic(i18n("_Save"));
133   gtk_menu_shell_append((GtkMenuShell*) menu_bar->file, (GtkWidget*) item);
134 
135   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Save as"));
136   gtk_menu_shell_append((GtkMenuShell*) menu_bar->file, (GtkWidget*) item);
137 
138   gtk_menu_shell_append((GtkMenuShell*) menu_bar->file,
139 			(GtkWidget*) gtk_separator_menu_item_new());
140 
141   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("export"));
142   gtk_menu_shell_append((GtkMenuShell*) menu_bar->file, (GtkWidget*) item);
143 
144   gtk_menu_shell_append((GtkMenuShell*) menu_bar->file,
145 			(GtkWidget*) gtk_separator_menu_item_new());
146 
147   item = (GtkMenuItem *) gtk_menu_item_new_with_mnemonic(i18n("_Quit"));
148   gtk_menu_shell_append((GtkMenuShell*) menu_bar->file, (GtkWidget*) item);
149 
150   /* Edit */
151   item = (GtkMenuItem *) gtk_menu_item_new_with_mnemonic(i18n("_Edit"));
152   gtk_menu_shell_append((GtkMenuShell*) menu_bar, (GtkWidget*) item);
153 
154   menu_bar->edit = (GtkMenu *) gtk_menu_new();
155   gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) menu_bar->edit);
156 
157   //  item = (GtkMenuItem *) gtk_menu_item_new_with_label(GTK_STOCK_UNDO);
158   //  gtk_menu_shell_append((GtkMenuShell*) menu, (GtkWidget*) item);
159 
160   //  item = (GtkMenuItem *) gtk_menu_item_new_with_label(GTK_STOCK_REDO);
161   //  gtk_menu_shell_append((GtkMenuShell*) menu, (GtkWidget*) item);
162 
163   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Add"));
164   gtk_menu_shell_append((GtkMenuShell*) menu_bar->edit, (GtkWidget*) item);
165 
166   menu_bar->add = (GtkMenu *) gtk_menu_new();
167   gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) menu_bar->add);
168 
169   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Panel"));
170   gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item);
171 
172   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Mixer"));
173   gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item);
174 
175   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Spectrometer"));
176   gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item);
177 
178   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Equalizer"));
179   gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item);
180 
181   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Drum"));
182   gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item);
183 
184   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Matrix"));
185   gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item);
186 
187   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Synth"));
188   gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item);
189 
190   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("FM Synth"));
191   gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item);
192 
193   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Syncsynth"));
194   gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item);
195 
196   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("FM Syncsynth"));
197   gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item);
198 
199 #ifdef AGS_WITH_LIBINSTPATCH
200   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("FPlayer"));
201   gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item);
202 
203 #if 0
204   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("SF2 Synth"));
205   gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item);
206 #endif
207 #endif
208 
209   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Sampler"));
210   gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item);
211 
212 #if 0
213   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("SFZ Synth"));
214   gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item);
215 #endif
216 
217   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Audiorec"));
218   gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item);
219 
220 #if 0
221   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Desk"));
222   gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item);
223 #endif
224 
225   /* automation */
226   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Automation"));
227   //  gtk_widget_set_sensitive(item,
228   //			   FALSE);
229   gtk_menu_shell_append((GtkMenuShell*) menu_bar->edit, (GtkWidget*) item);
230 
231   /* wave */
232   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Wave"));
233   //  gtk_widget_set_sensitive(item,
234   //			   FALSE);
235   gtk_menu_shell_append((GtkMenuShell*) menu_bar->edit, (GtkWidget*) item);
236 
237   /* preferences */
238   gtk_menu_shell_append((GtkMenuShell*) menu_bar->edit,
239 			(GtkWidget*) gtk_separator_menu_item_new());
240 
241   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Preferences"));
242   gtk_menu_shell_append((GtkMenuShell*) menu_bar->edit, (GtkWidget*) item);
243 
244   /* MIDI */
245   item = (GtkMenuItem *) gtk_menu_item_new_with_label("MIDI");
246   gtk_menu_shell_append((GtkMenuShell*) menu_bar, (GtkWidget*) item);
247 
248   menu_bar->midi = (GtkMenu *) gtk_menu_new();
249   gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) menu_bar->midi);
250 
251   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("import"));
252   gtk_menu_shell_append((GtkMenuShell*) menu_bar->midi, (GtkWidget*) item);
253 
254   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("export track"));
255   gtk_menu_shell_append((GtkMenuShell*) menu_bar->midi, (GtkWidget*) item);
256 
257   gtk_menu_shell_append((GtkMenuShell*) menu_bar->midi,
258 			(GtkWidget*) gtk_separator_menu_item_new());
259 
260   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("playback"));
261   gtk_widget_set_sensitive((GtkWidget *) item,
262 			   FALSE);
263   gtk_menu_shell_append((GtkMenuShell*) menu_bar->midi, (GtkWidget*) item);
264 
265   /* Help */
266   item = (GtkMenuItem *) gtk_menu_item_new_with_mnemonic(i18n("_Help"));
267   gtk_menu_shell_append((GtkMenuShell*) menu_bar, (GtkWidget*) item);
268 
269   menu_bar->help = (GtkMenu *) gtk_menu_new();
270   gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) menu_bar->help);
271 
272   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Online help"));
273   gtk_menu_shell_append((GtkMenuShell*) menu_bar->help, (GtkWidget*) item);
274 
275   item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("About"));
276   gtk_menu_shell_append((GtkMenuShell*) menu_bar->help, (GtkWidget*) item);
277 }
278 
279 void
ags_menu_bar_connect(AgsConnectable * connectable)280 ags_menu_bar_connect(AgsConnectable *connectable)
281 {
282   AgsMenuBar *menu_bar;
283 
284   GList *list0, *list1, *list2, *list3, *list4;
285   GList *list0_start, *list1_start, *list2_start, *list3_start, *list4_start;
286 
287   menu_bar = AGS_MENU_BAR(connectable);
288 
289   if((AGS_MENU_BAR_CONNECTED & (menu_bar->flags)) != 0){
290     return;
291   }
292 
293   menu_bar->flags |= AGS_MENU_BAR_CONNECTED;
294 
295   /* File */
296   list0 =
297     list0_start = gtk_container_get_children(GTK_CONTAINER(menu_bar));
298 
299   list1_start =
300     list1 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list0->data));
301 
302   g_signal_connect(G_OBJECT (list1->data), "activate",
303 		   G_CALLBACK (ags_menu_action_open_callback), (gpointer) menu_bar);
304   list1 = list1->next;
305 
306   g_signal_connect(G_OBJECT (list1->data), "activate",
307 		   G_CALLBACK (ags_menu_action_save_callback), (gpointer) menu_bar);
308   list1 = list1->next;
309 
310   g_signal_connect(G_OBJECT (list1->data), "activate",
311 		   G_CALLBACK (ags_menu_action_save_as_callback), menu_bar);
312   list1 = list1->next->next;
313 
314   g_signal_connect(G_OBJECT (list1->data), "activate",
315 		   G_CALLBACK (ags_menu_action_export_callback), menu_bar);
316   list1 = list1->next->next;
317 
318   g_signal_connect(G_OBJECT (list1->data), "activate",
319 		   G_CALLBACK (ags_menu_action_quit_callback), (gpointer) menu_bar);
320 
321   g_list_free(list1_start);
322 
323   /* Edit */
324   list0 = list0->next;
325   list1_start =
326     list1 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list0->data));
327 
328   g_signal_connect(G_OBJECT (list1->data), "activate",
329 		   G_CALLBACK (ags_menu_action_add_callback), (gpointer) menu_bar);
330 
331   list2_start =
332     list2 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list1->data));
333   list1 = list1->next;
334 
335   /* machines */
336   g_signal_connect(G_OBJECT (list2->data), "activate",
337 		   G_CALLBACK (ags_menu_action_add_panel_callback), (gpointer) menu_bar);
338   list2 = list2->next;
339 
340   g_signal_connect(G_OBJECT (list2->data), "activate",
341 		   G_CALLBACK (ags_menu_action_add_mixer_callback), (gpointer) menu_bar);
342   list2 = list2->next;
343 
344   g_signal_connect(G_OBJECT (list2->data), "activate",
345 		   G_CALLBACK (ags_menu_action_add_spectrometer_callback), (gpointer) menu_bar);
346   list2 = list2->next;
347 
348   g_signal_connect(G_OBJECT (list2->data), "activate",
349 		   G_CALLBACK (ags_menu_action_add_equalizer_callback), (gpointer) menu_bar);
350   list2 = list2->next;
351 
352   g_signal_connect(G_OBJECT (list2->data), "activate",
353 		   G_CALLBACK (ags_menu_action_add_drum_callback), (gpointer) menu_bar);
354   list2 = list2->next;
355 
356   g_signal_connect(G_OBJECT (list2->data), "activate",
357 		   G_CALLBACK (ags_menu_action_add_matrix_callback), (gpointer) menu_bar);
358   list2 = list2->next;
359 
360   g_signal_connect(G_OBJECT (list2->data), "activate",
361 		   G_CALLBACK (ags_menu_action_add_synth_callback), (gpointer) menu_bar);
362   list2 = list2->next;
363 
364   g_signal_connect(G_OBJECT (list2->data), "activate",
365 		   G_CALLBACK (ags_menu_action_add_fm_synth_callback), (gpointer) menu_bar);
366   list2 = list2->next;
367 
368   g_signal_connect(G_OBJECT (list2->data), "activate",
369 		   G_CALLBACK (ags_menu_action_add_syncsynth_callback), (gpointer) menu_bar);
370   list2 = list2->next;
371 
372   g_signal_connect(G_OBJECT (list2->data), "activate",
373 		   G_CALLBACK (ags_menu_action_add_fm_syncsynth_callback), (gpointer) menu_bar);
374   list2 = list2->next;
375 
376 #ifdef AGS_WITH_LIBINSTPATCH
377   g_signal_connect(G_OBJECT (list2->data), "activate",
378 		   G_CALLBACK (ags_menu_action_add_ffplayer_callback), (gpointer) menu_bar);
379   list2 = list2->next;
380 
381 #if 0
382   g_signal_connect(G_OBJECT (list2->data), "activate",
383 		   G_CALLBACK (ags_menu_action_add_sf2_synth_callback), (gpointer) menu_bar);
384   list2 = list2->next;
385 #endif
386 #endif
387 
388   g_signal_connect(G_OBJECT (list2->data), "activate",
389 		   G_CALLBACK (ags_menu_action_add_pitch_sampler_callback), (gpointer) menu_bar);
390   list2 = list2->next;
391 
392 #if 0
393   g_signal_connect(G_OBJECT (list2->data), "activate",
394 		   G_CALLBACK (ags_menu_action_add_sfz_synth_callback), (gpointer) menu_bar);
395   list2 = list2->next;
396 #endif
397 
398   g_signal_connect(G_OBJECT (list2->data), "activate",
399 		   G_CALLBACK (ags_menu_action_add_audiorec_callback), (gpointer) menu_bar);
400   list2 = list2->next;
401 
402 #if 0
403   g_signal_connect(G_OBJECT (list2->data), "activate",
404 		   G_CALLBACK (ags_menu_action_add_desk_callback), (gpointer) menu_bar);
405   list2 = list2->next;
406 #endif
407 
408   /* ladspa */
409   list3_start =
410     list3 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list2->data));
411   list2 = list2->next;
412 
413   while(list3 != NULL){
414     g_signal_connect(G_OBJECT(list3->data), "activate",
415 		     G_CALLBACK(ags_menu_action_add_ladspa_bridge_callback), (gpointer) menu_bar);
416 
417     list3 = list3->next;
418   }
419 
420   g_list_free(list3_start);
421 
422   /* dssi */
423   list3_start =
424     list3 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list2->data));
425   list2 = list2->next;
426 
427   while(list3 != NULL){
428     g_signal_connect(G_OBJECT(list3->data), "activate",
429 		     G_CALLBACK(ags_menu_action_add_dssi_bridge_callback), (gpointer) menu_bar);
430 
431     list3 = list3->next;
432   }
433 
434   g_list_free(list3_start);
435 
436   /* lv2 */
437   list3_start =
438     list3 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list2->data));
439   list2 = list2->next;
440 
441   while(list3 != NULL){
442     g_signal_connect(G_OBJECT(list3->data), "activate",
443 		     G_CALLBACK(ags_menu_action_add_lv2_bridge_callback), (gpointer) menu_bar);
444 
445     list3 = list3->next;
446   }
447 
448   g_list_free(list3_start);
449 
450   /* live! */
451   list3 =
452     list3_start = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list2->data));
453 
454   /* dssi */
455   list4_start =
456     list4 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list3->data));
457   list3 = list3->next;
458 
459   while(list4 != NULL){
460     g_signal_connect(G_OBJECT(list4->data), "activate",
461 		     G_CALLBACK(ags_menu_action_add_live_dssi_bridge_callback), (gpointer) menu_bar);
462 
463     list4 = list4->next;
464   }
465 
466   g_list_free(list4_start);
467 
468   /* lv2 */
469   list4_start =
470     list4 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list3->data));
471   //  list3 = list3->next;
472 
473   while(list4 != NULL){
474     g_signal_connect(G_OBJECT(list4->data), "activate",
475 		     G_CALLBACK(ags_menu_action_add_live_lv2_bridge_callback), (gpointer) menu_bar);
476 
477     list4 = list4->next;
478   }
479 
480   g_list_free(list4_start);
481   g_list_free(list3_start);
482   g_list_free(list2_start);
483 
484   /* automation, wave and preferences */
485   g_signal_connect(G_OBJECT (list1->data), "activate",
486 		   G_CALLBACK (ags_menu_action_automation_callback), (gpointer) menu_bar);
487   list1 = list1->next;
488 
489   g_signal_connect(G_OBJECT (list1->data), "activate",
490 		   G_CALLBACK (ags_menu_action_wave_callback), (gpointer) menu_bar);
491   list1 = list1->next;
492   list1 = list1->next;
493 
494   g_signal_connect(G_OBJECT (list1->data), "activate",
495 		   G_CALLBACK (ags_menu_action_preferences_callback), (gpointer) menu_bar);
496 
497   g_list_free(list1_start);
498 
499   /* MIDI */
500   list0 = list0->next;
501   list1_start =
502     list1 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list0->data));
503 
504   g_signal_connect(G_OBJECT(list1->data), "activate",
505 		   G_CALLBACK(ags_menu_action_midi_import_callback), (gpointer) menu_bar);
506   list1 = list1->next;
507 
508   g_signal_connect(G_OBJECT(list1->data), "activate",
509 		   G_CALLBACK(ags_menu_action_midi_export_track_callback), (gpointer) menu_bar);
510   list1 = list1->next;
511   list1 = list1->next;
512 
513   g_signal_connect(G_OBJECT(list1->data), "activate",
514 		   G_CALLBACK(ags_menu_action_midi_playback_callback), (gpointer) menu_bar);
515 
516   g_list_free(list1_start);
517 
518   /* Help */
519   list0 = list0->next;
520   list1_start =
521     list1 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list0->data));
522 
523   g_signal_connect(G_OBJECT (list1->data), "activate",
524 		   G_CALLBACK (ags_menu_action_online_help_callback), (gpointer) menu_bar);
525 
526   list1 = list1->next;
527 
528   g_signal_connect(G_OBJECT (list1->data), "activate",
529 		   G_CALLBACK (ags_menu_action_about_callback), (gpointer) menu_bar);
530 
531   g_list_free(list1_start);
532 
533   g_list_free(list0_start);
534 }
535 
536 void
ags_menu_bar_disconnect(AgsConnectable * connectable)537 ags_menu_bar_disconnect(AgsConnectable *connectable)
538 {
539   AgsMenuBar *menu_bar;
540 
541   menu_bar = AGS_MENU_BAR(connectable);
542 
543   if((AGS_MENU_BAR_CONNECTED & (menu_bar->flags)) == 0){
544     return;
545   }
546 
547   menu_bar->flags &= (~AGS_MENU_BAR_CONNECTED);
548 
549   /* empty */
550 }
551 
552 GtkMenu*
ags_zoom_menu_new()553 ags_zoom_menu_new()
554 {
555   GtkMenu *menu;
556   GtkMenuItem *item;
557   GtkLabel *label;
558 
559   menu = (GtkMenu *) gtk_menu_new();
560 
561   item = (GtkMenuItem *) gtk_menu_item_new();
562   label = (GtkLabel *) gtk_label_new("16:1");
563   gtk_container_add((GtkContainer *) item, (GtkWidget *) label);
564   gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item);
565 
566   item = (GtkMenuItem *) gtk_menu_item_new();
567   label = (GtkLabel *) gtk_label_new("8:1");
568   gtk_container_add((GtkContainer *) item, (GtkWidget *) label);
569   gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item);
570 
571   item = (GtkMenuItem *) gtk_menu_item_new();
572   label = (GtkLabel *) gtk_label_new("4:1");
573   gtk_container_add((GtkContainer *) item, (GtkWidget *) label);
574   gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item);
575 
576   item = (GtkMenuItem *) gtk_menu_item_new();
577   label = (GtkLabel *) gtk_label_new("2:1");
578   gtk_container_add((GtkContainer *) item, (GtkWidget *) label);
579   gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item);
580 
581   item = (GtkMenuItem *) gtk_menu_item_new();
582   label = (GtkLabel *) gtk_label_new("1:1");
583   gtk_container_add((GtkContainer *) item, (GtkWidget *) label);
584   gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item);
585 
586 
587   item = (GtkMenuItem *) gtk_menu_item_new();
588   label = (GtkLabel *) gtk_label_new("1:2");
589   gtk_container_add((GtkContainer *) item, (GtkWidget *) label);
590   gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item);
591 
592   item = (GtkMenuItem *) gtk_menu_item_new();
593   label = (GtkLabel *) gtk_label_new("1:4");
594   gtk_container_add((GtkContainer *) item, (GtkWidget *) label);
595   gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item);
596 
597   item = (GtkMenuItem *) gtk_menu_item_new();
598   label = (GtkLabel *) gtk_label_new("1:8");
599   gtk_container_add((GtkContainer *) item, (GtkWidget *) label);
600   gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item);
601 
602   item = (GtkMenuItem *) gtk_menu_item_new();
603   label = (GtkLabel *) gtk_label_new("1:16");
604   gtk_container_add((GtkContainer *) item, (GtkWidget *) label);
605   gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item);
606 
607   return(menu);
608 }
609 
610 GtkMenu*
ags_tact_menu_new()611 ags_tact_menu_new()
612 {
613   GtkMenu *menu;
614   GtkMenuItem *item;
615   GtkLabel *label;
616 
617   menu = (GtkMenu *) gtk_menu_new();
618 
619   //TODO:JK: uncomment me if tact implemented
620   /*
621   item = (GtkMenuItem *) gtk_menu_item_new();
622   label = (GtkLabel *) gtk_label_new("16/1");
623   gtk_container_add((GtkContainer *) item, (GtkWidget *) label);
624   gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item);
625 
626   item = (GtkMenuItem *) gtk_menu_item_new();
627   label = (GtkLabel *) gtk_label_new("8/1");
628   gtk_container_add((GtkContainer *) item, (GtkWidget *) label);
629   gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item);
630 
631   item = (GtkMenuItem *) gtk_menu_item_new();
632   label = (GtkLabel *) gtk_label_new("4/1");
633   gtk_container_add((GtkContainer *) item, (GtkWidget *) label);
634   gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item);
635 
636   item = (GtkMenuItem *) gtk_menu_item_new();
637   label = (GtkLabel *) gtk_label_new("2/1");
638   gtk_container_add((GtkContainer *) item, (GtkWidget *) label);
639   gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item);
640 
641 
642   item = (GtkMenuItem *) gtk_menu_item_new();
643   label = (GtkLabel *) gtk_label_new("1:1");
644   gtk_container_add((GtkContainer *) item, (GtkWidget *) label);
645   gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item);
646 
647 
648   item = (GtkMenuItem *) gtk_menu_item_new();
649   label = (GtkLabel *) gtk_label_new("1/2");
650   gtk_container_add((GtkContainer *) item, (GtkWidget *) label);
651   gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item);
652 
653   item = (GtkMenuItem *) gtk_menu_item_new();
654   label = (GtkLabel *) gtk_label_new("1/4");
655   gtk_container_add((GtkContainer *) item, (GtkWidget *) label);
656   gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item);
657 
658   item = (GtkMenuItem *) gtk_menu_item_new();
659   label = (GtkLabel *) gtk_label_new("1/8");
660   gtk_container_add((GtkContainer *) item, (GtkWidget *) label);
661   gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item);
662 
663   item = (GtkMenuItem *) gtk_menu_item_new();
664   label = (GtkLabel *) gtk_label_new("1/16");
665   gtk_container_add((GtkContainer *) item, (GtkWidget *) label);
666   gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item);
667   */
668 
669   return(menu);
670 }
671 
672 /**
673  * ags_zoom_combo_box_new:
674  *
675  * Creates an #GtkComboBox to select zoom.
676  *
677  * Returns: a new #GtkComboBox
678  *
679  * Since: 3.0.0
680  */
681 GtkComboBox*
ags_zoom_combo_box_new()682 ags_zoom_combo_box_new()
683 {
684   GtkComboBoxText *combo_box;
685 
686   combo_box = (GtkComboBoxText *) gtk_combo_box_text_new();
687 
688   //  gtk_combo_box_text_append_text(combo_box,
689   //				 "16:1");
690   //  gtk_combo_box_text_append_text(combo_box,
691   //				 "8:1");
692   gtk_combo_box_text_append_text(combo_box,
693 				 "4:1");
694   gtk_combo_box_text_append_text(combo_box,
695 				 "2:1");
696   gtk_combo_box_text_append_text(combo_box,
697 				 "1:1");
698   gtk_combo_box_text_append_text(combo_box,
699 				 "1:2");
700   gtk_combo_box_text_append_text(combo_box,
701 				 "1:4");
702   gtk_combo_box_text_append_text(combo_box,
703 				 "1:8");
704   gtk_combo_box_text_append_text(combo_box,
705 				 "1:16");
706 
707   return((GtkComboBox *) combo_box);
708 }
709 
710 /**
711  * ags_zoom_combo_box_new:
712  *
713  * Creates an #GtkComboBox to select tact
714  *
715  * Returns: a new #GtkComboBox
716  *
717  * Since: 3.0.0
718  */
719 GtkComboBox*
ags_tact_combo_box_new()720 ags_tact_combo_box_new()
721 {
722   GtkComboBoxText *combo_box;
723 
724   combo_box = (GtkComboBoxText *) gtk_combo_box_text_new();
725 
726   gtk_combo_box_text_append_text(combo_box,
727 				 "16/1");
728   gtk_combo_box_text_append_text(combo_box,
729 				 "8/1");
730   gtk_combo_box_text_append_text(combo_box,
731 				 "4/1");
732   gtk_combo_box_text_append_text(combo_box,
733 				 "2/1");
734   gtk_combo_box_text_append_text(combo_box,
735 				 "1/1");
736   gtk_combo_box_text_append_text(combo_box,
737 				 "1/2");
738   gtk_combo_box_text_append_text(combo_box,
739 				 "1/4");
740   gtk_combo_box_text_append_text(combo_box,
741 				 "1/8");
742   gtk_combo_box_text_append_text(combo_box,
743 				 "1/16");
744 
745   return((GtkComboBox *) combo_box);
746 }
747 
748 GtkMenu*
ags_ladspa_bridge_menu_new()749 ags_ladspa_bridge_menu_new()
750 {
751   GtkMenu *menu;
752   GtkMenuItem *item;
753 
754   AgsLadspaManager *ladspa_manager;
755 
756   GList *list, *start_list;
757 
758   GRecMutex *ladspa_manager_mutex;
759 
760   menu = (GtkMenu *) gtk_menu_new();
761 
762   ladspa_manager = ags_ladspa_manager_get_instance();
763 
764   /* get ladspa manager mutex */
765   ladspa_manager_mutex = AGS_LADSPA_MANAGER_GET_OBJ_MUTEX(ladspa_manager);
766 
767   /* get plugin */
768   g_rec_mutex_lock(ladspa_manager_mutex);
769 
770   list =
771     start_list = g_list_copy_deep(ladspa_manager->ladspa_plugin,
772 				  (GCopyFunc) g_object_ref,
773 				  NULL);
774 
775   g_rec_mutex_unlock(ladspa_manager_mutex);
776 
777   start_list = ags_base_plugin_sort(start_list);
778   g_list_free(list);
779 
780   list = start_list;
781 
782   while(list != NULL){
783     gchar *filename, *effect;
784 
785     /* get filename and effect */
786     g_object_get(list->data,
787 		 "filename", &filename,
788 		 "effect", &effect,
789 		 NULL);
790 
791     /* create item */
792     item = (GtkMenuItem *) gtk_menu_item_new_with_label(effect);
793 
794     g_object_set_data((GObject *) item,
795 		      AGS_MENU_ITEM_FILENAME_KEY, filename);
796     g_object_set_data((GObject *) item,
797 		      AGS_MENU_ITEM_EFFECT_KEY, effect);
798 
799     gtk_menu_shell_append((GtkMenuShell *) menu,
800 			  (GtkWidget *) item);
801 
802     list = list->next;
803   }
804 
805   g_list_free_full(start_list,
806 		   g_object_unref);
807 
808   return(menu);
809 }
810 
811 GtkMenu*
ags_dssi_bridge_menu_new()812 ags_dssi_bridge_menu_new()
813 {
814   GtkMenu *menu;
815   GtkMenuItem *item;
816 
817   AgsDssiManager *dssi_manager;
818 
819   GList *list, *start_list;
820 
821   GRecMutex *dssi_manager_mutex;
822 
823   menu = (GtkMenu *) gtk_menu_new();
824 
825   dssi_manager = ags_dssi_manager_get_instance();
826 
827   /* get dssi manager mutex */
828   dssi_manager_mutex = AGS_DSSI_MANAGER_GET_OBJ_MUTEX(dssi_manager);
829 
830   /* get plugin */
831   g_rec_mutex_lock(dssi_manager_mutex);
832 
833   list =
834     start_list = g_list_copy_deep(dssi_manager->dssi_plugin,
835 				  (GCopyFunc) g_object_ref,
836 				  NULL);
837 
838   g_rec_mutex_unlock(dssi_manager_mutex);
839 
840   start_list = ags_base_plugin_sort(start_list);
841   g_list_free(list);
842 
843   list = start_list;
844 
845   while(list != NULL){
846     gchar *filename, *effect;
847 
848     /* get filename and effect */
849     g_object_get(list->data,
850 		 "filename", &filename,
851 		 "effect", &effect,
852 		 NULL);
853 
854     /* create item */
855     item = (GtkMenuItem *) gtk_menu_item_new_with_label(effect);
856 
857     g_object_set_data((GObject *) item,
858 		      AGS_MENU_ITEM_FILENAME_KEY, filename);
859     g_object_set_data((GObject *) item,
860 		      AGS_MENU_ITEM_EFFECT_KEY, effect);
861 
862     gtk_menu_shell_append((GtkMenuShell *) menu,
863 			  (GtkWidget *) item);
864 
865     list = list->next;
866   }
867 
868   g_list_free_full(start_list,
869 		   g_object_unref);
870 
871   return(menu);
872 }
873 
874 GtkMenu*
ags_lv2_bridge_menu_new()875 ags_lv2_bridge_menu_new()
876 {
877   GtkMenu *menu;
878   GtkMenuItem *item;
879 
880   AgsLv2Manager *lv2_manager;
881 
882   guint length;
883   guint i;
884 
885   GRecMutex *lv2_manager_mutex;
886 
887   menu = (GtkMenu *) gtk_menu_new();
888 
889   lv2_manager = ags_lv2_manager_get_instance();
890 
891   /* get lv2 manager mutex */
892   lv2_manager_mutex = AGS_LV2_MANAGER_GET_OBJ_MUTEX(lv2_manager);
893 
894   /* get plugin */
895   g_rec_mutex_lock(lv2_manager_mutex);
896 
897   if(lv2_manager->quick_scan_plugin_filename != NULL){
898     length = g_strv_length(lv2_manager->quick_scan_plugin_filename);
899 
900     for(i = 0; i < length; i++){
901       gchar *filename, *effect;
902 
903       /* get filename and effect */
904       filename = lv2_manager->quick_scan_plugin_filename[i];
905       effect = lv2_manager->quick_scan_plugin_effect[i];
906 
907       /* create item */
908       if(filename != NULL &&
909 	 effect != NULL){
910 	item = (GtkMenuItem *) gtk_menu_item_new_with_label(effect);
911 
912 	g_object_set_data((GObject *) item,
913 			  AGS_MENU_ITEM_FILENAME_KEY, filename);
914 	g_object_set_data((GObject *) item,
915 			  AGS_MENU_ITEM_EFFECT_KEY, effect);
916 
917 	gtk_menu_shell_append((GtkMenuShell *) menu,
918 			      (GtkWidget *) item);
919       }
920     }
921   }
922 
923   if(lv2_manager->quick_scan_instrument_filename != NULL){
924     length = g_strv_length(lv2_manager->quick_scan_instrument_filename);
925 
926     for(i = 0; i < length; i++){
927       gchar *filename, *effect;
928 
929       /* get filename and effect */
930       filename = lv2_manager->quick_scan_instrument_filename[i];
931       effect = lv2_manager->quick_scan_instrument_effect[i];
932 
933       /* create item */
934       if(filename != NULL &&
935 	 effect != NULL){
936 	item = (GtkMenuItem *) gtk_menu_item_new_with_label(effect);
937 
938 	g_object_set_data((GObject *) item,
939 			  AGS_MENU_ITEM_FILENAME_KEY, filename);
940 	g_object_set_data((GObject *) item,
941 			  AGS_MENU_ITEM_EFFECT_KEY, effect);
942 
943 	gtk_menu_shell_append((GtkMenuShell *) menu,
944 			      (GtkWidget *) item);
945       }
946     }
947   }
948 
949   g_rec_mutex_unlock(lv2_manager_mutex);
950 
951   return(menu);
952 }
953 
954 GtkMenu*
ags_live_dssi_bridge_menu_new()955 ags_live_dssi_bridge_menu_new()
956 {
957   GtkMenu *menu;
958   GtkMenuItem *item;
959 
960   AgsDssiManager *dssi_manager;
961 
962   GList *list, *start_list;
963 
964   GRecMutex *dssi_manager_mutex;
965 
966   menu = (GtkMenu *) gtk_menu_new();
967 
968   dssi_manager = ags_dssi_manager_get_instance();
969 
970   /* get dssi manager mutex */
971   dssi_manager_mutex = AGS_DSSI_MANAGER_GET_OBJ_MUTEX(dssi_manager);
972 
973   /* get plugin */
974   g_rec_mutex_lock(dssi_manager_mutex);
975 
976   list =
977     start_list = g_list_copy_deep(dssi_manager->dssi_plugin,
978 				  (GCopyFunc) g_object_ref,
979 				  NULL);
980 
981   g_rec_mutex_unlock(dssi_manager_mutex);
982 
983   start_list = ags_base_plugin_sort(start_list);
984   g_list_free(list);
985 
986   list = start_list;
987 
988   while(list != NULL){
989     gchar *filename, *effect;
990 
991     /* get filename and effect */
992     g_object_get(list->data,
993 		 "filename", &filename,
994 		 "effect", &effect,
995 		 NULL);
996 
997     /* create item */
998     item = (GtkMenuItem *) gtk_menu_item_new_with_label(effect);
999 
1000     g_object_set_data((GObject *) item,
1001 		      AGS_MENU_ITEM_FILENAME_KEY, filename);
1002     g_object_set_data((GObject *) item,
1003 		      AGS_MENU_ITEM_EFFECT_KEY, effect);
1004 
1005     gtk_menu_shell_append((GtkMenuShell *) menu,
1006 			  (GtkWidget *) item);
1007 
1008     list = list->next;
1009   }
1010 
1011   g_list_free_full(start_list,
1012 		   g_object_unref);
1013 
1014   return(menu);
1015 }
1016 
1017 GtkMenu*
ags_live_lv2_bridge_menu_new()1018 ags_live_lv2_bridge_menu_new()
1019 {
1020   GtkMenu *menu;
1021   GtkMenuItem *item;
1022 
1023   AgsLv2Manager *lv2_manager;
1024 
1025   guint length;
1026   guint i;
1027 
1028   GRecMutex *lv2_manager_mutex;
1029 
1030   menu = (GtkMenu *) gtk_menu_new();
1031 
1032   lv2_manager = ags_lv2_manager_get_instance();
1033 
1034   /* get lv2 manager mutex */
1035   lv2_manager_mutex = AGS_LV2_MANAGER_GET_OBJ_MUTEX(lv2_manager);
1036 
1037   /* get plugin */
1038   g_rec_mutex_lock(lv2_manager_mutex);
1039 
1040   if(lv2_manager->quick_scan_instrument_filename != NULL){
1041     length = g_strv_length(lv2_manager->quick_scan_instrument_filename);
1042 
1043     for(i = 0; i < length; i++){
1044       gchar *filename, *effect;
1045 
1046       /* get filename and effect */
1047       filename = lv2_manager->quick_scan_instrument_filename[i];
1048       effect = lv2_manager->quick_scan_instrument_effect[i];
1049 
1050       /* create item */
1051       if(filename != NULL &&
1052 	 effect != NULL){
1053 	item = (GtkMenuItem *) gtk_menu_item_new_with_label(effect);
1054 
1055 	g_object_set_data((GObject *) item,
1056 			  AGS_MENU_ITEM_FILENAME_KEY, filename);
1057 	g_object_set_data((GObject *) item,
1058 			  AGS_MENU_ITEM_EFFECT_KEY, effect);
1059 
1060 	gtk_menu_shell_append((GtkMenuShell *) menu,
1061 			      (GtkWidget *) item);
1062       }
1063     }
1064   }
1065 
1066   g_rec_mutex_unlock(lv2_manager_mutex);
1067 
1068   return(menu);
1069 }
1070 
1071 /**
1072  * ags_menu_bar_new:
1073  *
1074  * Creates an #AgsMenuBar
1075  *
1076  * Returns: a new #AgsMenuBar
1077  *
1078  * Since: 3.0.0
1079  */
1080 AgsMenuBar*
ags_menu_bar_new()1081 ags_menu_bar_new()
1082 {
1083   AgsMenuBar *menu_bar;
1084 
1085   menu_bar = (AgsMenuBar *) g_object_new(AGS_TYPE_MENU_BAR,
1086 					 NULL);
1087 
1088   return(menu_bar);
1089 }
1090