gnome-terminal r3077 - in trunk: . src
- From: chpe svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-terminal r3077 - in trunk: . src
- Date: Wed, 24 Sep 2008 20:10:53 +0000 (UTC)
Author: chpe
Date: Wed Sep 24 20:10:53 2008
New Revision: 3077
URL: http://svn.gnome.org/viewvc/gnome-terminal?rev=3077&view=rev
Log:
libbonobo exorcism: use DBUS for single instance code
Bug 399209 â use d-bus / gunique / gtkunique for single instance code
Added:
trunk/src/terminal-factory-service.xml
Removed:
trunk/src/gnome-terminal.server
Modified:
trunk/configure.ac
trunk/src/Makefile.am
trunk/src/terminal.c
Modified: trunk/configure.ac
==============================================================================
--- trunk/configure.ac (original)
+++ trunk/configure.ac Wed Sep 24 20:10:53 2008
@@ -38,6 +38,7 @@
GTK_REQUIRED=2.13.6
GCONF_REQUIRED=2.14.0
STARTUP_NOTIFICATION_REQUIRED=0.8
+DBUS_GLIB_REQUIRED=0.6
VTE_REQUIRED=0.17.0
## here we get the flags we'll actually use
@@ -47,9 +48,8 @@
gio-2.0
gtk+-2.0 >= $GTK_REQUIRED
gconf-2.0 >= $GCONF_REQUIRED
- libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_REQUIRED
- libbonobo-2.0
- bonobo-activation-2.0])
+ dbus-glib-1 >= $DBUS_GLIB_REQUIRED
+ libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_REQUIRED])
# Check the smclient backend
GDK_TARGET="$($PKG_CONFIG --variable target gdk-2.0)"
@@ -101,6 +101,11 @@
AC_MSG_ERROR([gtk-builder-convert not found])
fi
+AC_PATH_PROG([DBUS_BINDING_TOOL],[dbus-binding-tool],[false])
+if test "$DBUS_BINDING_TOOL" = "false"; then
+ AC_MSG_ERROR([dbus-binding-tool not found])
+fi
+
GNOME_DOC_INIT
# ****************************
Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am (original)
+++ trunk/src/Makefile.am Wed Sep 24 20:10:53 2008
@@ -18,6 +18,8 @@
terminal-accels.h \
terminal-app.c \
terminal-app.h \
+ terminal-factory-client.h \
+ terminal-factory-server.h \
terminal-intl.h \
terminal-marshal.c \
terminal-marshal.h \
@@ -88,6 +90,8 @@
endif
BUILT_SOURCES = \
+ terminal-factory-client.h \
+ terminal-factory-server.h \
terminal-marshal.c \
terminal-marshal.h \
terminal-type-builtins.c \
@@ -127,6 +131,12 @@
&& mv terminal-marshal.c.tmp terminal-marshal.c ) \
|| ( rm -f terminal-marshal.c.tmp && exit 1 )
+terminal-factory-client.h: terminal-factory-service.xml
+ $(DBUS_BINDING_TOOL) --mode=glib-client --output=$@ $<
+
+terminal-factory-server.h: terminal-factory-service.xml
+ $(DBUS_BINDING_TOOL) --mode=glib-server --prefix=terminal_factory --output=$@ $<
+
schemadir = $(GCONF_SCHEMA_FILE_DIR)
schema_in_files = gnome-terminal.schemas.in
schema_DATA = gnome-terminal.schemas
@@ -156,19 +166,16 @@
$(BUILT_SOURCES)
EXTRA_DIST = \
+ terminal-factory-service.xml \
terminal-marshal.list \
terminal-type-builtins.c.template \
terminal-type-builtins.h.template \
$(icon_DATA) \
$(schema_in_files) \
- $(server_DATA) \
$(uimanager_DATA) \
$(builder_in_files) \
$(NULL)
-serverdir = $(libdir)/bonobo/servers
-server_DATA = gnome-terminal.server
-
@INTLTOOL_SCHEMAS_RULE@
if GCONF_SCHEMAS_INSTALL
Added: trunk/src/terminal-factory-service.xml
==============================================================================
--- (empty file)
+++ trunk/src/terminal-factory-service.xml Wed Sep 24 20:10:53 2008
@@ -0,0 +1,7 @@
+<node name="/">
+ <interface name="org.gnome.Terminal.Factory">
+ <method name="NewTerminal">
+ <arg type="as"/>
+ </method>
+ </interface>
+</node>
Modified: trunk/src/terminal.c
==============================================================================
--- trunk/src/terminal.c (original)
+++ trunk/src/terminal.c Wed Sep 24 20:10:53 2008
@@ -25,7 +25,6 @@
#include "terminal-intl.h"
-#undef BONOBO_DISABLE_DEPRECATED
#undef G_DISABLE_SINGLE_INCLUDES
#include "terminal-app.h"
@@ -34,10 +33,6 @@
#include "terminal-util.h"
#include "profile-editor.h"
#include "encoding.h"
-#include <bonobo-activation/bonobo-activation-activate.h>
-#include <bonobo-activation/bonobo-activation-register.h>
-#include <bonobo/bonobo-exception.h>
-#include <bonobo/bonobo-listener.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
@@ -48,8 +43,59 @@
#include "eggsmclient.h"
#endif
-#define ACT_IID "OAFIID:GNOME_Terminal_Factory"
+#include <dbus/dbus-protocol.h>
+#include <dbus/dbus-glib.h>
+#include <dbus/dbus-glib-bindings.h>
+#define TERMINAL_FACTORY_SERVICE_NAME "org.gnome.Terminal.Factory"
+#define TERMINAL_FACTORY_SERVICE_PATH "/org/gnome/Terminal/Factory"
+#define TERMINAL_FACTORY_INTERFACE_NAME "org.gnome.Terminal.Factory"
+
+#define TERMINAL_TYPE_FACTORY (terminal_factory_get_type ())
+#define TERMINAL_FACTORY(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), TERMINAL_TYPE_FACTORY, TerminalFactory))
+#define TERMINAL_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TERMINAL_TYPE_FACTORY, TerminalFactoryClass))
+#define TERMINAL_IS_FACTORY(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), TERMINAL_TYPE_FACTORY))
+#define TERMINAL_IS_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TERMINAL_TYPE_FACTORY))
+#define TERMINAL_FACTORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TERMINAL_TYPE_FACTORY, TerminalFactoryClass))
+
+typedef struct _TerminalFactory TerminalFactory;
+typedef struct _TerminalFactoryClass TerminalFactoryClass;
+typedef struct _TerminalFactoryPrivate TerminalFactoryPrivate;
+
+struct _TerminalFactory
+{
+ GObject parent_instance;
+};
+
+struct _TerminalFactoryClass
+{
+ GObjectClass parent_class;
+};
+
+static gboolean terminal_factory_new_terminal (TerminalFactory *factory,
+ const char **IN_args,
+ GError **error);
+
+#include "terminal-factory-client.h"
+#include "terminal-factory-server.h"
+
+static void
+terminal_factory_class_init (TerminalFactoryClass *factory_class)
+{
+}
+
+static void
+terminal_factory_init (TerminalFactory *factory)
+{
+}
+
+static GType terminal_factory_get_type (void);
+
+G_DEFINE_TYPE_WITH_CODE (TerminalFactory, terminal_factory, G_TYPE_OBJECT,
+ dbus_g_object_type_install_info (g_define_type_id,
+ &dbus_glib_terminal_factory_object_info)
+);
+
/* Settings storage works as follows:
* /apps/gnome-terminal/global/
* /apps/gnome-terminal/profiles/Foo/
@@ -74,8 +120,7 @@
static gboolean initialization_complete = FALSE;
static GSList *pending_new_terminal_events = NULL;
-static BonoboListener *listener = NULL;
-static gboolean factory_registered = FALSE;
+static TerminalFactory *factory = NULL;
typedef struct
{
@@ -1255,10 +1300,8 @@
terminal_app_shutdown ();
- if (factory_registered)
- bonobo_activation_active_server_unregister (ACT_IID, BONOBO_OBJREF (listener));
- if (listener)
- bonobo_object_unref (BONOBO_OBJECT (listener));
+ if (factory)
+ g_object_unref (factory);
return 0;
}
@@ -1733,130 +1776,124 @@
* Invoked remotely to instantiate a terminal with the
* given arguments.
*/
-static void
-terminal_new_event (BonoboListener *listener,
- const char *event_name,
- const CORBA_any *any,
- CORBA_Environment *ev,
- gpointer user_data)
-{
- CORBA_sequence_CORBA_string *args;
- char **tmp_argv;
- int tmp_argc;
+static gboolean
+terminal_factory_new_terminal (TerminalFactory *factory,
+ const char **argv,
+ GError **error)
+{
NewTerminalEvent *event;
-
- if (strcmp (event_name, "new_terminal"))
- {
- g_warning ("Unknown event \"%s\" on terminal",
- event_name);
- return;
- }
-
- args = any->_value;
-
- tmp_argv = g_new0 (char*, args->_length + 1);
- for (tmp_argc = 0; tmp_argc < args->_length; ++tmp_argc)
- tmp_argv[tmp_argc] = g_strdup (((const char**)args->_buffer)[tmp_argc]);
- tmp_argv[tmp_argc] = NULL;
event = g_slice_new0 (NewTerminalEvent);
- event->argc = tmp_argc;
- event->argv = tmp_argv;
+ event->argc = g_strv_length ((char **) argv);
+ event->argv = g_strdupv ((char **) argv);
pending_new_terminal_events = g_slist_append (pending_new_terminal_events,
event);
if (initialization_complete)
handle_new_terminal_events ();
+
+ return TRUE;
}
-static Bonobo_RegistrationResult
-terminal_register_as_factory (void)
+static gboolean
+terminal_register_as_factory (gboolean *is_owner,
+ GError **error)
{
- char *per_display_iid;
- Bonobo_RegistrationResult result;
-
- listener = bonobo_listener_new (terminal_new_event, NULL);
-
- per_display_iid = bonobo_activation_make_registration_id (
- ACT_IID, DisplayString (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ())));
-
- result = bonobo_activation_active_server_register (
- per_display_iid, BONOBO_OBJREF (listener));
-
- factory_registered = (result == Bonobo_ACTIVATION_REG_SUCCESS);
-
- if (!factory_registered)
- {
- bonobo_object_unref (BONOBO_OBJECT (listener));
- listener = NULL;
- }
+ DBusGConnection *connection;
+ DBusGProxy *proxy;
+ guint32 request_name_ret;
+
+ connection = dbus_g_bus_get (DBUS_BUS_SESSION, error);
+ if (connection == NULL)
+ return FALSE;
+
+ proxy = dbus_g_proxy_new_for_name (connection,
+ DBUS_SERVICE_DBUS,
+ DBUS_PATH_DBUS,
+ DBUS_INTERFACE_DBUS);
+#if 0
+ dbus_g_proxy_add_signal (proxy, "NameOwnerChanged",
+ G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
+ G_TYPE_INVALID);
+ dbus_g_proxy_connect_signal (proxy, "NameOwnerChanged",
+ G_CALLBACK (name_owner_changed), factory, NULL);
+#endif
+ if (!org_freedesktop_DBus_request_name (proxy,
+ TERMINAL_FACTORY_SERVICE_NAME,
+ DBUS_NAME_FLAG_DO_NOT_QUEUE,
+ &request_name_ret,
+ error))
+ return FALSE;
+
+ if (request_name_ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
+ //g_set_error (error, dbus_g_error_quark (), DBUS_GERROR_FAILED, "%s", _("Not primary owner"));
+ //return FALSE;
+ *is_owner = FALSE;
+ return TRUE;
+ }
+ factory = g_object_new (TERMINAL_TYPE_FACTORY, NULL);
+ dbus_g_connection_register_g_object (connection,
+ TERMINAL_FACTORY_SERVICE_PATH,
+ G_OBJECT (factory));
+
+ *is_owner = TRUE;
#ifdef DEBUG_FACTORY
- if (result == Bonobo_ACTIVATION_REG_SUCCESS)
- g_print ("Successfully registered factory \"%s\"\n", per_display_iid);
+ g_print ("Successfully registered factory \"%s\"\n", per_display_iid);
#endif
- g_free (per_display_iid);
-
- return result;
+ return TRUE;
}
static gboolean
-terminal_invoke_factory (int argc, char **argv)
+terminal_invoke_factory (int argc,
+ char **argv)
{
- Bonobo_Listener receiver;
-
- switch (terminal_register_as_factory ())
- {
- case Bonobo_ACTIVATION_REG_SUCCESS:
- /* we were the first terminal to register */
- return FALSE;
- case Bonobo_ACTIVATION_REG_NOT_LISTED:
- g_printerr (_("It appears that you do not have gnome-terminal.server installed in a valid location. Factory mode disabled.\n"));
- return FALSE;
- case Bonobo_ACTIVATION_REG_ERROR:
- g_printerr (_("Error registering terminal with the activation service; factory mode disabled.\n"));
- return FALSE;
- case Bonobo_ACTIVATION_REG_ALREADY_ACTIVE:
-#ifdef DEBUG_FACTORY
- g_print ("Factory found; forwarding request\n");
-#endif
- /* lets use it then */
- break;
- }
-
- receiver = bonobo_activation_activate_from_id (
- ACT_IID, Bonobo_ACTIVATION_FLAG_EXISTING_ONLY, NULL, NULL);
-
- if (receiver != CORBA_OBJECT_NIL)
- {
- int i;
- CORBA_any any;
- CORBA_sequence_CORBA_string args;
- CORBA_Environment ev;
+ DBusGConnection *connection;
+ DBusGProxy *proxy;
+ char **args;
+ int i;
+ GError *error = NULL;
+ gboolean is_owner;
- CORBA_exception_init (&ev);
+ if (!terminal_register_as_factory (&is_owner, &error)) {
+ g_printerr ("Failed to invoke factory: %s\n", error->message);
+ g_error_free (error);
+ exit (1);
+ return FALSE;
+ }
- any._type = TC_CORBA_sequence_CORBA_string;
- any._value = &args;
+ if (is_owner)
+ return FALSE;
- args._length = argc;
- args._buffer = g_newa (CORBA_char *, args._length);
+ connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+ if (connection == NULL) {
+ exit (1);
+ return FALSE;
+ }
- for (i = 0; i < args._length; i++)
- args._buffer [i] = argv [i];
-
- Bonobo_Listener_event (receiver, "new_terminal", &any, &ev);
- CORBA_Object_release (receiver, &ev);
- if (!BONOBO_EX (&ev))
- return TRUE;
+ /* Need to NULL terminate our argv */
+ args = g_new (char *, argc + 1);
+ for (i = 0; i < argc; i++) {
+ args[i] = argv[i];
+ }
+ args[argc] = NULL;
- CORBA_exception_free (&ev);
- }
- else
- g_printerr (_("Failed to retrieve terminal server from activation server\n"));
+ proxy = dbus_g_proxy_new_for_name (connection,
+ TERMINAL_FACTORY_SERVICE_NAME,
+ TERMINAL_FACTORY_SERVICE_PATH,
+ TERMINAL_FACTORY_INTERFACE_NAME);
+ if (!org_gnome_Terminal_Factory_new_terminal (proxy,
+ (const char **) args,
+ &error)) {
+ g_free (args);
+ g_printerr ("Failed to start new terminal: %s\n", error->message);
+ g_error_free (error);
+ return FALSE;
+ }
- return FALSE;
+ g_free (args);
+ return TRUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]