|
@@ -630,11 +630,26 @@ static void dbus_gfx_update_sub(DBusDisplayListener *ddl,
|
|
|
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));
|
|
|
+
|
|
|
+ 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,
|
|
|
int x, int y, int w, int h)
|
|
|
{
|
|
|
DBusDisplayListener *ddl = container_of(dcl, DBusDisplayListener, dcl);
|
|
|
- GVariant *v_data;
|
|
|
|
|
|
assert(ddl->ds);
|
|
|
|
|
@@ -652,23 +667,7 @@ static void dbus_gfx_update(DisplayChangeListener *dcl,
|
|
|
#endif
|
|
|
|
|
|
if (x == 0 && y == 0 && w == surface_width(ddl->ds) && h == surface_height(ddl->ds)) {
|
|
|
- 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));
|
|
|
- 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;
|
|
|
+ return ddl_scanout(ddl);
|
|
|
}
|
|
|
|
|
|
dbus_gfx_update_sub(ddl, x, y, w, h);
|