Annotation of qemu/console.h, revision 1.1.1.8

1.1       root        1: #ifndef CONSOLE_H
                      2: #define CONSOLE_H
                      3: 
                      4: #include "qemu-char.h"
1.1.1.5   root        5: #include "qdict.h"
1.1.1.6   root        6: #include "notify.h"
1.1.1.8 ! root        7: #include "qerror.h"
        !             8: #include "monitor.h"
1.1       root        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: 
1.1.1.6   root       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: 
1.1.1.2   root       21: /* in ms */
                     22: #define GUI_REFRESH_INTERVAL 30
                     23: 
1.1       root       24: typedef void QEMUPutKBDEvent(void *opaque, int keycode);
1.1.1.6   root       25: typedef void QEMUPutLEDEvent(void *opaque, int ledstate);
1.1       root       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: 
1.1.1.6   root       34:     int index;
                     35: 
1.1       root       36:     /* used internally by qemu for handling mice */
1.1.1.6   root       37:     QTAILQ_ENTRY(QEMUPutMouseEntry) node;
1.1       root       38: } QEMUPutMouseEntry;
                     39: 
1.1.1.6   root       40: typedef struct QEMUPutLEDEntry {
                     41:     QEMUPutLEDEvent *put_led;
                     42:     void *opaque;
                     43:     QTAILQ_ENTRY(QEMUPutLEDEntry) next;
                     44: } QEMUPutLEDEntry;
                     45: 
1.1       root       46: void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque);
1.1.1.6   root       47: void qemu_remove_kbd_event_handler(void);
1.1       root       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);
1.1.1.6   root       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);
1.1       root       56: 
                     57: void kbd_put_keycode(int keycode);
1.1.1.6   root       58: void kbd_put_ledstate(int ledstate);
1.1       root       59: void kbd_mouse_event(int dx, int dy, int dz, int buttons_state);
1.1.1.6   root       60: 
                     61: /* Does the current mouse generate absolute events */
1.1       root       62: int kbd_mouse_is_absolute(void);
1.1.1.6   root       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);
1.1       root       68: 
1.1.1.4   root       69: struct MouseTransformInfo {
1.1.1.2   root       70:     /* Touchscreen resolution */
                     71:     int x;
                     72:     int y;
                     73:     /* Calibration values as used/generated by tslib */
                     74:     int a[7];
                     75: };
                     76: 
1.1.1.5   root       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);
1.1       root       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: 
1.1.1.2   root      108: #define QEMU_BIG_ENDIAN_FLAG    0x01
                    109: #define QEMU_ALLOCATED_FLAG     0x02
1.1.1.4   root      110: #define QEMU_REALPIXELS_FLAG    0x04
1.1.1.2   root      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;
1.1       root      124:     int width;
                    125:     int height;
1.1.1.2   root      126:     int linesize;        /* bytes per line */
                    127:     uint8_t *data;
                    128: 
                    129:     struct PixelFormat pf;
                    130: };
                    131: 
1.1.1.6   root      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: 
1.1.1.2   root      153: struct DisplayChangeListener {
                    154:     int idle;
                    155:     uint64_t gui_timer_interval;
1.1       root      156: 
                    157:     void (*dpy_update)(struct DisplayState *s, int x, int y, int w, int h);
1.1.1.2   root      158:     void (*dpy_resize)(struct DisplayState *s);
                    159:     void (*dpy_setdata)(struct DisplayState *s);
1.1       root      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);
1.1.1.2   root      165:     void (*dpy_text_cursor)(struct DisplayState *s, int x, int y);
                    166: 
                    167:     struct DisplayChangeListener *next;
                    168: };
                    169: 
1.1.1.4   root      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: 
1.1.1.2   root      176: struct DisplayState {
                    177:     struct DisplaySurface *surface;
                    178:     void *opaque;
                    179:     struct QEMUTimer *gui_timer;
                    180: 
1.1.1.4   root      181:     struct DisplayAllocator* allocator;
1.1.1.2   root      182:     struct DisplayChangeListener* listeners;
                    183: 
1.1       root      184:     void (*mouse_set)(int x, int y, int on);
1.1.1.6   root      185:     void (*cursor_define)(QEMUCursor *cursor);
1.1.1.2   root      186: 
                    187:     struct DisplayState *next;
1.1       root      188: };
                    189: 
1.1.1.2   root      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);
1.1.1.8 ! root      194: void qemu_alloc_display(DisplaySurface *surface, int width, int height,
        !           195:                         int linesize, PixelFormat pf, int newflags);
1.1.1.2   root      196: PixelFormat qemu_different_endianness_pixelformat(int bpp);
                    197: PixelFormat qemu_default_pixelformat(int bpp);
                    198: 
1.1.1.4   root      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: 
1.1.1.2   root      224: static inline int is_buffer_shared(DisplaySurface *surface)
                    225: {
1.1.1.4   root      226:     return (!(surface->flags & QEMU_ALLOCATED_FLAG) &&
                    227:             !(surface->flags & QEMU_REALPIXELS_FLAG));
1.1.1.2   root      228: }
                    229: 
                    230: static inline void register_displaychangelistener(DisplayState *ds, DisplayChangeListener *dcl)
                    231: {
                    232:     dcl->next = ds->listeners;
                    233:     ds->listeners = dcl;
                    234: }
                    235: 
1.1       root      236: static inline void dpy_update(DisplayState *s, int x, int y, int w, int h)
                    237: {
1.1.1.2   root      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;
1.1       root      304: }
                    305: 
1.1.1.2   root      306: static inline uint8_t* ds_get_data(DisplayState *ds)
1.1       root      307: {
1.1.1.2   root      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: {
1.1.1.6   root      334:     if (!(ch & 0xff))
                    335:         ch |= ' ';
1.1.1.7   root      336:     *dest = ch;
1.1       root      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 *);
1.1.1.2   root      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);
1.1       root      349: 
                    350: void vga_hw_update(void);
                    351: void vga_hw_invalidate(void);
                    352: void vga_hw_screen_dump(const char *filename);
1.1.1.2   root      353: void vga_hw_text_update(console_ch_t *chardata);
1.1       root      354: 
                    355: int is_graphic_console(void);
1.1.1.2   root      356: int is_fixedsize_console(void);
1.1.1.8 ! root      357: int text_console_init(QemuOpts *opts, CharDriverState **_chr);
1.1.1.2   root      358: void text_consoles_set_display(DisplayState *ds);
1.1       root      359: void console_select(unsigned int index);
                    360: void console_color_init(DisplayState *ds);
1.1.1.2   root      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);
1.1       root      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);
1.1.1.8 ! root      375: void vnc_display_add_client(DisplayState *ds, int csock, int skipauth);
1.1.1.7   root      376: int vnc_display_disable_login(DisplayState *ds);
1.1.1.8 ! root      377: char *vnc_display_local_addr(DisplayState *ds);
        !           378: #ifdef CONFIG_VNC
        !           379: int vnc_display_password(DisplayState *ds, const char *password);
1.1.1.7   root      380: int vnc_display_pw_expire(DisplayState *ds, time_t expires);
1.1.1.5   root      381: void do_info_vnc_print(Monitor *mon, const QObject *data);
                    382: void do_info_vnc(Monitor *mon, QObject **ret_data);
1.1.1.8 ! root      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
1.1       root      402: 
1.1.1.2   root      403: /* curses.c */
                    404: void curses_display_init(DisplayState *ds, int full_screen);
1.1       root      405: 
                    406: #endif

unix.superglobalmegacorp.com