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
8 changed files with 71 additions and 1 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
3
st.h
3
st.h
|
|
@ -70,6 +70,9 @@ enum glyph_attribute {
|
|||
ATTR_HIGHLIGHT = 1 << 17,
|
||||
#endif // KEYBOARDSELECT_PATCH
|
||||
ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT,
|
||||
#if OSC133_PATCH
|
||||
ATTR_FTCS_PROMPT = 1 << 18, /* OSC 133 ; A ST */
|
||||
#endif // OSC133_PATCH
|
||||
};
|
||||
|
||||
#if SIXEL_PATCH
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue