diff options
author | Alexander Larsson <alexl@redhat.com> | 2017-11-29 20:05:02 +0100 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2017-11-30 21:57:42 +0100 |
commit | 46c4869945009d1e8882b64a5d89dfc336a55af9 (patch) | |
tree | c4f1e54a706cb21bad7c678750a3331748c52aab /gdk | |
parent | e43f0317699669f4e02f651f6c3c90d6fa6f5808 (diff) | |
download | gtk+-46c4869945009d1e8882b64a5d89dfc336a55af9.tar.gz |
broadway: Prepare for implementing diff
Diffstat (limited to 'gdk')
-rw-r--r-- | gdk/broadway/broadway-output.c | 38 | ||||
-rw-r--r-- | gdk/broadway/broadway-output.h | 3 | ||||
-rw-r--r-- | gdk/broadway/broadway-server.c | 10 |
3 files changed, 30 insertions, 21 deletions
diff --git a/gdk/broadway/broadway-output.c b/gdk/broadway/broadway-output.c index e679923f37..9389de44ce 100644 --- a/gdk/broadway/broadway-output.c +++ b/gdk/broadway/broadway-output.c @@ -155,6 +155,19 @@ append_uint32 (BroadwayOutput *output, guint32 v) } 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) { append_char (output, 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 diff --git a/gdk/broadway/broadway-output.h b/gdk/broadway/broadway-output.h index db1ba944d8..4f18b6e882 100644 --- a/gdk/broadway/broadway-output.h +++ b/gdk/broadway/broadway-output.h @@ -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); diff --git a/gdk/broadway/broadway-server.c b/gdk/broadway/broadway-server.c index a6b311415c..3cbd214d34 100644 --- a/gdk/broadway/broadway-server.c +++ b/gdk/broadway/broadway-server.c @@ -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); |