From 34a288486d1615a7afea5dc651d316b23def7ddb Mon Sep 17 00:00:00 2001
From: Francesco Marella <francesco.marella@gmail.com>
Date: Wed, 21 Jul 2010 16:30:08 +0200
Subject: Optimize indicators code.

User, at configure time, chooses to enable or disable the gui. Determine
at runtime whether to use the appindicator or status icon as fallback.
---
 src/gtk-redshift/Makefile.am       |  29 ++--------
 src/gtk-redshift/gtk-redshift      |  23 ++++++++
 src/gtk-redshift/gtk-redshift.in   |  23 --------
 src/gtk-redshift/rsappindicator.py | 114 -------------------------------------
 src/gtk-redshift/statusicon.py     |  58 +++++++++++++------
 5 files changed, 68 insertions(+), 179 deletions(-)
 create mode 100644 src/gtk-redshift/gtk-redshift
 delete mode 100644 src/gtk-redshift/gtk-redshift.in
 delete mode 100644 src/gtk-redshift/rsappindicator.py

(limited to 'src/gtk-redshift')

diff --git a/src/gtk-redshift/Makefile.am b/src/gtk-redshift/Makefile.am
index 5896f1b..5101cef 100644
--- a/src/gtk-redshift/Makefile.am
+++ b/src/gtk-redshift/Makefile.am
@@ -1,6 +1,5 @@
 
-if ENABLE_STATUSICON
-gui_module=statusicon
+if ENABLE_GUI
 gtk_redshift_PYTHON = \
 	__init__.py \
 	utils.py \
@@ -9,32 +8,12 @@ nodist_gtk_redshift_PYTHON = \
 	defs.py
 gtk_redshiftdir = $(pythondir)/gtk_redshift
 
-bin_SCRIPTS = gtk-redshift
+dist_bin_SCRIPTS = gtk-redshift
 endif
 
-if ENABLE_APPINDICATOR
-gui_module=rsappindicator
-gtk_redshift_PYTHON = \
-	__init__.py \
-	utils.py \
-	rsappindicator.py
-nodist_gtk_redshift_PYTHON = \
-	defs.py
-gtk_redshiftdir = $(pythondir)/gtk_redshift
-
-bin_SCRIPTS = gtk-redshift
-endif
-
-EXTRA_DIST = gtk-redshift.in \
-	defs.py.in
-
-CLEANFILES = defs.py \
-	gtk-redshift
-
+EXTRA_DIST = defs.py.in
 
-# Main GUI script
-gtk-redshift: gtk-redshift.in
-	sed -e "s|\@gui_module\@|$(gui_module)|g" $< > $@
+CLEANFILES = defs.py
 
 # Local python definitions
 defs.py: defs.py.in
diff --git a/src/gtk-redshift/gtk-redshift b/src/gtk-redshift/gtk-redshift
new file mode 100644
index 0000000..56d940e
--- /dev/null
+++ b/src/gtk-redshift/gtk-redshift
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+# gtk-redshift -- GTK+ Redshift launcher script
+# This file is part of Redshift.
+
+# Redshift 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.
+
+# Redshift 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 Redshift.  If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (c) 2010  Jon Lund Steffensen <jonlst@gmail.com>
+
+
+if __name__ == '__main__':
+    from gtk_redshift.statusicon import run
+    run()
diff --git a/src/gtk-redshift/gtk-redshift.in b/src/gtk-redshift/gtk-redshift.in
deleted file mode 100644
index 120e05c..0000000
--- a/src/gtk-redshift/gtk-redshift.in
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/usr/bin/env python
-# gtk-redshift -- GTK+ Redshift launcher script
-# This file is part of Redshift.
-
-# Redshift 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.
-
-# Redshift 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 Redshift.  If not, see <http://www.gnu.org/licenses/>.
-
-# Copyright (c) 2010  Jon Lund Steffensen <jonlst@gmail.com>
-
-
-if __name__ == '__main__':
-    from gtk_redshift.@gui_module@ import run
-    run()
diff --git a/src/gtk-redshift/rsappindicator.py b/src/gtk-redshift/rsappindicator.py
deleted file mode 100644
index 23f1ac8..0000000
--- a/src/gtk-redshift/rsappindicator.py
+++ /dev/null
@@ -1,114 +0,0 @@
-#!/usr/bin/env python
-# rsappindicator.py -- Application Panel Indicator source
-# This file is part of Redshift.
-
-# Redshift 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.
-
-# Redshift 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 Redshift.  If not, see <http://www.gnu.org/licenses/>.
-
-# Copyright (c) 2010  Jon Lund Steffensen <jonlst@gmail.com>
-
-
-import sys, os
-import subprocess, signal
-import gettext
-
-import pygtk
-pygtk.require("2.0")
-
-import gtk, glib
-try:
-    import appindicator
-except ImportError as ie:
-    # No module named appindicator
-    sys.exit(str(ie))
-
-import defs
-import utils
-
-
-def run():
-    # Internationalisation
-    gettext.bindtextdomain('redshift', defs.LOCALEDIR)
-    gettext.textdomain('redshift')
-    _ = gettext.gettext
-
-    # Start redshift with arguments from the command line
-    args = sys.argv[1:]
-    args.insert(0, os.path.join(defs.BINDIR, 'redshift'))
-    process = subprocess.Popen(args)
-
-    try:
-        # Create status icon
-        indicator = appindicator.Indicator ("redshift",
-                              "redshift",
-                              appindicator.CATEGORY_APPLICATION_STATUS)
-        indicator.set_status (appindicator.STATUS_ACTIVE)
-
-        def toggle_cb(widget, data=None):
-            if indicator.get_icon() == 'redshift':
-                indicator.set_icon('redshift-idle')
-            else:
-                indicator.set_icon('redshift')
-            process.send_signal(signal.SIGUSR1)
-
-        def autostart_cb(widget, data=None):
-            utils.set_autostart(widget.get_active())
-
-        def destroy_cb(widget, data=None):
-            gtk.main_quit()
-            return False
-
-        # Create popup menu
-        status_menu = gtk.Menu()
-
-        toggle_item = gtk.ImageMenuItem(_('Toggle'))
-        toggle_item.connect('activate', toggle_cb)
-        status_menu.append(toggle_item)
-
-        autostart_item = gtk.CheckMenuItem(_('Autostart'))
-        try:
-            autostart_item.set_active(utils.get_autostart())
-        except IOError as strerror:
-            print strerror
-            autostart_item.set_property('sensitive', False)
-        else:
-            autostart_item.connect('activate', autostart_cb)
-        finally:
-            status_menu.append(autostart_item)
-
-        quit_item = gtk.ImageMenuItem(gtk.STOCK_QUIT)
-        quit_item.connect('activate', destroy_cb)
-        status_menu.append(quit_item)
-
-        status_menu.show_all()
-
-        # Set the menu
-        indicator.set_menu(status_menu)
-
-        def child_cb(pid, cond, data=None):
-            sys.exit(-1)
-
-        # Add watch on child process
-        glib.child_watch_add(process.pid, child_cb)
-
-        # Run main loop
-        gtk.main()
-
-    except KeyboardInterrupt:
-        # Ignore user interruption
-        pass
-
-    finally:
-        # Always terminate redshift
-        process.terminate()
-        process.wait()
diff --git a/src/gtk-redshift/statusicon.py b/src/gtk-redshift/statusicon.py
index 82b5cd6..8c084a8 100644
--- a/src/gtk-redshift/statusicon.py
+++ b/src/gtk-redshift/statusicon.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python
-# statusicon.py -- GTK+ status icon source
+# statusicon.py -- Application panel indicator / GTK+ status icon source
 # This file is part of Redshift.
 
 # Redshift is free software: you can redistribute it and/or modify
@@ -26,6 +26,10 @@ import pygtk
 pygtk.require("2.0")
 
 import gtk, glib
+try:
+    import appindicator
+except ImportError:
+    appindicator = None
 
 import defs
 import utils
@@ -43,23 +47,37 @@ def run():
     process = subprocess.Popen(args)
 
     try:
-        # Create status icon
-        status_icon = gtk.StatusIcon()
-        status_icon.set_from_icon_name('redshift')
-        status_icon.set_tooltip('Redshift')
+        if appindicator:
+            # Create indicator
+            indicator = appindicator.Indicator ("redshift",
+                                  "redshift",
+                                  appindicator.CATEGORY_APPLICATION_STATUS)
+            indicator.set_status (appindicator.STATUS_ACTIVE)
+        else:
+            # Create status icon
+            status_icon = gtk.StatusIcon()
+            status_icon.set_from_icon_name('redshift')
+            status_icon.set_tooltip('Redshift')
 
         def toggle_cb(widget, data=None):
             process.send_signal(signal.SIGUSR1)
-	    if status_icon.get_icon_name() == 'redshift':
-	      status_icon.set_from_icon_name('redshift-idle')
-	    else:
-	      status_icon.set_from_icon_name('redshift')
+            if appindicator:
+                if indicator.get_icon() == 'redshift':
+                    indicator.set_icon('redshift-idle')
+                else:
+                    indicator.set_icon('redshift')
+            else:
+	            if status_icon.get_icon_name() == 'redshift':
+	              status_icon.set_from_icon_name('redshift-idle')
+	            else:
+	              status_icon.set_from_icon_name('redshift')
 
         def autostart_cb(widget, data=None):
             utils.set_autostart(widget.get_active())
 
         def destroy_cb(widget, data=None):
-            status_icon.set_visible(False)
+            if not appindicator:
+                status_icon.set_visible(False)
             gtk.main_quit()
             return False
 
@@ -85,15 +103,21 @@ def run():
         quit_item.connect('activate', destroy_cb)
         status_menu.append(quit_item)
 
-        def popup_menu_cb(widget, button, time, data=None):
+        if appindicator:
             status_menu.show_all()
-            status_menu.popup(None, None, gtk.status_icon_position_menu,
-                              button, time, status_icon)
 
-        # Connect signals for status icon and show
-        status_icon.connect('activate', toggle_cb)
-        status_icon.connect('popup-menu', popup_menu_cb)
-        status_icon.set_visible(True)
+            # Set the menu
+            indicator.set_menu(status_menu)
+        else:
+            def popup_menu_cb(widget, button, time, data=None):
+                status_menu.show_all()
+                status_menu.popup(None, None, gtk.status_icon_position_menu,
+                                  button, time, status_icon)
+
+            # Connect signals for status icon and show
+            status_icon.connect('activate', toggle_cb)
+            status_icon.connect('popup-menu', popup_menu_cb)
+            status_icon.set_visible(True)
 
         def child_cb(pid, cond, data=None):
             sys.exit(-1)
-- 
cgit v1.2.3-70-g09d2