[gnome-shell] [AppSwitcher] Use GenericContainer instead of BigBox.
- From: Steve Frécinaux <sfre src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-shell] [AppSwitcher] Use GenericContainer instead of BigBox.
- Date: Fri, 2 Oct 2009 12:18:39 +0000 (UTC)
commit 68e8b14b8bf3e5f470cacfe599ea36cd4e81362d
Author: Steve Frécinaux <code istique net>
Date: Wed Sep 30 11:28:32 2009 +0200
[AppSwitcher] Use GenericContainer instead of BigBox.
This allows defining some custom policy for size allocation.
Currently, the minimum width is always used, but it can be tweaked
afterwards when a sizing policy has been defined.
https://bugzilla.gnome.org/show_bug.cgi?id=590563
js/ui/altTab.js | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 62 insertions(+), 3 deletions(-)
---
diff --git a/js/ui/altTab.js b/js/ui/altTab.js
index 827ae6f..1523367 100644
--- a/js/ui/altTab.js
+++ b/js/ui/altTab.js
@@ -36,8 +36,16 @@ AltTabPopup.prototype = {
reactive: true });
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
- this._appsBox = new Big.Box({ spacing: POPUP_APPS_BOX_SPACING,
- orientation: Big.BoxOrientation.HORIZONTAL });
+ // Here we use a GenericContainer instead of a BigBox in order to be
+ // able to handle allocation. In particular, we want all the alt+tab
+ // popup items to be the same size.
+ this._appsBox = new Shell.GenericContainer();
+ this._appsBox.spacing = POPUP_APPS_BOX_SPACING;
+
+ this._appsBox.connect('get-preferred-width', Lang.bind(this, this._appsBoxGetPreferredWidth));
+ this._appsBox.connect('get-preferred-height', Lang.bind(this, this._appsBoxGetPreferredHeight));
+ this._appsBox.connect('allocate', Lang.bind(this, this._appsBoxAllocate));
+
let gcenterbox = new Big.Box({ orientation: Big.BoxOrientation.HORIZONTAL,
x_align: Big.BoxAlignment.CENTER });
gcenterbox.append(this._appsBox, Big.BoxPackFlags.NONE);
@@ -69,7 +77,7 @@ AltTabPopup.prototype = {
this._icons.push(appIcon);
this._currentWindows.push(appIcon.windows[0]);
- this._appsBox.append(appIcon.actor, Big.BoxPackFlags.NONE);
+ this._appsBox.add_actor(appIcon.actor);
},
show : function(initialSelection) {
@@ -174,6 +182,57 @@ AltTabPopup.prototype = {
}
},
+ _appsBoxGetPreferredWidth: function (actor, forHeight, alloc) {
+ let children = this._appsBox.get_children();
+ let maxChildMin = 0;
+ let maxChildNat = 0;
+
+ for (let i = 0; i < children.length; i++) {
+ let [childMin, childNat] = children[i].get_preferred_width(forHeight);
+ maxChildMin = Math.max(childMin, maxChildMin);
+ maxChildNat = Math.max(childNat, maxChildNat);
+ }
+
+ let totalSpacing = this._appsBox.spacing * (children.length - 1);
+ alloc.min_size = children.length * maxChildMin + totalSpacing;
+ alloc.nat_size = children.length * maxChildNat + totalSpacing;
+ },
+
+ _appsBoxGetPreferredHeight: function (actor, forWidth, alloc) {
+ let children = this._appsBox.get_children();
+ let maxChildMin = 0;
+ let maxChildNat = 0;
+
+ for (let i = 0; i < children.length; i++) {
+ let [childMin, childNat] = children[i].get_preferred_height(forWidth);
+ maxChildMin = Math.max(childMin, maxChildMin);
+ maxChildNat = Math.max(childNat, maxChildNat);
+ }
+
+ alloc.min_size = maxChildMin;
+ alloc.nat_size = maxChildNat;
+ },
+
+ _appsBoxAllocate: function (actor, box, flags) {
+ let children = this._appsBox.get_children();
+ let totalSpacing = this._appsBox.spacing * (children.length - 1);
+ let childHeight = box.y2 - box.y1;
+ let childWidth = Math.max(0, box.x2 - box.x1 - totalSpacing) / children.length;
+
+ let x = box.x1;
+ for (let i = 0; i < children.length; i++) {
+ let [childMin, childNat] = children[i].get_preferred_height(childWidth);
+ let vSpacing = (childHeight - childNat) / 2;
+ let childBox = new Clutter.ActorBox();
+ childBox.x1 = x;
+ childBox.y1 = vSpacing;
+ childBox.x2 = x + childWidth;
+ childBox.y2 = childHeight - vSpacing;
+ children[i].allocate(childBox, flags);
+ x += this._appsBox.spacing + childWidth;
+ }
+ },
+
_keyPressEvent : function(actor, event) {
let keysym = event.get_key_symbol();
let backwards = (event.get_state() & Clutter.ModifierType.SHIFT_MASK);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]