[gnome-shell] boxpointer: Change the alternate drawing of boxpointer arrows
- From: Dan Winship <danw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] boxpointer: Change the alternate drawing of boxpointer arrows
- Date: Wed, 9 Feb 2011 17:49:37 +0000 (UTC)
commit 70dd9c9d3dbf44b849ea42826042bcc64668cbe1
Author: Sardem FF7 <sardemff7 pub gmail com>
Date: Wed Feb 2 23:13:55 2011 +0100
boxpointer: Change the alternate drawing of boxpointer arrows
To avoid some "jumping" of the arrow, draw it diagonally when needed.
It makes animations smoother.
https://bugzilla.gnome.org/show_bug.cgi?id=641726
js/ui/boxpointer.js | 138 ++++++++++++---------------------------------------
1 files changed, 32 insertions(+), 106 deletions(-)
---
diff --git a/js/ui/boxpointer.js b/js/ui/boxpointer.js
index 5479a27..ecdfeb5 100644
--- a/js/ui/boxpointer.js
+++ b/js/ui/boxpointer.js
@@ -27,7 +27,6 @@ BoxPointer.prototype = {
_init: function(arrowSide, binProperties) {
this._arrowSide = arrowSide;
this._arrowOrigin = 0;
- this._arrowCorner = null;
this.actor = new St.Bin({ x_fill: true,
y_fill: true });
this._container = new Shell.GenericContainer();
@@ -218,135 +217,84 @@ BoxPointer.prototype = {
cr.moveTo(x1 + borderRadius, y1);
if (this._arrowSide == St.Side.TOP) {
- if (this._arrowCorner == St.Corner.TOPLEFT) {
- cr.moveTo(x1, y1);
- cr.lineTo(x1, y1 - rise);
- cr.lineTo(x1 + halfBase, y1);
- cr.lineTo(x2 - borderRadius, y1);
- } else if (this._arrowCorner == St.Corner.TOPRIGHT) {
- cr.lineTo(x2 - halfBase, y1);
- cr.lineTo(x2, y1 - rise);
- } else if (this._arrowOrigin < (x1 + (borderRadius + halfBase))) {
- cr.lineTo(this._arrowOrigin, y1);
+ if (this._arrowOrigin < (x1 + (borderRadius + halfBase))) {
cr.lineTo(this._arrowOrigin, y1 - rise);
- cr.lineTo(this._arrowOrigin + halfBase, y1);
- cr.lineTo(x2 - borderRadius, y1);
+ cr.lineTo(Math.max(x1 + borderRadius, this._arrowOrigin) + halfBase, y1);
} else if (this._arrowOrigin > (x2 - (borderRadius + halfBase))) {
- cr.lineTo(this._arrowOrigin - halfBase, y1);
+ cr.lineTo(Math.min(x2 - borderRadius, this._arrowOrigin) - halfBase, y1);
cr.lineTo(this._arrowOrigin, y1 - rise);
- cr.lineTo(this._arrowOrigin, y1);
- cr.lineTo(x2 - borderRadius, y1);
} else {
cr.lineTo(this._arrowOrigin - halfBase, y1);
cr.lineTo(this._arrowOrigin, y1 - rise);
cr.lineTo(this._arrowOrigin + halfBase, y1);
- cr.lineTo(x2 - borderRadius, y1);
}
- } else
- cr.lineTo(x2 - borderRadius, y1);
+ }
+
+ cr.lineTo(x2 - borderRadius, y1);
// top-right corner
- if (this._arrowCorner != St.Corner.TOPRIGHT)
- cr.arc(x2 - borderRadius, y1 + borderRadius, borderRadius,
- 3*Math.PI/2, Math.PI*2);
+ cr.arc(x2 - borderRadius, y1 + borderRadius, borderRadius,
+ 3*Math.PI/2, Math.PI*2);
if (this._arrowSide == St.Side.RIGHT) {
- if (this._arrowCorner == St.Corner.TOPRIGHT) {
- cr.lineTo(x2, y1);
- cr.lineTo(x2 + rise, y1);
- cr.lineTo(x2, y1 + halfBase);
- cr.lineTo(x2, y2 - borderRadius);
- } else if (this._arrowCorner == St.Corner.BOTTOMRIGHT) {
- cr.moveTo(x2, y2 - halfBase);
- cr.lineTo(x2 + rise, y2);
- } else if (this._arrowOrigin < (y1 + (borderRadius + halfBase))) {
- cr.lineTo(x2, this._arrowOrigin);
+ if (this._arrowOrigin < (y1 + (borderRadius + halfBase))) {
cr.lineTo(x2 + rise, this._arrowOrigin);
- cr.lineTo(x2, this._arrowOrigin + halfBase);
- cr.lineTo(x2, y2 - borderRadius);
+ cr.lineTo(x2, Math.max(y1 + borderRadius, this._arrowOrigin) + halfBase);
} else if (this._arrowOrigin > (y2 - (borderRadius + halfBase))) {
- cr.lineTo(x2, this._arrowOrigin - halfBase);
+ cr.lineTo(x2, Math.min(y2 - borderRadius, this._arrowOrigin) - halfBase);
cr.lineTo(x2 + rise, this._arrowOrigin);
- cr.lineTo(x2, this._arrowOrigin);
- cr.lineTo(x2, y2 - borderRadius);
} else {
cr.lineTo(x2, this._arrowOrigin - halfBase);
cr.lineTo(x2 + rise, this._arrowOrigin);
cr.lineTo(x2, this._arrowOrigin + halfBase);
- cr.lineTo(x2, y2 - borderRadius);
}
- } else
- cr.lineTo(x2, y2 - borderRadius);
+ }
+
+ cr.lineTo(x2, y2 - borderRadius);
// bottom-right corner
- if (this._arrowCorner != St.Corner.BOTTOMRIGHT)
- cr.arc(x2 - borderRadius, y2 - borderRadius, borderRadius,
- 0, Math.PI/2);
+ cr.arc(x2 - borderRadius, y2 - borderRadius, borderRadius,
+ 0, Math.PI/2);
if (this._arrowSide == St.Side.BOTTOM) {
- if (this._arrowCorner == St.Corner.BOTTOMLEFT) {
- cr.lineTo(x1 + halfBase, y2);
- cr.lineTo(x1, y2 + rise);
- } else if (this._arrowCorner == St.Corner.BOTTOMRIGHT) {
- cr.lineTo(x2, y2 + rise);
- cr.lineTo(x2 - halfBase, y2);
- cr.lineTo(x1 + borderRadius, y2);
- } else if (this._arrowOrigin < (x1 + (borderRadius + halfBase))) {
- cr.lineTo(this._arrowOrigin + halfBase, y2);
+ if (this._arrowOrigin < (x1 + (borderRadius + halfBase))) {
+ cr.lineTo(Math.max(x1 + borderRadius, this._arrowOrigin) + halfBase, y2);
cr.lineTo(this._arrowOrigin, y2 + rise);
- cr.lineTo(this._arrowOrigin, y2);
- cr.lineTo(x1 + borderRadius, y2);
} else if (this._arrowOrigin > (x2 - (borderRadius + halfBase))) {
- cr.lineTo(this._arrowOrigin, y2);
cr.lineTo(this._arrowOrigin, y2 + rise);
- cr.lineTo(this._arrowOrigin - halfBase, y2);
- cr.lineTo(x1 + borderRadius, y2);
+ cr.lineTo(Math.min(x2 - borderRadius, this._arrowOrigin) - halfBase, y2);
} else {
cr.lineTo(this._arrowOrigin + halfBase, y2);
cr.lineTo(this._arrowOrigin, y2 + rise);
cr.lineTo(this._arrowOrigin - halfBase, y2);
- cr.lineTo(x1 + borderRadius, y2);
}
- } else
- cr.lineTo(x1 + borderRadius, y2);
+ }
+
+ cr.lineTo(x1 + borderRadius, y2);
// bottom-left corner
- if (this._arrowCorner != St.Corner.BOTTOMLEFT)
- cr.arc(x1 + borderRadius, y2 - borderRadius, borderRadius,
- Math.PI/2, Math.PI);
+ cr.arc(x1 + borderRadius, y2 - borderRadius, borderRadius,
+ Math.PI/2, Math.PI);
if (this._arrowSide == St.Side.LEFT) {
- if (this._arrowCorner == St.Corner.TOPLEFT) {
- cr.lineTo(x2, y1 + halfBase);
- cr.lineTo(x1 - rise, y1);
- } else if (this._arrowCorner == St.Corner.BOTTOMLEFT) {
- cr.lineTo(x1 + rise, y2);
- cr.moveTo(x1, y2 - halfBase);
- } else if (this._arrowOrigin < (y1 + (borderRadius + halfBase))) {
- cr.lineTo(x1, this._arrowOrigin + halfBase);
+ if (this._arrowOrigin < (y1 + (borderRadius + halfBase))) {
+ cr.lineTo(x1, Math.max(y1 + borderRadius, this._arrowOrigin) + halfBase);
cr.lineTo(x1 - rise, this._arrowOrigin);
- cr.lineTo(x1, this._arrowOrigin);
- cr.lineTo(x1, y1 + borderRadius);
} else if (this._arrowOrigin > (y2 - (borderRadius + halfBase))) {
- cr.lineTo(x1, this._arrowOrigin);
cr.lineTo(x1 - rise, this._arrowOrigin);
- cr.lineTo(x1, this._arrowOrigin - halfBase);
- cr.lineTo(x1, y1 + borderRadius);
+ cr.lineTo(x1, Math.min(y2 - borderRadius, this._arrowOrigin) - halfBase);
} else {
cr.lineTo(x1, this._arrowOrigin + halfBase);
cr.lineTo(x1 - rise, this._arrowOrigin);
cr.lineTo(x1, this._arrowOrigin - halfBase);
- cr.lineTo(x1, y1 + borderRadius);
}
- } else
- cr.lineTo(x1, y1 + borderRadius);
+ }
+
+ cr.lineTo(x1, y1 + borderRadius);
// top-left corner
- if (this._arrowCorner != St.Corner.TOPLEFT)
- cr.arc(x1 + borderRadius, y1 + borderRadius, borderRadius,
- Math.PI, 3*Math.PI/2);
- else
- cr.lineTo(x1, y1);
+ cr.arc(x1 + borderRadius, y1 + borderRadius, borderRadius,
+ Math.PI, 3*Math.PI/2);
Clutter.cairo_set_source_color(cr, backgroundColor);
cr.fillPreserve();
@@ -375,10 +323,7 @@ BoxPointer.prototype = {
let halfBase = themeNode.get_length('-arrow-base') / 2;
let borderRadius = themeNode.get_length('-arrow-border-radius');
- let margin = 2 * borderRadius + halfBorder;
-
let resX, resY;
- this._arrowCorner = null;
switch (this._arrowSide) {
case St.Side.TOP:
@@ -411,15 +356,6 @@ BoxPointer.prototype = {
resX = sourceCenterX - natWidth + (halfBase + borderRadius + halfBorder);
break;
}
- if (sourceCenterX < margin) {
- // Not enough space to the top
- this._arrowCorner = (this._arrowSide == St.Side.TOP) ? St.Corner.TOPLEFT : St.Corner.BOTTOMLEFT;
- resX = primary.x + 10;
- } else if (sourceCenterX > (primary.x + primary.width - margin)) {
- // Not enough space to the botom
- this._arrowCorner = (this._arrowSide == St.Side.TOP) ? St.Corner.TOPRIGHT : St.Corner.BOTTOMRIGHT;
- resX = primary.x + primary.width - (10 + natWidth);
- }
resX = Math.max(resX, primary.x + 10);
resX = Math.min(resX, primary.x + primary.width - (10 + natWidth));
@@ -439,16 +375,6 @@ BoxPointer.prototype = {
resY = sourceCenterY - natHeight + (halfBase + borderRadius + halfBorder);
break;
}
- if (sourceCenterY < margin) {
- // Not enough space to the left
- this._arrowCorner = (this._arrowSide == St.Side.LEFT) ? St.Corner.TOPLEFT : St.Corner.TORIGHT;
- resY = 10;
- }
- else if (sourceCenterY > (primary.y + primary.height - margin)) {
- // Not enough space to the right
- this._arrowCorner = (this._arrowSide == St.Side.LEFT) ? St.Corner.BOTTOMLEFT : St.Corner.BOTTOMRIGHT;
- resY = primary.y + primary.height - (10 + natHeight);
- }
resY = Math.max(resY, primary.y + 10);
resY = Math.min(resY, primary.y + primary.height - (10 + natHeight));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]