Skip to content

Commit

Permalink
osc133: initial patch implementation (#127)
Browse files Browse the repository at this point in the history
* osc133: initial patch implementation

* Specify dependency on reflow or scrollback patch
  • Loading branch information
UtkarshVerma authored Oct 1, 2024
1 parent e7bdaa6 commit fe065cc
Show file tree
Hide file tree
Showing 8 changed files with 71 additions and 1 deletion.
4 changes: 4 additions & 0 deletions config.def.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
};

/*
Expand Down
27 changes: 27 additions & 0 deletions patch/osc133.c
Original file line number Diff line number Diff line change
@@ -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 change: 1 addition & 0 deletions patch/osc133.h
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
static void scrolltoprompt(const Arg *);
5 changes: 4 additions & 1 deletion patch/x_include.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,7 @@
#endif
#if XRESOURCES_PATCH
#include "xresources.c"
#endif
#endif
#if OSC133_PATCH
#include "osc133.c"
#endif
3 changes: 3 additions & 0 deletions patch/x_include.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,6 @@
#if XRESOURCES_PATCH
#include "xresources.h"
#endif
#if OSC133_PATCH
#include "osc133.h"
#endif
7 changes: 7 additions & 0 deletions patches.def.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
22 changes: 22 additions & 0 deletions st.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -3449,6 +3468,9 @@ tputc(Rune u)
}

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) {
Expand Down
3 changes: 3 additions & 0 deletions st.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit fe065cc

Please sign in to comment.