2015-10-15 15:25:10 +00:00
|
|
|
spawn = require("child_process").spawn
|
2015-11-04 18:39:25 +00:00
|
|
|
log = require("../logger")("XWindowManager")
|
2015-10-15 15:25:10 +00:00
|
|
|
services = require("../services")
|
|
|
|
StreamSplitter = require("stream-splitter")
|
|
|
|
require_bin = require("../require_bin")
|
|
|
|
|
2015-11-04 18:39:25 +00:00
|
|
|
xwmBinPath = require_bin "x-window-manager", false
|
2015-10-15 15:25:10 +00:00
|
|
|
|
2015-11-04 18:39:25 +00:00
|
|
|
module.exports = class XWindowManagerService extends services.Service
|
2015-10-15 15:25:10 +00:00
|
|
|
dependencies: [
|
|
|
|
]
|
2015-11-04 18:39:25 +00:00
|
|
|
constructor: -> super "XWindowManager",
|
2015-10-15 15:25:10 +00:00
|
|
|
start: (cb) ->
|
2015-11-04 18:39:25 +00:00
|
|
|
if not xwmBinPath?
|
|
|
|
cb? new Error "A window manager not available."
|
2015-11-02 11:44:12 +00:00
|
|
|
return
|
|
|
|
|
2015-11-04 22:33:44 +00:00
|
|
|
if not process.env.XDG_RUNTIME_DIR? or process.env.XDG_RUNTIME_DIR.trim() == ""
|
|
|
|
cb? new Error "XDG runtime directory needs to be set."
|
|
|
|
return
|
|
|
|
|
|
|
|
if not process.env.DISPLAY? or process.env.DISPLAY.trim() == ""
|
|
|
|
cb? new Error "There is no display to run TeamSpeak3 on."
|
|
|
|
return
|
|
|
|
|
2015-10-15 15:25:10 +00:00
|
|
|
if @process
|
|
|
|
cb? null, @process
|
|
|
|
return
|
|
|
|
|
|
|
|
calledCallback = false
|
|
|
|
|
|
|
|
proc = null
|
|
|
|
doStart = null
|
|
|
|
doStart = () =>
|
2015-11-04 22:23:34 +00:00
|
|
|
proc = spawn xwmBinPath, [],
|
2015-10-15 15:25:10 +00:00
|
|
|
stdio: ['ignore', 'pipe', 'pipe']
|
|
|
|
detached: true
|
|
|
|
env:
|
|
|
|
DISPLAY: process.env.DISPLAY
|
|
|
|
XDG_RUNTIME_DIR: process.env.XDG_RUNTIME_DIR
|
|
|
|
HOME: process.env.HOME
|
|
|
|
|
|
|
|
# logging
|
|
|
|
stdoutTokenizer = proc.stdout.pipe StreamSplitter "\n"
|
|
|
|
stdoutTokenizer.encoding = "utf8";
|
|
|
|
stdoutTokenizer.on "token", (token) =>
|
|
|
|
token = token.trim() # get rid of \r
|
|
|
|
@log.debug token
|
|
|
|
|
|
|
|
stderrTokenizer = proc.stderr.pipe StreamSplitter "\n"
|
|
|
|
stderrTokenizer.encoding = "utf8";
|
|
|
|
stderrTokenizer.on "token", (token) =>
|
|
|
|
token = token.trim() # get rid of \r
|
|
|
|
@log.warn token
|
|
|
|
|
|
|
|
proc.on "exit", () =>
|
|
|
|
if @state == "stopping"
|
|
|
|
return
|
|
|
|
if not calledCallback
|
|
|
|
calledCallback = true
|
2015-11-04 18:39:25 +00:00
|
|
|
@log.warn "Window manager terminated unexpectedly during startup."
|
|
|
|
cb? new Error "Window manager terminated unexpectedly."
|
|
|
|
@log.warn "Window manager terminated unexpectedly, restarting."
|
2015-10-15 15:25:10 +00:00
|
|
|
doStart()
|
|
|
|
|
|
|
|
@process = proc
|
|
|
|
|
|
|
|
doStart()
|
|
|
|
|
|
|
|
setTimeout (() =>
|
|
|
|
if not calledCallback
|
|
|
|
calledCallback = true
|
|
|
|
cb? null, @process), 1500 # TODO: Use some more stable condition
|
|
|
|
|
|
|
|
stop: (cb) ->
|
|
|
|
if not @process
|
|
|
|
cb?()
|
|
|
|
return
|
|
|
|
|
|
|
|
@process.kill()
|
|
|
|
await @process.once "exit", defer()
|
|
|
|
|
|
|
|
cb?()
|