diff options
Diffstat (limited to 'nixos/gui/components/clh.js')
-rw-r--r-- | nixos/gui/components/clh.js | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/nixos/gui/components/clh.js b/nixos/gui/components/clh.js new file mode 100644 index 000000000000..fd85422d6c85 --- /dev/null +++ b/nixos/gui/components/clh.js @@ -0,0 +1,154 @@ +const nsIAppShellService = Components.interfaces.nsIAppShellService; +const nsISupports = Components.interfaces.nsISupports; +const nsICategoryManager = Components.interfaces.nsICategoryManager; +const nsIComponentRegistrar = Components.interfaces.nsIComponentRegistrar; +const nsICommandLine = Components.interfaces.nsICommandLine; +const nsICommandLineHandler = Components.interfaces.nsICommandLineHandler; +const nsIFactory = Components.interfaces.nsIFactory; +const nsIModule = Components.interfaces.nsIModule; +const nsIWindowWatcher = Components.interfaces.nsIWindowWatcher; + +// CHANGEME: to the chrome URI of your extension or application +const CHROME_URI = "chrome://nixos-gui/content/myviewer.xul"; + +// CHANGEME: change the contract id, CID, and category to be unique +// to your application. +const clh_contractID = "@mozilla.org/commandlinehandler/general-startup;1?type=myapp"; + +// use uuidgen to generate a unique ID +const clh_CID = Components.ID("{2991c315-b871-42cd-b33f-bfee4fcbf682}"); + +// category names are sorted alphabetically. Typical command-line handlers use a +// category that begins with the letter "m". +const clh_category = "m-myapp"; + +/** + * Utility functions + */ + +/** + * Opens a chrome window. + * @param aChromeURISpec a string specifying the URI of the window to open. + * @param aArgument an argument to pass to the window (may be null) + */ +function openWindow(aChromeURISpec, aArgument) +{ + var ww = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]. + getService(Components.interfaces.nsIWindowWatcher); + ww.openWindow(null, aChromeURISpec, "_blank", + "chrome,menubar,toolbar,status,resizable,dialog=no", + aArgument); +} + +/** + * The XPCOM component that implements nsICommandLineHandler. + * It also implements nsIFactory to serve as its own singleton factory. + */ +const myAppHandler = { + /* nsISupports */ + QueryInterface : function clh_QI(iid) + { + if (iid.equals(nsICommandLineHandler) || + iid.equals(nsIFactory) || + iid.equals(nsISupports)) + return this; + + throw Components.results.NS_ERROR_NO_INTERFACE; + }, + + /* nsICommandLineHandler */ + + handle : function clh_handle(cmdLine) + { + openWindow(CHROME_URI, cmdLine); + cmdLine.preventDefault = true; + }, + + // CHANGEME: change the help info as appropriate, but + // follow the guidelines in nsICommandLineHandler.idl + // specifically, flag descriptions should start at + // character 24, and lines should be wrapped at + // 72 characters with embedded newlines, + // and finally, the string should end with a newline + helpInfo : " <filename> Open the file in the viewer\n", + + /* nsIFactory */ + + createInstance : function clh_CI(outer, iid) + { + if (outer != null) + throw Components.results.NS_ERROR_NO_AGGREGATION; + + return this.QueryInterface(iid); + }, + + lockFactory : function clh_lock(lock) + { + /* no-op */ + } +}; + +/** + * The XPCOM glue that implements nsIModule + */ +const myAppHandlerModule = { + /* nsISupports */ + QueryInterface : function mod_QI(iid) + { + if (iid.equals(nsIModule) || + iid.equals(nsISupports)) + return this; + + throw Components.results.NS_ERROR_NO_INTERFACE; + }, + + /* nsIModule */ + getClassObject : function mod_gch(compMgr, cid, iid) + { + if (cid.equals(clh_CID)) + return myAppHandler.QueryInterface(iid); + + throw Components.results.NS_ERROR_NOT_REGISTERED; + }, + + registerSelf : function mod_regself(compMgr, fileSpec, location, type) + { + compMgr.QueryInterface(nsIComponentRegistrar); + + compMgr.registerFactoryLocation(clh_CID, + "myAppHandler", + clh_contractID, + fileSpec, + location, + type); + + var catMan = Components.classes["@mozilla.org/categorymanager;1"]. + getService(nsICategoryManager); + catMan.addCategoryEntry("command-line-handler", + clh_category, + clh_contractID, true, true); + }, + + unregisterSelf : function mod_unreg(compMgr, location, type) + { + compMgr.QueryInterface(nsIComponentRegistrar); + compMgr.unregisterFactoryLocation(clh_CID, location); + + var catMan = Components.classes["@mozilla.org/categorymanager;1"]. + getService(nsICategoryManager); + catMan.deleteCategoryEntry("command-line-handler", clh_category); + }, + + canUnload : function (compMgr) + { + return true; + } +}; + +/* The NSGetModule function is the magic entry point that XPCOM uses to find what XPCOM objects + * this component provides + */ +function NSGetModule(comMgr, fileSpec) +{ + return myAppHandlerModule; +} |