--- hplip-3.10.2~rc1-pristine/ui4/systemtray.py 2010-02-11 19:05:01.000000000 -0800 +++ hplip-3.10.2~rc1/ui4/systemtray.py 2010-03-25 04:55:37.720826900 -0700 @@ -39,6 +39,7 @@ try: from PyQt4.QtCore import * from PyQt4.QtGui import * + from PyQt4.QtGui import QMenu as MyMenu except ImportError: log.error("Python bindings for Qt4 not found. Try using --qt3. Exiting!") sys.exit(1) @@ -68,6 +69,14 @@ except ImportError: have_pynotify = False +# kde4 status notifier (optional) +have_statusnotifier = True +try: + from PyKDE4.kdeui import KStatusNotifierItem + from PyKDE4.kdeui import KMenu as MyMenu +except ImportError: + have_statusnotifier = False + TRAY_MESSAGE_DELAY = 10000 HIDE_INACTIVE_DELAY = 5000 @@ -112,9 +121,9 @@ devices = {} # { : HistoryDevice(), ... } -class DeviceMenu(QMenu): +class DeviceMenu(MyMenu): def __init__(self, title, parent, device_uri, device_hist, index): - QMenu.__init__(self, title, parent) + MyMenu.__init__(self, title, parent) self.device_uri = device_uri self.device_hist = device_hist self.index = index @@ -290,7 +299,10 @@ self.user_settings.load() self.user_settings.debug() - self.tray_icon = QSystemTrayIcon() + if have_statusnotifier: + self.tray_icon = KStatusNotifierItem() + else: + self.tray_icon = QSystemTrayIcon() pm = load_pixmap("hp_logo", "32x32") self.prop_icon = QIcon(pm) @@ -302,32 +314,57 @@ self.prop_active_icon = QIcon(pm) - self.tray_icon.setIcon(self.prop_icon) - self.session_bus = SessionBus() self.service = None for d in device.getSupportedCUPSDevices(back_end_filter=['hp', 'hpfax']): self.addDevice(d) - self.tray_icon.setToolTip(self.__tr("HPLIP Status Service")) + if have_statusnotifier: + self.tray_icon.setCategory(KStatusNotifierItem.Hardware) + self.tray_icon.setStatus(KStatusNotifierItem.Active) + self.tray_icon.setIconByPixmap(self.prop_icon) + self.tray_icon.setAttentionIconByPixmap(self.prop_active_icon) + self.tray_icon.setToolTipIconByPixmap(self.prop_icon) + self.tray_icon.setTitle(self.__tr("HPLIP Status Service")) + else: + self.tray_icon.setIcon(self.prop_icon) + self.tray_icon.setToolTip(self.__tr("HPLIP Status Service")) + QObject.connect(self.tray_icon, SIGNAL("messageClicked()"), self.messageClicked) notifier = QSocketNotifier(self.read_pipe, QSocketNotifier.Read) QObject.connect(notifier, SIGNAL("activated(int)"), self.notifierActivated) QObject.connect(self.tray_icon, SIGNAL("activated(QSystemTrayIcon::ActivationReason)"), self.trayActivated) - self.tray_icon.show() - if self.user_settings.systray_visible == SYSTRAY_VISIBLE_SHOW_ALWAYS: - self.tray_icon.setVisible(True) + if have_statusnotifier: + self.tray_icon.setAttentionIconByPixmap(self.prop_active_icon) + self.active_icon = True + self.setMenu() else: - QTimer.singleShot(HIDE_INACTIVE_DELAY, self.timeoutHideWhenInactive) # show icon for awhile @ startup + self.tray_icon.show() + if self.user_settings.systray_visible == SYSTRAY_VISIBLE_SHOW_ALWAYS: + self.showIcon() + else: + QTimer.singleShot(HIDE_INACTIVE_DELAY, self.timeoutHideWhenInactive) # show icon for awhile @ startup - self.tray_icon.setIcon(self.prop_active_icon) - self.active_icon = True + self.tray_icon.setIcon(self.prop_active_icon) + self.active_icon = True - QTimer.singleShot(SET_MENU_DELAY, self.initDone) + QTimer.singleShot(SET_MENU_DELAY, self.initDone) + + def showIcon(self): + if have_statusnotifier: + self.tray_icon.setStatus(KStatusNotifierItem.Active) + else: + self.tray_icon.setVisible(True) + def hideIcon(self): + if have_statusnotifier: + self.tray_icon.setStatus(KStatusNotifierItem.Passive) + else: + self.tray_icon.setVisible(False) + # only used when have_statusnotifier == False def initDone(self): self.tray_icon.setIcon(self.prop_icon) self.active_icon = False @@ -346,32 +383,31 @@ def setMenu(self): - self.menu = QMenu() - - title = QWidgetAction(self.menu) - #title.setDisabled(True) - - hbox = QFrame(self.menu) - layout = QHBoxLayout(hbox) - layout.setMargin(3) - layout.setSpacing(5) - pix_label = QLabel(hbox) - - layout.insertWidget(-1, pix_label, 0) - - icon_size = self.menu.style().pixelMetric(QStyle.PM_SmallIconSize) - pix_label.setPixmap(self.prop_icon.pixmap(icon_size)) - - label = QLabel(hbox) - layout.insertWidget(-1, label, 20) - title.setDefaultWidget(hbox) - - label.setText(self.__tr("HPLIP Status Service")) - - f = label.font() - f.setBold(True) - label.setFont(f) - self.menu.insertAction(None, title) + self.menu = MyMenu() + if not have_statusnotifier: + title = QWidgetAction(self.menu) + + hbox = QFrame(self.menu) + layout = QHBoxLayout(hbox) + layout.setMargin(3) + layout.setSpacing(5) + pix_label = QLabel(hbox) + + layout.insertWidget(-1, pix_label, 0) + + icon_size = self.menu.style().pixelMetric(QStyle.PM_SmallIconSize) + pix_label.setPixmap(self.prop_icon.pixmap(icon_size)) + + label = QLabel(hbox) + layout.insertWidget(-1, label, 20) + title.setDefaultWidget(hbox) + + label.setText(self.__tr("HPLIP Status Service")) + + f = label.font() + f.setBold(True) + label.setFont(f) + self.menu.insertAction(None, title) if devices: if self.service is None: @@ -405,11 +441,16 @@ self.settings_action = self.menu.addAction(QIcon(load_pixmap('settings', '16x16')), self.__tr("Settings..."), self.settingsTriggered) + # don't display the quit button provided by kde statusnotifier + if have_statusnotifier: + self.tray_icon.setStandardActionsEnabled(False) + + # add our own quit button/function self.menu.addSeparator() self.menu.addAction(QIcon(load_pixmap('quit', '16x16')), "Quit", self.quitTriggered) - self.tray_icon.setContextMenu(self.menu) - + # register this menu with the tray + self.tray_icon.setContextMenu(self.menu) def settingsTriggered(self): @@ -431,7 +472,7 @@ if self.user_settings.systray_visible == SYSTRAY_VISIBLE_SHOW_ALWAYS: log.debug("Showing...") - self.tray_icon.setVisible(True) + self.showIcon() else: log.debug("Waiting to hide...") @@ -446,7 +487,7 @@ def timeoutHideWhenInactive(self): log.debug("Hiding...") if self.user_settings.systray_visible in (SYSTRAY_VISIBLE_HIDE_WHEN_INACTIVE, SYSTRAY_VISIBLE_HIDE_ALWAYS): - self.tray_icon.setVisible(False) + self.hideIcon() log.debug("Hidden") @@ -561,7 +602,7 @@ (SYSTRAY_VISIBLE_SHOW_ALWAYS, SYSTRAY_VISIBLE_HIDE_WHEN_INACTIVE): log.debug("Showing...") - self.tray_icon.setVisible(True) + self.showIcon() if event.event_code == EVENT_DEVICE_UPDATE_ACTIVE: if not self.active_icon: