Provide alternative dunstctl implementation

This commit is contained in:
Joachim Mathes 2020-10-18 15:34:52 +02:00
parent 68bd6f8ef8
commit 3c0499ba56
5 changed files with 55 additions and 59 deletions

View file

@ -1,43 +1,42 @@
# pylint: disable=C0111,R0903 # pylint: disable=C0111,R0903
""" """Toggle dunst notifications using dunstctl.
Toggle dunst notifications using dunstctl.
When notifications are paused using this module dunst doesn't get killed and you'll keep getting notifications on the background that will be displayed when unpausing. When notifications are paused using this module dunst doesn't get killed and
This is specially useful if you're using dunst's scripting (https://wiki.archlinux.org/index.php/Dunst#Scripting), which requires dunst to be running. Scripts will be executed when dunst gets unpaused. you'll keep getting notifications on the background that will be displayed when
unpausing. This is specially useful if you're using dunst's scripting
(https://wiki.archlinux.org/index.php/Dunst#Scripting), which requires dunst to
be running. Scripts will be executed when dunst gets unpaused.
Requires: Requires:
* dunst v1.5.0+ * dunst v1.5.0+
contributed by `cristianmiranda <https://github.com/cristianmiranda>`_ - many thanks! contributed by `cristianmiranda <https://github.com/cristianmiranda>`_ - many thanks!
contributed by `joachimmathes <https://github.com/joachimmathes>`_ - many thanks!
""" """
import core.module import core.module
import core.widget import core.widget
import core.input import core.input
import util.cli import util.cli
class Module(core.module.Module): class Module(core.module.Module):
def __init__(self, config, theme): def __init__(self, config, theme):
super().__init__(config, theme, core.widget.Widget("")) super().__init__(config, theme, core.widget.Widget(""))
self._paused = self.__isPaused() core.input.register(self, button=core.input.LEFT_MOUSE, cmd=self.__toggle_state)
core.input.register(self, button=core.input.LEFT_MOUSE, cmd=self.toggle_status) self.__states = {"unknown": ["unknown", "critical"],
"true": ["muted", "warning"],
"false": ["unmuted"]}
def toggle_status(self, event): def __toggle_state(self, event):
self._paused = self.__isPaused() util.cli.execute("dunstctl set-paused toggle", ignore_errors=True)
if self._paused:
util.cli.execute("dunstctl set-paused false")
else:
util.cli.execute("dunstctl set-paused true")
self._paused = not self._paused
def __isPaused(self):
return util.cli.execute("dunstctl is-paused").strip() == "true"
def state(self, widget): def state(self, widget):
if self._paused: return self.__states[self.__is_dunst_paused()]
return ["muted", "warning"]
return ["unmuted"] def __is_dunst_paused(self):
result = util.cli.execute("dunstctl is-paused",
return_exitcode=True,
ignore_errors=True)
return result[1].rstrip() if result[0] == 0 else "unknown"

View file

@ -14,54 +14,34 @@ def test_load_module():
__import__("modules.contrib.dunstctl") __import__("modules.contrib.dunstctl")
def test_dunst_running(mocker): def test_dunst_running(mocker):
command = mocker.patch('util.cli.execute', return_value='false') command = mocker.patch('util.cli.execute', return_value=(0, "false"))
module = build_module() module = build_module()
module.update() module.update()
command.assert_called_with('dunstctl is-paused')
widget = module.widget() widget = module.widget()
assert module.state(widget) == ['unmuted']
actual = module.state(widget)
command.assert_called_with('dunstctl is-paused', return_exitcode=True, ignore_errors=True)
assert actual == ['unmuted']
def test_dunst_paused(mocker): def test_dunst_paused(mocker):
command = mocker.patch('util.cli.execute', return_value='true') command = mocker.patch('util.cli.execute', return_value=(0, "true"))
module = build_module() module = build_module()
module.update() module.update()
command.assert_called_with('dunstctl is-paused')
widget = module.widget() widget = module.widget()
assert module.state(widget) == ['muted', 'warning']
def test_toggle_status_pause(mocker): actual = module.state(widget)
command = mocker.patch('util.cli.execute') command.assert_called_with('dunstctl is-paused', return_exitcode=True, ignore_errors=True)
command.side_effect = ['true', 'true', None] assert actual == ['muted', 'warning']
def test_dunst_off(mocker):
command = mocker.patch('util.cli.execute', return_value=(1, "dontcare"))
module = build_module() module = build_module()
module.toggle_status(False) module.update()
widget = module.widget()
command.assert_any_call('dunstctl set-paused false')
def test_toggle_status_unpause(mocker):
command = mocker.patch('util.cli.execute')
command.side_effect = ['false', 'false', None]
module = build_module()
module.toggle_status(False)
command.assert_called_with('dunstctl set-paused true')
def test_input_register(mocker):
command = mocker.patch('util.cli.execute')
input_register = mocker.patch('core.input.register')
module = build_module()
input_register.assert_called_with(
module,
button=core.input.LEFT_MOUSE,
cmd=module.toggle_status
)
actual = module.state(widget)
command.assert_called_with('dunstctl is-paused', return_exitcode=True, ignore_errors=True)
assert actual == ['unknown', 'critical']

View file

@ -355,6 +355,17 @@
"prefix": "dunst" "prefix": "dunst"
} }
}, },
"dunstctl": {
"muted": {
"prefix": "dunst(muted)"
},
"unmuted": {
"prefix": "dunst"
},
"unknown": {
"prefix": "dunst(unknown)"
}
},
"twmn": { "twmn": {
"muted": { "muted": {
"prefix": "twmn" "prefix": "twmn"

View file

@ -259,7 +259,8 @@
}, },
"dunstctl": { "dunstctl": {
"muted": { "prefix": "" }, "muted": { "prefix": "" },
"unmuted": { "prefix": "" } "unmuted": { "prefix": "" },
"unknown": { "prefix": "" }
}, },
"twmn": { "twmn": {
"muted": { "prefix": "" }, "muted": { "prefix": "" },

View file

@ -187,6 +187,11 @@
"muted": { "prefix": "\uf39a" }, "muted": { "prefix": "\uf39a" },
"unmuted": { "prefix": "\uf39b" } "unmuted": { "prefix": "\uf39b" }
}, },
"dunstctl": {
"muted": { "prefix": "\uf39a" },
"unmuted": { "prefix": "\uf39b" },
"unknown": { "prefix": "\uf142" }
},
"twmn": { "twmn": {
"muted": { "prefix": "\uf1f6" }, "muted": { "prefix": "\uf1f6" },
"unmuted": { "prefix": "\uf0f3" } "unmuted": { "prefix": "\uf0f3" }