summaryrefslogtreecommitdiff
path: root/src/normal.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-09-21 20:48:04 +0200
committerBram Moolenaar <Bram@vim.org>2019-09-21 20:48:04 +0200
commitb20b9e14ddd8db111e886ad0494e15b955159426 (patch)
tree81bf23be4dbc17d4b793a29f3252448f5f1e7322 /src/normal.c
parent4d5c12626c98df23e1a5d953692d946310ddfa9c (diff)
downloadvim-git-b20b9e14ddd8db111e886ad0494e15b955159426.tar.gz
patch 8.1.2062: the mouse code is spread outv8.1.2062
Problem: The mouse code is spread out. Solution: Move all the mouse code to mouse.c. (Yegappan Lakshmanan, closes #4959)
Diffstat (limited to 'src/normal.c')
-rw-r--r--src/normal.c1133
1 files changed, 4 insertions, 1129 deletions
diff --git a/src/normal.c b/src/normal.c
index f7a3e84dc..adc7541b1 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -30,14 +30,6 @@ static void set_vcount_ca(cmdarg_T *cap, int *set_prevcount);
static int nv_compare(const void *s1, const void *s2);
static void op_colon(oparg_T *oap);
static void op_function(oparg_T *oap);
-#if defined(FEAT_MOUSE)
-static void find_start_of_word(pos_T *);
-static void find_end_of_word(pos_T *);
-static int get_mouse_class(char_u *p);
-#endif
-static void prep_redo(int regname, long, int, int, int, int, int);
-static void clearop(oparg_T *oap);
-static void clearopbeep(oparg_T *oap);
static void unshift_special(cmdarg_T *cap);
static void may_clear_cmdline(void);
#ifdef FEAT_CMDL_INFO
@@ -55,11 +47,6 @@ static void nv_error(cmdarg_T *cap);
static void nv_help(cmdarg_T *cap);
static void nv_addsub(cmdarg_T *cap);
static void nv_page(cmdarg_T *cap);
-#ifdef FEAT_MOUSE
-static void nv_mousescroll(cmdarg_T *cap);
-static void nv_mouse(cmdarg_T *cap);
-#endif
-static void nv_scroll_line(cmdarg_T *cap);
static void nv_zet(cmdarg_T *cap);
#ifdef FEAT_GUI
static void nv_ver_scrollbar(cmdarg_T *cap);
@@ -2201,1010 +2188,6 @@ op_function(oparg_T *oap UNUSED)
#endif
}
-#if defined(FEAT_MOUSE) || defined(PROTO)
-/*
- * Do the appropriate action for the current mouse click in the current mode.
- * Not used for Command-line mode.
- *
- * Normal and Visual Mode:
- * event modi- position visual change action
- * fier cursor window
- * left press - yes end yes
- * left press C yes end yes "^]" (2)
- * left press S yes end (popup: extend) yes "*" (2)
- * left drag - yes start if moved no
- * left relse - yes start if moved no
- * middle press - yes if not active no put register
- * middle press - yes if active no yank and put
- * right press - yes start or extend yes
- * right press S yes no change yes "#" (2)
- * right drag - yes extend no
- * right relse - yes extend no
- *
- * Insert or Replace Mode:
- * event modi- position visual change action
- * fier cursor window
- * left press - yes (cannot be active) yes
- * left press C yes (cannot be active) yes "CTRL-O^]" (2)
- * left press S yes (cannot be active) yes "CTRL-O*" (2)
- * left drag - yes start or extend (1) no CTRL-O (1)
- * left relse - yes start or extend (1) no CTRL-O (1)
- * middle press - no (cannot be active) no put register
- * right press - yes start or extend yes CTRL-O
- * right press S yes (cannot be active) yes "CTRL-O#" (2)
- *
- * (1) only if mouse pointer moved since press
- * (2) only if click is in same buffer
- *
- * Return TRUE if start_arrow() should be called for edit mode.
- */
- int
-do_mouse(
- oparg_T *oap, /* operator argument, can be NULL */
- int c, /* K_LEFTMOUSE, etc */
- int dir, /* Direction to 'put' if necessary */
- long count,
- int fixindent) /* PUT_FIXINDENT if fixing indent necessary */
-{
- static int do_always = FALSE; /* ignore 'mouse' setting next time */
- static int got_click = FALSE; /* got a click some time back */
-
- int which_button; /* MOUSE_LEFT, _MIDDLE or _RIGHT */
- int is_click; /* If FALSE it's a drag or release event */
- int is_drag; /* If TRUE it's a drag event */
- int jump_flags = 0; /* flags for jump_to_mouse() */
- pos_T start_visual;
- int moved; /* Has cursor moved? */
- int in_status_line; /* mouse in status line */
- static int in_tab_line = FALSE; /* mouse clicked in tab line */
- int in_sep_line; /* mouse in vertical separator line */
- int c1, c2;
-#if defined(FEAT_FOLDING)
- pos_T save_cursor;
-#endif
- win_T *old_curwin = curwin;
- static pos_T orig_cursor;
- colnr_T leftcol, rightcol;
- pos_T end_visual;
- int diff;
- int old_active = VIsual_active;
- int old_mode = VIsual_mode;
- int regname;
-
-#if defined(FEAT_FOLDING)
- save_cursor = curwin->w_cursor;
-#endif
-
- /*
- * When GUI is active, always recognize mouse events, otherwise:
- * - Ignore mouse event in normal mode if 'mouse' doesn't include 'n'.
- * - Ignore mouse event in visual mode if 'mouse' doesn't include 'v'.
- * - For command line and insert mode 'mouse' is checked before calling
- * do_mouse().
- */
- if (do_always)
- do_always = FALSE;
- else
-#ifdef FEAT_GUI
- if (!gui.in_use)
-#endif
- {
- if (VIsual_active)
- {
- if (!mouse_has(MOUSE_VISUAL))
- return FALSE;
- }
- else if (State == NORMAL && !mouse_has(MOUSE_NORMAL))
- return FALSE;
- }
-
- for (;;)
- {
- which_button = get_mouse_button(KEY2TERMCAP1(c), &is_click, &is_drag);
- if (is_drag)
- {
- /* If the next character is the same mouse event then use that
- * one. Speeds up dragging the status line. */
- if (vpeekc() != NUL)
- {
- int nc;
- int save_mouse_row = mouse_row;
- int save_mouse_col = mouse_col;
-
- /* Need to get the character, peeking doesn't get the actual
- * one. */
- nc = safe_vgetc();
- if (c == nc)
- continue;
- vungetc(nc);
- mouse_row = save_mouse_row;
- mouse_col = save_mouse_col;
- }
- }
- break;
- }
-
- if (c == K_MOUSEMOVE)
- {
- // Mouse moved without a button pressed.
-#ifdef FEAT_BEVAL_TERM
- ui_may_remove_balloon();
- if (p_bevalterm)
- {
- profile_setlimit(p_bdlay, &bevalexpr_due);
- bevalexpr_due_set = TRUE;
- }
-#endif
-#ifdef FEAT_TEXT_PROP
- popup_handle_mouse_moved();
-#endif
- return FALSE;
- }
-
-#ifdef FEAT_MOUSESHAPE
- /* May have stopped dragging the status or separator line. The pointer is
- * most likely still on the status or separator line. */
- if (!is_drag && drag_status_line)
- {
- drag_status_line = FALSE;
- update_mouseshape(SHAPE_IDX_STATUS);
- }
- if (!is_drag && drag_sep_line)
- {
- drag_sep_line = FALSE;
- update_mouseshape(SHAPE_IDX_VSEP);
- }
-#endif
-
- /*
- * Ignore drag and release events if we didn't get a click.
- */
- if (is_click)
- got_click = TRUE;
- else
- {
- if (!got_click) /* didn't get click, ignore */
- return FALSE;
- if (!is_drag) /* release, reset got_click */
- {
- got_click = FALSE;
- if (in_tab_line)
- {
- in_tab_line = FALSE;
- return FALSE;
- }
- }
- }
-
- /*
- * CTRL right mouse button does CTRL-T
- */
- if (is_click && (mod_mask & MOD_MASK_CTRL) && which_button == MOUSE_RIGHT)
- {
- if (State & INSERT)
- stuffcharReadbuff(Ctrl_O);
- if (count > 1)
- stuffnumReadbuff(count);
- stuffcharReadbuff(Ctrl_T);
- got_click = FALSE; /* ignore drag&release now */
- return FALSE;
- }
-
- /*
- * CTRL only works with left mouse button
- */
- if ((mod_mask & MOD_MASK_CTRL) && which_button != MOUSE_LEFT)
- return FALSE;
-
- /*
- * When a modifier is down, ignore drag and release events, as well as
- * multiple clicks and the middle mouse button.
- * Accept shift-leftmouse drags when 'mousemodel' is "popup.*".
- */
- if ((mod_mask & (MOD_MASK_SHIFT | MOD_MASK_CTRL | MOD_MASK_ALT
- | MOD_MASK_META))
- && (!is_click
- || (mod_mask & MOD_MASK_MULTI_CLICK)
- || which_button == MOUSE_MIDDLE)
- && !((mod_mask & (MOD_MASK_SHIFT|MOD_MASK_ALT))
- && mouse_model_popup()
- && which_button == MOUSE_LEFT)
- && !((mod_mask & MOD_MASK_ALT)
- && !mouse_model_popup()
- && which_button == MOUSE_RIGHT)
- )
- return FALSE;
-
- /*
- * If the button press was used as the movement command for an operator
- * (eg "d<MOUSE>"), or it is the middle button that is held down, ignore
- * drag/release events.
- */
- if (!is_click && which_button == MOUSE_MIDDLE)
- return FALSE;
-
- if (oap != NULL)
- regname = oap->regname;
- else
- regname = 0;
-
- /*
- * Middle mouse button does a 'put' of the selected text
- */
- if (which_button == MOUSE_MIDDLE)
- {
- if (State == NORMAL)
- {
- /*
- * If an operator was pending, we don't know what the user wanted
- * to do. Go back to normal mode: Clear the operator and beep().
- */
- if (oap != NULL && oap->op_type != OP_NOP)
- {
- clearopbeep(oap);
- return FALSE;
- }
-
- /*
- * If visual was active, yank the highlighted text and put it
- * before the mouse pointer position.
- * In Select mode replace the highlighted text with the clipboard.
- */
- if (VIsual_active)
- {
- if (VIsual_select)
- {
- stuffcharReadbuff(Ctrl_G);
- stuffReadbuff((char_u *)"\"+p");
- }
- else
- {
- stuffcharReadbuff('y');
- stuffcharReadbuff(K_MIDDLEMOUSE);
- }
- do_always = TRUE; /* ignore 'mouse' setting next time */
- return FALSE;
- }
- /*
- * The rest is below jump_to_mouse()
- */
- }
-
- else if ((State & INSERT) == 0)
- return FALSE;
-
- /*
- * Middle click in insert mode doesn't move the mouse, just insert the
- * contents of a register. '.' register is special, can't insert that
- * with do_put().
- * Also paste at the cursor if the current mode isn't in 'mouse' (only
- * happens for the GUI).
- */
- if ((State & INSERT) || !mouse_has(MOUSE_NORMAL))
- {
- if (regname == '.')
- insert_reg(regname, TRUE);
- else
- {
-#ifdef FEAT_CLIPBOARD
- if (clip_star.available && regname == 0)
- regname = '*';
-#endif
- if ((State & REPLACE_FLAG) && !yank_register_mline(regname))
- insert_reg(regname, TRUE);
- else
- {
- do_put(regname, BACKWARD, 1L, fixindent | PUT_CURSEND);
-
- /* Repeat it with CTRL-R CTRL-O r or CTRL-R CTRL-P r */
- AppendCharToRedobuff(Ctrl_R);
- AppendCharToRedobuff(fixindent ? Ctrl_P : Ctrl_O);
- AppendCharToRedobuff(regname == 0 ? '"' : regname);
- }
- }
- return FALSE;
- }
- }
-
- /* When dragging or button-up stay in the same window. */
- if (!is_click)
- jump_flags |= MOUSE_FOCUS | MOUSE_DID_MOVE;
-
- start_visual.lnum = 0;
-
- /* Check for clicking in the tab page line. */
- if (mouse_row == 0 && firstwin->w_winrow > 0)
- {
- if (is_drag)
- {
- if (in_tab_line)
- {
- c1 = TabPageIdxs[mouse_col];
- tabpage_move(c1 <= 0 ? 9999 : c1 < tabpage_index(curtab)
- ? c1 - 1 : c1);
- }
- return FALSE;
- }
-
- /* click in a tab selects that tab page */
- if (is_click
-# ifdef FEAT_CMDWIN
- && cmdwin_type == 0
-# endif
- && mouse_col < Columns)
- {
- in_tab_line = TRUE;
- c1 = TabPageIdxs[mouse_col];
- if (c1 >= 0)
- {
- if ((mod_mask & MOD_MASK_MULTI_CLICK) == MOD_MASK_2CLICK)
- {
- /* double click opens new page */
- end_visual_mode();
- tabpage_new();
- tabpage_move(c1 == 0 ? 9999 : c1 - 1);
- }
- else
- {
- /* Go to specified tab page, or next one if not clicking
- * on a label. */
- goto_tabpage(c1);
-
- /* It's like clicking on the status line of a window. */
- if (curwin != old_curwin)
- end_visual_mode();
- }
- }
- else
- {
- tabpage_T *tp;
-
- /* Close the current or specified tab page. */
- if (c1 == -999)
- tp = curtab;
- else
- tp = find_tabpage(-c1);
- if (tp == curtab)
- {
- if (first_tabpage->tp_next != NULL)
- tabpage_close(FALSE);
- }
- else if (tp != NULL)
- tabpage_close_other(tp, FALSE);
- }
- }
- return TRUE;
- }
- else if (is_drag && in_tab_line)
- {
- c1 = TabPageIdxs[mouse_col];
- tabpage_move(c1 <= 0 ? 9999 : c1 - 1);
- return FALSE;
- }
-
- /*
- * When 'mousemodel' is "popup" or "popup_setpos", translate mouse events:
- * right button up -> pop-up menu
- * shift-left button -> right button
- * alt-left button -> alt-right button
- */
- if (mouse_model_popup())
- {
- if (which_button == MOUSE_RIGHT
- && !(mod_mask & (MOD_MASK_SHIFT | MOD_MASK_CTRL)))
- {
-#if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) \
- || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MSWIN) \
- || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_PHOTON) \
- || defined(FEAT_TERM_POPUP_MENU)
-# ifdef FEAT_GUI
- if (gui.in_use)
- {
-# if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) \
- || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC)
- if (!is_click)
- /* Ignore right button release events, only shows the popup
- * menu on the button down event. */
- return FALSE;
-# endif
-# if defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MSWIN)
- if (is_click || is_drag)
- /* Ignore right button down and drag mouse events. Windows
- * only shows the popup menu on the button up event. */
- return FALSE;
-# endif
- }
-# endif
-# if defined(FEAT_GUI) && defined(FEAT_TERM_POPUP_MENU)
- else
-# endif
-# if defined(FEAT_TERM_POPUP_MENU)
- if (!is_click)
- /* Ignore right button release events, only shows the popup
- * menu on the button down event. */
- return FALSE;
-#endif
-
- jump_flags = 0;
- if (STRCMP(p_mousem, "popup_setpos") == 0)
- {
- /* First set the cursor position before showing the popup
- * menu. */
- if (VIsual_active)
- {
- pos_T m_pos;
-
- /*
- * set MOUSE_MAY_STOP_VIS if we are outside the
- * selection or the current window (might have false
- * negative here)
- */
- if (mouse_row < curwin->w_winrow
- || mouse_row
- > (curwin->w_winrow + curwin->w_height))
- jump_flags = MOUSE_MAY_STOP_VIS;
- else if (get_fpos_of_mouse(&m_pos) != IN_BUFFER)
- jump_flags = MOUSE_MAY_STOP_VIS;
- else
- {
- if ((LT_POS(curwin->w_cursor, VIsual)
- && (LT_POS(m_pos, curwin->w_cursor)
- || LT_POS(VIsual, m_pos)))
- || (LT_POS(VIsual, curwin->w_cursor)
- && (LT_POS(m_pos, VIsual)
- || LT_POS(curwin->w_cursor, m_pos))))
- {
- jump_flags = MOUSE_MAY_STOP_VIS;
- }
- else if (VIsual_mode == Ctrl_V)
- {
- getvcols(curwin, &curwin->w_cursor, &VIsual,
- &leftcol, &rightcol);
- getvcol(curwin, &m_pos, NULL, &m_pos.col, NULL);
- if (m_pos.col < leftcol || m_pos.col > rightcol)
- jump_flags = MOUSE_MAY_STOP_VIS;
- }
- }
- }
- else
- jump_flags = MOUSE_MAY_STOP_VIS;
- }
- if (jump_flags)
- {
- jump_flags = jump_to_mouse(jump_flags, NULL, which_button);
- update_curbuf(VIsual_active ? INVERTED : VALID);
- setcursor();
- out_flush(); /* Update before showing popup menu */
- }
-# ifdef FEAT_MENU
- show_popupmenu();
- got_click = FALSE; /* ignore release events */
-# endif
- return (jump_flags & CURSOR_MOVED) != 0;
-#else
- return FALSE;
-#endif
- }
- if (which_button == MOUSE_LEFT
- && (mod_mask & (MOD_MASK_SHIFT|MOD_MASK_ALT)))
- {
- which_button = MOUSE_RIGHT;
- mod_mask &= ~MOD_MASK_SHIFT;
- }
- }
-
- if ((State & (NORMAL | INSERT))
- && !(mod_mask & (MOD_MASK_SHIFT | MOD_MASK_CTRL)))
- {
- if (which_button == MOUSE_LEFT)
- {
- if (is_click)
- {
- /* stop Visual mode for a left click in a window, but not when
- * on a status line */
- if (VIsual_active)
- jump_flags |= MOUSE_MAY_STOP_VIS;
- }
- else if (mouse_has(MOUSE_VISUAL))
- jump_flags |= MOUSE_MAY_VIS;
- }
- else if (which_button == MOUSE_RIGHT)
- {
- if (is_click && VIsual_active)
- {
- /*
- * Remember the start and end of visual before moving the
- * cursor.
- */
- if (LT_POS(curwin->w_cursor, VIsual))
- {
- start_visual = curwin->w_cursor;
- end_visual = VIsual;
- }
- else
- {
- start_visual = VIsual;
- end_visual = curwin->w_cursor;
- }
- }
- jump_flags |= MOUSE_FOCUS;
- if (mouse_has(MOUSE_VISUAL))
- jump_flags |= MOUSE_MAY_VIS;
- }
- }
-
- /*
- * If an operator is pending, ignore all drags and releases until the
- * next mouse click.
- */
- if (!is_drag && oap != NULL && oap->op_type != OP_NOP)
- {
- got_click = FALSE;
- oap->motion_type = MCHAR;
- }
-
- /* When releasing the button let jump_to_mouse() know. */
- if (!is_click && !is_drag)
- jump_flags |= MOUSE_RELEASED;
-
- /*
- * JUMP!
- */
- jump_flags = jump_to_mouse(jump_flags,
- oap == NULL ? NULL : &(oap->inclusive), which_button);
-
-#ifdef FEAT_MENU
- /* A click in the window toolbar has no side effects. */
- if (jump_flags & MOUSE_WINBAR)
- return FALSE;
-#endif
- moved = (jump_flags & CURSOR_MOVED);
- in_status_line = (jump_flags & IN_STATUS_LINE);
- in_sep_line = (jump_flags & IN_SEP_LINE);
-
-#ifdef FEAT_NETBEANS_INTG
- if (isNetbeansBuffer(curbuf)
- && !(jump_flags & (IN_STATUS_LINE | IN_SEP_LINE)))
- {
- int key = KEY2TERMCAP1(c);
-
- if (key == (int)KE_LEFTRELEASE || key == (int)KE_MIDDLERELEASE
- || key == (int)KE_RIGHTRELEASE)
- netbeans_button_release(which_button);
- }
-#endif
-
- /* When jumping to another window, clear a pending operator. That's a bit
- * friendlier than beeping and not jumping to that window. */
- if (curwin != old_curwin && oap != NULL && oap->op_type != OP_NOP)
- clearop(oap);
-
-#ifdef FEAT_FOLDING
- if (mod_mask == 0
- && !is_drag
- && (jump_flags & (MOUSE_FOLD_CLOSE | MOUSE_FOLD_OPEN))
- && which_button == MOUSE_LEFT)
- {
- /* open or close a fold at this line */
- if (jump_flags & MOUSE_FOLD_OPEN)
- openFold(curwin->w_cursor.lnum, 1L);
- else
- closeFold(curwin->w_cursor.lnum, 1L);
- /* don't move the cursor if still in the same window */
- if (curwin == old_curwin)
- curwin->w_cursor = save_cursor;
- }
-#endif
-
-#if defined(FEAT_CLIPBOARD) && defined(FEAT_CMDWIN)
- if ((jump_flags & IN_OTHER_WIN) && !VIsual_active && clip_star.available)
- {
- clip_modeless(which_button, is_click, is_drag);
- return FALSE;
- }
-#endif
-
- /* Set global flag that we are extending the Visual area with mouse
- * dragging; temporarily minimize 'scrolloff'. */
- if (VIsual_active && is_drag && get_scrolloff_value())
- {
- /* In the very first line, allow scrolling one line */
- if (mouse_row == 0)
- mouse_dragging = 2;
- else
- mouse_dragging = 1;
- }
-
- /* When dragging the mouse above the window, scroll down. */
- if (is_drag && mouse_row < 0 && !in_status_line)
- {
- scroll_redraw(FALSE, 1L);
- mouse_row = 0;
- }
-
- if (start_visual.lnum) /* right click in visual mode */
- {
- /* When ALT is pressed make Visual mode blockwise. */
- if (mod_mask & MOD_MASK_ALT)
- VIsual_mode = Ctrl_V;
-
- /*
- * In Visual-block mode, divide the area in four, pick up the corner
- * that is in the quarter that the cursor is in.
- */
- if (VIsual_mode == Ctrl_V)
- {
- getvcols(curwin, &start_visual, &end_visual, &leftcol, &rightcol);
- if (curwin->w_curswant > (leftcol + rightcol) / 2)
- end_visual.col = leftcol;
- else
- end_visual.col = rightcol;
- if (curwin->w_cursor.lnum >=
- (start_visual.lnum + end_visual.lnum) / 2)
- end_visual.lnum = start_visual.lnum;
-
- /* move VIsual to the right column */
- start_visual = curwin->w_cursor; /* save the cursor pos */
- curwin->w_cursor = end_visual;
- coladvance(end_visual.col);
- VIsual = curwin->w_cursor;
- curwin->w_cursor = start_visual; /* restore the cursor */
- }
- else
- {
- /*
- * If the click is before the start of visual, change the start.
- * If the click is after the end of visual, change the end. If
- * the click is inside the visual, change the closest side.
- */
- if (LT_POS(curwin->w_cursor, start_visual))
- VIsual = end_visual;
- else if (LT_POS(end_visual, curwin->w_cursor))
- VIsual = start_visual;
- else
- {
- /* In the same line, compare column number */
- if (end_visual.lnum == start_visual.lnum)
- {
- if (curwin->w_cursor.col - start_visual.col >
- end_visual.col - curwin->w_cursor.col)
- VIsual = start_visual;
- else
- VIsual = end_visual;
- }
-
- /* In different lines, compare line number */
- else
- {
- diff = (curwin->w_cursor.lnum - start_visual.lnum) -
- (end_visual.lnum - curwin->w_cursor.lnum);
-
- if (diff > 0) /* closest to end */
- VIsual = start_visual;
- else if (diff < 0) /* closest to start */
- VIsual = end_visual;
- else /* in the middle line */
- {
- if (curwin->w_cursor.col <
- (start_visual.col + end_visual.col) / 2)
- VIsual = end_visual;
- else
- VIsual = start_visual;
- }
- }
- }
- }
- }
- /*
- * If Visual mode started in insert mode, execute "CTRL-O"
- */
- else if ((State & INSERT) && VIsual_active)
- stuffcharReadbuff(Ctrl_O);
-
- /*
- * Middle mouse click: Put text before cursor.
- */
- if (which_button == MOUSE_MIDDLE)
- {
-#ifdef FEAT_CLIPBOARD
- if (clip_star.available && regname == 0)
- regname = '*';
-#endif
- if (yank_register_mline(regname))
- {
- if (mouse_past_bottom)
- dir = FORWARD;
- }
- else if (mouse_past_eol)
- dir = FORWARD;
-
- if (fixindent)
- {
- c1 = (dir == BACKWARD) ? '[' : ']';
- c2 = 'p';
- }
- else
- {
- c1 = (dir == FORWARD) ? 'p' : 'P';
- c2 = NUL;
- }
- prep_redo(regname, count, NUL, c1, NUL, c2, NUL);
-
- /*
- * Remember where the paste started, so in edit() Insstart can be set
- * to this position
- */
- if (restart_edit != 0)
- where_paste_started = curwin->w_cursor;
- do_put(regname, dir, count, fixindent | PUT_CURSEND);
- }
-
-#if defined(FEAT_QUICKFIX)
- /*
- * Ctrl-Mouse click or double click in a quickfix window jumps to the
- * error under the mouse pointer.
- */
- else if (((mod_mask & MOD_MASK_CTRL)
- || (mod_mask & MOD_MASK_MULTI_CLICK) == MOD_MASK_2CLICK)
- && bt_quickfix(curbuf))
- {
- if (curwin->w_llist_ref == NULL) /* quickfix window */
- do_cmdline_cmd((char_u *)".cc");
- else /* location list window */
- do_cmdline_cmd((char_u *)".ll");
- got_click = FALSE; /* ignore drag&release now */
- }
-#endif
-
- /*
- * Ctrl-Mouse click (or double click in a help window) jumps to the tag
- * under the mouse pointer.
- */
- else if ((mod_mask & MOD_MASK_CTRL) || (curbuf->b_help
- && (mod_mask & MOD_MASK_MULTI_CLICK) == MOD_MASK_2CLICK))
- {
- if (State & INSERT)
- stuffcharReadbuff(Ctrl_O);
- stuffcharReadbuff(Ctrl_RSB);
- got_click = FALSE; /* ignore drag&release now */
- }
-
- /*
- * Shift-Mouse click searches for the next occurrence of the word under
- * the mouse pointer
- */
- else if ((mod_mask & MOD_MASK_SHIFT))
- {
- if ((State & INSERT) || (VIsual_active && VIsual_select))
- stuffcharReadbuff(Ctrl_O);
- if (which_button == MOUSE_LEFT)
- stuffcharReadbuff('*');
- else /* MOUSE_RIGHT */
- stuffcharReadbuff('#');
- }
-
- /* Handle double clicks, unless on status line */
- else if (in_status_line)
- {
-#ifdef FEAT_MOUSESHAPE
- if ((is_drag || is_click) && !drag_status_line)
- {
- drag_status_line = TRUE;
- update_mouseshape(-1);
- }
-#endif
- }
- else if (in_sep_line)
- {
-#ifdef FEAT_MOUSESHAPE
- if ((is_drag || is_click) && !drag_sep_line)
- {
- drag_sep_line = TRUE;
- update_mouseshape(-1);
- }
-#endif
- }
- else if ((mod_mask & MOD_MASK_MULTI_CLICK) && (State & (NORMAL | INSERT))
- && mouse_has(MOUSE_VISUAL))
- {
- if (is_click || !VIsual_active)
- {
- if (VIsual_active)
- orig_cursor = VIsual;
- else
- {
- check_visual_highlight();
- VIsual = curwin->w_cursor;
- orig_cursor = VIsual;
- VIsual_active = TRUE;
- VIsual_reselect = TRUE;
- /* start Select mode if 'selectmode' contains "mouse" */
- may_start_select('o');
- setmouse();
- }
- if ((mod_mask & MOD_MASK_MULTI_CLICK) == MOD_MASK_2CLICK)
- {
- /* Double click with ALT pressed makes it blockwise. */
- if (mod_mask & MOD_MASK_ALT)
- VIsual_mode = Ctrl_V;
- else
- VIsual_mode = 'v';
- }
- else if ((mod_mask & MOD_MASK_MULTI_CLICK) == MOD_MASK_3CLICK)
- VIsual_mode = 'V';
- else if ((mod_mask & MOD_MASK_MULTI_CLICK) == MOD_MASK_4CLICK)
- VIsual_mode = Ctrl_V;
-#ifdef FEAT_CLIPBOARD
- /* Make sure the clipboard gets updated. Needed because start and
- * end may still be the same, and the selection needs to be owned */
- clip_star.vmode = NUL;
-#endif
- }
- /*
- * A double click selects a word or a block.
- */
- if ((mod_mask & MOD_MASK_MULTI_CLICK) == MOD_MASK_2CLICK)
- {
- pos_T *pos = NULL;
- int gc;
-
- if (is_click)
- {
- /* If the character under the cursor (skipping white space) is
- * not a word character, try finding a match and select a (),
- * {}, [], #if/#endif, etc. block. */
- end_visual = curwin->w_cursor;
- while (gc = gchar_pos(&end_visual), VIM_ISWHITE(gc))
- inc(&end_visual);
- if (oap != NULL)
- oap->motion_type = MCHAR;
- if (oap != NULL
- && VIsual_mode == 'v'
- && !vim_iswordc(gchar_pos(&end_visual))
- && EQUAL_POS(curwin->w_cursor, VIsual)
- && (pos = findmatch(oap, NUL)) != NULL)
- {
- curwin->w_cursor = *pos;
- if (oap->motion_type == MLINE)
- VIsual_mode = 'V';
- else if (*p_sel == 'e')
- {
- if (LT_POS(curwin->w_cursor, VIsual))
- ++VIsual.col;
- else
- ++curwin->w_cursor.col;
- }
- }
- }
-
- if (pos == NULL && (is_click || is_drag))
- {
- /* When not found a match or when dragging: extend to include
- * a word. */
- if (LT_POS(curwin->w_cursor, orig_cursor))
- {
- find_start_of_word(&curwin->w_cursor);
- find_end_of_word(&VIsual);
- }
- else
- {
- find_start_of_word(&VIsual);
- if (*p_sel == 'e' && *ml_get_cursor() != NUL)
- curwin->w_cursor.col +=
- (*mb_ptr2len)(ml_get_cursor());
- find_end_of_word(&curwin->w_cursor);
- }
- }
- curwin->w_set_curswant = TRUE;
- }
- if (is_click)
- redraw_curbuf_later(INVERTED); /* update the inversion */
- }
- else if (VIsual_active && !old_active)
- {
- if (mod_mask & MOD_MASK_ALT)
- VIsual_mode = Ctrl_V;
- else
- VIsual_mode = 'v';
- }
-
- /* If Visual mode changed show it later. */
- if ((!VIsual_active && old_active && mode_displayed)
- || (VIsual_active && p_smd && msg_silent == 0
- && (!old_active || VIsual_mode != old_mode)))
- redraw_cmdline = TRUE;
-
- return moved;
-}
-
-/*
- * Move "pos" back to the start of the word it's in.
- */
- static void
-find_start_of_word(pos_T *pos)
-{
- char_u *line;
- int cclass;
- int col;
-
- line = ml_get(pos->lnum);
- cclass = get_mouse_class(line + pos->col);
-
- while (pos->col > 0)
- {
- col = pos->col - 1;
- col -= (*mb_head_off)(line, line + col);
- if (get_mouse_class(line + col) != cclass)
- break;
- pos->col = col;
- }
-}
-
-/*
- * Move "pos" forward to the end of the word it's in.
- * When 'selection' is "exclusive", the position is just after the word.
- */
- static void
-find_end_of_word(pos_T *pos)
-{
- char_u *line;
- int cclass;
- int col;
-
- line = ml_get(pos->lnum);
- if (*p_sel == 'e' && pos->col > 0)
- {
- --pos->col;
- pos->col -= (*mb_head_off)(line, line + pos->col);
- }
- cclass = get_mouse_class(line + pos->col);
- while (line[pos->col] != NUL)
- {
- col = pos->col + (*mb_ptr2len)(line + pos->col);
- if (get_mouse_class(line + col) != cclass)
- {
- if (*p_sel == 'e')
- pos->col = col;
- break;
- }
- pos->col = col;
- }
-}
-
-/*
- * Get class of a character for selection: same class means same word.
- * 0: blank
- * 1: punctuation groups
- * 2: normal word character
- * >2: multi-byte word character.
- */
- static int
-get_mouse_class(char_u *p)
-{
- int c;
-
- if (has_mbyte && MB_BYTE2LEN(p[0]) > 1)
- return mb_get_class(p);
-
- c = *p;
- if (c == ' ' || c == '\t')
- return 0;
-
- if (vim_iswordc(c))
- return 2;
-
- /*
- * There are a few special cases where we want certain combinations of
- * characters to be considered as a single word. These are things like
- * "->", "/ *", "*=", "+=", "&=", "<=", ">=", "!=" etc. Otherwise, each
- * character is in its own class.
- */
- if (c != NUL && vim_strchr((char_u *)"-+*/%<>&|^!=", c) != NULL)
- return 1;
- return c;
-}
-#endif /* FEAT_MOUSE */
-
/*
* Check if highlighting for visual mode is possible, give a warning message
* if not.
@@ -3531,7 +2514,7 @@ prep_redo_cmd(cmdarg_T *cap)
* Prepare for redo of any command.
* Note that only the last argument can be a multi-byte char.
*/
- static void
+ void
prep_redo(
int regname,
long num,
@@ -3590,7 +2573,7 @@ checkclearopq(oparg_T *oap)
return TRUE;
}
- static void
+ void
clearop(oparg_T *oap)
{
oap->op_type = OP_NOP;
@@ -3599,7 +2582,7 @@ clearop(oparg_T *oap)
oap->use_reg_one = FALSE;
}
- static void
+ void
clearopbeep(oparg_T *oap)
{
clearop(oap);
@@ -4513,113 +3496,11 @@ nv_screengo(oparg_T *oap, int dir, long dist)
return retval;
}
-#ifdef FEAT_MOUSE
-/*
- * Mouse scroll wheel: Default action is to scroll three lines, or one page
- * when Shift or Ctrl is used.
- * K_MOUSEUP (cap->arg == 1) or K_MOUSEDOWN (cap->arg == 0) or
- * K_MOUSELEFT (cap->arg == -1) or K_MOUSERIGHT (cap->arg == -2)
- */
- static void
-nv_mousescroll(cmdarg_T *cap)
-{
- win_T *old_curwin = curwin, *wp;
-
- if (mouse_row >= 0 && mouse_col >= 0)
- {
- int row, col;
-
- row = mouse_row;
- col = mouse_col;
-
- /* find the window at the pointer coordinates */
- wp = mouse_find_win(&row, &col, FIND_POPUP);
- if (wp == NULL)
- return;
-#ifdef FEAT_TEXT_PROP
- if (WIN_IS_POPUP(wp) && !wp->w_has_scrollbar)
- return;
-#endif
- curwin = wp;
- curbuf = curwin->w_buffer;
- }
-
- if (cap->arg == MSCR_UP || cap->arg == MSCR_DOWN)
- {
-# ifdef FEAT_TERMINAL
- if (term_use_loop())
- /* This window is a terminal window, send the mouse event there.
- * Set "typed" to FALSE to avoid an endless loop. */
- send_keys_to_term(curbuf->b_term, cap->cmdchar, FALSE);
- else
-# endif
- if (mod_mask & (MOD_MASK_SHIFT | MOD_MASK_CTRL))
- {
- (void)onepage(cap->arg ? FORWARD : BACKWARD, 1L);
- }
- else
- {
- // Don't scroll more than half the window height.
- if (curwin->w_height < 6)
- {
- cap->count1 = curwin->w_height / 2;
- if (cap->count1 == 0)
- cap->count1 = 1;
- }
- else
- cap->count1 = 3;
- cap->count0 = cap->count1;
- nv_scroll_line(cap);
- }
-#ifdef FEAT_TEXT_PROP
- if (WIN_IS_POPUP(curwin))
- popup_set_firstline(curwin);
-#endif
- }
-# ifdef FEAT_GUI
- else
- {
- /* Horizontal scroll - only allowed when 'wrap' is disabled */
- if (!curwin->w_p_wrap)
- {
- int val, step = 6;
-
- if (mod_mask & (MOD_MASK_SHIFT | MOD_MASK_CTRL))
- step = curwin->w_width;
- val = curwin->w_leftcol + (cap->arg == MSCR_RIGHT ? -step : +step);
- if (val < 0)
- val = 0;
-
- gui_do_horiz_scroll(val, TRUE);
- }
- }
-# endif
-# ifdef FEAT_SYN_HL
- if (curwin != old_curwin && curwin->w_p_cul)
- redraw_for_cursorline(curwin);
-# endif
-
- curwin->w_redr_status = TRUE;
-
- curwin = old_curwin;
- curbuf = curwin->w_buffer;
-}
-
-/*
- * Mouse clicks and drags.
- */
- static void
-nv_mouse(cmdarg_T *cap)
-{
- (void)do_mouse(cap->oap, cap->cmdchar, BACKWARD, cap->count1, 0);
-}
-#endif
-
/*
* Handle CTRL-E and CTRL-Y commands: scroll a line up or down.
* cap->arg must be TRUE for CTRL-E.
*/
- static void
+ void
nv_scroll_line(cmdarg_T *cap)
{
if (!checkclearop(cap->oap))
@@ -7572,9 +6453,7 @@ nv_visual(cmdarg_T *cap)
if (!cap->arg)
/* start Select mode when 'selectmode' contains "cmd" */
may_start_select('c');
-#ifdef FEAT_MOUSE
setmouse();
-#endif
if (p_smd && msg_silent == 0)
redraw_cmdline = TRUE; /* show visual mode later */
/*
@@ -7687,9 +6566,7 @@ n_start_visual_mode(int c)
foldAdjustVisual();
#endif
-#ifdef FEAT_MOUSE
setmouse();
-#endif
#ifdef FEAT_CONCEAL
/* Check for redraw after changing the state. */
conceal_check_cursor_line();
@@ -7854,9 +6731,7 @@ nv_g_cmd(cmdarg_T *cap)
VIsual_select = TRUE;
else
may_start_select('c');
-#ifdef FEAT_MOUSE
setmouse();
-#endif
#ifdef FEAT_CLIPBOARD
/* Make sure the clipboard gets updated. Needed because start and
* end are still the same, and the selection needs to be owned */