From 8811ba2ec033fb52547fbcd14eb3fefc153c90fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Sat, 24 May 2014 03:32:44 +0200 Subject: [PATCH] Support (fallback) app menu in SSD We now allow "appmenu" in the button layout to make synchronizing it with GTK+'s client-side decorations easier, but as some people tweak their settings to get in-window app menus even when using the shell, actually pop up the app menu when the button is activated. https://bugzilla.gnome.org/show_bug.cgi?id=730752 --- js/ui/windowManager.js | 4 ++-- js/ui/windowMenu.js | 25 ++++++++++++++++++++++--- src/gnome-shell-plugin.c | 20 +++++++++++--------- src/shell-wm-private.h | 1 + src/shell-wm.c | 15 ++++++++------- 5 files changed, 44 insertions(+), 21 deletions(-) diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js index 8121dc0be..401db7574 100644 --- a/js/ui/windowManager.js +++ b/js/ui/windowManager.js @@ -1163,8 +1163,8 @@ const WindowManager = new Lang.Class({ this._tilePreview.hide(); }, - _showWindowMenu: function(shellwm, window, x, y) { - this._windowMenuManager.showForWindow(window, x, y); + _showWindowMenu: function(shellwm, window, menu, x, y) { + this._windowMenuManager.showWindowMenuForWindow(window, menu, x, y); }, _startAppSwitcher : function(display, screen, window, binding) { diff --git a/js/ui/windowMenu.js b/js/ui/windowMenu.js index 3dc85c663..c6dc72958 100644 --- a/js/ui/windowMenu.js +++ b/js/ui/windowMenu.js @@ -9,6 +9,7 @@ const Shell = imports.gi.Shell; const BoxPointer = imports.ui.boxpointer; const Main = imports.ui.main; const PopupMenu = imports.ui.popupMenu; +const RemoteMenu = imports.ui.remoteMenu; const WindowMenu = new Lang.Class({ Name: 'WindowMenu', @@ -122,6 +123,22 @@ const WindowMenu = new Lang.Class({ } }); +const AppMenu = new Lang.Class({ + Name: 'AppMenu', + Extends: RemoteMenu.RemoteMenu, + + _init: function(window) { + let app = Shell.WindowTracker.get_default().get_window_app(window); + + this.parent(Main.layoutManager.dummyCursor, app.menu, app.action_group); + + this.actor.add_style_class_name('fallback-app-menu'); + + Main.layoutManager.uiGroup.add_actor(this.actor); + this.actor.hide(); + } +}); + const WindowMenuManager = new Lang.Class({ Name: 'WindowMenuManager', @@ -129,8 +146,10 @@ const WindowMenuManager = new Lang.Class({ this._manager = new PopupMenu.PopupMenuManager({ actor: Main.layoutManager.dummyCursor }); }, - showForWindow: function(window, x, y) { - let menu = new WindowMenu(window); + showWindowMenuForWindow: function(window, type, x, y) { + let menu = (type == Meta.WindowMenuType.WM) ? new WindowMenu(window) + : new AppMenu(window); + this._manager.addMenu(menu); Main.layoutManager.setDummyCursorGeometry(x, y, 0, 0); @@ -140,5 +159,5 @@ const WindowMenuManager = new Lang.Class({ if (!isOpen) menu.destroy(); })); - }, + } }); diff --git a/src/gnome-shell-plugin.c b/src/gnome-shell-plugin.c index 618a0682b..4b78870f6 100644 --- a/src/gnome-shell-plugin.c +++ b/src/gnome-shell-plugin.c @@ -73,10 +73,11 @@ static void gnome_shell_plugin_show_tile_preview (MetaPlugin *plugin, MetaRectangle *tile_rect, int tile_monitor); static void gnome_shell_plugin_hide_tile_preview (MetaPlugin *plugin); -static void gnome_shell_plugin_show_window_menu (MetaPlugin *plugin, - MetaWindow *window, - int x, - int y); +static void gnome_shell_plugin_show_window_menu (MetaPlugin *plugin, + MetaWindow *window, + MetaWindowMenuType menu, + int x, + int y); static gboolean gnome_shell_plugin_xevent_filter (MetaPlugin *plugin, XEvent *event); @@ -308,12 +309,13 @@ gnome_shell_plugin_hide_tile_preview (MetaPlugin *plugin) } static void -gnome_shell_plugin_show_window_menu (MetaPlugin *plugin, - MetaWindow *window, - int x, - int y) +gnome_shell_plugin_show_window_menu (MetaPlugin *plugin, + MetaWindow *window, + MetaWindowMenuType menu, + int x, + int y) { - _shell_wm_show_window_menu (get_shell_wm (), window, x, y); + _shell_wm_show_window_menu (get_shell_wm (), window, menu, x, y); } static gboolean diff --git a/src/shell-wm-private.h b/src/shell-wm-private.h index d5c02e5cc..c7068efa5 100644 --- a/src/shell-wm-private.h +++ b/src/shell-wm-private.h @@ -42,6 +42,7 @@ void _shell_wm_show_tile_preview (ShellWM *wm, void _shell_wm_hide_tile_preview (ShellWM *wm); void _shell_wm_show_window_menu (ShellWM *wm, MetaWindow *window, + MetaWindowMenuType menu, int x, int y); diff --git a/src/shell-wm.c b/src/shell-wm.c index 50ecb7e7a..928f5f104 100644 --- a/src/shell-wm.c +++ b/src/shell-wm.c @@ -141,8 +141,8 @@ shell_wm_class_init (ShellWMClass *klass) G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, - G_TYPE_NONE, 3, - META_TYPE_WINDOW, G_TYPE_INT, G_TYPE_INT); + G_TYPE_NONE, 4, + META_TYPE_WINDOW, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT); shell_wm_signals[FILTER_KEYBINDING] = g_signal_new ("filter-keybinding", G_TYPE_FROM_CLASS (klass), @@ -297,12 +297,13 @@ _shell_wm_hide_tile_preview (ShellWM *wm) } void -_shell_wm_show_window_menu (ShellWM *wm, - MetaWindow *window, - int x, - int y) +_shell_wm_show_window_menu (ShellWM *wm, + MetaWindow *window, + MetaWindowMenuType menu, + int x, + int y) { - g_signal_emit (wm, shell_wm_signals[SHOW_WINDOW_MENU], 0, window, x, y); + g_signal_emit (wm, shell_wm_signals[SHOW_WINDOW_MENU], 0, window, menu, x, y); } void