128ecbaeeSPaolo Bonzini #ifndef CONSOLE_H
228ecbaeeSPaolo Bonzini #define CONSOLE_H
328ecbaeeSPaolo Bonzini
428ecbaeeSPaolo Bonzini #include "ui/qemu-pixman.h"
595be0669SGerd Hoffmann #include "qom/object.h"
61de7afc9SPaolo Bonzini #include "qemu/notify.h"
79af23989SMarkus Armbruster #include "qapi/qapi-types-ui.h"
8b6596785SBilal Elmoussaoui #include "ui/input.h"
96d8cd7c2SMarc-André Lureau #include "ui/surface.h"
106e6ae491SDongwon Kim #include "ui/dmabuf.h"
11cd2bc889SGerd Hoffmann
128c6381d8SMarc-André Lureau #define TYPE_QEMU_CONSOLE "qemu-console"
138c6381d8SMarc-André Lureau OBJECT_DECLARE_TYPE(QemuConsole, QemuConsoleClass, QEMU_CONSOLE)
148c6381d8SMarc-André Lureau
158c6381d8SMarc-André Lureau #define TYPE_QEMU_GRAPHIC_CONSOLE "qemu-graphic-console"
168c6381d8SMarc-André Lureau OBJECT_DECLARE_SIMPLE_TYPE(QemuGraphicConsole, QEMU_GRAPHIC_CONSOLE)
178c6381d8SMarc-André Lureau
188c6381d8SMarc-André Lureau #define TYPE_QEMU_TEXT_CONSOLE "qemu-text-console"
198c6381d8SMarc-André Lureau OBJECT_DECLARE_SIMPLE_TYPE(QemuTextConsole, QEMU_TEXT_CONSOLE)
208c6381d8SMarc-André Lureau
218c6381d8SMarc-André Lureau #define TYPE_QEMU_FIXED_TEXT_CONSOLE "qemu-fixed-text-console"
228c6381d8SMarc-André Lureau OBJECT_DECLARE_SIMPLE_TYPE(QemuFixedTextConsole, QEMU_FIXED_TEXT_CONSOLE)
238c6381d8SMarc-André Lureau
248c6381d8SMarc-André Lureau #define QEMU_IS_GRAPHIC_CONSOLE(c) \
258c6381d8SMarc-André Lureau object_dynamic_cast(OBJECT(c), TYPE_QEMU_GRAPHIC_CONSOLE)
268c6381d8SMarc-André Lureau
278c6381d8SMarc-André Lureau #define QEMU_IS_TEXT_CONSOLE(c) \
288c6381d8SMarc-André Lureau object_dynamic_cast(OBJECT(c), TYPE_QEMU_TEXT_CONSOLE)
298c6381d8SMarc-André Lureau
308c6381d8SMarc-André Lureau #define QEMU_IS_FIXED_TEXT_CONSOLE(c) \
318c6381d8SMarc-André Lureau object_dynamic_cast(OBJECT(c), TYPE_QEMU_FIXED_TEXT_CONSOLE)
328c6381d8SMarc-André Lureau
3328ecbaeeSPaolo Bonzini /* keyboard/mouse support */
3428ecbaeeSPaolo Bonzini
3528ecbaeeSPaolo Bonzini #define MOUSE_EVENT_LBUTTON 0x01
3628ecbaeeSPaolo Bonzini #define MOUSE_EVENT_RBUTTON 0x02
3728ecbaeeSPaolo Bonzini #define MOUSE_EVENT_MBUTTON 0x04
3821bae11aSGerd Hoffmann #define MOUSE_EVENT_WHEELUP 0x08
3921bae11aSGerd Hoffmann #define MOUSE_EVENT_WHEELDN 0x10
4028ecbaeeSPaolo Bonzini
4128ecbaeeSPaolo Bonzini /* identical to the ps/2 keyboard bits */
4228ecbaeeSPaolo Bonzini #define QEMU_SCROLL_LOCK_LED (1 << 0)
4328ecbaeeSPaolo Bonzini #define QEMU_NUM_LOCK_LED (1 << 1)
4428ecbaeeSPaolo Bonzini #define QEMU_CAPS_LOCK_LED (1 << 2)
4528ecbaeeSPaolo Bonzini
4628ecbaeeSPaolo Bonzini /* in ms */
470f7b2864SGerd Hoffmann #define GUI_REFRESH_INTERVAL_DEFAULT 30
480f7b2864SGerd Hoffmann #define GUI_REFRESH_INTERVAL_IDLE 3000
4928ecbaeeSPaolo Bonzini
504083733dSOGAWA Hirofumi /* Color number is match to standard vga palette */
514083733dSOGAWA Hirofumi enum qemu_color_names {
524083733dSOGAWA Hirofumi QEMU_COLOR_BLACK = 0,
534083733dSOGAWA Hirofumi QEMU_COLOR_BLUE = 1,
544083733dSOGAWA Hirofumi QEMU_COLOR_GREEN = 2,
554083733dSOGAWA Hirofumi QEMU_COLOR_CYAN = 3,
564083733dSOGAWA Hirofumi QEMU_COLOR_RED = 4,
574083733dSOGAWA Hirofumi QEMU_COLOR_MAGENTA = 5,
584083733dSOGAWA Hirofumi QEMU_COLOR_YELLOW = 6,
594083733dSOGAWA Hirofumi QEMU_COLOR_WHITE = 7
604083733dSOGAWA Hirofumi };
614083733dSOGAWA Hirofumi /* Convert to curses char attributes */
624083733dSOGAWA Hirofumi #define ATTR2CHTYPE(c, fg, bg, bold) \
634083733dSOGAWA Hirofumi ((bold) << 21 | (bg) << 11 | (fg) << 8 | (c))
644083733dSOGAWA Hirofumi
6528ecbaeeSPaolo Bonzini typedef void QEMUPutKBDEvent(void *opaque, int keycode);
6628ecbaeeSPaolo Bonzini typedef void QEMUPutLEDEvent(void *opaque, int ledstate);
6728ecbaeeSPaolo Bonzini typedef void QEMUPutMouseEvent(void *opaque, int dx, int dy, int dz, int buttons_state);
6828ecbaeeSPaolo Bonzini
6972711efbSGerd Hoffmann typedef struct QEMUPutMouseEntry QEMUPutMouseEntry;
705a37532dSGerd Hoffmann typedef struct QEMUPutKbdEntry QEMUPutKbdEntry;
7172711efbSGerd Hoffmann typedef struct QEMUPutLEDEntry QEMUPutLEDEntry;
7228ecbaeeSPaolo Bonzini
7328ecbaeeSPaolo Bonzini QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
7428ecbaeeSPaolo Bonzini void *opaque, int absolute,
7528ecbaeeSPaolo Bonzini const char *name);
7628ecbaeeSPaolo Bonzini void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry);
7728ecbaeeSPaolo Bonzini void qemu_activate_mouse_event_handler(QEMUPutMouseEntry *entry);
7828ecbaeeSPaolo Bonzini
7928ecbaeeSPaolo Bonzini QEMUPutLEDEntry *qemu_add_led_event_handler(QEMUPutLEDEvent *func, void *opaque);
8028ecbaeeSPaolo Bonzini void qemu_remove_led_event_handler(QEMUPutLEDEntry *entry);
8128ecbaeeSPaolo Bonzini
8228ecbaeeSPaolo Bonzini void kbd_put_ledstate(int ledstate);
8328ecbaeeSPaolo Bonzini
84ec843b97SMarkus Armbruster bool qemu_mouse_set(int index, Error **errp);
8528ecbaeeSPaolo Bonzini
8628ecbaeeSPaolo Bonzini /* keysym is a unicode code except for special keys (see QEMU_KEY_xxx
8728ecbaeeSPaolo Bonzini constants) */
8828ecbaeeSPaolo Bonzini #define QEMU_KEY_ESC1(c) ((c) | 0xe100)
89df6322a8SCal Peake #define QEMU_KEY_TAB 0x0009
9028ecbaeeSPaolo Bonzini #define QEMU_KEY_BACKSPACE 0x007f
9128ecbaeeSPaolo Bonzini #define QEMU_KEY_UP QEMU_KEY_ESC1('A')
9228ecbaeeSPaolo Bonzini #define QEMU_KEY_DOWN QEMU_KEY_ESC1('B')
9328ecbaeeSPaolo Bonzini #define QEMU_KEY_RIGHT QEMU_KEY_ESC1('C')
9428ecbaeeSPaolo Bonzini #define QEMU_KEY_LEFT QEMU_KEY_ESC1('D')
9528ecbaeeSPaolo Bonzini #define QEMU_KEY_HOME QEMU_KEY_ESC1(1)
9628ecbaeeSPaolo Bonzini #define QEMU_KEY_END QEMU_KEY_ESC1(4)
9728ecbaeeSPaolo Bonzini #define QEMU_KEY_PAGEUP QEMU_KEY_ESC1(5)
9828ecbaeeSPaolo Bonzini #define QEMU_KEY_PAGEDOWN QEMU_KEY_ESC1(6)
9928ecbaeeSPaolo Bonzini #define QEMU_KEY_DELETE QEMU_KEY_ESC1(3)
10028ecbaeeSPaolo Bonzini
10128ecbaeeSPaolo Bonzini #define QEMU_KEY_CTRL_UP 0xe400
10228ecbaeeSPaolo Bonzini #define QEMU_KEY_CTRL_DOWN 0xe401
10328ecbaeeSPaolo Bonzini #define QEMU_KEY_CTRL_LEFT 0xe402
10428ecbaeeSPaolo Bonzini #define QEMU_KEY_CTRL_RIGHT 0xe403
10528ecbaeeSPaolo Bonzini #define QEMU_KEY_CTRL_HOME 0xe404
10628ecbaeeSPaolo Bonzini #define QEMU_KEY_CTRL_END 0xe405
10728ecbaeeSPaolo Bonzini #define QEMU_KEY_CTRL_PAGEUP 0xe406
10828ecbaeeSPaolo Bonzini #define QEMU_KEY_CTRL_PAGEDOWN 0xe407
10928ecbaeeSPaolo Bonzini
110cc6ba2c6SMarc-André Lureau void qemu_text_console_put_keysym(QemuTextConsole *s, int keysym);
111cc6ba2c6SMarc-André Lureau bool qemu_text_console_put_qcode(QemuTextConsole *s, int qcode, bool ctrl);
112cc6ba2c6SMarc-André Lureau void qemu_text_console_put_string(QemuTextConsole *s, const char *str, int len);
11328ecbaeeSPaolo Bonzini
114b6596785SBilal Elmoussaoui /* Touch devices */
115b6596785SBilal Elmoussaoui typedef struct touch_slot {
116b6596785SBilal Elmoussaoui int x;
117b6596785SBilal Elmoussaoui int y;
118b6596785SBilal Elmoussaoui int tracking_id;
119b6596785SBilal Elmoussaoui } touch_slot;
120b6596785SBilal Elmoussaoui
121b6596785SBilal Elmoussaoui void console_handle_touch_event(QemuConsole *con,
122b6596785SBilal Elmoussaoui struct touch_slot touch_slots[INPUT_EVENT_SLOTS_MAX],
123b6596785SBilal Elmoussaoui uint64_t num_slot,
124b6596785SBilal Elmoussaoui int width, int height,
125b6596785SBilal Elmoussaoui double x, double y,
126b6596785SBilal Elmoussaoui InputMultiTouchType type,
127b6596785SBilal Elmoussaoui Error **errp);
12828ecbaeeSPaolo Bonzini /* consoles */
12928ecbaeeSPaolo Bonzini
13095be0669SGerd Hoffmann struct QemuConsoleClass {
13195be0669SGerd Hoffmann ObjectClass parent_class;
13295be0669SGerd Hoffmann };
13395be0669SGerd Hoffmann
134ebced091SMarc-André Lureau typedef struct ScanoutTexture {
135ebced091SMarc-André Lureau uint32_t backing_id;
136ebced091SMarc-André Lureau bool backing_y_0_top;
137ebced091SMarc-André Lureau uint32_t backing_width;
138ebced091SMarc-André Lureau uint32_t backing_height;
139ebced091SMarc-André Lureau uint32_t x;
140ebced091SMarc-André Lureau uint32_t y;
141ebced091SMarc-André Lureau uint32_t width;
142ebced091SMarc-André Lureau uint32_t height;
143bf41ab61SMarc-André Lureau void *d3d_tex2d;
144ebced091SMarc-André Lureau } ScanoutTexture;
145ebced091SMarc-André Lureau
1466f90f3d7SGerd Hoffmann typedef struct QemuUIInfo {
1479028ab1fSMarc-André Lureau /* physical dimension */
1489028ab1fSMarc-André Lureau uint16_t width_mm;
1499028ab1fSMarc-André Lureau uint16_t height_mm;
1506f90f3d7SGerd Hoffmann /* geometry */
1516f90f3d7SGerd Hoffmann int xoff;
1526f90f3d7SGerd Hoffmann int yoff;
1536f90f3d7SGerd Hoffmann uint32_t width;
1546f90f3d7SGerd Hoffmann uint32_t height;
155aeffd071SAkihiko Odaki uint32_t refresh_rate;
1566f90f3d7SGerd Hoffmann } QemuUIInfo;
1576f90f3d7SGerd Hoffmann
15828ecbaeeSPaolo Bonzini /* cursor data format is 32bit RGBA */
15928ecbaeeSPaolo Bonzini typedef struct QEMUCursor {
1604c93ce54SMauro Matteo Cascella uint16_t width, height;
16128ecbaeeSPaolo Bonzini int hot_x, hot_y;
16228ecbaeeSPaolo Bonzini int refcount;
16328ecbaeeSPaolo Bonzini uint32_t data[];
16428ecbaeeSPaolo Bonzini } QEMUCursor;
16528ecbaeeSPaolo Bonzini
1664c93ce54SMauro Matteo Cascella QEMUCursor *cursor_alloc(uint16_t width, uint16_t height);
1672512a026SMarc-André Lureau QEMUCursor *cursor_ref(QEMUCursor *c);
168f4579e28SMarc-André Lureau void cursor_unref(QEMUCursor *c);
16928ecbaeeSPaolo Bonzini QEMUCursor *cursor_builtin_hidden(void);
17028ecbaeeSPaolo Bonzini QEMUCursor *cursor_builtin_left_ptr(void);
17128ecbaeeSPaolo Bonzini void cursor_print_ascii_art(QEMUCursor *c, const char *prefix);
17228ecbaeeSPaolo Bonzini int cursor_get_mono_bpl(QEMUCursor *c);
17328ecbaeeSPaolo Bonzini void cursor_set_mono(QEMUCursor *c,
17428ecbaeeSPaolo Bonzini uint32_t foreground, uint32_t background, uint8_t *image,
17528ecbaeeSPaolo Bonzini int transparent, uint8_t *mask);
17628ecbaeeSPaolo Bonzini void cursor_get_mono_mask(QEMUCursor *c, int transparent, uint8_t *mask);
17728ecbaeeSPaolo Bonzini
17806020b95SGerd Hoffmann typedef void *QEMUGLContext;
17906020b95SGerd Hoffmann typedef struct QEMUGLParams QEMUGLParams;
18006020b95SGerd Hoffmann
18106020b95SGerd Hoffmann struct QEMUGLParams {
18206020b95SGerd Hoffmann int major_ver;
18306020b95SGerd Hoffmann int minor_ver;
18406020b95SGerd Hoffmann };
18506020b95SGerd Hoffmann
186ebced091SMarc-André Lureau enum display_scanout {
187ebced091SMarc-André Lureau SCANOUT_NONE,
188ebced091SMarc-André Lureau SCANOUT_SURFACE,
189ebced091SMarc-André Lureau SCANOUT_TEXTURE,
190ebced091SMarc-André Lureau SCANOUT_DMABUF,
191ebced091SMarc-André Lureau };
192ebced091SMarc-André Lureau
193ebced091SMarc-André Lureau typedef struct DisplayScanout {
194ebced091SMarc-André Lureau enum display_scanout kind;
195ebced091SMarc-André Lureau union {
196ebced091SMarc-André Lureau /* DisplaySurface *surface; is kept in QemuConsole */
197ebced091SMarc-André Lureau ScanoutTexture texture;
198ebced091SMarc-André Lureau QemuDmaBuf *dmabuf;
199ebced091SMarc-André Lureau };
200ebced091SMarc-André Lureau } DisplayScanout;
201ebced091SMarc-André Lureau
2027536587cSPhilippe Mathieu-Daudé typedef struct DisplayState DisplayState;
2035e79d516SMarc-André Lureau typedef struct DisplayGLCtx DisplayGLCtx;
2047536587cSPhilippe Mathieu-Daudé
2057c20b4a3SGerd Hoffmann typedef struct DisplayChangeListenerOps {
2067c20b4a3SGerd Hoffmann const char *dpy_name;
2077c20b4a3SGerd Hoffmann
208227d8444SMarc-André Lureau /* optional */
209bc2ed970SGerd Hoffmann void (*dpy_refresh)(DisplayChangeListener *dcl);
2107c20b4a3SGerd Hoffmann
211227d8444SMarc-André Lureau /* optional */
2127c20b4a3SGerd Hoffmann void (*dpy_gfx_update)(DisplayChangeListener *dcl,
2137c20b4a3SGerd Hoffmann int x, int y, int w, int h);
214227d8444SMarc-André Lureau /* optional */
215c12aeb86SGerd Hoffmann void (*dpy_gfx_switch)(DisplayChangeListener *dcl,
216c12aeb86SGerd Hoffmann struct DisplaySurface *new_surface);
217227d8444SMarc-André Lureau /* optional */
21849743df3SBenjamin Herrenschmidt bool (*dpy_gfx_check_format)(DisplayChangeListener *dcl,
21949743df3SBenjamin Herrenschmidt pixman_format_code_t format);
2207c20b4a3SGerd Hoffmann
221227d8444SMarc-André Lureau /* optional */
2227c20b4a3SGerd Hoffmann void (*dpy_text_cursor)(DisplayChangeListener *dcl,
2237c20b4a3SGerd Hoffmann int x, int y);
224227d8444SMarc-André Lureau /* optional */
2257c20b4a3SGerd Hoffmann void (*dpy_text_resize)(DisplayChangeListener *dcl,
2267c20b4a3SGerd Hoffmann int w, int h);
227227d8444SMarc-André Lureau /* optional */
2287c20b4a3SGerd Hoffmann void (*dpy_text_update)(DisplayChangeListener *dcl,
2297c20b4a3SGerd Hoffmann int x, int y, int w, int h);
2307c20b4a3SGerd Hoffmann
231227d8444SMarc-André Lureau /* optional */
2327c20b4a3SGerd Hoffmann void (*dpy_mouse_set)(DisplayChangeListener *dcl,
233*a418e7aeSAkihiko Odaki int x, int y, bool on);
234227d8444SMarc-André Lureau /* optional */
2357c20b4a3SGerd Hoffmann void (*dpy_cursor_define)(DisplayChangeListener *dcl,
2367c20b4a3SGerd Hoffmann QEMUCursor *cursor);
23706020b95SGerd Hoffmann
238227d8444SMarc-André Lureau /* required if GL */
239eaa92c76SGerd Hoffmann void (*dpy_gl_scanout_disable)(DisplayChangeListener *dcl);
240227d8444SMarc-André Lureau /* required if GL */
241f4c36bdaSGerd Hoffmann void (*dpy_gl_scanout_texture)(DisplayChangeListener *dcl,
242f4c36bdaSGerd Hoffmann uint32_t backing_id,
243f4c36bdaSGerd Hoffmann bool backing_y_0_top,
244f4c36bdaSGerd Hoffmann uint32_t backing_width,
245f4c36bdaSGerd Hoffmann uint32_t backing_height,
246f4c36bdaSGerd Hoffmann uint32_t x, uint32_t y,
247bf41ab61SMarc-André Lureau uint32_t w, uint32_t h,
248bf41ab61SMarc-André Lureau void *d3d_tex2d);
249d0e137bcSMarc-André Lureau /* optional (default to true if has dpy_gl_scanout_dmabuf) */
250d0e137bcSMarc-André Lureau bool (*dpy_has_dmabuf)(DisplayChangeListener *dcl);
251227d8444SMarc-André Lureau /* optional */
2524133fa71SGerd Hoffmann void (*dpy_gl_scanout_dmabuf)(DisplayChangeListener *dcl,
2534133fa71SGerd Hoffmann QemuDmaBuf *dmabuf);
254227d8444SMarc-André Lureau /* optional */
2554133fa71SGerd Hoffmann void (*dpy_gl_cursor_dmabuf)(DisplayChangeListener *dcl,
2566e1f2cb5SGerd Hoffmann QemuDmaBuf *dmabuf, bool have_hot,
2576e1f2cb5SGerd Hoffmann uint32_t hot_x, uint32_t hot_y);
258227d8444SMarc-André Lureau /* optional */
2596e1f2cb5SGerd Hoffmann void (*dpy_gl_cursor_position)(DisplayChangeListener *dcl,
2604133fa71SGerd Hoffmann uint32_t pos_x, uint32_t pos_y);
261227d8444SMarc-André Lureau /* optional */
2624133fa71SGerd Hoffmann void (*dpy_gl_release_dmabuf)(DisplayChangeListener *dcl,
2634133fa71SGerd Hoffmann QemuDmaBuf *dmabuf);
264227d8444SMarc-André Lureau /* required if GL */
26506020b95SGerd Hoffmann void (*dpy_gl_update)(DisplayChangeListener *dcl,
26606020b95SGerd Hoffmann uint32_t x, uint32_t y, uint32_t w, uint32_t h);
26706020b95SGerd Hoffmann
2687c20b4a3SGerd Hoffmann } DisplayChangeListenerOps;
2697c20b4a3SGerd Hoffmann
27028ecbaeeSPaolo Bonzini struct DisplayChangeListener {
2710f7b2864SGerd Hoffmann uint64_t update_interval;
2727c20b4a3SGerd Hoffmann const DisplayChangeListenerOps *ops;
2737c20b4a3SGerd Hoffmann DisplayState *ds;
274284d1c6bSGerd Hoffmann QemuConsole *con;
27528ecbaeeSPaolo Bonzini
27628ecbaeeSPaolo Bonzini QLIST_ENTRY(DisplayChangeListener) next;
27728ecbaeeSPaolo Bonzini };
27828ecbaeeSPaolo Bonzini
2795e79d516SMarc-André Lureau typedef struct DisplayGLCtxOps {
280a62c4a17SMarc-André Lureau bool (*dpy_gl_ctx_is_compatible_dcl)(DisplayGLCtx *dgc,
281a62c4a17SMarc-André Lureau DisplayChangeListener *dcl);
2825e79d516SMarc-André Lureau QEMUGLContext (*dpy_gl_ctx_create)(DisplayGLCtx *dgc,
2835e79d516SMarc-André Lureau QEMUGLParams *params);
2845e79d516SMarc-André Lureau void (*dpy_gl_ctx_destroy)(DisplayGLCtx *dgc,
2855e79d516SMarc-André Lureau QEMUGLContext ctx);
2865e79d516SMarc-André Lureau int (*dpy_gl_ctx_make_current)(DisplayGLCtx *dgc,
2875e79d516SMarc-André Lureau QEMUGLContext ctx);
288589089feSMarc-André Lureau void (*dpy_gl_ctx_create_texture)(DisplayGLCtx *dgc,
289589089feSMarc-André Lureau DisplaySurface *surface);
290589089feSMarc-André Lureau void (*dpy_gl_ctx_destroy_texture)(DisplayGLCtx *dgc,
291589089feSMarc-André Lureau DisplaySurface *surface);
292589089feSMarc-André Lureau void (*dpy_gl_ctx_update_texture)(DisplayGLCtx *dgc,
293589089feSMarc-André Lureau DisplaySurface *surface,
294589089feSMarc-André Lureau int x, int y, int w, int h);
2955e79d516SMarc-André Lureau } DisplayGLCtxOps;
2965e79d516SMarc-André Lureau
2975e79d516SMarc-André Lureau struct DisplayGLCtx {
2985e79d516SMarc-André Lureau const DisplayGLCtxOps *ops;
299589089feSMarc-André Lureau #ifdef CONFIG_OPENGL
300589089feSMarc-André Lureau QemuGLShader *gls; /* optional shared shader */
301589089feSMarc-André Lureau #endif
3025e79d516SMarc-André Lureau };
3035e79d516SMarc-André Lureau
30464840c66SGerd Hoffmann DisplayState *init_displaystate(void);
305b5a087b0SAkihiko Odaki
3065209089fSGerd Hoffmann void register_displaychangelistener(DisplayChangeListener *dcl);
3070f7b2864SGerd Hoffmann void update_displaychangelistener(DisplayChangeListener *dcl,
3080f7b2864SGerd Hoffmann uint64_t interval);
3097c20b4a3SGerd Hoffmann void unregister_displaychangelistener(DisplayChangeListener *dcl);
31028ecbaeeSPaolo Bonzini
311a92e7bb4SMarc-André Lureau bool dpy_ui_info_supported(const QemuConsole *con);
3125eaf1e48SMarc-André Lureau const QemuUIInfo *dpy_get_ui_info(const QemuConsole *con);
313ca19ef52SMarc-André Lureau int dpy_set_ui_info(QemuConsole *con, QemuUIInfo *info, bool delay);
3146f90f3d7SGerd Hoffmann
315c78f7137SGerd Hoffmann void dpy_gfx_update(QemuConsole *con, int x, int y, int w, int h);
3167cd0afe6STina Zhang void dpy_gfx_update_full(QemuConsole *con);
317c78f7137SGerd Hoffmann void dpy_gfx_replace_surface(QemuConsole *con,
318da229ef3SGerd Hoffmann DisplaySurface *surface);
319c78f7137SGerd Hoffmann void dpy_text_cursor(QemuConsole *con, int x, int y);
320c78f7137SGerd Hoffmann void dpy_text_update(QemuConsole *con, int x, int y, int w, int h);
321c78f7137SGerd Hoffmann void dpy_text_resize(QemuConsole *con, int w, int h);
322*a418e7aeSAkihiko Odaki void dpy_mouse_set(QemuConsole *con, int x, int y, bool on);
323c78f7137SGerd Hoffmann void dpy_cursor_define(QemuConsole *con, QEMUCursor *cursor);
32449743df3SBenjamin Herrenschmidt bool dpy_gfx_check_format(QemuConsole *con,
32549743df3SBenjamin Herrenschmidt pixman_format_code_t format);
32628ecbaeeSPaolo Bonzini
327eaa92c76SGerd Hoffmann void dpy_gl_scanout_disable(QemuConsole *con);
328f4c36bdaSGerd Hoffmann void dpy_gl_scanout_texture(QemuConsole *con,
32906020b95SGerd Hoffmann uint32_t backing_id, bool backing_y_0_top,
3309d8256ebSMarc-André Lureau uint32_t backing_width, uint32_t backing_height,
331bf41ab61SMarc-André Lureau uint32_t x, uint32_t y, uint32_t w, uint32_t h,
332bf41ab61SMarc-André Lureau void *d3d_tex2d);
3334133fa71SGerd Hoffmann void dpy_gl_scanout_dmabuf(QemuConsole *con,
3344133fa71SGerd Hoffmann QemuDmaBuf *dmabuf);
3356e1f2cb5SGerd Hoffmann void dpy_gl_cursor_dmabuf(QemuConsole *con, QemuDmaBuf *dmabuf,
3366e1f2cb5SGerd Hoffmann bool have_hot, uint32_t hot_x, uint32_t hot_y);
3376e1f2cb5SGerd Hoffmann void dpy_gl_cursor_position(QemuConsole *con,
3384133fa71SGerd Hoffmann uint32_t pos_x, uint32_t pos_y);
3394133fa71SGerd Hoffmann void dpy_gl_release_dmabuf(QemuConsole *con,
3404133fa71SGerd Hoffmann QemuDmaBuf *dmabuf);
34106020b95SGerd Hoffmann void dpy_gl_update(QemuConsole *con,
34206020b95SGerd Hoffmann uint32_t x, uint32_t y, uint32_t w, uint32_t h);
34306020b95SGerd Hoffmann
34406020b95SGerd Hoffmann QEMUGLContext dpy_gl_ctx_create(QemuConsole *con,
34506020b95SGerd Hoffmann QEMUGLParams *params);
34606020b95SGerd Hoffmann void dpy_gl_ctx_destroy(QemuConsole *con, QEMUGLContext ctx);
34706020b95SGerd Hoffmann int dpy_gl_ctx_make_current(QemuConsole *con, QEMUGLContext ctx);
34806020b95SGerd Hoffmann
34906020b95SGerd Hoffmann bool console_has_gl(QemuConsole *con);
35006020b95SGerd Hoffmann
351e2f82e92SGerd Hoffmann typedef uint32_t console_ch_t;
352e2f82e92SGerd Hoffmann
console_write_ch(console_ch_t * dest,uint32_t ch)35328ecbaeeSPaolo Bonzini static inline void console_write_ch(console_ch_t *dest, uint32_t ch)
35428ecbaeeSPaolo Bonzini {
35528ecbaeeSPaolo Bonzini *dest = ch;
35628ecbaeeSPaolo Bonzini }
35728ecbaeeSPaolo Bonzini
358a7dfbe28SMarc-André Lureau enum {
359a7dfbe28SMarc-André Lureau GRAPHIC_FLAGS_NONE = 0,
360a7dfbe28SMarc-André Lureau /* require a console/display with GL callbacks */
361a7dfbe28SMarc-André Lureau GRAPHIC_FLAGS_GL = 1 << 0,
362a7dfbe28SMarc-André Lureau /* require a console/display with DMABUF import */
363a7dfbe28SMarc-André Lureau GRAPHIC_FLAGS_DMABUF = 1 << 1,
364a7dfbe28SMarc-André Lureau };
365a7dfbe28SMarc-André Lureau
366380cd056SGerd Hoffmann typedef struct GraphicHwOps {
367a7dfbe28SMarc-André Lureau int (*get_flags)(void *opaque); /* optional, default 0 */
368380cd056SGerd Hoffmann void (*invalidate)(void *opaque);
369380cd056SGerd Hoffmann void (*gfx_update)(void *opaque);
3704d631621SMarc-André Lureau bool gfx_update_async; /* if true, calls graphic_hw_update_done() */
371380cd056SGerd Hoffmann void (*text_update)(void *opaque, console_ch_t *text);
372362239c0SAkihiko Odaki void (*ui_info)(void *opaque, uint32_t head, QemuUIInfo *info);
373bba19b88SGerd Hoffmann void (*gl_block)(void *opaque, bool block);
374380cd056SGerd Hoffmann } GraphicHwOps;
37528ecbaeeSPaolo Bonzini
3765643706aSGerd Hoffmann QemuConsole *graphic_console_init(DeviceState *dev, uint32_t head,
377aa2beaa1SGerd Hoffmann const GraphicHwOps *ops,
37828ecbaeeSPaolo Bonzini void *opaque);
3791c1f9498SGerd Hoffmann void graphic_console_set_hwops(QemuConsole *con,
3801c1f9498SGerd Hoffmann const GraphicHwOps *hw_ops,
3811c1f9498SGerd Hoffmann void *opaque);
3829588d67eSGerd Hoffmann void graphic_console_close(QemuConsole *con);
38328ecbaeeSPaolo Bonzini
3841dbfa005SGerd Hoffmann void graphic_hw_update(QemuConsole *con);
3854d631621SMarc-André Lureau void graphic_hw_update_done(QemuConsole *con);
3861dbfa005SGerd Hoffmann void graphic_hw_invalidate(QemuConsole *con);
3871dbfa005SGerd Hoffmann void graphic_hw_text_update(QemuConsole *con, console_ch_t *chardata);
388bba19b88SGerd Hoffmann void graphic_hw_gl_block(QemuConsole *con, bool block);
38928ecbaeeSPaolo Bonzini
390777357d7SMarc-André Lureau void qemu_console_early_init(void);
391777357d7SMarc-André Lureau
3925e79d516SMarc-André Lureau void qemu_console_set_display_gl_ctx(QemuConsole *con, DisplayGLCtx *ctx);
3934f418149SMarc-André Lureau
394d4c19956SAkihiko Odaki QemuConsole *qemu_console_lookup_default(void);
395284d1c6bSGerd Hoffmann QemuConsole *qemu_console_lookup_by_index(unsigned int index);
3965643706aSGerd Hoffmann QemuConsole *qemu_console_lookup_by_device(DeviceState *dev, uint32_t head);
397f2c1d54cSGerd Hoffmann QemuConsole *qemu_console_lookup_by_device_name(const char *device_id,
398f2c1d54cSGerd Hoffmann uint32_t head, Error **errp);
399385ac97fSMarc-André Lureau QEMUCursor *qemu_console_get_cursor(QemuConsole *con);
40081c0d5a6SGerd Hoffmann bool qemu_console_is_visible(QemuConsole *con);
40181c0d5a6SGerd Hoffmann bool qemu_console_is_graphic(QemuConsole *con);
40281c0d5a6SGerd Hoffmann bool qemu_console_is_fixedsize(QemuConsole *con);
403f607867cSGerd Hoffmann bool qemu_console_is_gl_blocked(QemuConsole *con);
404779ce88fSGerd Hoffmann char *qemu_console_get_label(QemuConsole *con);
405d4c85337SGerd Hoffmann int qemu_console_get_index(QemuConsole *con);
4065643706aSGerd Hoffmann uint32_t qemu_console_get_head(QemuConsole *con);
407d4c85337SGerd Hoffmann int qemu_console_get_width(QemuConsole *con, int fallback);
408d4c85337SGerd Hoffmann int qemu_console_get_height(QemuConsole *con, int fallback);
409b3cb21b9SSamuel Thibault /* Return the low-level window id for the console */
410b3cb21b9SSamuel Thibault int qemu_console_get_window_id(QemuConsole *con);
411b3cb21b9SSamuel Thibault /* Set the low-level window id for the console */
412b3cb21b9SSamuel Thibault void qemu_console_set_window_id(QemuConsole *con, int window_id);
41381c0d5a6SGerd Hoffmann
414c78f7137SGerd Hoffmann void qemu_console_resize(QemuConsole *con, int width, int height);
415c78f7137SGerd Hoffmann DisplaySurface *qemu_console_surface(QemuConsole *con);
4164f2c765bSMarc-André Lureau void coroutine_fn qemu_console_co_wait_update(QemuConsole *con);
417322dae4bSMarc-André Lureau int qemu_invalidate_text_consoles(void);
41828ecbaeeSPaolo Bonzini
419cd2bc889SGerd Hoffmann /* console-gl.c */
420cd2bc889SGerd Hoffmann #ifdef CONFIG_OPENGL
421cd2bc889SGerd Hoffmann bool console_gl_check_format(DisplayChangeListener *dcl,
422cd2bc889SGerd Hoffmann pixman_format_code_t format);
42346e19e14SGerd Hoffmann void surface_gl_create_texture(QemuGLShader *gls,
424cd2bc889SGerd Hoffmann DisplaySurface *surface);
42546e19e14SGerd Hoffmann void surface_gl_update_texture(QemuGLShader *gls,
426cd2bc889SGerd Hoffmann DisplaySurface *surface,
427cd2bc889SGerd Hoffmann int x, int y, int w, int h);
42846e19e14SGerd Hoffmann void surface_gl_render_texture(QemuGLShader *gls,
429cd2bc889SGerd Hoffmann DisplaySurface *surface);
43046e19e14SGerd Hoffmann void surface_gl_destroy_texture(QemuGLShader *gls,
431cd2bc889SGerd Hoffmann DisplaySurface *surface);
43246e19e14SGerd Hoffmann void surface_gl_setup_viewport(QemuGLShader *gls,
433cd2bc889SGerd Hoffmann DisplaySurface *surface,
434cd2bc889SGerd Hoffmann int ww, int wh);
435cd2bc889SGerd Hoffmann #endif
436cd2bc889SGerd Hoffmann
437db71589fSGerd Hoffmann typedef struct QemuDisplay QemuDisplay;
43828ecbaeeSPaolo Bonzini
439db71589fSGerd Hoffmann struct QemuDisplay {
440db71589fSGerd Hoffmann DisplayType type;
441db71589fSGerd Hoffmann void (*early_init)(DisplayOptions *opts);
442db71589fSGerd Hoffmann void (*init)(DisplayState *ds, DisplayOptions *opts);
4431bec1cc0SMarc-André Lureau const char *vc;
444db71589fSGerd Hoffmann };
445db71589fSGerd Hoffmann
446db71589fSGerd Hoffmann void qemu_display_register(QemuDisplay *ui);
447898f9d41SGerd Hoffmann bool qemu_display_find_default(DisplayOptions *opts);
448db71589fSGerd Hoffmann void qemu_display_early_init(DisplayOptions *opts);
449db71589fSGerd Hoffmann void qemu_display_init(DisplayState *ds, DisplayOptions *opts);
4501bec1cc0SMarc-André Lureau const char *qemu_display_get_vc(DisplayOptions *opts);
451c388f408SThomas Huth void qemu_display_help(void);
45228ecbaeeSPaolo Bonzini
45328ecbaeeSPaolo Bonzini /* vnc.c */
454ab4f931eSFei Li void vnc_display_init(const char *id, Error **errp);
4554db14629SGerd Hoffmann void vnc_display_open(const char *id, Error **errp);
45614f7143eSGerd Hoffmann void vnc_display_add_client(const char *id, int csock, bool skipauth);
45714f7143eSGerd Hoffmann int vnc_display_password(const char *id, const char *password);
45814f7143eSGerd Hoffmann int vnc_display_pw_expire(const char *id, time_t expires);
459653c9747SPaolo Bonzini void vnc_parse(const char *str);
46028d0de7aSMarkus Armbruster int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp);
4611f08e341SZihao Chang bool vnc_display_reload_certs(const char *id, Error **errp);
462abea1946SVladimir Sementsov-Ogievskiy bool vnc_display_update(DisplayUpdateOptionsVNC *arg, Error **errp);
46328ecbaeeSPaolo Bonzini
46428ecbaeeSPaolo Bonzini /* input.c */
46564ffbe04SWolfgang Bumiller int index_from_key(const char *key, size_t key_length);
46628ecbaeeSPaolo Bonzini
467b956577aSPhilippe Mathieu-Daudé #ifdef CONFIG_LINUX
46887f12216SVivek Kasireddy /* udmabuf.c */
46987f12216SVivek Kasireddy int udmabuf_fd(void);
470b956577aSPhilippe Mathieu-Daudé #endif
47187f12216SVivek Kasireddy
472f6ef71bdSMarc-André Lureau /* util.c */
473f6ef71bdSMarc-André Lureau bool qemu_console_fill_device_address(QemuConsole *con,
474f6ef71bdSMarc-André Lureau char *device_address,
475f6ef71bdSMarc-André Lureau size_t size,
476f6ef71bdSMarc-André Lureau Error **errp);
477f6ef71bdSMarc-André Lureau
47828ecbaeeSPaolo Bonzini #endif
479