[gedit/wip/appmenu] Add app menu



commit 877e50cefc5e200d6570a530d3d2e4fc326272a4
Author: Ignacio Casal Quinteiro <icq gnome org>
Date:   Sun Dec 30 22:10:28 2012 +0100

    Add app menu

 gedit/gedit-app.c           |  107 ++++++++++++++++++++++++
 gedit/gedit-menu.ui         |   36 ++++++++
 gedit/gedit-ui-fallback.xml |  194 +++++++++++++++++++++++++++++++++++++++++++
 gedit/gedit-ui.xml          |    7 --
 gedit/gedit-window.c        |   24 +++++-
 gedit/gedit.gresource.xml   |    2 +
 6 files changed, 360 insertions(+), 10 deletions(-)
---
diff --git a/gedit/gedit-app.c b/gedit/gedit-app.c
index 2159862..edb411a 100644
--- a/gedit/gedit-app.c
+++ b/gedit/gedit-app.c
@@ -55,6 +55,8 @@
 #include "gedit-settings.h"
 #include "gedit-app-activatable.h"
 #include "gedit-plugins-engine.h"
+#include "gedit-commands.h"
+#include "gedit-preferences-dialog.h"
 
 #ifndef ENABLE_GVFS_METADATA
 #include "gedit-metadata-manager.h"
@@ -307,6 +309,72 @@ gedit_app_set_window_title_impl (GeditApp    *app,
 }
 
 static void
+new_window_activated (GSimpleAction *action,
+                      GVariant      *parameter,
+                      gpointer       user_data)
+{
+	GeditWindow *window;
+
+	window = gedit_app_create_window (GEDIT_APP (user_data), NULL);
+
+	gedit_debug_message (DEBUG_APP, "Show window");
+	gtk_widget_show (GTK_WIDGET (window));
+
+	gedit_debug_message (DEBUG_APP, "Create tab");
+	gedit_window_create_tab (window, TRUE);
+
+	gtk_window_present (GTK_WINDOW (window));
+}
+
+static void
+preferences_activated (GSimpleAction *action,
+                       GVariant      *parameter,
+                       gpointer       user_data)
+{
+	GtkApplication *app = GTK_APPLICATION (user_data);
+	GeditWindow *window = GEDIT_WINDOW (gtk_application_get_active_window (app));
+	gedit_show_preferences_dialog (window);
+}
+
+static void
+help_activated (GSimpleAction *action,
+                GVariant      *parameter,
+                gpointer       user_data)
+{
+	GtkApplication *app = GTK_APPLICATION (user_data);
+	GeditWindow *window = GEDIT_WINDOW (gtk_application_get_active_window (app));
+	_gedit_cmd_help_contents (NULL, window);
+}
+
+static void
+about_activated (GSimpleAction *action,
+                 GVariant      *parameter,
+                 gpointer       user_data)
+{
+	GtkApplication *app = GTK_APPLICATION (user_data);
+	GeditWindow *window = GEDIT_WINDOW (gtk_application_get_active_window (app));
+	_gedit_cmd_help_about (NULL, window);
+}
+
+static void
+quit_activated (GSimpleAction *action,
+                GVariant      *parameter,
+                gpointer       user_data)
+{
+	GeditApp *app = GEDIT_APP (user_data);
+
+	g_application_quit (G_APPLICATION (app));
+}
+
+static GActionEntry app_entries[] = {
+	{ "new_window", new_window_activated, NULL, NULL, NULL },
+	{ "preferences", preferences_activated, NULL, NULL, NULL },
+	{ "help", help_activated, NULL, NULL, NULL },
+	{ "about", about_activated, NULL, NULL, NULL },
+	{ "quit", quit_activated, NULL, NULL, NULL }
+};
+
+static void
 extension_added (PeasExtensionSet *extensions,
 		 PeasPluginInfo   *info,
 		 PeasExtension    *exten,
@@ -329,6 +397,8 @@ gedit_app_startup (GApplication *application)
 {
 	GeditApp *app = GEDIT_APP (application);
 	GtkSourceStyleSchemeManager *manager;
+	GtkSettings *gtk_settings;
+	gboolean show_app_menu;
 	const gchar *dir;
 	gchar *icon_dir;
 #ifndef ENABLE_GVFS_METADATA
@@ -379,6 +449,43 @@ gedit_app_startup (GApplication *application)
 	/* initial lockdown state */
 	app->priv->lockdown = gedit_settings_get_lockdown (GEDIT_SETTINGS (app->priv->settings));
 
+	/* app menu */
+	gtk_settings = gtk_settings_get_default ();
+	g_object_get (G_OBJECT (gtk_settings),
+	              "gtk-shell-shows-app-menu",
+	              &show_app_menu,
+	              NULL);
+
+	if (show_app_menu)
+	{
+		GtkBuilder *builder;
+		GError *error = NULL;
+
+		builder = gtk_builder_new ();
+		gtk_builder_add_from_resource (builder, "/org/gnome/gedit/ui/gedit-menu.ui", &error);
+
+		if (error != NULL)
+		{
+			g_warning ("loading menu builder file: %s", error->message);
+			g_error_free (error);
+		}
+		else
+		{
+			GMenuModel *app_menu;
+
+			g_action_map_add_action_entries (G_ACTION_MAP (application),
+			                                 app_entries,
+			                                 G_N_ELEMENTS (app_entries),
+			                                 application);
+
+			app_menu = G_MENU_MODEL (gtk_builder_get_object (builder, "appmenu"));
+			gtk_application_set_app_menu (GTK_APPLICATION (application),
+			                              app_menu);
+		}
+
+		g_object_unref (builder);
+	}
+
 	/*
 	 * We use the default gtksourceview style scheme manager so that plugins
 	 * can obtain it easily without a gedit specific api, but we need to
diff --git a/gedit/gedit-menu.ui b/gedit/gedit-menu.ui
new file mode 100644
index 0000000..11da064
--- /dev/null
+++ b/gedit/gedit-menu.ui
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<interface>
+  <!-- interface-requires gtk+ 3.0 -->
+  <menu id="appmenu">
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_New Window</attribute>
+        <attribute name="action">app.new_window</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Preferences</attribute>
+        <attribute name="action">app.preferences</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Help</attribute>
+        <attribute name="action">app.help</attribute>
+        <attribute name="accel">F1</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">_About</attribute>
+        <attribute name="action">app.about</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Quit</attribute>
+        <attribute name="action">app.quit</attribute>
+        <attribute name="accel">&lt;Primary&gt;q</attribute>
+      </item>
+    </section>
+  </menu>
+</interface>
diff --git a/gedit/gedit-ui-fallback.xml b/gedit/gedit-ui-fallback.xml
new file mode 100644
index 0000000..2569172
--- /dev/null
+++ b/gedit/gedit-ui-fallback.xml
@@ -0,0 +1,194 @@
+<!--
+ * gedit-ui.xml
+ * This file is part of gedit
+ *
+ * Copyright (C) 2005 - Paolo Maggi 
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, 
+ * Boston, MA 02111-1307, USA.
+ *
+ * Modified by the gedit Team, 2005. See the AUTHORS file for a 
+ * list of people on the gedit Team.  
+ * See the ChangeLog files for a list of changes. 
+ *
+ * $Id$
+-->
+
+<ui>
+
+  <menubar name="MenuBar">
+    <menu name="FileMenu" action="File">
+      <menuitem name="FileNewMenu" action="FileNew"/>
+      <placeholder name="FileOps_1"/>
+      <menuitem name="FileOpenMenu" action="FileOpen"/>
+      <placeholder name="FileOps_2"/>
+      <separator/>
+      <menuitem name="FileSaveMenu" action="FileSave"/>
+      <menuitem name="FileSaveAsMenu" action="FileSaveAs"/>
+      <placeholder name="FileOps_3"/>
+      <menuitem name="FileRevertMenu" action="FileRevert"/>
+      <placeholder name="FileOps_4"/>
+      <separator/>
+      <placeholder name="FileOps_5"/>
+      <menuitem name="FilePrintPreviewMenu" action="FilePrintPreview"/>
+      <menuitem name="FilePrintMenu" action="FilePrint"/>
+      <placeholder name="FileRecentsPlaceholder">
+        <separator/>
+      </placeholder>
+      <separator/>
+      <menuitem name="FileCloseMenu" action="FileClose"/>
+      <menuitem name="FileQuitMenu" action="FileQuit"/>
+    </menu>
+
+    <menu name="EditMenu" action="Edit">
+      <menuitem name="EditUndoMenu" action="EditUndo"/>
+      <menuitem name="EditRedoMenu" action="EditRedo"/>
+      <separator/>
+      <menuitem name="EditCutMenu" action="EditCut"/>
+      <menuitem name="EditCopyMenu" action="EditCopy"/>
+      <menuitem name="EditPasteMenu" action="EditPaste"/>
+      <menuitem name="EditDeleteMenu" action="EditDelete"/>
+      <placeholder name="EditOps_1" /> 
+      <separator/>
+      <placeholder name="EditOps_2" /> 
+      <menuitem name="EditSelectAllMenu" action="EditSelectAll"/>
+      <placeholder name="EditOps_3" />
+      <separator/>
+      <placeholder name="EditOps_4" />
+      <separator/>
+      <placeholder name="EditOps_5" />
+      <separator/>
+      <placeholder name="EditOps_6" />
+      <separator/>
+      <menuitem name="EditPreferencesMenu" action="EditPreferences"/>
+    </menu>
+
+    <menu name="ViewMenu" action="View">
+      <menuitem name="ViewToolbarMenu" action="ViewToolbar"/>
+      <menuitem name="ViewStatusbarMenu" action="ViewStatusbar"/>
+      <menuitem name="ViewSidePaneMenu" action="ViewSidePanel"/>
+      <menuitem name="ViewBottomPaneMenu" action="ViewBottomPanel"/>
+      <separator/>
+      <menuitem name="ViewFullscreenMenu" action="ViewFullscreen"/>
+      <separator/>
+      <menu name="ViewHighlightModeMenu" action="ViewHighlightMode">
+        <placeholder name="LanguagesMenuPlaceholder">
+        </placeholder>
+      </menu>
+    </menu>
+
+    <menu name="SearchMenu" action="Search">
+      <menuitem name="SearchFindMenu" action="SearchFind"/>
+      <menuitem name="SearchFindNextMenu" action="SearchFindNext"/>
+      <menuitem name="SearchFindPreviousMenu" action="SearchFindPrevious"/>
+      <placeholder name="SearchOps_1" />
+      <separator/>
+      <placeholder name="SearchOps_2" />
+      <separator/>
+      <menuitem name="SearchReplaceMenu" action="SearchReplace"/>
+      <placeholder name="SearchOps_3" />
+      <separator/>
+      <placeholder name="SearchOps_4" />
+      <separator/>
+      <menuitem name="SearchClearHighlight" action="SearchClearHighlight"/>      
+      <placeholder name="SearchOps_5" />
+      <separator/>
+      <placeholder name="SearchOps_6" />
+      <separator/>
+      <menuitem name="SearchGoToLineMenu" action="SearchGoToLine"/>      
+      <placeholder name="SearchOps_7" />
+      <separator/>
+      <placeholder name="SearchOps_8" />
+    </menu>
+
+    <menu name="ToolsMenu" action="Tools">
+      <placeholder name="ToolsOps_1" />
+      <separator/>
+      <placeholder name="ToolsOps_2" />
+      <separator/>
+      <placeholder name="ToolsOps_3" />
+      <separator/>
+      <placeholder name="ToolsOps_4" />
+      <separator/>
+      <placeholder name="ToolsOps_5" />
+    </menu>
+
+    <placeholder name="ExtraMenu_1" />
+
+    <menu name="DocumentsMenu" action="Documents">
+      <menuitem action="FileSaveAll" />
+      <menuitem action="FileCloseAll" />
+      <separator />
+      <menuitem action="DocumentsNewTabGroup"/>
+      <menuitem action="DocumentsPreviousTabGroup"/>
+      <menuitem action="DocumentsNextTabGroup"/>
+      <separator />
+      <placeholder name="DocumentsOps_1" />
+      <separator/>
+      <placeholder name="DocumentsOps_2" />
+      <separator/>
+      <placeholder name="DocumentsOps_3" />
+      <menuitem action="DocumentsPreviousDocument" />      
+      <menuitem action="DocumentsNextDocument" />
+      <separator/>
+      <menuitem action="DocumentsMoveToNewWindow"/>
+      <placeholder name="DocumentsListPlaceholder">
+      <separator/>
+      </placeholder>
+    </menu>
+
+    <menu name="HelpMenu" action="Help">
+      <menuitem name="HelpContentsMenu" action="HelpContents"/>
+      <menuitem name="HelpAboutMenu" action="HelpAbout"/>
+    </menu>
+  </menubar>
+
+  <toolbar name="ToolBar">
+    <toolitem action="FileNew"/>
+    <toolitem action="FileSave"/>
+    <separator/>
+    <toolitem action="FilePrint"/>
+    <separator/>
+    <toolitem action="EditUndo"/>
+    <toolitem action="EditRedo"/>
+    <separator/>
+    <toolitem action="EditCut"/>
+    <toolitem action="EditCopy"/>
+    <toolitem action="EditPaste"/>
+    <separator/>
+    <toolitem action="SearchFind"/>
+    <toolitem action="SearchReplace"/>
+  </toolbar>
+
+  <toolbar name="FullscreenToolBar">
+    <toolitem action="FileNew"/>
+    <toolitem action="FileSave"/>
+    <separator/>
+    <toolitem action="FilePrint"/>
+    <separator/>
+    <toolitem action="EditUndo"/>
+    <toolitem action="EditRedo"/>
+    <separator/>
+    <toolitem action="EditCut"/>
+    <toolitem action="EditCopy"/>
+    <toolitem action="EditPaste"/>
+    <separator/>
+    <toolitem action="SearchFind"/>
+    <toolitem action="SearchReplace"/>
+    <separator expand="true"/>
+    <toolitem action="LeaveFullscreen"/>
+  </toolbar>
+
+</ui>
diff --git a/gedit/gedit-ui.xml b/gedit/gedit-ui.xml
index 2569172..8676d1c 100644
--- a/gedit/gedit-ui.xml
+++ b/gedit/gedit-ui.xml
@@ -49,7 +49,6 @@
       </placeholder>
       <separator/>
       <menuitem name="FileCloseMenu" action="FileClose"/>
-      <menuitem name="FileQuitMenu" action="FileQuit"/>
     </menu>
 
     <menu name="EditMenu" action="Edit">
@@ -71,8 +70,6 @@
       <placeholder name="EditOps_5" />
       <separator/>
       <placeholder name="EditOps_6" />
-      <separator/>
-      <menuitem name="EditPreferencesMenu" action="EditPreferences"/>
     </menu>
 
     <menu name="ViewMenu" action="View">
@@ -149,10 +146,6 @@
       </placeholder>
     </menu>
 
-    <menu name="HelpMenu" action="Help">
-      <menuitem name="HelpContentsMenu" action="HelpContents"/>
-      <menuitem name="HelpAboutMenu" action="HelpAbout"/>
-    </menu>
   </menubar>
 
   <toolbar name="ToolBar">
diff --git a/gedit/gedit-window.c b/gedit/gedit-window.c
index 852986e..e5a6832 100644
--- a/gedit/gedit-window.c
+++ b/gedit/gedit-window.c
@@ -1482,6 +1482,8 @@ create_menu_bar_and_toolbar (GeditWindow *window,
 	GtkAction *action;
 	GtkUIManager *manager;
 	GtkRecentManager *recent_manager;
+	GtkSettings *gtk_settings;
+	gboolean show_app_menu;
 	GError *error = NULL;
 
 	gedit_debug (DEBUG_WINDOW);
@@ -1566,9 +1568,25 @@ create_menu_bar_and_toolbar (GeditWindow *window,
 	g_object_unref (action_group);
 	window->priv->panels_action_group = action_group;
 
-	gtk_ui_manager_add_ui_from_resource (manager,
-					     "/org/gnome/gedit/ui/gedit-ui.xml",
-					     &error);
+	gtk_settings = gtk_settings_get_default ();
+	g_object_get (G_OBJECT (gtk_settings),
+	              "gtk-shell-shows-app-menu",
+	              &show_app_menu,
+	              NULL);
+
+	if (show_app_menu)
+	{
+		gtk_ui_manager_add_ui_from_resource (manager,
+						     "/org/gnome/gedit/ui/gedit-ui.xml",
+						     &error);
+	}
+	else
+	{
+		gtk_ui_manager_add_ui_from_resource (manager,
+						     "/org/gnome/gedit/ui/gedit-ui-fallback.xml",
+						     &error);
+	}
+
 	if (error != NULL)
 	{
 		g_warning ("Could not add ui definition: %s", error->message);
diff --git a/gedit/gedit.gresource.xml b/gedit/gedit.gresource.xml
index 11db256..d391d3a 100644
--- a/gedit/gedit.gresource.xml
+++ b/gedit/gedit.gresource.xml
@@ -2,6 +2,8 @@
 <gresources>
   <gresource prefix="/org/gnome/gedit/ui">
     <file preprocess="xml-stripblanks">gedit-ui.xml</file>
+    <file preprocess="xml-stripblanks">gedit-ui-fallback.xml</file>
+    <file preprocess="xml-stripblanks">gedit-menu.ui</file>
     <file preprocess="xml-stripblanks">gedit-encodings-dialog.ui</file>
     <file preprocess="xml-stripblanks">gedit-preferences-dialog.ui</file>
     <file preprocess="xml-stripblanks">gedit-replace-dialog.ui</file>



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