Bladeren bron

input stuff works now

master
mortie 7 jaren geleden
bovenliggende
commit
469555adc9
5 gewijzigde bestanden met toevoegingen van 176 en 5 verwijderingen
  1. 1
    0
      .gitignore
  2. 10
    2
      daemon.js
  3. 144
    0
      modules/input/index.js
  4. 3
    3
      modules/wallpaper/index.js
  5. 18
    0
      package.json

+ 1
- 0
.gitignore Bestand weergeven

@@ -0,0 +1 @@
node_modules

+ 10
- 2
daemon.js Bestand weergeven

@@ -25,14 +25,22 @@ var config = {
],
},

{
type: "pointer",
name: "Razer Razer Naga",
options: [
[ "libinput Accel Speed", "-0.8" ],
],
},

{
type: "keyboard",
name: "*",
commands: [
"xset r rate 200 60",
"setxkbmap dvorak -option ctrl:swapcaps -option altwin:swap_alt_win",
]
}
],
},
],

wallpaper: {

+ 144
- 0
modules/input/index.js Bestand weergeven

@@ -1,3 +1,9 @@
var udev = require("udev");
var spawn = require("child_process").spawn;
var exec = require("child_process").exec;

var debounce = require("../../js/debounce");

exports.start = start;
exports.stop = stop;
exports.event = event;
@@ -6,13 +12,151 @@ var conf;
var logger;
var modules;

var monitor;

// Set an xinput property
function setProp(name, val, suppressWarnings) {
var args = [ "--set-prop", name ];
val.forEach(v => args.push(v));

// We need to wait for X to recognize the device
setTimeout(function() {
var child = spawn("xinput", args)
child.on("close", code => {
if (code !== 0 && !suppressWarnings)
logger.warn("Xinput command failed:", args.join(", "));
});

if (!suppressWarnings) {
child.stderr.on("data", d => {
logger.warn(
"Xinput command for", name, "failed:",
d.toString().trim());
});
}
}, 500);
}

// Queued commands will be run once runCmds is called
var queuedCmds = [];
function queueCmd(command) {
if (queuedCmds.indexOf(command) === -1)
queuedCmds.push(command);
}

// Run queued commands, debounced
var runCmds = debounce(function() {
queuedCmds.forEach(cmd => {
var child = exec(cmd);
child.on("close", code => {
if (code !== 0)
logger.warn("Command failed:", cmd);
});
});

queuedCmds = [];
});

// Devices which aren't keyboards or mice with names aren't interesting
function filter(dev) {
return dev.NAME && dev.SUBSYSTEM === "input" &&
(dev.ID_INPUT_KEYBOARD || dev.ID_INPUT_MOUSE);
}

// name can be either an array or a string
function nameMatches(dev, name) {

// Remove quotes form device name
var devname = dev.NAME.substring(1, dev.NAME.length - 1);

if (typeof name === "string") {
if (name !== "*" && name !== devname)
return false;
} else if (name instanceof Array) {
var matched = false;
for (var i in name) {
if (name === devname) {
matched = true;
break;
}
}
if (!matched)
return false;
} else {
logger.warning("Expected name to be string or array");
return false;
}

return true;
}

function onchange(dev, evt) {
if (!filter(dev))
return;

// Find out what to log
var inputType;
if (dev.ID_INPUT_KEYBOARD && dev.ID_INPUT_MOUSE)
inputType = "keyboard/mouse";
else if (dev.ID_INPUT_KEYBOARD)
inputType = "keyboard";
else if (dev.ID_INPUT_MOUSE)
inputType = "mouse";

// Log add/change
if (evt === "add")
logger.info(inputType, dev.NAME, "added");
else if (evt === "change")
logger.info(inputType, dev.NAME, "changed");

// Run through and apply relevant rules
conf.forEach(entry => {
if (entry.type === "pointer" && !dev.ID_INPUT_MOUSE)
return;
if (entry.type === "keyboard" && !dev.ID_INPUT_KEYBOARD)
return;
if (!nameMatches(dev, entry.name))
return;

// Add pointer: or keyboard: to name, and remove quotes
var name = dev.NAME.substring(1, dev.NAME.length - 1);
if (entry.type === "pointer")
name = "pointer:"+name;
else if (entry.type === "keyboard")
name = "keyboard:"+name
else
return log.error("Invalid input type: "+entry.type);

// If the entry matches everything, we don't need to print xinput warnings
var suppressWarnings = entry.name === "*";

// Set xinput options
if (entry.options)
entry.options.forEach(prop => setProp(name, prop, suppressWarnings));

// Run commands
if (entry.commands)
entry.commands.forEach(queueCmd);
});

// Run queued commands
runCmds();
}

function start(conf_, logger_, modules_) {
conf = conf_ || conf;
logger = logger_ || logger;
modules = modules_ || modules;

udev.list().forEach(dev => onchange(dev, "init"));

monitor = udev.monitor();
monitor.on("add", dev => onchange(dev, "add"));
monitor.on("change", dev => onchange(dev, "change"));
}

function stop(cb) {
monitor.close();
cb();
}


+ 3
- 3
modules/wallpaper/index.js Bestand weergeven

@@ -63,10 +63,10 @@ function start(conf_, logger_, modules_) {
var dirname = pathlib.dirname(conf.path);
var basename = pathlib.basename(conf.path);

var run = debounce(runFeh);
var run = debounce(runFeh, 10);

fs.watch(dirname, (type, name) => {
if (name !== basename)
fs.watch(dirname, (evt, name) => {
if (name !== basename || evt !== "change")
return;

run();

+ 18
- 0
package.json Bestand weergeven

@@ -0,0 +1,18 @@
{
"name": "dedaemon",
"version": "1.0.0",
"description": "",
"main": "daemon.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "gogs@git.mort.coffee:mort/dedaemon.git"
},
"author": "Martin Dørum Nygaard <martid0311@gmail.com> (http://mort.coffee)",
"license": "ISC",
"dependencies": {
"udev": "^0.4.0"
}
}

Laden…
Annuleren
Opslaan