#ifndef _GTCACA_HEXVIEW_H_
#define _GTCACA_HEXVIEW_H_
#include <stdint.h>
#include <gtcaca/main.h>
#include <gtcaca/widget.h>
#define GTCACA_HEXVIEW_MAX_BPR 64
#define GTCACA_HEXVIEW_TAG_NAME 32
typedef struct _gtcaca_hexview_widget_t gtcaca_hexview_widget_t;
typedef int (*gtcaca_hexview_cell_cb)(gtcaca_hexview_widget_t *h, long offset,
int is_ascii, uint16_t *fg, uint16_t *bg,
void *userdata);
typedef int (*gtcaca_hexview_edit_cb)(gtcaca_hexview_widget_t *h, long offset,
uint8_t value, void *userdata);
typedef int (*gtcaca_hexview_splice_cb)(gtcaca_hexview_widget_t *h, long offset,
int is_insert, void *userdata);
typedef long (*gtcaca_hexview_read_cb)(gtcaca_hexview_widget_t *h, long offset,
uint8_t *out, long n, void *userdata);
typedef struct {
long off, len;
uint16_t fg, bg;
char name[GTCACA_HEXVIEW_TAG_NAME];
} gtcaca_hexview_tag_t;
struct _gtcaca_hexview_widget_t {
gtcaca_widget_type_t type;
unsigned int id;
int has_focus;
int is_visible;
int x;
int y;
int width;
int height;
uint8_t color_focus_fg;
uint8_t color_focus_bg;
uint8_t color_nonfocus_fg;
uint8_t color_nonfocus_bg;
gtcaca_widget_t *parent;
gtcaca_widget_t *children;
struct _gtcaca_hexview_widget_t *prev;
struct _gtcaca_hexview_widget_t *next;
const uint8_t *data;
long len;
long top;
long hl_off;
long hl_len;
long cursor;
int nibble;
int ascii_pane;
long anchor;
int bytes_per_row;
int group_size;
long base_addr;
int addr_digits;
int show_ascii;
int show_box;
int editable;
int insert_mode;
char *title;
gtcaca_hexview_tag_t *tags;
int n_tags, cap_tags;
gtcaca_hexview_cell_cb cell_cb; void *cell_ud;
gtcaca_hexview_edit_cb edit_cb; void *edit_ud;
gtcaca_hexview_splice_cb splice_cb; void *splice_ud;
gtcaca_hexview_read_cb read_cb; void *read_ud;
};
gtcaca_hexview_widget_t *gtcaca_hexview_new(gtcaca_widget_t *parent, int x, int y, int width, int height);
void gtcaca_hexview_free(gtcaca_hexview_widget_t *h);
void gtcaca_hexview_draw(gtcaca_hexview_widget_t *h);
int gtcaca_hexview_key(gtcaca_hexview_widget_t *h, int key, void *userdata);
void gtcaca_hexview_set_data(gtcaca_hexview_widget_t *h, const uint8_t *data, long len);
void gtcaca_hexview_set_read_cb(gtcaca_hexview_widget_t *h, gtcaca_hexview_read_cb cb,
void *userdata, long len);
long gtcaca_hexview_length(gtcaca_hexview_widget_t *h);
int gtcaca_hexview_cursor(gtcaca_hexview_widget_t *h);
void gtcaca_hexview_set_cursor(gtcaca_hexview_widget_t *h, long off);
void gtcaca_hexview_scroll(gtcaca_hexview_widget_t *h, int rows);
long gtcaca_hexview_top(gtcaca_hexview_widget_t *h);
void gtcaca_hexview_set_top(gtcaca_hexview_widget_t *h, long row);
int gtcaca_hexview_nibble(gtcaca_hexview_widget_t *h);
void gtcaca_hexview_set_nibble(gtcaca_hexview_widget_t *h, int low);
int gtcaca_hexview_pane(gtcaca_hexview_widget_t *h);
void gtcaca_hexview_set_pane(gtcaca_hexview_widget_t *h, int ascii_pane);
void gtcaca_hexview_set_selection(gtcaca_hexview_widget_t *h, long anchor, long caret);
void gtcaca_hexview_clear_selection(gtcaca_hexview_widget_t *h);
int gtcaca_hexview_selection(gtcaca_hexview_widget_t *h, long *lo, long *hi);
void gtcaca_hexview_set_title(gtcaca_hexview_widget_t *h, const char *title);
void gtcaca_hexview_set_bytes_per_row(gtcaca_hexview_widget_t *h, int n);
int gtcaca_hexview_bytes_per_row(gtcaca_hexview_widget_t *h);
void gtcaca_hexview_set_group_size(gtcaca_hexview_widget_t *h, int bytes);
void gtcaca_hexview_set_base_addr(gtcaca_hexview_widget_t *h, long base);
void gtcaca_hexview_set_addr_digits(gtcaca_hexview_widget_t *h, int digits);
void gtcaca_hexview_set_show_ascii(gtcaca_hexview_widget_t *h, int on);
void gtcaca_hexview_set_box(gtcaca_hexview_widget_t *h, int on);
void gtcaca_hexview_set_highlight(gtcaca_hexview_widget_t *h, long off, long len);
int gtcaca_hexview_add_tag(gtcaca_hexview_widget_t *h, long off, long len,
uint16_t fg, uint16_t bg, const char *name);
void gtcaca_hexview_clear_tags(gtcaca_hexview_widget_t *h);
const char *gtcaca_hexview_tag_at(gtcaca_hexview_widget_t *h, long off);
void gtcaca_hexview_set_cell_cb(gtcaca_hexview_widget_t *h,
gtcaca_hexview_cell_cb cb, void *userdata);
void gtcaca_hexview_set_editable(gtcaca_hexview_widget_t *h, int on);
int gtcaca_hexview_editable(gtcaca_hexview_widget_t *h);
void gtcaca_hexview_set_insert_mode(gtcaca_hexview_widget_t *h, int on);
int gtcaca_hexview_insert_mode(gtcaca_hexview_widget_t *h);
void gtcaca_hexview_set_edit_cb(gtcaca_hexview_widget_t *h,
gtcaca_hexview_edit_cb cb, void *userdata);
void gtcaca_hexview_set_splice_cb(gtcaca_hexview_widget_t *h,
gtcaca_hexview_splice_cb cb, void *userdata);
long gtcaca_hexview_find(gtcaca_hexview_widget_t *h, const uint8_t *needle,
int nlen, long from, int backwards);
#endif