2013-09-11 09:44:47 +04:00
# ifndef __SPICETERM_H__
# define __SPICETERM_H__
# include <glib.h>
# include <spice.h>
2013-08-06 12:58:17 +04:00
# define IBUFSIZE 1024
# define MAX_ESC_PARAMS 16
2013-09-11 09:44:47 +04:00
typedef unsigned short unicode ; // fixme
typedef struct TextAttributes {
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 ;
} TextAttributes ;
2013-08-06 12:58:17 +04:00
typedef struct TextCell {
unicode ch ;
TextAttributes attrib ;
} TextCell ;
2013-09-11 09:44:47 +04:00
# define COMMANDS_SIZE 1024
# define MAX_HEIGHT 2048
# define MAX_WIDTH 2048
2013-09-11 13:57:01 +04:00
typedef struct SpiceScreen SpiceScreen ;
2013-09-11 09:44:47 +04:00
2013-09-11 13:57:01 +04:00
struct SpiceScreen {
2013-09-11 09:44:47 +04:00
SpiceCoreInterface * core ;
SpiceServer * server ;
QXLInstance qxl_instance ;
QXLWorker * qxl_worker ;
SpiceKbdInstance keyboard_sin ;
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 ;
int target_surface ;
GCond * command_cond ;
GMutex * command_mutex ;
int commands_end ;
int commands_start ;
struct QXLCommandExt * commands [ COMMANDS_SIZE ] ;
// callbacks
2013-09-11 13:57:01 +04:00
void ( * on_client_connected ) ( SpiceScreen * spice_screen ) ;
void ( * on_client_disconnected ) ( SpiceScreen * spice_screen ) ;
2013-09-11 09:44:47 +04:00
} ;
2013-09-11 13:57:01 +04:00
SpiceScreen * spice_screen_new ( SpiceCoreInterface * core ) ;
2013-09-11 09:44:47 +04:00
2013-09-11 13:57:01 +04:00
void spice_screen_add_display_interface ( SpiceScreen * spice_screen ) ;
void spice_screen_add_agent_interface ( SpiceServer * server ) ;
void spice_screen_draw_char ( SpiceScreen * spice_screen , int x , int y , gunichar 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 ) ;
2013-09-11 09:44:47 +04:00
2013-09-11 13:57:01 +04:00
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-08-06 12:58:17 +04:00
int maxx ;
int maxy ;
int width ;
int height ;
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 ;
2013-09-11 13:57:01 +04:00
SpiceScreen * screen ;
2013-08-06 12:58:17 +04:00
SpiceKbdInstance keyboard_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 ;
unicode * selection ;
int selection_len ;
unsigned int mark_active : 1 ;
unsigned int report_mouse : 1 ;
2013-09-11 09:20:40 +04:00
} spiceTerm ;
2013-08-06 12:58:17 +04:00
2013-09-11 09:44:47 +04:00
# endif /* __SPICETERM_H__ */