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
This commit is contained in:
Florian Müllner 2014-05-24 03:32:44 +02:00
parent 38d8e465b3
commit 8811ba2ec0
5 changed files with 44 additions and 21 deletions

View File

@ -1163,8 +1163,8 @@ const WindowManager = new Lang.Class({
this._tilePreview.hide(); this._tilePreview.hide();
}, },
_showWindowMenu: function(shellwm, window, x, y) { _showWindowMenu: function(shellwm, window, menu, x, y) {
this._windowMenuManager.showForWindow(window, x, y); this._windowMenuManager.showWindowMenuForWindow(window, menu, x, y);
}, },
_startAppSwitcher : function(display, screen, window, binding) { _startAppSwitcher : function(display, screen, window, binding) {

View File

@ -9,6 +9,7 @@ const Shell = imports.gi.Shell;
const BoxPointer = imports.ui.boxpointer; const BoxPointer = imports.ui.boxpointer;
const Main = imports.ui.main; const Main = imports.ui.main;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const RemoteMenu = imports.ui.remoteMenu;
const WindowMenu = new Lang.Class({ const WindowMenu = new Lang.Class({
Name: 'WindowMenu', 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({ const WindowMenuManager = new Lang.Class({
Name: 'WindowMenuManager', Name: 'WindowMenuManager',
@ -129,8 +146,10 @@ const WindowMenuManager = new Lang.Class({
this._manager = new PopupMenu.PopupMenuManager({ actor: Main.layoutManager.dummyCursor }); this._manager = new PopupMenu.PopupMenuManager({ actor: Main.layoutManager.dummyCursor });
}, },
showForWindow: function(window, x, y) { showWindowMenuForWindow: function(window, type, x, y) {
let menu = new WindowMenu(window); let menu = (type == Meta.WindowMenuType.WM) ? new WindowMenu(window)
: new AppMenu(window);
this._manager.addMenu(menu); this._manager.addMenu(menu);
Main.layoutManager.setDummyCursorGeometry(x, y, 0, 0); Main.layoutManager.setDummyCursorGeometry(x, y, 0, 0);
@ -140,5 +159,5 @@ const WindowMenuManager = new Lang.Class({
if (!isOpen) if (!isOpen)
menu.destroy(); menu.destroy();
})); }));
}, }
}); });

View File

@ -75,6 +75,7 @@ static void gnome_shell_plugin_show_tile_preview (MetaPlugin *plugin,
static void gnome_shell_plugin_hide_tile_preview (MetaPlugin *plugin); static void gnome_shell_plugin_hide_tile_preview (MetaPlugin *plugin);
static void gnome_shell_plugin_show_window_menu (MetaPlugin *plugin, static void gnome_shell_plugin_show_window_menu (MetaPlugin *plugin,
MetaWindow *window, MetaWindow *window,
MetaWindowMenuType menu,
int x, int x,
int y); int y);
@ -310,10 +311,11 @@ gnome_shell_plugin_hide_tile_preview (MetaPlugin *plugin)
static void static void
gnome_shell_plugin_show_window_menu (MetaPlugin *plugin, gnome_shell_plugin_show_window_menu (MetaPlugin *plugin,
MetaWindow *window, MetaWindow *window,
MetaWindowMenuType menu,
int x, int x,
int y) 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 static gboolean

View File

@ -42,6 +42,7 @@ void _shell_wm_show_tile_preview (ShellWM *wm,
void _shell_wm_hide_tile_preview (ShellWM *wm); void _shell_wm_hide_tile_preview (ShellWM *wm);
void _shell_wm_show_window_menu (ShellWM *wm, void _shell_wm_show_window_menu (ShellWM *wm,
MetaWindow *window, MetaWindow *window,
MetaWindowMenuType menu,
int x, int x,
int y); int y);

View File

@ -141,8 +141,8 @@ shell_wm_class_init (ShellWMClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, NULL, NULL, NULL, 0, NULL, NULL, NULL,
G_TYPE_NONE, 3, G_TYPE_NONE, 4,
META_TYPE_WINDOW, G_TYPE_INT, G_TYPE_INT); META_TYPE_WINDOW, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT);
shell_wm_signals[FILTER_KEYBINDING] = shell_wm_signals[FILTER_KEYBINDING] =
g_signal_new ("filter-keybinding", g_signal_new ("filter-keybinding",
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
@ -299,10 +299,11 @@ _shell_wm_hide_tile_preview (ShellWM *wm)
void void
_shell_wm_show_window_menu (ShellWM *wm, _shell_wm_show_window_menu (ShellWM *wm,
MetaWindow *window, MetaWindow *window,
MetaWindowMenuType menu,
int x, int x,
int y) 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 void