#!/usr/bin/python3 # # 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 . # ''' Display two timers with interactive behaviour : * One timer is white and background become red after one hour * Second timer is blue * Click : start/stop timer * Double click : reset timer * Right click : switch timer ''' import json import time import dbus from dbus.mainloop.glib import DBusGMainLoop import gi gi.require_version('Gst', '1.0') from gi.repository import GObject, GLib, Gst from threading import Thread from signal import signal, SIGINT import sys from dbusitem import DBUSItem class TimerThread(Thread): def stop(self): self._stopLoop = True def _displayTimerValue(self): encoder = json.JSONEncoder() res = {'group':'Timer', 'items':[]} item = DBUSItem('timer', onClick='signal') curValue = self.timers[self.curTimer] item.text = '%02d:%02d' % (int(curValue/60)%60, curValue%60) if curValue >= (60*60): item.text = '%02d:%s' % (int(curValue/(60*60)), item.text) if self.curTimer == 0: style = 'color:white' if curValue > (60*60): style += ';background-color:red' else: style = 'color:#215D9C' item.style = style res['items'] += item.toMap() try: systray_proxy.notify(encoder.encode(res), dbus_interface='com.soutade.GenericMonitor') except: pass def run(self): self.timers = [0, 0] self.curTimer = 0 self.timerPaused = False self._stopLoop = False while not self._stopLoop: time.sleep(1) if not self.timerPaused: self.timers[self.curTimer] += 1 self._displayTimerValue() def _forMe(self, sender): return sender == 'timer@Timer' def onClick(self, sender): if not self._forMe(sender): return self.timerPaused = not self.timerPaused self._displayTimerValue() def onRightClick(self, sender): if not self._forMe(sender): return if self.curTimer == 0: self.curTimer = 1 else: self.curTimer = 0 self.timers[self.curTimer] = 0 self.timerPaused = False self._displayTimerValue() def onDblClick(self, sender): if not self._forMe(sender): return self.timers[self.curTimer] = 0 self.timerPaused = True self._displayTimerValue() def onDblRightClick(self, sender): pass def onClick(sender): timerThread.onClick(sender) def onRightClick(sender): timerThread.onRightClick(sender) def onDblClick(sender): timerThread.onDblClick(sender) def onDblRightClick(sender): timerThread.onDblRightClick(sender) def signalHandler(signal_received, frame): timerThread.stop() mainLoop.quit() timerThread.join() encoder = json.JSONEncoder() res = {'groups':['Timer']} try: systray_proxy.deleteGroups(encoder.encode(res), dbus_interface='com.soutade.GenericMonitor') except Exception as e: pass sys.exit(0) dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = dbus.SessionBus() systray_proxy = bus.get_object('org.gnome.Shell', '/com/soutade/GenericMonitor') bus.add_signal_receiver(onClick, 'onClick', 'com.soutade.GenericMonitor') bus.add_signal_receiver(onDblClick, 'onDblClick', 'com.soutade.GenericMonitor') bus.add_signal_receiver(onRightClick, 'onRightClick', 'com.soutade.GenericMonitor') bus.add_signal_receiver(onDblRightClick, 'onDblRightClick', 'com.soutade.GenericMonitor') timerThread = TimerThread() timerThread.start() signal(SIGINT, signalHandler) mainLoop = GLib.MainLoop() mainLoop.run()