From 75cb23ddcaeffecd0fb3d69047833bf3918f313c Mon Sep 17 00:00:00 2001 From: lxnay Date: Mon, 7 Jul 2008 10:44:04 +0000 Subject: [PATCH] Entropy/Spritz: - get rid of the applet from here, splitting... git-svn-id: http://svn.sabayonlinux.org/projects/entropy/trunk@2255 cd1c1023-2f26-0410-ae45-c471fc1f0318 --- spritz/Makefile | 11 +- spritz/gfx/applet/applet-about.png | Bin 1290 -> 0 bytes spritz/gfx/applet/applet-busy.png | Bin 1398 -> 0 bytes spritz/gfx/applet/applet-configuration.png | Bin 1143 -> 0 bytes spritz/gfx/applet/applet-critical-blank.png | Bin 1352 -> 0 bytes spritz/gfx/applet/applet-critical.png | Bin 1411 -> 0 bytes spritz/gfx/applet/applet-disconnect.png | Bin 1357 -> 0 bytes spritz/gfx/applet/applet-druid-watermark.png | Bin 22966 -> 0 bytes spritz/gfx/applet/applet-error.png | Bin 1435 -> 0 bytes spritz/gfx/applet/applet-okay.png | Bin 1590 -> 0 bytes spritz/gfx/applet/applet-web.png | Bin 1388 -> 0 bytes spritz/gfx/applet/spritz.png | Bin 916 -> 0 bytes spritz/misc/etp-applet-gui | 2 - spritz/misc/etp-applet.desktop | 9 - spritz/src/Makefile | 1 - spritz/src/applet/Makefile | 18 - spritz/src/applet/applet.py | 41 - spritz/src/applet/etp_applet.glade | 131 --- spritz/src/applet/etp_applet.py | 923 ------------------- spritz/src/applet/etp_applet_animation.py | 111 --- spritz/src/applet/etp_applet_config.py | 65 -- spritz/src/applet/etp_applet_dialogs.py | 416 --------- 22 files changed, 2 insertions(+), 1726 deletions(-) delete mode 100644 spritz/gfx/applet/applet-about.png delete mode 100644 spritz/gfx/applet/applet-busy.png delete mode 100644 spritz/gfx/applet/applet-configuration.png delete mode 100644 spritz/gfx/applet/applet-critical-blank.png delete mode 100644 spritz/gfx/applet/applet-critical.png delete mode 100644 spritz/gfx/applet/applet-disconnect.png delete mode 100644 spritz/gfx/applet/applet-druid-watermark.png delete mode 100644 spritz/gfx/applet/applet-error.png delete mode 100644 spritz/gfx/applet/applet-okay.png delete mode 100644 spritz/gfx/applet/applet-web.png delete mode 100644 spritz/gfx/applet/spritz.png delete mode 100644 spritz/misc/etp-applet-gui delete mode 100644 spritz/misc/etp-applet.desktop delete mode 100644 spritz/src/applet/Makefile delete mode 100755 spritz/src/applet/applet.py delete mode 100644 spritz/src/applet/etp_applet.glade delete mode 100644 spritz/src/applet/etp_applet.py delete mode 100644 spritz/src/applet/etp_applet_animation.py delete mode 100644 spritz/src/applet/etp_applet_config.py delete mode 100644 spritz/src/applet/etp_applet_dialogs.py diff --git a/spritz/Makefile b/spritz/Makefile index bd9b843d1..7bb2a2524 100644 --- a/spritz/Makefile +++ b/spritz/Makefile @@ -1,4 +1,4 @@ -SUBDIRS = src src/etpgui src/applet +SUBDIRS = src src/etpgui PYFILES = $(wildcard *.py) PKGNAME = spritz VERSION=$(shell awk '/Version:/ { print $$2 }' ${PKGNAME}.spec) @@ -6,7 +6,7 @@ PYTHON=python SRCDIR=src MISCDIR=misc PIXDIR=gfx -ALLDIRS=src src/etpgui gfx misc tools src/applet +ALLDIRS=src src/etpgui gfx misc tools all: subdirs @@ -20,7 +20,6 @@ clean: install: mkdir -p $(DESTDIR)/usr/lib/entropy/spritz mkdir -p $(DESTDIR)/usr/share/pixmaps/spritz/packages - mkdir -p $(DESTDIR)/usr/share/pixmaps/spritz/applet mkdir -p $(DESTDIR)/usr/share/applications mkdir -p $(DESTDIR)/usr/share/mimelnk/application mkdir -p $(DESTDIR)/usr/share/mime/packages @@ -31,19 +30,13 @@ install: mkdir -p $(DESTDIR)/etc/pam.d install -m644 COPYING $(DESTDIR)/usr/lib/entropy/spritz/. install -m755 $(MISCDIR)/spritz $(DESTDIR)/usr/bin/. - install -m755 $(MISCDIR)/etp-applet-gui $(DESTDIR)/usr/bin/. install -m644 $(PIXDIR)/*.png $(DESTDIR)/usr/share/pixmaps/spritz/. install -m644 $(PIXDIR)/packages/*.png $(DESTDIR)/usr/share/pixmaps/spritz/packages/. - install -m644 $(PIXDIR)/applet/*.png $(DESTDIR)/usr/share/pixmaps/spritz/applet/. - install -m644 $(PIXDIR)/entropy-applet.png $(DESTDIR)/usr/share/pixmaps/. install -m644 $(MISCDIR)/spritz.pam $(DESTDIR)/etc/pam.d/spritz install -m644 $(MISCDIR)/kde_x-spritz.desktop $(DESTDIR)/usr/share/mimelnk/application/. install -m644 $(MISCDIR)/entropy-mimetypes.xml $(DESTDIR)/usr/share/mime/packages/. chmod +x $(DESTDIR)/usr/bin/spritz - chmod +x $(DESTDIR)/usr/bin/etp-applet-gui install -m644 $(MISCDIR)/*.desktop $(DESTDIR)/usr/share/applications/. - install -m644 $(MISCDIR)/etp-applet.desktop $(DESTDIR)/usr/share/autostart/. - install -m644 $(MISCDIR)/etp-applet.desktop $(DESTDIR)/etc/xdg/autostart/. for d in $(SUBDIRS); do make DESTDIR=`cd $(DESTDIR); pwd` -C $$d install; [ $$? = 0 ] || exit 1; done diff --git a/spritz/gfx/applet/applet-about.png b/spritz/gfx/applet/applet-about.png deleted file mode 100644 index a9d71e7dcca9f80fefdfd85552a1712a62ea8eb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1290 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 Rt?d8+002ovPDHLkV1kiIpc?=H diff --git a/spritz/gfx/applet/applet-disconnect.png b/spritz/gfx/applet/applet-disconnect.png deleted file mode 100644 index 4e9b201c4e22db625d645e72d5c88c1158baa740..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1357 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%0DIhhC0$^Dx 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 diff --git a/spritz/gfx/applet/applet-error.png b/spritz/gfx/applet/applet-error.png deleted file mode 100644 index 0dc2c345f231877594418cc79ab9843aa73dc8f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1435 zcmV;M1!Ve(P){G zK~#90ZI$0^6zdtsKkv-W?(D2TvdLl+H$h{fX_Uk1WkL^}Lm^5zNN*bO+& ze4g(---q`V^rHZ1!0l(@ID^2~z(T21`fPA;&@GipB27~jhT%&o<)4KRf6-d+@re)s zhk^LNxfle&m8q$z@8;*{k4{WX6l=9w!5D+JR%os5&d!eB*w~Pd9zBXSH#h&(?RI|$ zWFLV8pbPZ#ao_iEFD@>AK07;GPSaH6c`lSvc%Fyrx>#!g&{|`yHBX*AkxNTU|BzBH z0NWoa9w`?2ca|L=8X8)@di833WMsrUbm)+H_Usw;dYze>8OF!Q0eJuZJuhFrWP5v? zfq?;}ly-A-Q(eD)eJhHhFMuroHvmGdi@xvQyLRo`&&I~aiYHE-5Weptgy7=Ei_~g0 zJkP`PJZiNXGcz+7V|e@aEu~UPl*?sze0;p}^y$-ID5aJF?fiafiXaHCEG{m7Ua!}S zlarGiJ9Z3fEsaLwQ@#K&J39+Nnx?p}OT9kkoj-s6=Rpu$0dW5oMV0C4>F+OJzFa+h z`m`7w9VN>$!Z0KZLsnN;xqtsY4<0n= z&#}OnGiOTGYW15!wOakGR;#(g!^2o>X*QdLVMvlBD5Xf#lxDNZrAwEn)oK8AyItJ~0M_%X%lzbF?-9x{#*n^R2C| zv3k8;kWzk9@!h+35keq@KuSreU`Cpyd2EmRZs)L#7#0rv3l1ym;{<4a4x3<2cS=mzS4! zl~P7Zc`$-3%aBr1sZ^Mon*$&S0>1j{OOizP8)qa^l4dzrLpzG>zZ#7wNs`;nZ;jb& zG#WP^K71%!trlsTqP0eAL*94#f5Tcsmgl5tN|H#dH6Y;m^XIbJY<{n`?zk&JH_!k6 z=FOX5ojiGRq*N-oLI{-BXswCk7_4PtVuEhB%e{N|*o`9gk_4GZu;985ow%*m*Vmu5 z+wE_SFQq^smhb2q5mH>FrmqUVY&>&QP^lEeL_Ifa4bM{W7lWlI1x@YYL7a z?zHXt+FG){w)QlRxU1C7?d|R2yLa!Vk|c41O5hY+*HJo0ubsC>gtb;M&l209Df_far37>i2aWOQ0X_Q03Fw@l*{FXYPI@Ju~?j@_s#;C pEX)2GhT*LwNp5ScJO6Jl{0F$MDIN34yk-CZ002ovPDHLkV1k=j!(spc diff --git a/spritz/gfx/applet/applet-okay.png b/spritz/gfx/applet/applet-okay.png deleted file mode 100644 index a7e23d4b2c4a01cebf6becbaf464529c0c56ce66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1590 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 diff --git a/spritz/gfx/applet/spritz.png b/spritz/gfx/applet/spritz.png deleted file mode 100644 index a497b071752237aea30fc159a9f361a391c77c0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 916 zcmV;F18e+=P)fN-_muP` zP0o4WT{MYFlV~RRzys&JAOG`v|L^l0p_Jl%gjQ@q2oVB8@1WVElgt*{rBp}B#DDfrVOln(WwULWPD{{DTT2B`Ud70@XeQn$ob91$ z*)-Nw0N^eYgbg=09z`)NyP!2C5-Uv0VbRi;Skq2w-Tx+jO=4OO=We~E(p|>x^-TnQ9!$$AN}N*_KU{nEMc+v5 z$gr6(01SUTU!SC_l_y*rxs>E#P_zWuBzbux+1SKFqP>d08}^`*btyCc@7 zZL0z-oa;p@_@_V0_dh@5qi{9feI6>uoEh`N?nv1T!=;L4R4-CemWBz8NX2pw$Nn^mzuYZiP zw)KO|WxlNgHGp9=VT25wq%FC2e_+sVe!BVku3hW)o_KI)=f=fUc|H7eyPp#`UJ*}7 zVyTQLB(Y@Hb3*1fZ_KXz4_bFSwpvJ4tN7=mNo{Y zoR3tBNz0+LYmEJ$&dbo`dz^EkkAdDy9q&8ys53G?y=KF*dK&90kP7-oVmx>sQ& - - - - - True - Package Manager Notification Window - GTK_WIN_POS_CENTER - 600 - 300 - GDK_WINDOW_TYPE_HINT_DIALOG - - - True - 8 - - - True - True - True - - - True - - - True - False - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - - - True - True - True - - - - - - - - - True - Available Updates - GTK_JUSTIFY_CENTER - - - tab - False - - - - - 2 - - - - - - - - True - GTK_BUTTONBOX_END - - - True - True - True - True - 0 - - - - True - 0 - 0 - - - True - 2 - - - True - gtk-apply - - - False - False - - - - - True - _Load Package Manager - True - - - False - False - 1 - - - - - - - - - - - True - True - gtk-close - True - 0 - - - - 1 - - - - - False - GTK_PACK_END - - - - - - diff --git a/spritz/src/applet/etp_applet.py b/spritz/src/applet/etp_applet.py deleted file mode 100644 index 0aa755cb5..000000000 --- a/spritz/src/applet/etp_applet.py +++ /dev/null @@ -1,923 +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.py,v 1.114 2003/11/09 16:56:33 veillard Exp $ - -import gnome -import gnome.ui -# from msw to avoid odd bugs in some pygtk builds -try: - from gtk import _disable_gdk_threading - _disable_gdk_threading() -except ImportError: - pass -import gtk -import gobject -import gtk.gdk -import egg.trayicon -import pynotify - -import subprocess -import os -import sys -import math -import traceback -import time -import threading - -import etp_applet_animation -from etp_applet_dialogs import \ - rhnAppletNoticeWindow, \ - rhnRegistrationPromptDialog, \ - rhnAppletAboutWindow, \ - rhnAppletFirstTimeDruid, \ - rhnAppletErrorDialog, \ - rhnAppletExceptionDialog -import etp_applet_config -from etpgui import busyCursor,normalCursor,ProcessGtkEventsThread - -# Entropy imports -from entropyConstants import * -import exceptionTools, entropyTools -from entropy import EquoInterface, RepoInterface, urlFetcher -from entropy_i18n import _ - -class Entropy(EquoInterface): - - def __init__(self): - EquoInterface.__init__(self, noclientdb = True) - self.nocolor() - - def connect_progress_objects(self, appletInterface): - self.appletInterface = appletInterface - self.progress_tooltip = self.appletInterface.update_tooltip - self.progress_widget = self.appletInterface.tooltip - self.updateProgress = self.appletUpdateProgress - self.progress_tooltip_message_title = _("Updates Notification") - self.appletCreateNotification() - #self.progress_tooltip_notification_timer = None - #gobject.timeout_add(1000, self.appletCreateNotification) - self.urlFetcher = GuiUrlFetcher - self.progress = self.appletPrintText # for the GuiUrlFetcher - self.applet_last_message = '' - - - def appletSetCoordinates(self): - self.appletX,self.appletY = self.appletInterface.get_tray_coordinates() - self.progress_tooltip_notification.set_hint("x", self.appletX+11) - self.progress_tooltip_notification.set_hint("y", self.appletY+11) - - def appletCreateNotification(self): - pynotify.init("XY") - self.progress_tooltip_notification = pynotify.Notification(self.progress_tooltip_message_title,"Hello world") - self.progress_tooltip_notification.set_timeout(3000) - self.appletSetCoordinates() - - def appletUpdateProgress(self, text, header = "", footer = "", back = False, importance = 0, type = "info", count = [], percent = False): - - count_str = "" - if count: - if percent: - count_str = str(int(round((float(count[0])/count[1])*100,1)))+"% " - else: - count_str = "(%s/%s) " % (str(count[0]),str(count[1]),) - - message = count_str+_(text) - #if importance in (1,2): - if importance == 2: - self.progress_tooltip_message_title = message - self.appletPrintText(self.applet_last_message) - else: - self.appletPrintText(message) - - def appletPrintText(self, message): - self.appletSetCoordinates() - self.progress_tooltip_notification.update(self.progress_tooltip_message_title,message) - self.progress_tooltip_notification.show() - self.applet_last_message = message - -class GuiUrlFetcher(urlFetcher): - - def connect_to_gui(self, progress): - self.progress = progress - - 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(self.entropyTools.bytesIntoHuman(self.datatransfer))+"/sec", - ) - self.progress(message) - -class rhnApplet: - - def set_state(self, new_state, use_busy_icon = 0): - if not new_state in etp_applet_config.APPLET_STATES: - raise exceptionTools.IncorrectParameter("Error: invalid state %s" % new_state) - - if self.refresh_timeout_tag and new_state not in [ "OKAY", "CRITICAL" ]: - raise exceptionTools.IncorrectParameter("Error: can't switch to state %s while refresh timer is on" % new_state) - - if new_state == "OKAY": - self.animate_to("okay") - elif new_state == "BUSY": - if use_busy_icon: - self.set_displayed_image("busy") - elif new_state == "CRITICAL": - if self.never_viewed_notices: - self.animate_to("critical", "critical-blank") - else: - self.set_displayed_image("critical") - elif new_state == "NOCONSENT": - if self.never_viewed_consent: - self.animate_to("noconsent", "noconsent-blank") - else: - self.set_displayed_image("noconsent") - elif new_state == "DISCONNECTED": - self.animate_to("disconnect") - elif new_state == "ERROR": - self.animate_to("error") - - self.current_state = new_state - - - def __init__(self): - - # this must be done before !! - self.destroyed = 0 - self.isWorking = False - self.tooltip_text = "" - gnome.program_init("spritz-updater", etpConst['entropyversion']) - self.tooltip = gtk.Tooltips() - self.applet_window = egg.trayicon.TrayIcon("spritz-updater") - self.applet_window.connect("destroy", self.exit_applet) - - # - # Cope with a change in the Gnome python bindings naming - # - try: - self.session = gnome.ui.gnome_master_client() - except: - self.session = gnome.ui.master_client() - if self.session: - 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.animate_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.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("critical-blank", "applet-critical-blank.png") - self.icons.add_file("noconsent", "applet-critical.png") - self.icons.add_file("noconsent-blank", "applet-critical-blank.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") - self.icons.add_file("configuration","applet-configuration.png") - 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), - None, - ("about", _("_About"), _("About..."), self.about), - ("exit", _("_Exit"), _("Exit"), self.exit_applet), - ) - - self.menu = gtk.Menu() - self.menu_items = {} - for i in menu_items: - if i is None: - self.menu.add(gtk.SeparatorMenuItem()) - else: - sid = None - myid = i[0] - if myid == "exit": - sid = "gtk-quit" - if sid: - w = gtk.ImageMenuItem(stock_id = sid) - else: - w = gtk.ImageMenuItem(i[1]) - self.set_menu_image(w, myid) - self.menu_items[myid] = w - w.connect('activate', i[3]) - w.show() - self.menu.add(w) - - self.menu.show_all() - - self.event_box = gtk.EventBox() - self.image_widget = gtk.Image() - self.event_box.add(self.image_widget) - self.event_box.set_events(gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.POINTER_MOTION_HINT_MASK | gtk.gdk.CONFIGURE) - - self.image_widget.show() - self.event_box.connect("button_press_event", self.applet_face_click) - self.image_widget.connect('destroy', self.on_destroy) - - self.applet_window.add(self.event_box) - self.applet_window.show_all() - - 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.last_alert = None - - self.gtkEventThread = ProcessGtkEventsThread() - self.gtkEventThread.start() - - 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 - - permitted = entropyTools.is_user_in_entropy_group() - 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: - # first refresh should be 2 minutes after execution; this - # should give the rest of the user's desktop environment time - # to load, etc, and avoid competing with nautilus or whatever - # else is loading. subsequent intervals will be much larger. - self.set_state("OKAY") - self.enable_refresh_timer(50000) - - # Entropy initialization - self.Entropy = Entropy() - self.Entropy.connect_progress_objects(self) - - if etp_applet_config.settings['APPLET_ENABLED']: - self.enable_applet() - else: - self.disable_applet() - - 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() - - def get_tray_coordinates(self): - """ - get the trayicon coordinates to send to - notification-daemon - trayicon=egg.trayicon.TrayIcon - return : [x,y] - """ - trayicon = self.applet_window - coordinates = trayicon.window.get_origin() - size = trayicon.window.get_size() - screen = trayicon.window.get_screen() - screen_height = screen.get_height() - if coordinates[1] <= screen_height/2: - y=coordinates[1]+size[1]/2 - else: - y=coordinates[1]-size[1]/2 - msg_xy=[coordinates[0],y] - return tuple(msg_xy) - - def set_menu_image(self, widget, name): - img = gtk.Image() - if name == "update_now": - pix = self.icons.best_match("spritz",22) - elif name == "about": - pix = self.icons.best_match("about",22) - elif name in ["web_panel","web_site"]: - pix = self.icons.best_match("web",22) - elif name == "configure_applet": - pix = self.icons.best_match("configuration",22) - elif name == "disable_applet": - pix = self.icons.best_match("disconnect",22) - elif name == "enable_applet": - pix = self.icons.best_match("okay",22) - else: - pix = self.icons.best_match("busy",22) - - img.set_from_pixbuf(pix) - widget.set_image(img) - - def enable_refresh_timer(self, when = etp_applet_config.settings['REFRESH_INTERVAL'] * 1000, force = 0): - #if self.current_state not in [ "OKAY", "CRITICAL" ]: - # return - if not self.refresh_timeout_tag: - self.refresh_timeout_tag = gobject.timeout_add(when, self.refresh_handler, force) - - def disable_refresh_timer(self): - if self.refresh_timeout_tag: - gobject.source_remove(self.refresh_timeout_tag) - self.refresh_timeout_tag = None - - def handle_gtk_events(self): - while gtk.events_pending(): - gtk.main_iteration(False) - - def refresh_callback(self): - self.handle_gtk_events() - - def start_working(self): - self.isWorking = True - busyCursor(self.applet_window) - self.gtkEventThread.startProcessing() - - def end_working(self): - self.isWorking = False - normalCursor(self.applet_window) - self.gtkEventThread.endProcessing() - - def on_do_draw(self, *data): - self.redraw() - - def on_bg_change(self, *data): - self.redraw() - - def on_size_allocate(self, *data): - self.redraw() - - def on_configure(self, widget, event): - if event.type == gtk.gdk.CONFIGURE: - self.redraw() - - def animate_stop(self): - self.disable_animation_timer() - - # not animating? then our current image is correct - if self.animator: - self.set_displayed_image(self.animator.final_frame) - self.animator = None - - self.redraw() - - def disable_animation_timer(self): - if self.animate_timeout_tag: - gobject.source_remove(self.animate_timeout_tag) - self.animate_timeout_tag = None - - def animate_handler(self, *data): - next_frame = self.animator.next_frame() - if not next_frame: - self.disable_animation_timer() - return False - - self.current_image = next_frame - self.redraw() - - return True - - def animate_to(self, image, cycle_image = None): - - # logic: one way animation? then we skip this if we're asked - # to animate to the same, and let it finish. if it's a cycle, - # and the start and end images are the same, then we also just - # continue - - if self.current_image == image: - if cycle_image: - if self.animation_cycle == cycle_image: - return - else: - return - - if self.current_image: - from_image = self.current_image.copy() - else: - from_image = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, 1, 8, self.applet_size, self.applet_size) - from_image.fill(0) - - to_image = self.icons.best_match(image, self.applet_size) - - frames = etp_applet_animation.alpha_tween(from_image, to_image, 16) - - self.animator = etp_applet_animation.rhnAppletAnimation() - - # if we're already in the to_image state, let's just start cycling - if self.current_image != to_image or cycle_image: - self.animator.append_frames(frames) - - if cycle_image: - cycle_frames = [] - - to_image = self.icons.best_match(image, self.applet_size) - from_image = self.icons.best_match(cycle_image, self.applet_size) - cycle_frames = etp_applet_animation.alpha_tween(to_image, from_image, 16) - - self.animator.append_cycle(cycle_frames) - - if not self.animate_timeout_tag: - self.animate_timeout_tag = gobject.timeout_add(int(math.floor(1000 * etp_applet_config.settings['ANIMATION_TOTAL_TIME']/len(frames))), self.animate_handler) - - self.animate_handler() - - def set_displayed_image(self, image): - if type(image) == type(""): - new_image = self.icons.best_match(image, self.applet_size) - else: - new_image = image - - self.disable_animation_timer() - - self.current_image = new_image - self.redraw() - - def redraw(self): - if not self.current_image: - return - - self.image_widget.set_from_pixbuf(self.current_image) - - def on_destroy(self, *data): - self.destroyed = 1 - self.disable_refresh_timer() - self.disable_animation_timer() - - def load_packages_url(self, *data): - try: - gnome.url_show("http://packages.sabayonlinux.org/") - except gobject.GError: - self.load_browser("http://packages.sabayonlinux.org/") - - def load_website(self, *data): - try: - gnome.url_show("http://www.sabayonlinux.org/") - except gobject.GError: - self.load_browser("http://www.sabayonlinux.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 disable_applet(self, *data): - self.update_tooltip(_("Updates Notification Applet Disabled")) - self.disable_refresh_timer() - self.set_state("DISCONNECTED") - 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, *data): - self.update_tooltip(_("Updates Notification Applet Enabled")) - 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() - - - def launch_package_manager(self, *data): - pid = os.fork() - if not pid: - pid2 = os.fork() - if not pid2: - os.execv('/usr/bin/spritz', ['spritz']) - os.perror(_("Cannot load Spritz")) - else: - os._exit(-1) - - 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': - n.set_urgency(pynotify.URGENCY_CRITICAL) - elif urgency == 'low': - n.set_urgency(pynotify.URGENCY_LOW) - - x,y = self.get_tray_coordinates() - n.set_hint("x", x+11) - n.set_hint("y", y+11) - self.last_alert = (title,text) - n.show() - - def compare_repositories_status(self): - repos = {} - try: - repoConn = RepoInterface(self.Entropy, list(etpRepositories), noEquoCheck = True) - except exceptionTools.MissingParameter: - return repos,1 # no repositories specified - except exceptionTools.OnlineMirrorError: - return repos,2 # not connected ?? - except Exception, e: - return repos,str(e) # unknown error - # now get remote - for repoid in etpRepositories: - 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) - - return repos, 0 - - # every N seconds we poke the model to see if anything has - # changed. changes can be new package lists from the server, the - # rpmdb being updated, etc. the model caches aggressively, so - # this isn't expensive. this is done asynchronous to all GUI - # updates, to try to avoid stalling the UI - def refresh_handler(self, force = 0): - self.refresh(force) - - def refresh(self, force=0): - - if not etp_applet_config.settings['APPLET_ENABLED']: - return - - locked = self.Entropy.application_lock_check(silent = True) - - self.start_working() - old_tip = self.tooltip_text - old_state = self.current_state - - self.disable_refresh_timer() - self.disable_network_timer() - - self.set_state("BUSY", use_busy_icon = force) - self.update_tooltip(_("Checking for updates...")) - self.handle_gtk_events() - 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 - repositories_to_update, rc = self.compare_repositories_status() - if repositories_to_update and rc == 0: - repos = repositories_to_update.keys() - - try: - repoConn = self.Entropy.Repositories(repos, fetchSecurity = False, noEquoCheck = True) - except exceptionTools.MissingParameter: - self.last_error = "%s: %s" % (_("No repositories specified in"),etpConst['repositoriesconf'],) - self.error_threshold += 1 - except exceptionTools.OnlineMirrorError: - self.last_error = _("Repository Network Error") - self.last_error_is_network_error = 1 - except Exception, e: - self.error_threshold += 1 - self.last_error_is_exception = 1 - self.last_error = "%s: %s" % (_('Unhandled exception'),e,) - else: - # -128: sync error, something bad happened - # -2: repositories not available (all) - # -1: not able to update all the repositories - rc = repoConn.sync() - rc = rc*-1 - - 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 type(rc) is str: - 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.disable_refresh_timer() - self.enable_network_timer() - 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(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) - - # it is possible that the applet was destroyed during the time it - # took to update the model. If the applet is gone, bail now. - if self.destroyed: - self.end_working() - return False - - 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.disable_refresh_timer() - self.enable_refresh_timer() - self.end_working() - return True - - # - # Detection and handling of network related errors, the - # server may be unreachable, or refusing connections, quite - # common in case of laptops. If such an error is detected - # the applet will try to retry the connections after a timeout - # of etp_applet_config.settings['NETWORK_RETRY_INTERVAL'] seconds (one minute) - # until it suceeeds reaching the server and then exit the - # DISCONNECTED state - # - def is_network_error(self, msg): - # print "is_network_error: '%s'" % (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": - raise "Can't enable network timer unless in DISCONNECTED state" - if not self.network_timeout_tag: - self.network_timeout_tag = gobject.timeout_add(when, self.network_retry_handler, force) - - def disable_network_timer(self): - if self.network_timeout_tag: - gobject.source_remove(self.network_timeout_tag) - self.network_timeout_tag = None - - def update_tooltip(self, tip): - self.tooltip_text = tip - self.tooltip.set_tip(self.applet_window, 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 - #ignored_package_str = "|".join(self.model.ignored_package_list()) - - def help (self, args): - gnome.help.goto ("file:///usr/share/doc/rhn-applet-@VERSION@/index.html") - - - def exit_applet(self, *args): - self.gtkEventThread.doQuit() - gtk.main_quit() - sys.exit(0) - - def save_yourself(self, *args): - 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) - - def about_dialog_closed(self): - self.about_window = None - - def rhnreg_dialog_closed(self): - self.rhnreg_dialog = 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, window, event, *data): - if event.button == 3: - self.menu.popup(None, None, None, 0, event.time) - return - - if self.current_state in [ "CRITICAL", "NOCONSENT" ]: - self.animate_stop() - - if not self.current_state in [ "OKAY", "ERROR", "DISCONNECTED", "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) - return - - # clicked the face while it was loaded, and not while telling - # them to register? well, let's close it - - self.never_viewed_notices = 0 - if self.notice_window and not self.rhnreg_dialog: - self.notice_window.close_window() - return - - if not self.notice_window: - self.notice_window = rhnAppletNoticeWindow(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: - return - - names = {} - entropy_data = {} - for pkg in self.available_packages: - dbconn = self.Entropy.openRepositoryDatabase(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) - - 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) - - names[atom] = {} - names[atom]['installed'] = installed+"~"+str(installed_rev) - names[atom]['avail'] = avail+"~"+str(avail_rev) - - - ordered_names = names.keys() - ordered_names.sort() - for name in ordered_names: - self.notice_window.add_package( name, - names[name]['installed'], - names[name]['avail'] - ) - - 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") - ) - critical_text.append(msg) - - if critical_text: - if self.old_critical_text != critical_text: - self.notice_window.set_critical('

'.join(critical_text), critical_active = 1) - else: - self.notice_window.set_critical('

'.join(critical_text), critical_active = 0) - self.old_critical_text = critical_text - else: - self.notice_window.remove_critical() - - - def set_ignored(self, name, new_value): - self.never_viewed_notices = 0 - - ''' - if self.model.is_package_ignored(name) and not new_value: - self.model.remove_ignored_package(name) - - if not self.model.is_package_ignored(name) and new_value: - self.model.add_ignored_package(name) - - needed_packages, ignored_needed_packages = self.model.needed_packages() - self.system_needs_packages(needed_packages, ignored_needed_packages) - ''' - - def run(self): - gtk.main() diff --git a/spritz/src/applet/etp_applet_animation.py b/spritz/src/applet/etp_applet_animation.py deleted file mode 100644 index 980845ac2..000000000 --- a/spritz/src/applet/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() #start_image.scale_simple(end_image.get_width(), end_image.get_height(), gtk.gdk.INTERP_BILINEAR) - - 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/spritz/src/applet/etp_applet_config.py b/spritz/src/applet/etp_applet_config.py deleted file mode 100644 index 439c5f525..000000000 --- a/spritz/src/applet/etp_applet_config.py +++ /dev/null @@ -1,65 +0,0 @@ -# This file is a portion of the Red Hat Network Panel Applet -# -# Copyright (C) 2008 Sabayon Linux -# Distributed under GPL version 2. -# -# $Id: applet.py,v 1.10 2003/09/15 15:07:19 veillard Exp $ - -import os -import dumpTools - -APPLET_STATES = [ "STARTUP", "NOCONSENT", "CONFIGURING", "OKAY", "CRITICAL", "BUSY", "ERROR", "DISCONNECTED" ] -APPLET_MENUS = [ "about", "update_now", "web_panel", "web_site", "configure_applet", "check_now" ] - -APPLET_SENSITIVE_MENU = { - "STARTUP" : [ "" ], - "NOCONSENT" : [ "about", "configure_applet", "update_now", "busy" ], - "CONFIGURING" : [ "about", "update_now" ], - "OKAY" : APPLET_MENUS, - "CRITICAL" : APPLET_MENUS, - "BUSY" : [ ], - "ERROR" : [ "about", "update_now", "check_now" ], - "DISCONNECTED": [ "about", "update_now", "check_now" ], -} - -REFRESH_INTERVAL = 60 # seconds -NETWORK_RETRY_INTERVAL = 180 -ERROR_THRESHOLD = 3 -APPLET_ENABLED = 1 - -ANIMATION_TOTAL_TIME = 0.75 - -home = os.getenv("HOME") -if not home: - home = "/tmp" -SETTINGS_FILE = os.path.join(home, ".config/entropy/settings") - -def save_settings(settings): - global SETTINGS_FILE - try: - if not os.path.isdir(os.path.dirname(SETTINGS_FILE)): - os.makedirs(os.path.dirname(SETTINGS_FILE)) - dumpTools.dumpobj(SETTINGS_FILE, settings, completePath = True) - except: - pass - -settings = dumpTools.loadobj(SETTINGS_FILE, completePath = True) -if settings == None: - settings = {} - -myconst = [ - ['REFRESH_INTERVAL',int], - ['NETWORK_RETRY_INTERVAL',int], - ['ERROR_THRESHOLD',int], - ['ANIMATION_TOTAL_TIME',float], - ['APPLET_ENABLED',int], - ] - -for x in myconst: - if not settings.has_key(x[0]): - settings[x[0]] = eval(x[0]) - else: - if not isinstance(settings[x[0]],x[1]): - settings[x[0]] = eval(x[0]) - -save_settings(settings) diff --git a/spritz/src/applet/etp_applet_dialogs.py b/spritz/src/applet/etp_applet_dialogs.py deleted file mode 100644 index 3edb81694..000000000 --- a/spritz/src/applet/etp_applet_dialogs.py +++ /dev/null @@ -1,416 +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 -# -# $Id: rhn_applet_dialogs.py,v 1.30 2003/10/14 17:41:34 veillard Exp $ - -from entropyConstants import * -from entropy_i18n import _ -import gnome -import gnome.ui -import gobject -import gtk.glade -gtk.glade.bindtextdomain('entropy', "/usr/share/locale") -import gtk -import gtkhtml2 - -class rhnGladeWindow: - def __init__(self, filename, window_name): - self.filename = filename - if not os.path.isfile(filename): - self.filename = "/usr/lib/entropy/spritz/applet/%s" % (filename,) - self.xml = gtk.glade.XML(self.filename, window_name, domain="entropy") - self.window = self.xml.get_widget(window_name) - - def get_widget(self, widget): - return self.xml.get_widget(widget) - -class rhnAppletNoticeWindow(rhnGladeWindow): - def __init__(self, parent): - rhnGladeWindow.__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.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.set_model(self.package_list_model) - - self.xml.signal_autoconnect ( - { - "on_launch_spritz_clicked" : self.on_spritz, - "on_ignore_clicked" : self.on_ignore_clicked, - "on_unignore_clicked" : self.on_unignore_clicked, - "on_close_clicked" : self.on_close, - }) - - def on_spritz(self, button): - self.parent.launch_package_manager() - - def on_close(self, close_button): - self.close_window() - - def close_window(self, *rest): - self.window.destroy() - self.parent.notice_window_closed() - - def clear_window(self): - self.package_list_model.clear() - - def on_link_clicked(self, html, url): - 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 - self.html_doc = gtkhtml2.Document() - - sw = gtk.ScrolledWindow() - sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - sw.set_border_width(2) - sw.add(html_view) - - tab_label = gtk.Label(_("Critical Information")) - tab_label.show() - - html_view.show() - sw.show() - - self.critical_tab = self.notebook.prepend_page(sw, tab_label) - self.critical_tab_contents = sw - - if critical_active: - 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: - self.set_critical_tab_text(text) - - def set_critical_tab_text(self, text): - self.critical_tab_text = text - - 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.close_stream() - self.html_view.set_document(self.html_doc) - - def remove_critical(self): - if not self.critical_tab_contents: - return - - self.notebook.remove_page(self.notebook.page_num(self.critical_tab_contents)) - - def on_ignore_clicked(self, *data): - selection = self.available_list.get_selection() - (model, iter) = selection.get_selected() - if not iter: - return - - name = model.get_value(iter, 0) - self.parent.set_ignored(name, 1) - - def on_unignore_clicked(self, *data): - selection = self.ignore_list.get_selection() - (model, iter) = selection.get_selected() - if not iter: - return - - name = model.get_value(iter, 0) - self.parent.set_ignored(name, 0) - - def add_package(self, name, installed, avail): - iter = self.package_list_model.append() - self.package_list_model.set_value(iter, 0, name) - self.package_list_model.set_value(iter, 1, installed) - self.package_list_model.set_value(iter, 2, 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: - def __init__(self, parent): - self.window = gnome.ui.About("%s Updates Applet" % (etpConst['systemname'],), - etpConst['entropyversion'], "Copyright (C) 2008, Sabayon Linux", - "Sabayon Linux. What else?", - [ "Sabayon Linux Team", "devel@sabayonlinux.org" ]) - self.window.connect("destroy", self.on_close) - self.parent = parent - self.window.show() - - def close_dialog(self, *rest): - self.parent.about_dialog_closed() - - 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): - def __init__(self, parent, error): - 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) - self.parent = parent - self.window.show() - - def close_dialog(self, *rest): - self.parent.error_dialog_closed() - self.window.destroy() - - def on_close(self, *data): - self.close_dialog() - -# stolen from anaconda -def growToParent(*args): - return - -def addFrame(dialog, title=None): - contents = dialog.get_children()[0] - dialog.remove(contents) - frame = gtk.Frame() - frame.set_shadow_type(gtk.SHADOW_OUT) - box = gtk.VBox() - try: - if title is None: - title = dialog.get_title() - - if title: - data = {} - data["state"] = 0 - data["button"] = 0 - data["deltax"] = 0 - data["deltay"] = 0 - data["window"] = dialog - eventBox = gtk.EventBox() - eventBox.connect("button-press-event", titleBarMousePressCB, data) - eventBox.connect("button-release-event", titleBarMouseReleaseCB, data) - eventBox.connect("motion-notify-event", titleBarMotionEventCB,data) - titleBox = gtk.HBox(gtk.FALSE, 5) - eventBox.add(titleBox) - eventBox.modify_bg(gtk.STATE_NORMAL, - eventBox.rc_get_style().bg[gtk.STATE_SELECTED]) - titlelbl = gtk.Label("") - titlelbl.set_markup(""+_(title)+"") - titlelbl.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse ("white")) - titlelbl.set_property("ypad", 4) - titleBox.pack_start(titlelbl) - box.pack_start(eventBox, gtk.FALSE, gtk.FALSE) - except: - pass - - frame2=gtk.Frame() - frame2.set_shadow_type(gtk.SHADOW_NONE) - frame2.set_border_width(4) - frame2.add(contents) - box.pack_start(frame2, gtk.TRUE, gtk.TRUE, padding=5) - frame.add(box) - frame.show() - dialog.add(frame) - -class WrappingLabel(gtk.Label): - def __init__(self, label=""): - gtk.Label.__init__(self, label) - self.set_line_wrap(gtk.TRUE) - self.ignoreEvents = 0 - self.connect("size-allocate", growToParent) - -class rhnAppletExceptionDialog: - def __init__ (self, parent, text): - self.parent = parent - win = gtk.Dialog("Exception Occured", None) - self.window = win - win.add_button('gtk-ok', 0) - - buffer = gtk.TextBuffer(None) - buffer.set_text(text) - textbox = gtk.TextView() - textbox.set_buffer(buffer) - textbox.set_property("editable", gtk.FALSE) - textbox.set_property("cursor_visible", gtk.FALSE) - sw = gtk.ScrolledWindow () - sw.add (textbox) - sw.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - - hbox = gtk.HBox (gtk.FALSE) -## file = pixmap_file('gnome-warning.png') -## if file: -## hbox.pack_start (GnomePixmap (file), gtk.FALSE) - - info = WrappingLabel(_("An unhandled exception has occured. This " - "is most likely a bug. Please copy the " - "full text of this exception into an email " - "and send it to sabayon@sabayonlinux.org. Thank you.")) - info.set_size_request (400, -1) - - hbox.pack_start (sw, gtk.TRUE) - win.vbox.pack_start (info, gtk.FALSE) - win.vbox.pack_start (hbox, gtk.TRUE) - win.set_size_request (500, 300) - win.set_position (gtk.WIN_POS_CENTER) - addFrame(win) - win.show_all() - win.connect('close', self.on_close) - win.connect('response', self.on_close) - - def close_dialog(self, *rest): - self.parent.error_dialog_closed() - self.window.destroy() - - def on_close(self, *data): - self.close_dialog()