diff --git a/js/ui/overlay.js b/js/ui/overlay.js index 5504182ad..a58e0bd07 100644 --- a/js/ui/overlay.js +++ b/js/ui/overlay.js @@ -29,11 +29,58 @@ Overlay.prototype = { this._group.hide(); global.overlay_group.add_actor(this._group); + + this._window_clones = [] }, show : function() { if (!this.visible) { this.visible = true; + + // 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; + } + this._group.show(); } }, @@ -42,6 +89,12 @@ Overlay.prototype = { if (this.visible) { this.visible = false; this._group.hide(); + + for (let i = 0; i < this._window_clones.length; i++) { + this._window_clones[i].destroy(); + } + + this._window_clones = []; } } }; diff --git a/src/Makefile.am b/src/Makefile.am index 8fb38e4d4..7eeede8b3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -38,6 +38,7 @@ Shell-0.1.gir: libgnome-shell-introspect.la $(libgnome_shell_la_SOURCES) --nsversion=0.1 \ --include=GObject-2.0 \ --include=Clutter-0.8 \ + --include=Meta-2.25 \ --library=gnome-shell-introspect \ $(libgnome_shell_la_SOURCES) \ $(INCLUDES) \ diff --git a/src/metacity-symbols.c b/src/metacity-symbols.c index b54207533..29e559c30 100644 --- a/src/metacity-symbols.c +++ b/src/metacity-symbols.c @@ -14,6 +14,11 @@ mutter_plugin_get_stage (MutterPlugin *plugin) return NULL; } +GList * +mutter_plugin_get_windows (MutterPlugin *plugin) +{ +} + void mutter_plugin_query_screen_size (MutterPlugin *plugin, int *width, diff --git a/src/shell-global.c b/src/shell-global.c index 975b4f528..4db582460 100644 --- a/src/shell-global.c +++ b/src/shell-global.c @@ -159,6 +159,21 @@ shell_global_set_stage_input_area (ShellGlobal *global, mutter_plugin_set_stage_input_area (global->plugin, x, y, width, height); } +/** + * shell_global_get_windows: + * + * Gets the list of MutterWindows for the plugin's screen + * + * Return value: (element-type MutterWindow) (transfer none): the list of windows + */ +GList * +shell_global_get_windows (ShellGlobal *global) +{ + g_return_if_fail (SHELL_IS_GLOBAL (global)); + + return mutter_plugin_get_windows (global->plugin); +} + void _shell_global_set_plugin (ShellGlobal *global, MutterPlugin *plugin) diff --git a/src/shell-global.h b/src/shell-global.h index 83a355f0c..b33d49909 100644 --- a/src/shell-global.h +++ b/src/shell-global.h @@ -21,12 +21,13 @@ GType shell_global_get_type (void) G_GNUC_CONST; ShellGlobal *shell_global_get (void); -void -shell_global_set_stage_input_area (ShellGlobal *global, - int x, - int y, - int width, - int height); +void shell_global_set_stage_input_area (ShellGlobal *global, + int x, + int y, + int width, + int height); + +GList *shell_global_get_windows (ShellGlobal *global); void _shell_global_set_plugin (ShellGlobal *global, MutterPlugin *plugin);