Merge pull request #728 from joachimmathes/module_dunstctl
Provide alternative dunstctl implementation
This commit is contained in:
commit
45125f39af
5 changed files with 55 additions and 59 deletions
|
@ -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"
|
||||||
|
|
|
@ -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']
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -259,7 +259,8 @@
|
||||||
},
|
},
|
||||||
"dunstctl": {
|
"dunstctl": {
|
||||||
"muted": { "prefix": "" },
|
"muted": { "prefix": "" },
|
||||||
"unmuted": { "prefix": "" }
|
"unmuted": { "prefix": "" },
|
||||||
|
"unknown": { "prefix": "" }
|
||||||
},
|
},
|
||||||
"twmn": {
|
"twmn": {
|
||||||
"muted": { "prefix": "" },
|
"muted": { "prefix": "" },
|
||||||
|
|
|
@ -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" }
|
||||||
|
|
Loading…
Reference in a new issue