File:  [Qemu by Fabrice Bellard] / qemu / console.h
Revision 1.1.1.8 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 18:56:15 2018 UTC (3 years, 1 month ago) by root
Branches: qemu, MAIN
CVS tags: qemu1000, qemu0151, HEAD
qemu 0.15.1

    1: #ifndef CONSOLE_H
    2: #define CONSOLE_H
    3: 
    4: #include "qemu-char.h"
    5: #include "qdict.h"
    6: #include "notify.h"
    7: #include "qerror.h"
    8: #include "monitor.h"
    9: 
   10: /* keyboard/mouse support */
   11: 
   12: #define MOUSE_EVENT_LBUTTON 0x01
   13: #define MOUSE_EVENT_RBUTTON 0x02
   14: #define MOUSE_EVENT_MBUTTON 0x04
   15: 
   16: /* identical to the ps/2 keyboard bits */
   17: #define QEMU_SCROLL_LOCK_LED (1 << 0)
   18: #define QEMU_NUM_LOCK_LED    (1 << 1)
   19: #define QEMU_CAPS_LOCK_LED   (1 << 2)
   20: 
   21: /* in ms */
   22: #define GUI_REFRESH_INTERVAL 30
   23: 
   24: typedef void QEMUPutKBDEvent(void *opaque, int keycode);
   25: typedef void QEMUPutLEDEvent(void *opaque, int ledstate);
   26: typedef void QEMUPutMouseEvent(void *opaque, int dx, int dy, int dz, int buttons_state);
   27: 
   28: typedef struct QEMUPutMouseEntry {
   29:     QEMUPutMouseEvent *qemu_put_mouse_event;
   30:     void *qemu_put_mouse_event_opaque;
   31:     int qemu_put_mouse_event_absolute;
   32:     char *qemu_put_mouse_event_name;
   33: 
   34:     int index;
   35: 
   36:     /* used internally by qemu for handling mice */
   37:     QTAILQ_ENTRY(QEMUPutMouseEntry) node;
   38: } QEMUPutMouseEntry;
   39: 
   40: typedef struct QEMUPutLEDEntry {
   41:     QEMUPutLEDEvent *put_led;
   42:     void *opaque;
   43:     QTAILQ_ENTRY(QEMUPutLEDEntry) next;
   44: } QEMUPutLEDEntry;
   45: 
   46: void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque);
   47: void qemu_remove_kbd_event_handler(void);
   48: QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
   49:                                                 void *opaque, int absolute,
   50:                                                 const char *name);
   51: void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry);
   52: void qemu_activate_mouse_event_handler(QEMUPutMouseEntry *entry);
   53: 
   54: QEMUPutLEDEntry *qemu_add_led_event_handler(QEMUPutLEDEvent *func, void *opaque);
   55: void qemu_remove_led_event_handler(QEMUPutLEDEntry *entry);
   56: 
   57: void kbd_put_keycode(int keycode);
   58: void kbd_put_ledstate(int ledstate);
   59: void kbd_mouse_event(int dx, int dy, int dz, int buttons_state);
   60: 
   61: /* Does the current mouse generate absolute events */
   62: int kbd_mouse_is_absolute(void);
   63: void qemu_add_mouse_mode_change_notifier(Notifier *notify);
   64: void qemu_remove_mouse_mode_change_notifier(Notifier *notify);
   65: 
   66: /* Of all the mice, is there one that generates absolute events */
   67: int kbd_mouse_has_absolute(void);
   68: 
   69: struct MouseTransformInfo {
   70:     /* Touchscreen resolution */
   71:     int x;
   72:     int y;
   73:     /* Calibration values as used/generated by tslib */
   74:     int a[7];
   75: };
   76: 
   77: void do_info_mice_print(Monitor *mon, const QObject *data);
   78: void do_info_mice(Monitor *mon, QObject **ret_data);
   79: void do_mouse_set(Monitor *mon, const QDict *qdict);
   80: 
   81: /* keysym is a unicode code except for special keys (see QEMU_KEY_xxx
   82:    constants) */
   83: #define QEMU_KEY_ESC1(c) ((c) | 0xe100)
   84: #define QEMU_KEY_BACKSPACE  0x007f
   85: #define QEMU_KEY_UP         QEMU_KEY_ESC1('A')
   86: #define QEMU_KEY_DOWN       QEMU_KEY_ESC1('B')
   87: #define QEMU_KEY_RIGHT      QEMU_KEY_ESC1('C')
   88: #define QEMU_KEY_LEFT       QEMU_KEY_ESC1('D')
   89: #define QEMU_KEY_HOME       QEMU_KEY_ESC1(1)
   90: #define QEMU_KEY_END        QEMU_KEY_ESC1(4)
   91: #define QEMU_KEY_PAGEUP     QEMU_KEY_ESC1(5)
   92: #define QEMU_KEY_PAGEDOWN   QEMU_KEY_ESC1(6)
   93: #define QEMU_KEY_DELETE     QEMU_KEY_ESC1(3)
   94: 
   95: #define QEMU_KEY_CTRL_UP         0xe400
   96: #define QEMU_KEY_CTRL_DOWN       0xe401
   97: #define QEMU_KEY_CTRL_LEFT       0xe402
   98: #define QEMU_KEY_CTRL_RIGHT      0xe403
   99: #define QEMU_KEY_CTRL_HOME       0xe404
  100: #define QEMU_KEY_CTRL_END        0xe405
  101: #define QEMU_KEY_CTRL_PAGEUP     0xe406
  102: #define QEMU_KEY_CTRL_PAGEDOWN   0xe407
  103: 
  104: void kbd_put_keysym(int keysym);
  105: 
  106: /* consoles */
  107: 
  108: #define QEMU_BIG_ENDIAN_FLAG    0x01
  109: #define QEMU_ALLOCATED_FLAG     0x02
  110: #define QEMU_REALPIXELS_FLAG    0x04
  111: 
  112: struct PixelFormat {
  113:     uint8_t bits_per_pixel;
  114:     uint8_t bytes_per_pixel;
  115:     uint8_t depth; /* color depth in bits */
  116:     uint32_t rmask, gmask, bmask, amask;
  117:     uint8_t rshift, gshift, bshift, ashift;
  118:     uint8_t rmax, gmax, bmax, amax;
  119:     uint8_t rbits, gbits, bbits, abits;
  120: };
  121: 
  122: struct DisplaySurface {
  123:     uint8_t flags;
  124:     int width;
  125:     int height;
  126:     int linesize;        /* bytes per line */
  127:     uint8_t *data;
  128: 
  129:     struct PixelFormat pf;
  130: };
  131: 
  132: /* cursor data format is 32bit RGBA */
  133: typedef struct QEMUCursor {
  134:     int                 width, height;
  135:     int                 hot_x, hot_y;
  136:     int                 refcount;
  137:     uint32_t            data[];
  138: } QEMUCursor;
  139: 
  140: QEMUCursor *cursor_alloc(int width, int height);
  141: void cursor_get(QEMUCursor *c);
  142: void cursor_put(QEMUCursor *c);
  143: QEMUCursor *cursor_builtin_hidden(void);
  144: QEMUCursor *cursor_builtin_left_ptr(void);
  145: void cursor_print_ascii_art(QEMUCursor *c, const char *prefix);
  146: int cursor_get_mono_bpl(QEMUCursor *c);
  147: void cursor_set_mono(QEMUCursor *c,
  148:                      uint32_t foreground, uint32_t background, uint8_t *image,
  149:                      int transparent, uint8_t *mask);
  150: void cursor_get_mono_image(QEMUCursor *c, int foreground, uint8_t *mask);
  151: void cursor_get_mono_mask(QEMUCursor *c, int transparent, uint8_t *mask);
  152: 
  153: struct DisplayChangeListener {
  154:     int idle;
  155:     uint64_t gui_timer_interval;
  156: 
  157:     void (*dpy_update)(struct DisplayState *s, int x, int y, int w, int h);
  158:     void (*dpy_resize)(struct DisplayState *s);
  159:     void (*dpy_setdata)(struct DisplayState *s);
  160:     void (*dpy_refresh)(struct DisplayState *s);
  161:     void (*dpy_copy)(struct DisplayState *s, int src_x, int src_y,
  162:                      int dst_x, int dst_y, int w, int h);
  163:     void (*dpy_fill)(struct DisplayState *s, int x, int y,
  164:                      int w, int h, uint32_t c);
  165:     void (*dpy_text_cursor)(struct DisplayState *s, int x, int y);
  166: 
  167:     struct DisplayChangeListener *next;
  168: };
  169: 
  170: struct DisplayAllocator {
  171:     DisplaySurface* (*create_displaysurface)(int width, int height);
  172:     DisplaySurface* (*resize_displaysurface)(DisplaySurface *surface, int width, int height);
  173:     void (*free_displaysurface)(DisplaySurface *surface);
  174: };
  175: 
  176: struct DisplayState {
  177:     struct DisplaySurface *surface;
  178:     void *opaque;
  179:     struct QEMUTimer *gui_timer;
  180: 
  181:     struct DisplayAllocator* allocator;
  182:     struct DisplayChangeListener* listeners;
  183: 
  184:     void (*mouse_set)(int x, int y, int on);
  185:     void (*cursor_define)(QEMUCursor *cursor);
  186: 
  187:     struct DisplayState *next;
  188: };
  189: 
  190: void register_displaystate(DisplayState *ds);
  191: DisplayState *get_displaystate(void);
  192: DisplaySurface* qemu_create_displaysurface_from(int width, int height, int bpp,
  193:                                                 int linesize, uint8_t *data);
  194: void qemu_alloc_display(DisplaySurface *surface, int width, int height,
  195:                         int linesize, PixelFormat pf, int newflags);
  196: PixelFormat qemu_different_endianness_pixelformat(int bpp);
  197: PixelFormat qemu_default_pixelformat(int bpp);
  198: 
  199: DisplayAllocator *register_displayallocator(DisplayState *ds, DisplayAllocator *da);
  200: 
  201: static inline DisplaySurface* qemu_create_displaysurface(DisplayState *ds, int width, int height)
  202: {
  203:     return ds->allocator->create_displaysurface(width, height);    
  204: }
  205: 
  206: static inline DisplaySurface* qemu_resize_displaysurface(DisplayState *ds, int width, int height)
  207: {
  208:     return ds->allocator->resize_displaysurface(ds->surface, width, height);
  209: }
  210: 
  211: static inline void qemu_free_displaysurface(DisplayState *ds)
  212: {
  213:     ds->allocator->free_displaysurface(ds->surface);
  214: }
  215: 
  216: static inline int is_surface_bgr(DisplaySurface *surface)
  217: {
  218:     if (surface->pf.bits_per_pixel == 32 && surface->pf.rshift == 0)
  219:         return 1;
  220:     else
  221:         return 0;
  222: }
  223: 
  224: static inline int is_buffer_shared(DisplaySurface *surface)
  225: {
  226:     return (!(surface->flags & QEMU_ALLOCATED_FLAG) &&
  227:             !(surface->flags & QEMU_REALPIXELS_FLAG));
  228: }
  229: 
  230: static inline void register_displaychangelistener(DisplayState *ds, DisplayChangeListener *dcl)
  231: {
  232:     dcl->next = ds->listeners;
  233:     ds->listeners = dcl;
  234: }
  235: 
  236: static inline void dpy_update(DisplayState *s, int x, int y, int w, int h)
  237: {
  238:     struct DisplayChangeListener *dcl = s->listeners;
  239:     while (dcl != NULL) {
  240:         dcl->dpy_update(s, x, y, w, h);
  241:         dcl = dcl->next;
  242:     }
  243: }
  244: 
  245: static inline void dpy_resize(DisplayState *s)
  246: {
  247:     struct DisplayChangeListener *dcl = s->listeners;
  248:     while (dcl != NULL) {
  249:         dcl->dpy_resize(s);
  250:         dcl = dcl->next;
  251:     }
  252: }
  253: 
  254: static inline void dpy_setdata(DisplayState *s)
  255: {
  256:     struct DisplayChangeListener *dcl = s->listeners;
  257:     while (dcl != NULL) {
  258:         if (dcl->dpy_setdata) dcl->dpy_setdata(s);
  259:         dcl = dcl->next;
  260:     }
  261: }
  262: 
  263: static inline void dpy_refresh(DisplayState *s)
  264: {
  265:     struct DisplayChangeListener *dcl = s->listeners;
  266:     while (dcl != NULL) {
  267:         if (dcl->dpy_refresh) dcl->dpy_refresh(s);
  268:         dcl = dcl->next;
  269:     }
  270: }
  271: 
  272: static inline void dpy_copy(struct DisplayState *s, int src_x, int src_y,
  273:                              int dst_x, int dst_y, int w, int h) {
  274:     struct DisplayChangeListener *dcl = s->listeners;
  275:     while (dcl != NULL) {
  276:         if (dcl->dpy_copy)
  277:             dcl->dpy_copy(s, src_x, src_y, dst_x, dst_y, w, h);
  278:         else /* TODO */
  279:             dcl->dpy_update(s, dst_x, dst_y, w, h);
  280:         dcl = dcl->next;
  281:     }
  282: }
  283: 
  284: static inline void dpy_fill(struct DisplayState *s, int x, int y,
  285:                              int w, int h, uint32_t c) {
  286:     struct DisplayChangeListener *dcl = s->listeners;
  287:     while (dcl != NULL) {
  288:         if (dcl->dpy_fill) dcl->dpy_fill(s, x, y, w, h, c);
  289:         dcl = dcl->next;
  290:     }
  291: }
  292: 
  293: static inline void dpy_cursor(struct DisplayState *s, int x, int y) {
  294:     struct DisplayChangeListener *dcl = s->listeners;
  295:     while (dcl != NULL) {
  296:         if (dcl->dpy_text_cursor) dcl->dpy_text_cursor(s, x, y);
  297:         dcl = dcl->next;
  298:     }
  299: }
  300: 
  301: static inline int ds_get_linesize(DisplayState *ds)
  302: {
  303:     return ds->surface->linesize;
  304: }
  305: 
  306: static inline uint8_t* ds_get_data(DisplayState *ds)
  307: {
  308:     return ds->surface->data;
  309: }
  310: 
  311: static inline int ds_get_width(DisplayState *ds)
  312: {
  313:     return ds->surface->width;
  314: }
  315: 
  316: static inline int ds_get_height(DisplayState *ds)
  317: {
  318:     return ds->surface->height;
  319: }
  320: 
  321: static inline int ds_get_bits_per_pixel(DisplayState *ds)
  322: {
  323:     return ds->surface->pf.bits_per_pixel;
  324: }
  325: 
  326: static inline int ds_get_bytes_per_pixel(DisplayState *ds)
  327: {
  328:     return ds->surface->pf.bytes_per_pixel;
  329: }
  330: 
  331: typedef unsigned long console_ch_t;
  332: static inline void console_write_ch(console_ch_t *dest, uint32_t ch)
  333: {
  334:     if (!(ch & 0xff))
  335:         ch |= ' ';
  336:     *dest = ch;
  337: }
  338: 
  339: typedef void (*vga_hw_update_ptr)(void *);
  340: typedef void (*vga_hw_invalidate_ptr)(void *);
  341: typedef void (*vga_hw_screen_dump_ptr)(void *, const char *);
  342: typedef void (*vga_hw_text_update_ptr)(void *, console_ch_t *);
  343: 
  344: DisplayState *graphic_console_init(vga_hw_update_ptr update,
  345:                                    vga_hw_invalidate_ptr invalidate,
  346:                                    vga_hw_screen_dump_ptr screen_dump,
  347:                                    vga_hw_text_update_ptr text_update,
  348:                                    void *opaque);
  349: 
  350: void vga_hw_update(void);
  351: void vga_hw_invalidate(void);
  352: void vga_hw_screen_dump(const char *filename);
  353: void vga_hw_text_update(console_ch_t *chardata);
  354: 
  355: int is_graphic_console(void);
  356: int is_fixedsize_console(void);
  357: int text_console_init(QemuOpts *opts, CharDriverState **_chr);
  358: void text_consoles_set_display(DisplayState *ds);
  359: void console_select(unsigned int index);
  360: void console_color_init(DisplayState *ds);
  361: void qemu_console_resize(DisplayState *ds, int width, int height);
  362: void qemu_console_copy(DisplayState *ds, int src_x, int src_y,
  363:                        int dst_x, int dst_y, int w, int h);
  364: 
  365: /* sdl.c */
  366: void sdl_display_init(DisplayState *ds, int full_screen, int no_frame);
  367: 
  368: /* cocoa.m */
  369: void cocoa_display_init(DisplayState *ds, int full_screen);
  370: 
  371: /* vnc.c */
  372: void vnc_display_init(DisplayState *ds);
  373: void vnc_display_close(DisplayState *ds);
  374: int vnc_display_open(DisplayState *ds, const char *display);
  375: void vnc_display_add_client(DisplayState *ds, int csock, int skipauth);
  376: int vnc_display_disable_login(DisplayState *ds);
  377: char *vnc_display_local_addr(DisplayState *ds);
  378: #ifdef CONFIG_VNC
  379: int vnc_display_password(DisplayState *ds, const char *password);
  380: int vnc_display_pw_expire(DisplayState *ds, time_t expires);
  381: void do_info_vnc_print(Monitor *mon, const QObject *data);
  382: void do_info_vnc(Monitor *mon, QObject **ret_data);
  383: #else
  384: static inline int vnc_display_password(DisplayState *ds, const char *password)
  385: {
  386:     qerror_report(QERR_FEATURE_DISABLED, "vnc");
  387:     return -ENODEV;
  388: }
  389: static inline int vnc_display_pw_expire(DisplayState *ds, time_t expires)
  390: {
  391:     qerror_report(QERR_FEATURE_DISABLED, "vnc");
  392:     return -ENODEV;
  393: };
  394: static inline void do_info_vnc(Monitor *mon, QObject **ret_data)
  395: {
  396: };
  397: static inline void do_info_vnc_print(Monitor *mon, const QObject *data)
  398: {
  399:     monitor_printf(mon, "VNC support disabled\n");
  400: };
  401: #endif
  402: 
  403: /* curses.c */
  404: void curses_display_init(DisplayState *ds, int full_screen);
  405: 
  406: #endif

unix.superglobalmegacorp.com