diff --git a/.travis.yml b/.travis.yml index 39c71a6..2c00527 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,6 @@ sudo: false language: python python: - "2.7" - - "3.3" - "3.4" - "3.5" - "3.6" diff --git a/README.md b/README.md index b2f8d5e..de820c2 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![Test Coverage](https://codeclimate.com/github/tobi-wan-kenobi/bumblebee-status/badges/coverage.svg)](https://codeclimate.com/github/tobi-wan-kenobi/bumblebee-status/coverage) [![Issue Count](https://codeclimate.com/github/tobi-wan-kenobi/bumblebee-status/badges/issue_count.svg)](https://codeclimate.com/github/tobi-wan-kenobi/bumblebee-status) -**Many, many thanks to all contributors! As of now, 43 of the modules are from various contributors (!), and only 19 from myself.** +**Many, many thanks to all contributors! As of now, 44 of the modules are from various contributors (!), and only 19 from myself.** ![Solarized Powerline](https://github.com/tobi-wan-kenobi/bumblebee-status/blob/master/screenshots/themes/powerline-solarized.png) @@ -80,7 +80,10 @@ In your i3wm configuration, modify the *status_command* for your i3bar like this ``` bar { - status_command -m -p -t + status_command \ + -m \ + -p \ + -t } ``` diff --git a/bumblebee/modules/system.py b/bumblebee/modules/system.py new file mode 100644 index 0000000..312dc73 --- /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) + root.destroy() + + if do_it: + bumblebee.util.execute(command) + + + 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 b950bbf..2084ca1 100644 --- a/themes/icons/ascii.json +++ b/themes/icons/ascii.json @@ -299,5 +299,9 @@ "unmuted": { "prefix": "twmn(muted)" } - } + }, + "system": { + "prefix": "system" + } + } diff --git a/themes/icons/awesome-fonts.json b/themes/icons/awesome-fonts.json index 44efa50..9fbec5d 100644 --- a/themes/icons/awesome-fonts.json +++ b/themes/icons/awesome-fonts.json @@ -213,5 +213,8 @@ }, "vpn": { "prefix": "" + }, + "system": { + "prefix": "  " } } diff --git a/themes/icons/ionicons.json b/themes/icons/ionicons.json index 9512fb4..a21e264 100644 --- a/themes/icons/ionicons.json +++ b/themes/icons/ionicons.json @@ -176,5 +176,8 @@ "twmn": { "muted": { "prefix": "\uf1f6" }, "unmuted": { "prefix": "\uf0f3" } + }, + "system": { + "prefix": " \uf2a9 " } }