aboutsummaryrefslogtreecommitdiff
path: root/data
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
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')
-rw-r--r--data/Makefile.am26
-rw-r--r--data/icon-1.svg.in1
-rw-r--r--data/icon.svg.in1
-rw-r--r--data/main.vala138
4 files changed, 166 insertions, 0 deletions
diff --git a/data/Makefile.am b/data/Makefile.am
index b5212e94..125289bb 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -1,3 +1,29 @@
+AM_CFLAGS = -DGNOME_DESKTOP_USE_UNSTABLE_API
+AM_LDFLAGS = -lm
+AM_VALAFLAGS = --metadatadir $(top_srcdir)/deps \
+ --vapidir $(top_srcdir)/deps
+
+noinst_PROGRAMS = indicator-keyboard-icon-generator
+
+indicator_keyboard_icon_generator_SOURCES = main.vala \
+ $(top_srcdir)/lib/common.vala
+indicator_keyboard_icon_generator_VALAFLAGS = $(AM_VALAFLAGS) \
+ --pkg gee-1.0 \
+ --pkg gtk+-3.0 \
+ --pkg GDesktopEnums-3.0 \
+ --pkg gnome-desktop-3.0 \
+ --pkg Xkl-1.0
+indicator_keyboard_icon_generator_CFLAGS = $(AM_CFLAGS) \
+ $(GEE_CFLAGS) \
+ $(GTK_CFLAGS) \
+ $(GNOME_DESKTOP_CFLAGS) \
+ $(LIBXKLAVIER_CFLAGS)
+indicator_keyboard_icon_generator_LDFLAGS = $(AM_LDFLAGS) \
+ $(GEE_LIBS) \
+ $(GTK_LIBS) \
+ $(GNOME_DESKTOP_LIBS) \
+ $(LIBXKLAVIER_LIBS)
+
servicedir = $(DBUS_SERVICE_DIR)
dist_service_DATA = indicator-keyboard.service
diff --git a/data/icon-1.svg.in b/data/icon-1.svg.in
new file mode 100644
index 00000000..e223c017
--- /dev/null
+++ b/data/icon-1.svg.in
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg version="1.1" width="22" height="22"><defs><mask id="m"><rect x="0" y="0" width="22" height="22" style="fill:white"/><text x="@LAYOUT_X@" y="@LAYOUT_Y@" style="font-size:12px;font-weight:500;fill:black;font-family:Ubuntu">@LAYOUT@</text></mask></defs><rect x="0" y="0" width="22" height="22" rx="4" mask="url(#m)" style="fill:@COLOUR@"/></svg>
diff --git a/data/icon.svg.in b/data/icon.svg.in
new file mode 100644
index 00000000..e223c017
--- /dev/null
+++ b/data/icon.svg.in
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg version="1.1" width="22" height="22"><defs><mask id="m"><rect x="0" y="0" width="22" height="22" style="fill:white"/><text x="@LAYOUT_X@" y="@LAYOUT_Y@" style="font-size:12px;font-weight:500;fill:black;font-family:Ubuntu">@LAYOUT@</text></mask></defs><rect x="0" y="0" width="22" height="22" rx="4" mask="url(#m)" style="fill:@COLOUR@"/></svg>
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;
+}