|
32 | 32 | #include"nvim/fold.h" |
33 | 33 | #include"nvim/getchar.h" |
34 | 34 | #include"nvim/globals.h" |
| 35 | +#include"nvim/grid_defs.h" |
35 | 36 | #include"nvim/indent.h" |
36 | 37 | #include"nvim/keycodes.h" |
37 | 38 | #include"nvim/log.h" |
@@ -1443,6 +1444,63 @@ static void move_tab_to_mouse(void) |
1443 | 1444 | } |
1444 | 1445 | } |
1445 | 1446 |
|
| 1447 | +/// Call click definition function for column "col" in the "click_defs" array for button |
| 1448 | +/// "which_button". |
| 1449 | +staticvoidcall_click_def_func(StlClickDefinition*click_defs,intcol,intwhich_button) |
| 1450 | +{ |
| 1451 | +typval_Targv[]= { |
| 1452 | + { |
| 1453 | + .v_lock=VAR_FIXED, |
| 1454 | + .v_type=VAR_NUMBER, |
| 1455 | + .vval= { |
| 1456 | + .v_number= (varnumber_T)click_defs[col].tabnr |
| 1457 | + }, |
| 1458 | + }, |
| 1459 | + { |
| 1460 | + .v_lock=VAR_FIXED, |
| 1461 | + .v_type=VAR_NUMBER, |
| 1462 | + .vval= { |
| 1463 | + .v_number= ((mod_mask&MOD_MASK_MULTI_CLICK)==MOD_MASK_4CLICK |
| 1464 | + ?4 |
| 1465 | + : ((mod_mask&MOD_MASK_MULTI_CLICK)==MOD_MASK_3CLICK |
| 1466 | + ?3 |
| 1467 | + : ((mod_mask&MOD_MASK_MULTI_CLICK)==MOD_MASK_2CLICK |
| 1468 | + ?2 |
| 1469 | + :1))) |
| 1470 | + }, |
| 1471 | + }, |
| 1472 | + { |
| 1473 | + .v_lock=VAR_FIXED, |
| 1474 | + .v_type=VAR_STRING, |
| 1475 | + .vval= { |
| 1476 | + .v_string= (which_button==MOUSE_LEFT |
| 1477 | + ?"l" |
| 1478 | + : (which_button==MOUSE_RIGHT |
| 1479 | + ?"r" |
| 1480 | + : (which_button==MOUSE_MIDDLE |
| 1481 | + ?"m" |
| 1482 | + :"?"))) |
| 1483 | + }, |
| 1484 | + }, |
| 1485 | + { |
| 1486 | + .v_lock=VAR_FIXED, |
| 1487 | + .v_type=VAR_STRING, |
| 1488 | + .vval= { |
| 1489 | + .v_string= (char[]) { |
| 1490 | + (char)(mod_mask&MOD_MASK_SHIFT ?'s' :' '), |
| 1491 | + (char)(mod_mask&MOD_MASK_CTRL ?'c' :' '), |
| 1492 | + (char)(mod_mask&MOD_MASK_ALT ?'a' :' '), |
| 1493 | + (char)(mod_mask&MOD_MASK_META ?'m' :' '), |
| 1494 | +NUL |
| 1495 | + } |
| 1496 | + }, |
| 1497 | + } |
| 1498 | + }; |
| 1499 | +typval_Trettv; |
| 1500 | + (void)call_vim_function(click_defs[col].func,ARRAY_SIZE(argv),argv,&rettv); |
| 1501 | +tv_clear(&rettv); |
| 1502 | +} |
| 1503 | + |
1446 | 1504 | /// Do the appropriate action for the current mouse click in the current mode. |
1447 | 1505 | /// Not used for Command-line mode. |
1448 | 1506 | /// |
@@ -1492,6 +1550,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) |
1492 | 1550 | intjump_flags=0;// flags for jump_to_mouse() |
1493 | 1551 | pos_Tstart_visual; |
1494 | 1552 | boolmoved;// Has cursor moved? |
| 1553 | +boolin_winbar;// mouse in window bar |
1495 | 1554 | boolin_status_line;// mouse in status line |
1496 | 1555 | staticboolin_tab_line= false;// mouse clicked in tab line |
1497 | 1556 | boolin_sep_line;// mouse in vertical separator line |
@@ -1722,66 +1781,10 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) |
1722 | 1781 | } |
1723 | 1782 | } |
1724 | 1783 | break; |
1725 | | -casekStlClickFuncRun: { |
1726 | | -typval_Targv[]= { |
1727 | | - { |
1728 | | - .v_lock=VAR_FIXED, |
1729 | | - .v_type=VAR_NUMBER, |
1730 | | - .vval= { |
1731 | | - .v_number= (varnumber_T)tab_page_click_defs[mouse_col].tabnr |
1732 | | - }, |
1733 | | - }, |
1734 | | - { |
1735 | | - .v_lock=VAR_FIXED, |
1736 | | - .v_type=VAR_NUMBER, |
1737 | | - .vval= { |
1738 | | - .v_number= ((mod_mask&MOD_MASK_MULTI_CLICK)==MOD_MASK_4CLICK |
1739 | | - ?4 |
1740 | | - : ((mod_mask&MOD_MASK_MULTI_CLICK)==MOD_MASK_3CLICK |
1741 | | - ?3 |
1742 | | - : ((mod_mask&MOD_MASK_MULTI_CLICK)==MOD_MASK_2CLICK |
1743 | | - ?2 |
1744 | | - :1))) |
1745 | | - }, |
1746 | | - }, |
1747 | | - { |
1748 | | - .v_lock=VAR_FIXED, |
1749 | | - .v_type=VAR_STRING, |
1750 | | - .vval= { |
1751 | | - .v_string= (which_button==MOUSE_LEFT |
1752 | | - ?"l" |
1753 | | - : (which_button==MOUSE_RIGHT |
1754 | | - ?"r" |
1755 | | - : (which_button==MOUSE_MIDDLE |
1756 | | - ?"m" |
1757 | | - :"?"))) |
1758 | | - }, |
1759 | | - }, |
1760 | | - { |
1761 | | - .v_lock=VAR_FIXED, |
1762 | | - .v_type=VAR_STRING, |
1763 | | - .vval= { |
1764 | | - .v_string= (char[]) { |
1765 | | - (char)(mod_mask&MOD_MASK_SHIFT ?'s' :' '), |
1766 | | - (char)(mod_mask&MOD_MASK_CTRL ?'c' :' '), |
1767 | | - (char)(mod_mask&MOD_MASK_ALT ?'a' :' '), |
1768 | | - (char)(mod_mask&MOD_MASK_META ?'m' :' '), |
1769 | | -NUL |
1770 | | - } |
1771 | | - }, |
1772 | | - } |
1773 | | - }; |
1774 | | -typval_Trettv; |
1775 | | -funcexe_Tfuncexe=FUNCEXE_INIT; |
1776 | | -funcexe.firstline=curwin->w_cursor.lnum; |
1777 | | -funcexe.lastline=curwin->w_cursor.lnum; |
1778 | | -funcexe.evaluate= true; |
1779 | | - (void)call_func(tab_page_click_defs[mouse_col].func,-1, |
1780 | | -&rettv,ARRAY_SIZE(argv),argv,&funcexe); |
1781 | | -tv_clear(&rettv); |
| 1784 | +casekStlClickFuncRun: |
| 1785 | +call_click_def_func(tab_page_click_defs,mouse_col,which_button); |
1782 | 1786 | break; |
1783 | 1787 | } |
1784 | | - } |
1785 | 1788 | } |
1786 | 1789 | return true; |
1787 | 1790 | }elseif (is_drag&&in_tab_line) { |
@@ -1851,15 +1854,39 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) |
1851 | 1854 | oap==NULL ?NULL :&(oap->inclusive), |
1852 | 1855 | which_button); |
1853 | 1856 |
|
1854 | | -// A click in the window bar has no side effects. |
1855 | | -if (jump_flags&MOUSE_WINBAR) { |
1856 | | -return false; |
1857 | | - } |
1858 | | - |
1859 | 1857 | moved= (jump_flags&CURSOR_MOVED); |
| 1858 | +in_winbar= (jump_flags&MOUSE_WINBAR); |
1860 | 1859 | in_status_line= (jump_flags&IN_STATUS_LINE); |
1861 | 1860 | in_sep_line= (jump_flags&IN_SEP_LINE); |
1862 | 1861 |
|
| 1862 | +if ((in_winbar||in_status_line)&&is_click) { |
| 1863 | +// Handle click event on window bar or status lin |
| 1864 | +intclick_grid=mouse_grid; |
| 1865 | +intclick_row=mouse_row; |
| 1866 | +intclick_col=mouse_col; |
| 1867 | +win_T*wp=mouse_find_win(&click_grid,&click_row,&click_col); |
| 1868 | + |
| 1869 | +StlClickDefinition*click_defs=in_status_line ?wp->w_status_click_defs |
| 1870 | + :wp->w_winbar_click_defs; |
| 1871 | + |
| 1872 | +if (click_defs!=NULL) { |
| 1873 | +switch (click_defs[click_col].type) { |
| 1874 | +casekStlClickDisabled: |
| 1875 | +break; |
| 1876 | +casekStlClickFuncRun: |
| 1877 | +call_click_def_func(click_defs,click_col,which_button); |
| 1878 | +break; |
| 1879 | +default: |
| 1880 | +assert(false&&"winbar and statusline only support %@ for clicks"); |
| 1881 | +break; |
| 1882 | + } |
| 1883 | + } |
| 1884 | + |
| 1885 | +return false; |
| 1886 | + }elseif (in_winbar) { |
| 1887 | +// A drag or release event in the window bar has no side effects. |
| 1888 | +return false; |
| 1889 | + } |
1863 | 1890 |
|
1864 | 1891 | // When jumping to another window, clear a pending operator. That's a bit |
1865 | 1892 | // friendlier than beeping and not jumping to that window. |
|