/* FIXME: make this async */ static gboolean create_terminal (ExecData *data /* transfer full */) { TerminalFactory *factory; TerminalReceiver *receiver; GError *error = NULL; GVariantBuilder builder; char *object_path; char startup_id[32]; char **argv; int argc; factory = terminal_factory_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, TERMINAL_APPLICATION_ID, TERMINAL_FACTORY_OBJECT_PATH, NULL /* cancellable */, &error); if (factory == NULL) { g_dbus_error_strip_remote_error (error); g_printerr ("Error constructing proxy for %s:%s: %s\n", TERMINAL_APPLICATION_ID, TERMINAL_FACTORY_OBJECT_PATH, error->message); g_error_free (error); exec_data_free (data); return FALSE; } g_snprintf (startup_id, sizeof (startup_id), "_TIME%u", data->timestamp); g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); terminal_client_append_create_instance_options (&builder, data->display, startup_id, NULL /* geometry */, NULL /* role */, NULL /* use default profile */, NULL /* title */, TRUE, /* active */ FALSE /* maximised */, FALSE /* fullscreen */); if (!terminal_factory_call_create_instance_sync (factory, g_variant_builder_end (&builder), &object_path, NULL /* cancellable */, &error)) { g_dbus_error_strip_remote_error (error); g_printerr ("Error creating terminal: %s\n", error->message); g_error_free (error); g_object_unref (factory); exec_data_free (data); return FALSE; } g_object_unref (factory); receiver = terminal_receiver_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, TERMINAL_APPLICATION_ID, object_path, NULL /* cancellable */, &error); if (receiver == NULL) { g_dbus_error_strip_remote_error (error); g_printerr ("Failed to create proxy for terminal: %s\n", error->message); g_error_free (error); g_free (object_path); exec_data_free (data); return FALSE; } g_free (object_path); g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); terminal_client_append_exec_options (&builder, data->path, NULL, 0, /* FD array */ TRUE /* shell */); if (data->info == FILE_INFO_SFTP && data->remote) { argv = ssh_argv (data->uri, data->run_in_mc, &argc); } else if (data->run_in_mc) { argv = mc_argv (&argc); } else { argv = NULL; argc = 0; } if (!terminal_receiver_call_exec_sync (receiver, g_variant_builder_end (&builder), g_variant_new_bytestring_array ((const char * const *) argv, argc), NULL /* in FD list */, NULL /* out FD list */, NULL /* cancellable */, &error)) { g_dbus_error_strip_remote_error (error); g_printerr ("Error: %s\n", error->message); g_error_free (error); g_strfreev (argv); g_object_unref (receiver); exec_data_free (data); return FALSE; } g_strfreev (argv); exec_data_free (data); g_object_unref (receiver); return TRUE; }
int main (int argc, char **argv) { int i; char **argv_copy; const char *startup_id, *display_name; GdkDisplay *display; TerminalOptions *options; TerminalFactory *factory; GError *error = NULL; char *working_directory; int exit_code = EXIT_FAILURE; setlocale (LC_ALL, ""); terminal_i18n_init (TRUE); _terminal_debug_init (); /* Make a NULL-terminated copy since we may need it later */ argv_copy = g_new (char *, argc + 1); for (i = 0; i < argc; ++i) argv_copy [i] = argv [i]; argv_copy [i] = NULL; startup_id = g_getenv ("DESKTOP_STARTUP_ID"); working_directory = g_get_current_dir (); options = terminal_options_parse (working_directory, startup_id, &argc, &argv, &error); if (options == NULL) { g_printerr (_("Failed to parse arguments: %s\n"), error->message); g_error_free (error); g_free (working_directory); g_free (argv_copy); exit (EXIT_FAILURE); } g_set_application_name (_("Terminal")); /* Do this here so that gdk_display is initialized */ if (options->startup_id == NULL) terminal_client_get_fallback_startup_id (&options->startup_id); display = gdk_display_get_default (); display_name = gdk_display_get_name (display); options->display_name = g_strdup (display_name); factory = terminal_factory_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, options->server_app_id ? options->server_app_id : TERMINAL_APPLICATION_ID, TERMINAL_FACTORY_OBJECT_PATH, NULL /* cancellable */, &error); if (factory == NULL) { g_dbus_error_strip_remote_error (error); g_printerr ("Error constructing proxy for %s:%s: %s\n", options->server_app_id ? options->server_app_id : TERMINAL_APPLICATION_ID, TERMINAL_FACTORY_OBJECT_PATH, error->message); g_error_free (error); goto out; } if (!handle_options (factory, options, &error)) { g_dbus_error_strip_remote_error (error); g_printerr ("Failed to handle arguments: %s\n", error->message); } else { exit_code = EXIT_SUCCESS; } g_object_unref (factory); out: terminal_options_free (options); g_free (working_directory); g_free (argv_copy); return exit_code; }