Get rid of window_choose_list type.

pull/1/head
nicm 2015-04-25 18:56:05 +00:00
parent 1d1208e335
commit 05e7fbd60f
1 changed files with 51 additions and 41 deletions

View File

@ -49,8 +49,6 @@
* it reaches zero. * it reaches zero.
*/ */
ARRAY_DECL(window_pane_list, struct window_pane *);
/* Global window list. */ /* Global window list. */
struct windows windows; struct windows windows;
@ -64,7 +62,7 @@ void window_pane_timer_callback(int, short, void *);
void window_pane_read_callback(struct bufferevent *, void *); void window_pane_read_callback(struct bufferevent *, void *);
void window_pane_error_callback(struct bufferevent *, short, void *); void window_pane_error_callback(struct bufferevent *, short, void *);
struct window_pane *window_pane_choose_best(struct window_pane_list *); struct window_pane *window_pane_choose_best(struct window_pane **, u_int);
RB_GENERATE(windows, window, entry, window_cmp); RB_GENERATE(windows, window, entry, window_cmp);
@ -256,7 +254,7 @@ winlink_stack_remove(struct winlink_stack *stack, struct winlink *wl)
} }
struct window * struct window *
window_find_by_id_str(const char* s) window_find_by_id_str(const char *s)
{ {
const char *errstr; const char *errstr;
u_int id; u_int id;
@ -1149,17 +1147,17 @@ window_pane_search(struct window_pane *wp, const char *searchstr,
/* Get MRU pane from a list. */ /* Get MRU pane from a list. */
struct window_pane * struct window_pane *
window_pane_choose_best(struct window_pane_list *list) window_pane_choose_best(struct window_pane **list, u_int size)
{ {
struct window_pane *next, *best; struct window_pane *next, *best;
u_int i; u_int i;
if (ARRAY_LENGTH(list) == 0) if (size == 0)
return (NULL); return (NULL);
best = ARRAY_FIRST(list); best = list[0];
for (i = 1; i < ARRAY_LENGTH(list); i++) { for (i = 1; i < size; i++) {
next = ARRAY_ITEM(list, i); next = list[i];
if (next->active_point > best->active_point) if (next->active_point > best->active_point)
best = next; best = next;
} }
@ -1173,14 +1171,15 @@ window_pane_choose_best(struct window_pane_list *list)
struct window_pane * struct window_pane *
window_pane_find_up(struct window_pane *wp) window_pane_find_up(struct window_pane *wp)
{ {
struct window_pane *next, *best; struct window_pane *next, *best, **list;
u_int edge, left, right, end; u_int edge, left, right, end, size;
struct window_pane_list list;
int found; int found;
if (wp == NULL || !window_pane_visible(wp)) if (wp == NULL || !window_pane_visible(wp))
return (NULL); return (NULL);
ARRAY_INIT(&list);
list = NULL;
size = 0;
edge = wp->yoff; edge = wp->yoff;
if (edge == 0) if (edge == 0)
@ -1203,12 +1202,14 @@ window_pane_find_up(struct window_pane *wp)
found = 1; found = 1;
else if (end >= left && end <= right) else if (end >= left && end <= right)
found = 1; found = 1;
if (found) if (!found)
ARRAY_ADD(&list, next); continue;
list = xreallocarray(list, size + 1, sizeof *list);
list[size++] = next;
} }
best = window_pane_choose_best(&list); best = window_pane_choose_best(list, size);
ARRAY_FREE(&list); free(list);
return (best); return (best);
} }
@ -1216,14 +1217,15 @@ window_pane_find_up(struct window_pane *wp)
struct window_pane * struct window_pane *
window_pane_find_down(struct window_pane *wp) window_pane_find_down(struct window_pane *wp)
{ {
struct window_pane *next, *best; struct window_pane *next, *best, **list;
u_int edge, left, right, end; u_int edge, left, right, end, size;
struct window_pane_list list;
int found; int found;
if (wp == NULL || !window_pane_visible(wp)) if (wp == NULL || !window_pane_visible(wp))
return (NULL); return (NULL);
ARRAY_INIT(&list);
list = NULL;
size = 0;
edge = wp->yoff + wp->sy + 1; edge = wp->yoff + wp->sy + 1;
if (edge >= wp->window->sy) if (edge >= wp->window->sy)
@ -1246,12 +1248,14 @@ window_pane_find_down(struct window_pane *wp)
found = 1; found = 1;
else if (end >= left && end <= right) else if (end >= left && end <= right)
found = 1; found = 1;
if (found) if (!found)
ARRAY_ADD(&list, next); continue;
list = xreallocarray(list, size + 1, sizeof *list);
list[size++] = next;
} }
best = window_pane_choose_best(&list); best = window_pane_choose_best(list, size);
ARRAY_FREE(&list); free(list);
return (best); return (best);
} }
@ -1259,14 +1263,15 @@ window_pane_find_down(struct window_pane *wp)
struct window_pane * struct window_pane *
window_pane_find_left(struct window_pane *wp) window_pane_find_left(struct window_pane *wp)
{ {
struct window_pane *next, *best; struct window_pane *next, *best, **list;
u_int edge, top, bottom, end; u_int edge, top, bottom, end, size;
struct window_pane_list list;
int found; int found;
if (wp == NULL || !window_pane_visible(wp)) if (wp == NULL || !window_pane_visible(wp))
return (NULL); return (NULL);
ARRAY_INIT(&list);
list = NULL;
size = 0;
edge = wp->xoff; edge = wp->xoff;
if (edge == 0) if (edge == 0)
@ -1289,12 +1294,14 @@ window_pane_find_left(struct window_pane *wp)
found = 1; found = 1;
else if (end >= top && end <= bottom) else if (end >= top && end <= bottom)
found = 1; found = 1;
if (found) if (!found)
ARRAY_ADD(&list, next); continue;
list = xreallocarray(list, size + 1, sizeof *list);
list[size++] = next;
} }
best = window_pane_choose_best(&list); best = window_pane_choose_best(list, size);
ARRAY_FREE(&list); free(list);
return (best); return (best);
} }
@ -1302,14 +1309,15 @@ window_pane_find_left(struct window_pane *wp)
struct window_pane * struct window_pane *
window_pane_find_right(struct window_pane *wp) window_pane_find_right(struct window_pane *wp)
{ {
struct window_pane *next, *best; struct window_pane *next, *best, **list;
u_int edge, top, bottom, end; u_int edge, top, bottom, end, size;
struct window_pane_list list;
int found; int found;
if (wp == NULL || !window_pane_visible(wp)) if (wp == NULL || !window_pane_visible(wp))
return (NULL); return (NULL);
ARRAY_INIT(&list);
list = NULL;
size = 0;
edge = wp->xoff + wp->sx + 1; edge = wp->xoff + wp->sx + 1;
if (edge >= wp->window->sx) if (edge >= wp->window->sx)
@ -1332,12 +1340,14 @@ window_pane_find_right(struct window_pane *wp)
found = 1; found = 1;
else if (end >= top && end <= bottom) else if (end >= top && end <= bottom)
found = 1; found = 1;
if (found) if (!found)
ARRAY_ADD(&list, next); continue;
list = xreallocarray(list, size + 1, sizeof *list);
list[size++] = next;
} }
best = window_pane_choose_best(&list); best = window_pane_choose_best(list, size);
ARRAY_FREE(&list); free(list);
return (best); return (best);
} }