Add --restart option by satorux@chromium.org
authorPeng Huang <shawn.p.huang@gmail.com>
Mon, 14 Jun 2010 14:47:21 +0000 (22:47 +0800)
committerPeng Huang <shawn.p.huang@gmail.com>
Mon, 14 Jun 2010 14:47:21 +0000 (22:47 +0800)
bus/main.c
src/ibuscomponent.c
src/ibuscomponent.h

index b100d2a6f7b660c81ee90de9f57bb4ff5b788a5c..02145c32dd12f65f64a2e68ce04d7109b91b8626 100644 (file)
@@ -36,6 +36,7 @@ static gboolean daemonize = FALSE;
 static gboolean single = FALSE;
 static gboolean xim = FALSE;
 static gboolean replace = FALSE;
+static gboolean restart = FALSE;
 static gchar *panel = "default";
 static gchar *config = "default";
 static gchar *desktop = "gnome";
@@ -72,6 +73,7 @@ static const GOptionEntry entries[] =
     { "monitor-timeout", 'j', 0, G_OPTION_ARG_INT,    &g_monitor_timeout, "timeout of poll changes of engines in seconds. 0 to disable it. ", "timeout [default is 0]" },
 #endif
     { "mem-profile", 'm', 0, G_OPTION_ARG_NONE,   &g_mempro,   "enable memory profile, send SIGUSR2 to print out the memory profile.", NULL },
+    { "restart",     'r', 0, G_OPTION_ARG_NONE,   &restart,    "restart panel and config processes when they die.", NULL },
     { "verbose",   'v', 0, G_OPTION_ARG_NONE,   &g_verbose,   "verbose.", NULL },
     { NULL },
 };
@@ -255,6 +257,9 @@ main (gint argc, gchar **argv)
         if (g_strcmp0 (config, "default") == 0) {
             IBusComponent *component;
             component = bus_registry_lookup_component_by_name (BUS_DEFAULT_REGISTRY, IBUS_SERVICE_CONFIG);
+            if (component) {
+                ibus_component_set_restart (component, restart);
+            }
             if (component == NULL || !ibus_component_start (component, g_verbose)) {
                 g_printerr ("Can not execute default config program\n");
                 exit (-1);
@@ -268,6 +273,9 @@ main (gint argc, gchar **argv)
         if (g_strcmp0 (panel, "default") == 0) {
             IBusComponent *component;
             component = bus_registry_lookup_component_by_name (BUS_DEFAULT_REGISTRY, IBUS_SERVICE_PANEL);
+            if (component) {
+                ibus_component_set_restart (component, restart);
+            }
             if (component == NULL || !ibus_component_start (component, g_verbose)) {
                 g_printerr ("Can not execute default panel program\n");
                 exit (-1);
index 49f9ef175791df543a2d90ce7c9ac690714f7de9..0c55268689225183124777fbdc0241af8cda13be 100644 (file)
@@ -29,12 +29,15 @@ enum {
 
 /* IBusComponentPriv */
 struct _IBusComponentPrivate {
-    gpointer pad;
+    // TRUE if the component started in the verbose mode.
+    gboolean verbose;
+    // TRUE if the component needs to be restarted when it dies.
+    gboolean restart;
 };
 typedef struct _IBusComponentPrivate IBusComponentPrivate;
 
 #define IBUS_COMPONENT_GET_PRIVATE(o)  \
-   (G_TYPE_INSTANCE_GET_PRIVATE ((o), BUS_TYPE_COMPONENT, IBusComponentPrivate))
+   (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_COMPONENT, IBusComponentPrivate))
 
 // static guint            _signals[LAST_SIGNAL] = { 0 };
 
@@ -66,6 +69,8 @@ ibus_component_class_init (IBusComponentClass *klass)
     IBusObjectClass *object_class = IBUS_OBJECT_CLASS (klass);
     IBusSerializableClass *serializable_class = IBUS_SERIALIZABLE_CLASS (klass);
 
+    g_type_class_add_private (klass, sizeof (IBusComponentPrivate));
+
     object_class->destroy = (IBusObjectDestroyFunc) ibus_component_destroy;
 
     serializable_class->serialize   = (IBusSerializableSerializeFunc) ibus_component_serialize;
@@ -91,6 +96,10 @@ ibus_component_init (IBusComponent *component)
     component->observed_paths = NULL;
     component->pid = 0;
     component->child_source_id = 0;
+
+    IBusComponentPrivate * priv = IBUS_COMPONENT_GET_PRIVATE (component);
+    priv->verbose = FALSE;
+    priv->restart = FALSE;
 }
 
 static void
@@ -657,6 +666,12 @@ ibus_component_child_cb (GPid            pid,
     g_spawn_close_pid (pid);
     component->pid = 0;
     component->child_source_id = 0;
+
+    IBusComponentPrivate *priv = IBUS_COMPONENT_GET_PRIVATE (component);
+    if (priv->restart) {
+        g_debug ("==== Restarting %s", component->exec);
+        ibus_component_start (component, priv->verbose);
+    }
 }
 
 gboolean
@@ -667,6 +682,9 @@ ibus_component_start (IBusComponent *component, gboolean verbose)
     if (component->pid != 0)
         return TRUE;
 
+    IBusComponentPrivate *priv = IBUS_COMPONENT_GET_PRIVATE (component);
+    priv->verbose = verbose;
+
     gint argc;
     gchar **argv;
     gboolean retval;
@@ -748,3 +766,12 @@ ibus_component_get_from_engine (IBusEngineDesc *engine)
     component = (IBusComponent *)g_object_get_data ((GObject *)engine, "component");
     return component;
 }
+
+void
+ibus_component_set_restart (IBusComponent *component, gboolean restart)
+{
+    g_assert (IBUS_IS_COMPONENT (component));
+
+    IBusComponentPrivate *priv = IBUS_COMPONENT_GET_PRIVATE (component);
+    priv->restart = restart;
+}
index 6685e61814559d73558f765846c9945c9b7fb279..249c8cf14e696b6d10d3ca4e06c79043171f2a19 100644 (file)
@@ -233,7 +233,7 @@ gboolean         ibus_component_check_modification
 /**
  * ibus_component_start:
  * @component: An IBusComponent.
- * @verbose: if redirect the child output to /dev/null
+ * @verbose: if FALSE, redirect the child output to /dev/null
  * @returns: TRUE if the component is started; FALSE otherwise.
  *
  * Whether the IBusComponent is started.
@@ -268,6 +268,17 @@ gboolean         ibus_component_is_running      (IBusComponent  *component);
  */
 IBusComponent   *ibus_component_get_from_engine (IBusEngineDesc *engine);
 
+/**
+ * ibus_component_set_restart:
+ * @component: An IBusComponent.
+ * @restart: if TRUE, the component will be restartd when it dies.
+ *
+ * Set whether the component needs to be restarted when it dies.
+ */
+void             ibus_component_set_restart     (IBusComponent  *component,
+                                                 gboolean        restart);
+
+
 G_END_DECLS
 #endif