gnome-shell r129 - trunk/js/ui



Author: walters
Date: Thu Dec 18 18:50:09 2008
New Revision: 129
URL: http://svn.gnome.org/viewvc/gnome-shell?rev=129&view=rev

Log:
Add full size icon+title to overlay

The icon+text is useful in order to distinguish between windows
that might look similar otherwise.

The implementation is not optimal:

* We create a new texture from the pixmap each time

http://bugzilla.gnome.org/show_bug.cgi?id=563406

Modified:
   trunk/js/ui/workspaces.js

Modified: trunk/js/ui/workspaces.js
==============================================================================
--- trunk/js/ui/workspaces.js	(original)
+++ trunk/js/ui/workspaces.js	Thu Dec 18 18:50:09 2008
@@ -2,16 +2,24 @@
 
 const Tweener = imports.tweener.tweener;
 const Clutter = imports.gi.Clutter;
+const GtkClutter = imports.gi.GtkClutter;
+const Pango = imports.gi.Pango;
 
 const Main = imports.ui.main;
 const Overlay = imports.ui.overlay;
 const Panel = imports.ui.panel;
 const Meta = imports.gi.Meta;
 const Shell = imports.gi.Shell;
+const Big = imports.gi.Big;
 
 // Windows are slightly translucent in the overlay mode
 const WINDOW_OPACITY = 0.9 * 255;
 
+const WINDOWCLONE_BG_COLOR = new Clutter.Color();
+WINDOWCLONE_BG_COLOR.from_pixel(0x000000f0);
+const WINDOWCLONE_TITLE_COLOR = new Clutter.Color();
+WINDOWCLONE_TITLE_COLOR.from_pixel(0xffffffff);
+
 // Define a layout scheme for small window counts. For larger
 // counts we fall back to an algorithm. We need more schemes here
 // unless we have a really good algorithm.
@@ -46,6 +54,8 @@
         this._width = width;
         this._height = height;
         this._workspaces = [];
+        
+        this._clones = [];
 
         let global = Shell.Global.get();
         let windows = global.get_windows();
@@ -118,9 +128,10 @@
                     win.is_override_redirect())
                     continue;
 
-                this._createWindowClone(wswindows[i], workspace,
+                let clone = this._createWindowClone(wswindows[i], workspace,
                                         wswindows.length - windowIndex - 1,
                                         wswindows.length);
+                this._clones.push(clone);
                 windowIndex++;
             }
         }
@@ -140,6 +151,9 @@
 
         this._positionWorkspaces(global, activeWorkspace);
         activeWorkspace.raise_top();
+        
+        this._clones.forEach(function (v, i, a) { if (v.cloneTitle) v.cloneTitle.destroy(); });
+        this._clones = [];
 
         for (let w = 0; w < this._workspaces.length; w++) {
             let workspace = this._workspaces[w];
@@ -320,6 +334,35 @@
                                        width: global.screen_width,
                                        height: global.screen_height });
     },
+    
+    _addCloneTitle : function (clone, window) {
+         let transformed = clone.get_transformed_size();
+         let icon = window.meta_window.mini_icon;
+         let iconTexture = new Clutter.Texture({ width: 16, height: 16, keep_aspect_ratio: true});
+         Shell.clutter_texture_set_from_pixbuf(iconTexture, icon);
+         let box = new Big.Box({background_color : WINDOWCLONE_BG_COLOR,
+                                y_align: Big.BoxAlignment.CENTER,
+                                corner_radius: 5,
+                                padding: 4,
+                                spacing: 4,
+                                orientation: Big.BoxOrientation.HORIZONTAL});
+         box.append(iconTexture, Big.BoxPackFlags.NONE);
+         let title = new Clutter.Label({color: WINDOWCLONE_TITLE_COLOR,
+                                        font_name: "Sans 14",
+                                        text: window.meta_window.title,
+                                        ellipsize: Pango.EllipsizeMode.END});
+         // Get current width (just the icon), with spacing, plus title
+         let width = box.width + box.spacing + title.width;
+         let maxWidth = transformed[0]; 
+         if (width > transformed[0])
+             width = transformed[0];
+         box.width = width;
+         box.append(title, Big.BoxPackFlags.EXPAND);
+         box.set_position(clone.x, clone.y);
+         let parent = clone.get_parent();
+         clone.cloneTitle = box;
+         parent.add_actor(box);
+    },
 
     // windowIndex == 0 => top in stacking order
     _computeWindowPosition : function(windowIndex, numberOfWindows) {
@@ -379,7 +422,10 @@
                            scale_y: scale,
                            time: Overlay.ANIMATION_TIME,
                            opacity: WINDOW_OPACITY,
-                           transition: "easeOutQuad"
+                           transition: "easeOutQuad",
+                           onComplete: function () {
+                               me._addCloneTitle(clone, w);
+                           }                               
                          });
 
         clone.connect("button-press-event",
@@ -387,6 +433,7 @@
                           clone.raise_top();
                           me._activateWindow(w, event.get_time());
                       });
+        return clone;
     },
 
     _activateWindow : function(w, time) {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]