PaperWM/scratch.js
Ole Jørgen Brønner 571a2d0680 Don't show actors of minimized scratch windows
Specifically fixes bug where whole scratch layer become visible (but only the
actors) when reloading (or disable/enable cycle) when at least on scratch window
was active.

This also sometimes crashed gnome-shell (confirmed on v3.28.3 - ubuntu 18.04)

Also remove some code who seem to partly work around the problem
2019-01-26 14:05:09 +01:00

138 lines
3.2 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();
if (!metaWindow.minimized)
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 toggleScratchWindow() {
if (isScratchActive())
hide();
else
show(true);
}
function show(top) {
let windows = getScratchWindows();
if (windows.length === 0) {
return;
}
if (top)
windows = windows.slice(0,1);
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;
}