console: make buffer code private

The buffer should not be accessed from code outside of console.c so make
it private. This includes some code-moving but no bigger changes. The diff
might look scary, though.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2012-04-01 12:50:17 +02:00
parent d01ad92bf8
commit c25a2bb249
2 changed files with 150 additions and 175 deletions

View File

@ -1,7 +1,7 @@
/*
* kmscon - Console Management
*
* Copyright (c) 2011 David Herrmann <dh.herrmann@googlemail.com>
* Copyright (c) 2011-2012 David Herrmann <dh.herrmann@googlemail.com>
* Copyright (c) 2011 University of Tuebingen
*
* Permission is hereby granted, free of charge, to any person obtaining
@ -257,76 +257,6 @@ static struct line *get_line(struct kmscon_buffer *buf, unsigned int y)
return NULL;
}
int kmscon_buffer_new(struct kmscon_buffer **out, unsigned int x,
unsigned int y)
{
struct kmscon_buffer *buf;
int ret;
if (!out)
return -EINVAL;
buf = malloc(sizeof(*buf));
if (!buf)
return -ENOMEM;
memset(buf, 0, sizeof(*buf));
buf->ref = 1;
ret = gl_m4_stack_new(&buf->stack);
if (ret)
goto err_free;
ret = kmscon_buffer_resize(buf, x, y);
if (ret)
goto err_stack;
log_debug("new buffer object");
*out = buf;
return 0;
err_stack:
gl_m4_stack_free(buf->stack);
err_free:
free(buf);
return ret;
}
void kmscon_buffer_ref(struct kmscon_buffer *buf)
{
if (!buf)
return;
++buf->ref;
}
void kmscon_buffer_unref(struct kmscon_buffer *buf)
{
unsigned int i;
if (!buf || !buf->ref)
return;
if (--buf->ref)
return;
log_debug("destroying buffer object");
kmscon_buffer_clear_sb(buf);
for (i = 0; i < buf->scroll_y; ++i)
free_line(buf->scroll_buf[i]);
for (i = 0; i < buf->mtop_y; ++i)
free_line(buf->mtop_buf[i]);
for (i = 0; i < buf->mbottom_y; ++i)
free_line(buf->mbottom_buf[i]);
free(buf->scroll_buf);
free(buf->mtop_buf);
free(buf->mbottom_buf);
gl_m4_stack_free(buf->stack);
free(buf);
}
/*
* This links the given line into the scrollback-buffer. This always succeeds.
*/
@ -401,59 +331,6 @@ static struct line *get_from_scrollback(struct kmscon_buffer *buf)
return line;
}
/* set maximum scrollback buffer size */
void kmscon_buffer_set_max_sb(struct kmscon_buffer *buf, unsigned int max)
{
struct line *line;
if (!buf)
return;
while (buf->sb_count > max) {
line = buf->sb_first;
if (!line)
break;
buf->sb_first = line->next;
if (line->next)
line->next->prev = NULL;
else
buf->sb_last = NULL;
buf->sb_count--;
if (buf->position == line) {
if (buf->sb_first)
buf->position = buf->sb_first;
else
buf->position = NULL;
}
free_line(line);
}
buf->sb_max = max;
}
/* clear scrollback buffer */
void kmscon_buffer_clear_sb(struct kmscon_buffer *buf)
{
struct line *iter, *tmp;
if (!buf)
return;
for (iter = buf->sb_first; iter; ) {
tmp = iter;
iter = iter->next;
free_line(tmp);
}
buf->sb_first = NULL;
buf->sb_last = NULL;
buf->sb_count = 0;
buf->position = NULL;
}
/*
* Resize scroll buffer. Despite being used for scroll region only, it is kept
* big enough to hold both margins too. We do this to allow fast merges of
@ -637,7 +514,7 @@ static int resize_mbottom(struct kmscon_buffer *buf, unsigned int y)
* any way. This would take too long if multiple resize-operations are
* performed.
*/
int kmscon_buffer_resize(struct kmscon_buffer *buf, unsigned int x,
static int kmscon_buffer_resize(struct kmscon_buffer *buf, unsigned int x,
unsigned int y)
{
int ret;
@ -674,8 +551,133 @@ int kmscon_buffer_resize(struct kmscon_buffer *buf, unsigned int x,
return 0;
}
int kmscon_buffer_set_margins(struct kmscon_buffer *buf, unsigned int top,
unsigned int bottom)
/* set maximum scrollback buffer size */
static void kmscon_buffer_set_max_sb(struct kmscon_buffer *buf,
unsigned int max)
{
struct line *line;
if (!buf)
return;
while (buf->sb_count > max) {
line = buf->sb_first;
if (!line)
break;
buf->sb_first = line->next;
if (line->next)
line->next->prev = NULL;
else
buf->sb_last = NULL;
buf->sb_count--;
if (buf->position == line) {
if (buf->sb_first)
buf->position = buf->sb_first;
else
buf->position = NULL;
}
free_line(line);
}
buf->sb_max = max;
}
/* clear scrollback buffer */
static void kmscon_buffer_clear_sb(struct kmscon_buffer *buf)
{
struct line *iter, *tmp;
if (!buf)
return;
for (iter = buf->sb_first; iter; ) {
tmp = iter;
iter = iter->next;
free_line(tmp);
}
buf->sb_first = NULL;
buf->sb_last = NULL;
buf->sb_count = 0;
buf->position = NULL;
}
static int kmscon_buffer_new(struct kmscon_buffer **out, unsigned int x,
unsigned int y)
{
struct kmscon_buffer *buf;
int ret;
if (!out)
return -EINVAL;
buf = malloc(sizeof(*buf));
if (!buf)
return -ENOMEM;
memset(buf, 0, sizeof(*buf));
buf->ref = 1;
ret = gl_m4_stack_new(&buf->stack);
if (ret)
goto err_free;
ret = kmscon_buffer_resize(buf, x, y);
if (ret)
goto err_stack;
log_debug("new buffer object");
*out = buf;
return 0;
err_stack:
gl_m4_stack_free(buf->stack);
err_free:
free(buf);
return ret;
}
static void kmscon_buffer_ref(struct kmscon_buffer *buf)
{
if (!buf)
return;
++buf->ref;
}
static void kmscon_buffer_unref(struct kmscon_buffer *buf)
{
unsigned int i;
if (!buf || !buf->ref)
return;
if (--buf->ref)
return;
log_debug("destroying buffer object");
kmscon_buffer_clear_sb(buf);
for (i = 0; i < buf->scroll_y; ++i)
free_line(buf->scroll_buf[i]);
for (i = 0; i < buf->mtop_y; ++i)
free_line(buf->mtop_buf[i]);
for (i = 0; i < buf->mbottom_y; ++i)
free_line(buf->mbottom_buf[i]);
free(buf->scroll_buf);
free(buf->mtop_buf);
free(buf->mbottom_buf);
gl_m4_stack_free(buf->stack);
free(buf);
}
static int kmscon_buffer_set_margins(struct kmscon_buffer *buf,
unsigned int top,
unsigned int bottom)
{
int ret;
@ -695,7 +697,7 @@ int kmscon_buffer_set_margins(struct kmscon_buffer *buf, unsigned int top,
}
}
unsigned int kmscon_buffer_get_mtop(struct kmscon_buffer *buf)
static unsigned int kmscon_buffer_get_mtop(struct kmscon_buffer *buf)
{
if (!buf)
return 0;
@ -703,7 +705,7 @@ unsigned int kmscon_buffer_get_mtop(struct kmscon_buffer *buf)
return buf->mtop_y;
}
unsigned int kmscon_buffer_get_mbottom(struct kmscon_buffer *buf)
static unsigned int kmscon_buffer_get_mbottom(struct kmscon_buffer *buf)
{
if (!buf)
return 0;
@ -711,8 +713,9 @@ unsigned int kmscon_buffer_get_mbottom(struct kmscon_buffer *buf)
return buf->mbottom_y;
}
void kmscon_buffer_draw(struct kmscon_buffer *buf, struct kmscon_font *font,
struct gl_shader *shader)
static void kmscon_buffer_draw(struct kmscon_buffer *buf,
struct kmscon_font *font,
struct gl_shader *shader)
{
float xs, ys;
unsigned int i, j, k, num;
@ -791,7 +794,7 @@ void kmscon_buffer_draw(struct kmscon_buffer *buf, struct kmscon_font *font,
}
}
unsigned int kmscon_buffer_get_width(struct kmscon_buffer *buf)
static unsigned int kmscon_buffer_get_width(struct kmscon_buffer *buf)
{
if (!buf)
return 0;
@ -799,7 +802,7 @@ unsigned int kmscon_buffer_get_width(struct kmscon_buffer *buf)
return buf->size_x;
}
unsigned int kmscon_buffer_get_height(struct kmscon_buffer *buf)
static unsigned int kmscon_buffer_get_height(struct kmscon_buffer *buf)
{
if (!buf)
return 0;
@ -807,7 +810,7 @@ unsigned int kmscon_buffer_get_height(struct kmscon_buffer *buf)
return buf->size_y;
}
void kmscon_buffer_write(struct kmscon_buffer *buf, unsigned int x,
static void kmscon_buffer_write(struct kmscon_buffer *buf, unsigned int x,
unsigned int y, kmscon_symbol_t ch)
{
struct line *line, **slot;
@ -860,8 +863,9 @@ void kmscon_buffer_write(struct kmscon_buffer *buf, unsigned int x,
line->cells[x].ch = ch;
}
kmscon_symbol_t kmscon_buffer_read(struct kmscon_buffer *buf, unsigned int x,
unsigned int y)
static kmscon_symbol_t kmscon_buffer_read(struct kmscon_buffer *buf,
unsigned int x,
unsigned int y)
{
struct line *line;
@ -895,7 +899,8 @@ kmscon_symbol_t kmscon_buffer_read(struct kmscon_buffer *buf, unsigned int x,
return line->cells[x].ch;
}
void kmscon_buffer_scroll_down(struct kmscon_buffer *buf, unsigned int num)
static void kmscon_buffer_scroll_down(struct kmscon_buffer *buf,
unsigned int num)
{
unsigned int i;
@ -914,7 +919,8 @@ void kmscon_buffer_scroll_down(struct kmscon_buffer *buf, unsigned int num)
buf->scroll_fill = buf->scroll_y;
}
void kmscon_buffer_scroll_up(struct kmscon_buffer *buf, unsigned int num)
static void kmscon_buffer_scroll_up(struct kmscon_buffer *buf,
unsigned int num)
{
unsigned int i;
@ -934,8 +940,11 @@ void kmscon_buffer_scroll_up(struct kmscon_buffer *buf, unsigned int num)
buf->scroll_fill = buf->scroll_y;
}
void kmscon_buffer_erase_region(struct kmscon_buffer *buf, unsigned int x_from,
unsigned int y_from, unsigned int x_to, unsigned int y_to)
static void kmscon_buffer_erase_region(struct kmscon_buffer *buf,
unsigned int x_from,
unsigned int y_from,
unsigned int x_to,
unsigned int y_to)
{
unsigned int to;
struct line *line;

View File

@ -1,7 +1,7 @@
/*
* kmscon - Console Management
*
* Copyright (c) 2011 David Herrmann <dh.herrmann@googlemail.com>
* Copyright (c) 2011-2012 David Herrmann <dh.herrmann@googlemail.com>
* Copyright (c) 2011 University of Tuebingen
*
* Permission is hereby granted, free of charge, to any person obtaining
@ -26,10 +26,6 @@
/*
* Console Management
* The console management uses OpenGL, cairo and pango to draw a console to a
* framebuffer. It is independent of the other subsystems and can also be used
* in other applications.
*
* This console does not emulate any terminal at all. This subsystem just
* provides functions to draw a console to a framebuffer and modifying the state
* of it.
@ -44,38 +40,8 @@
#include "gl.h"
#include "unicode.h"
struct kmscon_buffer;
struct kmscon_console;
/* console buffer with cell objects */
int kmscon_buffer_new(struct kmscon_buffer **out, unsigned int x,
unsigned int y);
void kmscon_buffer_ref(struct kmscon_buffer *buf);
void kmscon_buffer_unref(struct kmscon_buffer *buf);
int kmscon_buffer_resize(struct kmscon_buffer *buf, unsigned int x,
unsigned int y);
void kmscon_buffer_draw(struct kmscon_buffer *buf, struct kmscon_font *font,
struct gl_shader *shader);
void kmscon_buffer_set_max_sb(struct kmscon_buffer *buf, unsigned int max);
void kmscon_buffer_clear_sb(struct kmscon_buffer *buf);
int kmscon_buffer_set_margins(struct kmscon_buffer *buf, unsigned int top,
unsigned int bottom);
unsigned int kmscon_buffer_get_mtop(struct kmscon_buffer *buf);
unsigned int kmscon_buffer_get_mbottom(struct kmscon_buffer *buf);
unsigned int kmscon_buffer_get_width(struct kmscon_buffer *buf);
unsigned int kmscon_buffer_get_height(struct kmscon_buffer *buf);
void kmscon_buffer_write(struct kmscon_buffer *buf, unsigned int x,
unsigned int y, kmscon_symbol_t ch);
kmscon_symbol_t kmscon_buffer_read(struct kmscon_buffer *buf, unsigned int x,
unsigned int y);
void kmscon_buffer_scroll_down(struct kmscon_buffer *buf, unsigned int num);
void kmscon_buffer_scroll_up(struct kmscon_buffer *buf, unsigned int num);
void kmscon_buffer_erase_region(struct kmscon_buffer *buf, unsigned int x_from,
unsigned int y_from, unsigned int x_to, unsigned int y_to);
/* console objects */
int kmscon_console_new(struct kmscon_console **out,