2008-10-31 23:09:46 +00:00
|
|
|
/* -*- mode: js2; js2-basic-offset: 4; -*- */
|
|
|
|
|
|
|
|
const Shell = imports.gi.Shell;
|
|
|
|
const Clutter = imports.gi.Clutter;
|
|
|
|
|
|
|
|
const Panel = imports.ui.panel;
|
|
|
|
|
|
|
|
const OVERLAY_BACKGROUND_COLOR = new Clutter.Color();
|
|
|
|
OVERLAY_BACKGROUND_COLOR.from_pixel(0x000000ff);
|
|
|
|
|
|
|
|
function Overlay() {
|
|
|
|
this._init();
|
|
|
|
}
|
|
|
|
|
|
|
|
Overlay.prototype = {
|
|
|
|
_init : function() {
|
|
|
|
let global = Shell.global_get();
|
|
|
|
|
|
|
|
this._group = new Clutter.Group();
|
|
|
|
this.visible = false;
|
|
|
|
|
|
|
|
let background = new Clutter.Rectangle({ color: OVERLAY_BACKGROUND_COLOR,
|
|
|
|
reactive: true,
|
|
|
|
x: 0,
|
|
|
|
y: Panel.PANEL_HEIGHT,
|
|
|
|
width: global.screen_width,
|
|
|
|
height: global.screen_width - Panel.PANEL_HEIGHT });
|
|
|
|
this._group.add_actor(background);
|
|
|
|
|
|
|
|
this._group.hide();
|
|
|
|
global.overlay_group.add_actor(this._group);
|
2008-11-02 04:18:41 +00:00
|
|
|
|
|
|
|
this._window_clones = []
|
2008-10-31 23:09:46 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
show : function() {
|
|
|
|
if (!this.visible) {
|
|
|
|
this.visible = true;
|
2008-11-02 04:18:41 +00:00
|
|
|
|
|
|
|
// Very simple version of a window overview ... when we show the
|
|
|
|
// overlay, display all the user's windows in the overlay scaled
|
|
|
|
// down.
|
|
|
|
//
|
|
|
|
// We show the window using "clones" of the texture .. separate
|
|
|
|
// actors that mirror the original actors for the window. For
|
|
|
|
// animation purposes, it may be better to actually move the
|
|
|
|
// original actors about instead.
|
|
|
|
|
|
|
|
let global = Shell.global_get();
|
|
|
|
let windows = global.get_windows();
|
|
|
|
|
|
|
|
let screen_width = global.screen_width
|
|
|
|
let screen_height = global.screen_height
|
|
|
|
|
|
|
|
let x = screen_width / 4
|
|
|
|
let y = screen_height / 4
|
|
|
|
|
|
|
|
for (let i = 0; i < windows.length; i++)
|
|
|
|
if (!windows[i].is_override_redirect()) {
|
|
|
|
let clone = new Clutter.CloneTexture({ parent_texture: windows[i].get_texture(),
|
|
|
|
x: x,
|
|
|
|
y: y });
|
|
|
|
|
|
|
|
// We scale each window down so that it is at most 300x300, but we
|
|
|
|
// never want to scale a window up.
|
|
|
|
let size = clone.width;
|
|
|
|
if (clone.height > size)
|
|
|
|
size = clone.height;
|
|
|
|
|
|
|
|
let scale = 300 / size;
|
|
|
|
if (scale > 1)
|
|
|
|
scale = 1;
|
|
|
|
|
|
|
|
clone.set_scale(scale, scale);
|
|
|
|
this._group.add_actor(clone);
|
|
|
|
this._window_clones.push(clone);
|
|
|
|
|
|
|
|
// Windows are overlapped diagonally. If there are too many, they'll
|
|
|
|
// end up off the screen
|
|
|
|
x += 50;
|
|
|
|
y += 50;
|
|
|
|
}
|
|
|
|
|
2008-10-31 23:09:46 +00:00
|
|
|
this._group.show();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
hide : function() {
|
|
|
|
if (this.visible) {
|
|
|
|
this.visible = false;
|
|
|
|
this._group.hide();
|
2008-11-02 04:18:41 +00:00
|
|
|
|
|
|
|
for (let i = 0; i < this._window_clones.length; i++) {
|
|
|
|
this._window_clones[i].destroy();
|
|
|
|
}
|
|
|
|
|
|
|
|
this._window_clones = [];
|
2008-10-31 23:09:46 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|