diff --git a/README.md b/README.md index 941aedc..9ca6962 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ Refer to [https://st.suckless.org/](https://st.suckless.org/) for details on the ### Changelog: +2021-05-16 - Added swapmouse patch + 2021-05-11 - Added default cursor patch 2021-05-10 - Upgrade to 46b02f, 2021-03-28 @@ -180,7 +182,8 @@ Refer to [https://st.suckless.org/](https://st.suckless.org/) for details on the [theme.sh](https://github.com/lemnos/theme.sh) which expect these colours to be distinct - [relativeborder](https://st.suckless.org/patches/relativeborder/) - - allows you to specify a border that is relative in size to the width of a cell in the terminal + - allows you to specify a border that is relative in size to the width of a cell in the + terminal - [right-click-to-plumb](https://st.suckless.org/patches/right_click_to_plumb/) - allows you to right-click on some selected text to send it to the plumbing program of choice @@ -192,16 +195,23 @@ Refer to [https://st.suckless.org/](https://st.suckless.org/) for details on the - this patch adds SIXEL graphics support - st-embedder - - this patch allows clients to embed into the st window and can be useful if you tend to start X applications from the terminal + - this patch allows clients to embed into the st window and can be useful if you tend to + start X applications from the terminal - the behavior is similar to Plan 9 where applications can take over windows - [spoiler](https://st.suckless.org/patches/spoiler/) - use inverted defaultbg/fg for selection when bg/fg are the same + - [swapmouse](https://st.suckless.org/patches/swapmouse/) + - changes the mouse shape to the global default when the running program subscribes for mouse + events, for instance, in programs like ranger and fzf + - it emulates the behaviour shown by vte terminals like termite + - [sync](https://st.suckless.org/patches/sync/) - adds synchronized-updates/application-sync support in st - this has no effect except when an application uses the synchronized-update escape sequences - - with this patch nearly all cursor flicker is eliminated in tmux, and tmux detects it automatically via terminfo + - with this patch nearly all cursor flicker is eliminated in tmux, and tmux detects it + automatically via terminfo - [themed-cursor](https://st.suckless.org/patches/themed_cursor/) - instead of a default X cursor, use the xterm cursor from your cursor theme diff --git a/patches.def.h b/patches.def.h index 895f127..88f5ee1 100644 --- a/patches.def.h +++ b/patches.def.h @@ -293,6 +293,13 @@ */ #define SPOILER_PATCH 0 +/* This patch changes the mouse shape to the global default when the running program subscribes + * for mouse events, for instance, in programs like ranger and fzf. It emulates the behaviour + * shown by vte terminals like termite. + * https://st.suckless.org/patches/swapmouse/ + */ +#define SWAPMOUSE_PATCH 0 + /* This patch adds synchronized-updates/application-sync support in st. * This will have no effect except when an application uses the synchronized-update escape * sequences. With this patch nearly all cursor flicker is eliminated in tmux, and tmux detects diff --git a/x.c b/x.c index 68d3c7d..3eed6fb 100644 --- a/x.c +++ b/x.c @@ -199,6 +199,10 @@ static int bellon = 0; /* visual bell status */ #if RELATIVEBORDER_PATCH int borderpx; #endif // RELATIVEBORDER_PATCH +#if SWAPMOUSE_PATCH +static Cursor cursor; +static XColor xmousefg, xmousebg; +#endif // SWAPMOUSE_PATCH #include "patch/x_include.c" @@ -723,7 +727,14 @@ bmotion(XEvent *e) { #if HIDECURSOR_PATCH if (!xw.pointerisvisible) { + #if SWAPMOUSE_PATCH + if (win.mode & MODE_MOUSE) + XUndefineCursor(xw.dpy, xw.win); + else + XDefineCursor(xw.dpy, xw.win, xw.vpointer); + #else XDefineCursor(xw.dpy, xw.win, xw.vpointer); + #endif // SWAPMOUSE_PATCH xw.pointerisvisible = 1; if (!IS_SET(MODE_MOUSEMANY)) xsetpointermotion(0); @@ -1255,12 +1266,14 @@ xinit(int cols, int rows) XGCValues gcvalues; #if HIDECURSOR_PATCH Pixmap blankpm; - #else + #elif !SWAPMOUSE_PATCH Cursor cursor; #endif // HIDECURSOR_PATCH Window parent; pid_t thispid = getpid(); + #if !SWAPMOUSE_PATCH XColor xmousefg, xmousebg; + #endif // SWAPMOUSE_PATCH #if ALPHA_PATCH XWindowAttributes attr; XVisualInfo vis; @@ -2398,6 +2411,18 @@ xsetmode(int set, unsigned int flags) { int mode = win.mode; MODBIT(win.mode, set, flags); + #if SWAPMOUSE_PATCH + if ((flags & MODE_MOUSE) + #if HIDECURSOR_PATCH + && xw.pointerisvisible + #endif // HIDECURSOR_PATCH + ) { + if (win.mode & MODE_MOUSE) + XUndefineCursor(xw.dpy, xw.win); + else + XDefineCursor(xw.dpy, xw.win, cursor); + } + #endif // SWAPMOUSE_PATCH if ((win.mode & MODE_REVERSE) != (mode & MODE_REVERSE)) redraw(); }