[Xfce4-commits] <xfce4-panel:master> Migrate: Add version based config migration.
Nick Schermer
noreply at xfce.org
Sun Oct 23 18:34:02 CEST 2011
Updating branch refs/heads/master
to 5385d9914b43ee74c0b1da093b44515777a81409 (commit)
from 81a2d7523b779e2fbe93d632917074ff4d5613aa (commit)
commit 5385d9914b43ee74c0b1da093b44515777a81409
Author: Nick Schermer <nick at xfce.org>
Date: Fri Sep 9 21:33:09 2011 +0200
Migrate: Add version based config migration.
This allows to update the configuration for new plugins.
configure.ac.in | 9 ++
migrate/Makefile.am | 2 +
migrate/{default.xml => default.xml.in} | 1 +
migrate/main.c | 176 +++++++++++++++-----------
migrate/migrate-46.c | 9 +-
migrate/migrate-46.h | 4 +-
migrate/migrate-config.c | 184 ++++++++++++++++++++++++++++
migrate/{migrate-46.h => migrate-config.h} | 14 +-
migrate/migrate-default.c | 7 +-
panel/panel-application.c | 6 +-
10 files changed, 319 insertions(+), 93 deletions(-)
diff --git a/configure.ac.in b/configure.ac.in
index 40e3245..8aa7e8c 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -10,6 +10,7 @@ dnl *** Version information ***
dnl ***************************
m4_define([libxfce4panel_verinfo], [3:0:0]) dnl current:revision:age
m4_define([libxfce4panel_version_api], [1.0])
+m4_define([xfce4_panel_config_version], [1])
m4_define([xfce4_panel_version_major], [4])
m4_define([xfce4_panel_version_minor], [9])
m4_define([xfce4_panel_version_micro], [0])
@@ -96,6 +97,13 @@ AC_SUBST([LIBXFCE4PANEL_VERSION_MAJOR])
AC_SUBST([LIBXFCE4PANEL_VERSION_MINOR])
AC_SUBST([LIBXFCE4PANEL_VERSION_MICRO])
+dnl *********************************
+dnl *** Substitute config version ***
+dnl *********************************
+XFCE4_PANEL_CONFIG_VERSION=xfce4_panel_config_version()
+AC_DEFINE([XFCE4_PANEL_CONFIG_VERSION], xfce4_panel_config_version(), [config migration version])
+AC_SUBST([XFCE4_PANEL_CONFIG_VERSION])
+
dnl **********************************
dnl *** Check for standard headers ***
dnl **********************************
@@ -254,6 +262,7 @@ libxfce4panel/Makefile
libxfce4panel/libxfce4panel-1.0.pc
libxfce4panel/libxfce4panel-config.h
migrate/Makefile
+migrate/default.xml
panel/Makefile
wrapper/Makefile
plugins/Makefile
diff --git a/migrate/Makefile.am b/migrate/Makefile.am
index 3fa3195..acaaa80 100644
--- a/migrate/Makefile.am
+++ b/migrate/Makefile.am
@@ -19,6 +19,8 @@ migrate_SOURCES = \
main.c \
migrate-46.c \
migrate-46.h \
+ migrate-config.c \
+ migrate-config.h \
migrate-default.c \
migrate-default.h
diff --git a/migrate/default.xml b/migrate/default.xml.in
similarity index 97%
rename from migrate/default.xml
rename to migrate/default.xml.in
index 3a91902..c9fdda7 100644
--- a/migrate/default.xml
+++ b/migrate/default.xml.in
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<channel name="xfce4-panel" version="1.0">
+ <property name="configver" type="int" value="@XFCE4_PANEL_CONFIG_VERSION@">
<property name="panels" type="uint" value="2">
<property name="panel-0" type="empty">
<property name="position" type="string" value="p=6;x=0;y=0"/>
diff --git a/migrate/main.c b/migrate/main.c
index 6d2c646..3adf36e 100644
--- a/migrate/main.c
+++ b/migrate/main.c
@@ -34,8 +34,10 @@
#include <xfconf/xfconf.h>
#include <libxfce4util/libxfce4util.h>
#include <libxfce4ui/libxfce4ui.h>
+#include <libxfce4panel/xfce-panel-macros.h>
#include <migrate/migrate-46.h>
+#include <migrate/migrate-config.h>
#include <migrate/migrate-default.h>
@@ -43,14 +45,16 @@
gint
main (gint argc, gchar **argv)
{
- gchar *file;
- GError *error = NULL;
- GtkWidget *dialog;
- GtkWidget *button;
- gint result;
- gint retval = EXIT_SUCCESS;
- gboolean default_config_exists;
- gint default_response = GTK_RESPONSE_CANCEL;
+ gchar *file;
+ GError *error = NULL;
+ GtkWidget *dialog;
+ GtkWidget *button;
+ gint result;
+ gint retval = EXIT_SUCCESS;
+ gboolean default_config_exists;
+ gint default_response = GTK_RESPONSE_CANCEL;
+ XfconfChannel *channel;
+ gint configver;
/* set translation domain */
xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8");
@@ -60,15 +64,6 @@ main (gint argc, gchar **argv)
g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING);
#endif
- /* lookup the possible configuration files */
- file = xfce_resource_lookup (XFCE_RESOURCE_CONFIG, XFCE_46_CONFIG);
- default_config_exists = g_file_test (DEFAULT_CONFIG, G_FILE_TEST_IS_REGULAR);
- if (file == NULL && !default_config_exists)
- {
- g_warning ("No default or old configuration found");
- return EXIT_FAILURE;
- }
-
gtk_init (&argc, &argv);
if (!xfconf_init (&error))
@@ -78,76 +73,109 @@ main (gint argc, gchar **argv)
return EXIT_FAILURE;
}
- /* check if we auto-migrate the default configuration */
- if (g_getenv ("XFCE_PANEL_MIGRATE_DEFAULT") != NULL)
+ channel = xfconf_channel_get (XFCE_PANEL_CHANNEL_NAME);
+ if (!xfconf_channel_has_property (channel, "/panels"))
{
+ /* lookup the possible configuration files */
+ file = xfce_resource_lookup (XFCE_RESOURCE_CONFIG, XFCE_46_CONFIG);
+ default_config_exists = g_file_test (DEFAULT_CONFIG, G_FILE_TEST_IS_REGULAR);
+ if (file == NULL && !default_config_exists)
+ {
+ g_warning ("No default or old configuration found");
+ return EXIT_FAILURE;
+ }
+
+ /* check if we auto-migrate the default configuration */
+ if (g_getenv ("XFCE_PANEL_MIGRATE_DEFAULT") != NULL)
+ {
+ if (file != NULL)
+ g_message ("Tried to auto-migrate, but old configuration found");
+ else if (!!default_config_exists)
+ g_message ("Tried to auto-migrate, but no default configuration found");
+ else
+ goto migrate_default;
+ }
+
+ /* create question dialog */
+ dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE,
+ _("Welcome to the first start of the panel"));
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s%s%s",
+ file != NULL ? _("Because the panel moved to a new system for storing the "
+ "settings, it has to load a fresh initial configuration.") : "",
+ file != NULL ? " " : "",
+ _("Choose below which setup you want for the first startup."));
+ gtk_window_set_title (GTK_WINDOW (dialog), _("Panel"));
+ gtk_window_set_icon_name (GTK_WINDOW (dialog), GTK_STOCK_PREFERENCES);
+ gtk_window_stick (GTK_WINDOW (dialog));
+ gtk_window_set_keep_above (GTK_WINDOW (dialog), TRUE);
+
+ button = gtk_dialog_add_button (GTK_DIALOG (dialog), _("Migrate old config"), GTK_RESPONSE_OK);
+ gtk_widget_set_tooltip_text (button, _("Migrate the old 4.6 configuration to Xfconf"));
+ gtk_widget_set_sensitive (button, file != NULL);
if (file != NULL)
- g_message ("Tried to auto-migrate, but old configuration found");
- else if (!!default_config_exists)
- g_message ("Tried to auto-migrate, but no default configuration found");
- else
- goto migrate_default;
- }
+ default_response = GTK_RESPONSE_OK;
- /* create question dialog */
- dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE,
- _("Welcome to the first start of the panel"));
- gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s%s%s",
- file != NULL ? _("Because the panel moved to a new system for storing the "
- "settings, it has to load a fresh initial configuration.") : "",
- file != NULL ? " " : "",
- _("Choose below which setup you want for the first startup."));
- gtk_window_set_title (GTK_WINDOW (dialog), _("Panel"));
- gtk_window_set_icon_name (GTK_WINDOW (dialog), GTK_STOCK_PREFERENCES);
- gtk_window_stick (GTK_WINDOW (dialog));
- gtk_window_set_keep_above (GTK_WINDOW (dialog), TRUE);
-
- button = gtk_dialog_add_button (GTK_DIALOG (dialog), _("Migrate old config"), GTK_RESPONSE_OK);
- gtk_widget_set_tooltip_text (button, _("Migrate the old 4.6 configuration to Xfconf"));
- gtk_widget_set_sensitive (button, file != NULL);
- if (file != NULL)
- default_response = GTK_RESPONSE_OK;
-
- button = gtk_dialog_add_button (GTK_DIALOG (dialog), _("Use default config"), GTK_RESPONSE_YES);
- gtk_widget_set_tooltip_text (button, _("Load the default configuration"));
- gtk_widget_set_sensitive (button, default_config_exists);
- if (default_config_exists && file == NULL)
- default_response = GTK_RESPONSE_YES;
-
- button = gtk_dialog_add_button (GTK_DIALOG (dialog), _("One empty panel"), GTK_RESPONSE_CANCEL);
- gtk_widget_set_tooltip_text (button, _("Start with one empty panel"));
-
- gtk_dialog_set_default_response (GTK_DIALOG (dialog), default_response);
-
- result = gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
-
- if (result == GTK_RESPONSE_OK
- && file != NULL)
- {
- /* restore 4.6 config */
- if (!migrate_46 (file, &error))
+ button = gtk_dialog_add_button (GTK_DIALOG (dialog), _("Use default config"), GTK_RESPONSE_YES);
+ gtk_widget_set_tooltip_text (button, _("Load the default configuration"));
+ gtk_widget_set_sensitive (button, default_config_exists);
+ if (default_config_exists && file == NULL)
+ default_response = GTK_RESPONSE_YES;
+
+ button = gtk_dialog_add_button (GTK_DIALOG (dialog), _("One empty panel"), GTK_RESPONSE_CANCEL);
+ gtk_widget_set_tooltip_text (button, _("Start with one empty panel"));
+
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), default_response);
+
+ result = gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+
+ if (result == GTK_RESPONSE_OK
+ && file != NULL)
{
- xfce_dialog_show_error (NULL, error, _("Failed to migrate the old panel configuration"));
- g_error_free (error);
- retval = EXIT_FAILURE;
+ /* restore 4.6 config */
+ if (!migrate_46 (file, channel, &error))
+ {
+ xfce_dialog_show_error (NULL, error, _("Failed to migrate the old panel configuration"));
+ g_error_free (error);
+ retval = EXIT_FAILURE;
+ }
+ }
+ else if (result == GTK_RESPONSE_YES
+ && default_config_exists)
+ {
+ migrate_default:
+
+ /* apply default config */
+ if (!migrate_default (DEFAULT_CONFIG, &error))
+ {
+ xfce_dialog_show_error (NULL, error, _("Failed to load the default configuration"));
+ g_error_free (error);
+ retval = EXIT_FAILURE;
+ }
}
+
+ g_free (file);
}
- else if (result == GTK_RESPONSE_YES
- && default_config_exists)
+
+ configver = xfconf_channel_get_int (channel, "/configver", -1);
+ if (configver < XFCE4_PANEL_CONFIG_VERSION)
{
- migrate_default:
+ g_message (_("Panel config needs migration..."));
- /* apply default config */
- if (!migrate_default (DEFAULT_CONFIG, &error))
+ if (!migrate_config (channel, configver, &error))
{
- xfce_dialog_show_error (NULL, error, _("Failed to load the default configuration"));
+ xfce_dialog_show_error (NULL, error, _("Failed to migrate the existing configuration"));
g_error_free (error);
retval = EXIT_FAILURE;
}
- }
+ else
+ {
+ g_message (_("Panel configuration has been updated."));
+ }
- g_free (file);
+ /* migration complete, set new version */
+ xfconf_channel_set_int (channel, "/configver", XFCE4_PANEL_CONFIG_VERSION);
+ }
xfconf_shutdown ();
diff --git a/migrate/migrate-46.c b/migrate/migrate-46.c
index 9674be4..02b074f 100644
--- a/migrate/migrate-46.c
+++ b/migrate/migrate-46.c
@@ -899,8 +899,9 @@ static GMarkupParser markup_parser =
gboolean
-migrate_46 (const gchar *filename,
- GError **error)
+migrate_46 (const gchar *filename,
+ XfconfChannel *channel,
+ GError **error)
{
gsize length;
gchar *contents;
@@ -910,6 +911,7 @@ migrate_46 (const gchar *filename,
g_return_val_if_fail (filename != NULL, FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+ g_return_val_if_fail (XFCONF_IS_CHANNEL (channel), FALSE);
if (!g_file_get_contents (filename, &contents, &length, error))
return FALSE;
@@ -918,7 +920,7 @@ migrate_46 (const gchar *filename,
parser->state = START;
parser->plugin_id_counter = 0;
parser->panel_id_counter = 0;
- parser->channel = xfconf_channel_new (XFCE_PANEL_CHANNEL_NAME);
+ parser->channel = channel;
context = g_markup_parse_context_new (&markup_parser, 0, parser, NULL);
@@ -935,7 +937,6 @@ migrate_46 (const gchar *filename,
g_free (contents);
g_markup_parse_context_free (context);
- g_object_unref (G_OBJECT (parser->channel));
g_slice_free (ConfigParser, parser);
return succeed;
diff --git a/migrate/migrate-46.h b/migrate/migrate-46.h
index d75cd7f..0db23e9 100644
--- a/migrate/migrate-46.h
+++ b/migrate/migrate-46.h
@@ -25,7 +25,9 @@ G_BEGIN_DECLS
#define XFCE_46_CONFIG "xfce4" G_DIR_SEPARATOR_S "panel" G_DIR_SEPARATOR_S "panels.xml"
-gboolean migrate_46 (const gchar *filename, GError **error);
+gboolean migrate_46 (const gchar *filename,
+ XfconfChannel *channel,
+ GError **error);
G_END_DECLS
diff --git a/migrate/migrate-config.c b/migrate/migrate-config.c
new file mode 100644
index 0000000..2bce672
--- /dev/null
+++ b/migrate/migrate-config.c
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2011 Nick Schermer <nick at xfce.org>
+ *
+ * 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 Foundatoin; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that 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, write to the Free Software Foundatoin, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <xfconf/xfconf.h>
+#include <migrate/migrate-config.h>
+
+
+
+static guint
+migrate_config_strchr_count (const gchar *haystack,
+ const gchar needle)
+{
+ const gchar *p;
+ guint count;
+
+ if (G_UNLIKELY (haystack != NULL))
+ {
+ for (p = haystack, count = 0; *p != '\0'; ++p)
+ if (*p == needle)
+ count++;
+ }
+
+ return count;
+}
+
+
+
+static void
+migrate_config_session_menu (gpointer key,
+ gpointer value,
+ gpointer channel)
+{
+ const GValue *gvalue = value;
+ const gchar *prop = key;
+
+ /* skip non root plugin properties */
+ if (!G_VALUE_HOLDS_STRING (gvalue)
+ || migrate_config_strchr_count (prop, G_DIR_SEPARATOR) != 2
+ || g_strcmp0 (g_value_get_string (gvalue), "xfsm-logout-plugin") != 0)
+ return;
+
+ /* this plugin never had any properties and matches the default
+ * settings of the new actions plugin */
+ xfconf_channel_set_string (XFCONF_CHANNEL (channel), prop, "actions");
+}
+
+
+
+static gint
+migrate_config_action_48_convert (gint action)
+{
+ switch (action)
+ {
+ case 1: /* ACTION_LOG_OUT_DIALOG */
+ return 3; /* ACTION_TYPE_LOGOUT_DIALOG */
+
+ case 2: /* ACTION_LOG_OUT */
+ return 2; /* ACTION_TYPE_LOGOUT */
+
+ case 3: /* ACTION_LOCK_SCREEN */
+ return 5; /* ACTION_TYPE_LOCK_SCREEN */
+
+ case 4: /* ACTION_SHUT_DOWN */
+ return 9; /* ACTION_TYPE_SHUTDOWN */
+
+ case 5: /* ACTION_RESTART */
+ return 8; /* ACTION_TYPE_RESTART */
+
+ case 6: /* ACTION_SUSPEND */
+ return 7; /* ACTION_TYPE_SUSPEND */
+
+ case 7: /* ACTION_HIBERNATE */
+ return 6; /* ACTION_TYPE_HIBERNATE */
+
+ default: /* ACTION_DISABLED */
+ return -4; /* ACTION_TYPE_SWITCH_USER */
+ }
+}
+
+
+
+static void
+migrate_config_action_48 (gpointer key,
+ gpointer value,
+ gpointer channel)
+{
+ const GValue *gvalue = value;
+ const gchar *prop = key;
+ gchar str[64];
+ gint first_action;
+ gint second_action;
+
+
+ /* skip non root plugin properties */
+ if (!G_VALUE_HOLDS_STRING (gvalue)
+ || migrate_config_strchr_count (prop, G_DIR_SEPARATOR) != 2
+ || g_strcmp0 (g_value_get_string (gvalue), "actions") != 0)
+ return;
+
+ /* read and remove the old properties */
+ g_snprintf (str, sizeof (str), "%s/first-action", prop);
+ first_action = xfconf_channel_get_uint (channel, str, 0) + 1;
+ xfconf_channel_reset_property (channel, str, FALSE);
+
+ g_snprintf (str, sizeof (str), "%s/second-action", prop);
+ second_action = xfconf_channel_get_uint (channel, str, 0);
+ xfconf_channel_reset_property (channel, str, FALSE);
+
+ /* corrections for new plugin */
+ if (first_action == 0)
+ first_action = 1;
+ if (first_action == second_action)
+ second_action = 0;
+
+ /* set appearance to button mode */
+ g_snprintf (str, sizeof (str), "%s/appearance", prop);
+ xfconf_channel_set_uint (channel, str, 0);
+
+ /* set orientation */
+ g_snprintf (str, sizeof (str), "%s/invert-orientation", prop);
+ xfconf_channel_set_bool (channel, str, second_action > 0);
+
+ /* convert the old value to new ones */
+ first_action = migrate_config_action_48_convert (first_action);
+ second_action = migrate_config_action_48_convert (second_action);
+
+ /* set the visible properties */
+ g_snprintf (str, sizeof (str), "%s/items", prop);
+ xfconf_channel_set_array (channel, str,
+ G_TYPE_INT, &first_action,
+ G_TYPE_INT, &second_action,
+ G_TYPE_INVALID);
+}
+
+
+
+gboolean
+migrate_config (XfconfChannel *channel,
+ gint configver,
+ GError **error)
+{
+ GHashTable *plugins;
+
+ plugins = xfconf_channel_get_properties (channel, "/plugins");
+
+ /* migrate plugins to the new actions plugin */
+ if (configver < 1)
+ {
+ /* migrate xfsm-logout-plugin */
+ g_hash_table_foreach (plugins, migrate_config_session_menu, channel);
+
+ /* migrate old action plugins */
+ g_hash_table_foreach (plugins, migrate_config_action_48, channel);
+ }
+
+ return TRUE;
+}
diff --git a/migrate/migrate-46.h b/migrate/migrate-config.h
similarity index 72%
copy from migrate/migrate-46.h
copy to migrate/migrate-config.h
index d75cd7f..4cd3025 100644
--- a/migrate/migrate-46.h
+++ b/migrate/migrate-config.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009-2010 Nick Schermer <nick at xfce.org>
+ * Copyright (C) 2011 Nick Schermer <nick at xfce.org>
*
* 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
@@ -16,18 +16,18 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#ifndef __MIGRATE_46_H__
-#define __MIGRATE_46_H__
+#ifndef __MIGRATE_CONFIG_H__
+#define __MIGRATE_CONFIG_H__
#include <gtk/gtk.h>
G_BEGIN_DECLS
-#define XFCE_46_CONFIG "xfce4" G_DIR_SEPARATOR_S "panel" G_DIR_SEPARATOR_S "panels.xml"
-
-gboolean migrate_46 (const gchar *filename, GError **error);
+gboolean migrate_config (XfconfChannel *channel,
+ gint configver,
+ GError **error);
G_END_DECLS
-#endif /* !__MIGRATE_46_H__ */
+#endif /* !__MIGRATE_CONFIG_H__ */
diff --git a/migrate/migrate-default.c b/migrate/migrate-default.c
index d1babcf..382c858 100644
--- a/migrate/migrate-default.c
+++ b/migrate/migrate-default.c
@@ -158,7 +158,7 @@ migrate_default_start_element_handler (GMarkupParseContext *context,
if (channel_name != NULL)
{
/* open the xfconf channel */
- parser->channel = xfconf_channel_new (channel_name);
+ parser->channel = xfconf_channel_get (channel_name);
}
else
{
@@ -292,10 +292,7 @@ migrate_default_end_element_handler (GMarkupParseContext *context,
if (strcmp (element_name, "channel") == 0)
{
if (G_LIKELY (parser->channel != NULL))
- {
- g_object_unref (G_OBJECT (parser->channel));
- parser->channel = NULL;
- }
+ parser->channel = NULL;
if (parser->path != NULL)
{
diff --git a/panel/panel-application.c b/panel/panel-application.c
index 478e51a..8eecb9e 100644
--- a/panel/panel-application.c
+++ b/panel/panel-application.c
@@ -198,6 +198,7 @@ static void
panel_application_init (PanelApplication *application)
{
GError *error = NULL;
+ gint configver;
application->windows = NULL;
application->dialogs = NULL;
@@ -209,8 +210,9 @@ panel_application_init (PanelApplication *application)
/* get the xfconf channel (singleton) */
application->xfconf = panel_properties_get_channel (G_OBJECT (application));
- /* check if we need to launch the migration application */
- if (!xfconf_channel_has_property (application->xfconf, "/panels"))
+ /* check if we need to migrate configuration */
+ configver = xfconf_channel_get_int (application->xfconf, "/configver", -1);
+ if (G_UNLIKELY (configver < XFCE4_PANEL_CONFIG_VERSION))
{
if (!g_spawn_command_line_sync (MIGRATE_BIN, NULL, NULL, NULL, &error))
{
More information about the Xfce4-commits
mailing list