From 756fa448c7efc6695eee3d62d6e290dce585035c Mon Sep 17 00:00:00 2001 From: Xavier Date: Wed, 22 Jun 2022 06:23:42 -0400 Subject: [PATCH] Refactored, implemented a proper Javascript class structure, as well as code cleanup and logging infrastructure. --- .../applet.js | 271 +++++++++--------- .../metadata.json | 12 +- .../settings-schema.json | 54 ++-- 3 files changed, 169 insertions(+), 168 deletions(-) diff --git a/window-controls-applet@sapphirus.org/applet.js b/window-controls-applet@sapphirus.org/applet.js index 30257b6..2c45465 100644 --- a/window-controls-applet@sapphirus.org/applet.js +++ b/window-controls-applet@sapphirus.org/applet.js @@ -15,119 +15,147 @@ * along with this program. If not, see . */ -const Window = imports.ui.windowManager; -const PanelManager = imports.ui.panel; +const UUID = "window-controls-applet@sapphirus.org"; + const St = imports.gi.St; const Lang = imports.lang; const Applet = imports.ui.applet; const Cinnamon = imports.gi.Cinnamon; const Settings = imports.ui.settings; -const PopupMenu = imports.ui.popupMenu; const Main = imports.ui.main; -const Mainloop = imports.mainloop; const Meta = imports.gi.Meta; -const Util = imports.misc.util; -const GLib = imports.gi.GLib; -const Gdk = imports.gi.Gdk; -const GnomeSession = imports.misc.gnomeSession; const WindowTracker = imports.gi.Cinnamon.WindowTracker; -const wt = WindowTracker.get_default(); -const wpm = global.display.get_workspace_manager(); +const _WindowTracker = WindowTracker.get_default(); +const WorkspaceManager = global.display.get_workspace_manager(); +const INFO = 0; +const VERBOSE = 1; +const ERROR = 2; +const ALL = 3; -function WindowButtonApplet(orientation,metadata, panelHeight, instance_id) { +class Logger { + + constructor(omittanceLevel, loggerName) { + this.omittanceLevel = omittanceLevel; + this.loggerName = loggerName; + } + + log(lvl, log) { + if(this.omittanceLevel < lvl) + return; + switch(lvl) { + case ERROR: + global.logError("["+this.loggerName+"]: " + log); + break; + + default: + global.log("["+this.loggerName+"] " + log); + break; + } + } + + setLoggingLevel(level) { + this.omittanceLevel = level; + } - this._init(orientation,metadata, panelHeight, instance_id); } -WindowButtonApplet.prototype = { - - __proto__: Applet.Applet.prototype, - - _init: function(orientation,metadata, panelHeight, instance_id) { - Applet.Applet.prototype._init.call(this, orientation, panelHeight, instance_id); - this.instance_id=instance_id; - this.appletPath=metadata.path; +class WindowControlApplet extends Applet.Applet { + constructor(metadata, orientation, panelHeight, instance_id) { + super(orientation, panelHeight, instance_id); + this.logger = new Logger(INFO, UUID); + this.appletPath=metadata.path; + this.instance_id = instance_id; try { - this.initialize_settings(); - this.initialize_events(); - this.initialize_buttons(); - this.on_panel_edit_mode_changed(); - this.toggleButtons(!this.onlyMaximized); - global.log("[WTDEBUG] Complete!"); + this._initialize_settings(); + this.logger.log(VERBOSE, "Intialised Settings!"); + this._initialize_events(); + this.logger.log(VERBOSE, "Intialised Events!"); + this._initialize_buttons(); + this.logger.log(VERBOSE, "Intialised Buttons!"); + this._on_panel_edit_mode_changed(); + this._toggleButtons(!this.onlyMaximized); + this.logger.log(INFO, "Initialisation Complete!"); } catch (e) { - global.logError(e); - } - }, - initialize_events: function() { + this.logger.log(ERROR, e); + } + } - let tracker = Cinnamon.WindowTracker.get_default(); - Main.themeManager.connect("theme-set", Lang.bind(this, this.loadTheme)); - tracker.connect('notify::focus-app', Lang.bind(this, this._windowChange)); - global.settings.connect('changed::panel-edit-mode', Lang.bind(this, this.on_panel_edit_mode_changed)); + _initialize_events() { + Main.themeManager.connect("theme-set", Lang.bind(this, this._loadTheme)); + WindowTracker.get_default().connect('notify::focus-app', Lang.bind(this, this._windowChange)); + global.settings.connect('changed::panel-edit-mode', Lang.bind(this, this._on_panel_edit_mode_changed)); global.window_manager.connect('size-changed', Lang.bind(this, this._windowChange)); global.window_manager.connect('minimize', Lang.bind(this, this._windowChange)); global.window_manager.connect('destroy', Lang.bind(this, this._windowChange)); global.display.connect('window-entered-monitor', Lang.bind(this, this._windowChange)); - //global.display.connect('window-left-monitor', Lang.bind(this, this._windowChange)); global.display.connect('showing-desktop-changed', Lang.bind(this, this._windowChange)); - - - }, - initialize_buttons: function() { - let buttons=this.buttons_style.split(':'); - if(this.checkButton(buttons,'maximize') || this.checkButton(buttons,'minimize') || this.checkButton(buttons,'close')){ - this.loadTheme(); + } + _initialize_buttons() { + let buttons=this.button_layout.split(':'); + if(this._checkButton(buttons,'maximize') || this._checkButton(buttons,'minimize') || this._checkButton(buttons,'close')){ + this._loadTheme(); } this.button = []; - this.createButtons(this.buttons_style); - - }, - initialize_settings: function() { - this.settings = new Settings.AppletSettings(this, "window-buttons-fixed@sapphirus.org", this.instance_id); - this.settings.bindProperty(Settings.BindingDirection.IN,"buttons-style","buttons_style",this.bind_settings,null); - this.settings.bindProperty(Settings.BindingDirection.IN,"buttons-theme","buttons_theme", this.bind_settings,null); - this.settings.bindProperty(Settings.BindingDirection.IN,"only-maximized", "onlyMaximized", this.bind_settings,null); - this.settings.bindProperty(Settings.BindingDirection.IN,"on-desktop-shutdown", "onDesktopShutdown", this.bind_settings,null); - }, - bind_settings: function() { + this._createButtons(this.button_layout); + } + + _initialize_settings() { + this.settings = new Settings.AppletSettings(this, UUID, this.instance_id); + this.settings.bindProperty(Settings.BindingDirection.IN,"button-layout","button_layout",this._bind_settings,null); + this.settings.bindProperty(Settings.BindingDirection.IN,"button-theme","button_theme", this._bind_settings,null); + this.settings.bindProperty(Settings.BindingDirection.IN,"only-maximized", "onlyMaximized", this._bind_settings,null); + this.settings.bindProperty(Settings.BindingDirection.IN,"verbose-log", "verbose_logging", this._set_logging,null); + this._set_logging(); + } + + _set_logging() { + let loggingLevel = (this.verbose_logging ? ALL : INFO); + this.logger.log(VERBOSE, "Set logging level to "+loggingLevel); + this.logger.setLoggingLevel(loggingLevel); + } + _bind_settings() { this.actor.destroy_all_children(); - this.initialize_buttons(); - }, - on_panel_edit_mode_changed: function() { + this._initialize_buttons(); + } + + _on_panel_edit_mode_changed() { let reactive = !global.settings.get_boolean('panel-edit-mode'); - let b=this.buttons_style.split(':'); + let b=this.button_layout.split(':'); for (let i=0; i < b.length; ++i ){ this.button[b[i]].reactive=reactive; } - }, - getCssPath: function(theme) { + } + + _getCssPath(theme) { let cssPath = this.appletPath + '/themes/'+theme+'/style.css'; return cssPath; - - }, - loadTheme: function(){ + } + + _loadTheme(){ this.actor.set_style_class_name("window-buttons"); let theme = St.ThemeContext.get_for_stage(global.stage).get_theme(); - let theme_path = this.getCssPath(this.buttons_theme); + let theme_path = this._getCssPath(this.button_theme); theme.load_stylesheet(theme_path); - }, - createButtons: function(buttonsStyle) { - buttonsStyle=buttonsStyle.split(':'); - for (let i=0; i < buttonsStyle.length; ++i ){ - let buttonName=buttonsStyle[i]+"Button"; + } + + _createButtons(buttonLayout) { + buttonLayout=buttonLayout.split(':'); + for (let i=0; i < buttonLayout.length; ++i ){ + let buttonName="_"+buttonLayout[i]+"Button"; this[buttonName](); } - }, - minimizeButton:function () { + } + + _minimizeButton() { this.button['minimize'] = new St.Button({ name: 'windowButton', style_class: 'minimize window-button', reactive: true }); this.actor.add(this.button['minimize']); this.button['minimize'].connect('button-press-event', Lang.bind(this,function(actor,event){ let button = event.get_button(); if (button == 1) { - this.minimizeWindow(); + this._minimizeWindow(); return true; } else if(button == 3) { this._applet_context_menu.toggle(); @@ -135,24 +163,24 @@ WindowButtonApplet.prototype = { } return false; })); - }, - - minimizeWindow: function() { - let activeWindow = this.getActiveWindow(); - let app = wt.get_window_app(activeWindow); + } + + _minimizeWindow() { + let activeWindow = this._getActiveWindow(); + let app = _WindowTracker.get_window_app(activeWindow); if(!activeWindow || !app) return; activeWindow.minimize(); - }, - - maximizeButton: function () { + } + + _maximizeButton() { this.button['maximize'] = new St.Button({ name: 'windowButton'+this.instance_id, style_class: 'maximize window-button', reactive: true }); this.actor.add(this.button['maximize']); this.button['maximize'].connect('button-press-event', Lang.bind(this,function(actor,event){ let button = event.get_button(); if (button == 1) { - this.maximizeWindow(); + this._maximizeWindow(); return true; } else if(button == 3){ this._applet_context_menu.toggle(); @@ -160,27 +188,28 @@ WindowButtonApplet.prototype = { } return false; })); - }, - - maximizeWindow: function() { - let activeWindow = this.getActiveWindow(); - let app = wt.get_window_app(activeWindow); + } + + _maximizeWindow() { + let activeWindow = this._getActiveWindow(); + let app = _WindowTracker.get_window_app(activeWindow); if(!activeWindow || !app) return; - + if (activeWindow.get_maximized()) { activeWindow.unmaximize(3); } else { activeWindow.maximize(3); } - }, - closeButton: function () { + } + + _closeButton() { this.button['close'] = new St.Button({ name: 'windowButton', style_class: 'close window-button', reactive: true }); this.actor.add(this.button['close']); this.button['close'].connect('button-press-event', Lang.bind(this,function(actor,event){ let button = event.get_button(); if (button == 1) { - this.closeWindow(); + this._closeWindow(); return true; } else if(button == 3){ this._applet_context_menu.toggle(); @@ -188,18 +217,19 @@ WindowButtonApplet.prototype = { } return false; })); - }, - closeWindow: function() { - let activeWindow = this.getActiveWindow(); - let app = wt.get_window_app(activeWindow); + } + + _closeWindow() { + let activeWindow = this._getActiveWindow(); + let app = _WindowTracker.get_window_app(activeWindow); if(!activeWindow || !app) return; - + this.logger.log(INFO, "Closed!"); activeWindow.delete(global.get_current_time()); - }, + } - getActiveWindow: function() { - let workspace = wpm.get_active_workspace(); + _getActiveWindow() { + let workspace = WorkspaceManager.get_active_workspace(); let windows = workspace.list_windows(); for (var i = 0; i < windows.length; i++) { let w = windows[i]; @@ -210,50 +240,33 @@ WindowButtonApplet.prototype = { return w; } return false; - }, - _windowChange: function(destroy=false) { + } + + _windowChange(destroy) { if(!this.onlyMaximized) return; + if(!this._getActiveWindow()) this._toggleButtons(false); else this._toggleButtons(true); - let workspace = wpm.get_active_workspace(); - let windows = workspace.list_windows(); - for (var i = 0; i < windows.length; i++) { - let w = windows[i]; - let thisMonitor = (w.get_monitor() == this.panel.monitorIndex); - if(!thisMonitor) - continue; - let toggle = ((w.get_maximized() === Meta.MaximizeFlags.BOTH) && (w.get_window_type() != Meta.WindowType.DESKTOP) && !w.minimized && thisMonitor); - this.toggleButtons(toggle); - if(toggle) break; - } + } - /* let w = global.display.focus_window; - let windowType = (w.get_window_type() == Meta.WindowType.DESKTOP); - let thisMonitor = (w.get_monitor() == this.panel.monitorIndex); - let toggle = ((w.get_maximized() === Meta.MaximizeFlags.BOTH) !w.minimized && thisMonitor && !windowType); - this.toggleButtons(toggle); */ - - }, - _destroy: function() { - this.toggleButtons(false); - }, - checkButton: function(arr, obj) { + _checkButton(arr, obj) { for(var i=0; i