From 598eeab09f9c377e65f886b147e037e7972dadf9 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Sat, 24 Aug 2013 05:10:43 +0200 Subject: [PATCH] Re-wrote shift_active_win() to manipulate chain by merely changing the chain pointers instead of actually re-building the whole window chain. Uses new internal helper functions shift_win_forward() / shift_win_backward(). --- src/windows.c | 111 +++++++++++++++++++++++++++++++++++++++++++++++++- src/windows.h | 7 +--- 2 files changed, 112 insertions(+), 6 deletions(-) diff --git a/src/windows.c b/src/windows.c index 2c29a1d..ec176ed 100644 --- a/src/windows.c +++ b/src/windows.c @@ -58,6 +58,12 @@ static void draw_wins_bordercorners(struct Win * w, WINDOW * pad); +/* Shift active window forwards / backwards in window chain. */ +static void shift_win_forward(struct WinMeta * wmeta); +static void shift_win_backward(struct WinMeta * wmeta); + + + static uint8_t refit_pad(struct WinMeta * wmeta) { /* Determine rightmost window column. */ @@ -269,6 +275,88 @@ static void draw_wins_bordercorners(struct Win * w, WINDOW * pad) +static void shift_win_forward(struct WinMeta * wmeta) +{ + if (wmeta->active == wmeta->chain_end) + { + wmeta->chain_end = wmeta->active->prev; + wmeta->chain_end->next = 0; + wmeta->active->next = wmeta->chain_start; + wmeta->active->next->prev = wmeta->active; + wmeta->chain_start = wmeta->active; + wmeta->chain_start->prev = 0; + } + else + { + struct Win * old_prev = wmeta->active->prev; + struct Win * old_next = wmeta->active->next; + if (wmeta->chain_end == wmeta->active->next) + { + wmeta->chain_end = wmeta->active; + wmeta->active->next = 0; + } + else + { + wmeta->active->next = old_next->next; + wmeta->active->next->prev = wmeta->active; + } + if (wmeta->chain_start == wmeta->active) + { + wmeta->chain_start = old_next; + } + else + { + old_prev->next = old_next; + } + old_next->prev = old_prev; + old_next->next = wmeta->active; + wmeta->active->prev = old_next; + } +} + + + +static void shift_win_backward(struct WinMeta * wmeta) +{ + if (wmeta->active == wmeta->chain_start) + { + wmeta->chain_start = wmeta->active->next; + wmeta->chain_start->prev = 0; + wmeta->active->prev = wmeta->chain_end; + wmeta->active->prev->next = wmeta->active; + wmeta->chain_end = wmeta->active; + wmeta->chain_end->next = 0; + } + else + { + struct Win * old_prev = wmeta->active->prev; + struct Win * old_next = wmeta->active->next; + if (wmeta->chain_start == wmeta->active->prev) + { + wmeta->chain_start = wmeta->active; + wmeta->active->prev = 0; + } + else + { + wmeta->active->prev = old_prev->prev; + wmeta->active->prev->next = wmeta->active; + } + if (wmeta->chain_end == wmeta->active) + { + wmeta->chain_end = old_prev; + } + else + { + old_next->prev = old_prev; + } + old_prev->next = old_next; + old_prev->prev = wmeta->active; + wmeta->active->next = old_prev; + } +} + + + extern uint8_t init_win_meta(WINDOW * screen, struct WinMeta * wmeta) { wmeta->screen = screen; @@ -445,7 +533,7 @@ extern void cycle_active_win(struct WinMeta * wmeta, char dir) -extern uint8_t shift_active_win(struct WinMeta * wmeta, char dir) +extern uint8_t shift_active_win_old(struct WinMeta * wmeta, char dir) { if (0 != wmeta->active /* No shifting with less */ && wmeta->chain_start != wmeta->chain_end /* than 2 windows visible. */ @@ -548,6 +636,27 @@ extern uint8_t shift_active_win(struct WinMeta * wmeta, char dir) +extern void shift_active_win(struct WinMeta * wmeta, char dir) +{ + if ( 0 == wmeta->active + || wmeta->chain_start == wmeta->chain_end + || (dir != 'f' && dir != 'b')) + { + return; + } + if ('f' == dir) + { + shift_win_forward(wmeta); + } + else + { + shift_win_backward(wmeta); + } + update_wins(wmeta, wmeta->chain_start); +} + + + extern void draw_all_wins(struct WinMeta * wmeta) { /* Empty everything before filling it a-new. */ diff --git a/src/windows.h b/src/windows.h index 9414dd5..3a6ebd5 100644 --- a/src/windows.h +++ b/src/windows.h @@ -148,11 +148,8 @@ extern void cycle_active_win(struct WinMeta * wmeta, char dir); /* Move active window forwards (set dir="f") or backwards (set dir="b"). Wrap - * around in the window chain if start / end of it is met. - * - * Return 0 on success, and 1 on (ncurses window/pad memory allocation) error. - */ -extern uint8_t shift_active_win(struct WinMeta * wmeta, char dir); + * around in the window chain if start / end of it is met. */ +extern void shift_active_win(struct WinMeta * wmeta, char dir); -- 2.30.2