[nautilus/wip/gaction] prototype gaction



commit 30fd0c590c9981d008255dfd66ff5f5d6e479621
Author: Carlos Soriano <carlos soriano89 gmail com>
Date:   Fri Oct 17 15:06:34 2014 +0200

    prototype gaction

 libnautilus-private/nautilus-ui-utilities.c |  211 +++++++++++++++++++++++
 src/nautilus-canvas-view-menu.xml           |   68 ++++++++
 src/nautilus-canvas-view.c                  |  240 +++++++++++++++++++++------
 src/nautilus-canvas-view.h                  |    9 +
 src/nautilus-directory-view-menu.xml        |   19 ++
 src/nautilus-list-view.c                    |    2 +
 src/nautilus-main-menus.xml                 |   26 +++
 src/nautilus-toolbar.c                      |   31 ++++
 src/nautilus-view-menu.xml                  |   28 +++
 src/nautilus-view.c                         |   56 ++++++-
 src/nautilus-view.h                         |    8 +
 src/nautilus-window-menus.c                 |   91 ++++++++++
 src/nautilus-window-private.h               |    2 +
 src/nautilus-window-slot.c                  |   16 ++
 src/nautilus-window.c                       |   18 ++-
 src/nautilus-window.h                       |    2 +
 src/nautilus.gresource.xml                  |    3 +
 17 files changed, 779 insertions(+), 51 deletions(-)
---
diff --git a/libnautilus-private/nautilus-ui-utilities.c b/libnautilus-private/nautilus-ui-utilities.c
index 6fcc3a4..8025a95 100644
--- a/libnautilus-private/nautilus-ui-utilities.c
+++ b/libnautilus-private/nautilus-ui-utilities.c
@@ -30,6 +30,217 @@
 #include <gio/gio.h>
 #include <gtk/gtk.h>
 
+
+typedef struct GMenuModelSearchResult {
+       GMenuModel *parent;
+       GMenuModel *item;
+       gint position;
+} GMenuModelSearchResult;
+
+/*static void
+find_gmenu_item_inside_gmenu (GMenuModel *model,
+                       const gchar *item_id)
+{
+       GMenuLinkIter *liter;
+       GMenuAttributeIter *sort_liter;
+       GMenuModel    *sort_section;
+       const gchar         *attr_name;
+       const gchar         *attr_value;
+       gint           n_items;
+       gboolean found;
+
+       found = FALSE;
+
+       liter = g_menu_model_iterate_item_links (model, 0);
+       while (g_menu_link_iter_next (liter) && !found)
+       {
+               sort_section = g_menu_link_iter_get_value (liter);
+               n_items = g_menu_model_get_n_items (sort_section);
+               sort_liter = g_menu_model_iterate_item_attributes (sort_section, 0);
+
+
+               while (g_menu_attribute_iter_next (sort_liter) && !found)
+               {
+                       attr_name = g_menu_attribute_iter_get_name (sort_liter);
+                       if (strcmp(attr_name, "id") == 0)
+                       {
+                               attr_value = g_variant_print(g_menu_attribute_iter_get_value (sort_liter), 
FALSE);
+                               g_print ("attrb value %s\n", attr_value);
+                               if (strcmp(attr_value, item_id) == 0)
+                               {
+                                       g_menu_remove (G_MENU(sort_section), n_items - 1);
+                                       break;
+                               }
+                       }
+               }
+       }
+}*/
+
+static GMenuModelSearchResult *
+find_gmenu_item (GMenuModel *model,
+               const gchar *item_id)
+{
+       gint i, n_items;
+       GMenuModel *section;
+
+
+       n_items = g_menu_model_get_n_items (model);
+       g_print ("n items original %i\n", n_items);
+
+       for (i = 0; i < n_items && !section; i++)
+       {
+               gchar *id = NULL;
+               gchar *label = NULL;
+
+               g_menu_model_get_item_attribute (model, i, "label", "s", &label);
+               g_print ("label outside %s\n", label);
+
+               if (g_menu_model_get_item_attribute (model, i, "id", "s", &id) &&
+                       strcmp (id, item_id) == 0)
+               {
+                       g_print ("ID FOUND########### %s\n", id);
+                       section = g_menu_model_get_item_link (model, i, "id");
+               }
+               else
+               {
+                       g_print ("ID NOT FOUND########### %s\n", id);
+                       GMenuModel *submenu;
+                       GMenuModel *subsection;
+                       GMenuModel *sub;
+                       GMenuItem *item;
+                       gint j, j_items;
+
+                       subsection = g_menu_model_get_item_link (model, i, G_MENU_LINK_SECTION);
+                       //subsection = g_menu_model_get_item_link (model, i, NULL);
+
+                       j_items = g_menu_model_get_n_items (subsection);
+                       g_print ("n items inside%i\n", j_items);
+
+                       for (j = 0; j < j_items && !section; j++)
+                       {
+                               submenu = g_menu_model_get_item_link (subsection, j, G_MENU_LINK_SUBMENU);
+                               GMenuItem *item;
+                               g_menu_model_get_item_attribute (subsection, j, "label", "s", &label);
+                               g_print ("label inside %s\n", label);
+                               if (submenu)
+                               {
+                                       section = find_gmenu_item (submenu, item_id);
+                               }
+                               else
+                               {
+                                       g_print ("else\n");
+                               }
+                       }
+               }
+
+               g_free (id);
+               
+       }
+
+       return section;
+}
+
+static GMenuModel *
+find_gmenu_model (GMenuModel  *model,
+                   const gchar *section_id)
+{
+       gint i, n_items;
+       GMenuModel *section;
+
+       n_items = g_menu_model_get_n_items (model);
+
+       for (i = 0; i < n_items && !section; i++)
+       {
+               gchar *id = NULL;
+
+               if (g_menu_model_get_item_attribute (model, i, "id", "s", &id) &&
+                       strcmp (id, section_id) == 0)
+               {
+                       section = g_menu_model_get_item_link (model, i, G_MENU_LINK_SECTION);
+               }
+               else
+               {
+                       g_print ("model id %s\n", id);
+                       GMenuModel *subsection;
+                       GMenuModel *submenu;
+                       gint j, j_items;
+
+                       subsection = g_menu_model_get_item_link (model, i, G_MENU_LINK_SECTION);
+
+                       j_items = g_menu_model_get_n_items (subsection);
+
+                       for (j = 0; j < j_items && !section; j++)
+                       {
+                               submenu = g_menu_model_get_item_link (subsection, j, G_MENU_LINK_SUBMENU);
+                               if (submenu)
+                               {
+                                       section = find_gmenu_model (submenu, section_id);
+                               }
+                       }
+               }
+
+               g_free (id);
+       }
+
+       return section;
+}
+
+void
+nautilus_gmenu_remove_item_by_id (GMenu *menu,
+                       const gchar *item_id)
+{
+       GMenuModelSearchResult *search_result;
+       g_print ("REMOVING %s ####\n", item_id);
+       //search_result = find_gmenu_item (G_MENU_MODEL (menu), item_id);
+       //g_assert (search_result != NULL);
+       //g_assert (G_IS_MENU (search_result->position));
+       //g_assert (G_IS_MENU (search_result->parent));
+
+       //g_print ("search position%i\n", search_result->position);
+
+       //g_menu_remove (search_result->parent, search_result->position);
+}
+
+/*
+ * The original GMenu is modified adding to the section @section_name
+ * the items in @gmenu_to_merge.
+ * @gmenu_to_merge should be a list of menu items.
+ */
+void
+nautilus_gmenu_merge (GMenu *original,
+                       GMenu *gmenu_to_merge,
+                       const gchar *section_name)
+{
+       gint i, n_items, items_inside;
+       GMenuModel *section = NULL;
+       GMenuModelSearchResult *search_result = NULL;
+       GMenuModel *item;
+
+       section = find_gmenu_model (G_MENU_MODEL (original), section_name);
+       //g_assert (search_result != NULL);
+       //g_assert (G_IS_MENU (search_result->item));
+       //section = G_MENU (search_result->item);*/
+       g_print("nautilus_gmenu_merge secton name %s\n", section_name);
+       g_assert (section != NULL);
+       n_items = g_menu_model_get_n_items (gmenu_to_merge);
+
+       g_print ("nautilus_gmenu_merge n items %i\n", n_items);
+
+       //g_menu_append (section, "test2", "test2");
+
+       for (i = 0; i < n_items; i++)
+       {
+               item = g_menu_item_new_from_model (gmenu_to_merge, i);
+               if (item != NULL)
+               {
+                       items_inside = g_menu_model_get_n_items (item);
+                       g_print("items inside ############ %i\n", items_inside);
+               }
+               //g_menu_item_set_section (item, section);
+               g_menu_append_item (section, item);
+       }
+}
+
 void
 nautilus_ui_unmerge_ui (GtkUIManager *ui_manager,
                        guint *merge_id,
diff --git a/src/nautilus-canvas-view-menu.xml b/src/nautilus-canvas-view-menu.xml
new file mode 100644
index 0000000..699b864
--- /dev/null
+++ b/src/nautilus-canvas-view-menu.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<interface>
+  <!-- interface-requires gtk+ 3.0 -->
+  <menu id="sort-menu">
+    <section>
+      <item>
+        <attribute name="id">sort-label-item</attribute>
+        <attribute name="label" translatable="yes">Sort</attribute>
+      </item>
+      <item>
+        <attribute name="id">sort-by-name-item</attribute>
+        <attribute name="label" translatable="yes">name</attribute>
+        <attribute name="action">win.sort</attribute>
+        <attribute name="target">sort-by-name</attribute>
+      </item>
+      <item>
+        <attribute name="id">sort-by-size-item</attribute>
+        <attribute name="label" translatable="yes">by size</attribute>
+        <attribute name="action">win.sort</attribute>
+        <attribute name="target">sort-by-size</attribute>
+      </item>
+      <item>
+        <attribute name="id">sort-by-type-item</attribute>
+        <attribute name="label" translatable="yes">by type</attribute>
+        <attribute name="action">win.sort</attribute>
+        <attribute name="target">sort-by-type</attribute>
+      </item>
+      <item>
+        <attribute name="id">sort-by-modification-date-item</attribute>
+        <attribute name="label" translatable="yes">modification date</attribute>
+        <attribute name="action">win.sort</attribute>
+        <attribute name="target">sort-by-modification-date</attribute>
+      </item>
+      <item>
+        <attribute name="id">sort-by-access-date-item</attribute>
+        <attribute name="label" translatable="yes">access date</attribute>
+        <attribute name="action">win.sort</attribute>
+        <attribute name="target">sort-by-access-date</attribute>
+      </item>
+      <item>
+        <attribute name="id">sort-by-trash-item</attribute>
+        <attribute name="label" translatable="yes">trash date</attribute>
+        <attribute name="action">win.sort</attribute>
+        <attribute name="target">sort-by-trash-time</attribute>
+      </item>
+      <item>
+        <attribute name="id">sort-by-search-relevance</attribute>
+        <attribute name="label" translatable="yes">search relevance</attribute>
+        <attribute name="action">win.sort</attribute>
+        <attribute name="target">sort-by-search-relevance</attribute>
+      </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="id">reversed-order-item</attribute>
+          <attribute name="label" translatable="yes">Reverse Order</attribute>
+          <attribute name="action">win.reversed-order</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="id">keep-aligned-item</attribute>
+          <attribute name="label" translatable="yes">Keep Aligned</attribute>
+          <attribute name="action">win.keep-aligned</attribute>
+        </item>
+      </section>
+  </menu>
+</interface>
diff --git a/src/nautilus-canvas-view.c b/src/nautilus-canvas-view.c
index c3dad37..e6aaf36 100644
--- a/src/nautilus-canvas-view.c
+++ b/src/nautilus-canvas-view.c
@@ -76,7 +76,7 @@ static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
 typedef struct {
        const NautilusFileSortType sort_type;
        const char *metadata_text;
-       const char *action;
+       const char *action_target_name;
 } SortCriterion;
 
 typedef enum {
@@ -106,48 +106,49 @@ struct NautilusCanvasViewDetails
        gboolean supports_manual_layout;
        gboolean supports_scaling;
        gboolean supports_keep_aligned;
-};
 
+       GMenu   *view_menu;
+};
 
 /* Note that the first item in this list is the default sort,
  * and that the items show up in the menu in the order they
  * appear in this list.
  */
-static const SortCriterion sort_criteria[] = {
+static const SortCriterion gsort_criteria[] = {
        {
                NAUTILUS_FILE_SORT_BY_DISPLAY_NAME,
                "name",
-               "Sort by Name"
+               "sort-by-name"
        },
        {
                NAUTILUS_FILE_SORT_BY_SIZE,
                "size",
-               "Sort by Size"
+               "sort-by-size"
        },
        {
                NAUTILUS_FILE_SORT_BY_TYPE,
                "type",
-               "Sort by Type"
+               "sort-by-type"
        },
        {
                NAUTILUS_FILE_SORT_BY_MTIME,
                "modification date",
-               "Sort by Modification Date"
+               "sort-by-modification-date"
        },
        {
                NAUTILUS_FILE_SORT_BY_ATIME,
                "access date",
-               "Sort by Access Date"
+               "sort-by-access-date"
        },
        {
                NAUTILUS_FILE_SORT_BY_TRASHED_TIME,
                "trashed",
-               NAUTILUS_ACTION_SORT_TRASH_TIME
+               "sort-by-trash-time"
        },
        {
                NAUTILUS_FILE_SORT_BY_SEARCH_RELEVANCE,
                NULL,
-               NAUTILUS_ACTION_SORT_SEARCH_RELEVANCE,
+               "sort-by-search-relevance",
        }
 };
 
@@ -331,7 +332,7 @@ nautilus_canvas_view_clean_up_by_name (NautilusCanvasView *canvas_view)
        saved_sort_reversed = canvas_view->details->sort_reversed;
        
        set_sort_reversed (canvas_view, FALSE, FALSE);
-       set_sort_criterion (canvas_view, &sort_criteria[0], FALSE);
+       set_sort_criterion (canvas_view, &gsort_criteria[0], FALSE);
 
        nautilus_canvas_container_sort (canvas_container);
        nautilus_canvas_container_freeze_icon_positions (canvas_container);
@@ -347,25 +348,6 @@ nautilus_canvas_view_using_auto_layout (NautilusCanvasView *canvas_view)
 }
 
 static void
-action_sort_radio_callback (GtkAction *action,
-                           GtkRadioAction *current,
-                           NautilusCanvasView *view)
-{
-       NautilusFileSortType sort_type;
-       
-       sort_type = gtk_radio_action_get_current_value (current);
-       
-       /* Note that id might be a toggle item.
-        * Ignore non-sort ids so that they don't cause sorting.
-        */
-       if (sort_type == NAUTILUS_FILE_SORT_NONE) {
-               switch_to_manual_layout (view);
-       } else {
-               set_sort_criterion_by_sort_type (view, sort_type);
-       }
-}
-
-static void
 list_covers (NautilusCanvasIconData *data, gpointer callback_data)
 {
        GSList **file_list;
@@ -503,26 +485,42 @@ update_layout_menus (NautilusCanvasView *view)
        GtkAction *action;
        const char *action_name;
        NautilusFile *file;
+       NautilusWindow *window;
 
-       if (view->details->canvas_action_group == NULL) {
-               return;
-       }
+       window = NAUTILUS_VIEW_CLASS (nautilus_canvas_view_parent_class)->get_window (NAUTILUS_VIEW (view));
+
+       g_assert (window != NULL);
+       
+       g_print ("update_layout_menus\n");
 
        is_auto_layout = nautilus_canvas_view_using_auto_layout (view);
        file = nautilus_view_get_directory_as_file (NAUTILUS_VIEW (view));
 
        if (nautilus_canvas_view_supports_auto_layout (view)) {
                /* Mark sort criterion. */
-               action_name = is_auto_layout ? view->details->sort->action : NAUTILUS_ACTION_MANUAL_LAYOUT;
-               action = gtk_action_group_get_action (view->details->canvas_action_group,
+               action_name = is_auto_layout ? view->details->sort->action_target_name : 
NAUTILUS_ACTION_MANUAL_LAYOUT;
+               g_print ("update_layout_menus %s\n", action_name);
+
+               GAction *action = g_action_map_lookup_action (G_ACTION_MAP (window), "reversed-order");
+               g_action_change_state (action,
+                                       g_variant_new_boolean (view->details->sort_reversed));
+
+               action = g_action_map_lookup_action (G_ACTION_MAP (window), "sort");
+               g_print ("update layout menus %s", view->details->sort->action_target_name);
+               g_action_change_state (action,
+                                       g_variant_new_string (view->details->sort->action_target_name));
+
+               /*action = gtk_action_group_get_action (view->details->canvas_action_group,
                                                      action_name);
                gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE);
 
                action = gtk_action_group_get_action (view->details->canvas_action_group,
                                                      NAUTILUS_ACTION_REVERSED_ORDER);
                gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
-                                             view->details->sort_reversed);
-               gtk_action_set_sensitive (action, is_auto_layout);
+                                             view->details->sort_reversed);*/
+
+
+               /*gtk_action_set_sensitive (action, is_auto_layout);
 
                action = gtk_action_group_get_action (view->details->canvas_action_group,
                                                      NAUTILUS_ACTION_SORT_TRASH_TIME);
@@ -540,7 +538,7 @@ update_layout_menus (NautilusCanvasView *view)
                        gtk_action_set_visible (action, TRUE);
                } else {
                        gtk_action_set_visible (action, FALSE);
-               }
+               }*/
        }
 
        action = gtk_action_group_get_action (view->details->canvas_action_group,
@@ -554,7 +552,14 @@ update_layout_menus (NautilusCanvasView *view)
                                nautilus_canvas_view_supports_keep_aligned (view));
        gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
                                      nautilus_canvas_container_is_keep_aligned (get_canvas_container 
(view)));
+
+       GAction *keep_aligned = g_action_map_lookup_action (G_ACTION_MAP (window), "keep-aligned");
+       g_action_change_state (keep_aligned,
+                              g_variant_new_boolean (nautilus_canvas_container_is_keep_aligned 
(get_canvas_container (view))));
+
        gtk_action_set_sensitive (action, !is_auto_layout);
+
+       g_print ("END update_layout_menus\n");
 }
 
 
@@ -616,6 +621,8 @@ nautilus_canvas_view_set_directory_sort_by (NautilusCanvasView *canvas_view,
        default_sort_criterion = get_sort_criterion_by_sort_type (get_default_sort_order (file, NULL));
        g_return_if_fail (default_sort_criterion != NULL);
 
+       g_print ("nautilus_canvas_view_set_directory_sort_by %s\n", sort_by);
+
        nautilus_file_set_metadata
                (file, NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_BY,
                 default_sort_criterion->metadata_text,
@@ -751,9 +758,24 @@ get_sort_criterion_by_metadata_text (const char *metadata_text)
        guint i;
 
        /* Figure out what the new sort setting should be. */
-       for (i = 0; i < G_N_ELEMENTS (sort_criteria); i++) {
-               if (g_strcmp0 (sort_criteria[i].metadata_text, metadata_text) == 0) {
-                       return &sort_criteria[i];
+       for (i = 0; i < G_N_ELEMENTS (gsort_criteria); i++) {
+               if (g_strcmp0 (gsort_criteria[i].metadata_text, metadata_text) == 0) {
+                       return &gsort_criteria[i];
+               }
+       }
+       return NULL;
+}
+
+static const SortCriterion *
+get_sort_criterion_by_action_target_name (const char *action_target_name)
+{
+       guint i;
+       g_print ("action name %s\n", action_target_name);
+       /* Figure out what the new sort setting should be. */
+       for (i = 0; i < G_N_ELEMENTS (gsort_criteria); i++) {
+               g_print ("gsor criteria %s\n", gsort_criteria[i].action_target_name);
+               if (g_strcmp0 (gsort_criteria[i].action_target_name, action_target_name) == 0) {
+                       return &gsort_criteria[i];
                }
        }
        return NULL;
@@ -765,13 +787,13 @@ get_sort_criterion_by_sort_type (NautilusFileSortType sort_type)
        guint i;
 
        /* Figure out what the new sort setting should be. */
-       for (i = 0; i < G_N_ELEMENTS (sort_criteria); i++) {
-               if (sort_type == sort_criteria[i].sort_type) {
-                       return &sort_criteria[i];
+       for (i = 0; i < G_N_ELEMENTS (gsort_criteria); i++) {
+               if (sort_type == gsort_criteria[i].sort_type) {
+                       return &gsort_criteria[i];
                }
        }
 
-       return &sort_criteria[0];
+       return &gsort_criteria[0];
 }
 
 #define DEFAULT_ZOOM_LEVEL(canvas_view) default_zoom_level
@@ -1046,6 +1068,72 @@ action_keep_aligned_callback (GtkAction *action,
                                                  keep_aligned);
 }
 
+void
+nautilus_canvas_view_action_reversed_order (NautilusCanvasView *canvas_view,
+                                       const gboolean reversed_order)
+{
+       if (set_sort_reversed (canvas_view, reversed_order, TRUE)) {
+               nautilus_canvas_container_sort (get_canvas_container (canvas_view));
+               nautilus_canvas_view_reveal_selection (NAUTILUS_VIEW (canvas_view));
+       }
+}
+
+void
+nautilus_canvas_view_action_keep_aligned (NautilusCanvasView *canvas_view,
+                                       const gboolean keep_aligned)
+{
+       NautilusFile *file;
+
+       file = nautilus_view_get_directory_as_file (NAUTILUS_VIEW (canvas_view));
+       nautilus_canvas_view_set_directory_keep_aligned (canvas_view,
+                                                file,
+                                                keep_aligned);
+                                                     
+       nautilus_canvas_container_set_keep_aligned (get_canvas_container (canvas_view),
+                                                 keep_aligned);
+}
+
+static void
+action_sort_radio_callback (GtkAction *action,
+                           GtkRadioAction *current,
+                           NautilusCanvasView *view)
+{
+       NautilusFileSortType sort_type;
+       
+       sort_type = gtk_radio_action_get_current_value (current);
+       
+       /* Note that id might be a toggle item.
+        * Ignore non-sort ids so that they don't cause sorting.
+        */
+       if (sort_type == NAUTILUS_FILE_SORT_NONE) {
+               switch_to_manual_layout (view);
+       } else {
+               set_sort_criterion_by_sort_type (view, sort_type);
+       }
+}
+
+void
+nautilus_canvas_view_action_sort (NautilusCanvasView *canvas_view,
+                               const gchar* action_name)
+{
+       SortCriterion *sort_criterion;
+       g_print ("nautilus_canvas_view_action_sort %s\n", action_name);
+       sort_criterion = get_sort_criterion_by_action_target_name (action_name);
+
+       g_assert (sort_criterion != NULL);
+       /* Note that id might be a toggle item.
+        * Ignore non-sort ids so that they don't cause sorting.
+        */
+       if (sort_criterion->sort_type == NAUTILUS_FILE_SORT_NONE) {
+               switch_to_manual_layout (canvas_view);
+       } else {
+               set_sort_criterion (canvas_view, sort_criterion, TRUE);
+
+               nautilus_canvas_container_sort (get_canvas_container (canvas_view));
+               nautilus_canvas_view_reveal_selection (NAUTILUS_VIEW (canvas_view));
+       }
+}
+
 static void
 switch_to_manual_layout (NautilusCanvasView *canvas_view)
 {
@@ -1053,7 +1141,7 @@ switch_to_manual_layout (NautilusCanvasView *canvas_view)
                return;
        }
 
-       canvas_view->details->sort = &sort_criteria[0];
+       canvas_view->details->sort = &gsort_criteria[0];
        
        nautilus_canvas_container_set_auto_layout
                (get_canvas_container (canvas_view), FALSE);
@@ -1157,6 +1245,9 @@ nautilus_canvas_view_merge_menus (NautilusView *view)
        NautilusCanvasView *canvas_view;
        GtkUIManager *ui_manager;
        GtkActionGroup *action_group;
+       GActionGroup *gaction_group;
+       GMenu *view_menu;
+       GMenu *sort_menu;
        
         g_assert (NAUTILUS_IS_CANVAS_VIEW (view));
 
@@ -1164,8 +1255,54 @@ nautilus_canvas_view_merge_menus (NautilusView *view)
 
        canvas_view = NAUTILUS_CANVAS_VIEW (view);
 
+       g_print ("nautilus_canvas_view_merge_menus\n");
+       
+       GtkBuilder *builder;
+       builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/nautilus-canvas-view-menu.xml");
+       sort_menu = g_object_ref (G_MENU (gtk_builder_get_object (builder, "sort-menu")));
+       g_assert (sort_menu != NULL);
+       g_object_unref (builder);
+
+       view_menu = nautilus_view_get_view_menu (view);
+       nautilus_gmenu_merge (view_menu, sort_menu, "sort-menu");
+
+       //g_menu_append (view_menu, "test", "test");
+
+       GFile *file = nautilus_view_get_directory_as_file (NAUTILUS_VIEW (view));
+
+       g_assert (file != NULL);
+
+       if (file == NULL || !nautilus_file_is_in_trash (file)) {
+               g_print ("removing by trash time\n");
+               nautilus_gmenu_remove_item_by_id (view_menu, "sort-by-trash-item");
+       }
+
+       if (file == NULL || !nautilus_file_is_in_search (file)) {
+               g_print ("removing by search relevace\n");
+               nautilus_gmenu_remove_item_by_id (view_menu, "sort-by-search-relevance");
+       }
+
+       if (nautilus_canvas_view_supports_manual_layout (view)) {
+               //g_menu_append (view_menu, "Manual Layout", "manual_layout");
+       }
+
+       /* if (nautilus_canvas_view_supports_keep_aligned(view)) {
+               g_menu_append (view_menu, "Keep Aligned", "keep_aligned");
+       } */
+
+
+
+
+
+
+
+
+
        ui_manager = nautilus_view_get_ui_manager (NAUTILUS_VIEW (canvas_view));
 
+
+       
+
        action_group = gtk_action_group_new ("CanvasViewActions");
        gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE);
        canvas_view->details->canvas_action_group = action_group;
@@ -1186,6 +1323,10 @@ nautilus_canvas_view_merge_menus (NautilusView *view)
                gtk_ui_manager_add_ui_from_resource (ui_manager, 
"/org/gnome/nautilus/nautilus-canvas-view-ui.xml", NULL);
 
        update_layout_menus (canvas_view);
+
+       NAUTILUS_VIEW_CLASS (nautilus_canvas_view_parent_class)->emit_updated_menus (view);
+
+       g_print ("END nautilus_canvas_view_merge_menus\n");
 }
 
 static void
@@ -1335,6 +1476,7 @@ canvas_container_activate_callback (NautilusCanvasContainer *container,
                                  GList *file_list,
                                  NautilusCanvasView *canvas_view)
 {
+       g_print ("canvas_container_activate_callback\n");
        g_assert (NAUTILUS_IS_CANVAS_VIEW (canvas_view));
        g_assert (container == get_canvas_container (canvas_view));
 
@@ -1502,6 +1644,7 @@ nautilus_canvas_view_react_to_canvas_change_idle_callback (gpointer data)
 {        
         NautilusCanvasView *canvas_view;
         
+        g_print ("nautilus_canvas_view_react_to_canvas_change_idle_callback\n");
         g_assert (NAUTILUS_IS_CANVAS_VIEW (data));
         
         canvas_view = NAUTILUS_CANVAS_VIEW (data);
@@ -2124,10 +2267,13 @@ nautilus_canvas_view_init (NautilusCanvasView *canvas_view)
 {
        NautilusCanvasContainer *canvas_container;
 
+       GtkBuilder *builder;
+       GMenuModel *menu;
+
         g_return_if_fail (gtk_bin_get_child (GTK_BIN (canvas_view)) == NULL);
 
        canvas_view->details = g_new0 (NautilusCanvasViewDetails, 1);
-       canvas_view->details->sort = &sort_criteria[0];
+       canvas_view->details->sort = &gsort_criteria[0];
 
        canvas_container = create_canvas_container (canvas_view);
 
diff --git a/src/nautilus-canvas-view.h b/src/nautilus-canvas-view.h
index e2b77ed..2467c2f 100644
--- a/src/nautilus-canvas-view.h
+++ b/src/nautilus-canvas-view.h
@@ -67,4 +67,13 @@ NautilusView * nautilus_canvas_view_new (NautilusWindowSlot *slot);
 
 NautilusCanvasContainer * nautilus_canvas_view_get_canvas_container (NautilusCanvasView *view);
 
+GMenu * nautilus_canvas_view_get_toolbar_menu (NautilusCanvasView *view);
+
+void nautilus_canvas_view_action_reversed_order (NautilusCanvasView *canvas_view,
+                                                const gboolean reversed_order);
+void nautilus_canvas_view_action_keep_aligned (NautilusCanvasView *canvas_view,
+                                               const gboolean  keep_aligned);
+void nautilus_canvas_view_action_sort (NautilusCanvasView *canvas_view,
+                                       const gchar* action_name);
+
 #endif /* NAUTILUS_CANVAS_VIEW_H */
diff --git a/src/nautilus-directory-view-menu.xml b/src/nautilus-directory-view-menu.xml
new file mode 100644
index 0000000..50c7a54
--- /dev/null
+++ b/src/nautilus-directory-view-menu.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<interface>
+  <!-- interface-requires gtk+ 3.0 -->
+  <menu id="layout-menu">
+    <section>
+      <attribute name="id">sort-menu</attribute>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Reset to Defaults</attribute>
+        <attribute name="action">win.reset-to-defaults</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Show Hidden Files</attribute>
+        <attribute name="action">win.show-hidden-files</attribute>
+      </item>
+    </section>
+  </menu>
+</interface>
\ No newline at end of file
diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c
index 8711af6..141d548 100644
--- a/src/nautilus-list-view.c
+++ b/src/nautilus-list-view.c
@@ -3046,6 +3046,8 @@ nautilus_list_view_merge_menus (NautilusView *view)
                gtk_ui_manager_add_ui_from_resource (ui_manager, 
"/org/gnome/nautilus/nautilus-list-view-ui.xml", NULL);
 
        list_view->details->menus_ready = TRUE;
+
+       NAUTILUS_VIEW_CLASS (nautilus_list_view_parent_class)->emit_updated_menus (view);
 }
 
 static void
diff --git a/src/nautilus-main-menus.xml b/src/nautilus-main-menus.xml
new file mode 100644
index 0000000..9e47dab
--- /dev/null
+++ b/src/nautilus-main-menus.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<interface>
+  <!-- interface-requires gtk+ 3.0 -->
+  <menu id="view-menu">
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Zoom</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Zoom In</attribute>
+        <attribute name="action">win.zoom-in</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Zoom Out</attribute>
+        <attribute name="action">win.zoom-out</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Zoom Normal</attribute>
+        <attribute name="action">win.zoom-normal</attribute>
+      </item>
+    </section>
+    <section>
+      <attribute name="id">layout-menu</attribute>
+    </section>
+  </menu>
+</interface>
\ No newline at end of file
diff --git a/src/nautilus-toolbar.c b/src/nautilus-toolbar.c
index 642f524..ef96eac 100644
--- a/src/nautilus-toolbar.c
+++ b/src/nautilus-toolbar.c
@@ -29,6 +29,7 @@
 #include "nautilus-location-entry.h"
 #include "nautilus-pathbar.h"
 #include "nautilus-actions.h"
+#include "nautilus-canvas-view.h"
 
 #include <libnautilus-private/nautilus-global-preferences.h>
 #include <libnautilus-private/nautilus-ui-utilities.h>
@@ -51,6 +52,10 @@ struct _NautilusToolbarPriv {
        gboolean show_location_entry;
 
        guint popup_timeout_id;
+
+       GtkWidget *view_button;
+    GtkWidget *view_menu_popover;
+    GtkWidget *view_menu;
 };
 
 enum {
@@ -378,6 +383,17 @@ gear_menu_key_press (GtkWidget *widget,
 }
 
 static void
+nautilus_toolbar_active_canvas_changed (NautilusToolbar *self,
+                                                                               NautilusCanvasView 
*canvas_view)
+{
+       g_print ("nautilus_toolbar_active_canvas_changed");
+       self->priv->view_menu = nautilus_canvas_view_get_toolbar_menu (canvas_view);
+       gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (self->priv->view_button),
+                                                       G_MENU_MODEL (self->priv->view_menu));                
  
+
+}
+
+static void
 nautilus_toolbar_constructed (GObject *obj)
 {
        NautilusToolbar *self = NAUTILUS_TOOLBAR (obj);
@@ -437,6 +453,10 @@ nautilus_toolbar_constructed (GObject *obj)
 
        gtk_header_bar_pack_end (GTK_HEADER_BAR (toolbar), button);
 
+       /* View button */
+       self->priv->view_button = gtk_menu_button_new ();
+       gtk_container_add (GTK_CONTAINER (box), self->priv->view_button);
+
        /* View buttons */
        box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 
@@ -560,6 +580,17 @@ nautilus_toolbar_class_init (NautilusToolbarClass *klass)
        g_object_class_install_properties (oclass, NUM_PROPERTIES, properties);
 }
 
+void
+nautilus_toolbar_update_menus (NautilusToolbar *self,
+                               GMenu *view_menu)
+{
+       g_print("view menu in toolbar\n");
+       g_return_if_fail (view_menu != NULL);
+       g_return_if_fail (G_IS_OBJECT (view_menu));
+       gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (self->priv->view_button),
+                                       G_MENU_MODEL (view_menu));
+}
+
 GtkWidget *
 nautilus_toolbar_new (NautilusWindow *window)
 {
diff --git a/src/nautilus-view-menu.xml b/src/nautilus-view-menu.xml
new file mode 100644
index 0000000..9c0b1a0
--- /dev/null
+++ b/src/nautilus-view-menu.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<interface>
+  <!-- interface-requires gtk+ 3.0 -->
+  <menu id="ViewMenu">
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Sort</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">name</attribute>
+        <attribute name="action">canvas.sort</attribute>
+        <attribute name="target">sort_by_name</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">date</attribute>
+        <attribute name="action">canvas.sort</attribute>
+        <attribute name="target">sort_by_date</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">modify</attribute>
+        <attribute name="action">canvas.sort</attribute>
+        <attribute name="target">sort_by_modify</attribute>
+      </item>
+    </section>
+    <section>
+    </section>
+  </menu>
+</interface>
diff --git a/src/nautilus-view.c b/src/nautilus-view.c
index 20590c4..b98c8d9 100644
--- a/src/nautilus-view.c
+++ b/src/nautilus-view.c
@@ -147,6 +147,7 @@ enum {
        SELECTION_CHANGED,
        TRASH,
        DELETE,
+       MENUS_UPDATED,
        LAST_SIGNAL
 };
 
@@ -260,6 +261,12 @@ struct NautilusViewDetails
        GList *subdirectory_list;
 
        GdkPoint context_menu_position;
+
+       GMenu *view_menu;
+
+       gint *counter;
+
+       GSimpleActionGroup *view_action_group;
 };
 
 typedef struct {
@@ -905,7 +912,7 @@ create_templates_parameters_free (CreateTemplateParameters *parameters)
        g_free (parameters);
 }                            
 
-static NautilusWindow *
+NautilusWindow *
 nautilus_view_get_window (NautilusView  *view)
 {
        return nautilus_window_slot_get_window (view->details->slot);
@@ -2442,6 +2449,8 @@ slot_active (NautilusWindowSlot *slot,
 
        view->details->active = TRUE;
 
+       g_print ("slot active\n");
+
        nautilus_view_merge_menus (view);
        schedule_update_menus (view);
 }
@@ -2454,6 +2463,7 @@ slot_inactive (NautilusWindowSlot *slot,
                return;
        }
 
+       g_print ("slot inactive\n");
        view->details->active = FALSE;
 
        nautilus_view_unmerge_menus (view);
@@ -2709,6 +2719,8 @@ nautilus_view_init (NautilusView *view)
        atk_object_set_name (atk_object, _("Content View"));
        atk_object_set_description (atk_object, _("View of the current folder"));
 
+       view->details->view_action_group = g_simple_action_group_new ();
+
        nautilus_profile_end (NULL);
 }
 
@@ -2716,7 +2728,7 @@ static void
 real_unmerge_menus (NautilusView *view)
 {
        GtkUIManager *ui_manager;
-
+       g_print(" real unmerge menus\n");
        ui_manager = nautilus_view_get_ui_manager (view);
        if (ui_manager == NULL) {
                return;
@@ -7408,6 +7420,26 @@ pre_activate (NautilusView *view,
        }
 }
 
+GMenu*
+nautilus_view_get_view_menu (NautilusView *view)
+{
+       return view->details->view_menu;
+}
+
+GSimpleActionGroup*
+nautilus_view_get_view_action_group (NautilusView *view)
+{
+       return view->details->view_action_group;
+}
+
+static void
+real_emit_updated_menus (NautilusView *view)
+{
+       g_print("real emit updated menus %s\n", G_OBJECT_TYPE_NAME (view));
+       g_signal_emit_by_name (view, "menus-updated", view);
+       g_print("after emitgin\n");
+}
+
 static void
 real_merge_menus (NautilusView *view)
 {
@@ -7416,6 +7448,13 @@ real_merge_menus (NautilusView *view)
        GtkAction *action;
        char *tooltip;
 
+       g_print("real merge menus\n");
+
+       GtkBuilder *builder;
+       builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/nautilus-directory-view-menu.xml");
+       view->details->view_menu = g_object_ref (G_MENU (gtk_builder_get_object (builder, "layout-menu")));
+       g_object_unref (builder);
+
        ui_manager = nautilus_view_get_ui_manager (view);
 
        action_group = gtk_action_group_new ("DirViewActions");
@@ -9671,7 +9710,7 @@ nautilus_view_parent_set (GtkWidget *widget,
 {
        NautilusView *view;
        GtkWidget *parent;
-
+       g_print ("parent set\n");
        view = NAUTILUS_VIEW (widget);
 
        parent = gtk_widget_get_parent (widget);
@@ -9818,6 +9857,15 @@ nautilus_view_class_init (NautilusViewClass *klass)
                              g_signal_accumulator_true_handled, NULL,
                              g_cclosure_marshal_generic,
                              G_TYPE_BOOLEAN, 0);
+       signals[MENUS_UPDATED] =
+               g_signal_new ("menus-updated",
+                               G_TYPE_FROM_CLASS (klass),
+                               G_SIGNAL_RUN_LAST,
+                               0,
+                               NULL, NULL,
+                               g_cclosure_marshal_generic,
+                               G_TYPE_NONE, 0);
+
 
        klass->get_selected_icon_locations = real_get_selected_icon_locations;
        klass->is_read_only = real_is_read_only;
@@ -9830,6 +9878,8 @@ nautilus_view_class_init (NautilusViewClass *klass)
         klass->update_menus = real_update_menus;
        klass->trash = real_trash;
        klass->delete = real_delete;
+       klass->emit_updated_menus = real_emit_updated_menus;
+       klass->get_window = nautilus_view_get_window;
 
        copied_files_atom = gdk_atom_intern ("x-special/gnome-copied-files", FALSE);
 
diff --git a/src/nautilus-view.h b/src/nautilus-view.h
index 98f3d57..aae8aad 100644
--- a/src/nautilus-view.h
+++ b/src/nautilus-view.h
@@ -295,6 +295,10 @@ struct NautilusViewClass {
         /* Signals used only for keybindings */
         gboolean (* trash)                         (NautilusView *view);
         gboolean (* delete)                        (NautilusView *view);
+
+        void   (*emit_updated_menus)            (NautilusView *view);
+
+        NautilusWindow * (*get_window) (NautilusView *view);
 };
 
 /* GObject support */
@@ -411,4 +415,8 @@ void              nautilus_view_update_menus               (NautilusView      *v
 
 gboolean          nautilus_view_get_show_hidden_files      (NautilusView      *view);
 
+GMenu*           nautilus_view_get_view_menu              (NautilusView      *view);
+
+GSimpleActionGroup* nautilus_view_get_view_action_group    (NautilusView *view);
+
 #endif /* NAUTILUS_VIEW_H */
diff --git a/src/nautilus-window-menus.c b/src/nautilus-window-menus.c
index 999d163..82466ed 100644
--- a/src/nautilus-window-menus.c
+++ b/src/nautilus-window-menus.c
@@ -505,9 +505,73 @@ action_toggle_state (GSimpleAction *action,
                               g_variant_new_boolean (!g_variant_get_boolean (state)));
        g_variant_unref (state);
 }
+static void
+action_zoom_in_cb (GSimpleAction *action,
+               GVariant      *parameter,
+               gpointer       user_data) 
+{
+
+       nautilus_view_bump_zoom_level (get_current_view (user_data), 1);
+}
+
+static void
+action_zoom_out_cb (GSimpleAction *action,
+               GVariant      *parameter,
+               gpointer       user_data) 
+{
+       nautilus_view_bump_zoom_level (get_current_view (user_data), -1);
+}
+
+static void
+action_zoom_normal_cb (GSimpleAction *action,
+               GVariant      *parameter,
+               gpointer       user_data) 
+{
+       nautilus_view_restore_default_zoom_level (get_current_view (user_data));
+}
+
+static void
+action_reversed_order_cb (GSimpleAction *action,
+                       GVariant      *state,
+                       gpointer       user_data)
+{
+       g_print("reverse_order\n");
+       nautilus_canvas_view_action_reversed_order (get_current_view (user_data),
+                                                   g_variant_get_boolean (state));
+       g_simple_action_set_state (action, state);
+}
+
+static void
+action_keep_aligned_cb (GSimpleAction *action,
+                       GVariant      *state,
+                       gpointer       user_data)
+{
+       nautilus_canvas_view_action_keep_aligned (get_current_view (user_data),
+                                                 g_variant_get_boolean (state));
+       g_simple_action_set_state (action, state);
+
+       g_print("keep aligned\n");
+}
+
+static void
+action_sort_order_changed_cb (GSimpleAction *action,
+                       GVariant      *value,
+                       gpointer       user_data)
+{
+       gsize *length;
+       nautilus_canvas_view_action_sort (get_current_view (user_data),
+                                        g_variant_get_string (value, NULL));
+       g_simple_action_set_state (action, value);
+}
 
 const GActionEntry win_entries[] = {
        { "gear-menu", action_toggle_state, NULL, "false", NULL },
+       { "zoom-in",  G_CALLBACK (action_zoom_in_cb) },
+       { "zoom-out", G_CALLBACK (action_zoom_out_cb) },
+       { "zoom-normal", G_CALLBACK (action_zoom_normal_cb) },
+       { "reversed-order", NULL, NULL, "false", action_reversed_order_cb },
+       { "keep-aligned", NULL, NULL, "true", action_keep_aligned_cb },
+       { "sort", NULL, "s", "'sort-by-name'", action_sort_order_changed_cb }
 };
 
 void 
@@ -518,6 +582,33 @@ nautilus_window_initialize_actions (NautilusWindow *window)
                                         window);
 }
 
+void
+nautilus_window_reset_menus (NautilusWindow *window)
+{
+       NautilusView *active_view;
+       NautilusWindowSlot *active_slot;
+       NautilusView *view;
+       GMenu *view_view_menu;
+       GMenu *view_menu;
+
+       if (window->details->view_menu != NULL)
+               g_object_unref (window->details->view_menu);
+
+       active_slot = nautilus_window_get_active_slot (window);
+       view =  nautilus_window_slot_get_view (active_slot);
+       view_view_menu = nautilus_view_get_view_menu (view);
+       
+       GtkBuilder *builder;
+       builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/nautilus-main-menus.xml");
+
+       view_menu = g_object_ref (G_MENU (gtk_builder_get_object (builder, "view-menu")));
+
+       g_object_unref (builder);
+       nautilus_gmenu_merge (view_menu, view_view_menu, "layout-menu");
+
+       window->details->view_menu = view_menu; 
+}
+
 /**
  * nautilus_window_initialize_menus
  * 
diff --git a/src/nautilus-window-private.h b/src/nautilus-window-private.h
index 5531d8e..5599b0b 100644
--- a/src/nautilus-window-private.h
+++ b/src/nautilus-window-private.h
@@ -72,6 +72,8 @@ struct NautilusWindowDetails
 
         guint sidebar_width_handler_id;
         guint bookmarks_id;
+
+        GMenu *view_menu;
 };
 
 /* window geometry */
diff --git a/src/nautilus-window-slot.c b/src/nautilus-window-slot.c
index ea2ff71..5619e2d 100644
--- a/src/nautilus-window-slot.c
+++ b/src/nautilus-window-slot.c
@@ -1357,6 +1357,21 @@ got_file_info_for_view_selection_callback (NautilusFile *file,
        nautilus_profile_end (NULL);
 }
 
+static void
+menus_updated_cb (NautilusView *view,
+                 NautilusWindowSlot *slot)
+{
+       NautilusWindow *window;
+       
+       window = nautilus_window_slot_get_window (slot);
+
+       if (NAUTILUS_IS_DESKTOP_WINDOW (window)) {
+               return;
+       }
+
+       nautilus_window_update_menus (window, view);
+}
+
 /* Load a view into the window, either reusing the old one or creating
  * a new one. This happens when you want to load a new location, or just
  * switch to a different view.
@@ -1401,6 +1416,7 @@ create_content_view (NautilusWindowSlot *slot,
         } else {
                 /* create a new content view */
                view = nautilus_view_new (view_id, slot);
+               g_signal_connect (view, "menus-updated", G_CALLBACK (menus_updated_cb), slot);
 
                 slot->details->new_content_view = view;
                nautilus_window_slot_connect_new_content_view (slot);
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index 124fc57..f5f480f 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -42,7 +42,7 @@
 #include "nautilus-toolbar.h"
 #include "nautilus-window-slot.h"
 #include "nautilus-list-view.h"
-#include "nautilus-canvas-view.h"
+#include "nautilus-view.h"
 
 #include <eel/eel-debug.h>
 #include <eel/eel-gtk-extensions.h>
@@ -1271,6 +1271,16 @@ notebook_popup_menu_cb (GtkWidget *widget,
        return TRUE;
 }
 
+void
+nautilus_window_update_menus (NautilusWindow *window,
+                               NautilusView *view)
+{
+       nautilus_window_reset_menus (window);
+
+       nautilus_toolbar_update_menus (window->details->toolbar,
+                                       window->details->view_menu);
+}
+
 static GtkWidget *
 create_toolbar (NautilusWindow *window)
 {
@@ -1305,6 +1315,8 @@ create_toolbar (NautilusWindow *window)
        g_signal_connect_object (location_entry, "cancel",
                                 G_CALLBACK (location_entry_cancel_callback), window, 0);
 
+       g_print ("menu type TOOLBAR %s\n", G_OBJECT_TYPE_NAME (window->details));
+
        return toolbar;
 }
 
@@ -1492,6 +1504,8 @@ nautilus_window_constructed (GObject *self)
                                          G_CALLBACK (nautilus_window_sync_bookmarks), window);
 
        nautilus_profile_end (NULL);
+
+       g_print("construction ended\n");
 }
 
 static void
@@ -2108,6 +2122,8 @@ nautilus_window_init (NautilusWindow *window)
 
        window->details = G_TYPE_INSTANCE_GET_PRIVATE (window, NAUTILUS_TYPE_WINDOW, NautilusWindowDetails);
 
+       g_print("priv set\n");
+
        window->details->slots = NULL;
        window->details->active_slot = NULL;
 
diff --git a/src/nautilus-window.h b/src/nautilus-window.h
index f95eede..263c137 100644
--- a/src/nautilus-window.h
+++ b/src/nautilus-window.h
@@ -122,6 +122,8 @@ void                 nautilus_window_grab_focus            (NautilusWindow *wind
 
 void     nautilus_window_hide_sidebar         (NautilusWindow *window);
 void     nautilus_window_show_sidebar         (NautilusWindow *window);
+void     nautilus_window_update_menus         (NautilusWindow *window,
+                                               NautilusView *view);
 void     nautilus_window_back_or_forward      (NautilusWindow *window,
                                                gboolean        back,
                                                guint           distance,
diff --git a/src/nautilus.gresource.xml b/src/nautilus.gresource.xml
index 37a5bbf..b139ebb 100644
--- a/src/nautilus.gresource.xml
+++ b/src/nautilus.gresource.xml
@@ -6,9 +6,12 @@
     <file>nautilus-canvas-view-ui.xml</file>
     <file>nautilus-desktop-canvas-view-ui.xml</file>
     <file>nautilus-directory-view-ui.xml</file>
+    <file>nautilus-directory-view-menu.xml</file>
     <file>nautilus-list-view-ui.xml</file>
     <file>nautilus-shell-ui.xml</file>
     <file>nautilus-app-menu.ui</file>
+    <file>nautilus-canvas-view-menu.xml</file>
+    <file>nautilus-main-menus.xml</file>
     <file alias="icons/thumbnail_frame.png">../icons/thumbnail_frame.png</file>
     <file alias="icons/filmholes.png">../icons/filmholes.png</file>
     <file alias="icons/knob.png">../icons/knob.png</file>



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]