Browse Source

It's time for an input history add-on!

Douglas William Thrift 9 years ago
commit
2255e8f394
5 changed files with 207 additions and 0 deletions
  1. 1 0
      .gitignore
  2. 47 0
      GNUmakefile
  3. 117 0
      bootstrap.js
  4. 22 0
      install.rdf
  5. 20 0
      makefile

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+*.xpi

+ 47 - 0
GNUmakefile

@@ -0,0 +1,47 @@
+# InputHistory
+#
+# Douglas Thrift
+#
+# GNUmakefile
+
+ifeq ($(OS),Windows_NT)
+SED := C:\cygwin\bin\sed.exe
+ZIP := C:\cygwin\bin\zip.exe
+PROFILE := $(subst /,\,$(firstword $(wildcard $(APPDATA)/Instantbird/Profiles/*.default)))
+RM_F := del /F /A
+else
+SED := sed
+ZIP := zip
+PROFILE := $(firstword $(wildcard ~/.instantbird/*.default))
+RM_F := rm -f
+endif
+
+files := install.rdf bootstrap.js
+id := $(firstword $(shell $(SED) -re "s|^.*<em:id>(.+)</em:id>.*$$|\1|p;d" install.rdf))
+version := $(shell $(SED) -re "s|^.*<em:version>(.+)</em:version>.*$$|\1|p;d" install.rdf)
+xpi := $(shell echo $(id) | $(SED) -re "s/^(.+)@.*$$/\1/")-$(version).xpi
+shortcut := $(PROFILE)/extensions/$(id)
+cwd := $(CURDIR)/
+
+ifeq ($(OS),Windows_NT)
+shortcut := $(subst /,\,$(shortcut))
+cwd := $(subst /,\,$(cwd))
+endif
+
+.PHONY: all install deinstall uninstall clean
+
+all: $(xpi)
+
+$(xpi): $(files)
+	$(ZIP) -ll $(xpi) $(files)
+
+install:
+	echo $(cwd)> $(shortcut)
+
+deinstall:
+	-$(RM_F) $(shortcut)
+
+uninstall: deinstall
+
+clean:
+	-$(RM_F) *.xpi

+ 117 - 0
bootstrap.js

@@ -0,0 +1,117 @@
+// Input History
+//
+// Douglas Thrift
+//
+// bootstrap.js
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Input History.
+ *
+ * The Initial Developer of the Original Code is
+ * Douglas Thrift <douglas@douglasthrift.net>.
+ * Portions created by the Initial Developer are Copyright (C) 2011
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+Components.utils.import("resource:///modules/imServices.jsm");
+
+function generatorFromArray(array)
+{
+    for (var index = 0; index != array.length; ++index)
+        yield array[index];
+}
+
+function generatorFromEnumerator(enumerator)
+{
+    while (enumerator.hasMoreElements())
+        yield enumerator.getNext();
+}
+
+let observer = {
+    observe: function(subject, topic, data)
+    {
+        if (topic != "conversation-loaded")
+            return;
+
+        this.addArrowListener(subject);
+    },
+    addArrowListener: function(browser)
+    {
+        var binding = browser.ownerDocument.getBindingParent(browser);
+
+        if (!binding || !("editor" in binding) || !binding.editor)
+            return;
+
+        binding.editor.addEventListener("keypress", this.onKeyPress, true);
+    },
+    removeArrowListener: function(browser)
+    {
+        var binding = browser.ownerDocument.getBindingParent(browser);
+
+        if (!binding || !("editor" in binding) || !binding.editor)
+            return;
+
+        binding.editor.removeEventListener("keypress", this.onKeyPress, true);
+    },
+    onKeyPress: function(event)
+    {
+        if (!event.ctrlKey || ((event.keyCode != event.DOM_VK_UP) && (event.keyCode != event.DOM_VK_DOWN)) || event.altKey || event.metaKey || event.shiftKey)
+            return;
+
+        event.preventDefault();
+
+        Services.console.logStringMessage(event);
+    },
+};
+
+function startup(data, reason)
+{
+    for each (let window in generatorFromEnumerator(Services.wm.getEnumerator("Messenger:convs")))
+        for each (let tabconversation in generatorFromArray(window.document.getElementsByTagName("tabconversation")))
+            for each (let browser in tabconversation.browsers)
+                observer.addArrowListener(browser);
+
+    Services.obs.addObserver(observer, "conversation-loaded", false);
+}
+
+function shutdown(data, reason)
+{
+    Services.obs.removeObserver(observer, "conversation-loaded");
+
+    for each (let window in generatorFromEnumerator(Services.wm.getEnumerator("Messenger:convs")))
+        for each (let tabconversation in generatorFromArray(window.document.getElementsByTagName("tabconversation")))
+            for each (let browser in tabconversation.browsers)
+                observer.removeArrowListener(browser);
+}
+
+function install(data, reason) {}
+function uninstall(data, reason) {}
+
+// vim: expandtab

+ 22 - 0
install.rdf

@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
+    <Description about="urn:mozilla:install-manifest">
+        <em:id>inputhistory@douglasthrift.net</em:id>
+        <em:version>1.0</em:version>
+        <em:type>2</em:type>
+        <!-- Instantbird -->
+        <em:targetApplication>
+            <Description>
+                <em:id>{33cb9019-c295-46dd-be21-8c4936574bee}</em:id>
+                <em:minVersion>0.3b1</em:minVersion>
+                <em:maxVersion>1.0.*</em:maxVersion>
+            </Description>
+        </em:targetApplication>
+        <em:name>Input History</em:name>
+        <em:bootstrap>true</em:bootstrap>
+        <em:description>Input history for conversation windows using CTRL-up and CTRL-down.</em:description>
+        <em:creator>Douglas Thrift</em:creator>
+        <em:homepageURL>http://code.douglasthrift.net/trac/instantbird#InputHistory</em:homepageURL>
+    </Description>
+</RDF>
+<!-- vim: set expandtab: -->

+ 20 - 0
makefile

@@ -0,0 +1,20 @@
+# Input History
+#
+# Douglas Thrift
+#
+# makefile
+
+all:
+	mingw32-make $@
+
+install:
+	mingw32-make $@
+
+deinstall:
+	mingw32-make $@
+
+uninstall:
+	mingw32-make $@
+
+clean:
+	mingw32-make $@