summaryrefslogtreecommitdiff
path: root/src/util.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/util.js')
-rw-r--r--src/util.js146
1 files changed, 146 insertions, 0 deletions
diff --git a/src/util.js b/src/util.js
new file mode 100644
index 0000000..5da0198
--- /dev/null
+++ b/src/util.js
@@ -0,0 +1,146 @@
+// -*- Mode: js; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 4 -*-
+//
+// Copyright (c) 2013 Giovanni Campagna <scampa.giovanni@gmail.com>
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// * Neither the name of the GNOME Foundation nor the
+// names of its contributors may be used to endorse or promote products
+// derived from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+const Gdk = imports.gi.Gdk;
+const Gio = imports.gi.Gio;
+const GLib = imports.gi.GLib;
+const Gtk = imports.gi.Gtk;
+const System = imports.system;
+
+const Params = imports.params;
+
+function loadUI(resourcePath, objects) {
+ let ui = new Gtk.Builder();
+
+ if (objects) {
+ for (let o in objects)
+ ui.expose_object(o, objects[o]);
+ }
+
+ ui.add_from_resource(resourcePath);
+ return ui;
+}
+
+function loadStyleSheet(resource) {
+ let provider = new Gtk.CssProvider();
+ provider.load_from_file(Gio.File.new_for_uri('resource://' + resource));
+ Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),
+ provider,
+ Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
+}
+
+function initActions(actionMap, simpleActionEntries, context) {
+ simpleActionEntries.forEach(function(entry) {
+ let filtered = Params.filter(entry, { activate: null,
+ state_changed: null,
+ context: null });
+ let action = new Gio.SimpleAction(entry);
+
+ let context = filtered.context || actionMap;
+ if (filtered.activate)
+ action.connect('activate', filtered.activate.bind(context));
+ if (filtered.state_changed)
+ action.connect('state-changed', filtered.state_changed.bind(context));
+
+ actionMap.add_action(action);
+ });
+}
+
+function arrayEqual(one, two) {
+ if (one.length != two.length)
+ return false;
+
+ for (let i = 0; i < one.length; i++)
+ if (one[i] != two[i])
+ return false;
+
+ return true;
+}
+
+function getSettings(schemaId, path) {
+ const GioSSS = Gio.SettingsSchemaSource;
+ let schemaSource;
+
+ if (!pkg.moduledir.startsWith('resource://')) {
+ // Running from the source tree
+ schemaSource = GioSSS.new_from_directory(pkg.pkgdatadir,
+ GioSSS.get_default(),
+ false);
+ } else {
+ schemaSource = GioSSS.get_default();
+ }
+
+ let schemaObj = schemaSource.lookup(schemaId, true);
+ if (!schemaObj) {
+ log('Missing GSettings schema ' + schemaId);
+ System.exit(1);
+ }
+
+ if (path === undefined)
+ return new Gio.Settings({ settings_schema: schemaObj });
+ else
+ return new Gio.Settings({ settings_schema: schemaObj,
+ path: path });
+}
+
+function loadIcon(iconName, size) {
+ let theme = Gtk.IconTheme.get_default();
+
+ return theme.load_icon(iconName,
+ size,
+ Gtk.IconLookupFlags.GENERIC_FALLBACK);
+}
+
+function isCdm(c) {
+ return ((c >= 0x0300 && c <= 0x036F) ||
+ (c >= 0x1DC0 && c <= 0x1DFF) ||
+ (c >= 0x20D0 && c <= 0x20FF) ||
+ (c >= 0xFE20 && c <= 0xFE2F));
+}
+
+function normalizeCasefoldAndUnaccent(str) {
+ // The one and only!
+ // Travelled all over gnome, from tracker to gnome-shell to gnome-control-center,
+ // to seahorse, epiphany...
+ //
+ // Originally written by Aleksander Morgado <aleksander@gnu.org>
+
+ str = GLib.utf8_normalize(str, -1, GLib.NormalizeMode.NFKD);
+ str = GLib.utf8_casefold(str, -1);
+
+ /* Combining diacritical mark?
+ * Basic range: [0x0300,0x036F]
+ * Supplement: [0x1DC0,0x1DFF]
+ * For Symbols: [0x20D0,0x20FF]
+ * Half marks: [0xFE20,0xFE2F]
+ */
+ return str.replace(/[\u0300-\u036f]|[\u1dc0-\u1dff]|[\u20d0-\u20ff]|[\ufe20-\ufe2f]/, '');
+}
+
+function assertEqual(one, two) {
+ if (one != two)
+ throw Error('Assertion failed: ' + one + ' != ' + two);
+}