Files
PaperWM/scratch.js
Ole Jørgen Brønner b5fdb1b119 focusMonitor: don't crash on display.focus_window == null
Can sometimes happen on enable (eg. when unlocking screen)
2019-01-11 19:25:00 +01:00

127 lines
3.0 KiB
JavaScript

var Extension = imports.misc.extensionUtils.extensions['paperwm@hedning:matrix.org'];
var Meta = imports.gi.Meta;
var Main = imports.ui.main;
var TopBar = Extension.imports.topbar;
var Tiling = Extension.imports.tiling;
var utils = Extension.imports.utils;
var debug = utils.debug;
var float;
function focusMonitor() {
if (global.display.focus_window) {
return Main.layoutManager.monitors[global.display.focus_window.get_monitor()]
} else {
return Main.layoutManager.primaryMonitor;
}
}
function makeScratch(metaWindow) {
metaWindow[float] = true;
metaWindow.make_above();
metaWindow.stick();
Tiling.showWindow(metaWindow);
let monitor = focusMonitor();
if (monitor.clickOverlay)
monitor.clickOverlay.hide();
}
function unmakeScratch(metaWindow) {
metaWindow[float] = false;
metaWindow.unmake_above();
metaWindow.unstick();
}
function toggle(metaWindow) {
if (isScratchWindow(metaWindow)) {
unmakeScratch(metaWindow);
hide();
} else {
makeScratch(metaWindow);
if (metaWindow.has_focus) {
let space = Tiling.spaces.get(global.workspace_manager.get_active_workspace());
space.setSelectionInactive();
}
}
}
function isScratchWindow(metaWindow) {
return metaWindow && metaWindow[float];
}
/** Return scratch windows in MRU order */
function getScratchWindows() {
return global.display.get_tab_list(Meta.TabList.NORMAL, null)
.filter(isScratchWindow);
}
function isScratchActive() {
return getScratchWindows().some(metaWindow => !metaWindow.minimized);
}
function toggleScratch() {
if (isScratchActive())
hide();
else
show();
}
function show() {
let windows = getScratchWindows();
if (windows.length === 0) {
return;
}
TopBar.show();
windows.slice().reverse()
.map(function(meta_window) {
meta_window.unminimize();
meta_window.make_above();
meta_window.get_compositor_private().show();
});
windows[0].activate(global.get_current_time());
let monitor = focusMonitor();
if (monitor.clickOverlay)
monitor.clickOverlay.hide();
}
function hide() {
let windows = getScratchWindows();
windows.map(function(meta_window) {
meta_window.minimize();
});
}
// Monkey patch the alt-space menu
var Lang = imports.lang;
var PopupMenu = imports.ui.popupMenu;
var WindowMenu = imports.ui.windowMenu;
var originalBuildMenu = WindowMenu.WindowMenu.prototype._buildMenu;
function init() {
float = Symbol();
}
function enable() {
WindowMenu.WindowMenu.prototype._buildMenu =
function (window) {
let item;
item = this.addAction(_('Scratch'), () => {
toggle(window);
});
if (isScratchWindow(window))
item.setOrnament(PopupMenu.Ornament.CHECK);
originalBuildMenu.call(this, window);
};
}
function disable() {
WindowMenu.WindowMenu.prototype._buildMenu = originalBuildMenu;
}