diff --git a/terminal.c b/terminal.c index 631e8e68..27ea033a 100644 --- a/terminal.c +++ b/terminal.c @@ -1681,6 +1681,7 @@ term_destroy(struct terminal *term) free(term->foot_exe); free(term->cwd); + free(term->mouse_user_cursor); int ret = EXIT_SUCCESS; @@ -1820,6 +1821,8 @@ term_reset(struct terminal *term, bool hard) tll_free_and_free(term->window_title_stack, free); term_set_window_title(term, term->conf->title); + term_set_user_mouse_cursor(term, NULL); + memset(term->normal.kitty_kbd.flags, 0, sizeof(term->normal.kitty_kbd.flags)); memset(term->alt.kitty_kbd.flags, 0, sizeof(term->alt.kitty_kbd.flags)); term->normal.kitty_kbd.idx = term->alt.kitty_kbd.idx = 0; @@ -2986,7 +2989,11 @@ term_xcursor_update_for_seat(struct terminal *term, struct seat *seat) switch (term->active_surface) { case TERM_SURF_GRID: { + bool have_custom_cursor = + render_xcursor_is_valid(seat, term->mouse_user_cursor); + xcursor = seat->pointer.hidden ? XCURSOR_HIDDEN + : have_custom_cursor ? term->mouse_user_cursor : term->is_searching ? XCURSOR_LEFT_PTR : (seat->mouse.col >= 0 && seat->mouse.row >= 0 && @@ -3575,3 +3582,11 @@ term_osc8_close(struct terminal *term) term->vt.osc8.id = 0; term_update_ascii_printer(term); } + +void +term_set_user_mouse_cursor(struct terminal *term, const char *cursor) +{ + free(term->mouse_user_cursor); + term->mouse_user_cursor = cursor != NULL ? xstrdup(cursor) : NULL; + term_xcursor_update(term); +} diff --git a/terminal.h b/terminal.h index e42c94fc..187a5187 100644 --- a/terminal.h +++ b/terminal.h @@ -342,6 +342,7 @@ struct terminal { enum keypad_keys keypad_keys_mode; enum mouse_tracking mouse_tracking; enum mouse_reporting mouse_reporting; + char *mouse_user_cursor; /* For OSC-22 */ tll(int) tab_stops; @@ -771,6 +772,7 @@ void term_mouse_motion( bool term_mouse_grabbed(const struct terminal *term, const struct seat *seat); void term_xcursor_update(struct terminal *term); void term_xcursor_update_for_seat(struct terminal *term, struct seat *seat); +void term_set_user_mouse_cursor(struct terminal *term, const char *cursor); void term_set_window_title(struct terminal *term, const char *title); void term_flash(struct terminal *term, unsigned duration_ms);