From 25242a0cc21023788d32d7ca9d11f43e7f2a39c7 Mon Sep 17 00:00:00 2001 From: lara Date: Thu, 18 Jun 2020 23:28:23 -0400 Subject: [PATCH] [work] Add notification pause reminder --- bin/notify.py | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++ bin/work | 11 +++- 2 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 bin/notify.py diff --git a/bin/notify.py b/bin/notify.py new file mode 100644 index 0000000..587ce80 --- /dev/null +++ b/bin/notify.py @@ -0,0 +1,136 @@ +# Copyright (C) 2009 www.stani.be +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/ + +# Follows PEP8 + +APP_NAME = 'notify.py' + +from sys import stderr + +# Notify (linux) +try: + # import Notify + # import gobject + # gobject.threads_init() + import gi + gi.require_version('Notify', '0.7') + from gi.repository import Notify +except (ImportError, ValueError): + Notify = None + +# Growl (Mac Os X) +if Notify: + Growl = None +else: + try: + import Growl + except ImportError: + Growl = None + +# Toasterbox (Windows) +if Notify or Growl: + TB = None +else: + try: + import wx + import other.pyWx.toasterbox as TB + except ImportError: + TB = None + + +def register(app_name): + global APP_NAME + APP_NAME = app_name + + +def init(app_name, icon=None): + print("Warning: couldn't find any notification API", file=stderr) + register(app_name) + +if Notify: + + def init(app_name, icon=None): + register(app_name) + Notify.init(app_name) + + def send(title, message, icon='gtk-dialog-info', wxicon=None, + urgent=False, timeout=None): + n = Notify.Notification.new(title, message, icon) + if urgent: + n.set_urgency(2) + if timeout: + n.set_timeout(timeout) + n.show() + +elif Growl: + + def init(app_name, icon=None): + """Create a growl notifier with appropriate icon if specified. + The notification classes default to [APP_NAME]. The user can + enable/disable notifications based on this class name.""" + global growl + register(app_name) + if icon is None: + icon = {} + else: + icon = {'applicationIcon': Growl.Image.imageFromPath(icon)} + growl = Growl.GrowlNotifier(APP_NAME, [APP_NAME], **icon) + + def send(title, message, icon='gtk-dialog-info', wxicon=None, + urgent=False, timeout=None): + global growl + growl.notify(APP_NAME, title, message) + +elif TB: + + def send(title, message, icon='gtk-dialog-info', + wxicon=None, urgent=False, timeout=None): + if wxicon == None: + wxicon = wx.ArtProvider_GetBitmap(wx.ART_INFORMATION, + wx.ART_OTHER, (48, 48)) + tb = TB.ToasterBox(wx.GetApp().GetTopWindow(), + TB.TB_COMPLEX, TB.DEFAULT_TB_STYLE, TB.TB_ONTIME) + tb.SetPopupSize((300, 80)) + tb.SetPopupPauseTime(5000) + tb.SetPopupScrollSpeed(8) + tb.SetPopupPositionByInt(3) + + #wx controls + tbpanel = tb.GetToasterBoxWindow() + panel = wx.Panel(tbpanel, -1) + panel.SetBackgroundColour(wx.WHITE) + wxicon = wx.StaticBitmap(panel, -1, wxicon) + title = wx.StaticText(panel, -1, title) + message = wx.StaticText(panel, -1, message) + + # wx layout controls + ver_sizer = wx.BoxSizer(wx.VERTICAL) + ver_sizer.Add(title, 0, wx.ALL, 4) + ver_sizer.Add(message, 0, wx.ALL, 4) + + hor_sizer = wx.BoxSizer(wx.HORIZONTAL) + hor_sizer.Add(wxicon, 0, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL \ + | wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 4) + hor_sizer.Add(ver_sizer, 1, wx.EXPAND) + hor_sizer.Layout() + panel.SetSizer(hor_sizer) + + tb.AddPanel(panel) + tb.Play() + +else: + + def send(*args, **keyw): + pass diff --git a/bin/work b/bin/work index f60905b..ba71847 100755 --- a/bin/work +++ b/bin/work @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- import argparse +import notify from signal import signal, SIGINT import sys from time import sleep @@ -158,8 +159,16 @@ def work_pause(args): if not today_fields: die("no work to take a break from") log("Taking a break at {}".format(hour)) + + notify.init("work") # Wait to be stopped by a Ctrl-C - sleep(999999) + reminder_interval = 5 # In minutes + count = 0 + while True: + sleep(reminder_interval * 60) + count += 1 + notify.send("Pause reminder", + "It has now been {} minutes".format(count * reminder_interval)) def work_end(args):