aboutsummaryrefslogtreecommitdiff
path: root/data/main.vala
blob: 2c28ace7c53f985092d3c7cfe7ca4771b7b12089 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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;
}