mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-07-14 06:00:33 +03:00
Remove gui (see #6207), use nixui instead
This commit is contained in:
parent
19c359ce2a
commit
b83433cdd1
12 changed files with 0 additions and 1023 deletions
|
@ -1,16 +0,0 @@
|
||||||
This file should become a nix expression. (see modules/installer/tools/tools.nix)
|
|
||||||
|
|
||||||
you need to:
|
|
||||||
- download the latest jQuery from and copy it to chrome/content:
|
|
||||||
http://code.jquery.com/jquery-1.5.2.js
|
|
||||||
|
|
||||||
- install 'xulrunner' with nix:
|
|
||||||
nix-env -Ai nixpkgs_sys.firefox40Pkgs.xulrunner
|
|
||||||
|
|
||||||
- make sure nixos-option in your path
|
|
||||||
|
|
||||||
- have /etc/nixos/nixpkgs
|
|
||||||
- have /etc/nixos/nixos
|
|
||||||
|
|
||||||
run it:
|
|
||||||
- xulrunner /etc/nixos/nixos/gui/application.ini -jsconsole
|
|
|
@ -1,36 +0,0 @@
|
||||||
[App]
|
|
||||||
;
|
|
||||||
; This field specifies your organization's name. This field is recommended,
|
|
||||||
; but optional.
|
|
||||||
Vendor=NixOS
|
|
||||||
;
|
|
||||||
; This field specifies your application's name. This field is required.
|
|
||||||
Name=NixOS-gui
|
|
||||||
;
|
|
||||||
; This field specifies your application's version. This field is optional.
|
|
||||||
Version=0.1
|
|
||||||
;
|
|
||||||
; This field specifies your application's build ID (timestamp). This field is
|
|
||||||
; required.
|
|
||||||
BuildID=20110424
|
|
||||||
;
|
|
||||||
; This field specifies a compact copyright notice for your application. This
|
|
||||||
; field is optional.
|
|
||||||
;Copyright=
|
|
||||||
|
|
||||||
;
|
|
||||||
; This ID is just an example. Every XUL app ought to have it's own unique ID.
|
|
||||||
; You can use the microsoft "guidgen" or "uuidgen" tools, or go on
|
|
||||||
; irc.mozilla.org and /msg botbot uuid. This field is optional.
|
|
||||||
;ID=
|
|
||||||
|
|
||||||
[Gecko]
|
|
||||||
;
|
|
||||||
; This field is required. It specifies the minimum Gecko version that this
|
|
||||||
; application requires.
|
|
||||||
MinVersion=1.9a5
|
|
||||||
;
|
|
||||||
; This field is optional. It specifies the maximum Gecko version that this
|
|
||||||
; application requires. It should be specified if your application uses
|
|
||||||
; unfrozen interfaces.
|
|
||||||
MaxVersion=2.*
|
|
|
@ -1 +0,0 @@
|
||||||
manifest chrome/chrome.manifest
|
|
|
@ -1 +0,0 @@
|
||||||
content nixos-gui content/
|
|
|
@ -1,137 +0,0 @@
|
||||||
|
|
||||||
function inspect(obj, maxLevels, level)
|
|
||||||
{
|
|
||||||
var str = '', type, msg;
|
|
||||||
|
|
||||||
// Start Input Validations
|
|
||||||
// Don't touch, we start iterating at level zero
|
|
||||||
if(level == null) level = 0;
|
|
||||||
|
|
||||||
// At least you want to show the first level
|
|
||||||
if(maxLevels == null) maxLevels = 1;
|
|
||||||
if(maxLevels < 1)
|
|
||||||
return '<font color="red">Error: Levels number must be > 0</font>';
|
|
||||||
|
|
||||||
// We start with a non null object
|
|
||||||
if(obj == null)
|
|
||||||
return '<font color="red">Error: Object <b>NULL</b></font>';
|
|
||||||
// End Input Validations
|
|
||||||
|
|
||||||
// Each Iteration must be indented
|
|
||||||
str += '<ul>';
|
|
||||||
|
|
||||||
// Start iterations for all objects in obj
|
|
||||||
for(property in obj)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// Show "property" and "type property"
|
|
||||||
type = typeof(obj[property]);
|
|
||||||
str += '<li>(' + type + ') ' + property +
|
|
||||||
( (obj[property]==null)?(': <b>null</b>'):('')) + '</li>';
|
|
||||||
|
|
||||||
// We keep iterating if this property is an Object, non null
|
|
||||||
// and we are inside the required number of levels
|
|
||||||
if((type == 'object') && (obj[property] != null) && (level+1 < maxLevels))
|
|
||||||
str += inspect(obj[property], maxLevels, level+1);
|
|
||||||
}
|
|
||||||
catch(err)
|
|
||||||
{
|
|
||||||
// Is there some properties in obj we can't access? Print it red.
|
|
||||||
if(typeof(err) == 'string') msg = err;
|
|
||||||
else if(err.message) msg = err.message;
|
|
||||||
else if(err.description) msg = err.description;
|
|
||||||
else msg = 'Unknown';
|
|
||||||
|
|
||||||
str += '<li><font color="red">(Error) ' + property + ': ' + msg +'</font></li>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close indent
|
|
||||||
str += '</ul>';
|
|
||||||
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run xulrunner application.ini -jsconsole -console, to see messages.
|
|
||||||
function log(str)
|
|
||||||
{
|
|
||||||
Components.classes['@mozilla.org/consoleservice;1']
|
|
||||||
.getService(Components.interfaces.nsIConsoleService)
|
|
||||||
.logStringMessage(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeTempFile(prefix)
|
|
||||||
{
|
|
||||||
var file = Components.classes["@mozilla.org/file/directory_service;1"]
|
|
||||||
.getService(Components.interfaces.nsIProperties)
|
|
||||||
.get("TmpD", Components.interfaces.nsIFile);
|
|
||||||
file.append(prefix || "xulrunner");
|
|
||||||
file.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0664);
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
|
|
||||||
function writeToFile(file, data)
|
|
||||||
{
|
|
||||||
// file is nsIFile, data is a string
|
|
||||||
var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"]
|
|
||||||
.createInstance(Components.interfaces.nsIFileOutputStream);
|
|
||||||
|
|
||||||
// use 0x02 | 0x10 to open file for appending.
|
|
||||||
foStream.init(file, 0x02 | 0x08 | 0x20, 0664, 0); // write, create, truncate
|
|
||||||
foStream.write(data, data.length);
|
|
||||||
foStream.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
function readFromFile(file)
|
|
||||||
{
|
|
||||||
// |file| is nsIFile
|
|
||||||
var data = "";
|
|
||||||
var fstream = Components.classes["@mozilla.org/network/file-input-stream;1"]
|
|
||||||
.createInstance(Components.interfaces.nsIFileInputStream);
|
|
||||||
var sstream = Components.classes["@mozilla.org/scriptableinputstream;1"]
|
|
||||||
.createInstance(Components.interfaces.nsIScriptableInputStream);
|
|
||||||
fstream.init(file, -1, 0, 0);
|
|
||||||
sstream.init(fstream);
|
|
||||||
|
|
||||||
var str = sstream.read(4096);
|
|
||||||
while (str.length > 0) {
|
|
||||||
data += str;
|
|
||||||
str = sstream.read(4096);
|
|
||||||
}
|
|
||||||
|
|
||||||
sstream.close();
|
|
||||||
fstream.close();
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
function runProgram(commandLine)
|
|
||||||
{
|
|
||||||
// create an nsILocalFile for the executable
|
|
||||||
var file = Components.classes["@mozilla.org/file/local;1"]
|
|
||||||
.createInstance(Components.interfaces.nsILocalFile);
|
|
||||||
file.initWithPath("/bin/sh");
|
|
||||||
|
|
||||||
// create an nsIProcess
|
|
||||||
var process = Components.classes["@mozilla.org/process/util;1"]
|
|
||||||
.createInstance(Components.interfaces.nsIProcess);
|
|
||||||
process.init(file);
|
|
||||||
|
|
||||||
// Run the process.
|
|
||||||
// If first param is true, calling thread will be blocked until
|
|
||||||
// called process terminates.
|
|
||||||
// Second and third params are used to pass command-line arguments
|
|
||||||
// to the process.
|
|
||||||
var args = ["-c", commandLine];
|
|
||||||
process.run(true, args, args.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
// only for testing...
|
|
||||||
function testIO()
|
|
||||||
{
|
|
||||||
var f = makeTempFile();
|
|
||||||
writeToFile(f, "essai\ntest");
|
|
||||||
alert(readFromFile(f));
|
|
||||||
runProgram("zenity --info");
|
|
||||||
}
|
|
|
@ -1,70 +0,0 @@
|
||||||
// global variables.
|
|
||||||
var gNixOS;
|
|
||||||
var gOptionView;
|
|
||||||
|
|
||||||
/*
|
|
||||||
var gProgressBar;
|
|
||||||
function setProgress(current, max)
|
|
||||||
{
|
|
||||||
if (gProgressBar) {
|
|
||||||
gProgressBar.value = 100 * current / max;
|
|
||||||
log("progress: " + gProgressBar.value + "%");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
log("unknow progress bar");
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
function updateTextbox(id, value)
|
|
||||||
{
|
|
||||||
// setting the height cause an overflow which resize the textbox to its
|
|
||||||
// content due to its onoverflow attribute.
|
|
||||||
$(id).attr("value", value).attr("height", 1);
|
|
||||||
};
|
|
||||||
|
|
||||||
function updatePanel(options)
|
|
||||||
{
|
|
||||||
log("updatePanel: " + options.length);
|
|
||||||
if (options.length == 0)
|
|
||||||
return;
|
|
||||||
// FIXME: ignore the rest of the selection for now.
|
|
||||||
var o = options[0];
|
|
||||||
$("#name").attr("label", o.path);
|
|
||||||
|
|
||||||
if (o.typename != null)
|
|
||||||
$("#typename").attr("label", o.typename);
|
|
||||||
else
|
|
||||||
$("#typename").attr("label", "");
|
|
||||||
|
|
||||||
$("#desc").text(o.description);
|
|
||||||
|
|
||||||
if (o.value != null)
|
|
||||||
updateTextbox("#val", o.value);
|
|
||||||
else
|
|
||||||
updateTextbox("#val", "");
|
|
||||||
|
|
||||||
if (o.defaultValue != null)
|
|
||||||
updateTextbox("#def", o.defaultValue);
|
|
||||||
else
|
|
||||||
updateTextbox("#def", "");
|
|
||||||
|
|
||||||
if (o.example != null)
|
|
||||||
updateTextbox("#exp", o.example);
|
|
||||||
else
|
|
||||||
updateTextbox("#exp", "");
|
|
||||||
|
|
||||||
updateTextbox("#decls", o.declarations.join("\n"));
|
|
||||||
updateTextbox("#defs", o.definitions.join("\n"));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function onload()
|
|
||||||
{
|
|
||||||
var optionTree = document.getElementById("option-tree");
|
|
||||||
// gProgressBar = document.getElementById("progress-bar");
|
|
||||||
// setProgress(0, 1);
|
|
||||||
|
|
||||||
gNixOS = new NixOS();
|
|
||||||
gOptionView = new OptionView(gNixOS.option, updatePanel);
|
|
||||||
optionTree.view = gOptionView;
|
|
||||||
}
|
|
|
@ -1,63 +0,0 @@
|
||||||
<?xml version="1.0"?>
|
|
||||||
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
|
|
||||||
|
|
||||||
<!DOCTYPE window>
|
|
||||||
|
|
||||||
<!-- To edit this file I recommend you to use:
|
|
||||||
http://xulfr.org/outils/xulediteur.xul
|
|
||||||
-->
|
|
||||||
|
|
||||||
<window
|
|
||||||
id = "nixos-gui"
|
|
||||||
title = "NixOS gui"
|
|
||||||
width = "800"
|
|
||||||
height = "600"
|
|
||||||
xmlns = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
|
||||||
<script src="jquery-1.5.2.js"/>
|
|
||||||
<script src="io.js"/>
|
|
||||||
<script src="nixos.js"/>
|
|
||||||
<script src="optionView.js"/>
|
|
||||||
<script src="main.js"/>
|
|
||||||
<hbox flex="1">
|
|
||||||
<vbox width="250">
|
|
||||||
<tree flex="1" id="option-tree" persist="height" onselect="gOptionView.selectionChanged()">
|
|
||||||
<treecols>
|
|
||||||
<treecol persist="hidden width" flex="9" id="opt-name"
|
|
||||||
label="Option" primary="true"/>
|
|
||||||
<!-- Uncomment the following column to see the number of option
|
|
||||||
printed below each options. -->
|
|
||||||
<!--
|
|
||||||
<treecol persist="hidden width" flex="1" id="dbg-size"
|
|
||||||
label="sz"/>
|
|
||||||
-->
|
|
||||||
</treecols>
|
|
||||||
<treechildren id="first-child" flex="1"/>
|
|
||||||
</tree>
|
|
||||||
</vbox>
|
|
||||||
<vbox flex="3" style="overflow: auto">
|
|
||||||
<caption id="name" label=""/>
|
|
||||||
<caption id="typename" label=""/>
|
|
||||||
<separator/>
|
|
||||||
<description id="desc" hidden="false"></description>
|
|
||||||
<separator/>
|
|
||||||
<caption label="Value:"/>
|
|
||||||
<textbox id="val" readonly="true" multiline="true" value=""
|
|
||||||
class="plain" hidden="false" onoverflow="this.height =
|
|
||||||
this.inputField.scrollHeight;" />
|
|
||||||
<separator/>
|
|
||||||
<caption label="Default:"/>
|
|
||||||
<textbox id="def" readonly="true" multiline="true" value="" class="plain" hidden="false" onoverflow="this.height = this.inputField.scrollHeight;" />
|
|
||||||
<separator/>
|
|
||||||
<caption label="Example:"/>
|
|
||||||
<textbox id="exp" readonly="true" multiline="true" value="" class="plain" hidden="false" onoverflow="this.height = this.inputField.scrollHeight;" />
|
|
||||||
<separator/>
|
|
||||||
<caption label="Declarations:"/>
|
|
||||||
<textbox id="decls" readonly="true" multiline="true" value="" class="plain" hidden="false" onoverflow="this.height = this.inputField.scrollHeight;" />
|
|
||||||
<separator/>
|
|
||||||
<caption label="Definitions:"/>
|
|
||||||
<textbox id="defs" readonly="true" multiline="true" value=""
|
|
||||||
class="plain" hidden="false" onoverflow="this.height = this.inputField.scrollHeight;" />
|
|
||||||
</vbox>
|
|
||||||
</hbox>
|
|
||||||
<!-- <progressmeter id="progress-bar" value="0%"/> -->
|
|
||||||
</window>
|
|
|
@ -1,255 +0,0 @@
|
||||||
|
|
||||||
function NixOS () {
|
|
||||||
var env = Components.classes["@mozilla.org/process/environment;1"].
|
|
||||||
getService(Components.interfaces.nsIEnvironment);
|
|
||||||
|
|
||||||
if (env.exists("NIXOS"))
|
|
||||||
this.nixos = env.get("NIXOS");
|
|
||||||
if (env.exists("NIXOS_CONFIG"))
|
|
||||||
this.config = env.get("NIXOS_CONFIG");
|
|
||||||
if (env.exists("NIXPKGS"))
|
|
||||||
this.nixpkgs = env.get("NIXPKGS");
|
|
||||||
if (env.exists("mountPoint"))
|
|
||||||
this.root = env.get("mountPoint");
|
|
||||||
if (env.exists("NIXOS_OPTION"))
|
|
||||||
this.optionBin = env.get("NIXOS_OPTION");
|
|
||||||
this.option = new Option("options", this, null);
|
|
||||||
};
|
|
||||||
|
|
||||||
NixOS.prototype = {
|
|
||||||
root: "",
|
|
||||||
nixos: "/etc/nixos/nixos",
|
|
||||||
nixpkgs: "/etc/nixos/nixpkgs",
|
|
||||||
config: "/etc/nixos/configuration.nix",
|
|
||||||
instantiateBin: "/run/current-system/sw/bin/nix-instantiate",
|
|
||||||
optionBin: "/run/current-system/sw/bin/nixos-option",
|
|
||||||
tmpFile: "nixos-gui",
|
|
||||||
option: null
|
|
||||||
};
|
|
||||||
|
|
||||||
function Option (name, context, parent) {
|
|
||||||
this.name = name;
|
|
||||||
this.context_ = context;
|
|
||||||
if (parent == null)
|
|
||||||
this.path = "";
|
|
||||||
else if (parent.path == "")
|
|
||||||
this.path = name;
|
|
||||||
else
|
|
||||||
this.path = parent.path + "." + name;
|
|
||||||
};
|
|
||||||
|
|
||||||
Option.prototype = {
|
|
||||||
load: function () {
|
|
||||||
var env = "";
|
|
||||||
env += "'NIXOS=" + this.context_.root + this.context_.nixos + "' ";
|
|
||||||
env += "'NIXOS_PKGS=" + this.context_.root + this.context_.nixpkgs + "' ";
|
|
||||||
env += "'NIXOS_CONFIG=" + this.context_.config + "' ";
|
|
||||||
var out = makeTempFile(this.context_.tmpFile);
|
|
||||||
var prog = this.context_.optionBin + " 2>&1 >" + out.path + " ";
|
|
||||||
var args = " --xml " + this.path;
|
|
||||||
|
|
||||||
runProgram(/*env + */ prog + args);
|
|
||||||
var xml = readFromFile(out);
|
|
||||||
out.remove(false);
|
|
||||||
|
|
||||||
// jQuery does a stack overflow when converting a huge XML to a DOM.
|
|
||||||
var dom = DOMParser().parseFromString(xml, "text/xml");
|
|
||||||
var xmlAttrs = $("expr > attrs > attr", dom);
|
|
||||||
|
|
||||||
this.isOption = xmlAttrs.first().attr("name") == "_isOption";
|
|
||||||
|
|
||||||
if (!this.isOption)
|
|
||||||
this.loadSubOptions(xmlAttrs);
|
|
||||||
else
|
|
||||||
this.loadOption(xmlAttrs);
|
|
||||||
this.isLoaded = true;
|
|
||||||
},
|
|
||||||
|
|
||||||
loadSubOptions: function (xmlAttrs) {
|
|
||||||
var cur = this;
|
|
||||||
var attrs = new Array();
|
|
||||||
|
|
||||||
xmlAttrs.each(
|
|
||||||
function (index) {
|
|
||||||
var name = $(this).attr("name");
|
|
||||||
var attr = new Option(name, cur.context_, cur);
|
|
||||||
attrs.push(attr);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
this.subOptions = attrs;
|
|
||||||
},
|
|
||||||
|
|
||||||
optionAttributeMap: {
|
|
||||||
_isOption: function (cur, v) { },
|
|
||||||
value: function (cur, v) { cur.value = xml2nix($(v).children().first()); },
|
|
||||||
default: function (cur, v) { cur.defaultValue = xml2nix($(v).children().first()); },
|
|
||||||
example: function (cur, v) { cur.example = xml2nix($(v).children().first()); },
|
|
||||||
description: function (cur, v) { cur.description = this.string(v); },
|
|
||||||
typename: function (cur, v) { cur.typename = this.string(v); },
|
|
||||||
options: function (cur, v) { cur.loadSubOptions($("attrs", v).children()); },
|
|
||||||
declarations: function (cur, v) { cur.declarations = this.pathList(v); },
|
|
||||||
definitions: function (cur, v) { cur.definitions = this.pathList(v); },
|
|
||||||
|
|
||||||
string: function (v) {
|
|
||||||
return $(v).children("string").first().attr("value");
|
|
||||||
},
|
|
||||||
|
|
||||||
pathList: function (v) {
|
|
||||||
var list = [];
|
|
||||||
$(v).children("list").first().children().each(
|
|
||||||
function (idx) {
|
|
||||||
list.push($(this).attr("value"));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
loadOption: function (attrs) {
|
|
||||||
var cur = this;
|
|
||||||
|
|
||||||
attrs.each(
|
|
||||||
function (index) {
|
|
||||||
var name = $(this).attr("name");
|
|
||||||
log("loadOption: " + name);
|
|
||||||
cur.optionAttributeMap[name](cur, this);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
},
|
|
||||||
|
|
||||||
// keep the context under which this option has been used.
|
|
||||||
context_: null,
|
|
||||||
// name of the option.
|
|
||||||
name: "",
|
|
||||||
// result of nixos-option.
|
|
||||||
value: null,
|
|
||||||
typename: null,
|
|
||||||
defaultValue: null,
|
|
||||||
example: null,
|
|
||||||
description: "",
|
|
||||||
declarations: [],
|
|
||||||
definitions: [],
|
|
||||||
// path to reach this option
|
|
||||||
path: "",
|
|
||||||
|
|
||||||
// list of options accessible from here.
|
|
||||||
isLoaded: false,
|
|
||||||
isOption: false,
|
|
||||||
subOptions: []
|
|
||||||
};
|
|
||||||
|
|
||||||
var xml2nix_pptable = {
|
|
||||||
attrs: function (node, depth, pp) {
|
|
||||||
var children = node.children().not(
|
|
||||||
function () {
|
|
||||||
var name = $(this).attr("name");
|
|
||||||
return name.charAt(0) == "_";
|
|
||||||
}
|
|
||||||
);
|
|
||||||
var c = 0;
|
|
||||||
var out = "";
|
|
||||||
out += "{";
|
|
||||||
depth += 1;
|
|
||||||
children.each(
|
|
||||||
function (idx) {
|
|
||||||
c += 1;
|
|
||||||
out += pp.indent(depth);
|
|
||||||
out += pp.dispatch($(this), depth, pp);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
depth -= 1;
|
|
||||||
if (c > 0)
|
|
||||||
out += this.indent(depth);
|
|
||||||
else
|
|
||||||
out += " ";
|
|
||||||
out += "}";
|
|
||||||
return out;
|
|
||||||
},
|
|
||||||
list: function (node, depth, pp) {
|
|
||||||
var children = node.children();
|
|
||||||
var c = 0;
|
|
||||||
var out = "";
|
|
||||||
out += "[";
|
|
||||||
depth += 1;
|
|
||||||
children.each(
|
|
||||||
function (idx) {
|
|
||||||
c += 1;
|
|
||||||
out += pp.indent(depth);
|
|
||||||
out += pp.dispatch($(this), depth, pp);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
depth -= 1;
|
|
||||||
if (c > 0)
|
|
||||||
out += this.indent(depth);
|
|
||||||
else
|
|
||||||
out += " ";
|
|
||||||
out += "]";
|
|
||||||
return out;
|
|
||||||
},
|
|
||||||
attr: function (node, depth, pp) {
|
|
||||||
var name = node.attr("name");
|
|
||||||
var out = "";
|
|
||||||
var val = "";
|
|
||||||
out += name + " = ";
|
|
||||||
depth += 1;
|
|
||||||
val = pp.dispatch(node.children().first(), depth, pp);
|
|
||||||
out += val;
|
|
||||||
depth -= 1;
|
|
||||||
out += ";";
|
|
||||||
return out;
|
|
||||||
},
|
|
||||||
string: function (node, depth, pp) {
|
|
||||||
return "\"" + node.attr("value") + "\"";
|
|
||||||
},
|
|
||||||
path: function (node, depth, pp) {
|
|
||||||
return node.attr("value");
|
|
||||||
},
|
|
||||||
bool: function (node, depth, pp) {
|
|
||||||
return node.attr("value");
|
|
||||||
},
|
|
||||||
"int": function (node, depth, pp) {
|
|
||||||
return node.attr("value");
|
|
||||||
},
|
|
||||||
null: function (node, depth, pp) {
|
|
||||||
return "null";
|
|
||||||
},
|
|
||||||
derivation: function (node, depth, pp) {
|
|
||||||
return "<derivation>";
|
|
||||||
},
|
|
||||||
function: function (node, depth, pp) {
|
|
||||||
return "<function>";
|
|
||||||
},
|
|
||||||
unevaluated: function (node, depth, pp) {
|
|
||||||
return "<unevaluated>";
|
|
||||||
},
|
|
||||||
|
|
||||||
dispatch: function (node, depth, pp) {
|
|
||||||
for (var key in pp)
|
|
||||||
{
|
|
||||||
if(node.is(key))
|
|
||||||
{
|
|
||||||
// log(this.indent(depth) + "dispatch: " + key);
|
|
||||||
var out = pp[key](node, depth, pp);
|
|
||||||
// log(this.indent(depth) + "dispatch: => " + out);
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "<dispatch-error>";
|
|
||||||
},
|
|
||||||
indent: function (depth) {
|
|
||||||
var ret = "\n";
|
|
||||||
while (depth--)
|
|
||||||
ret += " ";
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function xml2nix(node) {
|
|
||||||
var depth = 0;
|
|
||||||
var pp = xml2nix_pptable;
|
|
||||||
var out = pp.dispatch(node, depth, pp);
|
|
||||||
// log("pretty:\n" + out);
|
|
||||||
return out;
|
|
||||||
}
|
|
|
@ -1,242 +0,0 @@
|
||||||
// extend NixOS options to handle the Tree View. Should be better to keep a
|
|
||||||
// separation of concern here.
|
|
||||||
|
|
||||||
Option.prototype.tv_opened = false;
|
|
||||||
Option.prototype.tv_size = 1;
|
|
||||||
|
|
||||||
Option.prototype.tv_open = function () {
|
|
||||||
this.tv_opened = true;
|
|
||||||
this.tv_size = 1;
|
|
||||||
|
|
||||||
// load an option if it is not loaded yet, and initialize them to be
|
|
||||||
// read by the Option view.
|
|
||||||
if (!this.isLoaded)
|
|
||||||
this.load();
|
|
||||||
|
|
||||||
// If this is not an option, then add it's lits of sub-options size.
|
|
||||||
if (!this.isOption)
|
|
||||||
{
|
|
||||||
for (var i = 0; i < this.subOptions.length; i++)
|
|
||||||
this.tv_size += this.subOptions[i].tv_size;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Option.prototype.tv_close = function () {
|
|
||||||
this.tv_opened = false;
|
|
||||||
this.tv_size = 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function OptionView (root, selCallback) {
|
|
||||||
root.tv_open();
|
|
||||||
this.rootOption = root;
|
|
||||||
this.selCallback = selCallback;
|
|
||||||
}
|
|
||||||
|
|
||||||
OptionView.prototype = {
|
|
||||||
rootOption: null,
|
|
||||||
selCallback: null,
|
|
||||||
|
|
||||||
// This function returns the path to option which is at the specified row.
|
|
||||||
reach_cache: null,
|
|
||||||
reachRow: function (row) {
|
|
||||||
var o = this.rootOption; // Current option.
|
|
||||||
var r = 0; // Number of rows traversed.
|
|
||||||
var c = 0; // Child index.
|
|
||||||
var path = [{ row: r, opt: o }]; // new Array();
|
|
||||||
// hypothesis: this.rootOption.tv_size is always open and bigger than
|
|
||||||
|
|
||||||
// Use the previous returned value to avoid making to many checks and to
|
|
||||||
// optimize for frequent access of near rows.
|
|
||||||
if (this.reach_cache != null)
|
|
||||||
{
|
|
||||||
for (var i = this.reach_cache.length - 2; i >= 0; i--) {
|
|
||||||
var p = this.reach_cache[i];
|
|
||||||
// If we will have to go the same path.
|
|
||||||
if (row >= p.row && row < p.row + p.opt.tv_size)
|
|
||||||
{
|
|
||||||
path.unshift(p);
|
|
||||||
r = path[0].row;
|
|
||||||
o = path[0].opt;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
while (r != row)
|
|
||||||
{
|
|
||||||
// Go deeper in the child which contains the requested row. The
|
|
||||||
// tv_size contains the size of the tree starting from each option.
|
|
||||||
c = 0;
|
|
||||||
while (c < o.subOptions.length && r + o.subOptions[c].tv_size < row)
|
|
||||||
{
|
|
||||||
r += o.subOptions[c].tv_size;
|
|
||||||
c += 1;
|
|
||||||
}
|
|
||||||
if (c < o.subOptions.length && r + o.subOptions[c].tv_size >= row)
|
|
||||||
{
|
|
||||||
// Count the current option as a row.
|
|
||||||
o = o.subOptions[c];
|
|
||||||
r += 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
alert("WTF: " + o.name + " ask: " + row + " children: " + o.subOptions + " c: " + c);
|
|
||||||
path.unshift({ row: r, opt: o });
|
|
||||||
}
|
|
||||||
|
|
||||||
this.reach_cache = path;
|
|
||||||
return path;
|
|
||||||
},
|
|
||||||
|
|
||||||
// needs to return true if there is a /row/ at the same level /after/ a
|
|
||||||
// given row.
|
|
||||||
hasNextSibling: function(row, after) {
|
|
||||||
log("sibling " + row + " after " + after);
|
|
||||||
var path = reachRow(row);
|
|
||||||
if (path.length > 1)
|
|
||||||
{
|
|
||||||
var last = path[1].row + path[1].opt.tv_size;
|
|
||||||
// Has a next sibling if the row is not over the size of the
|
|
||||||
// parent and if the current one is not the last child.
|
|
||||||
return after + 1 < last && path[0].row + path[0].opt.tv_size < last;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
// The top-level option has no sibling.
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Does the current row contain any sub-options?
|
|
||||||
isContainer: function(row) {
|
|
||||||
return !this.reachRow(row)[0].opt.isOption;
|
|
||||||
},
|
|
||||||
isContainerEmpty: function(row) {
|
|
||||||
return this.reachRow(row)[0].opt.subOptions.length == 0;
|
|
||||||
},
|
|
||||||
isContainerOpen: function(row) {
|
|
||||||
return this.reachRow(row)[0].opt.tv_opened;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Open or close an option.
|
|
||||||
toggleOpenState: function (row) {
|
|
||||||
var path = this.reachRow(row);
|
|
||||||
var delta = -path[0].opt.tv_size;
|
|
||||||
if (path[0].opt.tv_opened)
|
|
||||||
path[0].opt.tv_close();
|
|
||||||
else
|
|
||||||
path[0].opt.tv_open();
|
|
||||||
delta += path[0].opt.tv_size;
|
|
||||||
|
|
||||||
// Parents are alreay opened, but we need to update the tv_size
|
|
||||||
// counters. Thus we have to invalidate the reach cache.
|
|
||||||
this.reach_cache = null;
|
|
||||||
for (var i = 1; i < path.length; i++)
|
|
||||||
path[i].opt.tv_open();
|
|
||||||
|
|
||||||
this.tree.rowCountChanged(row + 1, delta);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Return the identation level of the option at the line /row/. The
|
|
||||||
// top-level level is 0.
|
|
||||||
getLevel: function(row) {
|
|
||||||
return this.reachRow(row).length - 1;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Obtain the index of a parent row. If there is no parent row,
|
|
||||||
// returns -1.
|
|
||||||
getParentIndex: function(row) {
|
|
||||||
var path = this.reachRow(row);
|
|
||||||
if (path.length > 1)
|
|
||||||
return path[1].row;
|
|
||||||
else
|
|
||||||
return -1;
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
// Return the content of each row base on the column name.
|
|
||||||
getCellText: function(row, column) {
|
|
||||||
if (column.id == "opt-name")
|
|
||||||
return this.reachRow(row)[0].opt.name;
|
|
||||||
if (column.id == "dbg-size")
|
|
||||||
return this.reachRow(row)[0].opt.tv_size;
|
|
||||||
return "";
|
|
||||||
},
|
|
||||||
|
|
||||||
// We have no column with images.
|
|
||||||
getCellValue: function(row, column) { },
|
|
||||||
|
|
||||||
|
|
||||||
isSelectable: function(row, column) { return true; },
|
|
||||||
|
|
||||||
// Get the selection out of the tree and give options to the call back
|
|
||||||
// function.
|
|
||||||
selectionChanged: function() {
|
|
||||||
if (this.selCallback == null)
|
|
||||||
return;
|
|
||||||
var opts = [];
|
|
||||||
var start = new Object();
|
|
||||||
var end = new Object();
|
|
||||||
var numRanges = this.tree.view.selection.getRangeCount();
|
|
||||||
|
|
||||||
for (var t = 0; t < numRanges; t++) {
|
|
||||||
this.tree.view.selection.getRangeAt(t,start,end);
|
|
||||||
for (var v = start.value; v <= end.value; v++) {
|
|
||||||
var opt = this.reachRow(v)[0].opt;
|
|
||||||
if (!opt.isLoaded)
|
|
||||||
opt.load();
|
|
||||||
if (opt.isOption)
|
|
||||||
opts.push(opt);
|
|
||||||
|
|
||||||
// FIXME: no need to make things slowing down, because our current
|
|
||||||
// callback do not handle multiple option display.
|
|
||||||
if (!opts.empty)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// FIXME: no need to make things slowing down, because our current
|
|
||||||
// callback do not handle multiple option display.
|
|
||||||
if (!opts.empty)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!opts.empty)
|
|
||||||
this.selCallback(opts);
|
|
||||||
},
|
|
||||||
|
|
||||||
set rowCount(c) { throw "rowCount is a readonly property"; },
|
|
||||||
get rowCount() { return this.rootOption.tv_size; },
|
|
||||||
|
|
||||||
// refuse drag-n-drop of options.
|
|
||||||
canDrop: function (index, orientation, dataTransfer) { return false; },
|
|
||||||
drop: function (index, orientation, dataTransfer) { },
|
|
||||||
|
|
||||||
// ?
|
|
||||||
getCellProperties: function(row, column, prop) { },
|
|
||||||
getColumnProperties: function(column, prop) { },
|
|
||||||
getRowProperties: function(row, prop) { },
|
|
||||||
getImageSrc: function(row, column) { },
|
|
||||||
|
|
||||||
// No progress columns are used.
|
|
||||||
getProgressMode: function(row, column) { },
|
|
||||||
|
|
||||||
// Do not add options yet.
|
|
||||||
isEditable: function(row, column) { return false; },
|
|
||||||
setCellValue: function(row, column, value) { },
|
|
||||||
setCellText: function(row, column, value) { },
|
|
||||||
|
|
||||||
// ...
|
|
||||||
isSeparator: function(index) { return false; },
|
|
||||||
isSorted: function() { return false; },
|
|
||||||
performAction: function(action) { },
|
|
||||||
performActionOnCell: function(action, row, column) { },
|
|
||||||
performActionOnRow: function(action, row) { }, // ??
|
|
||||||
|
|
||||||
// ??
|
|
||||||
cycleCell: function (row, col) { },
|
|
||||||
cycleHeader: function(col) { },
|
|
||||||
|
|
||||||
selection: null,
|
|
||||||
tree: null,
|
|
||||||
setTree: function(tree) { this.tree = tree; }
|
|
||||||
};
|
|
|
@ -1,154 +0,0 @@
|
||||||
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;
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
pref("toolkit.defaultChromeURI", "chrome://nixos-gui/content/myviewer.xul");
|
|
||||||
pref("general.useragent.extra.myviewer", "NixOS gui/0.0");
|
|
||||||
|
|
||||||
/* debugging prefs */
|
|
||||||
pref("browser.dom.window.dump.enabled", true); // enable output to stderr
|
|
||||||
pref("javascript.options.showInConsole", true); // show javascript errors from chrome: files in the jsconsole
|
|
||||||
pref("javascript.options.strict", true); // show javascript strict warnings in the jsconsole
|
|
||||||
|
|
||||||
/* disable xul cache so that modifications to chrome: files apply without restarting xulrunner */
|
|
||||||
pref("nglayout.debug.disable_xul_cache", true);
|
|
||||||
pref("nglayout.debug.disable_xul_fastload", true);
|
|
|
@ -53,46 +53,9 @@ let
|
||||||
inherit (config.system) nixosVersion nixosCodeName;
|
inherit (config.system) nixosVersion nixosCodeName;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
nixos-gui = pkgs.xulrunnerWrapper {
|
|
||||||
launcher = "nixos-gui";
|
|
||||||
application = pkgs.stdenv.mkDerivation {
|
|
||||||
name = "nixos-gui";
|
|
||||||
buildCommand = ''
|
|
||||||
cp -r "$gui" "$out"
|
|
||||||
|
|
||||||
# Do not force the copy if the file exists in the sources (this
|
|
||||||
# happens for developpers)
|
|
||||||
test -e "$out/chrome/content/jquery-1.5.2.js" ||
|
|
||||||
cp -f "$jquery" "$out/chrome/content/jquery-1.5.2.js"
|
|
||||||
'';
|
|
||||||
gui = lib.cleanSource "${modulesPath}/../gui";
|
|
||||||
jquery = pkgs.fetchurl {
|
|
||||||
url = http://code.jquery.com/jquery-1.5.2.min.js;
|
|
||||||
sha256 = "8f0a19ee8c606b35a10904951e0a27da1896eafe33c6e88cb7bcbe455f05a24a";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
*/
|
|
||||||
|
|
||||||
in
|
in
|
||||||
|
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
options = {
|
|
||||||
|
|
||||||
installer.enableGraphicalTools = mkOption {
|
|
||||||
default = false;
|
|
||||||
type = types.bool;
|
|
||||||
example = true;
|
|
||||||
description = ''
|
|
||||||
Enable the installation of graphical tools.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
*/
|
|
||||||
|
|
||||||
config = {
|
config = {
|
||||||
environment.systemPackages =
|
environment.systemPackages =
|
||||||
[ nixos-build-vms
|
[ nixos-build-vms
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue