version 1.49, 2010/03/01 23:53:27 |
version 1.50, 2010/03/02 00:32:41 |
|
|
void window_copy_resize(struct window_pane *, u_int, u_int); |
void window_copy_resize(struct window_pane *, u_int, u_int); |
void window_copy_key(struct window_pane *, struct client *, int); |
void window_copy_key(struct window_pane *, struct client *, int); |
int window_copy_key_input(struct window_pane *, int); |
int window_copy_key_input(struct window_pane *, int); |
|
int window_copy_key_numeric_prefix(struct window_pane *, int); |
void window_copy_mouse( |
void window_copy_mouse( |
struct window_pane *, struct client *, struct mouse_event *); |
struct window_pane *, struct client *, struct mouse_event *); |
|
|
|
|
|
|
enum window_copy_input_type { |
enum window_copy_input_type { |
WINDOW_COPY_OFF, |
WINDOW_COPY_OFF, |
|
WINDOW_COPY_NUMERICPREFIX, |
WINDOW_COPY_SEARCHUP, |
WINDOW_COPY_SEARCHUP, |
WINDOW_COPY_SEARCHDOWN, |
WINDOW_COPY_SEARCHDOWN, |
WINDOW_COPY_GOTOLINE, |
WINDOW_COPY_GOTOLINE, |
|
|
const char *inputprompt; |
const char *inputprompt; |
char *inputstr; |
char *inputstr; |
|
|
|
u_int numprefix; |
|
|
enum window_copy_input_type searchtype; |
enum window_copy_input_type searchtype; |
char *searchstr; |
char *searchstr; |
}; |
}; |
|
|
data->inputtype = WINDOW_COPY_OFF; |
data->inputtype = WINDOW_COPY_OFF; |
data->inputprompt = NULL; |
data->inputprompt = NULL; |
data->inputstr = xstrdup(""); |
data->inputstr = xstrdup(""); |
|
data->numprefix = 0; |
|
|
data->searchtype = WINDOW_COPY_OFF; |
data->searchtype = WINDOW_COPY_OFF; |
data->searchstr = NULL; |
data->searchstr = NULL; |
|
|
const char *word_separators; |
const char *word_separators; |
struct window_copy_mode_data *data = wp->modedata; |
struct window_copy_mode_data *data = wp->modedata; |
struct screen *s = &data->screen; |
struct screen *s = &data->screen; |
u_int n; |
u_int n, np; |
int keys; |
int keys; |
enum mode_key_cmd cmd; |
enum mode_key_cmd cmd; |
|
|
if (data->inputtype != WINDOW_COPY_OFF) { |
np = data->numprefix; |
|
if (np == 0) |
|
np = 1; |
|
|
|
if (data->inputtype == WINDOW_COPY_NUMERICPREFIX) { |
|
if (window_copy_key_numeric_prefix(wp, key) == 0) |
|
return; |
|
data->inputtype = WINDOW_COPY_OFF; |
|
window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1); |
|
} else if (data->inputtype != WINDOW_COPY_OFF) { |
if (window_copy_key_input(wp, key) != 0) |
if (window_copy_key_input(wp, key) != 0) |
goto input_off; |
goto input_off; |
return; |
return; |
|
|
cmd = mode_key_lookup(&data->mdata, key); |
cmd = mode_key_lookup(&data->mdata, key); |
switch (cmd) { |
switch (cmd) { |
case MODEKEYCOPY_CANCEL: |
case MODEKEYCOPY_CANCEL: |
window_pane_reset_mode(wp); |
for (; np != 0; np--) |
|
window_pane_reset_mode(wp); |
break; |
break; |
case MODEKEYCOPY_LEFT: |
case MODEKEYCOPY_LEFT: |
window_copy_cursor_left(wp); |
for (; np != 0; np--) |
return; |
window_copy_cursor_left(wp); |
|
break; |
case MODEKEYCOPY_RIGHT: |
case MODEKEYCOPY_RIGHT: |
window_copy_cursor_right(wp); |
for (; np != 0; np--) |
return; |
window_copy_cursor_right(wp); |
|
break; |
case MODEKEYCOPY_UP: |
case MODEKEYCOPY_UP: |
window_copy_cursor_up(wp, 0); |
for (; np != 0; np--) |
return; |
window_copy_cursor_up(wp, 0); |
|
break; |
case MODEKEYCOPY_DOWN: |
case MODEKEYCOPY_DOWN: |
window_copy_cursor_down(wp, 0); |
for (; np != 0; np--) |
return; |
window_copy_cursor_down(wp, 0); |
|
break; |
case MODEKEYCOPY_SCROLLUP: |
case MODEKEYCOPY_SCROLLUP: |
window_copy_cursor_up(wp, 1); |
for (; np != 0; np--) |
|
window_copy_cursor_up(wp, 1); |
break; |
break; |
case MODEKEYCOPY_SCROLLDOWN: |
case MODEKEYCOPY_SCROLLDOWN: |
window_copy_cursor_down(wp, 1); |
for (; np != 0; np--) |
|
window_copy_cursor_down(wp, 1); |
break; |
break; |
case MODEKEYCOPY_PREVIOUSPAGE: |
case MODEKEYCOPY_PREVIOUSPAGE: |
window_copy_pageup(wp); |
for (; np != 0; np--) |
|
window_copy_pageup(wp); |
break; |
break; |
case MODEKEYCOPY_NEXTPAGE: |
case MODEKEYCOPY_NEXTPAGE: |
n = 1; |
n = 1; |
if (screen_size_y(s) > 2) |
if (screen_size_y(s) > 2) |
n = screen_size_y(s) - 2; |
n = screen_size_y(s) - 2; |
if (data->oy < n) |
for (; np != 0; np--) { |
data->oy = 0; |
if (data->oy < n) |
else |
data->oy = 0; |
data->oy -= n; |
else |
|
data->oy -= n; |
|
} |
window_copy_update_selection(wp); |
window_copy_update_selection(wp); |
window_copy_redraw_screen(wp); |
window_copy_redraw_screen(wp); |
break; |
break; |
case MODEKEYCOPY_HALFPAGEUP: |
case MODEKEYCOPY_HALFPAGEUP: |
n = screen_size_y(s) / 2; |
n = screen_size_y(s) / 2; |
if (data->oy + n > screen_hsize(&wp->base)) |
for (; np != 0; np--) { |
data->oy = screen_hsize(&wp->base); |
if (data->oy + n > screen_hsize(&wp->base)) |
else |
data->oy = screen_hsize(&wp->base); |
data->oy += n; |
else |
|
data->oy += n; |
|
} |
window_copy_update_selection(wp); |
window_copy_update_selection(wp); |
window_copy_redraw_screen(wp); |
window_copy_redraw_screen(wp); |
break; |
break; |
case MODEKEYCOPY_HALFPAGEDOWN: |
case MODEKEYCOPY_HALFPAGEDOWN: |
n = screen_size_y(s) / 2; |
n = screen_size_y(s) / 2; |
if (data->oy < n) |
for (; np != 0; np--) { |
data->oy = 0; |
if (data->oy < n) |
else |
data->oy = 0; |
data->oy -= n; |
else |
|
data->oy -= n; |
|
} |
window_copy_update_selection(wp); |
window_copy_update_selection(wp); |
window_copy_redraw_screen(wp); |
window_copy_redraw_screen(wp); |
break; |
break; |
|
|
window_copy_cursor_end_of_line(wp); |
window_copy_cursor_end_of_line(wp); |
break; |
break; |
case MODEKEYCOPY_NEXTSPACE: |
case MODEKEYCOPY_NEXTSPACE: |
window_copy_cursor_next_word(wp, " "); |
for (; np != 0; np--) |
|
window_copy_cursor_next_word(wp, " "); |
break; |
break; |
case MODEKEYCOPY_NEXTSPACEEND: |
case MODEKEYCOPY_NEXTSPACEEND: |
window_copy_cursor_next_word_end(wp, " "); |
for (; np != 0; np--) |
|
window_copy_cursor_next_word_end(wp, " "); |
break; |
break; |
case MODEKEYCOPY_NEXTWORD: |
case MODEKEYCOPY_NEXTWORD: |
word_separators = |
word_separators = |
options_get_string(&wp->window->options, "word-separators"); |
options_get_string(&wp->window->options, "word-separators"); |
window_copy_cursor_next_word(wp, word_separators); |
for (; np != 0; np--) |
|
window_copy_cursor_next_word(wp, word_separators); |
break; |
break; |
case MODEKEYCOPY_NEXTWORDEND: |
case MODEKEYCOPY_NEXTWORDEND: |
word_separators = |
word_separators = |
options_get_string(&wp->window->options, "word-separators"); |
options_get_string(&wp->window->options, "word-separators"); |
window_copy_cursor_next_word_end(wp, word_separators); |
for (; np != 0; np--) |
|
window_copy_cursor_next_word_end(wp, word_separators); |
break; |
break; |
case MODEKEYCOPY_PREVIOUSSPACE: |
case MODEKEYCOPY_PREVIOUSSPACE: |
window_copy_cursor_previous_word(wp, " "); |
for (; np != 0; np--) |
|
window_copy_cursor_previous_word(wp, " "); |
break; |
break; |
case MODEKEYCOPY_PREVIOUSWORD: |
case MODEKEYCOPY_PREVIOUSWORD: |
word_separators = |
word_separators = |
options_get_string(&wp->window->options, "word-separators"); |
options_get_string(&wp->window->options, "word-separators"); |
window_copy_cursor_previous_word(wp, word_separators); |
for (; np != 0; np--) |
|
window_copy_cursor_previous_word(wp, word_separators); |
break; |
break; |
case MODEKEYCOPY_SEARCHUP: |
case MODEKEYCOPY_SEARCHUP: |
data->inputtype = WINDOW_COPY_SEARCHUP; |
data->inputtype = WINDOW_COPY_SEARCHUP; |
|
|
switch (data->searchtype) { |
switch (data->searchtype) { |
case WINDOW_COPY_OFF: |
case WINDOW_COPY_OFF: |
case WINDOW_COPY_GOTOLINE: |
case WINDOW_COPY_GOTOLINE: |
|
case WINDOW_COPY_NUMERICPREFIX: |
break; |
break; |
case WINDOW_COPY_SEARCHUP: |
case WINDOW_COPY_SEARCHUP: |
if (cmd == MODEKEYCOPY_SEARCHAGAIN) |
if (cmd == MODEKEYCOPY_SEARCHAGAIN) { |
window_copy_search_up(wp, data->searchstr); |
for (; np != 0; np--) { |
else |
window_copy_search_up( |
window_copy_search_down(wp, data->searchstr); |
wp, data->searchstr); |
|
} |
|
} else { |
|
for (; np != 0; np--) { |
|
window_copy_search_down( |
|
wp, data->searchstr); |
|
} |
|
} |
break; |
break; |
case WINDOW_COPY_SEARCHDOWN: |
case WINDOW_COPY_SEARCHDOWN: |
if (cmd == MODEKEYCOPY_SEARCHAGAIN) |
if (cmd == MODEKEYCOPY_SEARCHAGAIN) { |
window_copy_search_down(wp, data->searchstr); |
for (; np != 0; np--) { |
else |
window_copy_search_down( |
window_copy_search_up(wp, data->searchstr); |
wp, data->searchstr); |
|
} |
|
} else { |
|
for (; np != 0; np--) { |
|
window_copy_search_up( |
|
wp, data->searchstr); |
|
} |
|
} |
break; |
break; |
} |
} |
break; |
break; |
|
|
data->inputprompt = "Goto Line"; |
data->inputprompt = "Goto Line"; |
*data->inputstr = '\0'; |
*data->inputstr = '\0'; |
goto input_on; |
goto input_on; |
|
case MODEKEYCOPY_STARTNUMBERPREFIX: |
|
key &= 0xff; |
|
if (key >= '0' && key <= '9') { |
|
data->inputtype = WINDOW_COPY_NUMERICPREFIX; |
|
data->numprefix = 0; |
|
window_copy_key_numeric_prefix(wp, key); |
|
return; |
|
} |
|
break; |
case MODEKEYCOPY_RECTANGLETOGGLE: |
case MODEKEYCOPY_RECTANGLETOGGLE: |
window_copy_rectangle_toggle(wp); |
window_copy_rectangle_toggle(wp); |
return; |
break; |
default: |
default: |
break; |
break; |
} |
} |
|
|
|
data->numprefix = 0; |
return; |
return; |
|
|
input_on: |
input_on: |
|
|
struct window_copy_mode_data *data = wp->modedata; |
struct window_copy_mode_data *data = wp->modedata; |
struct screen *s = &data->screen; |
struct screen *s = &data->screen; |
size_t inputlen; |
size_t inputlen; |
|
u_int np; |
|
|
switch (mode_key_lookup(&data->mdata, key)) { |
switch (mode_key_lookup(&data->mdata, key)) { |
case MODEKEYEDIT_CANCEL: |
case MODEKEYEDIT_CANCEL: |
|
data->numprefix = 0; |
return (-1); |
return (-1); |
case MODEKEYEDIT_BACKSPACE: |
case MODEKEYEDIT_BACKSPACE: |
inputlen = strlen(data->inputstr); |
inputlen = strlen(data->inputstr); |
|
|
*data->inputstr = '\0'; |
*data->inputstr = '\0'; |
break; |
break; |
case MODEKEYEDIT_ENTER: |
case MODEKEYEDIT_ENTER: |
|
np = data->numprefix; |
|
if (np == 0) |
|
np = 1; |
|
|
switch (data->inputtype) { |
switch (data->inputtype) { |
case WINDOW_COPY_OFF: |
case WINDOW_COPY_OFF: |
|
case WINDOW_COPY_NUMERICPREFIX: |
break; |
break; |
case WINDOW_COPY_SEARCHUP: |
case WINDOW_COPY_SEARCHUP: |
window_copy_search_up(wp, data->inputstr); |
for (; np != 0; np--) |
|
window_copy_search_up(wp, data->inputstr); |
data->searchtype = data->inputtype; |
data->searchtype = data->inputtype; |
data->searchstr = xstrdup(data->inputstr); |
data->searchstr = xstrdup(data->inputstr); |
break; |
break; |
case WINDOW_COPY_SEARCHDOWN: |
case WINDOW_COPY_SEARCHDOWN: |
window_copy_search_down(wp, data->inputstr); |
for (; np != 0; np--) |
|
window_copy_search_down(wp, data->inputstr); |
data->searchtype = data->inputtype; |
data->searchtype = data->inputtype; |
data->searchstr = xstrdup(data->inputstr); |
data->searchstr = xstrdup(data->inputstr); |
break; |
break; |
|
|
*data->inputstr = '\0'; |
*data->inputstr = '\0'; |
break; |
break; |
} |
} |
|
data->numprefix = 0; |
return (1); |
return (1); |
case MODEKEY_OTHER: |
case MODEKEY_OTHER: |
if (key < 32 || key > 126) |
if (key < 32 || key > 126) |
|
|
return (0); |
return (0); |
} |
} |
|
|
|
int |
|
window_copy_key_numeric_prefix(struct window_pane *wp, int key) |
|
{ |
|
struct window_copy_mode_data *data = wp->modedata; |
|
struct screen *s = &data->screen; |
|
|
|
key &= 0xff; |
|
if (key < '0' || key > '9') |
|
return 1; |
|
|
|
if (data->numprefix >= 100) /* no more than three digits */ |
|
return 0; |
|
data->numprefix = data->numprefix * 10 + key - '0'; |
|
|
|
window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1); |
|
return 0; |
|
} |
|
|
/* ARGSUSED */ |
/* ARGSUSED */ |
void |
void |
window_copy_mouse( |
window_copy_mouse( |
|
|
screen_write_cursormove(ctx, screen_size_x(s) - size, 0); |
screen_write_cursormove(ctx, screen_size_x(s) - size, 0); |
screen_write_puts(ctx, &gc, "%s", hdr); |
screen_write_puts(ctx, &gc, "%s", hdr); |
} else if (py == last && data->inputtype != WINDOW_COPY_OFF) { |
} else if (py == last && data->inputtype != WINDOW_COPY_OFF) { |
xoff = size = xsnprintf(hdr, sizeof hdr, |
if (data->inputtype == WINDOW_COPY_NUMERICPREFIX) { |
"%s: %s", data->inputprompt, data->inputstr); |
xoff = size = xsnprintf(hdr, sizeof hdr, |
|
"Repeat: %u", data->numprefix); |
|
} else { |
|
xoff = size = xsnprintf(hdr, sizeof hdr, |
|
"%s: %s", data->inputprompt, data->inputstr); |
|
} |
screen_write_cursormove(ctx, 0, last); |
screen_write_cursormove(ctx, 0, last); |
screen_write_puts(ctx, &gc, "%s", hdr); |
screen_write_puts(ctx, &gc, "%s", hdr); |
} else |
} else |