diff options
author | Florian Müllner <fmuellner@gnome.org> | 2014-05-24 03:32:44 +0200 |
---|---|---|
committer | Florian Müllner <fmuellner@gnome.org> | 2014-05-27 19:49:05 +0200 |
commit | 8811ba2ec033fb52547fbcd14eb3fefc153c90fa (patch) | |
tree | bab76f57a4d515ba0a7600168ec1963fffcf05a1 | |
parent | 38d8e465b37e06e935f6d5bbb9da05e1c171f426 (diff) |
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
-rw-r--r-- | js/ui/windowManager.js | 4 | ||||
-rw-r--r-- | js/ui/windowMenu.js | 25 | ||||
-rw-r--r-- | src/gnome-shell-plugin.c | 20 | ||||
-rw-r--r-- | src/shell-wm-private.h | 1 | ||||
-rw-r--r-- | 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 8121dc0b..401db757 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 3dc85c66..c6dc7295 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 618a0682..4b78870f 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 d5c02e5c..c7068efa 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 50ecb7e7..928f5f10 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 |