gladish: rename "Run..." menu entries to "New Application..."
[ladish.git] / gui / menu.c
blob38d9f49088e7f50f8bc99552ad2d8c40b232bc4a
1 /* -*- Mode: C ; c-basic-offset: 2 -*- */
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.
27 #include "internal.h"
28 #include "menu.h"
29 #include "gtk_builder.h"
30 #include "studio.h"
31 #include "dynmenu.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() */
77 return;
80 if (!item_ptr->active)
81 { /* skip radio button deactivations, we are interested only in activations */
82 return;
85 menu_request_jack_latency_change((uint32_t)(guintptr)user_data);
88 struct ladish_recent_projects_list_closure
90 void
91 (* callback)(
92 void * context,
93 const char * name,
94 void * data,
95 void (* item_activate_callback)(const char * name, void * data),
96 void (* data_free)());
97 void * context;
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)
111 static
112 void
113 add_recent_project(
114 void * 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);
121 static
122 bool
123 fill_project_dynmenu(
124 void (* callback)(
125 void * context,
126 const char * name,
127 void * data,
128 void (* item_activate_callback)(const char * name, void * data),
129 void (* data_free)()),
130 void * context)
132 struct ladish_recent_projects_list_closure closure;
133 bool has_project;
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);
150 if (!has_project)
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);
157 if (has_project)
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);
164 return true;
167 #undef closure_ptr
169 bool menu_init(void)
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(
230 "project_menu_item",
231 "project_menu",
232 fill_project_dynmenu,
233 "project menu",
234 on_load_project,
235 &g_project_dynmenu))
237 return false;
240 return true;
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;
282 switch (buffer_size)
284 case 32:
285 item_ptr = g_menu_item_jack_latency_32;
286 break;
287 case 64:
288 item_ptr = g_menu_item_jack_latency_64;
289 break;
290 case 128:
291 item_ptr = g_menu_item_jack_latency_128;
292 break;
293 case 256:
294 item_ptr = g_menu_item_jack_latency_256;
295 break;
296 case 512:
297 item_ptr = g_menu_item_jack_latency_512;
298 break;
299 case 1024:
300 item_ptr = g_menu_item_jack_latency_1024;
301 break;
302 case 2048:
303 item_ptr = g_menu_item_jack_latency_2048;
304 break;
305 case 4096:
306 item_ptr = g_menu_item_jack_latency_4096;
307 break;
308 case 8192:
309 item_ptr = g_menu_item_jack_latency_8192;
310 break;
311 default:
312 //log_error("unknown jack buffer size %"PRIu32, buffer_size);
313 return false;
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;
324 return true;
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);
380 else
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);