diff --git a/extension.js b/extension.js index 495b603..0df9710 100644 --- a/extension.js +++ b/extension.js @@ -49,18 +49,14 @@ function hashGet(hash, key, defaultValue) { return defaultValue; } -function log(message) { - console.error('[GenericMontior]', message); -} - - class SignalMgt { - constructor(item, name, group, dbus, buttonMenu) { + constructor(item, name, group, dbus, logger, buttonMenu) { this.name = name; this.group = group; this.fullname = this.name + '@' + this.group; this.dbus = dbus; + this.logger = logger; this.buttonMenu = buttonMenu; this.signals = new WeakMap(); this.widgets = new Array(); @@ -100,6 +96,7 @@ class SignalMgt { this.widgets.push(widget); let array = new Array(); this.signals.set(widget, array); + widget.set_reactive(true); let id; id = widget.connect('enter-event', this._onEnter.bind(this)); array.push(id); @@ -107,7 +104,6 @@ class SignalMgt { array.push(id); id = widget.connect('scroll-event', this._onScroll.bind(this)); array.push(id); - widget.set_reactive(true); id = widget.connect('button-release-event', this._clicked.bind(this)); array.push(id); } @@ -119,38 +115,34 @@ class SignalMgt { this.signals.set(widget, null); } - toggleMenu() { - if (this.menuOpen) - { - this.buttonMenu.menu.close(); - this.menuOpen = false; - } - else - { - this.buttonMenu.menu.open(true); - this.menuOpen = true; - } - } - _manageEventAction(action, signalName) { + /* + GNOME 48 : onEnter && this.buttonMenu.menuOpen == close popup without onClick event + */ + if (signalName == "onEnter" && this.buttonMenu.menuOpen) + { + this.buttonMenu.menuOpen = false; + return Clutter.EVENT_STOP; + } + if (action === 'open-popup') { - this.buttonMenu.menu.open(true); - this.menuOpen = true; + this.buttonMenu.openPopup(); } else if (action === 'close-popup') { - this.buttonMenu.menu.close(); - this.menuOpen = false; + this.buttonMenu.closePopup(); } else if (action === 'toggle-popup') { - this.toggleMenu(); + this.buttonMenu.togglePopup(); } else if (action === 'delete') this.dbus.deleteItem(this, this.group); else if (action === 'signal') this.dbus.emitSignal(signalName, this.fullname); + else + return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_STOP; } @@ -165,7 +157,7 @@ class SignalMgt { nbClicks = 'Dbl'; const signalName = 'on' + right + nbClicks + 'Click'; - + let action = 'signal'; switch(signalName) { case 'onClick': action = this.onClick; break; @@ -174,11 +166,11 @@ class SignalMgt { case 'onRightDblClick': action = this.onRightDblClick; break; } - this._manageEventAction(action, signalName); - this.nbClicks = 0; this.button = -1; + this._manageEventAction(action, signalName); + return false; } @@ -195,7 +187,7 @@ class SignalMgt { this.timeouts.push(sourceId); } - return Clutter.EVENT_PROPAGATE; + return Clutter.EVENT_STOP; } _onEnter(/*actor, event*/) { @@ -226,7 +218,7 @@ class MyPopupMenuItem extends PopupMenu.PopupBaseMenuItem { super._init(params); this.box = new St.BoxLayout({ style_class: 'popup-combobox-item' }); - this.box.set_vertical(true); + this.box.set_orientation(Clutter.Orientation.VERTICAL); for (let widgetIndex in widgets) this.box.add_child(widgets[widgetIndex]); @@ -241,15 +233,16 @@ var MonitorWidget = GObject.registerClass({ }, class MonitorWidget extends PanelMenu.Button { - _init(item, group, dbus, position) { + _init(item, group, dbus, logger, position) { super._init(0.0); this.name = item['name']; this.group = group; this.fullname = this.name + '@' + this.group; this.dbus = dbus; + this.logger = logger; this.menuItem = null; - this.signalManager = new SignalMgt(item, this.name, group, dbus, this); + this.signalManager = new SignalMgt(item, this.name, group, dbus, logger, this); this.popup_signals = null; this.popup_widgets = null; @@ -382,14 +375,19 @@ class MonitorWidget extends PanelMenu.Button { openPopup() { this.menu.open(true); + this.menuOpen = this.menu.isOpen = true; } closePopup() { this.menu.close(); + this.menuOpen = this.menu.isOpen = false; } togglePopup() { - this.menu.toggle(); + if (this.menuOpen) + this.closePopup(); + else + this.openPopup(); } destroy() { @@ -424,7 +422,7 @@ class MonitorWidget extends PanelMenu.Button { nestedItem = widgetDict['picture']; widget = this._createPicture(nestedItem); } else { - log('No known widget defined in popup'); + this.logger.error('No known widget defined in popup'); } if (nestedItem === null) { @@ -435,7 +433,7 @@ class MonitorWidget extends PanelMenu.Button { const name = hashGet(nestedItem, 'name', ''); this.popup_signals[widget] = new SignalMgt(nestedItem, name, this.fullname, this.dbus, - this); + this.logger, this); this.popup_signals[widget].connectWidgetSignals(widget); this.popup_widgets.push(widget); } @@ -460,7 +458,7 @@ class MonitorWidget extends PanelMenu.Button { __createText(item, isLabel) { if (!item.hasOwnProperty('text')) { - log('Text must have a \'text\' value'); + this.logger.error('Text must have a \'text\' value'); return null; } @@ -500,7 +498,7 @@ class MonitorWidget extends PanelMenu.Button { _createIcon(item) { if (!item.hasOwnProperty('path')) { - log('Icon must have a \'path\' value'); + this.logger.error('Icon must have a \'path\' value'); return null; } @@ -521,7 +519,7 @@ class MonitorWidget extends PanelMenu.Button { _createPicture(item) { if (!item.hasOwnProperty('path')) { - log('Picture must have a \'path\' value'); + this.logger.error('Picture must have a \'path\' value'); return null; } @@ -534,9 +532,11 @@ class MonitorWidget extends PanelMenu.Button { if (typeof(height) === 'string') height = parseInt(height, 10); - const img = new Clutter.Image(); const initialPixbuf = Pixbuf.Pixbuf.new_from_file(item['path']); - img.set_data(initialPixbuf.get_pixels(), + const img = St.ImageContent.new_with_preferred_size(initialPixbuf.get_width(), + initialPixbuf.get_height()); + img.set_data(global.stage.context.get_backend().get_cogl_context(), + initialPixbuf.get_pixels(), initialPixbuf.get_has_alpha() ? Cogl.PixelFormat.RGBA_8888 : Cogl.PixelFormat.RGB_888, initialPixbuf.get_width(), @@ -584,6 +584,7 @@ function loadInterfaceXml(extension, filename) { class GenericMonitorDBUS { constructor(extension) { + this.logger = extension.getLogger(); this.monitor_groups = {}; this.actor_clicked = {}; this.ClutterSettings = Clutter.Settings.get_default(); @@ -598,19 +599,19 @@ class GenericMonitorDBUS { _checkParameters(parameters) { if (!parameters.hasOwnProperty('group')) { - log('No group defined'); + this.logger.error('No group defined'); return false; } if (!parameters.hasOwnProperty('items')) { - log('No items defined'); + this.logger.error('No items defined'); return false; } for (let itemIndex in parameters['items']) { const item = parameters['items'][itemIndex]; if (!item.hasOwnProperty('name')) { - log('No name defined for item'); + this.logger.error('No name defined for item'); return false; } } @@ -631,7 +632,7 @@ class GenericMonitorDBUS { _getItemFromFullName(fullname) { const splitName = fullname.split('@'); if (splitName.length !== 2) { - log(`Invalid name ${fullname}`); + this.logger.error(`Invalid name ${fullname}`); return null; } if (!this.monitor_groups.hasOwnProperty(splitName[1])) @@ -686,7 +687,7 @@ class GenericMonitorDBUS { if (position >= childrens.length) position = -1; } - monitorWidget = new MonitorWidget(item, groupName, this, position); + monitorWidget = new MonitorWidget(item, groupName, this, this.logger, position); group.push(monitorWidget); } else { monitorWidget.update(item); @@ -708,7 +709,7 @@ class GenericMonitorDBUS { const parameters = JSON.parse(str); if (!parameters.hasOwnProperty('items')) { - log('No items defined'); + this.logger.error('No items defined'); return false; } @@ -716,7 +717,7 @@ class GenericMonitorDBUS { let itemName = parameters['items'][itemIndex]; const splitName = itemName.split('@'); if (splitName.length !== 2) { - log(`Invalid name ${itemName}`); + this.logger.error(`Invalid name ${itemName}`); return false; } itemName = splitName[0]; @@ -735,7 +736,7 @@ class GenericMonitorDBUS { const parameters = JSON.parse(str); if (!parameters.hasOwnProperty('groups')) { - log('No groups defined'); + this.logger.error('No groups defined'); return false; } @@ -759,7 +760,7 @@ class GenericMonitorDBUS { const parameters = JSON.parse(str); if (!parameters.hasOwnProperty('item')) { - log('No item defined'); + this.logger.error('No item defined'); return false; } @@ -767,7 +768,7 @@ class GenericMonitorDBUS { if (monitorWidget !== null) return monitorWidget; else - log(`Item ${str} not found`); + this.logger.error(`Item ${str} not found`); return null; } diff --git a/metadata.json b/metadata.json index c968e9c..cae5b8c 100644 --- a/metadata.json +++ b/metadata.json @@ -2,11 +2,9 @@ "uuid": "generic-monitor@gnome-shell-extensions", "name": "Generic Monitor", "description": "Display text & icon on systray using DBUS", - "version": "15", + "version": "16", "shell-version": [ - "47", - "46", - "45" + "48" ], "url": "https://forge.soutade.fr/soutade/GnomeShellGenericMonitor" }