aboutsummaryrefslogtreecommitdiff
path: root/data/main.vala
diff options
context:
space:
mode:
authorWilliam Hua <william.hua@canonical.com>2013-06-04 17:09:37 -0400
committerWilliam Hua <william.hua@canonical.com>2013-06-04 17:09:37 -0400
commit97c38e4e24e63dcd4fa34a7fadc27e9395c6a7ae (patch)
tree1ef52a8787ff72161c039e0e7a627d5659103f45 /data/main.vala
parent7f9e0c6f74e4d85db873f2d8782f6b3da2d74c85 (diff)
downloadayatana-indicator-keyboard-97c38e4e24e63dcd4fa34a7fadc27e9395c6a7ae.tar.gz
ayatana-indicator-keyboard-97c38e4e24e63dcd4fa34a7fadc27e9395c6a7ae.tar.bz2
ayatana-indicator-keyboard-97c38e4e24e63dcd4fa34a7fadc27e9395c6a7ae.zip
Icon generator.
Diffstat (limited to 'data/main.vala')
-rw-r--r--data/main.vala138
1 files changed, 138 insertions, 0 deletions
diff --git a/data/main.vala b/data/main.vala
new file mode 100644
index 00000000..2c28ace7
--- /dev/null
+++ b/data/main.vala
@@ -0,0 +1,138 @@
+int main (string[] args) {
+ var force = false;
+ var colour = "grey";
+ string output_path = null;
+ string no_subscript_path = null;
+ string with_subscript_path = null;
+
+ OptionEntry[] options = new OptionEntry[6];
+ options[0] = { "force", 'f', 0, OptionArg.NONE, ref force, "Overwrite existing files" };
+ options[1] = { "colour", 'c', 0, OptionArg.STRING, ref colour, "Icon colour", "COLOUR" };
+ options[2] = { "output", 'o', 0, OptionArg.FILENAME, ref output_path, "Output directory", "PATH" };
+ options[3] = { "no-subscript", 's', 0, OptionArg.FILENAME, ref no_subscript_path, "Icon template", "PATH" };
+ options[4] = { "with-subscript", 'S', 0, OptionArg.FILENAME, ref with_subscript_path, "Subscript icon template", "PATH" };
+ options[5] = { null };
+
+ try {
+ var context = new OptionContext ("- generate keyboard layout icons");
+ context.add_main_entries (options, null);
+ context.set_help_enabled (true);
+ context.parse (ref args);
+ } catch (OptionError error) {
+ stderr.printf ("error: %s\n", error.message);
+ return 1;
+ }
+
+ if (no_subscript_path == null && with_subscript_path == null) {
+ stderr.printf ("error: No icon template\n");
+ return 2;
+ } else if (no_subscript_path == null) {
+ no_subscript_path = with_subscript_path;
+ } else if (with_subscript_path == null) {
+ with_subscript_path = no_subscript_path;
+ }
+
+ if (output_path != null) {
+ var file = File.new_for_path (output_path);
+
+ if (!file.query_exists (null)) {
+ try {
+ file.make_directory_with_parents (null);
+ } catch (Error error) {
+ stderr.printf ("error: %s\n", error.message);
+ return 3;
+ }
+ }
+ } else {
+ output_path = ".";
+ }
+
+ Gtk.init (ref args);
+
+ var info = new Gnome.XkbInfo ();
+ var layouts = info.get_all_layouts ();
+ var occurrences = new Gee.HashMap <string, int> ();
+
+ layouts.foreach ((name) => {
+ string display;
+ string layout;
+
+ info.get_layout_info (name, out display, null, out layout, null);
+
+ if (display == null) {
+ display = get_display_name (layout);
+ }
+
+ var abbreviation = get_abbreviation (display);
+
+ if (!occurrences.has_key (abbreviation)) {
+ occurrences[abbreviation] = 1;
+ } else {
+ occurrences[abbreviation] = occurrences[abbreviation] + 1;
+ }
+ });
+
+ string no_subscript_data;
+ string with_subscript_data;
+
+ try {
+ uint8[] contents;
+
+ File.new_for_path (no_subscript_path).load_contents (null, out contents, null);
+ no_subscript_data = ((string) contents).replace ("@COLOUR@", colour);
+
+ File.new_for_path (with_subscript_path).load_contents (null, out contents, null);
+ with_subscript_data = ((string) contents).replace ("@COLOUR@", colour);
+ } catch (Error error) {
+ stderr.printf ("error: %s\n", error.message);
+ return 4;
+ }
+
+ foreach (var entry in occurrences.entries) {
+ var layout = entry.key;
+ var count = entry.value;
+ var file = File.new_for_path (@"$output_path/$layout.svg");
+
+ if (force || !file.query_exists (null)) {
+ var output_data = no_subscript_data;
+
+ output_data = output_data.replace ("@LAYOUT@", layout);
+ output_data = output_data.replace ("@LAYOUT_X@", "3.5");
+ output_data = output_data.replace ("@LAYOUT_Y@", "15.5");
+
+ try {
+ file.replace_contents (output_data.data, null, false, FileCreateFlags.REPLACE_DESTINATION, null, null);
+ } catch (Error error) {
+ stderr.printf ("error: %s\n", error.message);
+ }
+ }
+
+ if (count > 1) {
+ var partial_data = with_subscript_data;
+
+ partial_data = partial_data.replace ("@LAYOUT@", layout);
+
+ for (var i = 1; i <= count; i++) {
+ file = File.new_for_path (@"$output_path/$layout-$i.svg");
+
+ if (force || !file.query_exists (null)) {
+ var output_data = partial_data;
+
+ output_data = output_data.replace ("@LAYOUT_X@", "3.5");
+ output_data = output_data.replace ("@LAYOUT_Y@", "15.5");
+ output_data = output_data.replace ("@SUBSCRIPT@", @"$i");
+ output_data = output_data.replace ("@SUBSCRIPT_X@", "15");
+ output_data = output_data.replace ("@SUBSCRIPT_Y@", "10");
+
+ try {
+ file.replace_contents (output_data.data, null, false, FileCreateFlags.REPLACE_DESTINATION, null, null);
+ } catch (Error error) {
+ stderr.printf ("error: %s\n", error.message);
+ }
+ }
+ }
+ }
+ }
+
+ return 0;
+}