summaryrefslogtreecommitdiff
path: root/src/core/schema-bindings.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/schema-bindings.c')
-rw-r--r--src/core/schema-bindings.c195
1 files changed, 195 insertions, 0 deletions
diff --git a/src/core/schema-bindings.c b/src/core/schema-bindings.c
new file mode 100644
index 00000000..2f1da821
--- /dev/null
+++ b/src/core/schema-bindings.c
@@ -0,0 +1,195 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+/*
+ * Copyright (C) 2008 Thomas Thurman
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+/** \file Schema bindings generator.
+ *
+ * This program simply takes the items given in the binding list in
+ * all-keybindings.h and turns them into a portion of
+ * the MateConf .schemas file.
+ *
+ * FIXME: also need to make 50-marco-desktop-key.xml
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <glib.h>
+#include "config.h"
+
+#define _(x) x
+
+static void single_stanza (gboolean is_window, const char *name,
+ const char *default_value,
+ gboolean can_reverse,
+ const char *description);
+
+char *about_keybindings, *about_reversible_keybindings;
+
+char *source_filename, *target_filename;
+FILE *source_file, *target_file;
+
+static void
+single_stanza (gboolean is_window, const char *name,
+ const char *default_value,
+ gboolean can_reverse,
+ const char *description)
+{
+ char *keybinding_type = is_window? "window": "global";
+ char *escaped_default_value, *escaped_description;
+
+ if (description==NULL)
+ return; /* it must be undocumented, so it can't go in this table */
+
+ escaped_description = g_markup_escape_text (description, -1);
+ escaped_default_value = default_value==NULL? "disabled":
+ g_markup_escape_text (default_value, -1);
+
+ fprintf (target_file, " <schema>\n");
+ fprintf (target_file, " <key>/schemas/apps/marco/%s_keybindings/%s</key>\n",
+ keybinding_type, name);
+ fprintf (target_file, " <applyto>/apps/marco/%s_keybindings/%s</applyto>\n",
+ keybinding_type, name);
+ fprintf (target_file, " <owner>marco</owner>\n");
+ fprintf (target_file, " <type>string</type>\n");
+ fprintf (target_file, " <default>%s</default>\n", escaped_default_value);
+
+ fprintf (target_file, " <locale name=\"C\">\n");
+ fprintf (target_file, " <short>%s</short>\n", description);
+ fprintf (target_file, " <long>%s</long>\n",
+ can_reverse? about_reversible_keybindings:
+ about_keybindings);
+ fprintf (target_file, " </locale>\n");
+ fprintf (target_file, " </schema>\n\n");
+
+ g_free (escaped_description);
+
+ if (default_value!=NULL)
+ g_free (escaped_default_value);
+}
+
+static void produce_bindings ();
+
+static void
+produce_bindings ()
+{
+ /* 10240 is ridiculous overkill; we're writing the input file and
+ * the lines are always 80 chars or less.
+ */
+ char buffer[10240];
+
+ source_file = fopen(source_filename, "r");
+
+ if (!source_file)
+ {
+ g_error ("Cannot compile without %s: %s\n",
+ source_filename, strerror (errno));
+ }
+
+ target_file = fopen(target_filename, "w");
+
+ if (!target_file)
+ {
+ g_error ("Cannot create %s: %s\n",
+ target_filename, strerror (errno));
+ }
+
+ while (fgets (buffer, sizeof (buffer), source_file))
+ {
+ if (strstr (buffer, "<!-- GENERATED -->"))
+ break;
+
+ fprintf (target_file, "%s", buffer);
+ }
+
+ if (!feof (source_file))
+ {
+#define keybind(name, handler, param, flags, stroke, description) \
+ single_stanza ( \
+ flags & BINDING_PER_WINDOW, \
+ #name, \
+ stroke, \
+ flags & BINDING_REVERSES, \
+ description);
+#include "all-keybindings.h"
+#undef keybind
+ }
+
+ while (fgets (buffer, sizeof (buffer), source_file))
+ fprintf (target_file, "%s", buffer);
+
+ if (fclose (source_file)!=0)
+ {
+ g_error ("Cannot close %s: %s\n",
+ source_filename, strerror (errno));
+ }
+
+ if (fclose (target_file)!=0)
+ {
+ g_error ("Cannot close %s: %s\n",
+ target_filename, strerror (errno));
+ }
+}
+
+int
+main (int argc, char **argv)
+{
+ if (argc!=3)
+ {
+ g_error ("Syntax: %s <source.in.in> <target.in>\n", argv[0]);
+ }
+
+ source_filename = argv[1];
+ target_filename = argv[2];
+
+ /* Translators: Please don't translate "Control", "Shift", etc, since these
+ * are hardcoded (in gtk/gtkaccelgroup.c; it's not marco's fault).
+ * "disabled" must also stay as it is.
+ */
+ about_keybindings = g_markup_escape_text(_( \
+ "The format looks like \"<Control>a\" or \"<Shift><Alt>F1\".\n\n"\
+ "The parser is fairly liberal and allows "\
+ "lower or upper case, and also abbreviations such as \"<Ctl>\" and " \
+ "\"<Ctrl>\". If you set the option to the special string " \
+ "\"disabled\", then there will be no keybinding for this action."),
+ -1);
+
+ about_reversible_keybindings = g_markup_escape_text(_( \
+ "The format looks like \"<Control>a\" or \"<Shift><Alt>F1\".\n\n"\
+ "The parser is fairly liberal and allows "\
+ "lower or upper case, and also abbreviations such as \"<Ctl>\" and " \
+ "\"<Ctrl>\". If you set the option to the special string " \
+ "\"disabled\", then there will be no keybinding for this action.\n\n"\
+ "This keybinding may be reversed by holding down the \"shift\" key; "
+ "therefore, \"shift\" cannot be one of the keys it uses."),
+ -1);
+
+ produce_bindings ();
+
+ g_free (about_keybindings);
+ g_free (about_reversible_keybindings);
+
+ return 0;
+}
+
+/* eof schema-bindings.c */
+