Fix awful.spawn to work with more LGI versions
Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
parent
995361449a
commit
c04718a150
|
@ -29,6 +29,45 @@ local protected_call = require("gears.protected_call")
|
||||||
local spawn = {}
|
local spawn = {}
|
||||||
|
|
||||||
|
|
||||||
|
local end_of_file
|
||||||
|
do
|
||||||
|
-- API changes, bug fixes and lots of fun. Figure out how a EOF is signalled.
|
||||||
|
local input
|
||||||
|
if not pcall(function()
|
||||||
|
-- No idea when this API changed, but some versions expect a string,
|
||||||
|
-- others a table with some special(?) entries
|
||||||
|
input = Gio.DataInputStream.new(Gio.MemoryInputStream.new_from_data(""))
|
||||||
|
end) then
|
||||||
|
input = Gio.DataInputStream.new(Gio.MemoryInputStream.new_from_data({}))
|
||||||
|
end
|
||||||
|
local line, length = input:read_line()
|
||||||
|
if not line then
|
||||||
|
-- Fixed in 2016: NULL on the C side is transformed to nil in Lua
|
||||||
|
end_of_file = function(arg)
|
||||||
|
return not arg
|
||||||
|
end
|
||||||
|
elseif tostring(line) == "" and #line ~= length then
|
||||||
|
-- "Historic" behaviour for end-of-file:
|
||||||
|
-- - NULL is turned into an empty string
|
||||||
|
-- - The length variable is not initialized
|
||||||
|
-- It's highly unlikely that the uninitialized variable has value zero.
|
||||||
|
-- Use this hack to detect EOF.
|
||||||
|
end_of_file = function(arg1, arg2)
|
||||||
|
return #arg1 ~= arg2
|
||||||
|
end
|
||||||
|
else
|
||||||
|
assert(tostring(line) == "", "Cannot determine how to detect EOF")
|
||||||
|
-- The above uninitialized variable was fixed and thus length is
|
||||||
|
-- always 0 when line is NULL in C. We cannot tell apart an empty line and
|
||||||
|
-- EOF in this case.
|
||||||
|
require("gears.debug").print_warning("Cannot reliably detect EOF on an "
|
||||||
|
.. "GIOInputStream with this LGI version")
|
||||||
|
end_of_file = function(arg)
|
||||||
|
return tostring(arg) == ""
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
spawn.snid_buffer = {}
|
spawn.snid_buffer = {}
|
||||||
|
|
||||||
function spawn.on_snid_callback(c)
|
function spawn.on_snid_callback(c)
|
||||||
|
@ -219,7 +258,7 @@ function spawn.read_lines(input_stream, line_callback, done_callback, close)
|
||||||
-- Error
|
-- Error
|
||||||
print("Error in awful.spawn.read_lines:", tostring(length))
|
print("Error in awful.spawn.read_lines:", tostring(length))
|
||||||
done()
|
done()
|
||||||
elseif #line ~= length then
|
elseif end_of_file(line, length) then
|
||||||
-- End of file
|
-- End of file
|
||||||
done()
|
done()
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue