summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEamon Walsh <ewalsh@tycho.nsa.gov>2011-07-26 20:42:08 -0400
committerEamon Walsh <ewalsh@tycho.nsa.gov>2011-07-26 20:42:08 -0400
commit74c1151600649203e5f848b565cf6d96d7028101 (patch)
tree42ba934eee7eeb07204ad02baa2b37f4c395ac3c
parent46aaf66b3b57d19a66634368922959666ac5d21f (diff)
Add display callback in view_stack().
This is necessary so that view thumbnails can be restacked properly. The callback is only called if the window stack actually changed.
-rw-r--r--src/display.c21
-rw-r--r--src/display.h3
-rw-r--r--src/view.c20
3 files changed, 37 insertions, 7 deletions
diff --git a/src/display.c b/src/display.c
index 100c7a4..86fd6f8 100644
--- a/src/display.c
+++ b/src/display.c
@@ -376,6 +376,27 @@ display_view_show(struct view *v)
return view_show(v->thumb);
}
+int
+display_view_stack(struct view *v, unsigned op, struct view *sibling)
+{
+ struct view *t = v->thumb;
+
+ switch (op) {
+ case VIEW_STACK_TOP:
+ t->window->RaiseToTop(t->window);
+ break;
+ case VIEW_STACK_BOTTOM:
+ t->window->LowerToBottom(t->window);
+ break;
+ case VIEW_STACK_ABOVE:
+ t->window->PutAtop(t->window, sibling->thumb->window);
+ break;
+ case VIEW_STACK_BELOW:
+ t->window->PutBelow(t->window, sibling->thumb->window);
+ break;
+ }
+}
+
void
display_view_remove(struct view *v)
{
diff --git a/src/display.h b/src/display.h
index fe69629..11407c2 100644
--- a/src/display.h
+++ b/src/display.h
@@ -111,6 +111,9 @@ display_view_move(struct view *view);
int
display_view_show(struct view *view);
+int
+display_view_stack(struct view *view, unsigned op, struct view *sibling);
+
void
display_view_remove(struct view *view);
diff --git a/src/view.c b/src/view.c
index 5f584dd..0b06e3e 100644
--- a/src/view.c
+++ b/src/view.c
@@ -269,6 +269,7 @@ view_show(struct view *v)
if (memcmp(&v->bpos, &zero, sizeof(zero)) == 0)
val = 0;
+ /* call display hook */
if (!(v->flags & VIEW_FLAGS_THUMBNAIL))
display_view_show(v);
@@ -371,21 +372,21 @@ view_stack(struct view *v, unsigned op, struct view *sibling)
switch (op) {
case VIEW_STACK_TOP:
if (TAILQ_FIRST(&d->views) == v)
- break;
+ goto out;
TAILQ_REMOVE(&d->views, v, display_next);
TAILQ_INSERT_HEAD(&d->views, v, display_next);
v->window->RaiseToTop(v->window);
break;
case VIEW_STACK_BOTTOM:
if (TAILQ_LAST(&d->views, view_tailq) == v)
- break;
+ goto out;
TAILQ_REMOVE(&d->views, v, display_next);
TAILQ_INSERT_TAIL(&d->views, v, display_next);
v->window->LowerToBottom(v->window);
break;
case VIEW_STACK_ABOVE:
if (TAILQ_FIRST(&d->views) == v)
- break;
+ goto out;
/*
* We need to not only stack above the sibling, but also above
* all other views immediately above sibling that do not belong
@@ -394,7 +395,7 @@ view_stack(struct view *v, unsigned op, struct view *sibling)
while ((prev = TAILQ_PREV(sibling, view_tailq, display_next)))
{
if (prev->buffer == v->buffer && prev != v)
- break;
+ goto out;
sibling = prev;
}
/*
@@ -402,7 +403,7 @@ view_stack(struct view *v, unsigned op, struct view *sibling)
* Also, this check prevents list corruption.
*/
if (v == sibling)
- break;
+ goto out;
TAILQ_REMOVE(&d->views, v, display_next);
TAILQ_INSERT_BEFORE(sibling, v, display_next);
@@ -410,15 +411,20 @@ view_stack(struct view *v, unsigned op, struct view *sibling)
break;
case VIEW_STACK_BELOW:
if (TAILQ_LAST(&d->views, view_tailq) == v)
- break;
+ goto out;
if (TAILQ_NEXT(sibling, display_next) == v)
- break;
+ goto out;
TAILQ_REMOVE(&d->views, v, display_next);
TAILQ_INSERT_AFTER(&d->views, sibling, v, display_next);
v->window->PutBelow(v->window, sibling->window);
break;
}
+ /* call display hook */
+ /* Only reached if the window stack actually changed. */
+ if (!(v->flags & VIEW_FLAGS_THUMBNAIL))
+ display_view_stack(v, op, sibling);
+out:
return 0;
}