diff --git a/entropy-notification-applet/gfx/applet/applet-disconnect.png b/entropy-notification-applet/gfx/applet/applet-disconnect.png
deleted file mode 100644
index d36ce29cc..000000000
Binary files a/entropy-notification-applet/gfx/applet/applet-disconnect.png and /dev/null differ
diff --git a/entropy-notification-applet/src/applet.py b/entropy-notification-applet/src/applet.py
index 98006e57c..8fbffed19 100755
--- a/entropy-notification-applet/src/applet.py
+++ b/entropy-notification-applet/src/applet.py
@@ -7,8 +7,8 @@
#
# $Id: applet.py,v 1.10 2003/09/15 15:07:19 veillard Exp $
-import sys, os, time, gtk, gobject
-import signal
+import sys, gtk
+#import signal
sys.path.insert(0,'/usr/lib/entropy/client')
sys.path.insert(0,'/usr/lib/entropy/libraries')
sys.path.insert(0,'/usr/lib/entropy/spritz')
@@ -20,14 +20,12 @@ sys.argv.append('--no-pid-handling')
import etp_applet
-def main():
- signal.signal(signal.SIGINT, signal.SIG_DFL)
- applet = etp_applet.EntropyApplet()
- #gobject.threads_init()
- #gtk.gdk.threads_enter()
- gtk.main()
- #gtk.gdk.threads_leave()
-
if __name__ == "__main__":
- main()
+ #signal.signal(signal.SIGINT, signal.SIG_DFL)
+ applet = etp_applet.EntropyApplet()
+ try:
+ gtk.main()
+ except KeyboardInterrupt:
+ applet.close_service()
+ raise
diff --git a/entropy-notification-applet/src/etp_applet.py b/entropy-notification-applet/src/etp_applet.py
index 72b187be1..0ffdefdc5 100644
--- a/entropy-notification-applet/src/etp_applet.py
+++ b/entropy-notification-applet/src/etp_applet.py
@@ -1,69 +1,74 @@
-# This file is a portion of the Red Hat Network Panel Applet
-#
-# Copyright (C) 1999-2002 Red Hat, Inc. All Rights Reserved.
-# Distributed under GPL version 2.
-#
-# Author: Chip Turner
-#
-# def help added by Tammy Fox
-#
-# $Id: rhn_applet.py,v 1.114 2003/11/09 16:56:33 veillard Exp $
+# -*- coding: utf-8 -*-
+"""
+ # DESCRIPTION:
+ # Entropy updates Notification Applet
+
+ Copyright (C) 2007-2009 Fabio Erculiani
+ Forking RHN Applet
+
+ 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 2 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+"""
+
+# sys imports
import os
import sys
import time
-import threading
import subprocess
-
import gnome
import gnome.ui
-# from msw to avoid odd bugs in some pygtk builds
import gtk
import gobject
-import gtk.gdk
import pynotify
+import dbus
+import dbus.exceptions
+import dbus.mainloop.glib
-import etp_applet_animation
-from etp_applet_dialogs import \
- rhnAppletNoticeWindow, \
- rhnRegistrationPromptDialog, \
- rhnAppletAboutWindow, \
- rhnAppletFirstTimeDruid, \
- rhnAppletErrorDialog, \
- rhnAppletExceptionDialog
+# applet imports
import etp_applet_config
+from etp_applet_components import AppletNoticeWindow, AppletAboutWindow, \
+ AppletErrorDialog, AppletExceptionDialog, AppletIconPixbuf
# Entropy imports
-from entropy.misc import TimeScheduled, ParallelTask
from entropy.i18n import _
-from entropy.exceptions import *
+from entropy.exceptions import IncorrectParameter, OnlineMirrorError
import entropy.tools as entropyTools
-from entropy.client.interfaces import Client as EquoInterface
-from entropy.client.interfaces import Repository as RepoInterface
-from entropy.transceivers import urlFetcher
+from entropy.client.interfaces import Client
from entropy.const import etpConst
+from entropy.core import SystemSettings
-class Entropy(EquoInterface):
+class Entropy(Client):
def init_singleton(self, appletInterface):
- EquoInterface.init_singleton(self, noclientdb = True)
+ Client.init_singleton(self, noclientdb = True)
self.connect_progress_objects(appletInterface)
self.nocolor()
def connect_progress_objects(self, appletInterface):
self.i = appletInterface
self.progress_tooltip = self.i.update_tooltip
- self.updateProgress = self.appletUpdateProgress
self.progress_tooltip_message_title = _("Updates Notification")
self.appletCreateNotification()
- self.urlFetcher = GuiUrlFetcher
- self.progress = self.appletPrintText # for the GuiUrlFetcher
self.applet_last_message = ''
def appletCreateNotification(self):
- self.progress_tooltip_notification = pynotify.Notification(self.progress_tooltip_message_title,"Hello world")
+ self.progress_tooltip_notification = pynotify.Notification(
+ self.progress_tooltip_message_title,"Hello world")
self.progress_tooltip_notification.set_timeout(3000)
- def appletUpdateProgress(self, text, header = "", footer = "", back = False, importance = 0, type = "info", count = [], percent = False):
+ def updateProgress(self, text, header = "", footer = "", back = False,
+ importance = 0, type = "info", count = [], percent = False):
count_str = ""
if count:
@@ -76,88 +81,24 @@ class Entropy(EquoInterface):
#if importance in (1,2):
if importance == 2:
self.progress_tooltip_message_title = message
- self.appletPrintText(self.applet_last_message)
+ self.__do_applet_print(self.applet_last_message)
else:
- self.appletPrintText(message)
+ self.__do_applet_print(message)
- def appletPrintText(self, message):
+ def __do_applet_print(self, message):
self.applet_last_message = message
- def _appletPrintText():
- pynotify.init("XY")
- self.progress_tooltip_notification.update(self.progress_tooltip_message_title,message)
- self.progress_tooltip_notification.attach_to_status_icon(self.i.status_icon)
- self.progress_tooltip_notification.show()
- self.i.TaskQueue.append((_appletPrintText,[],{},))
+ pynotify.init("XY")
+ self.progress_tooltip_notification.update(
+ self.progress_tooltip_message_title,message)
+ self.progress_tooltip_notification.attach_to_status_icon(
+ self.i.status_icon)
+ self.progress_tooltip_notification.show()
-class GuiUrlFetcher(urlFetcher):
-
- def __init__(self, *args, **kwargs):
- urlFetcher.__init__(self, *args, **kwargs)
- self.__remotesize = 0
- self.__downloadedsize = 0
- self.__datatransfer = 0
-
- def connect_to_gui(self, progress):
- self.progress = progress
-
- def handle_statistics(self, th_id, downloaded_size, total_size,
- average, old_average, update_step, show_speed, data_transfer,
- time_remaining, time_remaining_secs):
- self.__remotesize = total_size
- self.__downloadedsize = downloaded_size
- self.__datatransfer = data_transfer
-
- def updateProgress(self):
- self.gather = self.__downloadedsize
- message = "Fetching data %s/%s kB @ %s" % (
- str(round(float(self.__downloadedsize)/1024,1)),
- str(round(self.__remotesize,1)),
- str(entropyTools.bytes_into_human(self.__datatransfer))+"/sec",
- )
- self.progress(message)
class EntropyApplet:
- def set_state(self, new_state, use_busy_icon = 0):
-
- if not new_state in etp_applet_config.APPLET_STATES:
- raise IncorrectParameter("Error: invalid state %s" % new_state)
-
- def _set_state(new_state, use_busy_icon):
- self.status_icon.set_blinking(False)
- if new_state == "OKAY":
- self.change_icon("okay")
- elif new_state == "BUSY":
- if use_busy_icon:
- self.set_displayed_image("busy")
- elif new_state == "CRITICAL":
- self.status_icon.set_blinking(True)
- if self.never_viewed_notices:
- self.change_icon("critical")
- else:
- self.set_displayed_image("critical")
- elif new_state == "NOCONSENT":
- if self.never_viewed_consent:
- self.change_icon("noconsent")
- else:
- self.set_displayed_image("noconsent")
- elif new_state == "DISCONNECTED":
- self.change_icon("disconnect")
- elif new_state == "DISABLE":
- self.change_icon("disable")
- elif new_state == "ERROR":
- self.change_icon("error")
- self.current_state = new_state
- if self.debug: print "queued:",_set_state
- self.TaskQueue.append((_set_state,[new_state,use_busy_icon],{},))
-
-
def __init__(self):
- self.TaskQueueAlive = True
- self.TaskQueue = []
- self.TaskQueueId = gobject.timeout_add(200, self.task_queue_executor)
-
self.debug = False
if "--debug" in sys.argv:
self.debug = True
@@ -165,20 +106,14 @@ class EntropyApplet:
self.animator = None
self.client = None
self.notice_window = None
- self.rhnreg_dialog = None
self.error_dialog = None
self.error_threshold = 0
self.about_window = None
self.last_error = None
- self.last_error_is_exception = 0
- self.last_error_is_network_error = 0
- self.change_number = 0
- self.available_packages = []
+ self.package_updates = []
self.last_alert = None
- self.Entropy = None
- self.isWorking = False
- self.refresh_lock = threading.Lock()
self.tooltip_text = ""
+ self.last_trigger_check_t = 0.0
gnome.program_init("spritz-updater", etpConst['entropyversion'])
self.session = gnome.ui.master_client()
@@ -186,26 +121,18 @@ class EntropyApplet:
gtk.Object.connect(self.session, "save-yourself", self.save_yourself)
gtk.Object.connect(self.session, "die", self.exit_applet)
- self.consent = {}
- self.never_viewed_consent = 1
self.never_viewed_notices = 1
-
- self.skip_check_locked = False
self.current_image = None
- self.refresh_timeout_tag = None
self.current_state = None
self.old_critical_text = None
- self.network_timeout_tag = None
- self.icons = etp_applet_animation.rhnAppletIconPixbuf()
+ self.icons = AppletIconPixbuf()
self.icons.add_file("okay", "applet-okay.png")
self.icons.add_file("error", "applet-error.png")
self.icons.add_file("busy", "applet-busy.png")
self.icons.add_file("critical", "applet-critical.png")
self.icons.add_file("disable", "applet-disable.png")
- self.icons.add_file("noconsent", "applet-critical.png")
- self.icons.add_file("disconnect", "applet-disconnect.png")
self.icons.add_file("spritz","spritz.png")
self.icons.add_file("about","applet-about.png")
self.icons.add_file("web","applet-web.png")
@@ -213,12 +140,18 @@ class EntropyApplet:
self.applet_size = 22
menu_items = (
- ("disable_applet", _("_Disable Notification Applet"), _("Disable Notification Applet"), self.disable_applet),
- ("enable_applet", _("_Enable Notification Applet"), _("Enable Notification Applet"), self.enable_applet),
- ("check_now", _("_Check for updates"), _("Check for updates"), self.update_from_server),
- ("update_now", _("_Launch Package Manager"), _("Launch Package Manager"), self.launch_package_manager),
- ("web_panel", _("_Packages Website"), _("Use Packages web interface"), self.load_packages_url),
- ("web_site", _("_Sabayon Linux Website"), _("Launch Sabayon Linux Website"), self.load_website),
+ ("disable_applet", _("_Disable Notification Applet"),
+ _("Disable Notification Applet"), self.disable_applet),
+ ("enable_applet", _("_Enable Notification Applet"),
+ _("Enable Notification Applet"), self.enable_applet),
+ ("check_now", _("_Check for updates"),
+ _("Check for updates"), self.send_check_updates_signal),
+ ("update_now", _("_Launch Package Manager"),
+ _("Launch Package Manager"), self.launch_package_manager),
+ ("web_panel", _("_Packages Website"),
+ _("Use Packages web interface"), self.load_packages_url),
+ ("web_site", _("_Sabayon Linux Website"),
+ _("Launch Sabayon Linux Website"), self.load_website),
None,
("about", _("_About"), _("About..."), self.about),
("exit", _("_Exit"), _("Exit"), self.exit_applet),
@@ -246,61 +179,174 @@ class EntropyApplet:
self.menu.show_all()
- self.status_icon = gtk.status_icon_new_from_pixbuf(self.icons.best_match("okay",22))
+ self.status_icon = gtk.status_icon_new_from_pixbuf(
+ self.icons.best_match("okay",22))
self.status_icon.connect("popup-menu", self.applet_face_click)
self.status_icon.connect("activate", self.applet_face_click2)
- hide_menu = False
- message = ''
- workdir_perms_issue = False
- if os.path.isdir(etpConst['entropyworkdir']):
- gid = os.stat(etpConst['entropyworkdir'])[5]
- if gid != etpConst['entropygid']:
- workdir_perms_issue = True
+ # Entropy dbus connection init
+ self.__dbus_init_error_msg = 'Unknown error'
+ self.__dbus_interface = "org.entropy.Client"
+ self.__dbus_path = "/notifier"
+ self.__signal_name = "signal_updates"
+ self._dbus_service_available = self.setup_dbus()
- permitted = entropyTools.is_user_in_entropy_group()
- load_intf = False
- if not permitted:
- hide_menu = True
- message = "%s: %s" % (_("You must add yourself to this group"),etpConst['sysgroup'],)
- elif workdir_perms_issue:
- hide_menu = True
- message = _("Please run Equo/Spritz as root to update Entropy permissions")
- else:
- load_intf = True
-
- if etp_applet_config.settings['APPLET_ENABLED']:
- self.enable_applet(init = True)
+ if etp_applet_config.settings['APPLET_ENABLED'] and \
+ self._dbus_service_available:
+ self.enable_applet(do_check = False)
else:
self.disable_applet()
+ if not self._dbus_service_available:
+ self.show_service_not_available()
+ else:
+ self.show_service_available()
+ self.do_first_check()
- if hide_menu:
- self.disable_refresh_timer()
- self.set_state("ERROR")
- self.update_tooltip(message)
- for key in self.menu_items:
- if key in ['exit','web_site','about','web_panel','update_now']:
- continue
- w = self.menu_items[key]
- w.set_sensitive(False)
- w.hide()
- if load_intf:
- # Entropy initialization
- self.Entropy = Entropy(self)
- self.enable_refresh_timer()
-
- def task_queue_executor(self):
- while 1:
+ def setup_dbus(self):
+ tries = 5
+ while tries:
+ dbus_loop = dbus.mainloop.glib.DBusGMainLoop(set_as_default = True)
+ self.__system_bus = dbus.SystemBus(mainloop = dbus_loop)
try:
- data = self.TaskQueue.pop(0)
- except IndexError:
- return self.TaskQueueAlive
- func, args, kwargs = data
- if self.debug: print "queue_exec",func, args, kwargs
- func(*args,**kwargs)
- if not self.TaskQueueAlive:
- return False
+ self.__entropy_dbus_object = self.__system_bus.get_object(
+ self.__dbus_interface, self.__dbus_path
+ )
+ self.__entropy_dbus_object.connect_to_signal(
+ self.__signal_name, self.new_updates_signal,
+ dbus_interface = self.__dbus_interface
+ )
+ except dbus.exceptions.DBusException, e:
+ self.__dbus_init_error_msg = unicode(e)
+ # service not avail
+ tries -= 1
+ time.sleep(2)
+ continue
+ return True
+ entropyTools.print_traceback()
+ return False
+
+ def show_service_not_available(self):
+ # inform user about missing Entropy service
+ self.show_alert(
+ _("Cannot monitor Sabayon updates"),
+ "%s: %s: %s" % (
+ _("Entropy DBus service not available"),
+ _("unable to communicate with the updates service"),
+ self.__dbus_init_error_msg,
+ ),
+ urgency = "critical"
+ )
+
+ def show_service_available(self):
+ self.show_alert(
+ _("Sabayon updates service loaded"),
+ "%s: %s." % (
+ _("Entropy DBus service loaded"),
+ _("your Sabayon will notify your once updates are available"),
+ )
+ )
+
+ def new_updates_signal(self):
+ if not etp_applet_config.settings['APPLET_ENABLED']:
+ return
+ iface = dbus.Interface(
+ self.__entropy_dbus_object, dbus_interface="org.entropy.Client")
+ updates = iface.get_updates_atoms()
+ avail = [str(x) for x in updates]
+ del self.package_updates[:]
+ self.package_updates.extend(avail)
+ upd_len = len(updates)
+
+ if upd_len:
+ self.update_tooltip("%s %s %s" % (
+ _("There are"),
+ upd_len,
+ _("updates available"),)
+ )
+ self.set_state("CRITICAL")
+ self.show_alert(
+ _("Sabayon updates available"),
+ "%s %s %s" % (
+ _("There are"),
+ "%s" % (upd_len,),
+ _("updates available"),
+ ),
+ urgency = "critical"
+ )
+ else:
+ # all fine, no updates
+ self.update_tooltip(_("Your Sabayon is up-to-date"))
+ self.set_state("OKAY")
+ self.show_alert(_("Your Sabayon is up-to-date"),
+ _("No updates available at this time, cool!")
+ )
+
+ def do_first_check(self):
+
+ def _do_check():
+ self.send_check_updates_signal()
+ return False
+
+ if self._dbus_service_available:
+ # after 20 seconds
+ gobject.timeout_add(10000, _do_check)
+
+ def send_check_updates_signal(self, widget=None):
+
+ # enable applet if disabled
+ skip_tc = False
+ if not etp_applet_config.settings['APPLET_ENABLED']:
+ self.enable_applet(do_check = False)
+ skip_tc = True
+
+ # avoid flooding
+ cur_t = time.time()
+ if ((cur_t - self.last_trigger_check_t) < 15) and (not skip_tc):
+ # ignore
+ return
+ self.last_trigger_check_t = cur_t
+
+ if self._dbus_service_available:
+ iface = dbus.Interface(
+ self.__entropy_dbus_object, dbus_interface="org.entropy.Client")
+ iface.trigger_check()
+
+ def close_service(self):
+ if self._dbus_service_available:
+ iface = dbus.Interface(
+ self.__entropy_dbus_object, dbus_interface="org.entropy.Client")
+ iface.close_connection()
+ entropyTools.kill_threads()
+
+ def unblink_icon_after_secs(self, secs):
+ def do_unblink():
+ self.status_icon.set_blinking(False)
+ gobject.timeout_add(secs*1000, do_unblink)
+
+ def set_state(self, new_state, use_busy_icon = 0):
+
+ if not new_state in etp_applet_config.APPLET_STATES:
+ raise IncorrectParameter("Error: invalid state %s" % new_state)
+
+ self.status_icon.set_blinking(False)
+ if new_state == "OKAY":
+ self.change_icon("okay")
+ elif new_state == "BUSY":
+ if use_busy_icon:
+ self.set_displayed_image("busy")
+ elif new_state == "CRITICAL":
+ self.status_icon.set_blinking(True)
+ self.unblink_icon_after_secs(10)
+ if self.never_viewed_notices:
+ self.change_icon("critical")
+ else:
+ self.set_displayed_image("critical")
+ elif new_state == "DISABLE":
+ self.change_icon("disable")
+ elif new_state == "ERROR":
+ self.change_icon("error")
+ self.current_state = new_state
def set_menu_image(self, widget, name):
img = gtk.Image()
@@ -322,30 +368,13 @@ class EntropyApplet:
img.set_from_pixbuf(pix)
widget.set_image(img)
- def enable_refresh_timer(self, when = etp_applet_config.settings['REFRESH_INTERVAL'] * 1000):
- if self.current_state in [ "CRITICAL" ]: return
- if not self.refresh_timeout_tag:
- self.refresh_timeout_tag = TimeScheduled(when/1000, self.refresh_handler)
- self.refresh_timeout_tag.set_delay_before(True)
- self.refresh_timeout_tag.start()
-
- def disable_refresh_timer(self):
- if self.refresh_timeout_tag:
- self.refresh_timeout_tag.kill()
- self.refresh_timeout_tag = None
-
- def start_working(self):
- self.isWorking = True
-
- def end_working(self):
- self.isWorking = False
-
def change_icon(self, image):
to_image = self.icons.best_match(image, self.applet_size)
self.status_icon.set_from_pixbuf(to_image)
def set_displayed_image(self, image):
- if isinstance(image,basestring): new_image = self.icons.best_match(image, self.applet_size)
+ if isinstance(image,basestring):
+ new_image = self.icons.best_match(image, self.applet_size)
else: new_image = image
self.current_image = new_image
self.redraw()
@@ -357,60 +386,52 @@ class EntropyApplet:
def load_packages_url(self, *data):
try:
- gnome.url_show("http://packages.sabayonlinux.org/")
+ gnome.url_show("http://www.sabayon.org/packages")
except gobject.GError:
- self.load_browser("http://packages.sabayonlinux.org/")
+ self.load_url("http://www.sabayon.org/packages")
def load_website(self, *data):
try:
- gnome.url_show("http://www.sabayonlinux.org/")
+ gnome.url_show("http://www.sabayon.org/")
except gobject.GError:
- self.load_browser("http://www.sabayonlinux.org/")
+ self.load_url("http://www.sabayon.org/")
- def load_browser(self, url):
- browser = None
- konq_ret = subprocess.call("which konqueror &> /dev/null", shell = True)
- if os.access("/usr/bin/firefox",os.X_OK):
- browser = "/usr/bin/firefox"
- elif konq_ret:
- browser = "konqueror"
- elif os.access("/usr/bin/opera",os.X_OK):
- browser = "/usr/bin/opera"
- if browser:
- subprocess.call([browser,url])
+ def load_url(self, url):
+ subprocess.call(['xdg-open',url])
def disable_applet(self, *args):
self.update_tooltip(_("Updates Notification Applet Disabled"))
- self.disable_refresh_timer()
self.set_state("DISABLE")
etp_applet_config.settings['APPLET_ENABLED'] = 0
etp_applet_config.save_settings(etp_applet_config.settings)
self.menu_items['disable_applet'].hide()
self.menu_items['enable_applet'].show()
- def enable_applet(self, init = False):
+ def enable_applet(self, w = None, do_check = True):
+ if not self._dbus_service_available:
+ self.show_service_not_available()
+ return
self.update_tooltip(_("Updates Notification Applet Enabled"))
- if not init:
- self.enable_refresh_timer()
self.set_state("OKAY")
etp_applet_config.settings['APPLET_ENABLED'] = 1
etp_applet_config.save_settings(etp_applet_config.settings)
self.menu_items['disable_applet'].show()
self.menu_items['enable_applet'].hide()
+ if self._dbus_service_available and do_check:
+ self.send_check_updates_signal()
def launch_package_manager(self, *data):
-
def spawn_spritz():
os.execv('/usr/bin/spritz', ['spritz'])
-
- t = ParallelTask(spawn_spritz)
- t.start()
+ pid = os.fork()
+ if pid == 0:
+ spawn_spritz()
+ os._exit(0)
def show_alert(self, title, text, urgency = None):
if (title,text) == self.last_alert:
return
-
pynotify.init("XY")
n = pynotify.Notification(title, text)
if urgency == 'critical':
@@ -421,246 +442,12 @@ class EntropyApplet:
n.attach_to_status_icon(self.status_icon)
n.show()
- def compare_repositories_status(self):
- repos = {}
-
- try:
- repoConn = self.Entropy.Repositories(noEquoCheck = True, fetchSecurity = False)
- except MissingParameter:
- return repos,1 # no repositories specified
- except OnlineMirrorError:
- return repos,2 # not connected ??
- except Exception, e:
- return repos,str(e) # unknown error
-
- # now get remote
- for repoid in self.Entropy.SystemSettings['repositories']['available']:
- if repoConn.is_repository_updatable(repoid):
- self.Entropy.repository_move_clear_cache(repoid)
- repos[repoid] = {}
- repos[repoid]['local_revision'] = self.Entropy.get_repository_revision(repoid)
- repos[repoid]['remote_revision'] = repoConn.get_online_repository_revision(repoid)
-
- del repoConn
-
- return repos, 0
-
- def refresh_handler(self, force = 0, after = 0):
- if after: time.sleep(after)
- self.refresh(force)
-
- def refresh(self, force = 0):
-
- if not self.Entropy:
- if self.debug: print "refresh: Entropy interface not loaded"
- return
- if not etp_applet_config.settings['APPLET_ENABLED']:
- if self.debug: print "refresh: applet not enabled"
- return
- if self.debug: print "refresh: all fine, getting lock and running run_refresh"
-
- self.refresh_lock.acquire()
- try:
- t = ParallelTask(self.run_refresh, force)
- t.start()
- while t.isAlive():
- self.status_icon.set_visible(True)
- self.task_queue_executor()
- time.sleep(0.3)
- return t.get_rc()
- finally:
- self.refresh_lock.release()
-
-
- def run_refresh(self, force):
-
- locked = self.Entropy.application_lock_check(silent = True)
-
- if self.debug: print "run_refresh: I am here"
-
- self.start_working()
- old_tip = self.tooltip_text
- old_state = self.current_state
-
- self.disable_network_timer()
- self.set_state("BUSY", use_busy_icon = force)
- self.update_tooltip(_("Checking for updates..."))
-
- self.last_error = None
- self.last_error_is_network_error = 0
- self.error_threshold = 0
- self.available_packages = []
-
- rc = 0
- if not locked:
-
- # compare repos
- if self.debug: print "run_refresh: launching compare_repositories_status"
- repositories_to_update, rc = self.compare_repositories_status()
- if self.debug: print "run_refresh: completed compare_repositories_status: %s" % ((repositories_to_update, rc),)
-
- if repositories_to_update and rc == 0:
- repos = repositories_to_update.keys()
-
- if self.debug: print "run_refresh: loading repository interface"
- try:
- repoConn = self.Entropy.Repositories(repos, fetchSecurity = False, noEquoCheck = True)
- if self.debug: print "run_refresh: repository interface loaded"
- except MissingParameter, e:
- self.last_error = "%s: %s" % (_("No repositories specified in"),etpConst['repositoriesconf'],)
- self.error_threshold += 1
- if self.debug: print "run_refresh: MissingParameter exception, error: %s" % (e,)
- except OnlineMirrorError, e:
- self.last_error = _("Repository Network Error")
- self.last_error_is_network_error = 1
- if self.debug: print "run_refresh: OnlineMirrorError exception, error: %s" % (e,)
- except Exception, e:
- self.error_threshold += 1
- self.last_error_is_exception = 1
- self.last_error = "%s: %s" % (_('Unhandled exception'),e,)
- if self.debug: print "run_refresh: Unhandled exception, error: %s" % (e,)
- else:
- # -128: sync error, something bad happened
- # -2: repositories not available (all)
- # -1: not able to update all the repositories
- if self.debug: print "run_refresh: preparing to run sync"
- rc = repoConn.sync()
- rc = rc*-1
- del repoConn
- if self.debug: print "run_refresh: sync done"
- if self.debug: print "run_refresh: sync closed, rc: %s" % (rc,)
-
- if rc == 1:
- err = _("No repositories specified. Cannot check for package updates.")
- self.show_alert( _("Updates: attention"), err )
- self.error_threshold += 1
- self.last_error = err
- elif rc == 2:
- err = _("Cannot connect to the Updates Service, you're probably not connected to the world.")
- self.show_alert( _("Updates: connection issues"), err )
- self.last_error_is_network_error = 1
- self.last_error = err
- elif rc == -1:
- err = _("Not all the repositories have been fetched for checking")
- self.show_alert( _("Updates: repository issues"), err )
- self.last_error_is_network_error = 1
- self.last_error = err
- elif rc == -2:
- err = _("No repositories found online")
- self.show_alert( _("Updates: repository issues"), err )
- self.last_error_is_network_error = 1
- self.last_error = err
- elif rc == -128:
- err = _("Synchronization errors. Cannot update repositories. Check logs.")
- self.show_alert( _("Updates: sync issues"), err )
- self.error_threshold += 1
- self.last_error = err
- elif isinstance(rc,basestring):
- self.show_alert( _("Updates: unhandled error"), rc )
- self.error_threshold += 1
- self.last_error_is_exception = 1
- self.last_error = rc
-
- if self.last_error_is_network_error:
- self.update_tooltip(_("Updates: connection issues"))
- self.set_state("DISCONNECTED")
- self.end_working()
- return False
-
- try:
- update, remove, fine = self.Entropy.calculate_world_updates()
- del fine, remove
- except Exception, e:
- msg = "%s: %s" % (_("Updates: error"),e,)
- self.show_alert(_("Updates: error"), msg)
- self.error_threshold += 1
- self.last_error_is_exception = 1
- self.last_error = str(e)
-
- if self.last_error:
- self.disable_refresh_timer()
- msg = "%s: %s" % (_("Updates issue:"),self.last_error,)
- self.update_tooltip(msg)
- self.set_state("ERROR")
- self.end_working()
- return False
-
- if rc == 0:
- self.update_tooltip(old_tip)
-
- if update:
- self.available_packages = update[:]
- self.set_state("CRITICAL")
- msg = "%s %d %s" % (_("There are"),len(update),_("updates available."),)
- self.update_tooltip(msg)
- self.show_alert( _("Updates available"),
- msg,
- urgency = 'critical'
- )
- if self.notice_window:
- self.refresh_notice_window()
-
- else:
- self.set_state(old_state)
- self.update_tooltip(_("So far, so good. w00t!"))
- self.show_alert( _("Everything up-to-date"),
- _("So far, so good. w00t!"),
- urgency = 'low'
- )
-
- self.end_working()
- return True
-
- def is_network_error(self, msg):
- if msg.find("SysCallError") >= 0 and msg.find("104") >= 0:
- return 1
- if msg.find("onnection") >= 0:
- return 1
- if msg.find("etwork") >= 0:
- return 1
- if msg.find("certificate verify failed") >= 0:
- return 0
- if msg.find("SSL") >= 0:
- return 1
- return 0
-
- def network_retry_handler(self, force):
- self.refresh(force)
-
- def enable_network_timer(self, when = etp_applet_config.settings['NETWORK_RETRY_INTERVAL'] * 1000, force = 0):
- if self.current_state != "DISCONNECTED": return
- if not self.network_timeout_tag:
- self.network_timeout_tag = TimeScheduled(when/1000, self.network_retry_handler, force = force)
- self.network_timeout_tag.set_delay_before(True)
- self.network_timeout_tag.start()
-
- def disable_network_timer(self):
- if self.network_timeout_tag:
- self.network_timeout_tag.kill()
- self.network_timeout_tag = None
-
def update_tooltip(self, tip):
self.tooltip_text = tip
- def _update_tooltip(tip):
- self.status_icon.set_tooltip(tip)
- if self.debug: print "queued:",_update_tooltip
- self.TaskQueue.append((_update_tooltip,[tip],{},))
-
- def update_from_server(self, widget=None):
- self.enable_applet()
- self.refresh(force = 1)
-
- def user_consented(self):
- self.consent = 1
-
- def notice_window_closed(self):
- self.notice_window = None
+ self.status_icon.set_tooltip(tip)
def exit_applet(self, *args):
-
- entropyTools.kill_threads()
- self.TaskQueueAlive = False
-
+ self.close_service()
gtk.main_quit()
raise SystemExit(0)
@@ -668,110 +455,91 @@ class EntropyApplet:
if self.session:
self.session.set_clone_command(1, ["/usr/bin/entropy-update-applet"])
self.session.set_restart_command(1, ["/usr/bin/entropy-update-applet"])
-
return True
def about(self, *data):
if self.about_window:
return
- self.about_window = rhnAppletAboutWindow(self)
+ self.about_window = AppletAboutWindow(self)
def about_dialog_closed(self):
self.about_window = None
- def rhnreg_dialog_closed(self):
- self.rhnreg_dialog = None
+ def notice_window_closed(self):
+ self.notice_window = None
def error_dialog_closed(self):
self.error_dialog = None
self.last_error = None
- self.last_error_is_exception = 0
- self.last_error_is_network_error = 0
self.set_state("OKAY")
self.update_tooltip(_("Waiting before checkin..."))
- self.enable_refresh_timer()
def applet_face_click(self, icon, button, activate_time):
-
if button == 3:
self.menu.popup(None, None, None, 0, activate_time)
return
def applet_face_click2(self, icon):
- if not self.current_state in [ "OKAY", "ERROR", "DISCONNECTED", "CRITICAL" ]:
+ if not self.current_state in [ "OKAY", "ERROR", "CRITICAL" ]:
return
if self.last_error:
if self.error_dialog:
return
- if self.last_error_is_exception:
- self.error_dialog = rhnAppletExceptionDialog(self, self.last_error)
- else:
- self.error_dialog = rhnAppletErrorDialog(self, self.last_error)
+ self.error_dialog = AppletErrorDialog(self, self.last_error)
return
self.never_viewed_notices = 0
- if self.notice_window and not self.rhnreg_dialog:
+ if self.notice_window:
self.notice_window.close_window()
return
if not self.notice_window:
- self.notice_window = rhnAppletNoticeWindow(self)
+ self.notice_window = AppletNoticeWindow(self)
self.refresh_notice_window()
- if self.rhnreg_dialog:
- self.rhnreg_dialog.set_transient(self.notice_window)
- self.rhnreg_dialog.raise_()
-
def refresh_notice_window(self):
- self.notice_window.clear_window()
- if not self.available_packages:
+ self.notice_window.clear_window()
+ if not self.package_updates:
return
- names = {}
- entropy_data = {}
- for pkg in self.available_packages:
- dbconn = self.Entropy.open_repository(pkg[1])
- atom = dbconn.retrieveAtom(pkg[0])
- avail = dbconn.retrieveVersion(pkg[0])
- avail_rev = dbconn.retrieveRevision(pkg[0])
- key, slot = dbconn.retrieveKeySlot(pkg[0])
- installed_match = self.Entropy.clientDbconn.atomMatch(key, matchSlot = slot)
+ entropy_ver = None
+ packages = []
+ for atom in self.package_updates:
+
+ key = entropyTools.dep_getkey(atom)
+ avail_rev = entropyTools.dep_get_entropy_revision(atom)
+ avail_tag = entropyTools.dep_gettag(atom)
+ my_pkg = entropyTools.remove_entropy_revision(atom)
+ my_pkg = entropyTools.remove_tag(my_pkg)
+ pkgcat, pkgname, pkgver, pkgrev = entropyTools.catpkgsplit(my_pkg)
+ ver = pkgver
+ if pkgrev != "r0":
+ ver += "-%s" % (pkgrev,)
+ if avail_tag:
+ ver += "#%s" % (avail_tag,)
+ if avail_rev:
+ ver += "~%s" % (avail_tag,)
- if installed_match[0] != -1:
- installed = self.Entropy.clientDbconn.retrieveVersion(installed_match[0])
- installed_rev = self.Entropy.clientDbconn.retrieveRevision(installed_match[0])
- else:
- installed = _("Not installed")
if key == "sys-apps/entropy":
- entropy_data['avail'] = avail+"~"+str(avail_rev)[:]
- entropy_data['installed'] = installed+"~"+str(installed_rev)
+ entropy_ver = ver
- names[atom] = {}
- names[atom]['installed'] = installed+"~"+str(installed_rev)
- names[atom]['avail'] = avail+"~"+str(avail_rev)
+ packages.append((key, ver,))
- ordered_names = names.keys()
- ordered_names.sort()
- for name in ordered_names:
- self.notice_window.add_package( name,
- names[name]['installed'],
- names[name]['avail']
- )
+ self.notice_window.fill(packages)
critical_text = []
- if entropy_data.has_key("avail"):
- msg = "%s sys-apps/entropy %s %s, %s %s. %s." % (
- _("Your system currently has"),
- entropy_data['installed'],
- _("installed"),
- _("but the latest available version is"),
- entropy_data['avail'],
- _("It is recommended that you upgrade to the latest before updating any other packages")
+ if entropy_ver != None:
+ msg = "%s sys-apps/entropy %s, %s %s. %s." % (
+ _("Your system currently has an outdated version of"),
+ _("installed"),
+ _("the latest available version is"),
+ entropy_ver,
+ _("It is recommended that you upgrade to the latest before updating any other packages")
)
critical_text.append(msg)
diff --git a/entropy-notification-applet/src/etp_applet_animation.py b/entropy-notification-applet/src/etp_applet_animation.py
deleted file mode 100644
index e336dc39b..000000000
--- a/entropy-notification-applet/src/etp_applet_animation.py
+++ /dev/null
@@ -1,111 +0,0 @@
-# This file is a portion of the Red Hat Network Panel Applet
-#
-# Copyright (C) 1999-2002 Red Hat, Inc. All Rights Reserved.
-# Distributed under GPL version 2.
-#
-# Author: Chip Turner
-#
-# def help added by Tammy Fox
-#
-# $Id: rhn_applet_animation.py,v 1.3 2002/09/02 22:26:11 cturner Exp $
-
-import gtk
-import gtk.gdk
-import math
-import os
-from spritz_setup import const
-
-class rhnAppletIconPixbuf:
- def __init__(self):
- self.images = {}
- def add_file(self, name, filename):
- if not self.images.has_key(name):
- self.images[name] = []
-
- filepath = const.PIXMAPS_PATH + "/applet/" + filename
- if not os.path.isfile(filepath):
- filename = "../gfx/applet/" + filename
- else:
- filename = filepath
-
- if not os.access(filename, os.R_OK):
- raise Exception,"Cannot open image file %s" % filename
-
- pixbuf = gtk.gdk.pixbuf_new_from_file(filename)
-
- self.add(name, pixbuf)
- def add(self, name, pixbuf):
- self.images[name].append(pixbuf)
-
- # find image closest to the requested size. will be scaled later...
- def best_match(self, name, size):
- best = None
-
- for image in self.images[name]:
- if not best:
- best = image
- continue
- if abs(size - image.height) < abs(size - best.height):
- best = image
-
- return best
-
-class rhnAppletAnimation:
- def __init__(self):
- self.frames = []
- self.cycle_frames = []
-
- self.frame = 0
- self.direction = 1
-
- # final frame is a PUBLIC DATA MEMBER... yeah, naughty
- self.final_frame = None
-
- def append_frames(self, frames):
- self.frames = self.frames + frames
- self.final_frame = self.frames[-1]
-
- def append_cycle(self, frames):
- self.cycle_frames = self.cycle_frames + frames
-
- def next_frame(self):
- if len(self.frames):
- return self.frames.pop(0)
-
- if len(self.cycle_frames):
- ret = self.cycle_frames[self.frame]
- self.frame = self.frame + self.direction
-
- if self.frame < 0 or self.frame >= len(self.cycle_frames):
- # oops, we moved too far. change direction, undo last move
- self.direction = -self.direction
- self.frame = self.frame + self.direction
-
- return ret
-
- return None
-
-def alpha_tween(start_image, end_image, steps):
- tmp = start_image.copy()
-
- frames = [ start_image ]
- stepsize = 256/steps
-
- for i in range(2, steps):
- buf = tmp.copy()
-
- end_image.composite(buf,
- # dest x, y, w, h
- 0, 0, buf.get_width(), buf.get_height(),
- # ofset x, y
- 0, 0,
- # scale factor x, y
- 1.0, 1.0,
- gtk.gdk.INTERP_BILINEAR,
- i * stepsize - 1)
-
- frames.append(buf)
-
- frames.append(end_image)
-
- return frames
diff --git a/entropy-notification-applet/src/etp_applet_dialogs.py b/entropy-notification-applet/src/etp_applet_components.py
similarity index 52%
rename from entropy-notification-applet/src/etp_applet_dialogs.py
rename to entropy-notification-applet/src/etp_applet_components.py
index c873129fc..40ecb91f1 100644
--- a/entropy-notification-applet/src/etp_applet_dialogs.py
+++ b/entropy-notification-applet/src/etp_applet_components.py
@@ -1,11 +1,25 @@
-# This file is a portion of the Red Hat Network Panel Applet
-#
-# Copyright (C) 1999-2002 Red Hat, Inc. All Rights Reserved.
-# Distributed under GPL version 2.
-#
-# Author: Chip Turner
-#
-# $Id: rhn_applet_dialogs.py,v 1.30 2003/10/14 17:41:34 veillard Exp $
+# -*- coding: utf-8 -*-
+"""
+ # DESCRIPTION:
+ # Entropy updates Notification Applet
+
+ Copyright (C) 2007-2009 Fabio Erculiani
+ Forking RHN Applet
+
+ 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 2 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+"""
import os
import gnome
@@ -20,7 +34,8 @@ from entropy.i18n import _
from entropy.core import SystemSettings
SysSettings = SystemSettings()
-class rhnGladeWindow:
+class GladeWindow:
+
def __init__(self, filename, window_name):
self.filename = filename
if not os.path.isfile(filename):
@@ -31,24 +46,28 @@ class rhnGladeWindow:
def get_widget(self, widget):
return self.xml.get_widget(widget)
-class rhnAppletNoticeWindow(rhnGladeWindow):
+class AppletNoticeWindow(GladeWindow):
+
def __init__(self, parent):
- rhnGladeWindow.__init__(self, "etp_applet.glade", "notice_window_2")
+ GladeWindow.__init__(self, "etp_applet.glade", "notice_window_2")
self.parent = parent
self.window.connect('delete_event', self.close_window)
self.package_list = self.get_widget('update_clist')
- self.package_list.append_column(gtk.TreeViewColumn(_("Package Name"), gtk.CellRendererText(), text=0))
- self.package_list.append_column(gtk.TreeViewColumn(_("Version Installed"), gtk.CellRendererText(), text=1))
- self.package_list.append_column(gtk.TreeViewColumn(_("Available"), gtk.CellRendererText(), text=2))
+ self.package_list.append_column(
+ gtk.TreeViewColumn(
+ _("Application"), gtk.CellRendererText(), text=0))
+ self.package_list.append_column(
+ gtk.TreeViewColumn(_("Latest version"), gtk.CellRendererText(), text=1))
self.package_list.get_selection().set_mode(gtk.SELECTION_NONE)
self.notebook = self.get_widget('notice_notebook')
self.critical_tab = None
self.critical_tab_contents = None
- self.package_list_model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
+ self.package_list_model = gtk.ListStore(gobject.TYPE_STRING,
+ gobject.TYPE_STRING)
self.package_list.set_model(self.package_list_model)
self.xml.signal_autoconnect (
@@ -74,6 +93,7 @@ class rhnAppletNoticeWindow(rhnGladeWindow):
print "url: %s" % url
def set_critical(self, text, critical_active):
+
if not self.critical_tab_contents:
html_view = gtkhtml2.View()
self.html_view = html_view
@@ -94,8 +114,9 @@ class rhnAppletNoticeWindow(rhnGladeWindow):
self.critical_tab_contents = sw
if critical_active:
- self.notebook.set_current_page(self.notebook.page_num(self.critical_tab_contents))
-
+ self.notebook.set_current_page(
+ self.notebook.page_num(self.critical_tab_contents))
+
self.set_critical_tab_text(text)
else:
if self.critical_tab_text != text:
@@ -107,7 +128,8 @@ class rhnAppletNoticeWindow(rhnGladeWindow):
self.html_doc.clear()
self.html_doc.connect('link_clicked', self.on_link_clicked)
self.html_doc.open_stream("text/html")
- self.html_doc.write_stream('' + text)
+ self.html_doc.write_stream(
+ '' + text)
self.html_doc.close_stream()
self.html_view.set_document(self.html_doc)
@@ -115,53 +137,24 @@ class rhnAppletNoticeWindow(rhnGladeWindow):
if not self.critical_tab_contents:
return
- self.notebook.remove_page(self.notebook.page_num(self.critical_tab_contents))
+ self.notebook.remove_page(
+ self.notebook.page_num(self.critical_tab_contents))
- def add_package(self, name, installed, avail):
- myiter = self.package_list_model.append()
- self.package_list_model.set_value(myiter, 0, name)
- self.package_list_model.set_value(myiter, 1, installed)
- self.package_list_model.set_value(myiter, 2, avail)
+ def fill(self, pkg_data):
+ self.package_list_model.clear()
+ for name, avail in pkg_data:
+ self.package_list_model.append((name, avail,))
-class rhnRegistrationPromptDialog(rhnGladeWindow):
- def __init__(self, parent):
- rhnGladeWindow.__init__(self, "etp_applet.glade", "need_to_register_dialog")
-
- self.parent = parent
- self.window.connect('delete_event', self.close_dialog)
- self.xml.signal_autoconnect (
- {
- "on_launch_rhnreg_clicked" : self.on_rhnreg,
- "on_close_clicked" : self.on_close,
- })
-
- def raise_(self):
- self.window.window.raise_()
-
- def set_transient(self, papa):
- self.window.set_transient_for(papa.window)
-
- def on_rhnreg(self, button):
- self.parent.launch_rhnreg()
- self.close_dialog()
-
- def close_dialog(self, *rest):
- self.window.destroy()
- self.parent.rhnreg_dialog_closed()
-
- def on_close(self, close_button):
- self.close_dialog()
-
-class rhnAppletAboutWindow:
+class AppletAboutWindow:
def __init__(self, parent):
self.window = gnome.ui.About("%s Updates Applet" % (
SysSettings['system']['name'],
),
etpConst['entropyversion'], "Copyright (C) 2009, Sabayon Linux",
- "Sabayon Linux. What else?",
- [ "Sabayon Linux Team", "devel@sabayonlinux.org" ])
+ "Sabayon, what else?",
+ [ "Sabayon Linux", "sabayon@sabayonlinux.org" ])
self.window.connect("destroy", self.on_close)
self.parent = parent
self.window.show()
@@ -172,122 +165,11 @@ class rhnAppletAboutWindow:
def on_close(self, *data):
self.close_dialog()
-class rhnAppletFirstTimeDruid(rhnGladeWindow):
- def __init__(self, parent, proxy_url, proxy_username, proxy_password):
- rhnGladeWindow.__init__(self, "etp_applet.glade", "first_time_druid")
-
- self.parent = parent
- self.window.connect('delete_event', self.close_dialog)
- self.xml.signal_autoconnect (
- {
- "on_cancel" : self.on_cancel,
- "on_remove_from_panel" : self.on_remove_from_panel,
- "on_finish" : self.on_finish,
- })
-
- color = gtk.gdk.color_parse("#cc0000")
- page = self.xml.get_widget("druidpagestart1")
- page.set_bg_color(color)
- page = self.xml.get_widget("druidpagefinish1")
- page.set_bg_color(color)
-
- html_sw = self.get_widget("tos_window")
- self.tos_document = gtkhtml2.Document()
- self.tos_view = gtkhtml2.View()
- html_sw.add(self.tos_view)
- self.tos_view.show()
- html_sw.show()
- self.tos_document.clear()
- self.tos_document.connect('link_clicked', self.on_link_clicked)
- self.tos_document.open_stream("text/html")
-
- self.tos_document.close_stream()
- self.tos_view.set_document(self.tos_document)
-
- self.enable_proxy = self.get_widget("enable_proxy_check")
- self.enable_proxy.connect("toggled", self.on_enable_proxy_toggle)
-
- self.enable_auth = self.get_widget("use_auth_check")
- self.enable_auth.connect("toggled", self.on_use_auth_toggle)
-
- self.proxy_entry = self.get_widget("proxy_entry")
- self.username_entry = self.get_widget("username_entry")
- self.password_entry = self.get_widget("password_entry")
- self.username_entry_label = self.get_widget("username_entry_label")
- self.password_entry_label = self.get_widget("password_entry_label")
-
- self.use_auth = 0
- self.use_proxy = 0
-
- self.proxy_entry.set_text(proxy_url)
- if proxy_url:
- self.use_proxy = 1
- self.enable_proxy.set_sensitive(gtk.TRUE)
- self.enable_proxy.activate()
-
- if proxy_username:
- self.use_auth = 1
- self.username_entry.set_text(proxy_username)
- self.password_entry.set_text(proxy_password)
- self.enable_auth.set_sensitive(gtk.TRUE)
- self.enable_auth.activate()
- self.window.show_all()
-
- def on_link_clicked(self, html, url):
- gnome.url_show(url)
-
- def on_enable_proxy_toggle(self, button):
- state = button.get_active()
- self.use_proxy = state
-
- self.get_widget("proxy_entry").set_sensitive(state)
- self.enable_auth.set_sensitive(state)
-
- if self.use_auth:
- self.username_entry.set_sensitive(state)
- self.username_entry_label.set_sensitive(state)
- self.password_entry.set_sensitive(state)
- self.password_entry_label.set_sensitive(state)
-
- def on_use_auth_toggle(self, button):
- state = button.get_active()
- self.use_auth = state
-
- self.username_entry.set_sensitive(state)
- self.username_entry_label.set_sensitive(state)
- self.password_entry.set_sensitive(state)
- self.password_entry_label.set_sensitive(state)
-
- def close_dialog(self, *data, **kwarg):
- if kwarg.has_key("remove"):
- self.parent.first_time_druid_closed(kwarg["remove"])
- else:
- self.parent.first_time_druid_closed(0)
- self.window.hide()
-
- def on_cancel(self, cancel_button):
- self.close_dialog(remove=0)
-
- def on_remove_from_panel(self, cancel_button):
- self.close_dialog(remove=1)
-
- def on_finish(self, *data):
- if self.use_proxy:
- args = [ self.proxy_entry.get_text() ]
- if self.use_auth:
- args.append(self.username_entry.get_text())
- args.append(self.password_entry.get_text())
- apply(self.parent.set_proxy, args)
- else:
- self.parent.set_proxy()
-
- self.parent.user_consented()
- self.close_dialog()
-
-class rhnAppletErrorDialog(rhnGladeWindow):
+class AppletErrorDialog(GladeWindow):
def __init__(self, parent, error):
- rhnGladeWindow.__init__(self)
- self.window = gtk.MessageDialog(None, 0, gtk.MESSAGE_WARNING, gtk.BUTTONS_OK, str(error))
+ GladeWindow.__init__(self)
+ self.window = gtk.MessageDialog(None, 0,
+ gtk.MESSAGE_WARNING, gtk.BUTTONS_OK, str(error))
self.window.set_modal(gtk.TRUE)
self.window.connect("close", self.on_close)
self.window.connect('response', self.on_close)
@@ -355,13 +237,14 @@ class WrappingLabel(gtk.Label):
self.ignoreEvents = 0
self.connect("size-allocate", growToParent)
-class rhnAppletExceptionDialog:
+class AppletExceptionDialog:
+
def __init__ (self, parent, text):
self.parent = parent
win = gtk.Dialog("Exception Occured", None)
self.window = win
win.add_button('gtk-ok', 0)
-
+
mybuf = gtk.TextBuffer(None)
mybuf.set_text(text)
textbox = gtk.TextView()
@@ -396,3 +279,41 @@ class rhnAppletExceptionDialog:
def on_close(self, *data):
self.close_dialog()
+
+class AppletIconPixbuf:
+
+ def __init__(self):
+ self.images = {}
+
+ def add_file(self, name, filename):
+
+ if not self.images.has_key(name):
+ self.images[name] = []
+ from spritz_setup import const
+ filepath = const.PIXMAPS_PATH + "/applet/" + filename
+ if not os.path.isfile(filepath):
+ filename = "../gfx/applet/" + filename
+ else:
+ filename = filepath
+
+ if not os.access(filename, os.R_OK):
+ raise Exception,"Cannot open image file %s" % filename
+
+ pixbuf = gtk.gdk.pixbuf_new_from_file(filename)
+
+ self.add(name, pixbuf)
+
+ def add(self, name, pixbuf):
+ self.images[name].append(pixbuf)
+
+ def best_match(self, name, size):
+ best = None
+
+ for image in self.images[name]:
+ if not best:
+ best = image
+ continue
+ if abs(size - image.height) < abs(size - best.height):
+ best = image
+
+ return best
diff --git a/entropy-notification-applet/src/etp_applet_config.py b/entropy-notification-applet/src/etp_applet_config.py
index 0e7df5305..94d15fcaf 100644
--- a/entropy-notification-applet/src/etp_applet_config.py
+++ b/entropy-notification-applet/src/etp_applet_config.py
@@ -8,8 +8,10 @@
import os
import entropy.dump as dumpTools
-APPLET_STATES = [ "STARTUP", "NOCONSENT", "CONFIGURING", "OKAY", "CRITICAL", "BUSY", "ERROR", "DISCONNECTED", "DISABLE" ]
-APPLET_MENUS = [ "about", "update_now", "web_panel", "web_site", "configure_applet", "check_now" ]
+APPLET_STATES = [ "STARTUP", "NOCONSENT", "CONFIGURING", "OKAY",
+ "CRITICAL", "BUSY", "ERROR", "DISCONNECTED", "DISABLE" ]
+APPLET_MENUS = [ "about", "update_now", "web_panel", "web_site",
+ "configure_applet", "check_now" ]
APPLET_SENSITIVE_MENU = {
"STARTUP" : [ "" ],
@@ -33,7 +35,8 @@ ANIMATION_TOTAL_TIME = 0.75
home = os.getenv("HOME")
if not home: home = "/tmp"
-SETTINGS_FILE = os.path.join(home, ".config/entropy/entropy-notification-applet.conf")
+SETTINGS_FILE = os.path.join(home,
+ ".config/entropy/entropy-notification-applet.conf")
def save_settings(settings):
global SETTINGS_FILE
@@ -49,8 +52,6 @@ if settings == None:
settings = {}
myconst = [
- ['REFRESH_INTERVAL',int],
- ['NETWORK_RETRY_INTERVAL',int],
['ERROR_THRESHOLD',int],
['ANIMATION_TOTAL_TIME',float],
['APPLET_ENABLED',int],