#ifndef __TEXTBUFFER_VIEW_H #define __TEXTBUFFER_VIEW_H #include "textbuffer.h" #include "term.h" typedef struct _TEXT_BUFFER_VIEW_REC TEXT_BUFFER_VIEW_REC; /* if ypos == -1, don't print anything, just return the indent size */ typedef int (*INDENT_FUNC) (TEXT_BUFFER_VIEW_REC *view, LINE_REC *line, int ypos); typedef struct { unsigned char *start; int indent; INDENT_FUNC indent_func; int color; /* first word in line belong to the end of the last word in previous line */ unsigned int continues:1; } LINE_CACHE_SUB_REC; typedef struct { time_t last_access; int count; /* number of real lines */ /* variable sized array, actually. starts from the second line, so size of it is count-1 */ LINE_CACHE_SUB_REC lines[1]; } LINE_CACHE_REC; typedef struct { int refcount; int width; GHashTable *line_cache; /* should contain the same value for each cache that uses the same buffer */ unsigned char update_counter; /* number of real lines used by the last line in buffer */ int last_linecount; } TEXT_BUFFER_CACHE_REC; struct _TEXT_BUFFER_VIEW_REC { TEXT_BUFFER_REC *buffer; GSList *siblings; /* other views that use the same buffer */ TERM_WINDOW *window; int width, height; int default_indent; INDENT_FUNC default_indent_func; unsigned int longword_noindent:1; unsigned int scroll:1; /* scroll down automatically when at bottom */ TEXT_BUFFER_CACHE_REC *cache; int ypos; /* cursor position - visible area is 0..height-1 */ LINE_REC *startline; /* line at the top of the screen */ int subline; /* number of "real lines" to skip from `startline' */ /* marks the bottom of the text buffer */ LINE_REC *bottom_startline; int bottom_subline; /* how many empty lines are in screen. a screenful when started or used /CLEAR */ int empty_linecount; /* window is at the bottom of the text buffer */ unsigned int bottom:1; /* if !bottom - new text has been printed since we were at bottom */ unsigned int more_text:1; /* Window needs a redraw */ unsigned int dirty:1; /* Bookmarks to the lines in the buffer - removed automatically when the line gets removed from buffer */ GHashTable *bookmarks; }; /* Create new view. */ TEXT_BUFFER_VIEW_REC *textbuffer_view_create(TEXT_BUFFER_REC *buffer, int width, int height, int scroll); /* Destroy the view. */ void textbuffer_view_destroy(TEXT_BUFFER_VIEW_REC *view); /* Change the default indent position */ void textbuffer_view_set_default_indent(TEXT_BUFFER_VIEW_REC *view, int default_indent, int longword_noindent, INDENT_FUNC indent_func); void textbuffer_views_unregister_indent_func(INDENT_FUNC indent_func); void textbuffer_view_set_scroll(TEXT_BUFFER_VIEW_REC *view, int scroll); /* Resize the view. */ void textbuffer_view_resize(TEXT_BUFFER_VIEW_REC *view, int width, int height); /* Clear the view, don't actually remove any lines from buffer. */ void textbuffer_view_clear(TEXT_BUFFER_VIEW_REC *view); #define textbuffer_view_get_lines(view) \ ((view)->buffer->first_line) /* Scroll the view up/down */ void textbuffer_view_scroll(TEXT_BUFFER_VIEW_REC *view, int lines); /* Scroll to specified line */ void textbuffer_view_scroll_line(TEXT_BUFFER_VIEW_REC *view, LINE_REC *line); /* Return line cache */ LINE_CACHE_REC *textbuffer_view_get_line_cache(TEXT_BUFFER_VIEW_REC *view, LINE_REC *line); /* Functions for manipulating the text buffer, using these commands update all views that use the buffer. */ /* Update some line in the buffer which has been modified using textbuffer_append() or textbuffer_insert(). */ void textbuffer_view_insert_line(TEXT_BUFFER_VIEW_REC *view, LINE_REC *line); /* Remove one line from buffer. */ void textbuffer_view_remove_line(TEXT_BUFFER_VIEW_REC *view, LINE_REC *line); /* Remove all lines from buffer. */ void textbuffer_view_remove_all_lines(TEXT_BUFFER_VIEW_REC *view); /* Set a bookmark in view */ void textbuffer_view_set_bookmark(TEXT_BUFFER_VIEW_REC *view, const char *name, LINE_REC *line); /* Set a bookmark in view to the bottom line */ void textbuffer_view_set_bookmark_bottom(TEXT_BUFFER_VIEW_REC *view, const char *name); /* Return the line for bookmark */ LINE_REC *textbuffer_view_get_bookmark(TEXT_BUFFER_VIEW_REC *view, const char *name); /* Specify window where the changes in view should be drawn, NULL disables it. */ void textbuffer_view_set_window(TEXT_BUFFER_VIEW_REC *view, TERM_WINDOW *window); /* Redraw the view */ void textbuffer_view_redraw(TEXT_BUFFER_VIEW_REC *view); void textbuffer_view_init(void); void textbuffer_view_deinit(void); #endif