annotate xwd-application.c @ 20:683ebd334b21

Try to decode octal and "Meta-ASCII" escapes
author Guido Berhoerster <guido+xwrited@berhoerster.name>
date Sat, 30 Jun 2018 22:07:46 +0200
parents f0accfc74f7b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
1 /*
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
2 * Copyright (C) 2018 Guido Berhoerster <guido+xwrited@berhoerster.name>
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
3 *
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
4 * Permission is hereby granted, free of charge, to any person obtaining
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
5 * a copy of this software and associated documentation files (the
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
6 * "Software"), to deal in the Software without restriction, including
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
7 * without limitation the rights to use, copy, modify, merge, publish,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
8 * distribute, sublicense, and/or sell copies of the Software, and to
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
9 * permit persons to whom the Software is furnished to do so, subject to
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
10 * the following conditions:
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
11 *
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
12 * The above copyright notice and this permission notice shall be included
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
13 * in all copies or substantial portions of the Software.
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
14 *
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
18 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
19 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
20 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
21 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
22 */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
23
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
24 #include <errno.h>
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
25 #include <fcntl.h>
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
26 #include <glib-unix.h>
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
27 #include <glib/gi18n.h>
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
28 #include <stdio.h>
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
29 #include <stdlib.h>
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
30 #include <string.h>
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
31
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
32 #include "xwd-application.h"
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
33 #include "xwd-utmp.h"
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
34
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
35 #define BUFFER_TIMEOUT 500 /* ms */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
36
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
37 struct _XwdApplication {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
38 GApplication parent_instance;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
39 gint masterfd;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
40 gint slavefd;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
41 GIOChannel *master_pty_chan;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
42 guint buffer_timeout_id;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
43 GString *message_buf;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
44 };
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
45
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
46 G_DEFINE_TYPE(XwdApplication, xwd_application, G_TYPE_APPLICATION)
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
47
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
48 static void xwd_application_quit(GSimpleAction *, GVariant *, gpointer);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
49
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
50 static const GOptionEntry cmd_options[] = {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
51 { "debug", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, NULL,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
52 N_("Enable debugging messages"), NULL },
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
53 { "quit", 'q', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, NULL,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
54 N_("Quit running instance of xwrited"), NULL },
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
55 { "version", 'V', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, NULL,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
56 N_("Print the version number and quit"), NULL },
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
57 { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, NULL, NULL, NULL },
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
58 { NULL }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
59 };
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
60
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
61 static const GActionEntry xwd_application_actions[] = {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
62 { "quit", xwd_application_quit }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
63 };
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
64
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
65 static void
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
66 xwd_application_quit(GSimpleAction *simple, GVariant *parameter,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
67 gpointer user_data)
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
68 {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
69 XwdApplication *self = user_data;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
70
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
71 g_application_quit(G_APPLICATION(self));
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
72 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
73
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
74 static gboolean
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
75 on_signal(gpointer user_data)
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
76 {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
77 XwdApplication *self = user_data;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
78
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
79 g_debug("received signal, exiting");
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
80 g_action_group_activate_action(G_ACTION_GROUP(G_APPLICATION(self)),
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
81 "quit", NULL);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
82
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
83 return (TRUE);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
84 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
85
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
86 static GString *
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
87 string_copy(GString *dest, GString *src)
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
88 {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
89 g_string_truncate(dest, 0);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
90 g_string_append(dest, src->str);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
91
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
92 return (dest);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
93 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
94
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
95 static void
20
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
96 string_decode_octal(GString *string)
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
97 {
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
98 GString *result;
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
99 gsize remaining = string->len;
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
100 gchar *p = string->str;
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
101 gchar oct[4] = { '\0' };
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
102 guint64 num;
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
103 char *end;
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
104
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
105 result = g_string_sized_new(string->len);
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
106
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
107 while (remaining > 0) {
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
108 if ((remaining >= 4) && (*p == '\\')) {
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
109 /* put octal number in NUL-terminated buffer */
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
110 memcpy(oct, p + 1, 3);
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
111 /* convert valid octal number to byte */
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
112 num = g_ascii_strtoull(oct, &end, 8);
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
113 if ((*end == '\0') && (num <= 0xff)) {
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
114 /* conversion succeeded */
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
115 p += 4;
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
116 remaining -= 4;
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
117 g_string_append_c(result, num);
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
118 continue;
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
119 }
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
120 }
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
121
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
122 g_string_append_c(result, *p++);
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
123 remaining--;
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
124 }
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
125
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
126 string_copy(string, result);
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
127 g_string_free(result, TRUE);
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
128 }
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
129
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
130 static void
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
131 string_decode_meta_ascii(GString *string)
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
132 {
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
133 GString *result;
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
134 gchar *p = string->str;
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
135 gsize remaining = string->len;
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
136
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
137 result = g_string_sized_new(string->len);
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
138
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
139 while (remaining > 0) {
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
140 if ((remaining >= 3) && (*p == 'M') && (*(p + 1) == '-') &&
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
141 ((*(p + 2) & (1 << 7)) == 0)) {
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
142 /* restore 8th bit */
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
143 g_string_append_c(result, *(p + 2) | (1 << 7));
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
144 remaining -= 3;
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
145 p += 3;
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
146 continue;
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
147 }
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
148
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
149 g_string_append_c(result, *p++);
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
150 remaining--;
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
151 }
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
152
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
153 string_copy(string, result);
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
154 g_string_free(result, TRUE);
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
155 }
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
156
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
157 static void
19
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
158 string_to_valid_utf8(GString *string)
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
159 {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
160 GString *result;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
161 gchar *start = string->str;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
162 gchar *end;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
163 gsize remaining = string->len;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
164
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
165 result = g_string_sized_new(string->len);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
166
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
167 while (remaining > 0) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
168 if (g_utf8_validate(start, remaining, (const gchar **)&end)) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
169 /* remaining part is valid */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
170 g_string_append_len(result, start, remaining);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
171 break;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
172 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
173
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
174 /* append valid part */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
175 g_string_append_len(result, start, end - start);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
176 /*
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
177 * replace first invalid byte with Unicode "REPLACEMENT
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
178 * CHARACTER" (U+FFFD)
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
179 */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
180 g_string_append(result, "\357\277\275");
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
181 remaining -= (end - start) + 1;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
182 start = end + 1;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
183 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
184
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
185 string_copy(string, result);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
186 g_string_free(result, TRUE);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
187 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
188
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
189 static void
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
190 string_trim_lines(GString *string)
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
191 {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
192 GString *result;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
193 gchar *p = string->str;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
194 gchar *q;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
195 gsize line_len;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
196 gsize remaining = string->len;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
197
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
198 result = g_string_sized_new(string->len);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
199
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
200 while (remaining > 0) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
201 q = memchr(p, '\n', remaining);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
202 if (q == NULL) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
203 g_string_append_len(result, p, remaining);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
204 break;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
205 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
206 line_len = q - p - 1;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
207 /* convert \r\n to \n */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
208 if ((line_len > 0) && (p[line_len - 1] == '\r')) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
209 line_len--;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
210 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
211 /* trim spaces on the right */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
212 while ((line_len > 0) && (p[line_len - 1] == ' ')) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
213 line_len--;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
214 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
215 g_string_append_len(result, p, line_len);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
216 g_string_append_c(result, '\n');
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
217 remaining -= q + 1 - p;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
218 p = q + 1;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
219 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
220
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
221 string_copy(string, result);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
222 g_string_free(result, TRUE);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
223 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
224
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
225 static void
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
226 string_filter_nonprintable(GString *string)
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
227 {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
228 GString *result;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
229 const gchar *p;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
230 gunichar c;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
231
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
232 result = g_string_sized_new(string->len);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
233
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
234 for (p = string->str; *p != '\0'; p = g_utf8_next_char(p)) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
235 c = g_utf8_get_char(p);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
236 if (g_unichar_isprint(c) || g_unichar_isspace(c)) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
237 g_string_append_unichar(result, c);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
238 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
239 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
240
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
241 string_copy(string, result);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
242 g_string_free(result, TRUE);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
243 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
244
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
245 static gchar *
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
246 hexdumpa(const void *mem, gsize n)
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
247 {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
248 const guchar *bytes = mem;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
249 GString *string;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
250 gsize i;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
251 gsize j;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
252
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
253 string = g_string_sized_new((n / 16 + (n % 16 > 0)) * 76);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
254
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
255 for (i = 0; i < n; i += 16) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
256 g_string_append_printf(string, "%08zx ", i);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
257
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
258 for (j = 0; (i + j < n) && (j < 16); j++) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
259 g_string_append_printf(string, " %02x", bytes[i + j]);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
260 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
261 for (; j < 16; j++) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
262 g_string_append(string, " ");
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
263 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
264
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
265 g_string_append(string, " ");
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
266 for (j = 0; (i + j < n) && (j < 16); j++) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
267 g_string_append_printf(string, "%c",
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
268 g_ascii_isprint(bytes[i + j]) ? bytes[i + j] : '.');
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
269 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
270
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
271 g_string_append_c(string, '\n');
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
272 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
273
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
274 return (g_string_free(string, FALSE));
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
275 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
276
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
277 static void
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
278 display_message(XwdApplication *self)
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
279 {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
280 gboolean enable_debug_logging;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
281 gchar *message_dump;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
282 GString *message;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
283 GIcon *icon;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
284 GNotification *notification;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
285
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
286 if (self->message_buf->len == 0) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
287 return;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
288 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
289
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
290 enable_debug_logging = (g_getenv("G_MESSAGES_DEBUG") != NULL);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
291 if (enable_debug_logging) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
292 message_dump = hexdumpa(self->message_buf->str,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
293 self->message_buf->len);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
294 g_debug("raw message:\n%s", message_dump);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
295 g_free(message_dump);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
296 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
297
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
298 /*
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
299 * There is no reliable way to determine the character encoding of the
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
300 * received message which, depending on the locale of the sender, may
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
301 * even differ for different messages. A user could even send binary
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
302 * data. It is thus assumed that messages are in UTF-8 encoding which
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
303 * should be the most common case on modern systems. Any invalid
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
304 * sequences are replaced with the Unicode "REPLACEMENT CHARACTER"
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
305 * (U+FFFD) and non-printable characters are removed. Additionally,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
306 * padding typically added by wall(1) implementations is removed in
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
307 * order to improve readability.
20
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
308 * Some write(1) and wall(1) implementations encode non-ASCII
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
309 * characters, in particular UTF-8 sequences, by prefixing them with
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
310 * "M-" and clearing the 8th bit while others (e.g. util-linux) use
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
311 * octal escape sequences. These encodings are reversed before messages
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
312 * are processed further. However some implementations such as NetBSD
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
313 * write(1) uncoditionally process each byte with toascii(3) which
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
314 * makes it impossible to restore the original value.
19
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
315 */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
316 message = g_string_new_len(self->message_buf->str,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
317 self->message_buf->len);
20
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
318 string_decode_octal(message);
683ebd334b21 Try to decode octal and "Meta-ASCII" escapes
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents: 19
diff changeset
319 string_decode_meta_ascii(message);
19
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
320 string_to_valid_utf8(message);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
321 string_filter_nonprintable(message);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
322 string_trim_lines(message);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
323
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
324 if (enable_debug_logging) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
325 message_dump = hexdumpa(message->str, message->len);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
326 g_debug("message:\n%s", message_dump);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
327 g_free(message_dump);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
328 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
329
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
330 icon = g_themed_icon_new("utilities-terminal");
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
331
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
332 notification = g_notification_new(_("Message received"));
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
333 g_notification_set_icon(notification, icon);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
334 g_notification_set_body(notification, message->str);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
335 g_application_send_notification(G_APPLICATION(self), NULL,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
336 notification);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
337
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
338 g_object_unref(notification);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
339 g_object_unref(icon);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
340 g_string_free(message, TRUE);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
341 g_string_truncate(self->message_buf, 0);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
342 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
343
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
344 static gboolean
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
345 on_buffer_timeout(gpointer user_data)
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
346 {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
347 XwdApplication *self = user_data;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
348
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
349 display_message(self);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
350
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
351 self->buffer_timeout_id = 0;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
352
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
353 return (FALSE);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
354 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
355
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
356 static gboolean
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
357 on_master_pty_readable(GIOChannel *source, GIOCondition cond,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
358 gpointer user_data)
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
359 {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
360 XwdApplication *self = user_data;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
361 GIOStatus status;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
362 gchar buf[BUFSIZ];
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
363 gsize buf_len = 0;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
364 GError *error = NULL;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
365
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
366 if (cond & G_IO_IN) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
367 /* read message data from master pty */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
368 memset(buf, 0, sizeof (buf));
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
369 while ((status = g_io_channel_read_chars(source, (gchar *)&buf,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
370 sizeof (buf), &buf_len, &error)) == G_IO_STATUS_NORMAL) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
371 if (buf_len > 0) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
372 g_debug("read %" G_GSSIZE_FORMAT " bytes from "
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
373 "master pty", buf_len);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
374 g_string_append_len(self->message_buf, buf,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
375 buf_len);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
376 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
377 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
378 if (error != NULL) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
379 g_critical("failed to read from master pty: %s",
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
380 error->message);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
381 g_error_free(error);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
382 return (FALSE);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
383 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
384
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
385 /*
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
386 * a message might be read in several parts and it is not
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
387 * possible to reliably detect the beginning or end of a
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
388 * message, so buffer read data until a short timeout is
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
389 * reached as this works well for a single message which should
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
390 * be the most common case
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
391 */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
392 if (self->buffer_timeout_id == 0) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
393 self->buffer_timeout_id = g_timeout_add(BUFFER_TIMEOUT,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
394 on_buffer_timeout, self);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
395 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
396 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
397
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
398 if (cond & (G_IO_HUP | G_IO_ERR)) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
399 g_critical("connection to master pty broken");
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
400 return (FALSE);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
401 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
402
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
403 return (TRUE);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
404 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
405
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
406 static void
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
407 xwd_application_startup(GApplication *application)
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
408 {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
409 XwdApplication *self = XWD_APPLICATION(application);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
410 gchar *slave_name;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
411 GIOFlags flags;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
412 GError *error = NULL;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
413
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
414 G_APPLICATION_CLASS(xwd_application_parent_class)->startup(application);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
415
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
416 /* create actions */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
417 g_action_map_add_action_entries(G_ACTION_MAP(self),
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
418 xwd_application_actions, G_N_ELEMENTS(xwd_application_actions),
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
419 self);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
420
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
421 /* create signal watchers */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
422 g_unix_signal_add(SIGINT, on_signal, self);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
423 g_unix_signal_add(SIGTERM, on_signal, self);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
424 g_unix_signal_add(SIGHUP, on_signal, self);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
425
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
426 /* open master pty */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
427 self->masterfd = posix_openpt(O_RDWR | O_NOCTTY);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
428 if (self->masterfd == -1) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
429 g_critical("failed to open master pty: %s", g_strerror(errno));
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
430 return;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
431 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
432
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
433 /* create slave pty */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
434 if ((grantpt(self->masterfd) == -1) ||
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
435 (unlockpt(self->masterfd) == -1)) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
436 g_critical("failed to create slave pty: %s", g_strerror(errno));
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
437 return;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
438 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
439 slave_name = ptsname(self->masterfd);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
440 if (slave_name == NULL) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
441 g_critical("failed to obtain name of slave pty");
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
442 return;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
443 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
444
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
445 /*
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
446 * keep an open fd around order to prevent closing the master fd when
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
447 * receiving an EOF
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
448 */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
449 self->slavefd = open(slave_name, O_RDWR);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
450 if (self->slavefd == -1) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
451 g_critical("failed to open slave pty: %s", g_strerror(errno));
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
452 return;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
453 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
454
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
455 /* create a GIOChannel for monitoring the master pty for messages */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
456 self->master_pty_chan = g_io_channel_unix_new(self->masterfd);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
457 /* make it non-blocking */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
458 flags = g_io_channel_get_flags(self->master_pty_chan);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
459 if (g_io_channel_set_flags(self->master_pty_chan,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
460 flags | G_IO_FLAG_NONBLOCK, &error) != G_IO_STATUS_NORMAL) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
461 g_critical("failed set flags on the master pty channel: %s",
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
462 error->message);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
463 g_error_free(error);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
464 return;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
465 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
466 /* make the channel safe for encodings other than UTF-8 */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
467 if (g_io_channel_set_encoding(self->master_pty_chan, NULL, &error) !=
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
468 G_IO_STATUS_NORMAL) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
469 g_critical("failed set encoding on the master pty channel: %s",
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
470 error->message);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
471 g_error_free(error);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
472 return;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
473 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
474 if (!g_io_add_watch(self->master_pty_chan,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
475 G_IO_IN | G_IO_HUP | G_IO_ERR, on_master_pty_readable, self)) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
476 g_critical("failed to add watch on master pty channel");
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
477 return;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
478 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
479
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
480 xwd_utmp_add_entry(self->masterfd);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
481
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
482 /* keep GApplication running */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
483 g_application_hold(application);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
484 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
485
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
486 static void
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
487 xwd_application_shutdown(GApplication *application)
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
488 {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
489 XwdApplication *self = XWD_APPLICATION(application);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
490 GApplicationClass *application_class =
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
491 G_APPLICATION_CLASS(xwd_application_parent_class);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
492
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
493 /* display any buffered data before exiting */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
494 display_message(self);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
495
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
496 if (self->master_pty_chan != NULL) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
497 g_io_channel_shutdown(self->master_pty_chan, FALSE, NULL);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
498 g_clear_pointer(&self->master_pty_chan,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
499 (GDestroyNotify)g_io_channel_unref);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
500 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
501
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
502 if (self->slavefd != -1) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
503 close(self->slavefd);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
504 self->slavefd = -1;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
505 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
506
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
507 if (self->masterfd != -1) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
508 close(self->masterfd);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
509 self->masterfd = -1;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
510 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
511
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
512 xwd_utmp_remove_entry(self->masterfd);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
513
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
514 /* remove signal watches and buffer timeout */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
515 while (g_source_remove_by_user_data(self)) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
516 continue;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
517 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
518 self->buffer_timeout_id = 0;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
519
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
520 application_class->shutdown(application);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
521 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
522
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
523 static gint
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
524 xwd_application_handle_local_options(GApplication *application,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
525 GVariantDict *options)
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
526 {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
527 gchar **args = NULL;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
528 gchar *messages_debug;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
529 GError *error = NULL;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
530
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
531 /* filename arguments are not allowed */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
532 if (g_variant_dict_lookup(options, G_OPTION_REMAINING, "^a&ay",
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
533 &args)) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
534 g_printerr("invalid argument: \"%s\"\n", args[0]);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
535 g_free(args);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
536 return (1);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
537 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
538
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
539 if (g_variant_dict_contains(options, "version")) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
540 g_print("%s %s\n", PACKAGE, VERSION);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
541
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
542 /* quit */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
543 return (0);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
544 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
545
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
546 if (g_variant_dict_contains(options, "debug")) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
547 /* enable debug logging */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
548 messages_debug = g_strjoin(":", G_LOG_DOMAIN,
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
549 g_getenv("G_MESSAGES_DEBUG"), NULL);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
550 g_setenv("G_MESSAGES_DEBUG", messages_debug, TRUE);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
551 g_free(messages_debug);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
552 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
553
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
554 /*
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
555 * register with the session bus so that it is possible to discern
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
556 * between remote and primary instance and that remote actions can be
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
557 * invoked, this causes the startup signal to be emitted which, in case
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
558 * of the primary instance, starts to instantiate the
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
559 * backend with the given values
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
560 */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
561 if (!g_application_register(application, NULL, &error)) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
562 g_critical("g_application_register: %s", error->message);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
563 g_error_free(error);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
564 return (1);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
565 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
566
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
567 if (g_variant_dict_contains(options, "quit")) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
568 /* only valid if a remote instance is running */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
569 if (!g_application_get_is_remote(application)) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
570 g_printerr("%s is not running\n", g_get_prgname());
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
571 return (1);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
572 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
573
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
574 /* signal remote instance to quit */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
575 g_action_group_activate_action(G_ACTION_GROUP(application),
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
576 "quit", NULL);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
577
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
578 /* quit local instance */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
579 return (0);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
580 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
581
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
582 /* proceed with default command line processing */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
583 return (-1);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
584 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
585
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
586 static void
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
587 xwd_application_activate(GApplication *application) {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
588 GApplicationClass *application_class =
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
589 G_APPLICATION_CLASS(xwd_application_parent_class);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
590
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
591 /* do nothing, implementation required by GApplication */
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
592
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
593 application_class->activate(application);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
594 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
595
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
596 static void
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
597 xwd_application_finalize(GObject *object)
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
598 {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
599 XwdApplication *self = XWD_APPLICATION(object);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
600
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
601 g_string_free(self->message_buf, TRUE);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
602
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
603 G_OBJECT_CLASS(xwd_application_parent_class)->finalize(object);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
604 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
605
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
606 static void
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
607 xwd_application_class_init(XwdApplicationClass *klass)
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
608 {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
609 GObjectClass *object_class = G_OBJECT_CLASS(klass);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
610 GApplicationClass *application_class = G_APPLICATION_CLASS(klass);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
611
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
612 object_class->finalize = xwd_application_finalize;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
613
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
614 application_class->startup = xwd_application_startup;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
615 application_class->shutdown = xwd_application_shutdown;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
616 application_class->handle_local_options =
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
617 xwd_application_handle_local_options;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
618 application_class->activate = xwd_application_activate;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
619 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
620
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
621 static void
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
622 xwd_application_init(XwdApplication *self)
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
623 {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
624 g_application_add_main_option_entries(G_APPLICATION(self),
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
625 cmd_options);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
626
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
627 self->masterfd = -1;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
628 self->slavefd = -1;
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
629
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
630 self->message_buf = g_string_sized_new(BUFSIZ);
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
631 }
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
632
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
633 XwdApplication *
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
634 xwd_application_new(void)
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
635 {
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
636 return (g_object_new(XWD_TYPE_APPLICATION, "application-id",
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
637 APPLICATION_ID, NULL));
f0accfc74f7b Port to GLib version 2.48 or later
Guido Berhoerster <guido+xwrited@berhoerster.name>
parents:
diff changeset
638 }