diff options
author | Thomas Adam <thomas@xteddy.org> | 2015-04-20 15:44:27 +0100 |
---|---|---|
committer | Thomas Adam <thomas@xteddy.org> | 2015-04-20 15:44:27 +0100 |
commit | b25dc423b0b1369aaec5dee8e051d541bd55043f (patch) | |
tree | 4ee106369e8b28504959d1b43c56daf89e196240 /window-copy.c | |
parent | acb8248ba64e1c9770d39d9790439c74eb9e5d80 (diff) | |
parent | 0fd9a97202dc2878d9cf21f3bea01b599c21e61b (diff) | |
download | rtmux-b25dc423b0b1369aaec5dee8e051d541bd55043f.tar.gz rtmux-b25dc423b0b1369aaec5dee8e051d541bd55043f.tar.bz2 rtmux-b25dc423b0b1369aaec5dee8e051d541bd55043f.zip |
Merge branch 'obsd-master'
Diffstat (limited to 'window-copy.c')
-rw-r--r-- | window-copy.c | 223 |
1 files changed, 110 insertions, 113 deletions
diff --git a/window-copy.c b/window-copy.c index feb8c481..afa609ed 100644 --- a/window-copy.c +++ b/window-copy.c @@ -27,11 +27,10 @@ struct screen *window_copy_init(struct window_pane *); void window_copy_free(struct window_pane *); void window_copy_resize(struct window_pane *, u_int, u_int); -void window_copy_key(struct window_pane *, struct session *, int); +void window_copy_key(struct window_pane *, struct client *, struct session *, + int, struct mouse_event *); int window_copy_key_input(struct window_pane *, int); int window_copy_key_numeric_prefix(struct window_pane *, int); -void window_copy_mouse(struct window_pane *, struct session *, - struct mouse_event *); void window_copy_redraw_selection(struct window_pane *, u_int); void window_copy_redraw_lines(struct window_pane *, u_int, u_int); @@ -76,21 +75,22 @@ void window_copy_cursor_up(struct window_pane *, int); void window_copy_cursor_down(struct window_pane *, int); void window_copy_cursor_jump(struct window_pane *); void window_copy_cursor_jump_back(struct window_pane *); -void window_copy_cursor_jump_to(struct window_pane *); -void window_copy_cursor_jump_to_back(struct window_pane *); +void window_copy_cursor_jump_to(struct window_pane *, int); +void window_copy_cursor_jump_to_back(struct window_pane *, int); void window_copy_cursor_next_word(struct window_pane *, const char *); void window_copy_cursor_next_word_end(struct window_pane *, const char *); void window_copy_cursor_previous_word(struct window_pane *, const char *); void window_copy_scroll_up(struct window_pane *, u_int); void window_copy_scroll_down(struct window_pane *, u_int); void window_copy_rectangle_toggle(struct window_pane *); +void window_copy_drag_update(struct client *, struct mouse_event *); +void window_copy_drag_release(struct client *, struct mouse_event *); const struct window_mode window_copy_mode = { window_copy_init, window_copy_free, window_copy_resize, window_copy_key, - window_copy_mouse, NULL, }; @@ -124,38 +124,38 @@ enum window_copy_input_type { * mode ends). */ struct window_copy_mode_data { - struct screen screen; + struct screen screen; - struct screen *backing; - int backing_written; /* backing display has started */ + struct screen *backing; + int backing_written; /* backing display started */ - struct mode_key_data mdata; + struct mode_key_data mdata; - u_int oy; + u_int oy; - u_int selx; - u_int sely; + u_int selx; + u_int sely; - u_int rectflag; /* are we in rectangle copy mode? */ + u_int rectflag; /* are we in rectangle copy mode? */ - u_int cx; - u_int cy; + u_int cx; + u_int cy; - u_int lastcx; /* position in last line with content */ - u_int lastsx; /* size of last line with content */ + u_int lastcx; /* position in last line w/ content */ + u_int lastsx; /* size of last line w/ content */ enum window_copy_input_type inputtype; - const char *inputprompt; - char *inputstr; - int inputexit; + const char *inputprompt; + char *inputstr; + int inputexit; - int numprefix; + int numprefix; enum window_copy_input_type searchtype; - char *searchstr; + char *searchstr; enum window_copy_input_type jumptype; - char jumpchar; + char jumpchar; }; struct screen * @@ -193,8 +193,6 @@ window_copy_init(struct window_pane *wp) s = &data->screen; screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0); - if (options_get_number(&wp->window->options, "mode-mouse")) - s->mode |= MODE_MOUSE_STANDARD; keys = options_get_number(&wp->window->options, "mode-keys"); if (keys == MODEKEY_EMACS) @@ -367,19 +365,20 @@ window_copy_resize(struct window_pane *wp, u_int sx, u_int sy) } void -window_copy_key(struct window_pane *wp, struct session *sess, int key) +window_copy_key(struct window_pane *wp, struct client *c, struct session *sess, + int key, struct mouse_event *m) { const char *word_separators; struct window_copy_mode_data *data = wp->modedata; struct screen *s = &data->screen; - u_int n; - int np, keys; + u_int n, np; + int keys; enum mode_key_cmd cmd; const char *arg, *ss; - np = data->numprefix; - if (np <= 0) - np = 1; + np = 1; + if (data->numprefix > 0) + np = data->numprefix; if (data->inputtype == WINDOW_COPY_JUMPFORWARD || data->inputtype == WINDOW_COPY_JUMPBACK || @@ -398,11 +397,11 @@ window_copy_key(struct window_pane *wp, struct session *sess, int key) } if (data->inputtype == WINDOW_COPY_JUMPTOFORWARD) { for (; np != 0; np--) - window_copy_cursor_jump_to(wp); + window_copy_cursor_jump_to(wp, 0); } if (data->inputtype == WINDOW_COPY_JUMPTOBACK) { for (; np != 0; np--) - window_copy_cursor_jump_to_back(wp); + window_copy_cursor_jump_to_back(wp, 0); } } data->jumptype = data->inputtype; @@ -536,9 +535,14 @@ window_copy_key(struct window_pane *wp, struct session *sess, int key) window_copy_redraw_screen(wp); break; case MODEKEYCOPY_STARTSELECTION: - s->sel.lineflag = LINE_SEL_NONE; - window_copy_start_selection(wp); - window_copy_redraw_screen(wp); + if (KEYC_IS_MOUSE(key)) { + if (c != NULL) + window_copy_start_drag(c, m); + } else { + s->sel.lineflag = LINE_SEL_NONE; + window_copy_start_selection(wp); + window_copy_redraw_screen(wp); + } break; case MODEKEYCOPY_SELECTLINE: s->sel.lineflag = LINE_SEL_LEFT_RIGHT; @@ -639,10 +643,10 @@ window_copy_key(struct window_pane *wp, struct session *sess, int key) window_copy_cursor_jump_back(wp); } else if (data->jumptype == WINDOW_COPY_JUMPTOFORWARD) { for (; np != 0; np--) - window_copy_cursor_jump_to(wp); + window_copy_cursor_jump_to(wp, 1); } else if (data->jumptype == WINDOW_COPY_JUMPTOBACK) { for (; np != 0; np--) - window_copy_cursor_jump_to_back(wp); + window_copy_cursor_jump_to_back(wp, 1); } break; case MODEKEYCOPY_JUMPREVERSE: @@ -654,10 +658,10 @@ window_copy_key(struct window_pane *wp, struct session *sess, int key) window_copy_cursor_jump(wp); } else if (data->jumptype == WINDOW_COPY_JUMPTOFORWARD) { for (; np != 0; np--) - window_copy_cursor_jump_to_back(wp); + window_copy_cursor_jump_to_back(wp, 1); } else if (data->jumptype == WINDOW_COPY_JUMPTOBACK) { for (; np != 0; np--) - window_copy_cursor_jump_to(wp); + window_copy_cursor_jump_to(wp, 1); } break; case MODEKEYCOPY_JUMPBACK: @@ -888,75 +892,6 @@ window_copy_key_numeric_prefix(struct window_pane *wp, int key) } void -window_copy_mouse(struct window_pane *wp, struct session *sess, - struct mouse_event *m) -{ - struct window_copy_mode_data *data = wp->modedata; - struct screen *s = &data->screen; - u_int i, old_cy; - - if (m->x >= screen_size_x(s)) - return; - if (m->y >= screen_size_y(s)) - return; - - /* If mouse wheel (buttons 4 and 5), scroll. */ - if (m->event == MOUSE_EVENT_WHEEL) { - for (i = 0; i < m->scroll; i++) { - if (m->wheel == MOUSE_WHEEL_UP) - window_copy_cursor_up(wp, 1); - else { - window_copy_cursor_down(wp, 1); - - /* - * We reached the bottom, leave copy mode, but - * only if no selection is in progress. - */ - if (data->oy == 0 && !s->sel.flag && - s->sel.lineflag == LINE_SEL_NONE) - goto reset_mode; - } - } - return; - } - - /* - * If already reading motion, move the cursor while buttons are still - * pressed, or stop the selection on their release. - */ - if (s->mode & MODE_MOUSE_BUTTON) { - if (~m->event & MOUSE_EVENT_UP) { - old_cy = data->cy; - window_copy_update_cursor(wp, m->x, m->y); - if (window_copy_update_selection(wp, 1)) - window_copy_redraw_selection(wp, old_cy); - return; - } - goto reset_mode; - } - - /* Otherwise if other buttons pressed, start selection and motion. */ - if (~m->event & MOUSE_EVENT_UP) { - s->mode &= ~MODE_MOUSE_STANDARD; - s->mode |= MODE_MOUSE_BUTTON; - - window_copy_update_cursor(wp, m->x, m->y); - window_copy_start_selection(wp); - window_copy_redraw_screen(wp); - } - - return; - -reset_mode: - s->mode &= ~MODE_MOUSE_BUTTON; - s->mode |= MODE_MOUSE_STANDARD; - if (sess != NULL) { - window_copy_copy_selection(wp, NULL); - window_pane_reset_mode(wp); - } -} - -void window_copy_scroll_to(struct window_pane *wp, u_int px, u_int py) { struct window_copy_mode_data *data = wp->modedata; @@ -2009,7 +1944,7 @@ window_copy_cursor_jump_back(struct window_pane *wp) } void -window_copy_cursor_jump_to(struct window_pane *wp) +window_copy_cursor_jump_to(struct window_pane *wp, int jump_again) { struct window_copy_mode_data *data = wp->modedata; struct screen *back_s = data->backing; @@ -2017,7 +1952,7 @@ window_copy_cursor_jump_to(struct window_pane *wp) struct utf8_data ud; u_int px, py, xx; - px = data->cx + 1; + px = data->cx + 1 + jump_again; py = screen_hsize(back_s) + data->cy - data->oy; xx = window_copy_find_length(wp, py); @@ -2036,7 +1971,7 @@ window_copy_cursor_jump_to(struct window_pane *wp) } void -window_copy_cursor_jump_to_back(struct window_pane *wp) +window_copy_cursor_jump_to_back(struct window_pane *wp, int jump_again) { struct window_copy_mode_data *data = wp->modedata; struct screen *back_s = data->backing; @@ -2050,6 +1985,9 @@ window_copy_cursor_jump_to_back(struct window_pane *wp) if (px > 0) px--; + if (jump_again && px > 0) + px--; + for (;;) { gc = grid_peek_cell(back_s->grid, px, py); grid_cell_get(gc, &ud); @@ -2274,3 +2212,62 @@ window_copy_rectangle_toggle(struct window_pane *wp) window_copy_update_selection(wp, 1); window_copy_redraw_screen(wp); } + +void +window_copy_start_drag(struct client *c, unused struct mouse_event *m) +{ + struct window_pane *wp; + struct window_copy_mode_data *data; + u_int x, y; + + wp = cmd_mouse_pane(m, NULL, NULL); + if (wp->mode != &window_copy_mode) + return; + data = wp->modedata; + + if (cmd_mouse_at(wp, m, &x, &y, 1) != 0) + return; + + c->tty.mouse_drag_update = window_copy_drag_update; + c->tty.mouse_drag_release = window_copy_drag_release; + + window_copy_update_cursor(wp, x, y); + window_copy_start_selection(wp); + window_copy_redraw_screen(wp); +} + +void +window_copy_drag_update(unused struct client *c, struct mouse_event *m) +{ + struct window_pane *wp; + struct window_copy_mode_data *data; + u_int x, y, old_cy; + + wp = cmd_mouse_pane(m, NULL, NULL); + if (wp->mode != &window_copy_mode) + return; + data = wp->modedata; + + if (cmd_mouse_at(wp, m, &x, &y, 0) != 0) + return; + old_cy = data->cy; + + window_copy_update_cursor(wp, x, y); + if (window_copy_update_selection(wp, 1)) + window_copy_redraw_selection(wp, old_cy); +} + +void +window_copy_drag_release(unused struct client *c, struct mouse_event *m) +{ + struct window_pane *wp; + struct window_copy_mode_data *data; + + wp = cmd_mouse_pane(m, NULL, NULL); + if (wp->mode != &window_copy_mode) + return; + data = wp->modedata; + + window_copy_copy_selection(wp, NULL); + window_pane_reset_mode(wp); +} |