From 427ff11ac4ed6dbbf3043d1521c26d5df92c7f8d Mon Sep 17 00:00:00 2001 From: Gobinath Date: Fri, 8 Jan 2016 12:51:50 +0530 Subject: [PATCH] SafeEyes --- icon-64.png | Bin 0 -> 1710 bytes icon.png | Bin 0 -> 7424 bytes run | 2 + safeeyes | 252 +++++++++++++++++++++++++++++++++++++++++++++++++++ safeeyes.cfg | 10 ++ 5 files changed, 264 insertions(+) create mode 100644 icon-64.png create mode 100644 icon.png create mode 100755 run create mode 100755 safeeyes create mode 100644 safeeyes.cfg diff --git a/icon-64.png b/icon-64.png new file mode 100644 index 0000000000000000000000000000000000000000..289f7c2d6306dfbf05714e92060a5ad728de05b2 GIT binary patch literal 1710 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" + t + ""); + + + def break_message(self): + message = '' + if self.is_long_break(): + message = long_break_messages[self.long_break_message_index] + else: + message = short_break_messages[self.short_break_message_index] + + return "" + message + "" + + def show_screen(self): + self.is_break = True + self.lbl_message.set_markup(self.break_message()); + self.show_all() + self.fullscreen() + self.stick() # Show on all workplaces + + + if config.getboolean('SafeEyes', 'strict_break'): + self.btn_skip.hide() + else: + self.btn_skip.show() + + + # Start countdown timer + thread = threading.Thread(target=self.countdown) + thread.start() + + +def resume_eyesafe(): + global job_break + if job_break: + print("Resume") + scheduler.resume_job("take_rest") + + +def pause_eyesafe(): + global job_break + if job_break: + print("Pause") + scheduler.pause_job("take_rest") + + +# @scheduler.scheduled_job('interval', minutes=10) +def take_rest(): + global active + # Pause the job + pause_eyesafe() + + # Show a notification + notification = notify.Notification.new("Safe Eyes", "Ready for a break after 15 seconds.", icon=os.path.abspath(PATH + 'icon.png')) + notification.set_timeout(1000) + notification.show() + notification.close() + + time.sleep(config.getint('SafeEyes', 'pre_break_warning_time')) + + if active: + # Show the screen + GLib.idle_add(lambda: screen.show_screen()) + + + +def main(): + indicator = appindicator.Indicator.new(APPINDICATOR_ID, os.path.abspath(PATH + 'icon-64.png'), appindicator.IndicatorCategory.SYSTEM_SERVICES) + indicator.set_status(appindicator.IndicatorStatus.ACTIVE) + indicator.set_menu(build_menu()) + notify.init(APPINDICATOR_ID) + gtk.main() + + +def build_menu(): + menu = gtk.Menu() + item_enable = gtk.CheckMenuItem('Enable SafeEyes') + item_enable.connect('activate', enable) + item_enable.set_active(True) + item_quit = gtk.MenuItem('Quit') + item_quit.connect('activate', quit) + menu.append(item_enable) + menu.append(item_quit) + menu.show_all() + return menu + + +def quit(_): + notify.uninit() + gtk.main_quit() + scheduler.shutdown(False) + +def enable(menu): + global active + active = menu.get_active() + if active: + resume_eyesafe() + else: + pause_eyesafe() + +def start_eyesafe(): + screen.post_close = resume_eyesafe + scheduler.start() + global job_break + job_break = scheduler.add_job(take_rest, 'interval', minutes=config.getint('SafeEyes', 'break_interval'), id='take_rest') + + +if __name__ == "__main__": + # Initialize the properties + config.read(config_file) + screen = FullScreenBreak() + start_eyesafe() + main() diff --git a/safeeyes.cfg b/safeeyes.cfg new file mode 100644 index 0000000..437197b --- /dev/null +++ b/safeeyes.cfg @@ -0,0 +1,10 @@ +[SafeEyes] +pre_break_warning_time = 15 +no_of_short_breaks_per_long_break = 5 +break_interval = 15 +short_break_duration = 15 +long_break_duration = 60 +strict_break = False +skip_button_text = Skip +message_font = Adele +