Changeset eaf2b0bd504a29695ec09fa1ed7a33ea5b858ea4

Show
Ignore:
Timestamp:
12/19/10 18:32:02 (2 years ago)
Author:
Nedko Arnaudov <nedko@…>
Children:
8dafd546e50dfc4a1abdd3df48e9f6bd6feec37d
Parents:
06f37b47d4eae703726a8a5a5a61e57a7f0295a2
git-committer:
Nedko Arnaudov <nedko@arnaudov.name> / 2010-12-19T18:32:02Z+0200
Message:

rework project menu. Fix for #128 and #130

Location:
gui
Files:
8 modified

Legend:

Unmodified
Added
Removed
  • gui/action.c

    r71c1784 reaf2b0b  
    3030#include "jack.h" 
    3131#include "zoom.h" 
     32#include "menu.h" 
     33#include "studio.h" 
    3234 
    3335GtkAction * g_clear_xruns_and_max_dsp_action; 
     
    3638GtkAction * g_zoom_in_action; 
    3739GtkAction * g_zoom_out_action; 
     40 
     41static 
     42gboolean 
     43load_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 
     60static 
     61gboolean 
     62unload_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} 
    3878 
    3979void init_actions_and_accelerators(void) 
     
    92132  } 
    93133 
     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 
    94148  gtk_window_add_accel_group(GTK_WINDOW(g_main_win), accel_group_ptr); 
    95149} 
  • gui/dynmenu.c

    r71c1784 reaf2b0b  
    4141      const char * name, 
    4242      void * data, 
     43      ladish_dynmenu_item_activate_callback item_activate_callback, 
    4344      void (* data_free)()), 
    4445    void * context); 
    45   void (* item_activate_callback)(const char * name, void * data); 
     46  ladish_dynmenu_item_activate_callback item_activate_callback; 
    4647  bool add_sensitive; 
    4748  gulong activate_signal_id; 
     
    5455  void * data; 
    5556  void (* data_free)(); 
    56   void (* item_activate_callback)(const char * name, void * data); 
     57  ladish_dynmenu_item_activate_callback item_activate_callback; 
    5758}; 
    5859 
     
    9091#define dynmenu_ptr ((struct ladish_dynmenu *)context) 
    9192 
    92 static void ladish_dynmenu_add_entry(void * context, const char * name, void * data, void (* data_free)()) 
     93static 
     94void 
     95ladish_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)()) 
    93101{ 
    94102  struct ladish_dynmenu_item_data * data_ptr; 
     
    98106  data_ptr->data = data; 
    99107  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 
    114132  dynmenu_ptr->count++; 
    115133} 
     
    150168  { 
    151169    menu_dynmenu_clear(dynmenu_ptr); 
    152     prefix = _("Error obtaining "); 
     170    prefix = _("Error filling "); 
    153171  } 
    154172  else if (dynmenu_ptr->count == 0) 
     
    164182 
    165183  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); 
    167185 
    168186  free(text);                   /* free(NULL) is safe */ 
     
    180198      const char * name, 
    181199      void * data, 
     200      ladish_dynmenu_item_activate_callback item_activate_callback, 
    182201      void (* data_free)()), 
    183202    void * context), 
    184203  const char * description, 
    185   void (* item_activate_callback)(const char * name, void * data), 
     204  ladish_dynmenu_item_activate_callback item_activate_callback, 
    186205  ladish_dynmenu_handle * dynmenu_handle_ptr) 
    187206{ 
     
    218237 
    219238void 
     239ladish_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 
     258void 
    220259ladish_dynmenu_destroy( 
    221260  ladish_dynmenu_handle dynmenu_handle) 
  • gui/dynmenu.h

    re405d25 reaf2b0b  
    3232typedef struct ladish_dynmenu_tag { int unused; } * ladish_dynmenu_handle; 
    3333 
     34typedef void (* ladish_dynmenu_item_activate_callback)(const char * name, void * data); 
     35 
    3436bool 
    3537ladish_dynmenu_create( 
     
    4345      const char * name, 
    4446      void * data, 
     47      ladish_dynmenu_item_activate_callback item_activate_callback, 
    4548      void (* data_free)()), 
    4649    void * context), 
    4750  const char * description, 
    48   void (* item_activate_callback)(const char * name, void * data), 
     51  ladish_dynmenu_item_activate_callback item_activate_callback, 
    4952  ladish_dynmenu_handle * dynmenu_handle_ptr); 
     53 
     54void 
     55ladish_dynmenu_fill_external( 
     56  ladish_dynmenu_handle dynmenu_handle, 
     57  GtkMenu * menu); 
    5058 
    5159void 
  • gui/gladish.ui

    r71c1784 reaf2b0b  
    188188                  <object class="GtkMenu" id="project_menu"> 
    189189                    <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> 
    256190                  </object> 
    257191                </child> 
  • gui/graph_view.c

    rdd6c013 reaf2b0b  
    478478  return view_ptr->room; 
    479479} 
     480 
     481bool room_has_project(graph_view_handle view) 
     482{ 
     483  return view_ptr->project_name != NULL; 
     484} 
  • gui/graph_view.h

    r997208c reaf2b0b  
    5555const char * get_current_view_room_name(void); 
    5656bool is_room_view(graph_view_handle view); 
     57bool room_has_project(graph_view_handle view); 
    5758 
    5859ladish_app_supervisor_proxy_handle graph_view_get_app_supervisor(graph_view_handle view); 
  • gui/menu.c

    r06f37b4 reaf2b0b  
    4141static GtkWidget * g_menu_item_create_room; 
    4242static 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; 
     43static GtkWidget * g_menu_item_project; 
    4744static GtkWidget * g_menu_item_daemon_exit; 
    4845static GtkWidget * g_menu_item_jack_configure; 
     
    6360static bool g_latency_changing; 
    6461 
    65 static ladish_dynmenu_handle g_recent_projects_list; 
     62static ladish_dynmenu_handle g_project_dynmenu; 
    6663 
    6764typedef void (* menu_request_toggle_func)(bool visible); 
     
    8986struct ladish_recent_projects_list_closure 
    9087{ 
    91   GtkMenu * menu; 
    9288  void 
    9389  (* callback)( 
     
    9591    const char * name, 
    9692    void * data, 
     93    void (* item_activate_callback)(const char * name, void * data), 
    9794    void (* data_free)()); 
    9895  void * context; 
    9996}; 
    10097 
    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) 
     98static void on_load_project(const char * name, void * data) 
    11199{ 
    112100  log_info("Request to load project \"%s\":\"%s\"", name, (const char *)data); 
     
    126114  const char * project_dir) 
    127115{ 
    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 
     119static 
    150120bool 
    151 get_recent_projects_list( 
     121fill_project_dynmenu( 
    152122  void (* callback)( 
    153123    void * context, 
    154124    const char * name, 
    155125    void * data, 
     126    void (* item_activate_callback)(const char * name, void * data), 
    156127    void (* data_free)()), 
    157128  void * context) 
    158129{ 
    159130  struct ladish_recent_projects_list_closure closure; 
    160  
    161   closure.menu = NULL; 
     131  bool has_project; 
     132  graph_view_handle view; 
     133 
    162134  closure.callback = callback; 
    163135  closure.context = context; 
    164136 
    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 
    167166 
    168167bool menu_init(void) 
     
    178177  g_menu_item_create_room = get_gtk_builder_widget("menu_item_create_room"); 
    179178  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"); 
    184180  g_menu_item_daemon_exit = get_gtk_builder_widget("menu_item_daemon_exit"); 
    185181  g_menu_item_jack_configure = get_gtk_builder_widget("menu_item_jack_configure"); 
     
    214210  g_signal_connect(G_OBJECT(g_menu_item_create_room), "activate", G_CALLBACK(menu_request_create_room), NULL); 
    215211  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); 
    220212 
    221213  g_signal_connect(G_OBJECT(g_menu_item_jack_latency_32), "toggled", G_CALLBACK(buffer_size_change_request), (gpointer)32); 
     
    230222 
    231223  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)) 
    238230  { 
    239231    return false; 
     
    245237void menu_uninit(void) 
    246238{ 
    247   ladish_dynmenu_destroy(g_recent_projects_list); 
     239  ladish_dynmenu_destroy(g_project_dynmenu); 
    248240} 
    249241 
    250242void menu_studio_state_changed(unsigned int studio_state) 
    251243{ 
     244  graph_view_handle view; 
     245 
    252246  gtk_widget_set_sensitive(g_menu_item_start_studio, studio_state == STUDIO_STATE_STOPPED); 
    253247  gtk_widget_set_sensitive(g_menu_item_stop_studio, studio_state == STUDIO_STATE_STARTED); 
     
    258252  gtk_widget_set_sensitive(g_menu_item_start_app, studio_state == STUDIO_STATE_STOPPED || studio_state == STUDIO_STATE_STARTED); 
    259253  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)); 
    260257} 
    261258 
     
    330327{ 
    331328  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); 
    337330} 
    338331 
     
    352345} 
    353346 
    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  
    374347void fill_view_popup_menu(GtkMenu * menu, graph_view_handle view) 
    375348{ 
    376349  GtkWidget * menuitem; 
    377   struct ladish_recent_projects_list_closure closure; 
    378350 
    379351  log_info("filling view menu..."); 
     
    388360  if (is_room_view(view)) 
    389361  { 
    390     closure.menu = menu; 
    391     closure.callback = NULL; 
    392     closure.context = NULL; 
    393  
    394362    menuitem = gtk_separator_menu_item_new(); /* separator */ 
    395363    gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); 
    396364 
    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); 
    422366 
    423367    menuitem = gtk_separator_menu_item_new(); /* separator */ 
  • gui/studio_list.c

    rf12e4c9 reaf2b0b  
    4040    const char * name, 
    4141    void * data, 
     42    ladish_dynmenu_item_activate_callback item_activate_callback, 
    4243    void (* data_free)()); 
    4344  void * context; 
     
    5253  const char * studio_name) 
    5354{ 
    54   closure_ptr->callback(closure_ptr->context, studio_name, NULL, NULL); 
     55  closure_ptr->callback(closure_ptr->context, studio_name, NULL, NULL, NULL); 
    5556} 
    5657 
     
    6566    const char * name, 
    6667    void * data, 
     68    ladish_dynmenu_item_activate_callback item_activate_callback, 
    6769    void (* data_free)()), 
    6870  void * context)