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