[gnome-terminal/gsettings] Use gdbus-codegen for the terminal factory
- From: Christian Persch <chpe src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-terminal/gsettings] Use gdbus-codegen for the terminal factory
- Date: Thu, 17 Nov 2011 22:14:48 +0000 (UTC)
commit 1f16ddd1ce6b889450af59382f275ddb35eba27c
Author: Christian Persch <chpe gnome org>
Date: Wed Nov 16 23:29:00 2011 +0100
Use gdbus-codegen for the terminal factory
configure.ac | 31 ++++---
src/Makefile.am | 14 +++-
src/org.gnome.Terminal.xml | 31 ++++++
src/server.c | 224 ++++----------------------------------------
src/terminal-app.c | 62 ++++++++++++-
src/terminal.c | 156 ++++++------------------------
6 files changed, 171 insertions(+), 347 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 7f141f5..750e237 100644
--- a/configure.ac
+++ b/configure.ac
@@ -148,22 +148,29 @@ PKG_CHECK_MODULES([MIGRATOR],[
# Build tools
# ***********
-GLIB_GENMARSHAL="$($PKG_CONFIG --variable=glib_genmarshal glib-2.0)"
-AC_SUBST([GLIB_GENMARSHAL])
-GLIB_MKENUMS="$($PKG_CONFIG --variable=glib_mkenums glib-2.0)"
-AC_SUBST([GLIB_MKENUMS])
-
-AC_PATH_PROG([GTK_BUILDER_CONVERT],[gtk-builder-convert],[false])
+AC_ARG_VAR([GLIB_GENMARSHAL],[the glib-genmarschal programme])
+AC_PATH_PROG([GLIB_GENMARSHAL],[glib-genmarshal],[])
+if test -z "$GLIB_GENMARSHAL"; then
+ AC_MSG_ERROR([glib-genmarshal not found])
+fi
-if test "$GTK_BUILDER_CONVERT" = "false"; then
- AC_MSG_ERROR([gtk-builder-convert not found])
+AC_ARG_VAR([GLIB_MKENUMS],[the glib-mkenums programme])
+AC_PATH_PROG([GLIB_MKENUMS],[glib-mkenums],[])
+if test -z "$GLIB_MKENUMS"; then
+ AC_MSG_ERROR([glib-mkenums not found])
fi
-case "$with_gtk" in
- 3.0) GTK_BUILDER_CONVERT_FLAGS="--target-version=3.0" ;;
-esac
+AC_ARG_VAR([GDBUS_CODEGEN],[the gdbus-codegen programme])
+AC_PATH_PROG([GDBUS_CODEGEN],[gdbus-codegen],[])
+if test -z "$GDBUS_CODEGEN"; then
+ AC_MSG_ERROR([gdbus-codegen not found])
+fi
-AC_SUBST([GTK_BUILDER_CONVERT_FLAGS])
+AC_ARG_VAR([GTK_BUILDER_CONVERT],[the gtk-builder-convert programme])
+AC_PATH_PROG([GTK_BUILDER_CONVERT],[gtk-builder-convert],[])
+if test -z "$GTK_BUILDER_CONVERT"; then
+ AC_MSG_ERROR([gtk-builder-convert not found])
+fi
# ***********
# Compilation
diff --git a/src/Makefile.am b/src/Makefile.am
index be22ec5..b276393 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -12,6 +12,8 @@ BUILT_SOURCES = \
terminal-marshal.h \
terminal-type-builtins.c \
terminal-type-builtins.h \
+ terminal-factory.c \
+ terminal-factory.h \
$(NULL)
gnome_terminal_server_SOURCES= \
@@ -140,12 +142,22 @@ org.gnome.Terminal.Factory0.service: Makefile
echo "Name=org.gnome.Terminal.Factory0"; \
echo "${libexecdir}/gnome-terminal-server") > $@
+terminal-factory.c terminal-factory.h: org.gnome.Terminal.xml Makefile
+ $(AM_V_GEN) $(GDBUS_CODEGEN) \
+ --interface-prefix=org.gnome.Terminal \
+ --c-namespace=Terminal \
+ --c-generate-object-manager \
+ --generate-c-code terminal-factory \
+ $<
+
# Terminal remote
gnome_terminal_SOURCES= \
terminal.c \
terminal-debug.c \
terminal-debug.h \
+ terminal-factory.c \
+ terminal-factory.h \
terminal-intl.h \
terminal-options.c \
terminal-options.h \
@@ -268,6 +280,6 @@ EXTRA_DIST = \
@GSETTINGS_RULES@
%.ui: %.glade
- $(AM_V_GEN) $(GTK_BUILDER_CONVERT) $(GTK_BUILDER_CONVERT_FLAGS) $< $@
+ $(AM_V_GEN) $(GTK_BUILDER_CONVERT) $< $@
-include $(top_srcdir)/git.mk
diff --git a/src/org.gnome.Terminal.xml b/src/org.gnome.Terminal.xml
new file mode 100644
index 0000000..ad00073
--- /dev/null
+++ b/src/org.gnome.Terminal.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Introspection 0.1//EN"
+ "http://www.freedesktop.org/software/dbus/introspection.dtd">
+<!--
+ Copyright  2011 Christian Persch
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ This program is distributed in the hope conf it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+<node>
+ <interface name="org.gnome.Terminal.Factory0">
+ <annotation name="org.gtk.GDBus.C.Name" value="Factory" />
+ <method name="HandleArguments">
+ <arg type="ay" name="working_directory" direction="in" />
+ <arg type="ay" name="display_name" direction="in" />
+ <arg type="ay" name="startup_id" direction="in" />
+ <arg type="aay" name="environment" direction="in" />
+ <arg type="aay" name="arguments" direction="in" />
+ </method>
+ </interface>
+</node>
diff --git a/src/server.c b/src/server.c
index ceb2a6f..680a603 100644
--- a/src/server.c
+++ b/src/server.c
@@ -38,205 +38,42 @@
#include "terminal-accels.h"
#include "terminal-app.h"
#include "terminal-debug.h"
+#include "terminal-factory.h"
#include "terminal-intl.h"
#include "terminal-options.h"
#include "terminal-util.h"
-#define TERMINAL_FACTORY_SERVICE_NAME_PREFIX "org.gnome.Terminal.Factory0.Display"
-#define TERMINAL_FACTORY_SERVICE_PATH "/org/gnome/Terminal/Factory"
-#define TERMINAL_FACTORY_INTERFACE_NAME "org.gnome.Terminal.Factory"
+#define TERMINAL_UNIQUE_NAME "org.gnome.Terminal"
-static char *
-ay_to_string (GVariant *variant,
- GError **error)
-{
- gsize len;
- const char *data;
-
- data = g_variant_get_fixed_array (variant, &len, sizeof (char));
- if (len == 0)
- return NULL;
-
- /* Make sure there are no embedded NULs */
- if (memchr (data, '\0', len) != NULL) {
- g_set_error_literal (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS,
- "String is shorter than claimed");
- return NULL;
- }
-
- return g_strndup (data, len);
-}
-
-static char **
-ay_to_strv (GVariant *variant,
- int *argc)
-{
- GPtrArray *argv;
- const char *data, *nullbyte;
- gsize data_len;
- gssize len;
-
- data = g_variant_get_fixed_array (variant, &data_len, sizeof (char));
- if (data_len == 0 || data_len > G_MAXSSIZE) {
- if (argc)
- *argc = 0;
-
- return NULL;
- }
-
- argv = g_ptr_array_new ();
+#define TERMINAL_OBJECT_PATH_PREFIX "/org/gnome/Terminal"
+#define TERMINAL_OBJECT_INTERFACE_PREFIX "org.gnome.Terminal"
- len = data_len;
- do {
- gssize string_len;
-
- nullbyte = memchr (data, '\0', len);
-
- string_len = nullbyte ? (gssize) (nullbyte - data) : len;
- g_ptr_array_add (argv, g_strndup (data, string_len));
-
- len -= string_len + 1;
- data += string_len + 1;
- } while (len > 0);
-
- if (argc)
- *argc = argv->len;
-
- /* NULL terminate */
- g_ptr_array_add (argv, NULL);
- return (char **) g_ptr_array_free (argv, FALSE);
-}
+#define TERMINAL_FACTORY_OBJECT_PATH TERMINAL_OBJECT_PATH_PREFIX "/Factory0"
+#define TERMINAL_FACTORY_INTERFACE_NAME TERMINAL_OBJECT_INTERFACE_PREFIX ".Factory0"
typedef struct {
- char *factory_name;
+ GDBusObjectManagerServer *manager;
int exit_code;
} OwnData;
static void
-method_call_cb (GDBusConnection *connection,
- const char *sender,
- const char *object_path,
- const char *interface_name,
- const char *method_name,
- GVariant *parameters,
- GDBusMethodInvocation *invocation,
- gpointer user_data)
-{
- if (g_strcmp0 (method_name, "HandleArguments") == 0) {
- TerminalOptions *options = NULL;
- GVariant *v_wd, *v_display, *v_sid, *v_envv, *v_argv;
- char *working_directory = NULL, *display_name = NULL, *startup_id = NULL;
- char **envv = NULL, **argv = NULL;
- int argc;
- GError *error = NULL;
-
- g_variant_get (parameters, "(@ay ay@ay ay@ay)",
- &v_wd, &v_display, &v_sid, &v_envv, &v_argv);
-
- working_directory = ay_to_string (v_wd, &error);
- if (error)
- goto out;
- display_name = ay_to_string (v_display, &error);
- if (error)
- goto out;
- startup_id = ay_to_string (v_sid, &error);
- if (error)
- goto out;
- envv = ay_to_strv (v_envv, NULL);
- argv = ay_to_strv (v_argv, &argc);
-
- _terminal_debug_print (TERMINAL_DEBUG_FACTORY,
- "Factory invoked with working-dir='%s' display='%s' startup-id='%s'\n",
- working_directory ? working_directory : "(null)",
- display_name ? display_name : "(null)",
- startup_id ? startup_id : "(null)");
-
- options = terminal_options_parse (working_directory,
- display_name,
- startup_id,
- envv,
- TRUE,
- TRUE,
- &argc, &argv,
- &error,
- NULL);
-
- if (options != NULL) {
- terminal_app_handle_options (terminal_app_get (), options, FALSE /* no resume */, &error);
- terminal_options_free (options);
- }
-
- out:
- g_variant_unref (v_wd);
- g_free (working_directory);
- g_variant_unref (v_display);
- g_free (display_name);
- g_variant_unref (v_sid);
- g_free (startup_id);
- g_variant_unref (v_envv);
- g_strfreev (envv);
- g_variant_unref (v_argv);
- g_strfreev (argv);
-
- if (error == NULL) {
- g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
- } else {
- g_dbus_method_invocation_return_gerror (invocation, error);
- g_error_free (error);
- }
- }
-}
-
-static void
bus_acquired_cb (GDBusConnection *connection,
const char *name,
gpointer user_data)
{
- static const char dbus_introspection_xml[] =
- "<node name='/org/gnome/Terminal'>"
- "<interface name='org.gnome.Terminal.Factory'>"
- "<method name='HandleArguments'>"
- "<arg type='ay' name='working_directory' direction='in' />"
- "<arg type='ay' name='display_name' direction='in' />"
- "<arg type='ay' name='startup_id' direction='in' />"
- "<arg type='ay' name='environment' direction='in' />"
- "<arg type='ay' name='arguments' direction='in' />"
- "</method>"
- "</interface>"
- "</node>";
-
- static const GDBusInterfaceVTable interface_vtable = {
- method_call_cb,
- NULL,
- NULL,
- };
-
OwnData *data = (OwnData *) user_data;
- GDBusNodeInfo *introspection_data;
- guint registration_id;
- GError *error = NULL;
+ TerminalObjectSkeleton *object;
_terminal_debug_print (TERMINAL_DEBUG_FACTORY,
"Bus %s acquired\n", name);
- introspection_data = g_dbus_node_info_new_for_xml (dbus_introspection_xml, NULL);
- g_assert (introspection_data != NULL);
-
- registration_id = g_dbus_connection_register_object (connection,
- TERMINAL_FACTORY_SERVICE_PATH,
- introspection_data->interfaces[0],
- &interface_vtable,
- NULL, NULL,
- &error);
- g_dbus_node_info_unref (introspection_data);
+ object = terminal_object_skeleton_new (TERMINAL_FACTORY_OBJECT_PATH);
+ terminal_object_skeleton_set_factory (object, TERMINAL_FACTORY (terminal_app_get ()));
+ g_dbus_object_manager_server_export (data->manager, G_DBUS_OBJECT_SKELETON (object));
+ g_object_unref (object);
- if (registration_id == 0) {
- _terminal_debug_print (TERMINAL_DEBUG_FACTORY,
- "Failed to register object: %s\n", error->message);
- g_error_free (error);
- data->exit_code = EXIT_FAILURE;
- gtk_main_quit ();
- }
+ /* And export the object */
+ g_dbus_object_manager_server_set_connection (data->manager, connection);
}
static void
@@ -266,32 +103,6 @@ name_lost_cb (GDBusConnection *connection,
gtk_main_quit ();
}
-static char *
-get_factory_name_for_display (const char *display_name)
-{
-#if 0
- GString *name;
- const char *p;
-
- name = g_string_sized_new (strlen (TERMINAL_FACTORY_SERVICE_NAME_PREFIX) + strlen (display_name) + 1 /* NUL */);
- g_string_append (name, TERMINAL_FACTORY_SERVICE_NAME_PREFIX);
-
- for (p = display_name; *p; ++p)
- {
- if (g_ascii_isalnum (*p))
- g_string_append_c (name, *p);
- else
- g_string_append_c (name, '_');
- }
-
- _terminal_debug_print (TERMINAL_DEBUG_FACTORY,
- "Factory name is \"%s\"\n", name->str);
-
- return g_string_free (name, FALSE);
-#endif
- return g_strdup ("org.gnome.Terminal.Factory0");
-}
-
int
main (int argc, char **argv)
{
@@ -335,12 +146,11 @@ main (int argc, char **argv)
// g_unsetenv ("GIO_LAUNCHED_DESKTOP_FILE_PID");
// g_unsetenv ("GIO_LAUNCHED_DESKTOP_FILE");
- display = gdk_display_get_default ();
- data.factory_name = get_factory_name_for_display (gdk_display_get_name (display));
data.exit_code = EXIT_FAILURE;
+ data.manager = g_dbus_object_manager_server_new (TERMINAL_OBJECT_PATH_PREFIX);
owner_id = g_bus_own_name (G_BUS_TYPE_STARTER,
- data.factory_name,
+ TERMINAL_UNIQUE_NAME,
G_BUS_NAME_OWNER_FLAGS_NONE,
bus_acquired_cb,
name_acquired_cb,
@@ -351,7 +161,7 @@ main (int argc, char **argv)
g_bus_unown_name (owner_id);
- g_free (data.factory_name);
+ g_object_unref (data.manager);
terminal_app_shutdown ();
diff --git a/src/terminal-app.c b/src/terminal-app.c
index 3bbb79a..1040da0 100644
--- a/src/terminal-app.c
+++ b/src/terminal-app.c
@@ -37,6 +37,7 @@
#include "profile-editor.h"
#include "terminal-encoding.h"
#include "terminal-schemas.h"
+#include "terminal-factory.h"
#include <string.h>
#include <stdlib.h>
#include <time.h>
@@ -62,7 +63,7 @@
*/
struct _TerminalAppClass {
- GObjectClass parent_class;
+ TerminalFactorySkeletonClass parent_class;
void (* quit) (TerminalApp *app);
void (* profile_list_changed) (TerminalApp *app);
@@ -71,7 +72,7 @@ struct _TerminalAppClass {
struct _TerminalApp
{
- GObject parent_instance;
+ TerminalFactorySkeleton parent_instance;
GList *windows;
GtkWidget *new_profile_dialog;
@@ -1120,7 +1121,62 @@ terminal_app_client_quit_cb (EggSMClient *client,
/* Class implementation */
-G_DEFINE_TYPE (TerminalApp, terminal_app, G_TYPE_OBJECT)
+static gboolean
+terminal_app_handle_arguments (TerminalFactory *factory,
+ GDBusMethodInvocation *invocation,
+ const char *working_directory,
+ const char *display_name,
+ const char *startup_id,
+ const char * const *envv,
+ const char * const *argv)
+{
+ TerminalApp *app = TERMINAL_APP (factory);
+ TerminalOptions *options;
+ int argc;
+ GError *error = NULL;
+
+ _terminal_debug_print (TERMINAL_DEBUG_FACTORY,
+ "Factory invoked with working-dir='%s' display='%s' startup-id='%s'\n",
+ working_directory, display_name, startup_id);
+
+ argc = g_strv_length ((char **) argv);
+ options = terminal_options_parse (working_directory,
+ display_name,
+ startup_id,
+ (char **) envv,
+ TRUE,
+ TRUE,
+ &argc, (char ***) &argv,
+ &error,
+ NULL);
+
+ if (options == NULL) {
+ g_dbus_method_invocation_take_error (invocation, error);
+ goto out;
+ }
+
+ if (!terminal_app_handle_options (app, options, FALSE /* no resume */, &error)) {
+ g_dbus_method_invocation_take_error (invocation, error);
+ goto out;
+ }
+
+ terminal_factory_complete_handle_arguments (factory, invocation);
+
+out:
+ if (options)
+ terminal_options_free (options);
+
+ return TRUE; /* handled */
+}
+
+static void
+terminal_factory_iface_init (TerminalFactoryIface *iface)
+{
+ iface->handle_handle_arguments = terminal_app_handle_arguments;
+}
+
+G_DEFINE_TYPE_WITH_CODE (TerminalApp, terminal_app, TERMINAL_TYPE_FACTORY_SKELETON,
+ G_IMPLEMENT_INTERFACE (TERMINAL_TYPE_FACTORY, terminal_factory_iface_init))
static void
terminal_app_init (TerminalApp *app)
diff --git a/src/terminal.c b/src/terminal.c
index 1e107c7..0ebd90f 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -41,78 +41,15 @@
#include "terminal-debug.h"
#include "terminal-intl.h"
#include "terminal-options.h"
+#include "terminal-factory.h"
-#define TERMINAL_FACTORY_SERVICE_NAME_PREFIX "org.gnome.Terminal.Factory0.Display"
-#define TERMINAL_FACTORY_SERVICE_PATH "/org/gnome/Terminal/Factory"
-#define TERMINAL_FACTORY_INTERFACE_NAME "org.gnome.Terminal.Factory"
+#define TERMINAL_UNIQUE_NAME "org.gnome.Terminal"
-static GVariant *
-string_to_ay (const char *string)
-{
- gsize len;
- char *data;
-
- len = strlen (string);
- data = g_strndup (string, len);
-
- return g_variant_new_from_data (G_VARIANT_TYPE ("ay"), data, len, TRUE, g_free, data);
-}
+#define TERMINAL_OBJECT_PATH_PREFIX "/org/gnome/Terminal"
+#define TERMINAL_OBJECT_INTERFACE_PREFIX "org.gnome.Terminal"
-/**
- * options_to_variant:
- *
- * Returns: a new floating #GVariant
- */
-static GVariant *
-options_to_variant (TerminalOptions *options,
- char **argv,
- int argc)
-{
- char **envv;
- int i;
- GVariantBuilder builder;
- GString *string;
- char *s;
- gsize len;
-
- g_variant_builder_init (&builder, G_VARIANT_TYPE ("(ayayayayay)"));
-
- g_variant_builder_add (&builder, "@ay", string_to_ay (options->default_working_dir));
- g_variant_builder_add (&builder, "@ay", string_to_ay (options->display_name));
- g_variant_builder_add (&builder, "@ay", string_to_ay (options->startup_id));
-
- string = g_string_new (NULL);
- envv = g_get_environ ();
- for (i = 0; envv[i]; ++i)
- {
- if (i > 0)
- g_string_append_c (string, '\0');
-
- g_string_append (string, envv[i]);
- }
- g_strfreev (envv);
-
- len = string->len;
- s = g_string_free (string, FALSE);
- g_variant_builder_add (&builder, "@ay",
- g_variant_new_from_data (G_VARIANT_TYPE ("ay"), s, len, TRUE, g_free, s));
-
- string = g_string_new (NULL);
-
- for (i = 0; i < argc; ++i)
- {
- if (i > 0)
- g_string_append_c (string, '\0');
- g_string_append (string, argv[i]);
- }
-
- len = string->len;
- s = g_string_free (string, FALSE);
- g_variant_builder_add (&builder, "@ay",
- g_variant_new_from_data (G_VARIANT_TYPE ("ay"), s, len, TRUE, g_free, s));
-
- return g_variant_builder_end (&builder);
-}
+#define TERMINAL_FACTORY_OBJECT_PATH TERMINAL_OBJECT_PATH_PREFIX "/Factory0"
+#define TERMINAL_FACTORY_INTERFACE_NAME TERMINAL_OBJECT_INTERFACE_PREFIX ".Factory0"
/* Copied from libnautilus/nautilus-program-choosing.c; Needed in case
* we have no DESKTOP_STARTUP_ID (with its accompanying timestamp).
@@ -165,47 +102,17 @@ slowly_and_stupidly_obtain_timestamp (Display *xdisplay)
return event.xproperty.time;
}
-
-static char *
-get_factory_name_for_display (const char *display_name)
-{
-#if 0
- GString *name;
- const char *p;
-
- name = g_string_sized_new (strlen (TERMINAL_FACTORY_SERVICE_NAME_PREFIX) + strlen (display_name) + 1 /* NUL */);
- g_string_append (name, TERMINAL_FACTORY_SERVICE_NAME_PREFIX);
-
- for (p = display_name; *p; ++p)
- {
- if (g_ascii_isalnum (*p))
- g_string_append_c (name, *p);
- else
- g_string_append_c (name, '_');
- }
-
- _terminal_debug_print (TERMINAL_DEBUG_FACTORY,
- "Factory name is \"%s\"\n", name->str);
-
- return g_string_free (name, FALSE);
-#endif
- return g_strdup ("org.gnome.Terminal.Factory0");
-}
-
int
main (int argc, char **argv)
{
int i;
- char **argv_copy;
- int argc_copy;
+ char **argv_copy, **envv;
const char *startup_id, *display_name;
- char *factory_name = NULL;
GdkDisplay *display;
TerminalOptions *options;
- GDBusConnection *connection;
+ TerminalFactory *factory;
GError *error = NULL;
char *working_directory;
- GVariant *server_retval;
int exit_code = EXIT_FAILURE;
setlocale (LC_ALL, "");
@@ -223,7 +130,6 @@ main (int argc, char **argv)
for (i = 0; i < argc; ++i)
argv_copy [i] = argv [i];
argv_copy [i] = NULL;
- argc_copy = argc;
startup_id = g_getenv ("DESKTOP_STARTUP_ID");
working_directory = g_get_current_dir ();
@@ -242,11 +148,10 @@ main (int argc, char **argv)
#endif
NULL);
- g_free (working_directory);
-
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);
}
@@ -275,39 +180,42 @@ main (int argc, char **argv)
display_name = gdk_display_get_name (display);
options->display_name = g_strdup (display_name);
- connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
- if (connection == NULL) {
- g_printerr ("Error connecting to bus: %s\n", error->message);
+ 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_UNIQUE_NAME,
+ TERMINAL_FACTORY_OBJECT_PATH,
+ NULL /* cancellable */,
+ &error);
+ if (factory == NULL) {
+ g_printerr ("Error constructing proxy for %s:%s: %s\n",
+ TERMINAL_UNIQUE_NAME, TERMINAL_FACTORY_OBJECT_PATH,
+ error->message);
g_error_free (error);
goto out;
}
- factory_name = get_factory_name_for_display (options->display_name);
- server_retval = g_dbus_connection_call_sync (connection,
- factory_name,
- TERMINAL_FACTORY_SERVICE_PATH,
- TERMINAL_FACTORY_INTERFACE_NAME,
- "HandleArguments",
- options_to_variant (options, argv_copy, argc_copy),
- G_VARIANT_TYPE ("()"),
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- &error);
- if (server_retval == NULL) {
+ envv = g_get_environ ();
+ if (!terminal_factory_call_handle_arguments_sync (factory,
+ working_directory ? working_directory : "",
+ display_name ? display_name : "",
+ startup_id ? startup_id : "",
+ (const char * const *) envv,
+ (const char * const *) argv_copy,
+ NULL /* cancellable */,
+ &error)) {
g_printerr ("Error opening terminal: %s\n", error->message);
g_error_free (error);
} else {
- g_variant_unref (server_retval);
exit_code = EXIT_SUCCESS;
}
- g_free (factory_name);
- g_object_unref (connection);
+ g_strfreev (envv);
+ g_object_unref (factory);
out:
terminal_options_free (options);
-
+ g_free (working_directory);
g_free (argv_copy);
return exit_code;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]