broadway: Prepare for implementing diff

This commit is contained in:
Alexander Larsson
2017-11-29 20:05:02 +01:00
parent e43f031769
commit 46c4869945
3 changed files with 30 additions and 21 deletions

View File

@@ -154,6 +154,19 @@ append_uint32 (BroadwayOutput *output, guint32 v)
buf[3] = (v >> 24) & 0xff;
}
static void
patch_uint32 (BroadwayOutput *output, guint32 v, gsize offset)
{
guint8 *buf;
buf = (guint8 *)output->buf->str + offset;
buf[0] = (v >> 0) & 0xff;
buf[1] = (v >> 8) & 0xff;
buf[2] = (v >> 16) & 0xff;
buf[3] = (v >> 24) & 0xff;
}
static void
write_header(BroadwayOutput *output, char op)
{
@@ -309,29 +322,24 @@ append_node (BroadwayOutput *output,
append_node (output, node->children[i]);
}
guint32
get_node_size (BroadwayNode *node)
{
guint32 size = 1 + node->n_data;
guint32 i;
for (i = 0; i < node->n_children; i++)
size += get_node_size (node->children[i]);
return size;
}
void
broadway_output_window_set_nodes (BroadwayOutput *output,
int id,
BroadwayNode *root)
BroadwayNode *root,
BroadwayNode *old_root)
{
gsize size_pos, start, end;
write_header (output, BROADWAY_OP_SET_NODES);
append_uint16 (output, id);
append_uint32 (output, get_node_size (root));
size_pos = output->buf->len;
append_uint32 (output, 0);
start = output->buf->len;
append_node (output, root);
end = output->buf->len;
patch_uint32 (output, (end - start) / 4, size_pos);
}
void

View File

@@ -59,7 +59,8 @@ void broadway_output_set_transient_for (BroadwayOutput *output,
int parent_id);
void broadway_output_window_set_nodes (BroadwayOutput *output,
int id,
BroadwayNode *root);
BroadwayNode *root,
BroadwayNode *old_root);
void broadway_output_upload_texture (BroadwayOutput *output,
guint32 id,
GBytes *texture);

View File

@@ -1635,13 +1635,13 @@ broadway_server_window_set_nodes (BroadwayServer *server,
if (window == NULL)
return;
if (server->output != NULL)
broadway_output_window_set_nodes (server->output, window->id,
root, window->nodes);
if (window->nodes)
broadway_node_free (window->nodes);
window->nodes = root;
if (server->output != NULL)
broadway_output_window_set_nodes (server->output, window->id,
window->nodes);
}
guint32
@@ -1888,7 +1888,7 @@ broadway_server_resync_windows (BroadwayServer *server)
if (window->nodes)
broadway_output_window_set_nodes (server->output, window->id,
window->nodes);
window->nodes, NULL);
if (window->visible)
broadway_output_show_surface (server->output, window->id);