mirror of https://github.com/xemu-project/xemu.git
ui: dispatch GL events to all listeners
For now, only one listener can receive GL events. Let's dispatch to all listeners. (preliminary check ensure there is a single listener now during regitration, and in next patches, compatible listeners only) Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Acked-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
f6413cbfd0
commit
7cc712e986
58
ui/console.c
58
ui/console.c
|
@ -1824,8 +1824,12 @@ int dpy_gl_ctx_make_current(QemuConsole *con, QEMUGLContext ctx)
|
||||||
|
|
||||||
void dpy_gl_scanout_disable(QemuConsole *con)
|
void dpy_gl_scanout_disable(QemuConsole *con)
|
||||||
{
|
{
|
||||||
assert(con->gl);
|
DisplayState *s = con->ds;
|
||||||
con->gl->ops->dpy_gl_scanout_disable(con->gl);
|
DisplayChangeListener *dcl;
|
||||||
|
|
||||||
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
|
dcl->ops->dpy_gl_scanout_disable(dcl);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dpy_gl_scanout_texture(QemuConsole *con,
|
void dpy_gl_scanout_texture(QemuConsole *con,
|
||||||
|
@ -1836,58 +1840,80 @@ void dpy_gl_scanout_texture(QemuConsole *con,
|
||||||
uint32_t x, uint32_t y,
|
uint32_t x, uint32_t y,
|
||||||
uint32_t width, uint32_t height)
|
uint32_t width, uint32_t height)
|
||||||
{
|
{
|
||||||
assert(con->gl);
|
DisplayState *s = con->ds;
|
||||||
con->gl->ops->dpy_gl_scanout_texture(con->gl, backing_id,
|
DisplayChangeListener *dcl;
|
||||||
|
|
||||||
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
|
dcl->ops->dpy_gl_scanout_texture(dcl, backing_id,
|
||||||
backing_y_0_top,
|
backing_y_0_top,
|
||||||
backing_width, backing_height,
|
backing_width, backing_height,
|
||||||
x, y, width, height);
|
x, y, width, height);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dpy_gl_scanout_dmabuf(QemuConsole *con,
|
void dpy_gl_scanout_dmabuf(QemuConsole *con,
|
||||||
QemuDmaBuf *dmabuf)
|
QemuDmaBuf *dmabuf)
|
||||||
{
|
{
|
||||||
assert(con->gl);
|
DisplayState *s = con->ds;
|
||||||
con->gl->ops->dpy_gl_scanout_dmabuf(con->gl, dmabuf);
|
DisplayChangeListener *dcl;
|
||||||
|
|
||||||
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
|
dcl->ops->dpy_gl_scanout_dmabuf(dcl, dmabuf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dpy_gl_cursor_dmabuf(QemuConsole *con, QemuDmaBuf *dmabuf,
|
void dpy_gl_cursor_dmabuf(QemuConsole *con, QemuDmaBuf *dmabuf,
|
||||||
bool have_hot, uint32_t hot_x, uint32_t hot_y)
|
bool have_hot, uint32_t hot_x, uint32_t hot_y)
|
||||||
{
|
{
|
||||||
assert(con->gl);
|
DisplayState *s = con->ds;
|
||||||
|
DisplayChangeListener *dcl;
|
||||||
|
|
||||||
if (con->gl->ops->dpy_gl_cursor_dmabuf) {
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
con->gl->ops->dpy_gl_cursor_dmabuf(con->gl, dmabuf,
|
if (dcl->ops->dpy_gl_cursor_dmabuf) {
|
||||||
|
dcl->ops->dpy_gl_cursor_dmabuf(dcl, dmabuf,
|
||||||
have_hot, hot_x, hot_y);
|
have_hot, hot_x, hot_y);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dpy_gl_cursor_position(QemuConsole *con,
|
void dpy_gl_cursor_position(QemuConsole *con,
|
||||||
uint32_t pos_x, uint32_t pos_y)
|
uint32_t pos_x, uint32_t pos_y)
|
||||||
{
|
{
|
||||||
assert(con->gl);
|
DisplayState *s = con->ds;
|
||||||
|
DisplayChangeListener *dcl;
|
||||||
|
|
||||||
if (con->gl->ops->dpy_gl_cursor_position) {
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
con->gl->ops->dpy_gl_cursor_position(con->gl, pos_x, pos_y);
|
if (dcl->ops->dpy_gl_cursor_position) {
|
||||||
|
dcl->ops->dpy_gl_cursor_position(dcl, pos_x, pos_y);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dpy_gl_release_dmabuf(QemuConsole *con,
|
void dpy_gl_release_dmabuf(QemuConsole *con,
|
||||||
QemuDmaBuf *dmabuf)
|
QemuDmaBuf *dmabuf)
|
||||||
{
|
{
|
||||||
assert(con->gl);
|
DisplayState *s = con->ds;
|
||||||
|
DisplayChangeListener *dcl;
|
||||||
|
|
||||||
if (con->gl->ops->dpy_gl_release_dmabuf) {
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
con->gl->ops->dpy_gl_release_dmabuf(con->gl, dmabuf);
|
if (dcl->ops->dpy_gl_release_dmabuf) {
|
||||||
|
dcl->ops->dpy_gl_release_dmabuf(dcl, dmabuf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dpy_gl_update(QemuConsole *con,
|
void dpy_gl_update(QemuConsole *con,
|
||||||
uint32_t x, uint32_t y, uint32_t w, uint32_t h)
|
uint32_t x, uint32_t y, uint32_t w, uint32_t h)
|
||||||
{
|
{
|
||||||
|
DisplayState *s = con->ds;
|
||||||
|
DisplayChangeListener *dcl;
|
||||||
|
|
||||||
assert(con->gl);
|
assert(con->gl);
|
||||||
|
|
||||||
graphic_hw_gl_block(con, true);
|
graphic_hw_gl_block(con, true);
|
||||||
con->gl->ops->dpy_gl_update(con->gl, x, y, w, h);
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
|
dcl->ops->dpy_gl_update(dcl, x, y, w, h);
|
||||||
|
}
|
||||||
graphic_hw_gl_block(con, false);
|
graphic_hw_gl_block(con, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue