File:  [Qemu by Fabrice Bellard] / qemu / console.h
Revision 1.1.1.3 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 16:56:36 2018 UTC (3 years, 3 months ago) by root
Branches: qemu, MAIN
CVS tags: qemu0105, qemu0104, qemu0103, qemu0102, qemu0101, HEAD
qemu 0.10.1

    1: #ifndef CONSOLE_H
    2: #define CONSOLE_H
    3: 
    4: #include "qemu-char.h"
    5: 
    6: /* keyboard/mouse support */
    7: 
    8: #define MOUSE_EVENT_LBUTTON 0x01
    9: #define MOUSE_EVENT_RBUTTON 0x02
   10: #define MOUSE_EVENT_MBUTTON 0x04
   11: 
   12: /* in ms */
   13: #define GUI_REFRESH_INTERVAL 30
   14: 
   15: typedef void QEMUPutKBDEvent(void *opaque, int keycode);
   16: typedef void QEMUPutMouseEvent(void *opaque, int dx, int dy, int dz, int buttons_state);
   17: 
   18: typedef struct QEMUPutMouseEntry {
   19:     QEMUPutMouseEvent *qemu_put_mouse_event;
   20:     void *qemu_put_mouse_event_opaque;
   21:     int qemu_put_mouse_event_absolute;
   22:     char *qemu_put_mouse_event_name;
   23: 
   24:     /* used internally by qemu for handling mice */
   25:     struct QEMUPutMouseEntry *next;
   26: } QEMUPutMouseEntry;
   27: 
   28: void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque);
   29: QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
   30:                                                 void *opaque, int absolute,
   31:                                                 const char *name);
   32: void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry);
   33: 
   34: void kbd_put_keycode(int keycode);
   35: void kbd_mouse_event(int dx, int dy, int dz, int buttons_state);
   36: int kbd_mouse_is_absolute(void);
   37: 
   38: struct mouse_transform_info_s {
   39:     /* Touchscreen resolution */
   40:     int x;
   41:     int y;
   42:     /* Calibration values as used/generated by tslib */
   43:     int a[7];
   44: };
   45: 
   46: void do_info_mice(void);
   47: void do_mouse_set(int index);
   48: 
   49: /* keysym is a unicode code except for special keys (see QEMU_KEY_xxx
   50:    constants) */
   51: #define QEMU_KEY_ESC1(c) ((c) | 0xe100)
   52: #define QEMU_KEY_BACKSPACE  0x007f
   53: #define QEMU_KEY_UP         QEMU_KEY_ESC1('A')
   54: #define QEMU_KEY_DOWN       QEMU_KEY_ESC1('B')
   55: #define QEMU_KEY_RIGHT      QEMU_KEY_ESC1('C')
   56: #define QEMU_KEY_LEFT       QEMU_KEY_ESC1('D')
   57: #define QEMU_KEY_HOME       QEMU_KEY_ESC1(1)
   58: #define QEMU_KEY_END        QEMU_KEY_ESC1(4)
   59: #define QEMU_KEY_PAGEUP     QEMU_KEY_ESC1(5)
   60: #define QEMU_KEY_PAGEDOWN   QEMU_KEY_ESC1(6)
   61: #define QEMU_KEY_DELETE     QEMU_KEY_ESC1(3)
   62: 
   63: #define QEMU_KEY_CTRL_UP         0xe400
   64: #define QEMU_KEY_CTRL_DOWN       0xe401
   65: #define QEMU_KEY_CTRL_LEFT       0xe402
   66: #define QEMU_KEY_CTRL_RIGHT      0xe403
   67: #define QEMU_KEY_CTRL_HOME       0xe404
   68: #define QEMU_KEY_CTRL_END        0xe405
   69: #define QEMU_KEY_CTRL_PAGEUP     0xe406
   70: #define QEMU_KEY_CTRL_PAGEDOWN   0xe407
   71: 
   72: void kbd_put_keysym(int keysym);
   73: 
   74: /* consoles */
   75: 
   76: #define QEMU_BIG_ENDIAN_FLAG    0x01
   77: #define QEMU_ALLOCATED_FLAG     0x02
   78: 
   79: struct PixelFormat {
   80:     uint8_t bits_per_pixel;
   81:     uint8_t bytes_per_pixel;
   82:     uint8_t depth; /* color depth in bits */
   83:     uint32_t rmask, gmask, bmask, amask;
   84:     uint8_t rshift, gshift, bshift, ashift;
   85:     uint8_t rmax, gmax, bmax, amax;
   86:     uint8_t rbits, gbits, bbits, abits;
   87: };
   88: 
   89: struct DisplaySurface {
   90:     uint8_t flags;
   91:     int width;
   92:     int height;
   93:     int linesize;        /* bytes per line */
   94:     uint8_t *data;
   95: 
   96:     struct PixelFormat pf;
   97: };
   98: 
   99: struct DisplayChangeListener {
  100:     int idle;
  101:     uint64_t gui_timer_interval;
  102: 
  103:     void (*dpy_update)(struct DisplayState *s, int x, int y, int w, int h);
  104:     void (*dpy_resize)(struct DisplayState *s);
  105:     void (*dpy_setdata)(struct DisplayState *s);
  106:     void (*dpy_refresh)(struct DisplayState *s);
  107:     void (*dpy_copy)(struct DisplayState *s, int src_x, int src_y,
  108:                      int dst_x, int dst_y, int w, int h);
  109:     void (*dpy_fill)(struct DisplayState *s, int x, int y,
  110:                      int w, int h, uint32_t c);
  111:     void (*dpy_text_cursor)(struct DisplayState *s, int x, int y);
  112: 
  113:     struct DisplayChangeListener *next;
  114: };
  115: 
  116: struct DisplayState {
  117:     struct DisplaySurface *surface;
  118:     void *opaque;
  119:     struct QEMUTimer *gui_timer;
  120: 
  121:     struct DisplayChangeListener* listeners;
  122: 
  123:     void (*mouse_set)(int x, int y, int on);
  124:     void (*cursor_define)(int width, int height, int bpp, int hot_x, int hot_y,
  125:                           uint8_t *image, uint8_t *mask);
  126: 
  127:     struct DisplayState *next;
  128: };
  129: 
  130: void register_displaystate(DisplayState *ds);
  131: DisplayState *get_displaystate(void);
  132: DisplaySurface* qemu_create_displaysurface(int width, int height, int bpp, int linesize);
  133: DisplaySurface* qemu_resize_displaysurface(DisplaySurface *surface,
  134:                                            int width, int height, int bpp, int linesize);
  135: DisplaySurface* qemu_create_displaysurface_from(int width, int height, int bpp,
  136:                                                 int linesize, uint8_t *data);
  137: void qemu_free_displaysurface(DisplaySurface *surface);
  138: PixelFormat qemu_different_endianness_pixelformat(int bpp);
  139: PixelFormat qemu_default_pixelformat(int bpp);
  140: 
  141: static inline int is_buffer_shared(DisplaySurface *surface)
  142: {
  143:     return (!(surface->flags & QEMU_ALLOCATED_FLAG));
  144: }
  145: 
  146: static inline void register_displaychangelistener(DisplayState *ds, DisplayChangeListener *dcl)
  147: {
  148:     dcl->next = ds->listeners;
  149:     ds->listeners = dcl;
  150: }
  151: 
  152: static inline void dpy_update(DisplayState *s, int x, int y, int w, int h)
  153: {
  154:     struct DisplayChangeListener *dcl = s->listeners;
  155:     while (dcl != NULL) {
  156:         dcl->dpy_update(s, x, y, w, h);
  157:         dcl = dcl->next;
  158:     }
  159: }
  160: 
  161: static inline void dpy_resize(DisplayState *s)
  162: {
  163:     struct DisplayChangeListener *dcl = s->listeners;
  164:     while (dcl != NULL) {
  165:         dcl->dpy_resize(s);
  166:         dcl = dcl->next;
  167:     }
  168: }
  169: 
  170: static inline void dpy_setdata(DisplayState *s)
  171: {
  172:     struct DisplayChangeListener *dcl = s->listeners;
  173:     while (dcl != NULL) {
  174:         if (dcl->dpy_setdata) dcl->dpy_setdata(s);
  175:         dcl = dcl->next;
  176:     }
  177: }
  178: 
  179: static inline void dpy_refresh(DisplayState *s)
  180: {
  181:     struct DisplayChangeListener *dcl = s->listeners;
  182:     while (dcl != NULL) {
  183:         if (dcl->dpy_refresh) dcl->dpy_refresh(s);
  184:         dcl = dcl->next;
  185:     }
  186: }
  187: 
  188: static inline void dpy_copy(struct DisplayState *s, int src_x, int src_y,
  189:                              int dst_x, int dst_y, int w, int h) {
  190:     struct DisplayChangeListener *dcl = s->listeners;
  191:     while (dcl != NULL) {
  192:         if (dcl->dpy_copy)
  193:             dcl->dpy_copy(s, src_x, src_y, dst_x, dst_y, w, h);
  194:         else /* TODO */
  195:             dcl->dpy_update(s, dst_x, dst_y, w, h);
  196:         dcl = dcl->next;
  197:     }
  198: }
  199: 
  200: static inline void dpy_fill(struct DisplayState *s, int x, int y,
  201:                              int w, int h, uint32_t c) {
  202:     struct DisplayChangeListener *dcl = s->listeners;
  203:     while (dcl != NULL) {
  204:         if (dcl->dpy_fill) dcl->dpy_fill(s, x, y, w, h, c);
  205:         dcl = dcl->next;
  206:     }
  207: }
  208: 
  209: static inline void dpy_cursor(struct DisplayState *s, int x, int y) {
  210:     struct DisplayChangeListener *dcl = s->listeners;
  211:     while (dcl != NULL) {
  212:         if (dcl->dpy_text_cursor) dcl->dpy_text_cursor(s, x, y);
  213:         dcl = dcl->next;
  214:     }
  215: }
  216: 
  217: static inline int ds_get_linesize(DisplayState *ds)
  218: {
  219:     return ds->surface->linesize;
  220: }
  221: 
  222: static inline uint8_t* ds_get_data(DisplayState *ds)
  223: {
  224:     return ds->surface->data;
  225: }
  226: 
  227: static inline int ds_get_width(DisplayState *ds)
  228: {
  229:     return ds->surface->width;
  230: }
  231: 
  232: static inline int ds_get_height(DisplayState *ds)
  233: {
  234:     return ds->surface->height;
  235: }
  236: 
  237: static inline int ds_get_bits_per_pixel(DisplayState *ds)
  238: {
  239:     return ds->surface->pf.bits_per_pixel;
  240: }
  241: 
  242: static inline int ds_get_bytes_per_pixel(DisplayState *ds)
  243: {
  244:     return ds->surface->pf.bytes_per_pixel;
  245: }
  246: 
  247: typedef unsigned long console_ch_t;
  248: static inline void console_write_ch(console_ch_t *dest, uint32_t ch)
  249: {
  250:     cpu_to_le32wu((uint32_t *) dest, ch);
  251: }
  252: 
  253: typedef void (*vga_hw_update_ptr)(void *);
  254: typedef void (*vga_hw_invalidate_ptr)(void *);
  255: typedef void (*vga_hw_screen_dump_ptr)(void *, const char *);
  256: typedef void (*vga_hw_text_update_ptr)(void *, console_ch_t *);
  257: 
  258: DisplayState *graphic_console_init(vga_hw_update_ptr update,
  259:                                    vga_hw_invalidate_ptr invalidate,
  260:                                    vga_hw_screen_dump_ptr screen_dump,
  261:                                    vga_hw_text_update_ptr text_update,
  262:                                    void *opaque);
  263: 
  264: void vga_hw_update(void);
  265: void vga_hw_invalidate(void);
  266: void vga_hw_screen_dump(const char *filename);
  267: void vga_hw_text_update(console_ch_t *chardata);
  268: 
  269: int is_graphic_console(void);
  270: int is_fixedsize_console(void);
  271: CharDriverState *text_console_init(const char *p);
  272: void text_consoles_set_display(DisplayState *ds);
  273: void console_select(unsigned int index);
  274: void console_color_init(DisplayState *ds);
  275: void qemu_console_resize(DisplayState *ds, int width, int height);
  276: void qemu_console_copy(DisplayState *ds, int src_x, int src_y,
  277:                        int dst_x, int dst_y, int w, int h);
  278: 
  279: /* sdl.c */
  280: void sdl_display_init(DisplayState *ds, int full_screen, int no_frame);
  281: 
  282: /* cocoa.m */
  283: void cocoa_display_init(DisplayState *ds, int full_screen);
  284: 
  285: /* vnc.c */
  286: void vnc_display_init(DisplayState *ds);
  287: void vnc_display_close(DisplayState *ds);
  288: int vnc_display_open(DisplayState *ds, const char *display);
  289: int vnc_display_password(DisplayState *ds, const char *password);
  290: void do_info_vnc(void);
  291: 
  292: /* curses.c */
  293: void curses_display_init(DisplayState *ds, int full_screen);
  294: 
  295: /* FIXME: term_printf et al should probably go elsewhere so everything
  296:    does not need to include console.h  */
  297: /* monitor.c */
  298: void monitor_init(CharDriverState *hd, int show_banner);
  299: void term_puts(const char *str);
  300: void term_vprintf(const char *fmt, va_list ap);
  301: void term_printf(const char *fmt, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
  302: void term_print_filename(const char *filename);
  303: void term_flush(void);
  304: void term_print_help(void);
  305: void monitor_suspend(void);
  306: void monitor_resume(void);
  307: int monitor_read_bdrv_key(BlockDriverState *bs);
  308: 
  309: /* readline.c */
  310: typedef void ReadLineFunc(void *opaque, const char *str);
  311: 
  312: extern int completion_index;
  313: void add_completion(const char *str);
  314: void readline_handle_byte(int ch);
  315: void readline_find_completion(const char *cmdline);
  316: const char *readline_get_history(unsigned int index);
  317: void readline_start(const char *prompt, int is_password,
  318:                     ReadLineFunc *readline_func, void *opaque);
  319: 
  320: #endif

unix.superglobalmegacorp.com