diff --git a/lib/naughty/layout/legacy.lua b/lib/naughty/layout/legacy.lua index ca0729327..e1162061c 100644 --- a/lib/naughty/layout/legacy.lua +++ b/lib/naughty/layout/legacy.lua @@ -126,42 +126,6 @@ local function get_offset(s, position, idx, width, height) return v end -local escape_pattern = "[<>&]" -local escape_subs = { ['<'] = "<", ['>'] = ">", ['&'] = "&" } - --- Cache the markup -local function set_escaped_text(self) - local text = self.message or "" - local title = self.title and self.title .. "\n" or "" - - local textbox = self.textbox - - local function set_markup(pattern, replacements) - return textbox:set_markup_silently(string.format('%s%s', title, text:gsub(pattern, replacements))) - end - - local function set_text() - textbox:set_text(string.format('%s %s', title, text)) - end - - -- Since the title cannot contain markup, it must be escaped first so that - -- it is not interpreted by Pango later. - title = title:gsub(escape_pattern, escape_subs) - -- Try to set the text while only interpreting
. - if not set_markup("", "\n") then - -- That failed, escape everything which might cause an error from pango - if not set_markup(escape_pattern, escape_subs) then - -- Ok, just ignore all pango markup. If this fails, we got some invalid utf8 - if not pcall(set_text) then - textbox:set_markup("<Invalid markup or UTF8, cannot display message>") - end - end - end -end - -naughty.connect_signal("property::text" ,set_escaped_text) -naughty.connect_signal("property::title",set_escaped_text) - --- Re-arrange notifications according to their position and index - internal -- @@ -242,6 +206,45 @@ local function update_size(notification) end +local escape_pattern = "[<>&]" +local escape_subs = { ['<'] = "<", ['>'] = ">", ['&'] = "&" } + +-- Cache the markup +local function set_escaped_text(self) + local text = self.message or "" + local title = self.title and self.title .. "\n" or "" + + local textbox = self.textbox + + local function set_markup(pattern, replacements) + return textbox:set_markup_silently(string.format('%s%s', title, text:gsub(pattern, replacements))) + end + + local function set_text() + textbox:set_text(string.format('%s %s', title, text)) + end + + -- Since the title cannot contain markup, it must be escaped first so that + -- it is not interpreted by Pango later. + title = title:gsub(escape_pattern, escape_subs) + -- Try to set the text while only interpreting
. + if not set_markup("", "\n") then + -- That failed, escape everything which might cause an error from pango + if not set_markup(escape_pattern, escape_subs) then + -- Ok, just ignore all pango markup. If this fails, we got some invalid utf8 + if not pcall(set_text) then + textbox:set_markup("<Invalid markup or UTF8, cannot display message>") + end + end + end + + if self.size_info then update_size(self) end +end + +naughty.connect_signal("property::text" ,set_escaped_text) +naughty.connect_signal("property::title",set_escaped_text) + + local function cleanup(self, _ --[[reason]], keep_visible) -- It is not a legacy notification if not self.box then return end diff --git a/tests/test-naughty-legacy.lua b/tests/test-naughty-legacy.lua index 3861bff68..6397095cd 100644 --- a/tests/test-naughty-legacy.lua +++ b/tests/test-naughty-legacy.lua @@ -735,13 +735,32 @@ table.insert(steps, function() assert(not naughty.suspended) -- Replace the text + assert(n.title == "foo") assert(n.message == "bar") assert(n.text == "bar") - assert(n.title == "foo") + local width, height = n.width, n.height + assert(width) + assert(height) naughty.replace_text(n, "foobar", "baz") assert(n.title == "foobar") assert(n.message == "baz") assert(n.text == "baz") + assert(n.width > width) + assert(n.height == height) + width, height = n.width, n.height + naughty.replace_text(n, "foo", "bar\nbaz") + assert(n.title == "foo") + assert(n.message == "bar\nbaz") + assert(n.text == "bar\nbaz") + assert(n.width < width) + assert(n.height > height) + width, height = n.width, n.height + naughty.replace_text(n, "foo", "bar") + assert(n.title == "foo") + assert(n.message == "bar") + assert(n.text == "bar") + assert(n.width == width) + assert(n.height < height) -- Test the ID system local id = n.id