def handle_incoming_pres_event(self, pres_obj): if app.jid_is_transport(pres_obj.jid): return True account = pres_obj.conn.name self.jid = pres_obj.jid resource = pres_obj.resource or '' # It isn't an agent for c in pres_obj.contact_list: if c.resource == resource: # we look for other connected resources continue if c.show not in ('offline', 'error'): return True # no other resource is connected, let's look in metacontacts family = app.contacts.get_metacontacts_family(account, self.jid) for info in family: acct_ = info['account'] jid_ = info['jid'] c_ = app.contacts.get_contact_with_highest_priority(acct_, jid_) if not c_: continue if c_.jid == self.jid: continue if c_.show not in ('offline', 'error'): return True if pres_obj.old_show < 2 and pres_obj.new_show > 1: event = 'contact_connected' server = app.get_server_from_jid(self.jid) account_server = account + '/' + server block_transport = False if account_server in app.block_signed_in_notifications and \ app.block_signed_in_notifications[account_server]: block_transport = True if helpers.allow_showing_notification(account, 'notify_on_signin') \ and not app.block_signed_in_notifications[account] and \ not block_transport: self.do_popup = True if app.config.get_per('soundevents', 'contact_connected', 'enabled') and not app.block_signed_in_notifications[account] and\ not block_transport and helpers.allow_sound_notification(account, 'contact_connected'): self.sound_event = event self.do_sound = True elif pres_obj.old_show > 1 and pres_obj.new_show < 2: event = 'contact_disconnected' if helpers.allow_showing_notification(account, 'notify_on_signout'): self.do_popup = True if app.config.get_per('soundevents', 'contact_disconnected', 'enabled') and helpers.allow_sound_notification(account, event): self.sound_event = event self.do_sound = True # Status change (not connected/disconnected or error (<1)) elif pres_obj.new_show > 1: event = 'status_change' else: return True if app.jid_is_transport(self.jid): self.transport_name = app.get_transport_name_from_jid(self.jid) self.show = pres_obj.show self.popup_timeout = app.config.get('notification_timeout') nick = i18n.direction_mark + app.get_name_from_jid(account, self.jid) if event == 'status_change': self.popup_title = _('%(nick)s Changed Status') % \ {'nick': nick} self.popup_text = _('%(nick)s is now %(status)s') % \ {'nick': nick, 'status': helpers.get_uf_show(pres_obj.show)} if pres_obj.status: self.popup_text = self.popup_text + " : " + pres_obj.status self.popup_event_type = _('Contact Changed Status') elif event == 'contact_connected': self.popup_title = _('%(nickname)s Signed In') % {'nickname': nick} self.popup_text = '' if pres_obj.status: self.popup_text = pres_obj.status self.popup_event_type = _('Contact Signed In') elif event == 'contact_disconnected': self.popup_title = _('%(nickname)s Signed Out') % {'nickname': nick} self.popup_text = '' if pres_obj.status: self.popup_text = pres_obj.status self.popup_event_type = _('Contact Signed Out')
def handle_incoming_msg_event(self, msg_obj): # don't alert for carbon copied messages from ourselves if msg_obj.sent: return if not msg_obj.msgtxt: return self.jid = msg_obj.jid if msg_obj.mtype == 'pm': self.jid = msg_obj.fjid self.control = app.interface.msg_win_mgr.search_control( msg_obj.jid, self.account, msg_obj.resource) if self.control is None: if len(app.events.get_events( self.account, msg_obj.jid, [msg_obj.mtype])) <= 1: self.first_unread = True else: self.control_focused = self.control.has_focus() if msg_obj.mtype == 'pm': nick = msg_obj.resource else: nick = app.get_name_from_jid(self.conn.name, self.jid) if self.first_unread: self.sound_event = 'first_message_received' elif self.control_focused: self.sound_event = 'next_message_received_focused' else: self.sound_event = 'next_message_received_unfocused' if app.config.get('notification_preview_message'): self.popup_text = msg_obj.msgtxt if self.popup_text and (self.popup_text.startswith('/me ') or \ self.popup_text.startswith('/me\n')): self.popup_text = '* ' + nick + self.popup_text[3:] else: # We don't want message preview, do_preview = False self.popup_text = '' if msg_obj.mtype == 'normal': # single message self.popup_msg_type = 'normal' self.popup_event_type = _('New Single Message') elif msg_obj.mtype == 'pm': self.popup_msg_type = 'pm' self.popup_event_type = _('New Private Message') else: # chat message self.popup_msg_type = 'chat' self.popup_event_type = _('New Message') num_unread = len(app.events.get_events(self.conn.name, self.jid, ['printed_' + self.popup_msg_type, self.popup_msg_type])) self.popup_title = i18n.ngettext( 'New message from %(nickname)s', '%(n_msgs)i unread messages from %(nickname)s', num_unread) % {'nickname': nick, 'n_msgs': num_unread} if app.config.get('notify_on_new_message'): if self.first_unread or (app.config.get('autopopup_chat_opened') \ and not self.control_focused): if app.config.get('autopopupaway'): # always show notification self.do_popup = True if app.connections[self.conn.name].connected in (2, 3): # we're online or chat self.do_popup = True if msg_obj.attention and not app.config.get( 'ignore_incoming_attention'): self.popup_timeout = 0 self.do_popup = True else: self.popup_timeout = app.config.get('notification_timeout') if msg_obj.attention and not app.config.get( 'ignore_incoming_attention') and app.config.get_per('soundevents', 'attention_received', 'enabled'): self.sound_event = 'attention_received' self.do_sound = True elif self.first_unread and helpers.allow_sound_notification( self.conn.name, 'first_message_received'): self.do_sound = True elif not self.first_unread and self.control_focused and \ helpers.allow_sound_notification(self.conn.name, 'next_message_received_focused'): self.do_sound = True elif not self.first_unread and not self.control_focused and \ helpers.allow_sound_notification(self.conn.name, 'next_message_received_unfocused'): self.do_sound = True
def __init__(self, event_type, jid, account, msg_type='', icon_name=None, title=None, text=None, timeout=-1): Gtk.Window.__init__(self) self.set_type_hint(Gdk.WindowTypeHint.NOTIFICATION) self.set_focus_on_map(False) self.set_accept_focus(False) self.set_skip_taskbar_hint(True) self.set_decorated(False) self._timeout_id = None self.account = account self.jid = jid self.msg_type = msg_type self._ui = get_builder('popup_notification_window.ui') self.add(self._ui.eventbox) if event_type in (_('New Message'), _('New Private Message'), _('New E-mail')): bg_color = app.css_config.get_value('.gajim-notify-message', StyleAttr.COLOR) elif event_type == _('File Transfer Request'): bg_color = app.css_config.get_value('.gajim-notify-ft-request', StyleAttr.COLOR) elif event_type == _('File Transfer Error'): bg_color = app.css_config.get_value('.gajim-notify-ft-error', StyleAttr.COLOR) elif event_type in (_('File Transfer Completed'), _('File Transfer Stopped')): bg_color = app.css_config.get_value('.gajim-notify-ft-complete', StyleAttr.COLOR) elif event_type == _('Group Chat Invitation'): bg_color = app.css_config.get_value('.gajim-notify-invite', StyleAttr.COLOR) elif event_type == _('Contact Changed Status'): bg_color = app.css_config.get_value('.gajim-notify-status', StyleAttr.COLOR) else: # Unknown event (shouldn't happen, but deal with it) bg_color = app.css_config.get_value('.gajim-notify-other', StyleAttr.COLOR) bar_class = ''' .popup-bar { background-color: %s }''' % bg_color gtkgui_helpers.add_css_to_widget(self._ui.color_bar, bar_class) self._ui.color_bar.get_style_context().add_class('popup-bar') if not title: title = '' self._ui.event_type_label.set_markup(title) if not text: text = app.get_name_from_jid(account, jid) # default value of text escaped_text = GLib.markup_escape_text(text) self._ui.event_description_label.set_markup(escaped_text) self._ui.image.set_from_icon_name(icon_name, Gtk.IconSize.DIALOG) self.move(*self._get_window_pos()) self._ui.connect_signals(self) self.connect('button-press-event', self._on_button_press) self.connect('destroy', self._on_destroy) self.show_all() if timeout > 0: self._timeout_id = GLib.timeout_add_seconds(timeout, self.destroy)
def __init__(self, event_type, jid, account, msg_type='', icon_name=None, title=None, text=None, timeout=-1): Gtk.Window.__init__(self) self.set_type_hint(Gdk.WindowTypeHint.NOTIFICATION) self.set_focus_on_map(False) self.set_accept_focus(False) self.set_name('NotificationPopup') self.set_skip_taskbar_hint(True) self.set_decorated(False) self.set_size_request(312, 95) self._timeout_id = None self.account = account self.jid = jid self.msg_type = msg_type self._ui = get_builder('popup_notification_window.ui') self.add(self._ui.eventbox) if not text: text = app.get_name_from_jid(account, jid) # default value of text if not title: title = '' self._ui.event_type_label.set_markup( '<span foreground="black" weight="bold">%s</span>' % GLib.markup_escape_text(title)) css = '#NotificationPopup {background-color: black }' gtkgui_helpers.add_css_to_widget(self, css) if event_type == _('Contact Signed In'): bg_color = app.config.get('notif_signin_color') elif event_type == _('Contact Signed Out'): bg_color = app.config.get('notif_signout_color') elif event_type in (_('New Message'), _('New Single Message'), _('New Private Message'), _('New E-mail')): bg_color = app.config.get('notif_message_color') elif event_type == _('File Transfer Request'): bg_color = app.config.get('notif_ftrequest_color') elif event_type == _('File Transfer Error'): bg_color = app.config.get('notif_fterror_color') elif event_type in (_('File Transfer Completed'), _('File Transfer Stopped')): bg_color = app.config.get('notif_ftcomplete_color') elif event_type == _('Group Chat Invitation'): bg_color = app.config.get('notif_invite_color') elif event_type == _('Contact Changed Status'): bg_color = app.config.get('notif_status_color') else: # Unknown event! Shouldn't happen but deal with it bg_color = app.config.get('notif_other_color') background_class = ''' .popup-style { border-image: none; background-image: none; background-color: %s }''' % bg_color gtkgui_helpers.add_css_to_widget(self._ui.eventbox, background_class) self._ui.eventbox.get_style_context().add_class('popup-style') gtkgui_helpers.add_css_to_widget(self._ui.close_button, background_class) self._ui.close_button.get_style_context().add_class('popup-style') escaped_text = GLib.markup_escape_text(text) self._ui.event_description_label.set_markup( '<span foreground="black">%s</span>' % escaped_text) # set the image self._ui.image.set_from_icon_name(icon_name, Gtk.IconSize.DIALOG) self.move(*self._get_window_pos()) self._ui.connect_signals(self) self.connect('button-press-event', self._on_button_press) self.connect('destroy', self._on_destroy) self.show_all() if timeout > 0: self._timeout_id = GLib.timeout_add_seconds(timeout, self.destroy)
def __init__(self, event_type, jid, account, msg_type='', icon_name=None, title=None, text=None, timeout=-1): self.account = account self.jid = jid self.msg_type = msg_type self.index = len(app.interface.roster.popup_notification_windows) xml = gtkgui_helpers.get_gtk_builder('popup_notification_window.ui') self.window = xml.get_object('popup_notification_window') self.window.set_type_hint(Gdk.WindowTypeHint.TOOLTIP) self.window.set_name('NotificationPopup') close_button = xml.get_object('close_button') event_type_label = xml.get_object('event_type_label') event_description_label = xml.get_object('event_description_label') eventbox = xml.get_object('eventbox') image = xml.get_object('notification_image') if not text: text = app.get_name_from_jid(account, jid) # default value of text if not title: title = '' event_type_label.set_markup( '<span foreground="black" weight="bold">%s</span>' % GLib.markup_escape_text(title)) css = '#NotificationPopup {background-color: black }' gtkgui_helpers.add_css_to_widget(self.window, css) if event_type == _('Contact Signed In'): bg_color = app.config.get('notif_signin_color') elif event_type == _('Contact Signed Out'): bg_color = app.config.get('notif_signout_color') elif event_type in (_('New Message'), _('New Single Message'), _('New Private Message'), _('New E-mail')): bg_color = app.config.get('notif_message_color') elif event_type == _('File Transfer Request'): bg_color = app.config.get('notif_ftrequest_color') elif event_type == _('File Transfer Error'): bg_color = app.config.get('notif_fterror_color') elif event_type in (_('File Transfer Completed'), _('File Transfer Stopped')): bg_color = app.config.get('notif_ftcomplete_color') elif event_type == _('Groupchat Invitation'): bg_color = app.config.get('notif_invite_color') elif event_type == _('Contact Changed Status'): bg_color = app.config.get('notif_status_color') else: # Unknown event! Shouldn't happen but deal with it bg_color = app.config.get('notif_other_color') background_class = ''' .popup-style { border-image: none; background-image: none; background-color: %s }''' % bg_color gtkgui_helpers.add_css_to_widget(eventbox, background_class) eventbox.get_style_context().add_class('popup-style') gtkgui_helpers.add_css_to_widget(close_button, background_class) eventbox.get_style_context().add_class('popup-style') event_description_label.set_markup( '<span foreground="black">%s</span>' % GLib.markup_escape_text(text)) # set the image image.set_from_icon_name(icon_name, Gtk.IconSize.DIALOG) # position the window to bottom-right of screen window_width, self.window_height = self.window.get_size() app.interface.roster.popups_notification_height += self.window_height pos_x = app.config.get('notification_position_x') screen_w, screen_h = gtkgui_helpers.get_total_screen_geometry() if pos_x < 0: pos_x = screen_w - window_width + pos_x + 1 pos_y = app.config.get('notification_position_y') if pos_y < 0: pos_y = screen_h - \ app.interface.roster.popups_notification_height + pos_y + 1 self.window.move(pos_x, pos_y) xml.connect_signals(self) self.window.show_all() if timeout > 0: GLib.timeout_add_seconds(timeout, self.on_timeout)