10 static GMainLoop *loop;
11 static int exit_status = EXIT_SUCCESS;
12 static int from_dm_fd = -1, to_dm_fd = -1;
14 static GKeyFile *config;
20 g_main_loop_quit (loop);
24 sigint_cb (gpointer user_data)
26 status_notify ("UNITY-SYSTEM-COMPOSITOR TERMINATE SIGNAL=%d", SIGINT);
32 sigterm_cb (gpointer user_data)
34 status_notify ("UNITY-SYSTEM-COMPOSITOR TERMINATE SIGNAL=%d", SIGTERM);
43 USC_MESSAGE_READY = 2,
44 USC_MESSAGE_SESSION_CONNECTED = 3,
45 USC_MESSAGE_SET_ACTIVE_SESSION = 4,
46 USC_MESSAGE_SET_NEXT_SESSION = 5,
50 write_message (guint16 id, const guint8 *payload, guint16 payload_length)
53 gsize data_length = 4 + payload_length;
55 data = g_malloc (data_length);
58 data[2] = payload_length >> 8;
59 data[3] = payload_length & 0xFF;
60 memcpy (data + 4, payload, payload_length);
62 if (write (to_dm_fd, data, data_length) < 0)
63 fprintf (stderr, "Failed to write to daemon: %s\n", strerror (errno));
67 read_message_cb (GIOChannel *channel, GIOCondition condition, gpointer data)
69 gchar header[4], *payload;
72 guint16 payload_length;
75 if (g_io_channel_read_chars (channel, header, 4, &n_read, &error) != G_IO_STATUS_NORMAL)
77 g_printerr ("Failed to read header: %s\n", error->message);
82 g_printerr ("Short read for header, %zi instead of expected 4\n", n_read);
85 id = header[0] << 8 | header[1];
86 payload_length = header[2] << 8 | header[3];
87 payload = g_malloc0 (payload_length + 1);
88 if (g_io_channel_read_chars (channel, payload, payload_length, &n_read, &error) != G_IO_STATUS_NORMAL)
90 g_printerr ("Failed to read payload: %s\n", error->message);
93 if (n_read != payload_length)
95 g_printerr ("Short read for payload, %zi instead of expected %d\n", n_read, payload_length);
101 case USC_MESSAGE_PING:
102 status_notify ("UNITY-SYSTEM-COMPOSITOR PING");
104 case USC_MESSAGE_SET_ACTIVE_SESSION:
105 status_notify ("UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=%s", (gchar *)payload);
107 case USC_MESSAGE_SET_NEXT_SESSION:
108 status_notify ("UNITY-SYSTEM-COMPOSITOR SET-NEXT-SESSION ID=%s", (gchar *)payload);
111 g_printerr ("Ignoring message %d with %d octets\n", id, payload_length);
121 request_cb (const gchar *request)
125 g_main_loop_quit (loop);
129 if (strcmp (request, "UNITY-SYSTEM-COMPOSITOR PING") == 0)
130 write_message (USC_MESSAGE_PING, NULL, 0);
131 else if (strcmp (request, "UNITY-SYSTEM-COMPOSITOR PONG") == 0)
132 write_message (USC_MESSAGE_PONG, NULL, 0);
133 else if (strcmp (request, "UNITY-SYSTEM-COMPOSITOR READY") == 0)
134 write_message (USC_MESSAGE_READY, NULL, 0);
138 main (int argc, char **argv)
141 GString *status_text;
142 gboolean test = FALSE;
145 #if !defined(GLIB_VERSION_2_36)
149 loop = g_main_loop_new (NULL, FALSE);
151 g_unix_signal_add (SIGINT, sigint_cb, NULL);
152 g_unix_signal_add (SIGTERM, sigterm_cb, NULL);
154 status_connect (request_cb);
156 for (i = 1; i < argc; i++)
160 if (strcmp (arg, "--from-dm-fd") == 0)
162 from_dm_fd = atoi (argv[i+1]);
165 else if (strcmp (arg, "--to-dm-fd") == 0)
167 to_dm_fd = atoi (argv[i+1]);
170 else if (strcmp (arg, "--vt") == 0)
172 vt_number = atoi (argv[i+1]);
175 else if (strcmp (arg, "--file") == 0)
177 /*file = argv[i+1];*/
180 else if (strcmp (arg, "--test") == 0)
186 g_io_add_watch (g_io_channel_unix_new (from_dm_fd), G_IO_IN, read_message_cb, NULL);
188 status_text = g_string_new ("UNITY-SYSTEM-COMPOSITOR START");
190 g_string_append_printf (status_text, " VT=%d", vt_number);
191 if (g_getenv ("XDG_VTNR"))
192 g_string_append_printf (status_text, " XDG_VTNR=%s", g_getenv ("XDG_VTNR"));
194 g_string_append (status_text, " TEST=TRUE");
195 status_notify (status_text->str);
196 g_string_free (status_text, TRUE);
198 config = g_key_file_new ();
199 g_key_file_load_from_file (config, g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "script", NULL), G_KEY_FILE_NONE, NULL);
201 if (g_key_file_has_key (config, "unity-system-compositor-config", "return-value", NULL))
203 int return_value = g_key_file_get_integer (config, "unity-system-compositor-config", "return-value", NULL);
204 status_notify ("UNITY-SYSTEM-COMPOSITOR EXIT CODE=%d", return_value);
208 g_main_loop_run (loop);