ladishd: Basic recent projects functionality
[ladish.git] / gui / menu.c
blobe1d57cac4697ab9f0963c45282236e5e95aac46f
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"
32 static GtkWidget * g_menu_item_new_studio;
33 static GtkWidget * g_menu_item_start_studio;
34 static GtkWidget * g_menu_item_stop_studio;
35 static GtkWidget * g_menu_item_save_studio;
36 static GtkWidget * g_menu_item_save_as_studio;
37 static GtkWidget * g_menu_item_unload_studio;
38 static GtkWidget * g_menu_item_rename_studio;
39 static GtkWidget * g_menu_item_create_room;
40 static GtkWidget * g_menu_item_destroy_room;
41 static GtkWidget * g_menu_item_load_project;
42 static GtkWidget * g_menu_item_unload_project;
43 static GtkWidget * g_menu_item_save_project;
44 static GtkWidget * g_menu_item_save_as_project;
45 static GtkWidget * g_menu_item_daemon_exit;
46 static GtkWidget * g_menu_item_jack_configure;
47 static GtkWidget * g_menu_item_settings;
48 static GtkCheckMenuItem * g_menu_item_jack_latency_32;
49 static GtkCheckMenuItem * g_menu_item_jack_latency_64;
50 static GtkCheckMenuItem * g_menu_item_jack_latency_128;
51 static GtkCheckMenuItem * g_menu_item_jack_latency_256;
52 static GtkCheckMenuItem * g_menu_item_jack_latency_512;
53 static GtkCheckMenuItem * g_menu_item_jack_latency_1024;
54 static GtkCheckMenuItem * g_menu_item_jack_latency_2048;
55 static GtkCheckMenuItem * g_menu_item_jack_latency_4096;
56 static GtkCheckMenuItem * g_menu_item_jack_latency_8192;
57 static GtkWidget * g_menu_item_view_toolbar;
58 static GtkWidget * g_menu_item_view_raw_jack;
59 static GtkWidget * g_menu_item_start_app;
61 static bool g_latency_changing;
63 typedef void (* menu_request_toggle_func)(bool visible);
65 static void toggled(GtkCheckMenuItem * checkmenuitem, gpointer user_data)
67 ((menu_request_toggle_func)user_data)(gtk_check_menu_item_get_active(checkmenuitem));
70 static void buffer_size_change_request(GtkCheckMenuItem * item_ptr, gpointer user_data)
72 if (g_latency_changing)
73 { /* skip activations because of gtk_check_menu_item_set_active() called from menu_set_jack_latency() */
74 return;
77 if (!item_ptr->active)
78 { /* skip radio button deactivations, we are interested only in activations */
79 return;
82 menu_request_jack_latency_change((uint32_t)(guintptr)user_data);
85 void menu_init(void)
87 g_menu_item_new_studio = get_gtk_builder_widget("menu_item_new_studio");
88 g_menu_item_start_app = get_gtk_builder_widget("menu_item_start_app");
89 g_menu_item_start_studio = get_gtk_builder_widget("menu_item_start_studio");
90 g_menu_item_stop_studio = get_gtk_builder_widget("menu_item_stop_studio");
91 g_menu_item_save_studio = get_gtk_builder_widget("menu_item_save_studio");
92 g_menu_item_save_as_studio = get_gtk_builder_widget("menu_item_save_as_studio");
93 g_menu_item_unload_studio = get_gtk_builder_widget("menu_item_unload_studio");
94 g_menu_item_rename_studio = get_gtk_builder_widget("menu_item_rename_studio");
95 g_menu_item_create_room = get_gtk_builder_widget("menu_item_create_room");
96 g_menu_item_destroy_room = get_gtk_builder_widget("menu_item_destroy_room");
97 g_menu_item_load_project = get_gtk_builder_widget("menu_item_load_project");
98 g_menu_item_unload_project = get_gtk_builder_widget("menu_item_unload_project");
99 g_menu_item_save_project = get_gtk_builder_widget("menu_item_save_project");
100 g_menu_item_save_as_project = get_gtk_builder_widget("menu_item_save_as_project");
101 g_menu_item_daemon_exit = get_gtk_builder_widget("menu_item_daemon_exit");
102 g_menu_item_jack_configure = get_gtk_builder_widget("menu_item_jack_configure");
103 g_menu_item_settings = get_gtk_builder_widget("menu_item_settings");
104 g_menu_item_view_toolbar = get_gtk_builder_widget("menu_item_view_toolbar");
105 g_menu_item_view_raw_jack = get_gtk_builder_widget("menu_item_view_raw_jack");
107 g_menu_item_jack_latency_32 = GTK_CHECK_MENU_ITEM(get_gtk_builder_widget("menu_item_jack_latency_32"));
108 g_menu_item_jack_latency_64 = GTK_CHECK_MENU_ITEM(get_gtk_builder_widget("menu_item_jack_latency_64"));
109 g_menu_item_jack_latency_128 = GTK_CHECK_MENU_ITEM(get_gtk_builder_widget("menu_item_jack_latency_128"));
110 g_menu_item_jack_latency_256 = GTK_CHECK_MENU_ITEM(get_gtk_builder_widget("menu_item_jack_latency_256"));
111 g_menu_item_jack_latency_512 = GTK_CHECK_MENU_ITEM(get_gtk_builder_widget("menu_item_jack_latency_512"));
112 g_menu_item_jack_latency_1024 = GTK_CHECK_MENU_ITEM(get_gtk_builder_widget("menu_item_jack_latency_1024"));
113 g_menu_item_jack_latency_2048 = GTK_CHECK_MENU_ITEM(get_gtk_builder_widget("menu_item_jack_latency_2048"));
114 g_menu_item_jack_latency_4096 = GTK_CHECK_MENU_ITEM(get_gtk_builder_widget("menu_item_jack_latency_4096"));
115 g_menu_item_jack_latency_8192 = GTK_CHECK_MENU_ITEM(get_gtk_builder_widget("menu_item_jack_latency_8192"));
117 g_signal_connect(G_OBJECT(g_menu_item_view_toolbar), "toggled", G_CALLBACK(toggled), menu_request_toggle_toolbar);
118 g_signal_connect(G_OBJECT(g_menu_item_view_raw_jack), "toggled", G_CALLBACK(toggled), menu_request_toggle_raw_jack);
120 g_signal_connect(G_OBJECT(g_menu_item_new_studio), "activate", G_CALLBACK(menu_request_new_studio), NULL);
121 g_signal_connect(G_OBJECT(g_menu_item_start_studio), "activate", G_CALLBACK(menu_request_start_studio), NULL);
122 g_signal_connect(G_OBJECT(g_menu_item_stop_studio), "activate", G_CALLBACK(menu_request_stop_studio), NULL);
123 g_signal_connect(G_OBJECT(g_menu_item_unload_studio), "activate", G_CALLBACK(menu_request_unload_studio), NULL);
124 g_signal_connect(G_OBJECT(g_menu_item_save_studio), "activate", G_CALLBACK(menu_request_save_studio), NULL);
125 g_signal_connect(G_OBJECT(g_menu_item_save_as_studio), "activate", G_CALLBACK(menu_request_save_as_studio), NULL);
126 g_signal_connect(G_OBJECT(g_menu_item_rename_studio), "activate", G_CALLBACK(menu_request_rename_studio), NULL);
127 g_signal_connect(G_OBJECT(g_menu_item_daemon_exit), "activate", G_CALLBACK(menu_request_daemon_exit), NULL);
128 g_signal_connect(G_OBJECT(g_menu_item_jack_configure), "activate", G_CALLBACK(menu_request_jack_configure), NULL);
129 g_signal_connect(G_OBJECT(g_menu_item_settings), "activate", G_CALLBACK(menu_request_settings), NULL);
130 g_signal_connect(G_OBJECT(g_menu_item_start_app), "activate", G_CALLBACK(menu_request_start_app), NULL);
131 g_signal_connect(G_OBJECT(g_menu_item_create_room), "activate", G_CALLBACK(menu_request_create_room), NULL);
132 g_signal_connect(G_OBJECT(g_menu_item_destroy_room), "activate", G_CALLBACK(menu_request_destroy_room), NULL);
133 g_signal_connect(G_OBJECT(g_menu_item_load_project), "activate", G_CALLBACK(menu_request_load_project), NULL);
134 g_signal_connect(G_OBJECT(g_menu_item_unload_project), "activate", G_CALLBACK(menu_request_unload_project), NULL);
135 g_signal_connect(G_OBJECT(g_menu_item_save_project), "activate", G_CALLBACK(menu_request_save_project), NULL);
136 g_signal_connect(G_OBJECT(g_menu_item_save_as_project), "activate", G_CALLBACK(menu_request_save_as_project), NULL);
138 g_signal_connect(G_OBJECT(g_menu_item_jack_latency_32), "toggled", G_CALLBACK(buffer_size_change_request), (gpointer)32);
139 g_signal_connect(G_OBJECT(g_menu_item_jack_latency_64), "toggled", G_CALLBACK(buffer_size_change_request), (gpointer)64);
140 g_signal_connect(G_OBJECT(g_menu_item_jack_latency_128), "toggled", G_CALLBACK(buffer_size_change_request), (gpointer)128);
141 g_signal_connect(G_OBJECT(g_menu_item_jack_latency_256), "toggled", G_CALLBACK(buffer_size_change_request), (gpointer)256);
142 g_signal_connect(G_OBJECT(g_menu_item_jack_latency_512), "toggled", G_CALLBACK(buffer_size_change_request), (gpointer)512);
143 g_signal_connect(G_OBJECT(g_menu_item_jack_latency_1024), "toggled", G_CALLBACK(buffer_size_change_request), (gpointer)1024);
144 g_signal_connect(G_OBJECT(g_menu_item_jack_latency_2048), "toggled", G_CALLBACK(buffer_size_change_request), (gpointer)2048);
145 g_signal_connect(G_OBJECT(g_menu_item_jack_latency_4096), "toggled", G_CALLBACK(buffer_size_change_request), (gpointer)4096);
146 g_signal_connect(G_OBJECT(g_menu_item_jack_latency_8192), "toggled", G_CALLBACK(buffer_size_change_request), (gpointer)8192);
149 void menu_studio_state_changed(unsigned int studio_state)
151 gtk_widget_set_sensitive(g_menu_item_start_studio, studio_state == STUDIO_STATE_STOPPED);
152 gtk_widget_set_sensitive(g_menu_item_stop_studio, studio_state == STUDIO_STATE_STARTED);
153 gtk_widget_set_sensitive(g_menu_item_save_studio, studio_state == STUDIO_STATE_STARTED);
154 gtk_widget_set_sensitive(g_menu_item_save_as_studio, studio_state == STUDIO_STATE_STARTED);
155 gtk_widget_set_sensitive(g_menu_item_unload_studio, studio_state != STUDIO_STATE_UNLOADED);
156 gtk_widget_set_sensitive(g_menu_item_rename_studio, studio_state == STUDIO_STATE_STOPPED || studio_state == STUDIO_STATE_STARTED);
157 gtk_widget_set_sensitive(g_menu_item_start_app, studio_state == STUDIO_STATE_STOPPED || studio_state == STUDIO_STATE_STARTED);
158 gtk_widget_set_sensitive(g_menu_item_create_room, studio_state == STUDIO_STATE_STOPPED || studio_state == STUDIO_STATE_STARTED);
161 void menu_set_jack_latency_items_sensivity(bool sensitive)
163 gtk_widget_set_sensitive(GTK_WIDGET(g_menu_item_jack_latency_32), sensitive);
164 gtk_widget_set_sensitive(GTK_WIDGET(g_menu_item_jack_latency_64), sensitive);
165 gtk_widget_set_sensitive(GTK_WIDGET(g_menu_item_jack_latency_128), sensitive);
166 gtk_widget_set_sensitive(GTK_WIDGET(g_menu_item_jack_latency_256), sensitive);
167 gtk_widget_set_sensitive(GTK_WIDGET(g_menu_item_jack_latency_512), sensitive);
168 gtk_widget_set_sensitive(GTK_WIDGET(g_menu_item_jack_latency_1024), sensitive);
169 gtk_widget_set_sensitive(GTK_WIDGET(g_menu_item_jack_latency_2048), sensitive);
170 gtk_widget_set_sensitive(GTK_WIDGET(g_menu_item_jack_latency_4096), sensitive);
171 gtk_widget_set_sensitive(GTK_WIDGET(g_menu_item_jack_latency_8192), sensitive);
174 bool menu_set_jack_latency(uint32_t buffer_size, bool force)
176 GtkCheckMenuItem * item_ptr;
178 switch (buffer_size)
180 case 32:
181 item_ptr = g_menu_item_jack_latency_32;
182 break;
183 case 64:
184 item_ptr = g_menu_item_jack_latency_64;
185 break;
186 case 128:
187 item_ptr = g_menu_item_jack_latency_128;
188 break;
189 case 256:
190 item_ptr = g_menu_item_jack_latency_256;
191 break;
192 case 512:
193 item_ptr = g_menu_item_jack_latency_512;
194 break;
195 case 1024:
196 item_ptr = g_menu_item_jack_latency_1024;
197 break;
198 case 2048:
199 item_ptr = g_menu_item_jack_latency_2048;
200 break;
201 case 4096:
202 item_ptr = g_menu_item_jack_latency_4096;
203 break;
204 case 8192:
205 item_ptr = g_menu_item_jack_latency_8192;
206 break;
207 default:
208 //log_error("unknown jack buffer size %"PRIu32, buffer_size);
209 return false;
212 if (force || !item_ptr->active)
214 log_info("menu_set_jack_latency() detects change");
215 g_latency_changing = true; /* latency has changed externally, don't tell jack to change it again */
216 gtk_check_menu_item_set_active(item_ptr, TRUE);
217 g_latency_changing = false;
220 return true;
223 void menu_set_toolbar_visibility(bool visible)
225 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(g_menu_item_view_toolbar), visible);
228 void menu_view_activated(bool room)
230 gtk_widget_set_sensitive(g_menu_item_destroy_room, room);
231 gtk_widget_set_sensitive(g_menu_item_load_project, room);
232 gtk_widget_set_sensitive(g_menu_item_unload_project, room);
233 gtk_widget_set_sensitive(g_menu_item_save_project, room);
234 gtk_widget_set_sensitive(g_menu_item_save_as_project, room);
237 static void on_popup_menu_action_start_app(GtkWidget * menuitem, gpointer userdata)
239 menu_request_start_app();
242 static void on_popup_menu_action_create_room(GtkWidget * menuitem, gpointer userdata)
244 menu_request_create_room();
247 static void on_popup_menu_action_destroy_room(GtkWidget * menuitem, gpointer userdata)
249 menu_request_destroy_room();
252 static void on_popup_menu_action_load_project(GtkWidget * menuitem, gpointer userdata)
254 menu_request_load_project();
257 static void on_popup_menu_action_unload_project(GtkWidget * menuitem, gpointer userdata)
259 menu_request_unload_project();
262 static void on_popup_menu_action_save_project(GtkWidget * menuitem, gpointer userdata)
264 menu_request_save_project();
267 static void on_popup_menu_action_save_project_as(GtkWidget * menuitem, gpointer userdata)
269 menu_request_save_as_project();
272 void fill_view_popup_menu(GtkMenu * menu, graph_view_handle view)
274 GtkWidget * menuitem;
276 log_info("filling view menu...");
278 if (graph_view_get_app_supervisor(view) != NULL)
280 menuitem = gtk_menu_item_new_with_label("Run...");
281 g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_start_app, NULL);
282 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
285 if (is_room_view(view))
287 menuitem = gtk_menu_item_new_with_label("Load Project...");
288 g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_load_project, NULL);
289 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
291 menuitem = gtk_menu_item_new_with_label("Unload Project");
292 g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_unload_project, NULL);
293 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
295 menuitem = gtk_menu_item_new_with_label("Save Project...");
296 g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_save_project, NULL);
297 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
299 menuitem = gtk_menu_item_new_with_label("Save Project As...");
300 g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_save_project_as, NULL);
301 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
303 menuitem = gtk_separator_menu_item_new(); /* separator */
304 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
306 menuitem = gtk_menu_item_new_with_label("Destroy Room");
307 g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_destroy_room, NULL);
308 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
310 else
312 menuitem = gtk_menu_item_new_with_label("Create Room...");
313 g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_create_room, NULL);
314 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);