[Xfce4-commits] <xfce4-panel:devel> Read directly from the argv in the wrapper.
Nick Schermer
noreply at xfce.org
Mon Nov 23 14:44:01 CET 2009
Updating branch refs/heads/devel
to 520d0b8c488810ab42ced8fbbf1146892b965f8b (commit)
from 0fa301df67814ad6681ebdfdb6651cd6e45afb87 (commit)
commit 520d0b8c488810ab42ced8fbbf1146892b965f8b
Author: Nick Schermer <nick at xfce.org>
Date: Mon Nov 23 14:42:03 2009 +0100
Read directly from the argv in the wrapper.
The panel is the only applciations launching the wrapper,
so use fixed locations for data in the argv.
common/panel-dbus.h | 12 ++++
panel/panel-plugin-external-46.c | 2 +-
panel/panel-plugin-external.c | 27 ++++-----
wrapper/main.c | 115 +++++++++++++++-----------------------
4 files changed, 70 insertions(+), 86 deletions(-)
diff --git a/common/panel-dbus.h b/common/panel-dbus.h
index 66c2f2e..4401956 100644
--- a/common/panel-dbus.h
+++ b/common/panel-dbus.h
@@ -55,4 +55,16 @@ enum
DBUS_SET_REPLY_ID
};
+enum
+{
+ ARGV_0,
+ ARGV_FILENAME,
+ ARGV_UNIQUE_ID,
+ ARGV_SOCKET_ID,
+ ARGV_NAME,
+ ARGV_DISPLAY_NAME,
+ ARGV_COMMENT,
+ ARGV_ARGUMENTS
+};
+
#endif /* !__PANEL_DBUS_H__ */
diff --git a/panel/panel-plugin-external-46.c b/panel/panel-plugin-external-46.c
index 5aaf957..fa1622f 100644
--- a/panel/panel-plugin-external-46.c
+++ b/panel/panel-plugin-external-46.c
@@ -363,7 +363,7 @@ panel_plugin_external_46_realize (GtkWidget *widget)
g_error_free (error);
}
- /* cleanup */
+ g_free (argv);
g_free (socket_id);
g_free (unique_id);
}
diff --git a/panel/panel-plugin-external.c b/panel/panel-plugin-external.c
index 9b748dc..d01d3bf 100644
--- a/panel/panel-plugin-external.c
+++ b/panel/panel-plugin-external.c
@@ -396,7 +396,8 @@ panel_plugin_external_realize (GtkWidget *widget)
GError *error = NULL;
gboolean succeed;
gchar *socket_id, *unique_id;
- gint i, argc = 14;
+ guint i;
+ guint argc = ARGV_ARGUMENTS + 1;
GdkScreen *screen;
GPid pid;
@@ -413,24 +414,18 @@ panel_plugin_external_realize (GtkWidget *widget)
/* setup the basic argv */
argv = g_new0 (gchar *, argc);
- argv[0] = (gchar *) WRAPPER_BIN;
- argv[1] = (gchar *) "-n";
- argv[2] = (gchar *) panel_module_get_name (external->module);
- argv[3] = (gchar *) "-i";
- argv[4] = (gchar *) unique_id;
- argv[5] = (gchar *) "-d";
- argv[6] = (gchar *) panel_module_get_display_name (external->module);
- argv[7] = (gchar *) "-c";
- argv[8] = (gchar *) panel_module_get_comment (external->module);
- argv[9] = (gchar *) "-f";
- argv[10] = (gchar *) panel_module_get_filename (external->module);
- argv[11] = (gchar *) "-s";
- argv[12] = (gchar *) socket_id;
+ argv[ARGV_0] = (gchar *) WRAPPER_BIN;
+ argv[ARGV_FILENAME] = (gchar *) panel_module_get_filename (external->module);
+ argv[ARGV_UNIQUE_ID] = (gchar *) unique_id;
+ argv[ARGV_SOCKET_ID] = (gchar *) socket_id;
+ argv[ARGV_NAME] = (gchar *) panel_module_get_name (external->module);
+ argv[ARGV_DISPLAY_NAME] = (gchar *) panel_module_get_display_name (external->module);
+ argv[ARGV_COMMENT] = (gchar *) panel_module_get_comment (external->module);
/* append the arguments */
if (G_UNLIKELY (external->arguments != NULL))
for (i = 0; external->arguments[i] != NULL; i++)
- argv[i + 13] = external->arguments[i];
+ argv[i + ARGV_ARGUMENTS] = external->arguments[i];
/* get the widget screen */
screen = gtk_widget_get_screen (widget);
@@ -454,7 +449,7 @@ panel_plugin_external_realize (GtkWidget *widget)
g_error_free (error);
}
- /* cleanup */
+ g_free (argv);
g_free (socket_id);
g_free (unique_id);
}
diff --git a/wrapper/main.c b/wrapper/main.c
index d1adc0b..b053294 100644
--- a/wrapper/main.c
+++ b/wrapper/main.c
@@ -50,28 +50,8 @@
-static gchar *opt_display_name = NULL;
-static gint opt_unique_id = -1;
-static gchar *opt_comment = NULL;
-static gchar *opt_filename = NULL;
-static gint opt_socket_id = 0;
-static gchar **opt_arguments = NULL;
-static GQuark plug_quark = 0;
-static gboolean gproxy_destroyed = FALSE;
-
-
-
-static GOptionEntry option_entries[] =
-{
- { "name", 'n', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, &wrapper_name, NULL, NULL },
- { "display-name", 'd', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, &opt_display_name, NULL, NULL },
- { "comment", 'c', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, &opt_comment, NULL, NULL },
- { "unique-id", 'i', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_INT, &opt_unique_id, NULL, NULL },
- { "filename", 'f', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, &opt_filename, NULL, NULL },
- { "socket-id", 's', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_INT, &opt_socket_id, NULL, NULL },
- { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &opt_arguments, NULL, NULL },
- { NULL }
-};
+static GQuark plug_quark = 0;
+static gboolean gproxy_destroyed = FALSE;
@@ -164,7 +144,6 @@ wrapper_gproxy_provider_signal (XfcePanelPluginProvider *provider,
DBusGProxy *dbus_gproxy)
{
panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
- panel_return_if_fail (opt_unique_id == xfce_panel_plugin_provider_get_unique_id (provider));
/* send the provider signal to the panel */
wrapper_dbus_provider_signal_async (dbus_gproxy, provider_signal,
@@ -175,11 +154,8 @@ wrapper_gproxy_provider_signal (XfcePanelPluginProvider *provider,
static void
-wrapper_gproxy_destroyed (DBusGProxy *dbus_gproxy,
- GError **error)
+wrapper_gproxy_destroyed (DBusGProxy *dbus_gproxy)
{
- panel_return_if_fail (error == NULL || *error == NULL);
-
/* we lost communication with the panel, silently close the wrapper */
gproxy_destroyed = TRUE;
@@ -191,23 +167,27 @@ wrapper_gproxy_destroyed (DBusGProxy *dbus_gproxy,
gint
main (gint argc, gchar **argv)
{
- GOptionContext *context;
- GOptionGroup *option_group;
- GError *error = NULL;
#if defined(HAVE_SYS_PRCTL_H) && defined(PR_SET_NAME)
- gchar process_name[16];
+ gchar process_name[16];
#endif
- GModule *library = NULL;
- gint retval = WRAPPER_EXIT_FAILURE;
- XfcePanelPluginPreInit preinit_func;
- gboolean result;
- DBusGConnection *dbus_gconnection;
- DBusGProxy *dbus_gproxy = NULL;
- WrapperModule *module = NULL;
- WrapperPlug *plug;
- GtkWidget *provider;
- gchar *path;
- guint gproxy_destroy_id = 0;
+ GModule *library = NULL;
+ gint retval = WRAPPER_EXIT_FAILURE;
+ XfcePanelPluginPreInit preinit_func;
+ DBusGConnection *dbus_gconnection;
+ DBusGProxy *dbus_gproxy = NULL;
+ WrapperModule *module = NULL;
+ WrapperPlug *plug;
+ GtkWidget *provider;
+ gchar *path;
+ guint gproxy_destroy_id = 0;
+ GError *error = NULL;
+ const gchar *filename;
+ gint unique_id;
+ GdkNativeWindow socket_id;
+ const gchar *name;
+ const gchar *display_name;
+ const gchar *comment;
+ gchar **arguments;
/* set translation domain */
xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8");
@@ -217,39 +197,36 @@ main (gint argc, gchar **argv)
g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING);
#endif
- /* parse the wrapper options */
- context = g_option_context_new ("[ARGUMENTS...]");
- g_option_context_add_main_entries (context, option_entries, GETTEXT_PACKAGE);
- option_group = gtk_get_option_group (FALSE);
- g_option_context_add_group (context, option_group);
- result = g_option_context_parse (context, &argc, &argv, &error);
- g_option_context_free (context);
- if (G_UNLIKELY (result == FALSE))
- goto leave;
-
- /* check if we have all required arguments */
- if (opt_socket_id == 0 || wrapper_name == NULL
- || opt_unique_id == -1 || opt_display_name == NULL
- || opt_filename == NULL)
+ /* check if we have all the reuiqred arguments */
+ if (G_UNLIKELY (argc < ARGV_ARGUMENTS))
{
- g_set_error (&error, 0, 0, "One of the required arguments is missing");
- goto leave;
+ g_critical ("Not enough arguments are passed to the wrapper");
+ return WRAPPER_EXIT_FAILURE;
}
+ /* put all arguments in understandable strings */
+ filename = argv[ARGV_FILENAME];
+ unique_id = strtol (argv[ARGV_UNIQUE_ID], NULL, 0);
+ socket_id = strtol (argv[ARGV_SOCKET_ID], NULL, 0);
+ name = argv[ARGV_NAME];
+ display_name = argv[ARGV_DISPLAY_NAME];
+ comment = argv[ARGV_COMMENT];
+ arguments = argv + ARGV_ARGUMENTS;
+
#if defined(HAVE_SYS_PRCTL_H) && defined(PR_SET_NAME)
/* change the process name to something that makes sence */
g_snprintf (process_name, sizeof (process_name), "panel-%d-%s",
- opt_unique_id, wrapper_name);
+ unique_id, name);
if (prctl (PR_SET_NAME, (gulong) process_name, 0, 0, 0) == -1)
g_warning ("Failed to change the process name to \"%s\".", process_name);
#endif
/* open the plugin module */
- library = g_module_open (opt_filename, G_MODULE_BIND_LOCAL);
+ library = g_module_open (filename, G_MODULE_BIND_LOCAL);
if (G_UNLIKELY (library == NULL))
{
g_set_error (&error, 0, 0, "Failed to open plugin module \"%s\": %s",
- opt_filename, g_module_error ());
+ filename, g_module_error ());
goto leave;
}
@@ -269,7 +246,7 @@ main (gint argc, gchar **argv)
if (G_UNLIKELY (dbus_gconnection == NULL))
goto leave;
- path = g_strdup_printf (PANEL_DBUS_WRAPPER_PATH, opt_unique_id);
+ path = g_strdup_printf (PANEL_DBUS_WRAPPER_PATH, unique_id);
dbus_gproxy = dbus_g_proxy_new_for_name_owner (dbus_gconnection,
PANEL_DBUS_NAME,
path,
@@ -281,7 +258,7 @@ main (gint argc, gchar **argv)
/* quit when the proxy is destroyed (panel segfault for example) */
gproxy_destroy_id = g_signal_connect (G_OBJECT (dbus_gproxy), "destroy",
- G_CALLBACK (wrapper_gproxy_destroyed), &error);
+ G_CALLBACK (wrapper_gproxy_destroyed), NULL);
/* create the type module */
module = wrapper_module_new (library);
@@ -289,14 +266,14 @@ main (gint argc, gchar **argv)
/* create the plugin provider */
provider = wrapper_module_new_provider (module,
gdk_screen_get_default (),
- wrapper_name, opt_unique_id,
- opt_display_name, opt_comment,
- opt_arguments);
+ name, unique_id,
+ display_name, comment,
+ arguments);
if (G_LIKELY (provider != NULL))
{
/* create the wrapper plug */
- plug = wrapper_plug_new (opt_socket_id);
+ plug = wrapper_plug_new (socket_id);
gtk_container_add (GTK_CONTAINER (plug), GTK_WIDGET (provider));
g_object_add_weak_pointer (G_OBJECT (plug), (gpointer *) &plug);
gtk_widget_show (GTK_WIDGET (plug));
@@ -359,8 +336,8 @@ leave:
if (G_UNLIKELY (error != NULL))
{
/* print the critical error */
- g_critical ("Wrapper %s-%d: %s.", wrapper_name,
- opt_unique_id, error->message);
+ g_critical ("Wrapper %s-%d: %s.", name,
+ unique_id, error->message);
/* cleanup */
g_error_free (error);
More information about the Xfce4-commits
mailing list