Add cursor movement helpers

Add functions to move the cursor of a console.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2011-11-27 15:50:59 +01:00
parent 89634f3f13
commit 0cf9a7a03c
2 changed files with 91 additions and 0 deletions

View File

@ -17,6 +17,7 @@
#define GL_GLEXT_PROTOTYPES
#include <errno.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
@ -33,18 +34,27 @@ struct kmscon_cell {
struct kmscon_console {
size_t ref;
/* GL texture */
GLuint tex;
uint32_t res_x;
uint32_t res_y;
/* cairo surface */
cairo_t *cr;
cairo_surface_t *surf;
unsigned char *surf_buf;
/* console cells */
uint32_t lines_x;
uint32_t lines_y;
struct kmscon_cell *cells;
bool cells_dirty;
/* cursor position */
uint32_t cursor_x;
uint32_t cursor_y;
/* active font */
struct kmscon_font *font;
};
@ -74,6 +84,7 @@ int kmscon_console_new(struct kmscon_console **out)
memset(con, 0, sizeof(*con));
con->ref = 1;
con->cells_dirty = true;
ret = kmscon_console_set_res(con, 800, 600);
if (ret)
@ -251,6 +262,9 @@ void kmscon_console_draw(struct kmscon_console *con)
glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA, con->res_x, con->res_y,
0, GL_BGRA, GL_UNSIGNED_BYTE, con->surf_buf);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
/* reset dirty flags */
con->cells_dirty = false;
}
/*
@ -344,3 +358,73 @@ err_font:
kmscon_font_unref(font);
return ret;
}
void kmscon_console_cursor_get(struct kmscon_console *con, uint32_t *x,
uint32_t *y)
{
if (!con) {
if (x)
*x = 0;
if (y)
*y = 0;
return;
}
if (x)
*x = con->cursor_x;
if (y)
*y = con->cursor_y;
}
void kmscon_console_cursor_move(struct kmscon_console *con, int32_t x,
int32_t y)
{
int32_t tx, ty;
if (!con)
return;
tx = con->cursor_x;
ty = con->cursor_y;
tx += x;
ty += y;
if (tx < 0)
tx = 0;
if (ty < 0)
ty = 0;
while (tx >= con->lines_x) {
tx -= con->lines_x;
ty++;
}
if (ty >= con->lines_y)
ty = con->lines_y - 1;
con->cursor_x += tx;
con->cursor_y += ty;
con->cells_dirty = true;
}
void kmscon_console_cursor_goto(struct kmscon_console *con, uint32_t x,
uint32_t y)
{
if (!con)
return;
con->cursor_x = x;
con->cursor_y = y;
while (con->cursor_x >= con->lines_x) {
con->cursor_x -= con->lines_x;
con->cursor_y++;
}
if (con->cursor_y >= con->lines_y)
con->cursor_y = con->lines_y - 1;
con->cells_dirty = true;
}

View File

@ -53,3 +53,10 @@ void kmscon_console_draw(struct kmscon_console *con);
void kmscon_console_map(struct kmscon_console *con);
int kmscon_console_resize(struct kmscon_console *con, uint32_t x, uint32_t y);
void kmscon_console_cursor_get(struct kmscon_console *con, uint32_t *x,
uint32_t *y);
void kmscon_console_cursor_move(struct kmscon_console *con, int32_t x,
int32_t y);
void kmscon_console_cursor_goto(struct kmscon_console *con, uint32_t x,
uint32_t y);