aboutsummaryrefslogtreecommitdiff
path: root/window-copy.c
diff options
context:
space:
mode:
Diffstat (limited to 'window-copy.c')
-rw-r--r--window-copy.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/window-copy.c b/window-copy.c
index 8e3f63d1..6864d8f9 100644
--- a/window-copy.c
+++ b/window-copy.c
@@ -230,6 +230,7 @@ struct window_copy_mode_data {
} lineflag; /* line selection mode */
int rectflag; /* in rectangle copy mode? */
int scroll_exit; /* exit on scroll to end? */
+ int hide_position; /* hide position marker */
enum {
SEL_CHAR, /* select one char at a time */
@@ -304,6 +305,7 @@ window_copy_common_init(struct window_mode_entry *wme)
data->cursordrag = CURSORDRAG_NONE;
data->lineflag = LINE_SEL_NONE;
+ data->selflag = SEL_CHAR;
if (wp->searchstr != NULL) {
data->searchtype = WINDOW_COPY_SEARCHUP;
@@ -345,6 +347,7 @@ window_copy_init(struct window_mode_entry *wme,
data->cy = data->backing->cy;
data->scroll_exit = args_has(args, 'e');
+ data->hide_position = args_has(args, 'H');
data->screen.cx = data->cx;
data->screen.cy = data->cy;
@@ -737,6 +740,7 @@ window_copy_cmd_stop_selection(struct window_copy_cmd_state *cs)
data->cursordrag = CURSORDRAG_NONE;
data->lineflag = LINE_SEL_NONE;
+ data->selflag = SEL_CHAR;
return (WINDOW_COPY_CMD_NOTHING);
}
@@ -2774,7 +2778,7 @@ window_copy_write_line(struct window_mode_entry *wme,
style_apply(&gc, oo, "mode-style");
gc.flags |= GRID_FLAG_NOPALETTE;
- if (py == 0 && s->rupper < s->rlower) {
+ if (py == 0 && s->rupper < s->rlower && !data->hide_position) {
if (data->searchmark == NULL) {
size = xsnprintf(hdr, sizeof hdr,
"[%u/%u]", data->oy, screen_hsize(data->backing));
@@ -2873,15 +2877,15 @@ window_copy_redraw_screen(struct window_mode_entry *wme)
}
static void
-window_copy_synchronize_cursor_end(struct window_mode_entry *wme)
+window_copy_synchronize_cursor_end(struct window_mode_entry *wme, int begin)
{
struct window_copy_mode_data *data = wme->data;
u_int xx, yy;
- int begin = 0;
yy = screen_hsize(data->backing) + data->cy - data->oy;
switch (data->selflag) {
case SEL_WORD:
+ begin = 0;
xx = data->cx;
if (data->ws == NULL)
break;
@@ -2907,6 +2911,7 @@ window_copy_synchronize_cursor_end(struct window_mode_entry *wme)
}
break;
case SEL_LINE:
+ begin = 0;
if (data->dy > yy) {
/* Right to left selection. */
xx = 0;
@@ -2944,11 +2949,10 @@ window_copy_synchronize_cursor(struct window_mode_entry *wme)
switch (data->cursordrag) {
case CURSORDRAG_ENDSEL:
- window_copy_synchronize_cursor_end(wme);
+ window_copy_synchronize_cursor_end(wme, 0);
break;
case CURSORDRAG_SEL:
- data->selx = data->cx;
- data->sely = screen_hsize(data->backing) + data->cy - data->oy;
+ window_copy_synchronize_cursor_end(wme, 1);
break;
case CURSORDRAG_NONE:
break;
@@ -3358,6 +3362,7 @@ window_copy_clear_selection(struct window_mode_entry *wme)
data->cursordrag = CURSORDRAG_NONE;
data->lineflag = LINE_SEL_NONE;
+ data->selflag = SEL_CHAR;
py = screen_hsize(data->backing) + data->cy - data->oy;
px = window_copy_find_length(wme, py);
@@ -4122,7 +4127,7 @@ window_copy_start_drag(struct client *c, struct mouse_event *m)
struct window_pane *wp;
struct window_mode_entry *wme;
struct window_copy_mode_data *data;
- u_int x, y;
+ u_int x, y, yg;
if (c == NULL)
return;
@@ -4143,6 +4148,9 @@ window_copy_start_drag(struct client *c, struct mouse_event *m)
c->tty.mouse_drag_release = window_copy_drag_release;
data = wme->data;
+ yg = screen_hsize(data->backing) + y - data->oy;
+ if (x < data->selrx || x > data->endselrx || yg != data->selry)
+ data->selflag = SEL_CHAR;
switch (data->selflag) {
case SEL_WORD:
if (data->ws) {