move update_cursor_trail out of child_monitor_c
This commit is contained in:
parent
c3eb48fc8a
commit
761fb6f233
4 changed files with 63 additions and 60 deletions
|
|
@ -705,63 +705,6 @@ change_menubar_title(PyObject *title UNUSED) {
|
|||
#endif
|
||||
}
|
||||
|
||||
inline static float
|
||||
norm(float x, float y) {
|
||||
return sqrtf(x * x + y * y);
|
||||
}
|
||||
|
||||
static bool
|
||||
update_cursor_trail(CursorTrail *ct, Window *w, monotonic_t now) {
|
||||
#define WD w->render_data
|
||||
// the trail corners move towards the cursor corner at a speed proportional to their distance from the cursor corner.
|
||||
// equivalent to exponential ease out animation.
|
||||
static const int ci[4][2] = {{1, 0}, {1, 1}, {0, 1}, {0, 0}};
|
||||
float cursor_edge_x[2], cursor_edge_y[2];
|
||||
cursor_edge_x[0] = WD.xstart + WD.screen->cursor_render_info.x * WD.dx;
|
||||
cursor_edge_x[1] = cursor_edge_x[0] + WD.dx;
|
||||
cursor_edge_y[0] = WD.ystart - WD.screen->cursor_render_info.y * WD.dy;
|
||||
cursor_edge_y[1] = cursor_edge_y[0] - WD.dy;
|
||||
|
||||
// todo - make these configurable
|
||||
// the decay time for the trail to reach 1/1024 of its distance from the cursor corner
|
||||
float decay_fast = 0.10f;
|
||||
float decay_slow = 0.40f;
|
||||
|
||||
if (OPT(input_delay) < now - WD.screen->cursor->updated_at && ct->updated_at < now) {
|
||||
float cursor_center_x = (cursor_edge_x[0] + cursor_edge_x[1]) * 0.5f;
|
||||
float cursor_center_y = (cursor_edge_y[0] + cursor_edge_y[1]) * 0.5f;
|
||||
float cursor_diag_2 = norm(cursor_edge_x[1] - cursor_edge_x[0], cursor_edge_y[1] - cursor_edge_y[0]) * 0.5;
|
||||
float dt = monotonic_t_to_s_double(now - ct->updated_at);
|
||||
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
float dx = cursor_edge_x[ci[i][0]] - ct->corner_x[i];
|
||||
float dy = cursor_edge_y[ci[i][1]] - ct->corner_y[i];
|
||||
float dist = norm(dx, dy);
|
||||
if (dist == 0) {
|
||||
continue;
|
||||
}
|
||||
float dot = (dx * (cursor_edge_x[ci[i][0]] - cursor_center_x) +
|
||||
dy * (cursor_edge_y[ci[i][1]] - cursor_center_y)) /
|
||||
cursor_diag_2 / dist;
|
||||
|
||||
float decay_seconds = decay_slow + (decay_fast - decay_slow) * (1.0f + dot) * 0.5f;
|
||||
float step = 1.0f - 1.0f / exp2f(10.0f * dt / decay_seconds);
|
||||
|
||||
ct->corner_x[i] += dx * step;
|
||||
ct->corner_y[i] += dy * step;
|
||||
}
|
||||
}
|
||||
ct->updated_at = now;
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
float dx = cursor_edge_x[ci[i][0]] - ct->corner_x[i];
|
||||
float dy = cursor_edge_y[ci[i][1]] - ct->corner_y[i];
|
||||
if (dx * dx + dy * dy >= 1e-6) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool
|
||||
prepare_to_render_os_window(OSWindow *os_window, monotonic_t now, unsigned int *active_window_id, color_type *active_window_bg, unsigned int *num_visible_windows, bool *all_windows_have_same_bg, bool scan_for_animated_images) {
|
||||
#define TD os_window->tab_bar_render_data
|
||||
|
|
@ -785,6 +728,7 @@ prepare_to_render_os_window(OSWindow *os_window, monotonic_t now, unsigned int *
|
|||
color_type first_window_bg = 0;
|
||||
for (unsigned int i = 0; i < tab->num_windows; i++) {
|
||||
Window *w = tab->windows + i;
|
||||
#define WD w->render_data
|
||||
if (w->visible && WD.screen) {
|
||||
screen_check_pause_rendering(WD.screen, now);
|
||||
*num_visible_windows += 1;
|
||||
|
|
@ -865,7 +809,7 @@ render_prepared_os_window(OSWindow *os_window, unsigned int active_window_id, co
|
|||
w->cursor_opacity_at_last_render = WD.screen->cursor_render_info.opacity; w->last_cursor_shape = WD.screen->cursor_render_info.shape;
|
||||
}
|
||||
}
|
||||
if (true) draw_trail(&tab->cursor_trail);
|
||||
if (true) draw_cursor_trail(&tab->cursor_trail);
|
||||
if (os_window->live_resize.in_progress) draw_resizing_text(os_window);
|
||||
swap_window_buffers(os_window);
|
||||
os_window->last_active_tab = os_window->active_tab; os_window->last_num_tabs = os_window->num_tabs; os_window->last_active_window_id = active_window_id;
|
||||
|
|
|
|||
58
kitty/cursor_trail.c
Normal file
58
kitty/cursor_trail.c
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
#include "state.h"
|
||||
|
||||
inline static float
|
||||
norm(float x, float y) {
|
||||
return sqrtf(x * x + y * y);
|
||||
}
|
||||
|
||||
bool
|
||||
update_cursor_trail(CursorTrail *ct, Window *w, monotonic_t now) {
|
||||
#define WD w->render_data
|
||||
// the trail corners move towards the cursor corner at a speed proportional to their distance from the cursor corner.
|
||||
// equivalent to exponential ease out animation.
|
||||
static const int ci[4][2] = {{1, 0}, {1, 1}, {0, 1}, {0, 0}};
|
||||
float cursor_edge_x[2], cursor_edge_y[2];
|
||||
cursor_edge_x[0] = WD.xstart + WD.screen->cursor_render_info.x * WD.dx;
|
||||
cursor_edge_x[1] = cursor_edge_x[0] + WD.dx;
|
||||
cursor_edge_y[0] = WD.ystart - WD.screen->cursor_render_info.y * WD.dy;
|
||||
cursor_edge_y[1] = cursor_edge_y[0] - WD.dy;
|
||||
|
||||
// todo - make these configurable
|
||||
// the decay time for the trail to reach 1/1024 of its distance from the cursor corner
|
||||
float decay_fast = 0.10f;
|
||||
float decay_slow = 0.40f;
|
||||
|
||||
if (OPT(input_delay) < now - WD.screen->cursor->updated_at && ct->updated_at < now) {
|
||||
float cursor_center_x = (cursor_edge_x[0] + cursor_edge_x[1]) * 0.5f;
|
||||
float cursor_center_y = (cursor_edge_y[0] + cursor_edge_y[1]) * 0.5f;
|
||||
float cursor_diag_2 = norm(cursor_edge_x[1] - cursor_edge_x[0], cursor_edge_y[1] - cursor_edge_y[0]) * 0.5;
|
||||
float dt = monotonic_t_to_s_double(now - ct->updated_at);
|
||||
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
float dx = cursor_edge_x[ci[i][0]] - ct->corner_x[i];
|
||||
float dy = cursor_edge_y[ci[i][1]] - ct->corner_y[i];
|
||||
float dist = norm(dx, dy);
|
||||
if (dist == 0) {
|
||||
continue;
|
||||
}
|
||||
float dot = (dx * (cursor_edge_x[ci[i][0]] - cursor_center_x) +
|
||||
dy * (cursor_edge_y[ci[i][1]] - cursor_center_y)) /
|
||||
cursor_diag_2 / dist;
|
||||
|
||||
float decay_seconds = decay_slow + (decay_fast - decay_slow) * (1.0f + dot) * 0.5f;
|
||||
float step = 1.0f - 1.0f / exp2f(10.0f * dt / decay_seconds);
|
||||
|
||||
ct->corner_x[i] += dx * step;
|
||||
ct->corner_y[i] += dy * step;
|
||||
}
|
||||
}
|
||||
ct->updated_at = now;
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
float dx = cursor_edge_x[ci[i][0]] - ct->corner_x[i];
|
||||
float dy = cursor_edge_y[ci[i][1]] - ct->corner_y[i];
|
||||
if (dx * dx + dy * dy >= 1e-6) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -1145,7 +1145,7 @@ init_trail_program(void) {
|
|||
}
|
||||
|
||||
void
|
||||
draw_trail(CursorTrail *trail) {
|
||||
draw_cursor_trail(CursorTrail *trail) {
|
||||
glEnable(GL_BLEND);
|
||||
// BLEND_PREMULT
|
||||
/*glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE);*/
|
||||
|
|
|
|||
|
|
@ -359,7 +359,8 @@ ssize_t create_border_vao(void);
|
|||
bool send_cell_data_to_gpu(ssize_t, float, float, float, float, Screen *, OSWindow *);
|
||||
void draw_cells(ssize_t, const WindowRenderData*, OSWindow *, bool, bool, bool, Window*);
|
||||
void draw_centered_alpha_mask(OSWindow *w, size_t screen_width, size_t screen_height, size_t width, size_t height, uint8_t *canvas, float);
|
||||
void draw_trail(CursorTrail *trail);
|
||||
void draw_cursor_trail(CursorTrail *trail);
|
||||
bool update_cursor_trail(CursorTrail *ct, Window *w, monotonic_t now);
|
||||
void update_surface_size(int, int, uint32_t);
|
||||
void free_texture(uint32_t*);
|
||||
void free_framebuffer(uint32_t*);
|
||||
|
|
|
|||
Loading…
Reference in a new issue