// // Created by william on 1/12/24. // #include #include "cursor.h" void cursor_init(Cursor *cursor, WINDOW *window, int max_x, int max_y) { cursor->window = window; cursor->min_x = 1; cursor->min_y = 1; cursor->max_x = max_x; cursor->max_y = max_y; cursor->multiplier_x = 1; cursor->multiplier_y = 1; cursor->width = 1; cursor->pos_x = 0; cursor->pos_y = 0; cursor->enabled = false; } void cursor_set_at(Cursor *cursor, int at) { int win_x = cursor->min_x + cursor->pos_x * cursor->multiplier_x; int win_y = cursor->min_y + cursor->pos_y * cursor->multiplier_y; mvwchgat(cursor->window, win_y, win_x, cursor->width, at, 0, NULL); } void cursor_enable(Cursor *cursor) { cursor_set_at(cursor, CURSOR_AT_ENABLED); cursor->enabled = true; } void cursor_disable(Cursor *cursor) { cursor_set_at(cursor, CURSOR_AT_DISABLED); cursor->enabled = false; } void cursor_set_pos(Cursor *cursor, int x, int y) { assert(x >= 0); assert(y >= 0); bool enabled = cursor->enabled; if (enabled) { // Remove the cursor from its old position cursor_disable(cursor); } cursor->pos_x = x; cursor->pos_y = y; if (enabled) { // Display the cursor in the new position cursor_enable(cursor); } } int cursor_limit(int value, int limit) { if (value < 0) { return 0; } if (value > limit) { return limit; } return value; } void cursor_move(Cursor *cursor, int offset_x, int offset_y) { int x = cursor->pos_x + offset_x; x = cursor_limit(x, cursor->max_x); int y = cursor->pos_y + offset_y; y = cursor_limit(y, cursor->max_y); cursor_set_pos(cursor, x, y); }