version 1.3, 2009/06/23 20:17:30 |
version 1.4, 2009/06/24 22:04:18 |
|
|
char * |
char * |
window_pane_search(struct window_pane *wp, const char *searchstr) |
window_pane_search(struct window_pane *wp, const char *searchstr) |
{ |
{ |
const struct grid_cell *gc; |
struct screen *s = &wp->base; |
const struct grid_utf8 *gu; |
char *line, *ptr; |
char *buf, *s; |
u_int i; |
size_t off; |
|
u_int i, j, k; |
|
|
|
buf = xmalloc(1); |
ptr = NULL; |
|
for (i = 0; i < screen_size_y(s); i++) { |
for (j = 0; j < screen_size_y(&wp->base); j++) { |
line = grid_view_string_cells(s->grid, 0, i, screen_size_x(s)); |
off = 0; |
log_debug("XXX %s", line); |
for (i = 0; i < screen_size_x(&wp->base); i++) { |
if ((ptr = strstr(line, searchstr)) != NULL) |
gc = grid_view_peek_cell(wp->base.grid, i, j); |
break; |
if (gc->flags & GRID_FLAG_UTF8) { |
xfree(line); |
gu = grid_view_peek_utf8(wp->base.grid, i, j); |
|
buf = xrealloc(buf, 1, off + 8); |
|
for (k = 0; k < UTF8_SIZE; k++) { |
|
if (gu->data[k] == 0xff) |
|
break; |
|
buf[off++] = gu->data[k]; |
|
} |
|
} else { |
|
buf = xrealloc(buf, 1, off + 1); |
|
buf[off++] = gc->data; |
|
} |
|
} |
|
while (off > 0 && buf[off - 1] == ' ') |
|
off--; |
|
buf[off] = '\0'; |
|
|
|
if ((s = strstr(buf, searchstr)) != NULL) { |
|
s = section_string(buf, off, s - buf, 40); |
|
xfree(buf); |
|
return (s); |
|
} |
|
} |
} |
|
if (ptr != NULL) { |
xfree(buf); |
ptr = section_string(line, strlen(ptr), ptr - line, 40); |
return (NULL); |
xfree(line); |
|
} |
|
return (ptr); |
} |
} |