display/ui: pending fixes
- ui/vnc: Respect bound console - ui/dbus: optimize a bit message queuing - virtio-gpu: fix blob scanout post-load -----BEGIN PGP SIGNATURE----- iQJQBAABCAA6FiEEh6m9kz+HxgbSdvYt2ujhCXWWnOUFAmXwYCYcHG1hcmNhbmRy ZS5sdXJlYXVAcmVkaGF0LmNvbQAKCRDa6OEJdZac5bv9D/9J1g76mYND+ad++d+G YiewXtHVwrHm9g+TxUdWXaBcDFy+uFtGpwIBtYN76YjSSL47li74V7sQTZ2FQVys Y8W61xBzDoAcCLV7/m48WW/mov2+TtyUFYIC3ZOBFS6Ol5aiJ8uurJa11h2WTacq tQKlK5g//Yv0H0cxn1cYMqRFdsko3H2hSmYz36QuPWfxivC2VeMnN/iTSGfiVSb+ hTkOdRu+5qmt3mbbYo0Z6YpvjhLqSLob6n29+P7/QlwrQxP+A/JSS4FrAHryXzvm qZ/wRsPmThjwpnt3ZV9AapagQ7908FRmh1EhyAxrWq2G8QGK/XvJ/JPwBOgZGEiy W48N5FQhdQUkxkVpkmQVpGhJFAzclqJh/duZiBtixw+25Md6DG04OwHy9k7qCph7 qj2BZuaSafVcSE0JEG78bt5YHAO3Joyfjf7Jhb0Tqvn2kbv94tCTGtUIH6ngYv4Z r0vTmlDr7pe1xaa9HeFpaopckvj4uQhlcMHnrETnUtcdWKE5SaBlgNsIwHlNlKZ6 wmUIMKymXNRIiCZrf2xxJr7PeZ8FJgTlHCy9poSJRwpZDKHaZQMecklELx+jECuU DPhAmTPTZjCKiXGCI+KlL6nDy/H7zA6boCMO2QpKVk0ehviWOQZvu94srTJL5nz/ RX+rwGbf3+8LfIFJmLcQCD5qag== =oY0A -----END PGP SIGNATURE----- Merge tag 'ui-pull-request' of https://gitlab.com/marcandre.lureau/qemu into staging display/ui: pending fixes - ui/vnc: Respect bound console - ui/dbus: optimize a bit message queuing - virtio-gpu: fix blob scanout post-load # -----BEGIN PGP SIGNATURE----- # # iQJQBAABCAA6FiEEh6m9kz+HxgbSdvYt2ujhCXWWnOUFAmXwYCYcHG1hcmNhbmRy # ZS5sdXJlYXVAcmVkaGF0LmNvbQAKCRDa6OEJdZac5bv9D/9J1g76mYND+ad++d+G # YiewXtHVwrHm9g+TxUdWXaBcDFy+uFtGpwIBtYN76YjSSL47li74V7sQTZ2FQVys # Y8W61xBzDoAcCLV7/m48WW/mov2+TtyUFYIC3ZOBFS6Ol5aiJ8uurJa11h2WTacq # tQKlK5g//Yv0H0cxn1cYMqRFdsko3H2hSmYz36QuPWfxivC2VeMnN/iTSGfiVSb+ # hTkOdRu+5qmt3mbbYo0Z6YpvjhLqSLob6n29+P7/QlwrQxP+A/JSS4FrAHryXzvm # qZ/wRsPmThjwpnt3ZV9AapagQ7908FRmh1EhyAxrWq2G8QGK/XvJ/JPwBOgZGEiy # W48N5FQhdQUkxkVpkmQVpGhJFAzclqJh/duZiBtixw+25Md6DG04OwHy9k7qCph7 # qj2BZuaSafVcSE0JEG78bt5YHAO3Joyfjf7Jhb0Tqvn2kbv94tCTGtUIH6ngYv4Z # r0vTmlDr7pe1xaa9HeFpaopckvj4uQhlcMHnrETnUtcdWKE5SaBlgNsIwHlNlKZ6 # wmUIMKymXNRIiCZrf2xxJr7PeZ8FJgTlHCy9poSJRwpZDKHaZQMecklELx+jECuU # DPhAmTPTZjCKiXGCI+KlL6nDy/H7zA6boCMO2QpKVk0ehviWOQZvu94srTJL5nz/ # RX+rwGbf3+8LfIFJmLcQCD5qag== # =oY0A # -----END PGP SIGNATURE----- # gpg: Signature made Tue 12 Mar 2024 14:01:10 GMT # gpg: using RSA key 87A9BD933F87C606D276F62DDAE8E10975969CE5 # gpg: issuer "marcandre.lureau@redhat.com" # gpg: Good signature from "Marc-André Lureau <marcandre.lureau@redhat.com>" [full] # gpg: aka "Marc-André Lureau <marcandre.lureau@gmail.com>" [full] # Primary key fingerprint: 87A9 BD93 3F87 C606 D276 F62D DAE8 E109 7596 9CE5 * tag 'ui-pull-request' of https://gitlab.com/marcandre.lureau/qemu: virtio-gpu: fix scanout migration post-load virtio-gpu: remove needless condition ui/dbus: filter out pending messages when scanout ui/dbus: factor out sending a scanout ui/vnc: Respect bound console Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
0748129684
@ -600,6 +600,7 @@ static void virtio_unref_resource(pixman_image_t *image, void *data)
|
|||||||
static void virtio_gpu_update_scanout(VirtIOGPU *g,
|
static void virtio_gpu_update_scanout(VirtIOGPU *g,
|
||||||
uint32_t scanout_id,
|
uint32_t scanout_id,
|
||||||
struct virtio_gpu_simple_resource *res,
|
struct virtio_gpu_simple_resource *res,
|
||||||
|
struct virtio_gpu_framebuffer *fb,
|
||||||
struct virtio_gpu_rect *r)
|
struct virtio_gpu_rect *r)
|
||||||
{
|
{
|
||||||
struct virtio_gpu_simple_resource *ores;
|
struct virtio_gpu_simple_resource *ores;
|
||||||
@ -617,9 +618,10 @@ static void virtio_gpu_update_scanout(VirtIOGPU *g,
|
|||||||
scanout->y = r->y;
|
scanout->y = r->y;
|
||||||
scanout->width = r->width;
|
scanout->width = r->width;
|
||||||
scanout->height = r->height;
|
scanout->height = r->height;
|
||||||
|
scanout->fb = *fb;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void virtio_gpu_do_set_scanout(VirtIOGPU *g,
|
static bool virtio_gpu_do_set_scanout(VirtIOGPU *g,
|
||||||
uint32_t scanout_id,
|
uint32_t scanout_id,
|
||||||
struct virtio_gpu_framebuffer *fb,
|
struct virtio_gpu_framebuffer *fb,
|
||||||
struct virtio_gpu_simple_resource *res,
|
struct virtio_gpu_simple_resource *res,
|
||||||
@ -645,7 +647,7 @@ static void virtio_gpu_do_set_scanout(VirtIOGPU *g,
|
|||||||
r->x, r->y, r->width, r->height,
|
r->x, r->y, r->width, r->height,
|
||||||
fb->width, fb->height);
|
fb->width, fb->height);
|
||||||
*error = VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER;
|
*error = VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER;
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
g->parent_obj.enable = 1;
|
g->parent_obj.enable = 1;
|
||||||
@ -653,11 +655,12 @@ static void virtio_gpu_do_set_scanout(VirtIOGPU *g,
|
|||||||
if (res->blob) {
|
if (res->blob) {
|
||||||
if (console_has_gl(scanout->con)) {
|
if (console_has_gl(scanout->con)) {
|
||||||
if (!virtio_gpu_update_dmabuf(g, scanout_id, res, fb, r)) {
|
if (!virtio_gpu_update_dmabuf(g, scanout_id, res, fb, r)) {
|
||||||
virtio_gpu_update_scanout(g, scanout_id, res, r);
|
virtio_gpu_update_scanout(g, scanout_id, res, fb, r);
|
||||||
} else {
|
} else {
|
||||||
*error = VIRTIO_GPU_RESP_ERR_OUT_OF_MEMORY;
|
*error = VIRTIO_GPU_RESP_ERR_OUT_OF_MEMORY;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
data = res->blob;
|
data = res->blob;
|
||||||
@ -684,10 +687,6 @@ static void virtio_gpu_do_set_scanout(VirtIOGPU *g,
|
|||||||
|
|
||||||
/* realloc the surface ptr */
|
/* realloc the surface ptr */
|
||||||
scanout->ds = qemu_create_displaysurface_pixman(rect);
|
scanout->ds = qemu_create_displaysurface_pixman(rect);
|
||||||
if (!scanout->ds) {
|
|
||||||
*error = VIRTIO_GPU_RESP_ERR_UNSPEC;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
qemu_displaysurface_win32_set_handle(scanout->ds, res->handle, fb->offset);
|
qemu_displaysurface_win32_set_handle(scanout->ds, res->handle, fb->offset);
|
||||||
#endif
|
#endif
|
||||||
@ -697,7 +696,8 @@ static void virtio_gpu_do_set_scanout(VirtIOGPU *g,
|
|||||||
scanout->ds);
|
scanout->ds);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtio_gpu_update_scanout(g, scanout_id, res, r);
|
virtio_gpu_update_scanout(g, scanout_id, res, fb, r);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void virtio_gpu_set_scanout(VirtIOGPU *g,
|
static void virtio_gpu_set_scanout(VirtIOGPU *g,
|
||||||
@ -1168,7 +1168,8 @@ static void virtio_gpu_cursor_bh(void *opaque)
|
|||||||
|
|
||||||
static const VMStateDescription vmstate_virtio_gpu_scanout = {
|
static const VMStateDescription vmstate_virtio_gpu_scanout = {
|
||||||
.name = "virtio-gpu-one-scanout",
|
.name = "virtio-gpu-one-scanout",
|
||||||
.version_id = 1,
|
.version_id = 2,
|
||||||
|
.minimum_version_id = 1,
|
||||||
.fields = (const VMStateField[]) {
|
.fields = (const VMStateField[]) {
|
||||||
VMSTATE_UINT32(resource_id, struct virtio_gpu_scanout),
|
VMSTATE_UINT32(resource_id, struct virtio_gpu_scanout),
|
||||||
VMSTATE_UINT32(width, struct virtio_gpu_scanout),
|
VMSTATE_UINT32(width, struct virtio_gpu_scanout),
|
||||||
@ -1180,6 +1181,12 @@ static const VMStateDescription vmstate_virtio_gpu_scanout = {
|
|||||||
VMSTATE_UINT32(cursor.hot_y, struct virtio_gpu_scanout),
|
VMSTATE_UINT32(cursor.hot_y, struct virtio_gpu_scanout),
|
||||||
VMSTATE_UINT32(cursor.pos.x, struct virtio_gpu_scanout),
|
VMSTATE_UINT32(cursor.pos.x, struct virtio_gpu_scanout),
|
||||||
VMSTATE_UINT32(cursor.pos.y, struct virtio_gpu_scanout),
|
VMSTATE_UINT32(cursor.pos.y, struct virtio_gpu_scanout),
|
||||||
|
VMSTATE_UINT32_V(fb.format, struct virtio_gpu_scanout, 2),
|
||||||
|
VMSTATE_UINT32_V(fb.bytes_pp, struct virtio_gpu_scanout, 2),
|
||||||
|
VMSTATE_UINT32_V(fb.width, struct virtio_gpu_scanout, 2),
|
||||||
|
VMSTATE_UINT32_V(fb.height, struct virtio_gpu_scanout, 2),
|
||||||
|
VMSTATE_UINT32_V(fb.stride, struct virtio_gpu_scanout, 2),
|
||||||
|
VMSTATE_UINT32_V(fb.offset, struct virtio_gpu_scanout, 2),
|
||||||
VMSTATE_END_OF_LIST()
|
VMSTATE_END_OF_LIST()
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -1351,6 +1358,7 @@ static int virtio_gpu_blob_save(QEMUFile *f, void *opaque, size_t size,
|
|||||||
if (!res->blob_size) {
|
if (!res->blob_size) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
assert(!res->image);
|
||||||
qemu_put_be32(f, res->resource_id);
|
qemu_put_be32(f, res->resource_id);
|
||||||
qemu_put_be32(f, res->blob_size);
|
qemu_put_be32(f, res->blob_size);
|
||||||
qemu_put_be32(f, res->iov_cnt);
|
qemu_put_be32(f, res->iov_cnt);
|
||||||
@ -1413,24 +1421,40 @@ static int virtio_gpu_post_load(void *opaque, int version_id)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < g->parent_obj.conf.max_outputs; i++) {
|
for (i = 0; i < g->parent_obj.conf.max_outputs; i++) {
|
||||||
/* FIXME: should take scanout.r.{x,y} into account */
|
|
||||||
scanout = &g->parent_obj.scanout[i];
|
scanout = &g->parent_obj.scanout[i];
|
||||||
if (!scanout->resource_id) {
|
if (!scanout->resource_id) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = virtio_gpu_find_resource(g, scanout->resource_id);
|
res = virtio_gpu_find_resource(g, scanout->resource_id);
|
||||||
if (!res) {
|
if (!res) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
scanout->ds = qemu_create_displaysurface_pixman(res->image);
|
|
||||||
if (!scanout->ds) {
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
#ifdef WIN32
|
|
||||||
qemu_displaysurface_win32_set_handle(scanout->ds, res->handle, 0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
dpy_gfx_replace_surface(scanout->con, scanout->ds);
|
if (scanout->fb.format != 0) {
|
||||||
|
uint32_t error = 0;
|
||||||
|
struct virtio_gpu_rect r = {
|
||||||
|
.x = scanout->x,
|
||||||
|
.y = scanout->y,
|
||||||
|
.width = scanout->width,
|
||||||
|
.height = scanout->height
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!virtio_gpu_do_set_scanout(g, i, &scanout->fb, res, &r, &error)) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* legacy v1 migration support */
|
||||||
|
if (!res->image) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
scanout->ds = qemu_create_displaysurface_pixman(res->image);
|
||||||
|
#ifdef WIN32
|
||||||
|
qemu_displaysurface_win32_set_handle(scanout->ds, res->handle, 0);
|
||||||
|
#endif
|
||||||
|
dpy_gfx_replace_surface(scanout->con, scanout->ds);
|
||||||
|
}
|
||||||
|
|
||||||
dpy_gfx_update_full(scanout->con);
|
dpy_gfx_update_full(scanout->con);
|
||||||
if (scanout->cursor.resource_id) {
|
if (scanout->cursor.resource_id) {
|
||||||
update_cursor(g, &scanout->cursor);
|
update_cursor(g, &scanout->cursor);
|
||||||
|
@ -81,6 +81,7 @@ struct virtio_gpu_scanout {
|
|||||||
uint32_t resource_id;
|
uint32_t resource_id;
|
||||||
struct virtio_gpu_update_cursor cursor;
|
struct virtio_gpu_update_cursor cursor;
|
||||||
QEMUCursor *current_cursor;
|
QEMUCursor *current_cursor;
|
||||||
|
struct virtio_gpu_framebuffer fb;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct virtio_gpu_requested_state {
|
struct virtio_gpu_requested_state {
|
||||||
|
@ -83,6 +83,9 @@ struct _DBusDisplayListener {
|
|||||||
egl_fb fb;
|
egl_fb fb;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
guint dbus_filter;
|
||||||
|
guint32 out_serial_to_discard;
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE(DBusDisplayListener, dbus_display_listener, G_TYPE_OBJECT)
|
G_DEFINE_TYPE(DBusDisplayListener, dbus_display_listener, G_TYPE_OBJECT)
|
||||||
@ -90,6 +93,12 @@ G_DEFINE_TYPE(DBusDisplayListener, dbus_display_listener, G_TYPE_OBJECT)
|
|||||||
static void dbus_gfx_update(DisplayChangeListener *dcl,
|
static void dbus_gfx_update(DisplayChangeListener *dcl,
|
||||||
int x, int y, int w, int h);
|
int x, int y, int w, int h);
|
||||||
|
|
||||||
|
static void ddl_discard_pending_messages(DBusDisplayListener *ddl)
|
||||||
|
{
|
||||||
|
ddl->out_serial_to_discard = g_dbus_connection_get_last_serial(
|
||||||
|
g_dbus_proxy_get_connection(G_DBUS_PROXY(ddl->proxy)));
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_OPENGL
|
#ifdef CONFIG_OPENGL
|
||||||
static void dbus_scanout_disable(DisplayChangeListener *dcl)
|
static void dbus_scanout_disable(DisplayChangeListener *dcl)
|
||||||
{
|
{
|
||||||
@ -276,6 +285,8 @@ static void dbus_scanout_dmabuf(DisplayChangeListener *dcl,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ddl_discard_pending_messages(ddl);
|
||||||
|
|
||||||
/* FIXME: add missing x/y/w/h support */
|
/* FIXME: add missing x/y/w/h support */
|
||||||
qemu_dbus_display1_listener_call_scanout_dmabuf(
|
qemu_dbus_display1_listener_call_scanout_dmabuf(
|
||||||
ddl->proxy,
|
ddl->proxy,
|
||||||
@ -323,6 +334,8 @@ static bool dbus_scanout_map(DBusDisplayListener *ddl)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ddl_discard_pending_messages(ddl);
|
||||||
|
|
||||||
if (!qemu_dbus_display1_listener_win32_map_call_scanout_map_sync(
|
if (!qemu_dbus_display1_listener_win32_map_call_scanout_map_sync(
|
||||||
ddl->map_proxy,
|
ddl->map_proxy,
|
||||||
GPOINTER_TO_UINT(target_handle),
|
GPOINTER_TO_UINT(target_handle),
|
||||||
@ -384,6 +397,8 @@ dbus_scanout_share_d3d_texture(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ddl_discard_pending_messages(ddl);
|
||||||
|
|
||||||
qemu_dbus_display1_listener_win32_d3d11_call_scanout_texture2d(
|
qemu_dbus_display1_listener_win32_d3d11_call_scanout_texture2d(
|
||||||
ddl->d3d11_proxy,
|
ddl->d3d11_proxy,
|
||||||
GPOINTER_TO_INT(target_handle),
|
GPOINTER_TO_INT(target_handle),
|
||||||
@ -630,11 +645,28 @@ static void dbus_gfx_update_sub(DBusDisplayListener *ddl,
|
|||||||
DBUS_DEFAULT_TIMEOUT, NULL, NULL, NULL);
|
DBUS_DEFAULT_TIMEOUT, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ddl_scanout(DBusDisplayListener *ddl)
|
||||||
|
{
|
||||||
|
GVariant *v_data;
|
||||||
|
|
||||||
|
v_data = g_variant_new_from_data(
|
||||||
|
G_VARIANT_TYPE("ay"), surface_data(ddl->ds),
|
||||||
|
surface_stride(ddl->ds) * surface_height(ddl->ds), TRUE,
|
||||||
|
(GDestroyNotify)pixman_image_unref, pixman_image_ref(ddl->ds->image));
|
||||||
|
|
||||||
|
ddl_discard_pending_messages(ddl);
|
||||||
|
|
||||||
|
qemu_dbus_display1_listener_call_scanout(
|
||||||
|
ddl->proxy, surface_width(ddl->ds), surface_height(ddl->ds),
|
||||||
|
surface_stride(ddl->ds), surface_format(ddl->ds), v_data,
|
||||||
|
G_DBUS_CALL_FLAGS_NONE, DBUS_DEFAULT_TIMEOUT, NULL, NULL,
|
||||||
|
g_object_ref(ddl));
|
||||||
|
}
|
||||||
|
|
||||||
static void dbus_gfx_update(DisplayChangeListener *dcl,
|
static void dbus_gfx_update(DisplayChangeListener *dcl,
|
||||||
int x, int y, int w, int h)
|
int x, int y, int w, int h)
|
||||||
{
|
{
|
||||||
DBusDisplayListener *ddl = container_of(dcl, DBusDisplayListener, dcl);
|
DBusDisplayListener *ddl = container_of(dcl, DBusDisplayListener, dcl);
|
||||||
GVariant *v_data;
|
|
||||||
|
|
||||||
assert(ddl->ds);
|
assert(ddl->ds);
|
||||||
|
|
||||||
@ -652,23 +684,7 @@ static void dbus_gfx_update(DisplayChangeListener *dcl,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (x == 0 && y == 0 && w == surface_width(ddl->ds) && h == surface_height(ddl->ds)) {
|
if (x == 0 && y == 0 && w == surface_width(ddl->ds) && h == surface_height(ddl->ds)) {
|
||||||
v_data = g_variant_new_from_data(
|
return ddl_scanout(ddl);
|
||||||
G_VARIANT_TYPE("ay"),
|
|
||||||
surface_data(ddl->ds),
|
|
||||||
surface_stride(ddl->ds) * surface_height(ddl->ds),
|
|
||||||
TRUE,
|
|
||||||
(GDestroyNotify)pixman_image_unref,
|
|
||||||
pixman_image_ref(ddl->ds->image));
|
|
||||||
qemu_dbus_display1_listener_call_scanout(
|
|
||||||
ddl->proxy,
|
|
||||||
surface_width(ddl->ds),
|
|
||||||
surface_height(ddl->ds),
|
|
||||||
surface_stride(ddl->ds),
|
|
||||||
surface_format(ddl->ds),
|
|
||||||
v_data,
|
|
||||||
G_DBUS_CALL_FLAGS_NONE,
|
|
||||||
DBUS_DEFAULT_TIMEOUT, NULL, NULL, NULL);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dbus_gfx_update_sub(ddl, x, y, w, h);
|
dbus_gfx_update_sub(ddl, x, y, w, h);
|
||||||
@ -964,6 +980,28 @@ dbus_display_listener_setup_shared_map(DBusDisplayListener *ddl)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GDBusMessage *
|
||||||
|
dbus_filter(GDBusConnection *connection,
|
||||||
|
GDBusMessage *message,
|
||||||
|
gboolean incoming,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
DBusDisplayListener *ddl = DBUS_DISPLAY_LISTENER(user_data);
|
||||||
|
guint32 serial;
|
||||||
|
|
||||||
|
if (incoming) {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
serial = g_dbus_message_get_serial(message);
|
||||||
|
if (serial <= ddl->out_serial_to_discard) {
|
||||||
|
trace_dbus_filter(serial, ddl->out_serial_to_discard);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
DBusDisplayListener *
|
DBusDisplayListener *
|
||||||
dbus_display_listener_new(const char *bus_name,
|
dbus_display_listener_new(const char *bus_name,
|
||||||
GDBusConnection *conn,
|
GDBusConnection *conn,
|
||||||
@ -988,6 +1026,7 @@ dbus_display_listener_new(const char *bus_name,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ddl->dbus_filter = g_dbus_connection_add_filter(conn, dbus_filter, g_object_ref(ddl), g_object_unref);
|
||||||
ddl->bus_name = g_strdup(bus_name);
|
ddl->bus_name = g_strdup(bus_name);
|
||||||
ddl->conn = conn;
|
ddl->conn = conn;
|
||||||
ddl->console = console;
|
ddl->console = console;
|
||||||
|
@ -161,6 +161,7 @@ dbus_clipboard_register(const char *bus_name) "peer %s"
|
|||||||
dbus_clipboard_unregister(const char *bus_name) "peer %s"
|
dbus_clipboard_unregister(const char *bus_name) "peer %s"
|
||||||
dbus_scanout_texture(uint32_t tex_id, bool backing_y_0_top, uint32_t backing_width, uint32_t backing_height, uint32_t x, uint32_t y, uint32_t w, uint32_t h) "tex_id:%u y0top:%d back:%ux%u %u+%u-%ux%u"
|
dbus_scanout_texture(uint32_t tex_id, bool backing_y_0_top, uint32_t backing_width, uint32_t backing_height, uint32_t x, uint32_t y, uint32_t w, uint32_t h) "tex_id:%u y0top:%d back:%ux%u %u+%u-%ux%u"
|
||||||
dbus_gl_gfx_switch(void *p) "surf: %p"
|
dbus_gl_gfx_switch(void *p) "surf: %p"
|
||||||
|
dbus_filter(unsigned int serial, unsigned int filter) "serial=%u (<= %u)"
|
||||||
|
|
||||||
# egl-helpers.c
|
# egl-helpers.c
|
||||||
egl_init_d3d11_device(void *p) "d3d device: %p"
|
egl_init_d3d11_device(void *p) "d3d device: %p"
|
||||||
|
59
ui/vnc.c
59
ui/vnc.c
@ -1931,7 +1931,8 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym)
|
|||||||
}
|
}
|
||||||
|
|
||||||
qkbd_state_key_event(vs->vd->kbd, qcode, down);
|
qkbd_state_key_event(vs->vd->kbd, qcode, down);
|
||||||
if (!qemu_console_is_graphic(NULL)) {
|
if (!qemu_console_is_graphic(vs->vd->dcl.con)) {
|
||||||
|
QemuTextConsole *con = QEMU_TEXT_CONSOLE(vs->vd->dcl.con);
|
||||||
bool numlock = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_NUMLOCK);
|
bool numlock = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_NUMLOCK);
|
||||||
bool control = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_CTRL);
|
bool control = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_CTRL);
|
||||||
/* QEMU console emulation */
|
/* QEMU console emulation */
|
||||||
@ -1945,88 +1946,88 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym)
|
|||||||
case 0xb8: /* Right ALT */
|
case 0xb8: /* Right ALT */
|
||||||
break;
|
break;
|
||||||
case 0xc8:
|
case 0xc8:
|
||||||
qemu_text_console_put_keysym(NULL, QEMU_KEY_UP);
|
qemu_text_console_put_keysym(con, QEMU_KEY_UP);
|
||||||
break;
|
break;
|
||||||
case 0xd0:
|
case 0xd0:
|
||||||
qemu_text_console_put_keysym(NULL, QEMU_KEY_DOWN);
|
qemu_text_console_put_keysym(con, QEMU_KEY_DOWN);
|
||||||
break;
|
break;
|
||||||
case 0xcb:
|
case 0xcb:
|
||||||
qemu_text_console_put_keysym(NULL, QEMU_KEY_LEFT);
|
qemu_text_console_put_keysym(con, QEMU_KEY_LEFT);
|
||||||
break;
|
break;
|
||||||
case 0xcd:
|
case 0xcd:
|
||||||
qemu_text_console_put_keysym(NULL, QEMU_KEY_RIGHT);
|
qemu_text_console_put_keysym(con, QEMU_KEY_RIGHT);
|
||||||
break;
|
break;
|
||||||
case 0xd3:
|
case 0xd3:
|
||||||
qemu_text_console_put_keysym(NULL, QEMU_KEY_DELETE);
|
qemu_text_console_put_keysym(con, QEMU_KEY_DELETE);
|
||||||
break;
|
break;
|
||||||
case 0xc7:
|
case 0xc7:
|
||||||
qemu_text_console_put_keysym(NULL, QEMU_KEY_HOME);
|
qemu_text_console_put_keysym(con, QEMU_KEY_HOME);
|
||||||
break;
|
break;
|
||||||
case 0xcf:
|
case 0xcf:
|
||||||
qemu_text_console_put_keysym(NULL, QEMU_KEY_END);
|
qemu_text_console_put_keysym(con, QEMU_KEY_END);
|
||||||
break;
|
break;
|
||||||
case 0xc9:
|
case 0xc9:
|
||||||
qemu_text_console_put_keysym(NULL, QEMU_KEY_PAGEUP);
|
qemu_text_console_put_keysym(con, QEMU_KEY_PAGEUP);
|
||||||
break;
|
break;
|
||||||
case 0xd1:
|
case 0xd1:
|
||||||
qemu_text_console_put_keysym(NULL, QEMU_KEY_PAGEDOWN);
|
qemu_text_console_put_keysym(con, QEMU_KEY_PAGEDOWN);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x47:
|
case 0x47:
|
||||||
qemu_text_console_put_keysym(NULL, numlock ? '7' : QEMU_KEY_HOME);
|
qemu_text_console_put_keysym(con, numlock ? '7' : QEMU_KEY_HOME);
|
||||||
break;
|
break;
|
||||||
case 0x48:
|
case 0x48:
|
||||||
qemu_text_console_put_keysym(NULL, numlock ? '8' : QEMU_KEY_UP);
|
qemu_text_console_put_keysym(con, numlock ? '8' : QEMU_KEY_UP);
|
||||||
break;
|
break;
|
||||||
case 0x49:
|
case 0x49:
|
||||||
qemu_text_console_put_keysym(NULL, numlock ? '9' : QEMU_KEY_PAGEUP);
|
qemu_text_console_put_keysym(con, numlock ? '9' : QEMU_KEY_PAGEUP);
|
||||||
break;
|
break;
|
||||||
case 0x4b:
|
case 0x4b:
|
||||||
qemu_text_console_put_keysym(NULL, numlock ? '4' : QEMU_KEY_LEFT);
|
qemu_text_console_put_keysym(con, numlock ? '4' : QEMU_KEY_LEFT);
|
||||||
break;
|
break;
|
||||||
case 0x4c:
|
case 0x4c:
|
||||||
qemu_text_console_put_keysym(NULL, '5');
|
qemu_text_console_put_keysym(con, '5');
|
||||||
break;
|
break;
|
||||||
case 0x4d:
|
case 0x4d:
|
||||||
qemu_text_console_put_keysym(NULL, numlock ? '6' : QEMU_KEY_RIGHT);
|
qemu_text_console_put_keysym(con, numlock ? '6' : QEMU_KEY_RIGHT);
|
||||||
break;
|
break;
|
||||||
case 0x4f:
|
case 0x4f:
|
||||||
qemu_text_console_put_keysym(NULL, numlock ? '1' : QEMU_KEY_END);
|
qemu_text_console_put_keysym(con, numlock ? '1' : QEMU_KEY_END);
|
||||||
break;
|
break;
|
||||||
case 0x50:
|
case 0x50:
|
||||||
qemu_text_console_put_keysym(NULL, numlock ? '2' : QEMU_KEY_DOWN);
|
qemu_text_console_put_keysym(con, numlock ? '2' : QEMU_KEY_DOWN);
|
||||||
break;
|
break;
|
||||||
case 0x51:
|
case 0x51:
|
||||||
qemu_text_console_put_keysym(NULL, numlock ? '3' : QEMU_KEY_PAGEDOWN);
|
qemu_text_console_put_keysym(con, numlock ? '3' : QEMU_KEY_PAGEDOWN);
|
||||||
break;
|
break;
|
||||||
case 0x52:
|
case 0x52:
|
||||||
qemu_text_console_put_keysym(NULL, '0');
|
qemu_text_console_put_keysym(con, '0');
|
||||||
break;
|
break;
|
||||||
case 0x53:
|
case 0x53:
|
||||||
qemu_text_console_put_keysym(NULL, numlock ? '.' : QEMU_KEY_DELETE);
|
qemu_text_console_put_keysym(con, numlock ? '.' : QEMU_KEY_DELETE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xb5:
|
case 0xb5:
|
||||||
qemu_text_console_put_keysym(NULL, '/');
|
qemu_text_console_put_keysym(con, '/');
|
||||||
break;
|
break;
|
||||||
case 0x37:
|
case 0x37:
|
||||||
qemu_text_console_put_keysym(NULL, '*');
|
qemu_text_console_put_keysym(con, '*');
|
||||||
break;
|
break;
|
||||||
case 0x4a:
|
case 0x4a:
|
||||||
qemu_text_console_put_keysym(NULL, '-');
|
qemu_text_console_put_keysym(con, '-');
|
||||||
break;
|
break;
|
||||||
case 0x4e:
|
case 0x4e:
|
||||||
qemu_text_console_put_keysym(NULL, '+');
|
qemu_text_console_put_keysym(con, '+');
|
||||||
break;
|
break;
|
||||||
case 0x9c:
|
case 0x9c:
|
||||||
qemu_text_console_put_keysym(NULL, '\n');
|
qemu_text_console_put_keysym(con, '\n');
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (control) {
|
if (control) {
|
||||||
qemu_text_console_put_keysym(NULL, sym & 0x1f);
|
qemu_text_console_put_keysym(con, sym & 0x1f);
|
||||||
} else {
|
} else {
|
||||||
qemu_text_console_put_keysym(NULL, sym);
|
qemu_text_console_put_keysym(con, sym);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2044,7 +2045,7 @@ static void key_event(VncState *vs, int down, uint32_t sym)
|
|||||||
int keycode;
|
int keycode;
|
||||||
int lsym = sym;
|
int lsym = sym;
|
||||||
|
|
||||||
if (lsym >= 'A' && lsym <= 'Z' && qemu_console_is_graphic(NULL)) {
|
if (lsym >= 'A' && lsym <= 'Z' && qemu_console_is_graphic(vs->vd->dcl.con)) {
|
||||||
lsym = lsym - 'A' + 'a';
|
lsym = lsym - 'A' + 'a';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user