[Xfce4-commits] <xfce4-panel:devel> Initial import of the migration application.

Nick Schermer noreply at xfce.org
Mon Oct 26 21:18:08 CET 2009


Updating branch refs/heads/devel
         to f89fc7c555ee28f978ae3562603bfc3c7334fe02 (commit)
       from ba45b6bd0649bb5ff88888e555a213b44a2263f9 (commit)

commit f89fc7c555ee28f978ae3562603bfc3c7334fe02
Author: Nick Schermer <nick at xfce.org>
Date:   Mon Oct 26 21:14:22 2009 +0100

    Initial import of the migration application.
    
    This application will carefully migrate the old panel
    configuration to xfconf. Plugins and their setting are
    not ready yet.

 Makefile.am                                   |    5 +-
 configure.in.in                               |    1 +
 migrate/Makefile.am                           |   36 ++
 migrate/main.c                                |   84 +++
 migrate/migrate_46.c                          |  739 +++++++++++++++++++++++++
 panel/panel-dialogs.h => migrate/migrate_46.h |   14 +-
 panel/panel-application.c                     |    6 +
 7 files changed, 876 insertions(+), 9 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 2d18720..31fb5a4 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -4,8 +4,9 @@ SUBDIRS = \
 	common \
 	panel \
 	plugins \
-	po \
-	wrapper
+	wrapper \
+	migrate \
+	po
 
 distclean-local:
 	rm -rf *.spec *.cache *~
diff --git a/configure.in.in b/configure.in.in
index 893155f..334a9ec 100644
--- a/configure.in.in
+++ b/configure.in.in
@@ -170,6 +170,7 @@ Makefile
 common/Makefile
 libxfce4panel/Makefile
 libxfce4panel/libxfce4panel-1.0.pc
+migrate/Makefile
 panel/Makefile
 wrapper/Makefile
 plugins/Makefile
diff --git a/migrate/Makefile.am b/migrate/Makefile.am
new file mode 100644
index 0000000..88e0f81
--- /dev/null
+++ b/migrate/Makefile.am
@@ -0,0 +1,36 @@
+
+INCLUDES = \
+	-I$(top_srcdir) \
+	-I$(top_builddir) \
+	-DG_LOG_DOMAIN=\"xfce4-panel-migrate\" \
+	-DDATADIR=\"$(datadir)\" \
+	-DLIBDIR=\"$(libdir)/xfce4\" \
+	-DLIBEXECDIR=\"$(libexecdir)/xfce4\" \
+	-DSYSCONFDIR=\"$(sysconfdir)\" \
+	-DPACKAGE_LOCALE_DIR=\"$(localedir)\" \
+	$(PLATFORM_CPPFLAGS)
+
+libexec_PROGRAMS = \
+	xfce4-panel-migrate
+
+xfce4_panel_migrate_SOURCES = \
+	main.c \
+	migrate_46.c \
+	migrate_46.h
+
+xfce4_panel_migrate_CFLAGS = \
+	$(GTK_CFLAGS) \
+	$(XFCONF_CFLAGS) \
+	$(LIBXFCE4UTIL_CFLAGS) \
+	$(PLATFORM_CFLAGS)
+
+xfce4_panel_migrate_LDFLAGS = \
+	-no-undefined \
+	$(PLATFORM_LDFLAGS)
+
+xfce4_panel_migrate_LDADD = \
+	$(GTK_LIBS) \
+	$(XFCONF_LIBS) \
+	$(LIBXFCE4UTIL_LIBS)
+
+# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:
diff --git a/migrate/main.c b/migrate/main.c
new file mode 100644
index 0000000..f7c93ee
--- /dev/null
+++ b/migrate/main.c
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2009 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 Foundation; 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 Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_STDIO_H
+#include <stdio.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 <libxfce4util/libxfce4util.h>
+
+#include <migrate/migrate_46.h>
+
+
+
+gint
+main (gint argc, gchar **argv)
+{
+  gchar         *file;
+  XfconfChannel *channel;
+  GError        *error = NULL;
+
+  /* set translation domain */
+  xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8");
+
+#ifndef NDEBUG
+  /* terminate the program on warnings and critical messages */
+  g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING);
+#endif
+
+  /* initialize gtk */
+  gtk_init (&argc, &argv);
+
+  if (!xfconf_init (&error))
+    {
+      g_critical ("%s", error->message);
+      g_error_free (error);
+      return EXIT_FAILURE;
+    }
+
+  channel = xfconf_channel_get ("panel-test");
+
+  file = xfce_resource_lookup (XFCE_RESOURCE_CONFIG, XFCE_46_CONFIG);
+  if (file != NULL)
+    {
+      g_message ("found old config file: %s", file);
+      if (!migrate_46 (file, channel, &error))
+        {
+          g_critical ("%s", error->message);
+          g_error_free (error);
+        }
+    }
+
+  g_free (file);
+
+  xfconf_shutdown ();
+
+  return EXIT_SUCCESS;
+}
diff --git a/migrate/migrate_46.c b/migrate/migrate_46.c
new file mode 100644
index 0000000..ea0113c
--- /dev/null
+++ b/migrate/migrate_46.c
@@ -0,0 +1,739 @@
+/*
+ * Copyright (C) 2009 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 <libxfce4util/libxfce4util.h>
+#include <migrate/migrate_46.h>
+
+
+typedef enum
+{
+  START,
+  PANELS,
+  PANEL,
+  PROPERTIES,
+  ITEMS,
+  UNKNOWN
+}
+ParserState;
+
+typedef enum
+{
+  /* no snapping */
+  SNAP_POSITION_NONE, /* snapping */
+
+  /* right edge */
+  SNAP_POSITION_E,    /* right */
+  SNAP_POSITION_NE,   /* top right */
+  SNAP_POSITION_EC,   /* right center */
+  SNAP_POSITION_SE,   /* bottom right */
+
+  /* left edge */
+  SNAP_POSITION_W,    /* left */
+  SNAP_POSITION_NW,   /* top left */
+  SNAP_POSITION_WC,   /* left center */
+  SNAP_POSITION_SW,   /* bottom left */
+
+  /* top and bottom */
+  SNAP_POSITION_NC,   /* top center */
+  SNAP_POSITION_SC,   /* bottom center */
+  SNAP_POSITION_N,    /* top */
+  SNAP_POSITION_S,    /* bottom */
+}
+SnapPosition;
+
+typedef enum
+{
+  XFCE_SCREEN_POSITION_NONE,
+
+  /* top */
+  XFCE_SCREEN_POSITION_NW_H,       /* North West Horizontal */
+  XFCE_SCREEN_POSITION_N,          /* North                 */
+  XFCE_SCREEN_POSITION_NE_H,       /* North East Horizontal */
+
+  /* left */
+  XFCE_SCREEN_POSITION_NW_V,       /* North West Vertical   */
+  XFCE_SCREEN_POSITION_W,          /* West                  */
+  XFCE_SCREEN_POSITION_SW_V,       /* South West Vertical   */
+
+  /* right */
+  XFCE_SCREEN_POSITION_NE_V,       /* North East Vertical   */
+  XFCE_SCREEN_POSITION_E,          /* East                  */
+  XFCE_SCREEN_POSITION_SE_V,       /* South East Vertical   */
+
+  /* bottom */
+  XFCE_SCREEN_POSITION_SW_H,       /* South West Horizontal */
+  XFCE_SCREEN_POSITION_S,          /* South                 */
+  XFCE_SCREEN_POSITION_SE_H,       /* South East Horizontal */
+
+  /* floating */
+  XFCE_SCREEN_POSITION_FLOATING_H, /* Floating Horizontal */
+  XFCE_SCREEN_POSITION_FLOATING_V  /* Floating Vertical */
+}
+ScreenPosition;
+
+typedef struct
+{
+  ParserState     state;
+  guint           plugin_id_counter;
+  guint           panel_id_counter;
+  XfconfChannel  *channel;
+
+  gint            panel_yoffset;
+  gint            panel_xoffset;
+  ScreenPosition  panel_screen_position;
+  guint           panel_transparency;
+  gboolean        panel_activetrans;
+}
+ConfigParser;
+
+
+
+static void
+migrate_46_panel_screen_position (ScreenPosition  screen_position,
+                                  SnapPosition   *snap_position,
+                                  gboolean       *horizontal)
+{
+  /* defaults */
+  *horizontal = FALSE;
+  *snap_position = SNAP_POSITION_NONE;
+
+  switch (screen_position)
+    {
+    /* top */
+    case XFCE_SCREEN_POSITION_NW_H:
+      *horizontal = TRUE;
+      *snap_position = SNAP_POSITION_NW;
+      break;
+
+    case XFCE_SCREEN_POSITION_N:
+      *horizontal = TRUE;
+      *snap_position = SNAP_POSITION_NC;
+      break;
+
+    case XFCE_SCREEN_POSITION_NE_H:
+      *horizontal = TRUE;
+      *snap_position = SNAP_POSITION_NE;
+      break;
+
+    /* left */
+    case XFCE_SCREEN_POSITION_NW_V:
+      *snap_position = SNAP_POSITION_NW;
+      break;
+
+    case XFCE_SCREEN_POSITION_W:
+      *snap_position = SNAP_POSITION_WC;
+      break;
+
+    case XFCE_SCREEN_POSITION_SW_V:
+      *snap_position = SNAP_POSITION_SW;
+      break;
+
+    /* right */
+    case XFCE_SCREEN_POSITION_NE_V:
+      *snap_position = SNAP_POSITION_NE;
+      break;
+
+    case XFCE_SCREEN_POSITION_E:
+      *snap_position = SNAP_POSITION_EC;
+      break;
+
+    case XFCE_SCREEN_POSITION_SE_V:
+      *snap_position = SNAP_POSITION_SE;
+      break;
+
+    /* bottom */
+    case XFCE_SCREEN_POSITION_SW_H:
+      *horizontal = TRUE;
+      *snap_position = SNAP_POSITION_SW;
+      break;
+
+    case XFCE_SCREEN_POSITION_S:
+      *horizontal = TRUE;
+      *snap_position = SNAP_POSITION_SC;
+      break;
+
+    case XFCE_SCREEN_POSITION_SE_H:
+      *horizontal = TRUE;
+      *snap_position = SNAP_POSITION_SE;
+      break;
+
+    /* floating */
+    case XFCE_SCREEN_POSITION_FLOATING_H:
+      *horizontal = TRUE;
+      break;
+
+    default:
+      break;
+    }
+}
+
+
+
+static void
+migrate_46_panel_set_property (ConfigParser  *parser,
+                               const gchar   *property_name,
+                               const gchar   *value,
+                               GError       **error)
+{
+  gchar prop[128];
+
+  if (strcmp (property_name, "size") == 0)
+    {
+      g_snprintf (prop, sizeof (prop), "/panels/panel-%u/size", parser->panel_id_counter);
+      xfconf_channel_set_uint (parser->channel, prop, CLAMP (atoi (value), 16, 128));
+    }
+  else if (strcmp (property_name, "fullwidth") == 0)
+    {
+      g_snprintf (prop, sizeof (prop), "/panels/panel-%u/length", parser->panel_id_counter);
+      xfconf_channel_set_uint (parser->channel, prop, (atoi (value) != 0) ? 100 : 0);
+    }
+  else if (strcmp (property_name, "screen-position") == 0)
+    {
+      parser->panel_screen_position = CLAMP (atoi (value),
+                                             XFCE_SCREEN_POSITION_NONE,
+                                             XFCE_SCREEN_POSITION_FLOATING_V);
+    }
+  else if (strcmp (property_name, "xoffset") == 0)
+    {
+      parser->panel_xoffset = MAX (0, atoi (value) / 2);
+    }
+  else if (strcmp (property_name, "yoffset") == 0)
+    {
+      parser->panel_yoffset = MAX (0, atoi (value) / 2);
+    }
+  else if (strcmp (property_name, "monitor") == 0)
+    {
+      /* TODO */
+    }
+  else if (strcmp (property_name, "handlestyle") == 0)
+    {
+      g_snprintf (prop, sizeof (prop), "/panels/panel-%u/locked", parser->panel_id_counter);
+      xfconf_channel_set_bool (parser->channel, prop, atoi (value) == 0);
+    }
+  else if (strcmp (property_name, "autohide") == 0)
+    {
+      g_snprintf (prop, sizeof (prop), "/panels/panel-%u/autohide", parser->panel_id_counter);
+      xfconf_channel_set_bool (parser->channel, prop, (atoi (value) == 1));
+    }
+  else if (strcmp (property_name, "transparency") == 0)
+    {
+      parser->panel_transparency = CLAMP (atoi (value), 0, 100);
+    }
+  else if (strcmp (property_name, "activetrans") == 0)
+    {
+      parser->panel_activetrans = (atoi (value) == 1);
+    }
+  else
+    {
+      g_set_error (error, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, G_MARKUP_ERROR,
+                   "Unknown property \"%s\" in #%d \"panel\" element",
+                   property_name, parser->panel_id_counter);
+    }
+}
+
+
+
+static void
+migrate_46_plugin_actions (XfconfChannel *channel,
+                           XfceRc        *rc)
+{
+  /* enum: ACTION_QUIT,
+   *       ACTION_LOCK,
+   *       ACTION_QUIT_LOCK
+   *
+   * xfce_rc_write_int_entry (rc, "type", action->type);
+   * xfce_rc_write_int_entry (rc, "orientation", action->orientation == GTK_ORIENTATION_HORIZONTAL ? 0 : 1);
+   */
+}
+
+
+
+static void
+migrate_46_plugin_clock (XfconfChannel *channel,
+                         XfceRc        *rc)
+{
+  /* enum: XFCE_CLOCK_ANALOG,
+   *       XFCE_CLOCK_BINARY,
+   *       XFCE_CLOCK_DIGITAL,
+   *       XFCE_CLOCK_LCD
+   *
+   * xfce_rc_write_entry (rc, "DigitalFormat", plugin->digital_format);
+   * xfce_rc_write_entry (rc, "TooltipFormat", plugin->tooltip_format);
+   * xfce_rc_write_int_entry (rc, "ClockType", plugin->mode);
+   * xfce_rc_write_bool_entry (rc, "ShowFrame", plugin->show_frame);
+   * xfce_rc_write_bool_entry (rc, "ShowSeconds", plugin->show_seconds);
+   * xfce_rc_write_bool_entry (rc, "ShowMilitary", plugin->show_military);
+   * xfce_rc_write_bool_entry (rc, "ShowMeridiem", plugin->show_meridiem);
+   * xfce_rc_write_bool_entry (rc, "TrueBinary", plugin->true_binary);
+   * xfce_rc_write_bool_entry (rc, "FlashSeparators", plugin->flash_separators);
+   */
+}
+
+
+
+static void
+migrate_46_plugin_iconbox (XfconfChannel *channel,
+                           XfceRc        *rc)
+{
+  /* xfce_rc_write_int_entry (rc, "only_hidden", iconbox->only_hidden);
+   * xfce_rc_write_int_entry (rc, "all_workspaces", iconbox->all_workspaces);
+   * xfce_rc_write_int_entry (rc, "expand", iconbox->expand);
+   */
+}
+
+
+
+static void
+migrate_46_plugin_launcher (XfconfChannel *channel,
+                            XfceRc        *rc)
+{
+  /* xfce_rc_set_group (rc, "Global");
+   * xfce_rc_write_bool_entry (rc, "MoveFirst", launcher->move_first);
+   * xfce_rc_write_int_entry (rc, "ArrowPosition", launcher->arrow_position);
+   *
+   * xfce_rc_set_group (rc, Entry %d);
+   * xfce_rc_write_entry (rc, "Name", entry->name);
+   * xfce_rc_write_entry (rc, "Comment", entry->comment);
+   * xfce_rc_write_entry (rc, "Icon", entry->icon);
+   * xfce_rc_write_entry (rc, "Exec", entry->exec);
+   * xfce_rc_write_entry (rc, "Path", entry->path);
+   * xfce_rc_write_bool_entry (rc, "Terminal", entry->terminal);
+   * xfce_rc_write_bool_entry (rc, "StartupNotify", entry->startup);
+   */
+}
+
+
+
+static void
+migrate_46_plugin_pager (XfconfChannel *channel,
+                         XfceRc        *rc)
+{
+  /* xfce_rc_write_int_entry (rc, "rows", pager->rows);
+   * xfce_rc_write_bool_entry (rc, "scrolling", pager->scrolling);
+   * xfce_rc_write_bool_entry (rc, "show-names", pager->show_names);
+   */
+}
+
+
+
+static void
+migrate_46_plugin_separator (XfconfChannel *channel,
+                             XfceRc        *rc)
+{
+  /* enum: SEP_SPACE,
+   *       SEP_EXPAND,
+   *       SEP_LINE,
+   *       SEP_HANDLE,
+   *       SEP_DOTS
+   * xfce_rc_write_int_entry (rc, "separator-type", sep->type);
+   */
+}
+
+
+
+static void
+migrate_46_plugin_showdesktop (XfconfChannel *channel,
+                               XfceRc        *rc)
+{
+}
+
+
+
+static void
+migrate_46_plugin_systray (XfconfChannel *channel,
+                           XfceRc        *rc)
+{
+  /* xfce_rc_set_group (rc, "Global");
+   * xfce_rc_write_bool_entry (rc, "ShowFrame", plugin->show_frame);
+   * xfce_rc_write_int_entry (rc, "Rows", ...);
+   *
+   * xfce_rc_set_group (rc, "Applications");
+   * xfce_rc_write_bool_entry (rc, appname, hidden);
+   */
+}
+
+
+
+static void
+migrate_46_plugin_tasklist (XfconfChannel *channel,
+                            XfceRc        *rc)
+{
+  /* xfce_rc_write_int_entry (rc, "grouping", tasklist->grouping);
+   * xfce_rc_write_int_entry (rc, "width", tasklist->width);
+   * xfce_rc_write_bool_entry (rc, "all_workspaces", tasklist->all_workspaces);
+   * xfce_rc_write_bool_entry (rc, "expand", tasklist->expand);
+   * xfce_rc_write_bool_entry (rc, "flat_buttons", tasklist->flat_buttons);
+   * xfce_rc_write_bool_entry (rc, "show_handles", tasklist->show_handles);
+   * xfce_rc_write_bool_entry (rc, "fixed_width", tasklist->fixed_width);
+   */
+}
+
+
+
+static void
+migrate_46_plugin_windowlist (XfconfChannel *channel,
+                              XfceRc        *rc)
+{
+  /* enum: ICON_BUTTON
+   *       ARROW_BUTTON
+   * xfce_rc_write_int_entry (rc, "button_layout", ...);
+   *
+   * enum: DISABLED
+   *       OTHER_WORKSPACES
+   *       ALL_WORKSPACES
+   * xfce_rc_write_int_entry (rc, "urgency_notify", ...
+   *
+   * xfce_rc_write_bool_entry (rc, "show_all_workspaces", wl->show_all_workspaces);
+   * xfce_rc_write_bool_entry (rc, "show_window_icons", wl->show_window_icons);
+   * xfce_rc_write_bool_entry (rc, "show_workspace_actions", wl->show_workspace_actions);
+   */
+}
+
+
+
+static void
+migrate_46_panel_add_plugin (ConfigParser  *parser,
+                             const gchar   *name,
+                             const gchar   *id,
+                             GError       **error)
+{
+  XfconfChannel *channel;
+  gchar          base[256];
+  XfceRc        *rc;
+
+  /* open a panel with the propert base for the plugin */
+  g_snprintf (base, sizeof (base), "/plugins/plugin-%d", parser->plugin_id_counter);
+  channel = xfconf_channel_new_with_property_base ("panel-test", base);
+
+  /* open the old rc file of the plugin */
+  g_snprintf (base, sizeof (base), "xfce4" G_DIR_SEPARATOR_S
+             "panel" G_DIR_SEPARATOR_S "%s-%s.rc", name, id);
+  rc = xfce_rc_config_open (XFCE_RESOURCE_CONFIG, base, TRUE);
+
+  if (strcmp (name, "actions") == 0)
+    {
+      if (G_LIKELY (rc != NULL))
+        migrate_46_plugin_actions (channel, rc);
+    }
+  else if (strcmp (name, "clock") == 0)
+    {
+      if (G_LIKELY (rc != NULL))
+        migrate_46_plugin_clock (channel, rc);
+    }
+  else if (strcmp (name, "iconbox") == 0)
+    {
+      if (G_LIKELY (rc != NULL))
+        migrate_46_plugin_iconbox (channel, rc);
+    }
+  else if (strcmp (name, "launcher") == 0)
+    {
+      if (G_LIKELY (rc != NULL))
+        migrate_46_plugin_launcher (channel, rc);
+    }
+  else if (strcmp (name, "pager") == 0)
+    {
+      if (G_LIKELY (rc != NULL))
+        migrate_46_plugin_pager (channel, rc);
+    }
+  else if (strcmp (name, "separator") == 0)
+    {
+      if (G_LIKELY (rc != NULL))
+        migrate_46_plugin_separator (channel, rc);
+    }
+  else if (strcmp (name, "showdesktop") == 0)
+    {
+      if (G_LIKELY (rc != NULL))
+        migrate_46_plugin_showdesktop (channel, rc);
+    }
+  else if (strcmp (name, "systray") == 0)
+    {
+      if (G_LIKELY (rc != NULL))
+        migrate_46_plugin_systray (channel, rc);
+    }
+  else if (strcmp (name, "tasklist") == 0)
+    {
+      if (G_LIKELY (rc != NULL))
+        migrate_46_plugin_tasklist (channel, rc);
+    }
+  else if (strcmp (name, "windowlist") == 0)
+    {
+      if (G_LIKELY (rc != NULL))
+        migrate_46_plugin_windowlist (channel, rc);
+    }
+  else
+    {
+      /* handle other "external" plugins */
+    }
+
+  if (G_LIKELY (rc != NULL))
+    xfce_rc_close (rc);
+
+  g_object_unref (G_OBJECT (channel));
+}
+
+
+
+static void
+migrate_46_start_element_handler (GMarkupParseContext  *context,
+                                  const gchar          *element_name,
+                                  const gchar         **attribute_names,
+                                  const gchar         **attribute_values,
+                                  gpointer              user_data,
+                                  GError              **error)
+{
+  ConfigParser *parser = user_data;
+  guint         i;
+  const gchar  *name, *id, *value;
+
+  g_return_if_fail (XFCONF_IS_CHANNEL (parser->channel));
+
+  switch (parser->state)
+    {
+    case START:
+      if (strcmp (element_name, "panels") == 0)
+        parser->state = PANELS;
+      break;
+
+    case PANELS:
+      if (strcmp (element_name, "panel") == 0)
+        {
+          parser->state = PANEL;
+
+          /* set defaults */
+          parser->panel_screen_position = XFCE_SCREEN_POSITION_NONE;
+          parser->panel_xoffset = 100;
+          parser->panel_yoffset = 100;
+          parser->panel_transparency = 100;
+          parser->panel_activetrans = FALSE;
+        }
+      break;
+
+    case PANEL:
+      if (strcmp (element_name, "properties") == 0)
+        parser->state = PROPERTIES;
+      else if (strcmp (element_name, "items") == 0)
+        parser->state = ITEMS;
+      break;
+
+    case PROPERTIES:
+      if (strcmp (element_name, "property") == 0)
+        {
+          name = NULL;
+          value = NULL;
+
+          for (i = 0; attribute_names[i] != NULL; i++)
+            {
+              if (strcmp (attribute_names[i], "name") == 0)
+                name = attribute_values[i];
+              else if (strcmp (attribute_names[i], "value") == 0)
+                value = attribute_values[i];
+            }
+
+          if (G_LIKELY (name != NULL && value != NULL))
+            {
+              migrate_46_panel_set_property (parser, name, value, error);
+            }
+          else
+            {
+              g_set_error (error, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, G_MARKUP_ERROR,
+                          "Unknown property name (%s) or value (%s) in element",
+                           name, value);
+            }
+        }
+      break;
+
+    case ITEMS:
+      if (strcmp (element_name, "item") == 0)
+        {
+          name = id = NULL;
+
+          for (i = 0; attribute_names[i] != NULL; i++)
+            {
+              if (strcmp (attribute_names[i], "name") == 0)
+                name = attribute_values[i];
+              else if (strcmp (attribute_names[i], "id") == 0)
+                id = attribute_values[i];
+            }
+
+          if (G_LIKELY (name != NULL && id != NULL))
+            {
+              parser->plugin_id_counter++;
+              migrate_46_panel_add_plugin (parser, name, id, error);
+            }
+          else
+            {
+              g_set_error (error, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, G_MARKUP_ERROR,
+                          "Unknown item name (%s) or id (%s) in element",
+                           name, id);
+            }
+        }
+      break;
+
+    default:
+      g_set_error (error, G_MARKUP_ERROR_UNKNOWN_ELEMENT, G_MARKUP_ERROR,
+                   "Unknown start element \"%s\"", element_name);
+      break;
+    }
+}
+
+
+
+static void
+migrate_46_end_element_handler (GMarkupParseContext  *context,
+                                const gchar          *element_name,
+                                gpointer              user_data,
+                                GError              **error)
+{
+  ConfigParser *parser = user_data;
+  SnapPosition  snap_position;
+  gboolean      horizontal;
+  gchar         prop[128];
+  gchar        *position;
+
+  g_return_if_fail (XFCONF_IS_CHANNEL (parser->channel));
+
+  switch (parser->state)
+    {
+    case START:
+      g_set_error (error, G_MARKUP_ERROR_PARSE, G_MARKUP_ERROR,
+                   "Unexpected end element \"%s\"", element_name);
+      break;
+
+    case PANEL:
+      if (strcmp ("panel", element_name) == 0)
+        {
+          parser->state = PANELS;
+
+          /* translate the old screen position to a snap position and orientation */
+          migrate_46_panel_screen_position (parser->panel_screen_position,
+                                            &snap_position, &horizontal);
+
+          g_snprintf (prop, sizeof (prop), "/panels/panel-%u/horizontal", parser->panel_id_counter);
+          xfconf_channel_set_bool (parser->channel, prop, horizontal);
+
+          g_snprintf (prop, sizeof (prop), "/panels/panel-%u/position", parser->panel_id_counter);
+          position = g_strdup_printf ("p=%d;x=%d;y=%d",
+                                      snap_position,
+                                      parser->panel_xoffset,
+                                      parser->panel_yoffset);
+          xfconf_channel_set_string (parser->channel, prop, position);
+          g_free (position);
+
+          /* set transparency */
+          g_snprintf (prop, sizeof (prop), "/panels/panel-%u/leave-opacity", parser->panel_id_counter);
+          xfconf_channel_set_uint (parser->channel, prop,  parser->panel_transparency);
+
+          g_snprintf (prop, sizeof (prop), "/panels/panel-%u/enter-opacity", parser->panel_id_counter);
+          xfconf_channel_set_uint (parser->channel, prop,  parser->panel_activetrans ?
+                                   parser->panel_transparency : 100);
+
+          /* prepare for the next panel */
+          parser->panel_id_counter++;
+        }
+      break;
+
+    case PANELS:
+      if (strcmp ("panels", element_name) == 0)
+        {
+          parser->state = START;
+          xfconf_channel_set_uint (parser->channel, "/panels", parser->panel_id_counter);
+        }
+      break;
+
+    case PROPERTIES:
+      if (strcmp ("properties", element_name) == 0)
+        parser->state = PANEL;
+      break;
+
+    case ITEMS:
+      if (strcmp ("items", element_name) == 0)
+        parser->state = PANEL;
+      break;
+
+    default:
+      g_set_error (error, G_MARKUP_ERROR_UNKNOWN_ELEMENT, G_MARKUP_ERROR,
+                   "Unknown end element \"%s\"", element_name);
+      break;
+    }
+}
+
+
+
+static GMarkupParser markup_parser =
+{
+  migrate_46_start_element_handler,
+  migrate_46_end_element_handler,
+  NULL,
+  NULL,
+  NULL
+};
+
+
+
+gboolean
+migrate_46 (const gchar    *filename,
+            XfconfChannel  *channel,
+            GError        **error)
+{
+  gsize                length;
+  gchar               *contents;
+  GMarkupParseContext *context;
+  ConfigParser        *parser;
+  gboolean             succeed = FALSE;
+
+  g_return_val_if_fail (filename != NULL, FALSE);
+  g_return_val_if_fail (XFCONF_IS_CHANNEL (channel), FALSE);
+  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+  if (!g_file_get_contents (filename, &contents, &length, error))
+    return FALSE;
+
+  parser = g_slice_new0 (ConfigParser);
+  parser->state = START;
+  parser->plugin_id_counter = 0;
+  parser->panel_id_counter = 0;
+  parser->channel = channel;
+
+  context = g_markup_parse_context_new (&markup_parser, 0, parser, NULL);
+
+  if (g_markup_parse_context_parse (context, contents, length, error))
+    {
+      /* check if the entire file is parsed */
+      if (g_markup_parse_context_end_parse (context, error))
+        succeed = TRUE;
+    }
+
+  g_free (contents);
+  g_markup_parse_context_free (context);
+  g_slice_free (ConfigParser, parser);
+
+  return succeed;
+}
diff --git a/panel/panel-dialogs.h b/migrate/migrate_46.h
similarity index 69%
copy from panel/panel-dialogs.h
copy to migrate/migrate_46.h
index ff1f393..1b0fc2f 100644
--- a/panel/panel-dialogs.h
+++ b/migrate/migrate_46.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2009 Nick Schermer <nick at xfce.org>
+ * Copyright (C) 2009 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,19 +16,19 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __PANEL_DIALOGS_H__
-#define __PANEL_DIALOGS_H__
+#ifndef __XFCE_46_PARSER_H__
+#define __XFCE_46_PARSER_H__
 
 #include <gtk/gtk.h>
-#include <panel/panel-application.h>
+#include <xfconf/xfconf.h>
 
 G_BEGIN_DECLS
 
-void panel_dialogs_show_about   (void);
+#define XFCE_46_CONFIG "xfce4" G_DIR_SEPARATOR_S "panel" G_DIR_SEPARATOR_S "panels.xml"
 
-gint panel_dialogs_choose_panel (PanelApplication *application);
+gboolean migrate_46 (const gchar *filename, XfconfChannel *channel, GError **error);
 
 G_END_DECLS
 
-#endif /* !__PANEL_DIALOGS_H__ */
+#endif /* !__XFCE_46_PARSER_H__ */
 
diff --git a/panel/panel-application.c b/panel/panel-application.c
index 2065be1..864bdb3 100644
--- a/panel/panel-application.c
+++ b/panel/panel-application.c
@@ -184,6 +184,12 @@ panel_application_init (PanelApplication *application)
   /* get the xfconf channel (singleton) */
   application->xfconf = panel_properties_get_channel (G_OBJECT (application));
 
+  /* check for any configuration */
+  if (!xfconf_channel_has_property (application->xfconf, "/panels"))
+    {
+      /* here we're going to spawn the migration utility */
+    }
+
   /* check if we need to force all plugins to run external */
   if (xfconf_channel_get_bool (application->xfconf, "/force-all-external", FALSE))
     panel_module_factory_force_all_external ();



More information about the Xfce4-commits mailing list