summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2012-10-01 12:09:07 +0200
committerAlexander Larsson <alexl@redhat.com>2012-10-01 14:58:56 +0200
commit95d9b17f354a38777aa18d9444b44de55f191596 (patch)
tree44ef870302d6824fd652cda2cd84d140426e40c8
parent203dd8bf7ad250f69006a5a46f140debaee6c7a3 (diff)
downloadgtk+-95d9b17f354a38777aa18d9444b44de55f191596.tar.gz
broadway: Restructure output
Now we queue all output commands in a single buffer, to ensure we send everything in a single op even for v7plus.
-rw-r--r--gdk/broadway/broadway.c52
1 files changed, 27 insertions, 25 deletions
diff --git a/gdk/broadway/broadway.c b/gdk/broadway/broadway.c
index b1047588f7..b17d90bf46 100644
--- a/gdk/broadway/broadway.c
+++ b/gdk/broadway/broadway.c
@@ -173,6 +173,7 @@ to_png_a (int w, int h, int byte_stride, guint8 *data)
struct BroadwayOutput {
GOutputStream *out;
+ GString *buf;
int error;
guint32 serial;
gboolean proto_v7_plus;
@@ -212,13 +213,20 @@ broadway_output_send_cmd (BroadwayOutput *output,
}
static void
+broadway_output_send_cmd_pre_v7 (BroadwayOutput *output,
+ const void *buf, gsize count)
+{
+ g_output_stream_write_all (output->out, "\0", 1, NULL, NULL, NULL);
+ g_output_stream_write_all (output->out, buf, count, NULL, NULL, NULL);
+ g_output_stream_write_all (output->out, "\xff", 1, NULL, NULL, NULL);
+}
+
+
+static void
broadway_output_sendmsg (BroadwayOutput *output,
const void *buf, gsize count)
{
- if (!output->proto_v7_plus)
- g_output_stream_write_all (output->out, buf, count, NULL, NULL, NULL);
- else
- broadway_output_send_cmd (output, TRUE, BROADWAY_WS_TEXT, buf, count);
+ g_string_append_len (output->buf, buf, count);
}
void broadway_output_pong (BroadwayOutput *output)
@@ -227,43 +235,37 @@ void broadway_output_pong (BroadwayOutput *output)
broadway_output_send_cmd (output, TRUE, BROADWAY_WS_CNX_PONG, NULL, 0);
}
-static void
-broadway_output_sendmsg_initiate (BroadwayOutput *output)
-{
- if (!output->proto_v7_plus)
- g_output_stream_write (output->out, "\0", 1, NULL, NULL);
- else
- {
- }
-}
-
int
broadway_output_flush (BroadwayOutput *output)
{
+ if (output->buf->len == 0)
+ return TRUE;
+
if (!output->proto_v7_plus)
- {
- broadway_output_sendmsg (output, "\xff", 1);
- broadway_output_sendmsg (output, "\0", 1);
- return !output->error;
- }
- else /* no need to flush */
- return !output->error;
+ broadway_output_send_cmd_pre_v7 (output, output->buf->str, output->buf->len);
+ else
+ broadway_output_send_cmd (output, TRUE, BROADWAY_WS_TEXT,
+ output->buf->str, output->buf->len);
+
+ g_string_set_size (output->buf, 0);
+
+ return !output->error;
+
}
BroadwayOutput *
-broadway_output_new(GOutputStream *out, guint32 serial,
- gboolean proto_v7_plus)
+broadway_output_new (GOutputStream *out, guint32 serial,
+ gboolean proto_v7_plus)
{
BroadwayOutput *output;
output = g_new0 (BroadwayOutput, 1);
output->out = g_object_ref (out);
+ output->buf = g_string_new ("");
output->serial = serial;
output->proto_v7_plus = proto_v7_plus;
- broadway_output_sendmsg_initiate (output);
-
return output;
}