mirror of
https://github.com/mintycube/st.git
synced 2024-10-22 14:05:49 +02:00
osc133: initial patch implementation (#127)
* osc133: initial patch implementation * Specify dependency on reflow or scrollback patch
This commit is contained in:
parent
e7bdaa65d7
commit
fe065cc366
@ -467,6 +467,10 @@ static Shortcut shortcuts[] = {
|
||||
#if INVERT_PATCH
|
||||
{ TERMMOD, XK_X, invert, { 0 } },
|
||||
#endif // INVERT_PATCH
|
||||
#if OSC133_PATCH
|
||||
{ TERMMOD, XK_Z, scrolltoprompt, {.i = -1}, S_PRI },
|
||||
{ TERMMOD, XK_X, scrolltoprompt, {.i = 1}, S_PRI },
|
||||
#endif // OSC133_PATCH
|
||||
};
|
||||
|
||||
/*
|
||||
|
27
patch/osc133.c
Normal file
27
patch/osc133.c
Normal file
@ -0,0 +1,27 @@
|
||||
void scrolltoprompt(const Arg *arg) {
|
||||
int x, y;
|
||||
#if REFLOW_PATCH
|
||||
int top = term.scr - term.histf;
|
||||
#else
|
||||
int top = term.scr - term.histn;
|
||||
#endif // REFLOW_PATCH
|
||||
int bot = term.scr + term.row-1;
|
||||
int dy = arg->i;
|
||||
Line line;
|
||||
|
||||
if (!dy || tisaltscr())
|
||||
return;
|
||||
|
||||
for (y = dy; y >= top && y <= bot; y += dy) {
|
||||
for (line = TLINE(y), x = 0; x < term.col; x++) {
|
||||
if (line[x].mode & ATTR_FTCS_PROMPT)
|
||||
goto scroll;
|
||||
}
|
||||
}
|
||||
|
||||
scroll:
|
||||
if (dy < 0)
|
||||
kscrollup(&((Arg){ .i = -y }));
|
||||
else
|
||||
kscrolldown(&((Arg){ .i = y }));
|
||||
}
|
1
patch/osc133.h
Normal file
1
patch/osc133.h
Normal file
@ -0,0 +1 @@
|
||||
static void scrolltoprompt(const Arg *);
|
@ -46,4 +46,7 @@
|
||||
#endif
|
||||
#if XRESOURCES_PATCH
|
||||
#include "xresources.c"
|
||||
#endif
|
||||
#endif
|
||||
#if OSC133_PATCH
|
||||
#include "osc133.c"
|
||||
#endif
|
||||
|
@ -41,3 +41,6 @@
|
||||
#if XRESOURCES_PATCH
|
||||
#include "xresources.h"
|
||||
#endif
|
||||
#if OSC133_PATCH
|
||||
#include "osc133.h"
|
||||
#endif
|
||||
|
@ -301,6 +301,13 @@
|
||||
*/
|
||||
#define OPENURLONCLICK_PATCH 0
|
||||
|
||||
/* This patch allows jumping between prompts by utilizing the OSC 133 escape sequence
|
||||
* emitted by shells. Must be used with either reflow or scrollback patch.
|
||||
*
|
||||
* https://codeberg.org/dnkl/foot#jumping-between-prompts
|
||||
*/
|
||||
#define OSC133_PATCH 0
|
||||
|
||||
/* Reflow.
|
||||
* Allows st to be resized without cutting off text when the terminal window is made larger again.
|
||||
* Text wraps when the terminal window is made smaller.
|
||||
|
22
st.c
22
st.c
@ -2699,6 +2699,25 @@ strhandle(void)
|
||||
tfulldirt();
|
||||
}
|
||||
return;
|
||||
#if OSC133_PATCH
|
||||
case 133:
|
||||
if (narg < 2)
|
||||
break;
|
||||
switch (*strescseq.args[1]) {
|
||||
case 'A':
|
||||
term.c.attr.mode |= ATTR_FTCS_PROMPT;
|
||||
break;
|
||||
/* We don't handle these arguments yet */
|
||||
case 'B':
|
||||
case 'C':
|
||||
case 'D':
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "erresc: unknown OSC 133 argument: %c\n", *strescseq.args[1]);
|
||||
break;
|
||||
}
|
||||
return;
|
||||
#endif // OSC133_PATCH
|
||||
}
|
||||
break;
|
||||
case 'k': /* old title set compatibility */
|
||||
@ -3449,6 +3468,9 @@ check_control_code:
|
||||
}
|
||||
|
||||
tsetchar(u, &term.c.attr, term.c.x, term.c.y);
|
||||
#if OSC133_PATCH
|
||||
term.c.attr.mode &= ~ATTR_FTCS_PROMPT;
|
||||
#endif // OSC133_PATCH
|
||||
term.lastc = u;
|
||||
|
||||
if (width == 2) {
|
||||
|
Loading…
Reference in New Issue
Block a user