diff options
author | Eamon Walsh <ewalsh@tycho.nsa.gov> | 2011-07-26 20:42:08 -0400 |
---|---|---|
committer | Eamon Walsh <ewalsh@tycho.nsa.gov> | 2011-07-26 20:42:08 -0400 |
commit | 74c1151600649203e5f848b565cf6d96d7028101 (patch) | |
tree | 42ba934eee7eeb07204ad02baa2b37f4c395ac3c | |
parent | 46aaf66b3b57d19a66634368922959666ac5d21f (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.c | 21 | ||||
-rw-r--r-- | src/display.h | 3 | ||||
-rw-r--r-- | src/view.c | 20 |
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); @@ -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; } |