+
+/* 3.4-compatilibity */
+static gpointer setup_follow(xmlNodePtr node)
+{
+ xmlNodePtr n;
+ Options *o = g_new0(Options, 1);
+ o->send = TRUE;
+ o->follow = TRUE;
+ if ((n = obt_parse_find_node(node, "follow")))
+ o->follow = obt_parse_node_bool(n);
+ return o;
+}
+
+static gpointer setup_go_last_func(xmlNodePtr node)
+{
+ Options *o = g_new0(Options, 1);
+ o->type = LAST;
+ return o;
+}
+
+static gpointer setup_send_last_func(xmlNodePtr node)
+{
+ Options *o = setup_follow(node);
+ o->type = LAST;
+ return o;
+}
+
+static gpointer setup_go_abs_func(xmlNodePtr node)
+{
+ xmlNodePtr n;
+ Options *o = g_new0(Options, 1);
+ o->type = ABSOLUTE;
+ if ((n = obt_parse_find_node(node, "desktop")))
+ o->u.abs.desktop = obt_parse_node_int(n) - 1;
+ else
+ o->u.abs.desktop = screen_desktop;
+ return o;
+}
+
+static gpointer setup_send_abs_func(xmlNodePtr node)
+{
+ xmlNodePtr n;
+ Options *o = setup_follow(node);
+ o->type = ABSOLUTE;
+ if ((n = obt_parse_find_node(node, "desktop")))
+ o->u.abs.desktop = obt_parse_node_int(n) - 1;
+ else
+ o->u.abs.desktop = screen_desktop;
+ return o;
+}
+
+static void setup_rel(Options *o, xmlNodePtr node, gboolean lin, ObDirection dir)
+{
+ xmlNodePtr n;
+
+ o->type = RELATIVE;
+ o->u.rel.linear = lin;
+ o->u.rel.dir = dir;
+ o->u.rel.wrap = TRUE;
+
+ if ((n = obt_parse_find_node(node, "wrap")))
+ o->u.rel.wrap = obt_parse_node_bool(n);
+}
+
+static gpointer setup_go_next_func(xmlNodePtr node)
+{
+ Options *o = g_new0(Options, 1);
+ setup_rel(o, node, TRUE, OB_DIRECTION_EAST);
+ return o;
+}
+
+static gpointer setup_send_next_func(xmlNodePtr node)
+{
+ Options *o = setup_follow(node);
+ setup_rel(o, node, TRUE, OB_DIRECTION_EAST);
+ return o;
+}
+
+static gpointer setup_go_prev_func(xmlNodePtr node)
+{
+ Options *o = g_new0(Options, 1);
+ setup_rel(o, node, TRUE, OB_DIRECTION_WEST);
+ return o;
+}
+
+static gpointer setup_send_prev_func(xmlNodePtr node)
+{
+ Options *o = setup_follow(node);
+ setup_rel(o, node, TRUE, OB_DIRECTION_WEST);
+ return o;
+}
+
+static gpointer setup_go_left_func(xmlNodePtr node)
+{
+ Options *o = g_new0(Options, 1);
+ setup_rel(o, node, FALSE, OB_DIRECTION_WEST);
+ return o;
+}
+
+static gpointer setup_send_left_func(xmlNodePtr node)
+{
+ Options *o = setup_follow(node);
+ setup_rel(o, node, FALSE, OB_DIRECTION_WEST);
+ return o;
+}
+
+static gpointer setup_go_right_func(xmlNodePtr node)
+{
+ Options *o = g_new0(Options, 1);
+ setup_rel(o, node, FALSE, OB_DIRECTION_EAST);
+ return o;
+}
+
+static gpointer setup_send_right_func(xmlNodePtr node)
+{
+ Options *o = setup_follow(node);
+ setup_rel(o, node, FALSE, OB_DIRECTION_EAST);
+ return o;
+}
+
+static gpointer setup_go_up_func(xmlNodePtr node)
+{
+ Options *o = g_new0(Options, 1);
+ setup_rel(o, node, FALSE, OB_DIRECTION_NORTH);
+ return o;
+}
+
+static gpointer setup_send_up_func(xmlNodePtr node)
+{
+ Options *o = setup_follow(node);
+ setup_rel(o, node, FALSE, OB_DIRECTION_NORTH);
+ return o;
+}
+
+static gpointer setup_go_down_func(xmlNodePtr node)
+{
+ Options *o = g_new0(Options, 1);
+ setup_rel(o, node, FALSE, OB_DIRECTION_SOUTH);
+ return o;
+}
+
+static gpointer setup_send_down_func(xmlNodePtr node)
+{
+ Options *o = setup_follow(node);
+ setup_rel(o, node, FALSE, OB_DIRECTION_SOUTH);
+ return o;
+}