From 940172aab197b432af476de990b61c2f5d0baf05 Mon Sep 17 00:00:00 2001 From: Bernhard B Date: Sun, 28 Jul 2019 18:14:46 +0200 Subject: [PATCH] added new system module * allows to shutdown/reboot the system --- bumblebee/modules/system.py | 77 +++++++++++++++++++++++++++++++++ themes/icons/ascii.json | 5 ++- themes/icons/awesome-fonts.json | 5 ++- themes/icons/ionicons.json | 5 ++- 4 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 bumblebee/modules/system.py diff --git a/bumblebee/modules/system.py b/bumblebee/modules/system.py new file mode 100644 index 0000000..a741a6c --- /dev/null +++ b/bumblebee/modules/system.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +# pylint: disable=C0111,R0903 + +""" system module + +adds the possibility to + * shutdown + * reboot +the system. + +Per default a confirmation dialog is shown before the actual action is performed. + +Paramters: + * system.confirm: show confirmation dialog before performing any action (default: true) +""" + +import logging +import bumblebee.input +import bumblebee.output +import bumblebee.engine +import bumblebee.popup_v2 +import functools + +try: + import Tkinter as tk + import tkMessageBox as tkmessagebox +except ImportError: + # python 3 + try: + import tkinter as tk + from tkinter import messagebox as tkmessagebox + except ImportError: + logging.warning("failed to import tkinter - bumblebee popups won't work!") + + +class Module(bumblebee.engine.Module): + def __init__(self, engine, config): + super(Module, self).__init__(engine, config, + bumblebee.output.Widget(full_text=self.text) + ) + + self._confirm = True + if self.parameter("confirm", "true") == "false": + self._confirm = False + + engine.input.register_callback(self, button=bumblebee.input.LEFT_MOUSE, + cmd=self.popup) + + def update(self, widgets): + pass + + def text(self, widget): + return "" + + def _on_command(self, header, text, command): + do_it = True + if self._confirm: + root = tk.Tk() + root.withdraw() + root.focus_set() + + do_it = tkmessagebox.askyesno(header, text) + + if do_it: + bumblebee.util.execute(command) + root.destroy() + + + def popup(self, widget): + menu = bumblebee.popup_v2.PopupMenu() + menu.add_menuitem("shutdown", callback=functools.partial(self._on_command, "Shutdown", "Shutdown?", "shutdown -h now")) + menu.add_menuitem("reboot", callback=functools.partial(self._on_command, "Reboot", "Reboot?", "reboot")) + + menu.show(widget) + + def state(self, widget): + return [] diff --git a/themes/icons/ascii.json b/themes/icons/ascii.json index 6358442..c329785 100644 --- a/themes/icons/ascii.json +++ b/themes/icons/ascii.json @@ -128,6 +128,9 @@ "dunst": { "muted": { "prefix": "dunst(muted)"}, "unmuted": { "prefix": "dunst" } - } + }, + "system": { + "prefix": "system" + } } diff --git a/themes/icons/awesome-fonts.json b/themes/icons/awesome-fonts.json index ff97533..6f6916b 100644 --- a/themes/icons/awesome-fonts.json +++ b/themes/icons/awesome-fonts.json @@ -202,5 +202,8 @@ }, "vpn": { "prefix": "" - } + }, + "system": { + "prefix": "  " + } } diff --git a/themes/icons/ionicons.json b/themes/icons/ionicons.json index f2f8fc1..cfe79bb 100644 --- a/themes/icons/ionicons.json +++ b/themes/icons/ionicons.json @@ -162,6 +162,9 @@ "dunst": { "muted": { "prefix": "\uf39a"}, "unmuted": { "prefix": "\uf39b" } - } + }, + "system": { + "prefix": " \uf2a9 " + } }