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))