5
0
mirror of git://git.proxmox.com/git/spiceterm.git synced 2024-12-22 13:34:06 +03:00
spiceterm/spiceterm.h

133 lines
3.2 KiB
C
Raw Normal View History

2013-09-11 09:44:47 +04:00
#include <glib.h>
#include <spice.h>
#define IBUFSIZE 1024
#define MAX_ESC_PARAMS 16
2013-09-11 09:44:47 +04:00
typedef struct TextAttributes {
2013-09-12 16:23:57 +04:00
unsigned int fgcol:4;
unsigned int bgcol:4;
unsigned int bold:1;
unsigned int uline:1;
unsigned int blink:1;
unsigned int invers:1;
unsigned int unvisible:1;
2013-09-13 11:53:24 +04:00
unsigned int selected:1;
2013-09-11 09:44:47 +04:00
} TextAttributes;
typedef struct TextCell {
2013-09-12 16:23:57 +04:00
gunichar2 ch;
TextAttributes attrib;
} TextCell;
#define COMMANDS_SIZE (1024*10)
2013-09-11 09:44:47 +04:00
#define MAX_HEIGHT 2048
#define MAX_WIDTH 2048
typedef struct SpiceScreen SpiceScreen;
2013-09-11 09:44:47 +04:00
struct SpiceScreen {
2013-09-11 09:44:47 +04:00
SpiceCoreInterface *core;
SpiceServer *server;
QXLInstance qxl_instance;
QXLWorker *qxl_worker;
uint8_t primary_surface[MAX_HEIGHT * MAX_WIDTH * 4];
int primary_height;
int primary_width;
SpiceTimer *conn_timeout_timer;
SpiceWatch *mwatch; /* watch master pty */
int cursor_notify;
// Current mode (set by create_primary)
int width;
int height;
GCond* command_cond;
GMutex* command_mutex;
int commands_end;
int commands_start;
struct QXLCommandExt* commands[COMMANDS_SIZE];
// callbacks
void (*on_client_connected)(SpiceScreen *spice_screen);
void (*on_client_disconnected)(SpiceScreen *spice_screen);
2013-09-11 09:44:47 +04:00
};
2013-09-17 14:57:23 +04:00
SpiceScreen* spice_screen_new(SpiceCoreInterface* core, uint32_t width, uint32_t height, guint timeout);
2013-09-11 09:44:47 +04:00
2013-09-17 14:57:23 +04:00
void spice_screen_resize(SpiceScreen *spice_screen, uint32_t width, uint32_t height);
2013-09-11 15:15:53 +04:00
void spice_screen_draw_char(SpiceScreen *spice_screen, int x, int y, gunichar2 ch, TextAttributes attrib);
void spice_screen_scroll(SpiceScreen *spice_screen, int x1, int y1, int x2, int y2, int src_x, int src_y);
void spice_screen_clear(SpiceScreen *spice_screen, int x1, int y1, int x2, int y2);
uint32_t spice_screen_get_width(void);
uint32_t spice_screen_get_height(void);
2013-09-11 09:44:47 +04:00
2013-09-11 09:20:40 +04:00
typedef struct spiceTerm {
2013-09-17 14:57:23 +04:00
int pty; // pty file descriptor
2013-09-12 16:23:57 +04:00
int width;
int height;
2013-09-12 16:23:57 +04:00
int total_height;
int scroll_height;
int y_base;
int y_displ;
int altbuf:1;
unsigned int utf8:1; // utf8 mode
long utf_char; // used by utf8 parser
int utf_count; // used by utf8 parser
TextAttributes default_attrib;
TextCell *cells;
TextCell *altcells;
SpiceScreen *screen;
SpiceKbdInstance keyboard_sin;
SpiceCharDeviceInstance vdagent_sin;
// cursor
TextAttributes cur_attrib;
TextAttributes cur_attrib_saved;
int tty_state; // 0 - normal, 1 - ESC, 2 - CSI
int cx; // cursor x position
int cy; // cursor y position
int cx_saved; // saved cursor x position
int cy_saved; // saved cursor y position
int esc_buf[MAX_ESC_PARAMS];
int esc_count;
int esc_ques;
int esc_has_par;
char osc_textbuf[4096];
char osc_cmd;
int region_top;
int region_bottom;
unsigned int charset:1; // G0 or G1
unsigned int charset_saved:1; // G0 or G1
unsigned int g0enc:2;
unsigned int g0enc_saved:2;
unsigned int g1enc:2;
unsigned int g1enc_saved:2;
unsigned int cur_enc:2;
unsigned int cur_enc_saved:2;
// input buffer
char ibuf[IBUFSIZE];
int ibuf_count;
gunichar2 *selection;
int selection_len;
unsigned int mark_active:1;
unsigned int report_mouse:1;
} spiceTerm;