Annotation of qemu/console.h, revision 1.1.1.10

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 "monitor.h"
1.1.1.10! root        8: #include "trace.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_mouse_set(Monitor *mon, const QDict *qdict);
1.1       root       78: 
                     79: /* keysym is a unicode code except for special keys (see QEMU_KEY_xxx
                     80:    constants) */
                     81: #define QEMU_KEY_ESC1(c) ((c) | 0xe100)
                     82: #define QEMU_KEY_BACKSPACE  0x007f
                     83: #define QEMU_KEY_UP         QEMU_KEY_ESC1('A')
                     84: #define QEMU_KEY_DOWN       QEMU_KEY_ESC1('B')
                     85: #define QEMU_KEY_RIGHT      QEMU_KEY_ESC1('C')
                     86: #define QEMU_KEY_LEFT       QEMU_KEY_ESC1('D')
                     87: #define QEMU_KEY_HOME       QEMU_KEY_ESC1(1)
                     88: #define QEMU_KEY_END        QEMU_KEY_ESC1(4)
                     89: #define QEMU_KEY_PAGEUP     QEMU_KEY_ESC1(5)
                     90: #define QEMU_KEY_PAGEDOWN   QEMU_KEY_ESC1(6)
                     91: #define QEMU_KEY_DELETE     QEMU_KEY_ESC1(3)
                     92: 
                     93: #define QEMU_KEY_CTRL_UP         0xe400
                     94: #define QEMU_KEY_CTRL_DOWN       0xe401
                     95: #define QEMU_KEY_CTRL_LEFT       0xe402
                     96: #define QEMU_KEY_CTRL_RIGHT      0xe403
                     97: #define QEMU_KEY_CTRL_HOME       0xe404
                     98: #define QEMU_KEY_CTRL_END        0xe405
                     99: #define QEMU_KEY_CTRL_PAGEUP     0xe406
                    100: #define QEMU_KEY_CTRL_PAGEDOWN   0xe407
                    101: 
                    102: void kbd_put_keysym(int keysym);
                    103: 
                    104: /* consoles */
                    105: 
1.1.1.2   root      106: #define QEMU_BIG_ENDIAN_FLAG    0x01
                    107: #define QEMU_ALLOCATED_FLAG     0x02
1.1.1.4   root      108: #define QEMU_REALPIXELS_FLAG    0x04
1.1.1.2   root      109: 
                    110: struct PixelFormat {
                    111:     uint8_t bits_per_pixel;
                    112:     uint8_t bytes_per_pixel;
                    113:     uint8_t depth; /* color depth in bits */
                    114:     uint32_t rmask, gmask, bmask, amask;
                    115:     uint8_t rshift, gshift, bshift, ashift;
                    116:     uint8_t rmax, gmax, bmax, amax;
                    117:     uint8_t rbits, gbits, bbits, abits;
                    118: };
                    119: 
                    120: struct DisplaySurface {
                    121:     uint8_t flags;
1.1       root      122:     int width;
                    123:     int height;
1.1.1.2   root      124:     int linesize;        /* bytes per line */
                    125:     uint8_t *data;
                    126: 
                    127:     struct PixelFormat pf;
                    128: };
                    129: 
1.1.1.6   root      130: /* cursor data format is 32bit RGBA */
                    131: typedef struct QEMUCursor {
                    132:     int                 width, height;
                    133:     int                 hot_x, hot_y;
                    134:     int                 refcount;
                    135:     uint32_t            data[];
                    136: } QEMUCursor;
                    137: 
                    138: QEMUCursor *cursor_alloc(int width, int height);
                    139: void cursor_get(QEMUCursor *c);
                    140: void cursor_put(QEMUCursor *c);
                    141: QEMUCursor *cursor_builtin_hidden(void);
                    142: QEMUCursor *cursor_builtin_left_ptr(void);
                    143: void cursor_print_ascii_art(QEMUCursor *c, const char *prefix);
                    144: int cursor_get_mono_bpl(QEMUCursor *c);
                    145: void cursor_set_mono(QEMUCursor *c,
                    146:                      uint32_t foreground, uint32_t background, uint8_t *image,
                    147:                      int transparent, uint8_t *mask);
                    148: void cursor_get_mono_image(QEMUCursor *c, int foreground, uint8_t *mask);
                    149: void cursor_get_mono_mask(QEMUCursor *c, int transparent, uint8_t *mask);
                    150: 
1.1.1.2   root      151: struct DisplayChangeListener {
                    152:     int idle;
                    153:     uint64_t gui_timer_interval;
1.1       root      154: 
                    155:     void (*dpy_update)(struct DisplayState *s, int x, int y, int w, int h);
1.1.1.2   root      156:     void (*dpy_resize)(struct DisplayState *s);
                    157:     void (*dpy_setdata)(struct DisplayState *s);
1.1       root      158:     void (*dpy_refresh)(struct DisplayState *s);
                    159:     void (*dpy_copy)(struct DisplayState *s, int src_x, int src_y,
                    160:                      int dst_x, int dst_y, int w, int h);
                    161:     void (*dpy_fill)(struct DisplayState *s, int x, int y,
                    162:                      int w, int h, uint32_t c);
1.1.1.2   root      163:     void (*dpy_text_cursor)(struct DisplayState *s, int x, int y);
                    164: 
                    165:     struct DisplayChangeListener *next;
                    166: };
                    167: 
1.1.1.4   root      168: struct DisplayAllocator {
                    169:     DisplaySurface* (*create_displaysurface)(int width, int height);
                    170:     DisplaySurface* (*resize_displaysurface)(DisplaySurface *surface, int width, int height);
                    171:     void (*free_displaysurface)(DisplaySurface *surface);
                    172: };
                    173: 
1.1.1.2   root      174: struct DisplayState {
                    175:     struct DisplaySurface *surface;
                    176:     void *opaque;
                    177:     struct QEMUTimer *gui_timer;
                    178: 
1.1.1.4   root      179:     struct DisplayAllocator* allocator;
1.1.1.2   root      180:     struct DisplayChangeListener* listeners;
                    181: 
1.1       root      182:     void (*mouse_set)(int x, int y, int on);
1.1.1.6   root      183:     void (*cursor_define)(QEMUCursor *cursor);
1.1.1.2   root      184: 
                    185:     struct DisplayState *next;
1.1       root      186: };
                    187: 
1.1.1.2   root      188: void register_displaystate(DisplayState *ds);
                    189: DisplayState *get_displaystate(void);
                    190: DisplaySurface* qemu_create_displaysurface_from(int width, int height, int bpp,
                    191:                                                 int linesize, uint8_t *data);
1.1.1.8   root      192: void qemu_alloc_display(DisplaySurface *surface, int width, int height,
                    193:                         int linesize, PixelFormat pf, int newflags);
1.1.1.2   root      194: PixelFormat qemu_different_endianness_pixelformat(int bpp);
                    195: PixelFormat qemu_default_pixelformat(int bpp);
                    196: 
1.1.1.4   root      197: DisplayAllocator *register_displayallocator(DisplayState *ds, DisplayAllocator *da);
                    198: 
                    199: static inline DisplaySurface* qemu_create_displaysurface(DisplayState *ds, int width, int height)
                    200: {
                    201:     return ds->allocator->create_displaysurface(width, height);    
                    202: }
                    203: 
                    204: static inline DisplaySurface* qemu_resize_displaysurface(DisplayState *ds, int width, int height)
                    205: {
1.1.1.10! root      206:     trace_displaysurface_resize(ds, ds->surface, width, height);
1.1.1.4   root      207:     return ds->allocator->resize_displaysurface(ds->surface, width, height);
                    208: }
                    209: 
                    210: static inline void qemu_free_displaysurface(DisplayState *ds)
                    211: {
1.1.1.10! root      212:     trace_displaysurface_free(ds, ds->surface);
1.1.1.4   root      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: 
1.1.1.9   root      331: #ifdef CONFIG_CURSES
                    332: #include <curses.h>
                    333: typedef chtype console_ch_t;
                    334: #else
1.1.1.2   root      335: typedef unsigned long console_ch_t;
1.1.1.9   root      336: #endif
1.1.1.2   root      337: static inline void console_write_ch(console_ch_t *dest, uint32_t ch)
                    338: {
1.1.1.6   root      339:     if (!(ch & 0xff))
                    340:         ch |= ' ';
1.1.1.7   root      341:     *dest = ch;
1.1       root      342: }
                    343: 
                    344: typedef void (*vga_hw_update_ptr)(void *);
                    345: typedef void (*vga_hw_invalidate_ptr)(void *);
1.1.1.10! root      346: typedef void (*vga_hw_screen_dump_ptr)(void *, const char *, bool cswitch);
1.1.1.2   root      347: typedef void (*vga_hw_text_update_ptr)(void *, console_ch_t *);
                    348: 
                    349: DisplayState *graphic_console_init(vga_hw_update_ptr update,
                    350:                                    vga_hw_invalidate_ptr invalidate,
                    351:                                    vga_hw_screen_dump_ptr screen_dump,
                    352:                                    vga_hw_text_update_ptr text_update,
                    353:                                    void *opaque);
1.1       root      354: 
                    355: void vga_hw_update(void);
                    356: void vga_hw_invalidate(void);
                    357: void vga_hw_screen_dump(const char *filename);
1.1.1.2   root      358: void vga_hw_text_update(console_ch_t *chardata);
1.1       root      359: 
                    360: int is_graphic_console(void);
1.1.1.2   root      361: int is_fixedsize_console(void);
1.1.1.10! root      362: CharDriverState *text_console_init(QemuOpts *opts);
1.1.1.2   root      363: void text_consoles_set_display(DisplayState *ds);
1.1       root      364: void console_select(unsigned int index);
                    365: void console_color_init(DisplayState *ds);
1.1.1.2   root      366: void qemu_console_resize(DisplayState *ds, int width, int height);
                    367: void qemu_console_copy(DisplayState *ds, int src_x, int src_y,
                    368:                        int dst_x, int dst_y, int w, int h);
1.1       root      369: 
                    370: /* sdl.c */
                    371: void sdl_display_init(DisplayState *ds, int full_screen, int no_frame);
                    372: 
                    373: /* cocoa.m */
                    374: void cocoa_display_init(DisplayState *ds, int full_screen);
                    375: 
                    376: /* vnc.c */
                    377: void vnc_display_init(DisplayState *ds);
                    378: void vnc_display_close(DisplayState *ds);
                    379: int vnc_display_open(DisplayState *ds, const char *display);
1.1.1.8   root      380: void vnc_display_add_client(DisplayState *ds, int csock, int skipauth);
1.1.1.7   root      381: int vnc_display_disable_login(DisplayState *ds);
1.1.1.8   root      382: char *vnc_display_local_addr(DisplayState *ds);
                    383: #ifdef CONFIG_VNC
                    384: int vnc_display_password(DisplayState *ds, const char *password);
1.1.1.7   root      385: int vnc_display_pw_expire(DisplayState *ds, time_t expires);
1.1.1.8   root      386: #else
                    387: static inline int vnc_display_password(DisplayState *ds, const char *password)
                    388: {
                    389:     return -ENODEV;
                    390: }
                    391: static inline int vnc_display_pw_expire(DisplayState *ds, time_t expires)
                    392: {
                    393:     return -ENODEV;
                    394: };
                    395: #endif
1.1       root      396: 
1.1.1.2   root      397: /* curses.c */
                    398: void curses_display_init(DisplayState *ds, int full_screen);
1.1       root      399: 
                    400: #endif

unix.superglobalmegacorp.com