Changeset eaf2b0bd504a29695ec09fa1ed7a33ea5b858ea4
- Timestamp:
- 12/19/10 18:32:02 (2 years ago)
- Children:
- 8dafd546e50dfc4a1abdd3df48e9f6bd6feec37d
- Parents:
- 06f37b47d4eae703726a8a5a5a61e57a7f0295a2
- git-committer:
- Nedko Arnaudov <nedko@arnaudov.name> / 2010-12-19T18:32:02Z+0200
- Location:
- gui
- Files:
-
- 8 modified
-
action.c (modified) (3 diffs)
-
dynmenu.c (modified) (8 diffs)
-
dynmenu.h (modified) (2 diffs)
-
gladish.ui (modified) (1 diff)
-
graph_view.c (modified) (1 diff)
-
graph_view.h (modified) (1 diff)
-
menu.c (modified) (13 diffs)
-
studio_list.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
gui/action.c
r71c1784 reaf2b0b 30 30 #include "jack.h" 31 31 #include "zoom.h" 32 #include "menu.h" 33 #include "studio.h" 32 34 33 35 GtkAction * g_clear_xruns_and_max_dsp_action; … … 36 38 GtkAction * g_zoom_in_action; 37 39 GtkAction * g_zoom_out_action; 40 41 static 42 gboolean 43 load_project_accelerator_activated( 44 GtkAccelGroup * accel_group, 45 GObject * acceleratable, 46 guint keyval, 47 GdkModifierType modifier) 48 { 49 graph_view_handle view; 50 51 view = get_current_view(); 52 if (get_studio_state() == STUDIO_STATE_STARTED && view != NULL && is_room_view(view)) 53 { 54 menu_request_load_project(); 55 } 56 57 return TRUE; 58 } 59 60 static 61 gboolean 62 unload_project_accelerator_activated( 63 GtkAccelGroup * accel_group, 64 GObject * acceleratable, 65 guint keyval, 66 GdkModifierType modifier) 67 { 68 graph_view_handle view; 69 70 view = get_current_view(); 71 if (get_studio_state() == STUDIO_STATE_STARTED && view != NULL && is_room_view(view)) 72 { 73 menu_request_unload_project(); 74 } 75 76 return TRUE; 77 } 38 78 39 79 void init_actions_and_accelerators(void) … … 92 132 } 93 133 134 gtk_accel_group_connect( 135 accel_group_ptr, 136 gdk_keyval_from_name("o"), 137 GDK_CONTROL_MASK, 138 GTK_ACCEL_VISIBLE, 139 g_cclosure_new((GCallback)load_project_accelerator_activated, NULL, NULL)); 140 141 gtk_accel_group_connect( 142 accel_group_ptr, 143 gdk_keyval_from_name("u"), 144 GDK_CONTROL_MASK, 145 GTK_ACCEL_VISIBLE, 146 g_cclosure_new((GCallback)unload_project_accelerator_activated, NULL, NULL)); 147 94 148 gtk_window_add_accel_group(GTK_WINDOW(g_main_win), accel_group_ptr); 95 149 } -
gui/dynmenu.c
r71c1784 reaf2b0b 41 41 const char * name, 42 42 void * data, 43 ladish_dynmenu_item_activate_callback item_activate_callback, 43 44 void (* data_free)()), 44 45 void * context); 45 void (* item_activate_callback)(const char * name, void * data);46 ladish_dynmenu_item_activate_callback item_activate_callback; 46 47 bool add_sensitive; 47 48 gulong activate_signal_id; … … 54 55 void * data; 55 56 void (* data_free)(); 56 void (* item_activate_callback)(const char * name, void * data);57 ladish_dynmenu_item_activate_callback item_activate_callback; 57 58 }; 58 59 … … 90 91 #define dynmenu_ptr ((struct ladish_dynmenu *)context) 91 92 92 static void ladish_dynmenu_add_entry(void * context, const char * name, void * data, void (* data_free)()) 93 static 94 void 95 ladish_dynmenu_add_entry( 96 void * context, 97 const char * name, 98 void * data, 99 ladish_dynmenu_item_activate_callback item_activate_callback, 100 void (* data_free)()) 93 101 { 94 102 struct ladish_dynmenu_item_data * data_ptr; … … 98 106 data_ptr->data = data; 99 107 data_ptr->data_free = data_free; 100 data_ptr->item_activate_callback = dynmenu_ptr->item_activate_callback; 101 102 data_ptr->item = gtk_menu_item_new_with_label(name); 103 //log_info("refcount == %d", (unsigned int)G_OBJECT(item)->ref_count); // refcount == 2 because of the label 104 gtk_widget_set_sensitive(data_ptr->item, dynmenu_ptr->add_sensitive); 105 gtk_widget_show(data_ptr->item); 106 gtk_menu_shell_append(GTK_MENU_SHELL(dynmenu_ptr->menu), data_ptr->item); 107 g_signal_connect_data( 108 G_OBJECT(data_ptr->item), 109 "activate", 110 G_CALLBACK(on_activate_item), 111 data_ptr, 112 free_item_data, 113 (GConnectFlags)0); 108 data_ptr->item_activate_callback = item_activate_callback != NULL ? item_activate_callback : dynmenu_ptr->item_activate_callback; 109 110 if (name == NULL) 111 { 112 data_ptr->item = gtk_separator_menu_item_new(); /* separator */ 113 gtk_widget_show(data_ptr->item); 114 gtk_menu_shell_append(GTK_MENU_SHELL(dynmenu_ptr->menu), data_ptr->item); 115 } 116 else 117 { 118 data_ptr->item = gtk_menu_item_new_with_label(name); 119 //log_info("refcount == %d", (unsigned int)G_OBJECT(item)->ref_count); // refcount == 2 because of the label 120 gtk_widget_set_sensitive(data_ptr->item, dynmenu_ptr->add_sensitive); 121 gtk_widget_show(data_ptr->item); 122 gtk_menu_shell_append(GTK_MENU_SHELL(dynmenu_ptr->menu), data_ptr->item); 123 g_signal_connect_data( 124 G_OBJECT(data_ptr->item), 125 "activate", 126 G_CALLBACK(on_activate_item), 127 data_ptr, 128 free_item_data, 129 (GConnectFlags)0); 130 } 131 114 132 dynmenu_ptr->count++; 115 133 } … … 150 168 { 151 169 menu_dynmenu_clear(dynmenu_ptr); 152 prefix = _("Error obtaining ");170 prefix = _("Error filling "); 153 171 } 154 172 else if (dynmenu_ptr->count == 0) … … 164 182 165 183 dynmenu_ptr->add_sensitive = false; 166 ladish_dynmenu_add_entry(dynmenu_ptr, text != NULL ? text : prefix, NULL, NULL );184 ladish_dynmenu_add_entry(dynmenu_ptr, text != NULL ? text : prefix, NULL, NULL, NULL); 167 185 168 186 free(text); /* free(NULL) is safe */ … … 180 198 const char * name, 181 199 void * data, 200 ladish_dynmenu_item_activate_callback item_activate_callback, 182 201 void (* data_free)()), 183 202 void * context), 184 203 const char * description, 185 void (* item_activate_callback)(const char * name, void * data),204 ladish_dynmenu_item_activate_callback item_activate_callback, 186 205 ladish_dynmenu_handle * dynmenu_handle_ptr) 187 206 { … … 218 237 219 238 void 239 ladish_dynmenu_fill_external( 240 ladish_dynmenu_handle dynmenu_handle, 241 GtkMenu * menu) 242 { 243 GtkWidget * menu_backup; 244 int count_backup; 245 246 menu_backup = dynmenu_ptr->menu; 247 count_backup = dynmenu_ptr->count; 248 249 dynmenu_ptr->menu = GTK_WIDGET(menu); 250 dynmenu_ptr->add_sensitive = true; 251 252 dynmenu_ptr->fill_callback(ladish_dynmenu_add_entry, dynmenu_ptr); 253 254 dynmenu_ptr->menu = menu_backup; 255 dynmenu_ptr->count = count_backup; 256 } 257 258 void 220 259 ladish_dynmenu_destroy( 221 260 ladish_dynmenu_handle dynmenu_handle) -
gui/dynmenu.h
re405d25 reaf2b0b 32 32 typedef struct ladish_dynmenu_tag { int unused; } * ladish_dynmenu_handle; 33 33 34 typedef void (* ladish_dynmenu_item_activate_callback)(const char * name, void * data); 35 34 36 bool 35 37 ladish_dynmenu_create( … … 43 45 const char * name, 44 46 void * data, 47 ladish_dynmenu_item_activate_callback item_activate_callback, 45 48 void (* data_free)()), 46 49 void * context), 47 50 const char * description, 48 void (* item_activate_callback)(const char * name, void * data),51 ladish_dynmenu_item_activate_callback item_activate_callback, 49 52 ladish_dynmenu_handle * dynmenu_handle_ptr); 53 54 void 55 ladish_dynmenu_fill_external( 56 ladish_dynmenu_handle dynmenu_handle, 57 GtkMenu * menu); 50 58 51 59 void -
gui/gladish.ui
r71c1784 reaf2b0b 188 188 <object class="GtkMenu" id="project_menu"> 189 189 <property name="visible">True</property> 190 <child>191 <object class="GtkImageMenuItem" id="menu_item_load_project">192 <property name="label" translatable="yes">_Load Project...</property>193 <property name="image">image_load_project</property>194 <property name="sensitive">False</property>195 <property name="use_stock">False</property>196 <property name="use_underline">True</property>197 <property name="visible">True</property>198 <accelerator key="O" signal="activate" modifiers="GDK_CONTROL_MASK"/>199 </object>200 </child>201 <child>202 <object class="GtkImageMenuItem" id="menu_item_unload_project">203 <property name="label" translatable="yes">_Unload Project</property>204 <property name="image">image_unload_project</property>205 <property name="sensitive">False</property>206 <property name="use_stock">False</property>207 <property name="use_underline">True</property>208 <property name="visible">True</property>209 <accelerator key="U" signal="activate" modifiers="GDK_CONTROL_MASK"/>210 </object>211 </child>212 <child>213 <object class="GtkImageMenuItem" id="menu_item_rename_project">214 <property name="label" translatable="yes">_Rename Project...</property>215 <property name="image">image_rename_project</property>216 <property name="sensitive">False</property>217 <property name="use_stock">False</property>218 <property name="use_underline">True</property>219 <property name="visible">True</property>220 </object>221 </child>222 <child>223 <object class="GtkImageMenuItem" id="menu_item_save_project">224 <property name="label" translatable="yes">_Save Project</property>225 <property name="image">image_save_project</property>226 <property name="sensitive">False</property>227 <property name="use_stock">False</property>228 <property name="use_underline">True</property>229 <property name="visible">True</property>230 </object>231 </child>232 <child>233 <object class="GtkImageMenuItem" id="menu_item_save_as_project">234 <property name="label" translatable="yes">Save Project _As...</property>235 <property name="image">image_save_as_project</property>236 <property name="sensitive">False</property>237 <property name="use_stock">False</property>238 <property name="use_underline">True</property>239 <property name="visible">True</property>240 </object>241 </child>242 <child>243 <object class="GtkSeparatorMenuItem" id="project_menu_separator1">244 <property name="visible">True</property>245 </object>246 </child>247 <child>248 <object class="GtkImageMenuItem" id="menu_item_recently_loaded_projects">249 <property name="label" translatable="yes">R_ecently Loaded</property>250 <property name="sensitive">False</property>251 <property name="use_stock">False</property>252 <property name="use_underline">True</property>253 <property name="visible">True</property>254 </object>255 </child>256 190 </object> 257 191 </child> -
gui/graph_view.c
rdd6c013 reaf2b0b 478 478 return view_ptr->room; 479 479 } 480 481 bool room_has_project(graph_view_handle view) 482 { 483 return view_ptr->project_name != NULL; 484 } -
gui/graph_view.h
r997208c reaf2b0b 55 55 const char * get_current_view_room_name(void); 56 56 bool is_room_view(graph_view_handle view); 57 bool room_has_project(graph_view_handle view); 57 58 58 59 ladish_app_supervisor_proxy_handle graph_view_get_app_supervisor(graph_view_handle view); -
gui/menu.c
r06f37b4 reaf2b0b 41 41 static GtkWidget * g_menu_item_create_room; 42 42 static GtkWidget * g_menu_item_destroy_room; 43 static GtkWidget * g_menu_item_load_project; 44 static GtkWidget * g_menu_item_unload_project; 45 static GtkWidget * g_menu_item_save_project; 46 static GtkWidget * g_menu_item_save_as_project; 43 static GtkWidget * g_menu_item_project; 47 44 static GtkWidget * g_menu_item_daemon_exit; 48 45 static GtkWidget * g_menu_item_jack_configure; … … 63 60 static bool g_latency_changing; 64 61 65 static ladish_dynmenu_handle g_ recent_projects_list;62 static ladish_dynmenu_handle g_project_dynmenu; 66 63 67 64 typedef void (* menu_request_toggle_func)(bool visible); … … 89 86 struct ladish_recent_projects_list_closure 90 87 { 91 GtkMenu * menu;92 88 void 93 89 (* callback)( … … 95 91 const char * name, 96 92 void * data, 93 void (* item_activate_callback)(const char * name, void * data), 97 94 void (* data_free)()); 98 95 void * context; 99 96 }; 100 97 101 static void on_load_project_main_menu(const char * name, void * data) 102 { 103 log_info("Request to load project \"%s\":\"%s\"", name, (const char *)data); 104 if (!ladish_room_proxy_load_project(graph_view_get_room(get_current_view()), data)) 105 { 106 error_message_box(_("Project load failed, please inspect logs.")); 107 } 108 } 109 110 static void on_load_project_popup_menu(const char * name, void * data) 98 static void on_load_project(const char * name, void * data) 111 99 { 112 100 log_info("Request to load project \"%s\":\"%s\"", name, (const char *)data); … … 126 114 const char * project_dir) 127 115 { 128 GtkWidget * menuitem; 129 130 if (closure_ptr->menu != NULL) 131 { 132 menuitem = gtk_menu_item_new_with_label(project_name); 133 g_signal_connect_data( 134 menuitem, 135 "activate", 136 (GCallback)on_load_project_popup_menu, 137 strdup(project_dir), 138 (GClosureNotify)free, 139 (GConnectFlags)0); 140 gtk_menu_shell_append(GTK_MENU_SHELL(closure_ptr->menu), menuitem); 141 } 142 else 143 { 144 closure_ptr->callback(closure_ptr->context, project_name, strdup(project_dir), NULL); 145 } 146 } 147 148 #undef closure_ptr 149 116 closure_ptr->callback(closure_ptr->context, project_name, strdup(project_dir), NULL, free); 117 } 118 119 static 150 120 bool 151 get_recent_projects_list(121 fill_project_dynmenu( 152 122 void (* callback)( 153 123 void * context, 154 124 const char * name, 155 125 void * data, 126 void (* item_activate_callback)(const char * name, void * data), 156 127 void (* data_free)()), 157 128 void * context) 158 129 { 159 130 struct ladish_recent_projects_list_closure closure; 160 161 closure.menu = NULL; 131 bool has_project; 132 graph_view_handle view; 133 162 134 closure.callback = callback; 163 135 closure.context = context; 164 136 165 return ladish_room_proxy_get_recent_projects(graph_view_get_room(get_current_view()), 10, add_recent_project, &closure); 166 } 137 view = get_current_view(); 138 139 if (ladish_room_proxy_get_recent_projects(graph_view_get_room(view), 10, add_recent_project, &closure)) 140 { 141 callback(context, NULL, NULL, NULL, NULL); /* add separator */ 142 } 143 144 callback(context, _("Load Project..."), NULL, (ladish_dynmenu_item_activate_callback)menu_request_load_project, NULL); 145 146 has_project = room_has_project(view); 147 148 if (!has_project) 149 { 150 callback(context, _("Create Project..."), NULL, (ladish_dynmenu_item_activate_callback)menu_request_save_as_project, NULL); 151 } 152 153 callback(context, has_project ? _("Unload Project") : _("Clear Room"), NULL, (ladish_dynmenu_item_activate_callback)menu_request_unload_project, NULL); 154 155 if (has_project) 156 { 157 callback(context, _("Save Project"), NULL, (ladish_dynmenu_item_activate_callback)menu_request_save_project, NULL); 158 callback(context, _("Save Project As..."), NULL, (ladish_dynmenu_item_activate_callback)menu_request_save_as_project, NULL); 159 callback(context, _("Project Properties..."), NULL, (ladish_dynmenu_item_activate_callback)ladish_project_properties_dialog_run, NULL); 160 } 161 162 return true; 163 } 164 165 #undef closure_ptr 167 166 168 167 bool menu_init(void) … … 178 177 g_menu_item_create_room = get_gtk_builder_widget("menu_item_create_room"); 179 178 g_menu_item_destroy_room = get_gtk_builder_widget("menu_item_destroy_room"); 180 g_menu_item_load_project = get_gtk_builder_widget("menu_item_load_project"); 181 g_menu_item_unload_project = get_gtk_builder_widget("menu_item_unload_project"); 182 g_menu_item_save_project = get_gtk_builder_widget("menu_item_save_project"); 183 g_menu_item_save_as_project = get_gtk_builder_widget("menu_item_save_as_project"); 179 g_menu_item_project = get_gtk_builder_widget("project_menu_item"); 184 180 g_menu_item_daemon_exit = get_gtk_builder_widget("menu_item_daemon_exit"); 185 181 g_menu_item_jack_configure = get_gtk_builder_widget("menu_item_jack_configure"); … … 214 210 g_signal_connect(G_OBJECT(g_menu_item_create_room), "activate", G_CALLBACK(menu_request_create_room), NULL); 215 211 g_signal_connect(G_OBJECT(g_menu_item_destroy_room), "activate", G_CALLBACK(menu_request_destroy_room), NULL); 216 g_signal_connect(G_OBJECT(g_menu_item_load_project), "activate", G_CALLBACK(menu_request_load_project), NULL);217 g_signal_connect(G_OBJECT(g_menu_item_unload_project), "activate", G_CALLBACK(menu_request_unload_project), NULL);218 g_signal_connect(G_OBJECT(g_menu_item_save_project), "activate", G_CALLBACK(menu_request_save_project), NULL);219 g_signal_connect(G_OBJECT(g_menu_item_save_as_project), "activate", G_CALLBACK(menu_request_save_as_project), NULL);220 212 221 213 g_signal_connect(G_OBJECT(g_menu_item_jack_latency_32), "toggled", G_CALLBACK(buffer_size_change_request), (gpointer)32); … … 230 222 231 223 if (!ladish_dynmenu_create( 232 " menu_item_recently_loaded_projects",233 " recently_loaded_projects_menu",234 get_recent_projects_list,235 " recent projects list",236 on_load_project _main_menu,237 &g_ recent_projects_list))224 "project_menu_item", 225 "project_menu", 226 fill_project_dynmenu, 227 "project menu", 228 on_load_project, 229 &g_project_dynmenu)) 238 230 { 239 231 return false; … … 245 237 void menu_uninit(void) 246 238 { 247 ladish_dynmenu_destroy(g_ recent_projects_list);239 ladish_dynmenu_destroy(g_project_dynmenu); 248 240 } 249 241 250 242 void menu_studio_state_changed(unsigned int studio_state) 251 243 { 244 graph_view_handle view; 245 252 246 gtk_widget_set_sensitive(g_menu_item_start_studio, studio_state == STUDIO_STATE_STOPPED); 253 247 gtk_widget_set_sensitive(g_menu_item_stop_studio, studio_state == STUDIO_STATE_STARTED); … … 258 252 gtk_widget_set_sensitive(g_menu_item_start_app, studio_state == STUDIO_STATE_STOPPED || studio_state == STUDIO_STATE_STARTED); 259 253 gtk_widget_set_sensitive(g_menu_item_create_room, studio_state == STUDIO_STATE_STOPPED || studio_state == STUDIO_STATE_STARTED); 254 255 view = get_current_view(); 256 gtk_widget_set_sensitive(g_menu_item_project, studio_state == STUDIO_STATE_STARTED && view != NULL && is_room_view(view)); 260 257 } 261 258 … … 330 327 { 331 328 gtk_widget_set_sensitive(g_menu_item_destroy_room, room); 332 gtk_widget_set_sensitive(g_menu_item_load_project, room); 333 gtk_widget_set_sensitive(g_menu_item_unload_project, room); 334 gtk_widget_set_sensitive(g_menu_item_save_project, room); 335 gtk_widget_set_sensitive(g_menu_item_save_as_project, room); 336 gtk_widget_set_sensitive(get_gtk_builder_widget("menu_item_recently_loaded_projects"), room); 329 gtk_widget_set_sensitive(g_menu_item_project, room && get_studio_state() == STUDIO_STATE_STARTED); 337 330 } 338 331 … … 352 345 } 353 346 354 static void on_popup_menu_action_load_project(GtkWidget * menuitem, gpointer userdata)355 {356 menu_request_load_project();357 }358 359 static void on_popup_menu_action_unload_project(GtkWidget * menuitem, gpointer userdata)360 {361 menu_request_unload_project();362 }363 364 static void on_popup_menu_action_save_project(GtkWidget * menuitem, gpointer userdata)365 {366 menu_request_save_project();367 }368 369 static void on_popup_menu_action_save_project_as(GtkWidget * menuitem, gpointer userdata)370 {371 menu_request_save_as_project();372 }373 374 347 void fill_view_popup_menu(GtkMenu * menu, graph_view_handle view) 375 348 { 376 349 GtkWidget * menuitem; 377 struct ladish_recent_projects_list_closure closure;378 350 379 351 log_info("filling view menu..."); … … 388 360 if (is_room_view(view)) 389 361 { 390 closure.menu = menu;391 closure.callback = NULL;392 closure.context = NULL;393 394 362 menuitem = gtk_separator_menu_item_new(); /* separator */ 395 363 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); 396 364 397 if (ladish_room_proxy_get_recent_projects(graph_view_get_room(get_current_view()), 10, add_recent_project, &closure)) 398 { 399 menuitem = gtk_separator_menu_item_new(); /* separator */ 400 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); 401 } 402 403 menuitem = gtk_menu_item_new_with_label(_("Load Project...")); 404 g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_load_project, NULL); 405 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); 406 407 menuitem = gtk_menu_item_new_with_label(_("Unload Project")); 408 g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_unload_project, NULL); 409 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); 410 411 menuitem = gtk_menu_item_new_with_label(_("Save Project...")); 412 g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_save_project, NULL); 413 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); 414 415 menuitem = gtk_menu_item_new_with_label(_("Save Project As...")); 416 g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_save_project_as, NULL); 417 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); 418 419 menuitem = gtk_menu_item_new_with_label(_("Project Properties...")); 420 g_signal_connect(menuitem, "activate", (GCallback)ladish_project_properties_dialog_run, NULL); 421 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); 365 ladish_dynmenu_fill_external(g_project_dynmenu, menu); 422 366 423 367 menuitem = gtk_separator_menu_item_new(); /* separator */ -
gui/studio_list.c
rf12e4c9 reaf2b0b 40 40 const char * name, 41 41 void * data, 42 ladish_dynmenu_item_activate_callback item_activate_callback, 42 43 void (* data_free)()); 43 44 void * context; … … 52 53 const char * studio_name) 53 54 { 54 closure_ptr->callback(closure_ptr->context, studio_name, NULL, NULL );55 closure_ptr->callback(closure_ptr->context, studio_name, NULL, NULL, NULL); 55 56 } 56 57 … … 65 66 const char * name, 66 67 void * data, 68 ladish_dynmenu_item_activate_callback item_activate_callback, 67 69 void (* data_free)()), 68 70 void * context)
