1 /* -*- Mode: C ; c-basic-offset: 2 -*- */
3 * LADI Session Handler (ladish)
5 * Copyright (C) 2010 Nedko Arnaudov <nedko@arnaudov.name>
7 **************************************************************************
8 * This file contains menu related code
9 **************************************************************************
11 * LADI Session Handler is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * LADI Session Handler is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with LADI Session Handler. If not, see <http://www.gnu.org/licenses/>
23 * or write to the Free Software Foundation, Inc.,
24 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
29 #include "gtk_builder.h"
32 #include "project_properties.h"
34 static GtkWidget
* g_menu_item_new_studio
;
35 static GtkWidget
* g_menu_item_start_studio
;
36 static GtkWidget
* g_menu_item_stop_studio
;
37 static GtkWidget
* g_menu_item_save_studio
;
38 static GtkWidget
* g_menu_item_save_as_studio
;
39 static GtkWidget
* g_menu_item_unload_studio
;
40 static GtkWidget
* g_menu_item_rename_studio
;
41 static GtkWidget
* g_menu_item_create_room
;
42 static GtkWidget
* g_menu_item_destroy_room
;
43 static GtkWidget
* g_menu_item_project
;
44 static GtkWidget
* g_menu_item_ladishd_exit
;
45 static GtkWidget
* g_menu_item_jackdbus_exit
;
46 static GtkWidget
* g_menu_item_a2jmidid_exit
;
47 static GtkWidget
* g_menu_item_jack_configure
;
48 static GtkWidget
* g_menu_item_settings
;
49 static GtkCheckMenuItem
* g_menu_item_jack_latency_32
;
50 static GtkCheckMenuItem
* g_menu_item_jack_latency_64
;
51 static GtkCheckMenuItem
* g_menu_item_jack_latency_128
;
52 static GtkCheckMenuItem
* g_menu_item_jack_latency_256
;
53 static GtkCheckMenuItem
* g_menu_item_jack_latency_512
;
54 static GtkCheckMenuItem
* g_menu_item_jack_latency_1024
;
55 static GtkCheckMenuItem
* g_menu_item_jack_latency_2048
;
56 static GtkCheckMenuItem
* g_menu_item_jack_latency_4096
;
57 static GtkCheckMenuItem
* g_menu_item_jack_latency_8192
;
58 static GtkWidget
* g_menu_item_view_toolbar
;
59 static GtkWidget
* g_menu_item_view_raw_jack
;
60 static GtkWidget
* g_menu_item_start_app
;
62 static bool g_latency_changing
;
64 static ladish_dynmenu_handle g_project_dynmenu
;
66 typedef void (* menu_request_toggle_func
)(bool visible
);
68 static void toggled(GtkCheckMenuItem
* checkmenuitem
, gpointer user_data
)
70 ((menu_request_toggle_func
)user_data
)(gtk_check_menu_item_get_active(checkmenuitem
));
73 static void buffer_size_change_request(GtkCheckMenuItem
* item_ptr
, gpointer user_data
)
75 if (g_latency_changing
)
76 { /* skip activations because of gtk_check_menu_item_set_active() called from menu_set_jack_latency() */
80 if (!item_ptr
->active
)
81 { /* skip radio button deactivations, we are interested only in activations */
85 menu_request_jack_latency_change((uint32_t)(guintptr
)user_data
);
88 struct ladish_recent_projects_list_closure
95 void (* item_activate_callback
)(const char * name
, void * data
),
96 void (* data_free
)());
100 static void on_load_project(const char * name
, void * data
)
102 log_info("Request to load project \"%s\":\"%s\"", name
, (const char *)data
);
103 if (!ladish_room_proxy_load_project(graph_view_get_room(get_current_view()), data
))
105 error_message_box(_("Project load failed, please inspect logs."));
109 #define closure_ptr ((struct ladish_recent_projects_list_closure * )context)
115 const char * project_name
,
116 const char * project_dir
)
118 closure_ptr
->callback(closure_ptr
->context
, project_name
, strdup(project_dir
), NULL
, free
);
123 fill_project_dynmenu(
128 void (* item_activate_callback
)(const char * name
, void * data
),
129 void (* data_free
)()),
132 struct ladish_recent_projects_list_closure closure
;
134 graph_view_handle view
;
136 closure
.callback
= callback
;
137 closure
.context
= context
;
139 view
= get_current_view();
141 if (ladish_room_proxy_get_recent_projects(graph_view_get_room(view
), 10, add_recent_project
, &closure
))
143 callback(context
, NULL
, NULL
, NULL
, NULL
); /* add separator */
146 callback(context
, _("Load Project..."), NULL
, (ladish_dynmenu_item_activate_callback
)menu_request_load_project
, NULL
);
148 has_project
= room_has_project(view
);
152 callback(context
, _("Create Project..."), NULL
, (ladish_dynmenu_item_activate_callback
)menu_request_save_as_project
, NULL
);
155 callback(context
, has_project
? _("Unload Project") : _("Clear Room"), NULL
, (ladish_dynmenu_item_activate_callback
)menu_request_unload_project
, NULL
);
159 callback(context
, _("Save Project"), NULL
, (ladish_dynmenu_item_activate_callback
)menu_request_save_project
, NULL
);
160 callback(context
, _("Save Project As..."), NULL
, (ladish_dynmenu_item_activate_callback
)menu_request_save_as_project
, NULL
);
161 callback(context
, _("Project Properties..."), NULL
, (ladish_dynmenu_item_activate_callback
)ladish_project_properties_dialog_run
, NULL
);
171 g_menu_item_new_studio
= get_gtk_builder_widget("menu_item_new_studio");
172 g_menu_item_start_app
= get_gtk_builder_widget("menu_item_start_app");
173 g_menu_item_start_studio
= get_gtk_builder_widget("menu_item_start_studio");
174 g_menu_item_stop_studio
= get_gtk_builder_widget("menu_item_stop_studio");
175 g_menu_item_save_studio
= get_gtk_builder_widget("menu_item_save_studio");
176 g_menu_item_save_as_studio
= get_gtk_builder_widget("menu_item_save_as_studio");
177 g_menu_item_unload_studio
= get_gtk_builder_widget("menu_item_unload_studio");
178 g_menu_item_rename_studio
= get_gtk_builder_widget("menu_item_rename_studio");
179 g_menu_item_create_room
= get_gtk_builder_widget("menu_item_create_room");
180 g_menu_item_destroy_room
= get_gtk_builder_widget("menu_item_destroy_room");
181 g_menu_item_project
= get_gtk_builder_widget("project_menu_item");
182 g_menu_item_ladishd_exit
= get_gtk_builder_widget("menu_item_ladishd_exit");
183 g_menu_item_jackdbus_exit
= get_gtk_builder_widget("menu_item_jackdbus_exit");
184 g_menu_item_a2jmidid_exit
= get_gtk_builder_widget("menu_item_a2jmidid_exit");
185 g_menu_item_jack_configure
= get_gtk_builder_widget("menu_item_jack_configure");
186 g_menu_item_settings
= get_gtk_builder_widget("menu_item_settings");
187 g_menu_item_view_toolbar
= get_gtk_builder_widget("menu_item_view_toolbar");
188 g_menu_item_view_raw_jack
= get_gtk_builder_widget("menu_item_view_raw_jack");
190 g_menu_item_jack_latency_32
= GTK_CHECK_MENU_ITEM(get_gtk_builder_widget("menu_item_jack_latency_32"));
191 g_menu_item_jack_latency_64
= GTK_CHECK_MENU_ITEM(get_gtk_builder_widget("menu_item_jack_latency_64"));
192 g_menu_item_jack_latency_128
= GTK_CHECK_MENU_ITEM(get_gtk_builder_widget("menu_item_jack_latency_128"));
193 g_menu_item_jack_latency_256
= GTK_CHECK_MENU_ITEM(get_gtk_builder_widget("menu_item_jack_latency_256"));
194 g_menu_item_jack_latency_512
= GTK_CHECK_MENU_ITEM(get_gtk_builder_widget("menu_item_jack_latency_512"));
195 g_menu_item_jack_latency_1024
= GTK_CHECK_MENU_ITEM(get_gtk_builder_widget("menu_item_jack_latency_1024"));
196 g_menu_item_jack_latency_2048
= GTK_CHECK_MENU_ITEM(get_gtk_builder_widget("menu_item_jack_latency_2048"));
197 g_menu_item_jack_latency_4096
= GTK_CHECK_MENU_ITEM(get_gtk_builder_widget("menu_item_jack_latency_4096"));
198 g_menu_item_jack_latency_8192
= GTK_CHECK_MENU_ITEM(get_gtk_builder_widget("menu_item_jack_latency_8192"));
200 g_signal_connect(G_OBJECT(g_menu_item_view_toolbar
), "toggled", G_CALLBACK(toggled
), menu_request_toggle_toolbar
);
201 g_signal_connect(G_OBJECT(g_menu_item_view_raw_jack
), "toggled", G_CALLBACK(toggled
), menu_request_toggle_raw_jack
);
203 g_signal_connect(G_OBJECT(g_menu_item_new_studio
), "activate", G_CALLBACK(menu_request_new_studio
), NULL
);
204 g_signal_connect(G_OBJECT(g_menu_item_start_studio
), "activate", G_CALLBACK(menu_request_start_studio
), NULL
);
205 g_signal_connect(G_OBJECT(g_menu_item_stop_studio
), "activate", G_CALLBACK(menu_request_stop_studio
), NULL
);
206 g_signal_connect(G_OBJECT(g_menu_item_unload_studio
), "activate", G_CALLBACK(menu_request_unload_studio
), NULL
);
207 g_signal_connect(G_OBJECT(g_menu_item_save_studio
), "activate", G_CALLBACK(menu_request_save_studio
), NULL
);
208 g_signal_connect(G_OBJECT(g_menu_item_save_as_studio
), "activate", G_CALLBACK(menu_request_save_as_studio
), NULL
);
209 g_signal_connect(G_OBJECT(g_menu_item_rename_studio
), "activate", G_CALLBACK(menu_request_rename_studio
), NULL
);
210 g_signal_connect(G_OBJECT(g_menu_item_ladishd_exit
), "activate", G_CALLBACK(menu_request_ladishd_exit
), NULL
);
211 g_signal_connect(G_OBJECT(g_menu_item_jackdbus_exit
), "activate", G_CALLBACK(menu_request_jackdbus_exit
), NULL
);
212 g_signal_connect(G_OBJECT(g_menu_item_a2jmidid_exit
), "activate", G_CALLBACK(menu_request_a2jmidid_exit
), NULL
);
213 g_signal_connect(G_OBJECT(g_menu_item_jack_configure
), "activate", G_CALLBACK(menu_request_jack_configure
), NULL
);
214 g_signal_connect(G_OBJECT(g_menu_item_settings
), "activate", G_CALLBACK(menu_request_settings
), NULL
);
215 g_signal_connect(G_OBJECT(g_menu_item_start_app
), "activate", G_CALLBACK(menu_request_start_app
), NULL
);
216 g_signal_connect(G_OBJECT(g_menu_item_create_room
), "activate", G_CALLBACK(menu_request_create_room
), NULL
);
217 g_signal_connect(G_OBJECT(g_menu_item_destroy_room
), "activate", G_CALLBACK(menu_request_destroy_room
), NULL
);
219 g_signal_connect(G_OBJECT(g_menu_item_jack_latency_32
), "toggled", G_CALLBACK(buffer_size_change_request
), (gpointer
)32);
220 g_signal_connect(G_OBJECT(g_menu_item_jack_latency_64
), "toggled", G_CALLBACK(buffer_size_change_request
), (gpointer
)64);
221 g_signal_connect(G_OBJECT(g_menu_item_jack_latency_128
), "toggled", G_CALLBACK(buffer_size_change_request
), (gpointer
)128);
222 g_signal_connect(G_OBJECT(g_menu_item_jack_latency_256
), "toggled", G_CALLBACK(buffer_size_change_request
), (gpointer
)256);
223 g_signal_connect(G_OBJECT(g_menu_item_jack_latency_512
), "toggled", G_CALLBACK(buffer_size_change_request
), (gpointer
)512);
224 g_signal_connect(G_OBJECT(g_menu_item_jack_latency_1024
), "toggled", G_CALLBACK(buffer_size_change_request
), (gpointer
)1024);
225 g_signal_connect(G_OBJECT(g_menu_item_jack_latency_2048
), "toggled", G_CALLBACK(buffer_size_change_request
), (gpointer
)2048);
226 g_signal_connect(G_OBJECT(g_menu_item_jack_latency_4096
), "toggled", G_CALLBACK(buffer_size_change_request
), (gpointer
)4096);
227 g_signal_connect(G_OBJECT(g_menu_item_jack_latency_8192
), "toggled", G_CALLBACK(buffer_size_change_request
), (gpointer
)8192);
229 if (!ladish_dynmenu_create(
232 fill_project_dynmenu
,
243 void menu_uninit(void)
245 ladish_dynmenu_destroy(g_project_dynmenu
);
248 void menu_studio_state_changed(unsigned int studio_state
)
250 graph_view_handle view
;
252 gtk_widget_set_sensitive(g_menu_item_start_studio
, studio_state
== STUDIO_STATE_STOPPED
);
253 gtk_widget_set_sensitive(g_menu_item_stop_studio
, studio_state
== STUDIO_STATE_STARTED
);
254 gtk_widget_set_sensitive(g_menu_item_save_studio
, studio_state
== STUDIO_STATE_STARTED
);
255 gtk_widget_set_sensitive(g_menu_item_save_as_studio
, studio_state
== STUDIO_STATE_STARTED
);
256 gtk_widget_set_sensitive(g_menu_item_unload_studio
, studio_state
!= STUDIO_STATE_UNLOADED
);
257 gtk_widget_set_sensitive(g_menu_item_rename_studio
, studio_state
== STUDIO_STATE_STOPPED
|| studio_state
== STUDIO_STATE_STARTED
);
258 gtk_widget_set_sensitive(g_menu_item_start_app
, studio_state
== STUDIO_STATE_STOPPED
|| studio_state
== STUDIO_STATE_STARTED
);
259 gtk_widget_set_sensitive(g_menu_item_create_room
, studio_state
== STUDIO_STATE_STOPPED
|| studio_state
== STUDIO_STATE_STARTED
);
261 view
= get_current_view();
262 gtk_widget_set_sensitive(g_menu_item_project
, studio_state
== STUDIO_STATE_STARTED
&& view
!= NULL
&& is_room_view(view
));
265 void menu_set_jack_latency_items_sensivity(bool sensitive
)
267 gtk_widget_set_sensitive(GTK_WIDGET(g_menu_item_jack_latency_32
), sensitive
);
268 gtk_widget_set_sensitive(GTK_WIDGET(g_menu_item_jack_latency_64
), sensitive
);
269 gtk_widget_set_sensitive(GTK_WIDGET(g_menu_item_jack_latency_128
), sensitive
);
270 gtk_widget_set_sensitive(GTK_WIDGET(g_menu_item_jack_latency_256
), sensitive
);
271 gtk_widget_set_sensitive(GTK_WIDGET(g_menu_item_jack_latency_512
), sensitive
);
272 gtk_widget_set_sensitive(GTK_WIDGET(g_menu_item_jack_latency_1024
), sensitive
);
273 gtk_widget_set_sensitive(GTK_WIDGET(g_menu_item_jack_latency_2048
), sensitive
);
274 gtk_widget_set_sensitive(GTK_WIDGET(g_menu_item_jack_latency_4096
), sensitive
);
275 gtk_widget_set_sensitive(GTK_WIDGET(g_menu_item_jack_latency_8192
), sensitive
);
278 bool menu_set_jack_latency(uint32_t buffer_size
, bool force
)
280 GtkCheckMenuItem
* item_ptr
;
285 item_ptr
= g_menu_item_jack_latency_32
;
288 item_ptr
= g_menu_item_jack_latency_64
;
291 item_ptr
= g_menu_item_jack_latency_128
;
294 item_ptr
= g_menu_item_jack_latency_256
;
297 item_ptr
= g_menu_item_jack_latency_512
;
300 item_ptr
= g_menu_item_jack_latency_1024
;
303 item_ptr
= g_menu_item_jack_latency_2048
;
306 item_ptr
= g_menu_item_jack_latency_4096
;
309 item_ptr
= g_menu_item_jack_latency_8192
;
312 //log_error("unknown jack buffer size %"PRIu32, buffer_size);
316 if (force
|| !item_ptr
->active
)
318 log_info("menu_set_jack_latency() detects change");
319 g_latency_changing
= true; /* latency has changed externally, don't tell jack to change it again */
320 gtk_check_menu_item_set_active(item_ptr
, TRUE
);
321 g_latency_changing
= false;
327 void menu_set_toolbar_visibility(bool visible
)
329 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(g_menu_item_view_toolbar
), visible
);
332 void menu_view_activated(bool room
)
334 gtk_widget_set_sensitive(g_menu_item_destroy_room
, room
);
335 gtk_widget_set_sensitive(g_menu_item_project
, room
&& get_studio_state() == STUDIO_STATE_STARTED
);
338 static void on_popup_menu_action_start_app(GtkWidget
* menuitem
, gpointer userdata
)
340 menu_request_start_app();
343 static void on_popup_menu_action_create_room(GtkWidget
* menuitem
, gpointer userdata
)
345 menu_request_create_room();
348 static void on_popup_menu_action_destroy_room(GtkWidget
* menuitem
, gpointer userdata
)
350 menu_request_destroy_room();
353 void fill_view_popup_menu(GtkMenu
* menu
, graph_view_handle view
)
355 GtkWidget
* menuitem
;
357 log_info("filling view menu...");
359 if (graph_view_get_app_supervisor(view
) != NULL
)
361 menuitem
= gtk_menu_item_new_with_label(_("New Application..."));
362 g_signal_connect(menuitem
, "activate", (GCallback
)on_popup_menu_action_start_app
, NULL
);
363 gtk_menu_shell_append(GTK_MENU_SHELL(menu
), menuitem
);
366 if (is_room_view(view
))
368 menuitem
= gtk_separator_menu_item_new(); /* separator */
369 gtk_menu_shell_append(GTK_MENU_SHELL(menu
), menuitem
);
371 ladish_dynmenu_fill_external(g_project_dynmenu
, menu
);
373 menuitem
= gtk_separator_menu_item_new(); /* separator */
374 gtk_menu_shell_append(GTK_MENU_SHELL(menu
), menuitem
);
376 menuitem
= gtk_menu_item_new_with_label(_("Destroy Room"));
377 g_signal_connect(menuitem
, "activate", (GCallback
)on_popup_menu_action_destroy_room
, NULL
);
378 gtk_menu_shell_append(GTK_MENU_SHELL(menu
), menuitem
);
382 menuitem
= gtk_menu_item_new_with_label(_("Create Room..."));
383 g_signal_connect(menuitem
, "activate", (GCallback
)on_popup_menu_action_create_room
, NULL
);
384 gtk_menu_shell_append(GTK_MENU_SHELL(menu
), menuitem
);