apps-menu: adapt to gnome-shell API changes
When libgnome-menus became introspectable, ShellAppSystem was modified to better adapt to GMenu. Adapt to those changes in the extension as well.
This commit is contained in:
@@ -1,36 +1,41 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const St = imports.gi.St;
|
||||
const Main = imports.ui.main;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
const PanelMenu = imports.ui.panelMenu;
|
||||
const Shell = imports.gi.Shell;
|
||||
const GMenu = imports.gi.GMenu;
|
||||
const Lang = imports.lang;
|
||||
const ICON_SIZE = 28;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const PanelMenu = imports.ui.panelMenu;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
|
||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
const ICON_SIZE = 28;
|
||||
let appsys = Shell.AppSystem.get_default();
|
||||
|
||||
function AppMenuItem(appInfo,params) {
|
||||
this._init(appInfo,params);
|
||||
function AppMenuItem() {
|
||||
this._init.apply(this, arguments);
|
||||
}
|
||||
|
||||
AppMenuItem.prototype = {
|
||||
__proto__: PopupMenu.PopupBaseMenuItem.prototype,
|
||||
_init: function (appInfo, params) {
|
||||
|
||||
_init: function (app, params) {
|
||||
PopupMenu.PopupBaseMenuItem.prototype._init.call(this, params);
|
||||
let app = appsys.get_app(appInfo.get_id());
|
||||
this.label = new St.Label({ text: appInfo.get_name() });
|
||||
|
||||
this._app = app;
|
||||
this.label = new St.Label({ text: app.get_name() });
|
||||
this.addActor(this.label);
|
||||
this._icon = app.create_icon_texture(ICON_SIZE);
|
||||
this.addActor(this._icon,{expand : false});
|
||||
this._appInfo = appInfo;
|
||||
this.addActor(this._icon, { expand: false });
|
||||
},
|
||||
_onButtonReleaseEvent: function (actor, event) {
|
||||
let id = this._appInfo.get_id();
|
||||
appsys.get_app(id).activate(-1);
|
||||
this.activate(event);
|
||||
|
||||
activate: function (event) {
|
||||
this._app.activate_full(-1, event.get_time());
|
||||
|
||||
PopupMenu.PopupBaseMenuItem.prototype.activate.call(this, event);
|
||||
}
|
||||
|
||||
};
|
||||
@@ -45,7 +50,7 @@ ApplicationsButton.prototype = {
|
||||
_init: function() {
|
||||
PanelMenu.SystemStatusButton.prototype._init.call(this, 'start-here');
|
||||
this._display();
|
||||
appsys.connect('installed-changed', Lang.bind(this,this.reDisplay));
|
||||
appsys.connect('installed-changed', Lang.bind(this, this.reDisplay));
|
||||
},
|
||||
|
||||
reDisplay : function() {
|
||||
@@ -57,38 +62,39 @@ ApplicationsButton.prototype = {
|
||||
this.menu.removeAll();
|
||||
},
|
||||
|
||||
_display : function() {
|
||||
let id;
|
||||
this.appItems = [];
|
||||
this.categories = appsys.get_sections();
|
||||
for ( id = 0; id < this.categories.length; id++) {
|
||||
this.appItems[this.categories[id]] = new PopupMenu.PopupSubMenuMenuItem(this.categories[id]);
|
||||
this.menu.addMenuItem(this.appItems[this.categories[id]]);
|
||||
}
|
||||
this._addSubMenuItems();
|
||||
for ( id = 0; id < this.categories.length; id++) {
|
||||
let item = this.appItems[this.categories[id]];
|
||||
if(item.menu._getMenuItems().length == 0){
|
||||
item.actor.hide();
|
||||
// Recursively load a GMenuTreeDirectory; we could put this in ShellAppSystem too
|
||||
// (taken from js/ui/appDisplay.js in core shell)
|
||||
_loadCategory: function(dir, menu) {
|
||||
var iter = dir.iter();
|
||||
var nextType;
|
||||
while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) {
|
||||
if (nextType == GMenu.TreeItemType.ENTRY) {
|
||||
var entry = iter.get_entry();
|
||||
var app = appsys.lookup_app_by_tree_entry(entry);
|
||||
menu.addMenuItem(new AppMenuItem(app));
|
||||
} else if (nextType == GMenu.TreeItemType.DIRECTORY) {
|
||||
this._loadCategory(iter.get_directory(), appList);
|
||||
}
|
||||
}
|
||||
},
|
||||
_addSubMenuItems: function() {
|
||||
let appInfos = appsys.get_flattened_apps().filter(function(app) {
|
||||
return !app.get_is_nodisplay();
|
||||
});
|
||||
for (let appid = appInfos.length-1 ; appid >= 0; appid--) {
|
||||
let appInfo = appInfos[appid];
|
||||
let appItem = new AppMenuItem(appInfo);
|
||||
this.appItems[appInfo.get_section()].menu.addMenuItem(appItem);
|
||||
|
||||
_display : function() {
|
||||
let tree = appsys.get_tree();
|
||||
let root = tree.get_root_directory();
|
||||
|
||||
let iter = root.iter();
|
||||
let nextType;
|
||||
while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) {
|
||||
if (nextType == GMenu.TreeItemType.DIRECTORY) {
|
||||
let dir = iter.get_directory();
|
||||
let item = new PopupMenu.PopupSubMenuMenuItem(dir.get_name());
|
||||
this._loadCategory(dir, item.menu);
|
||||
this.menu.addMenuItem(item);
|
||||
}
|
||||
}
|
||||
},
|
||||
_onDestroy: function() {
|
||||
this._clearAll();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
function main(metadata) {
|
||||
let appsMenuButton = new ApplicationsButton();
|
||||
Main.panel._leftBox.insert_actor(appsMenuButton.actor, 1);
|
||||
|
||||
Reference in New Issue
Block a user