diff options
Diffstat (limited to 'extensions/multi-monitors-add-on/multi-monitors-add-on@spin83/mmlayout.js')
-rw-r--r-- | extensions/multi-monitors-add-on/multi-monitors-add-on@spin83/mmlayout.js | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/extensions/multi-monitors-add-on/multi-monitors-add-on@spin83/mmlayout.js b/extensions/multi-monitors-add-on/multi-monitors-add-on@spin83/mmlayout.js new file mode 100644 index 0000000..a354ec1 --- /dev/null +++ b/extensions/multi-monitors-add-on/multi-monitors-add-on@spin83/mmlayout.js @@ -0,0 +1,251 @@ +/** + * New node file + */ + +const { St, Meta } = imports.gi; + +const Main = imports.ui.main; +const Panel = imports.ui.panel; +const Layout = imports.ui.layout; + +const Config = imports.misc.config; + +const ExtensionUtils = imports.misc.extensionUtils; +const CE = ExtensionUtils.getCurrentExtension(); +const Convenience = CE.imports.convenience; +const MultiMonitors = CE.imports.extension; +const MMPanel = CE.imports.mmpanel; + +var SHOW_PANEL_ID = 'show-panel'; +var ENABLE_HOT_CORNERS = 'enable-hot-corners'; + +const MultiMonitorsPanelBox = class MultiMonitorsPanelBox { + constructor(monitor) { + this.panelBox = new St.BoxLayout({ name: 'panelBox', vertical: true, clip_to_allocation: true }); + Main.layoutManager.addChrome(this.panelBox, { affectsStruts: true, trackFullscreen: true }); + this.panelBox.set_position(monitor.x, monitor.y); + this.panelBox.set_size(monitor.width, -1); + Main.uiGroup.set_child_below_sibling(this.panelBox, Main.layoutManager.panelBox); + } + + destroy() { + this.panelBox.destroy(); + } + + updatePanel(monitor) { + this.panelBox.set_position(monitor.x, monitor.y); + this.panelBox.set_size(monitor.width, -1); + } +}; + +var MultiMonitorsLayoutManager = class MultiMonitorsLayoutManager { + constructor() { + this._settings = Convenience.getSettings(); + this._desktopSettings = Convenience.getSettings("org.gnome.desktop.interface"); + + Main.mmPanel = []; + + this._monitorIds = []; + this.mmPanelBox = []; + this.mmappMenu = false; + + this._showAppMenuId = null; + this._monitorsChangedId = null; + + this.statusIndicatorsController = null; + this._layoutManager_updateHotCorners = null; + this._changedEnableHotCornersId = null; + } + + showPanel() { + if (this._settings.get_boolean(SHOW_PANEL_ID)) { + if (!this._monitorsChangedId) { + this._monitorsChangedId = Main.layoutManager.connect('monitors-changed', this._monitorsChanged.bind(this)); + this._monitorsChanged(); + } + if (!this._showAppMenuId) { + this._showAppMenuId = this._settings.connect('changed::'+MMPanel.SHOW_APP_MENU_ID, this._showAppMenu.bind(this)); + } + + if (!this.statusIndicatorsController) { + this.statusIndicatorsController = new MMPanel.StatusIndicatorsController(); + } + + if (!this._layoutManager_updateHotCorners) { + this._layoutManager_updateHotCorners = Main.layoutManager._updateHotCorners; + + const _this = this; + Main.layoutManager._updateHotCorners = function() { + this.hotCorners.forEach((corner) => { + if (corner) + corner.destroy(); + }); + this.hotCorners = []; + + if (!_this._desktopSettings.get_boolean(ENABLE_HOT_CORNERS)) { + this.emit('hot-corners-changed'); + return; + } + + let size = this.panelBox.height; + + for (let i = 0; i < this.monitors.length; i++) { + let monitor = this.monitors[i]; + let cornerX = this._rtl ? monitor.x + monitor.width : monitor.x; + let cornerY = monitor.y; + + let corner = new Layout.HotCorner(this, monitor, cornerX, cornerY); + corner.setBarrierSize(size); + this.hotCorners.push(corner); + } + + this.emit('hot-corners-changed'); + }; + + if (!this._changedEnableHotCornersId) { + this._changedEnableHotCornersId = this._desktopSettings.connect('changed::'+ENABLE_HOT_CORNERS, + Main.layoutManager._updateHotCorners.bind(Main.layoutManager)); + } + + Main.layoutManager._updateHotCorners(); + } + } + else { + this.hidePanel(); + } + } + + hidePanel() { + if (this._changedEnableHotCornersId) { + global.settings.disconnect(this._changedEnableHotCornersId); + this._changedEnableHotCornersId = null; + } + + if (this._layoutManager_updateHotCorners) { + Main.layoutManager['_updateHotCorners'] = this._layoutManager_updateHotCorners; + this._layoutManager_updateHotCorners = null; + Main.layoutManager._updateHotCorners(); + } + + if (this.statusIndicatorsController) { + this.statusIndicatorsController.destroy(); + this.statusIndicatorsController = null; + } + + if (this._showAppMenuId) { + this._settings.disconnect(this._showAppMenuId); + this._showAppMenuId = null; + } + this._hideAppMenu(); + + if (this._monitorsChangedId) { + Main.layoutManager.disconnect(this._monitorsChangedId); + this._monitorsChangedId = null; + } + + let panels2remove = this._monitorIds.length; + for (let i = 0; i < panels2remove; i++) { + let monitorId = this._monitorIds.pop(); + this._popPanel(); + global.log("remove: "+monitorId); + } + } + + _monitorsChanged () { + let monitorChange = Main.layoutManager.monitors.length - this._monitorIds.length -1; + if (monitorChange<0) { + for (let idx = 0; idx<-monitorChange; idx++) { + let monitorId = this._monitorIds.pop(); + this._popPanel(); + global.log("remove: "+monitorId); + } + } + + let j = 0; + let tIndicators = false; + for (let i = 0; i < Main.layoutManager.monitors.length; i++) { + if (i!=Main.layoutManager.primaryIndex) { + let monitor = Main.layoutManager.monitors[i]; + let monitorId = "i"+i+"x"+monitor.x+"y"+monitor.y+"w"+monitor.width+"h"+monitor.height; + if (monitorChange>0 && j==this._monitorIds.length) { + this._monitorIds.push(monitorId); + this._pushPanel(i, monitor); + global.log("new: "+monitorId); + tIndicators = true; + } + else if (this._monitorIds[j]>monitorId || this._monitorIds[j]<monitorId) { + let oldMonitorId = this._monitorIds[j]; + this._monitorIds[j]=monitorId; + this.mmPanelBox[j].updatePanel(monitor); + global.log("update: "+oldMonitorId+">"+monitorId); + } + j++; + } + } + this._showAppMenu(); + if (tIndicators && this.statusIndicatorsController) { + this.statusIndicatorsController.transferIndicators(); + } + } + + _pushPanel(i, monitor) { + let mmPanelBox = new MultiMonitorsPanelBox(monitor); + let panel = new MMPanel.MultiMonitorsPanel(i, mmPanelBox); + + Main.mmPanel.push(panel); + this.mmPanelBox.push(mmPanelBox); + } + + _popPanel() { + let panel = Main.mmPanel.pop(); + if (this.statusIndicatorsController) { + this.statusIndicatorsController.transferBack(panel); + } + let mmPanelBox = this.mmPanelBox.pop(); + mmPanelBox.destroy(); + } + + _changeMainPanelAppMenuButton(appMenuButton) { + let role = "appMenu"; + let panel = Main.panel; + let indicator = panel.statusArea[role]; + panel.menuManager.removeMenu(indicator.menu); + indicator.destroy(); + if (indicator._actionGroupNotifyId) { + indicator._targetApp.disconnect(indicator._actionGroupNotifyId); + indicator._actionGroupNotifyId = 0; + } + if (indicator._busyNotifyId) { + indicator._targetApp.disconnect(indicator._busyNotifyId); + indicator._busyNotifyId = 0; + } + if (indicator.menu._windowsChangedId) { + indicator.menu._app.disconnect(indicator.menu._windowsChangedId); + indicator.menu._windowsChangedId = 0; + } + indicator = new appMenuButton(panel); + panel.statusArea[role] = indicator; + let box = panel._leftBox; + panel._addToPanelBox(role, indicator, box.get_n_children()+1, box); + } + + _showAppMenu() { + if (this._settings.get_boolean(MMPanel.SHOW_APP_MENU_ID) && Main.mmPanel.length>0) { + if (!this.mmappMenu) { + this._changeMainPanelAppMenuButton(MMPanel.MultiMonitorsAppMenuButton); + this.mmappMenu = true; + } + } + else { + this._hideAppMenu(); + } + } + + _hideAppMenu() { + if (this.mmappMenu) { + this._changeMainPanelAppMenuButton(Panel.AppMenuButton); + this.mmappMenu = false; + Main.panel._updatePanel() + } + } +}; |