console: add basic cursor movements
Add functions to move the cursor up/down/left/right. We must take care of integer overflows here as the application may send us arbitrarily big numbers. Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
parent
466fcc3b06
commit
d8ff83c5cb
@ -306,3 +306,98 @@ void kmscon_console_move_to(struct kmscon_console *con, unsigned int x,
|
|||||||
con->cursor_y = con->cells_y - 1;
|
con->cursor_y = con->cells_y - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void kmscon_console_move_up(struct kmscon_console *con, unsigned int num,
|
||||||
|
bool scroll)
|
||||||
|
{
|
||||||
|
unsigned int diff;
|
||||||
|
|
||||||
|
if (!con || !num)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (num > con->cells_y)
|
||||||
|
num = con->cells_y;
|
||||||
|
|
||||||
|
if (con->rel_addr) {
|
||||||
|
diff = con->cursor_y - con->margin_top;
|
||||||
|
if (num > diff) {
|
||||||
|
num -= diff;
|
||||||
|
if (scroll)
|
||||||
|
kmscon_buffer_scroll_down(con->cells, num);
|
||||||
|
con->cursor_y = con->margin_top;
|
||||||
|
} else {
|
||||||
|
con->cursor_y -= num;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (num > con->cursor_y) {
|
||||||
|
num -= con->cursor_y;
|
||||||
|
if (scroll)
|
||||||
|
kmscon_buffer_scroll_down(con->cells, num);
|
||||||
|
con->cursor_y = 0;
|
||||||
|
} else {
|
||||||
|
con->cursor_y -= num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void kmscon_console_move_down(struct kmscon_console *con, unsigned int num,
|
||||||
|
bool scroll)
|
||||||
|
{
|
||||||
|
unsigned int diff;
|
||||||
|
|
||||||
|
if (!con || !num)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (num > con->cells_y)
|
||||||
|
num = con->cells_y;
|
||||||
|
|
||||||
|
if (con->rel_addr) {
|
||||||
|
diff = con->margin_bottom - con->cursor_y;
|
||||||
|
if (num > diff) {
|
||||||
|
num -= diff;
|
||||||
|
if (scroll)
|
||||||
|
kmscon_buffer_scroll_up(con->cells, num);
|
||||||
|
con->cursor_y = con->margin_bottom;
|
||||||
|
} else {
|
||||||
|
con->cursor_y += num;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
diff = con->cells_y - con->cursor_y - 1;
|
||||||
|
if (num > diff) {
|
||||||
|
num -= diff;
|
||||||
|
if (scroll)
|
||||||
|
kmscon_buffer_scroll_up(con->cells, num);
|
||||||
|
con->cursor_y = con->cells_y - 1;
|
||||||
|
} else {
|
||||||
|
con->cursor_y += num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void kmscon_console_move_left(struct kmscon_console *con, unsigned int num)
|
||||||
|
{
|
||||||
|
if (!con || !num)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (num > con->cells_x)
|
||||||
|
num = con->cells_x;
|
||||||
|
|
||||||
|
if (num > con->cursor_x)
|
||||||
|
con->cursor_x = 0;
|
||||||
|
else
|
||||||
|
con->cursor_x -= num;
|
||||||
|
}
|
||||||
|
|
||||||
|
void kmscon_console_move_right(struct kmscon_console *con, unsigned int num)
|
||||||
|
{
|
||||||
|
if (!con || !num)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (num > con->cells_x)
|
||||||
|
num = con->cells_x;
|
||||||
|
|
||||||
|
if (num + con->cursor_x >= con->cells_x)
|
||||||
|
con->cursor_x = con->cells_x - 1;
|
||||||
|
else
|
||||||
|
con->cursor_x += num;
|
||||||
|
}
|
||||||
|
@ -91,5 +91,11 @@ void kmscon_console_write(struct kmscon_console *con, kmscon_symbol_t ch);
|
|||||||
void kmscon_console_newline(struct kmscon_console *con);
|
void kmscon_console_newline(struct kmscon_console *con);
|
||||||
void kmscon_console_move_to(struct kmscon_console *con, unsigned int x,
|
void kmscon_console_move_to(struct kmscon_console *con, unsigned int x,
|
||||||
unsigned int y);
|
unsigned int y);
|
||||||
|
void kmscon_console_move_up(struct kmscon_console *con, unsigned int num,
|
||||||
|
bool scroll);
|
||||||
|
void kmscon_console_move_down(struct kmscon_console *con, unsigned int num,
|
||||||
|
bool scroll);
|
||||||
|
void kmscon_console_move_left(struct kmscon_console *con, unsigned int num);
|
||||||
|
void kmscon_console_move_right(struct kmscon_console *con, unsigned int num);
|
||||||
|
|
||||||
#endif /* KMSCON_CONSOLE_H */
|
#endif /* KMSCON_CONSOLE_H */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user