diff --git a/data/glade/message_window.glade b/data/glade/message_window.glade index b99e7d1fe..3220f4812 100644 --- a/data/glade/message_window.glade +++ b/data/glade/message_window.glade @@ -332,6 +332,48 @@ 4 + + + True + True + True + Start audio session + none + + + + True + gtk-missing-image + 1 + + + + + False + 5 + + + + + True + True + True + Stop audio session + none + + + + True + gtk-missing-image + 1 + + + + + False + 6 + + True @@ -352,7 +394,7 @@ False - 5 + 7 @@ -375,7 +417,7 @@ False - 6 + 8 @@ -398,7 +440,7 @@ False - 7 + 9 @@ -408,7 +450,7 @@ False - 8 + 10 @@ -431,7 +473,7 @@ False - 9 + 11 @@ -443,7 +485,7 @@ - 10 + 12 @@ -490,7 +532,7 @@ False - 11 + 13 diff --git a/src/chat_control.py b/src/chat_control.py index fca91d185..efc6c234b 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -1161,6 +1161,16 @@ class ChatControl(ChatControlBase): self._on_add_to_roster_menuitem_activate) self.handlers[id_] = self._add_to_roster_button + self._start_audio_button = self.xml.get_widget('start_audio_button') + id_ = self._start_audio_button.connect('clicked', + self.on_start_audio_button_activate) + self.handlers[id_] = self._start_audio_button + + self._stop_audio_button = self.xml.get_widget('stop_audio_button') + id_ = self._stop_audio_button.connect('clicked', + self.on_stop_audio_button_activate) + self.handlers[id_] = self._stop_audio_button + self._send_file_button = self.xml.get_widget('send_file_button') # add a special img for send file button path_to_upload_img = os.path.join(gajim.DATA_DIR, 'pixmaps', 'upload.png') @@ -1203,22 +1213,22 @@ class ChatControl(ChatControlBase): img.set_from_pixbuf(gtkgui_helpers.load_icon( 'muc_active').get_pixbuf()) - self.update_toolbar() - - self._mood_image = self.xml.get_widget('mood_image') - self._activity_image = self.xml.get_widget('activity_image') - self._tune_image = self.xml.get_widget('tune_image') self._audio_image = self.xml.get_widget('audio_image') - - self.update_mood() - self.update_activity() - self.update_tune() if gajim.capscache.is_supported(contact, NS_JINGLE_RTP_AUDIO): self.set_audio_state('available') else: self.set_audio_state('not_available') self.audio_sid = None + self.update_toolbar() + + self._mood_image = self.xml.get_widget('mood_image') + self._activity_image = self.xml.get_widget('activity_image') + self._tune_image = self.xml.get_widget('tune_image') + + self.update_mood() + self.update_activity() + self.update_tune() # keep timeout id and window obj for possible big avatar # it is on enter-notify and leave-notify so no need to be @@ -1318,6 +1328,20 @@ class ChatControl(ChatControlBase): else: self._add_to_roster_button.hide() + # Audio buttons + if self.audio_state == self.AUDIO_STATE_NOT_AVAILABLE: + self._start_audio_button.show() + self._start_audio_button.set_sensitive(False) + self._stop_audio_button.hide() + elif self.audio_state in (self.AUDIO_STATE_AVAILABLE, + self.AUDIO_STATE_ERROR): + self._start_audio_button.show() + self._start_audio_button.set_sensitive(True) + self._stop_audio_button.hide() + else: + self._start_audio_button.hide() + self._stop_audio_button.show() + # Send file if gajim.capscache.is_supported(self.contact, NS_FILE) and \ self.contact.resource: @@ -1451,11 +1475,10 @@ class ChatControl(ChatControlBase): self._tune_image.hide() def update_audio(self): - if self.audio_state == self.AUDIO_STATE_NOT_AVAILABLE: + if self.audio_state in (self.AUDIO_STATE_NOT_AVAILABLE, + self.AUDIO_STATE_AVAILABLE): self._audio_image.hide() return - elif self.audio_state == self.AUDIO_STATE_AVAILABLE: - self._audio_image.set_from_stock(gtk.STOCK_APPLY, 1) elif self.audio_state == self.AUDIO_STATE_CONNECTING: self._audio_image.set_from_stock(gtk.STOCK_CONVERT, 1) elif self.audio_state == self.AUDIO_STATE_CONNECTION_RECEIVED: @@ -1465,12 +1488,14 @@ class ChatControl(ChatControlBase): elif self.audio_state == self.AUDIO_STATE_ERROR: self._audio_image.set_from_stock(gtk.STOCK_DIALOG_WARNING, 1) self._audio_image.show() + self.update_toolbar() def set_audio_state(self, state, sid=None, reason=None): - str = 'Audio state : %s' % state - if reason: - str += ', reason: %s' % reason - self.print_conversation(str, 'info') + if state in ('connecting', 'connected', 'stop'): + str = _('Audio state : %s') % state + if reason: + str += ', ' + _('reason: %s') % reason + self.print_conversation(str, 'info') if state == 'not_available': self.audio_state = self.AUDIO_STATE_NOT_AVAILABLE self.audio_sid = None @@ -1485,6 +1510,9 @@ class ChatControl(ChatControlBase): self.audio_sid = sid elif state == 'connected': self.audio_state = self.AUDIO_STATE_CONNECTED + elif state == 'stop': + self.audio_state = self.AUDIO_STATE_AVAILABLE + self.audio_sid = None elif state == 'error': self.audio_state = self.AUDIO_STATE_ERROR self.update_audio() @@ -1689,17 +1717,16 @@ class ChatControl(ChatControlBase): banner_name_label.set_markup(label_text) banner_name_tooltip.set_tip(banner_name_label, label_tooltip) - def _on_start_voip_menuitem_activate(self, *things): + def on_start_audio_button_activate(self, *things): sid = gajim.connections[self.account].startVoIP(self.contact.get_full_jid( )) self.set_audio_state('connecting', sid) - def _on_stop_voip_menuitem_activate(self, *things): + def on_stop_audio_button_activate(self, *things): session = gajim.connections[self.account].getJingleSession( self.contact.get_full_jid(), self.audio_sid) if session: session.end_session() - self.set_audio_state('available') def _toggle_gpg(self): if not self.gpg_is_active and not self.contact.keyID: @@ -2163,8 +2190,6 @@ class ChatControl(ChatControlBase): add_to_roster_menuitem = xml.get_widget('add_to_roster_menuitem') history_menuitem = xml.get_widget('history_menuitem') toggle_gpg_menuitem = xml.get_widget('toggle_gpg_menuitem') - start_voip_menuitem = xml.get_widget('start_voip_menuitem') - stop_voip_menuitem = xml.get_widget('stop_voip_menuitem') toggle_e2e_menuitem = xml.get_widget('toggle_e2e_menuitem') send_file_menuitem = xml.get_widget('send_file_menuitem') information_menuitem = xml.get_widget('information_menuitem') @@ -2234,17 +2259,6 @@ class ChatControl(ChatControlBase): else: send_file_menuitem.set_sensitive(False) - # check if it's possible to start jingle sessions - if self.audio_state == self.AUDIO_STATE_NOT_AVAILABLE: - start_voip_menuitem.show() - start_voip_menuitem.set_sensitive(False) - elif self.audio_state in (self.AUDIO_STATE_AVAILABLE, - self.AUDIO_STATE_ERROR): - start_voip_menuitem.show() - start_voip_menuitem.set_sensitive(True) - else: - stop_voip_menuitem.show() - # check if it's possible to convert to groupchat if gajim.capscache.is_supported(contact, NS_MUC): convert_to_gc_menuitem.set_sensitive(True) @@ -2264,12 +2278,6 @@ class ChatControl(ChatControlBase): id_ = toggle_gpg_menuitem.connect('activate', self._on_toggle_gpg_menuitem_activate) self.handlers[id_] = toggle_gpg_menuitem - id = start_voip_menuitem.connect('activate', - self._on_start_voip_menuitem_activate) - self.handlers[id] = start_voip_menuitem - id = stop_voip_menuitem.connect('activate', - self._on_stop_voip_menuitem_activate) - self.handlers[id] = stop_voip_menuitem id_ = toggle_e2e_menuitem.connect('activate', self._on_toggle_e2e_menuitem_activate) self.handlers[id_] = toggle_e2e_menuitem diff --git a/src/gajim.py b/src/gajim.py index 149131951..c922f4df2 100644 --- a/src/gajim.py +++ b/src/gajim.py @@ -2079,7 +2079,8 @@ class Interface: is_modal = False, ok_handler = on_ok) def handle_event_jingle_incoming(self, account, data): - # ('JINGLE_INCOMING', account, peer jid, sid, tuple-of-contents==(type, data...)) + # ('JINGLE_INCOMING', account, peer jid, sid, tuple-of-contents==(type, + # data...)) # TODO: conditional blocking if peer is not in roster # unpack data @@ -2134,15 +2135,15 @@ class Interface: ctrl.set_audio_state('connected', sid) def handle_event_jingle_disconnected(self, account, data): - # ('JINGLE_DISCONNECTED', account, (peerjid, sid)) - peerjid, sid = data + # ('JINGLE_DISCONNECTED', account, (peerjid, sid, reason)) + peerjid, sid, reason = data jid = gajim.get_jid_without_resource(peerjid) resource = gajim.get_resource_from_jid(peerjid) ctrl = self.msg_win_mgr.get_control(peerjid, account) if not ctrl: ctrl = self.msg_win_mgr.get_control(jid, account) if ctrl: - ctrl.set_audio_state('available', sid) + ctrl.set_audio_state('stop', sid=sid, reason=reason) def handle_event_jingle_error(self, account, data): # ('JINGLE_ERROR', account, (peerjid, sid, reason))