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