Merge local changes.
This commit is contained in:
		
						commit
						acf06b4470
					
				
					 10 changed files with 825 additions and 495 deletions
				
			
		|  | @ -37,7 +37,7 @@ Gajim is a GTK+ app that loves GNOME. You can do 'make' so you don't require gno | |||
| <li>gnome-python-desktop (for GnomeKeyring support)</li> | ||||
| <li>notification-daemon or notify-python (and D-Bus) to get cooler popups</li> | ||||
| <li>D-Bus running to have gajim-remote working. Some distributions split dbus-x11, which is needed for dbus to work with Gajim. Version >= 0.80 is required.</li> | ||||
| <li>python-dbus bindings (>=0.80)</li> | ||||
| <li>python-dbus bindings (>=0.81)</li> | ||||
| <li>python-sexy to have clickable URLs in chat windows</li> | ||||
| <li>python-kerberos to use GSSAPI authentification. Note: version1.1 or higher is required</li> | ||||
| </ul> | ||||
|  |  | |||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -1375,6 +1375,21 @@ class ChatControl(ChatControlBase): | |||
| 			self.on_avatar_eventbox_button_press_event) | ||||
| 		self.handlers[id_] = widget | ||||
| 
 | ||||
| 		for key in ('1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '0', '#'): | ||||
| 			widget = self.xml.get_widget(key + '_button') | ||||
| 			id_ = widget.connect('pressed', self.on_num_button_pressed, key) | ||||
| 			self.handlers[id_] = widget | ||||
| 			id_ = widget.connect('released', self.on_num_button_released) | ||||
| 			self.handlers[id_] = widget | ||||
| 
 | ||||
| 		widget = self.xml.get_widget('mic_hscale') | ||||
| 		id_ = widget.connect('value_changed', self.on_mic_hscale_value_changed) | ||||
| 		self.handlers[id_] = widget | ||||
| 
 | ||||
| 		widget = self.xml.get_widget('sound_hscale') | ||||
| 		id_ = widget.connect('value_changed', self.on_sound_hscale_value_changed) | ||||
| 		self.handlers[id_] = widget | ||||
| 
 | ||||
| 		if not session: | ||||
| 			# Don't use previous session if we want to a specific resource | ||||
| 			# and it's not the same | ||||
|  | @ -1505,27 +1520,35 @@ class ChatControl(ChatControlBase): | |||
| 		if jingle_type not in ('audio', 'video'): | ||||
| 			return | ||||
| 		banner_image = getattr(self, '_' + jingle_type + '_banner_image') | ||||
| 		if getattr(self, jingle_type + '_state') in ( | ||||
| 		self.JINGLE_STATE_NOT_AVAILABLE, self.JINGLE_STATE_AVAILABLE): | ||||
| 		state = getattr(self, jingle_type + '_state') | ||||
| 		if state in (self.JINGLE_STATE_NOT_AVAILABLE, | ||||
| 		self.JINGLE_STATE_AVAILABLE): | ||||
| 			banner_image.hide() | ||||
| 		else: | ||||
| 			banner_image.show() | ||||
| 		if self.audio_state == self.JINGLE_STATE_CONNECTING: | ||||
| 		if state == self.JINGLE_STATE_CONNECTING: | ||||
| 			banner_image.set_from_stock( | ||||
| 				gtk.STOCK_CONVERT, 1) | ||||
| 		elif self.audio_state == self.JINGLE_STATE_CONNECTION_RECEIVED: | ||||
| 		elif state == self.JINGLE_STATE_CONNECTION_RECEIVED: | ||||
| 			banner_image.set_from_stock( | ||||
| 				gtk.STOCK_NETWORK, 1) | ||||
| 		elif self.audio_state == self.JINGLE_STATE_CONNECTED: | ||||
| 		elif state == self.JINGLE_STATE_CONNECTED: | ||||
| 			banner_image.set_from_stock( | ||||
| 				gtk.STOCK_CONNECT, 1) | ||||
| 		elif self.audio_state == self.JINGLE_STATE_ERROR: | ||||
| 		elif state == self.JINGLE_STATE_ERROR: | ||||
| 			banner_image.set_from_stock( | ||||
| 				gtk.STOCK_DIALOG_WARNING, 1) | ||||
| 		self.update_toolbar() | ||||
| 
 | ||||
| 	def update_audio(self): | ||||
| 		self._update_jingle('audio') | ||||
| 		vbox = self.xml.get_widget('audio_vbox') | ||||
| 		if self.audio_state == self.JINGLE_STATE_CONNECTED: | ||||
| 			vbox.set_no_show_all(False) | ||||
| 			vbox.show_all() | ||||
| 		else: | ||||
| 			vbox.set_no_show_all(True) | ||||
| 			vbox.hide() | ||||
| 
 | ||||
| 	def update_video(self): | ||||
| 		self._update_jingle('video') | ||||
|  | @ -1589,6 +1612,24 @@ class ChatControl(ChatControlBase): | |||
| 	def set_video_state(self, state, sid=None, reason=None): | ||||
| 		self._set_jingle_state('video', state, sid=sid, reason=reason) | ||||
| 
 | ||||
| 	def _get_audio_content(self): | ||||
| 		session = gajim.connections[self.account].get_jingle_session( | ||||
| 			self.contact.get_full_jid(), self.audio_sid) | ||||
| 		return session.get_content('audio') | ||||
| 
 | ||||
| 	def on_num_button_pressed(self, widget, num): | ||||
| 		self._get_audio_content()._start_dtmf(num) | ||||
| 
 | ||||
| 	def on_num_button_released(self, released): | ||||
| 		self._get_audio_content()._stop_dtmf() | ||||
| 
 | ||||
| 	def on_mic_hscale_value_changed(self, widget): | ||||
| 		value = widget.get_value() | ||||
| 		self._get_audio_content().set_mic_volume(value / 100) | ||||
| 
 | ||||
| 	def on_sound_hscale_value_changed(self, widget): | ||||
| 		pass | ||||
| 
 | ||||
| 	def on_avatar_eventbox_enter_notify_event(self, widget, event): | ||||
| 		""" | ||||
| 		Enter the eventbox area so we under conditions add a timeout to show a | ||||
|  | @ -1790,7 +1831,7 @@ class ChatControl(ChatControlBase): | |||
| 		banner_name_label.set_tooltip_text(label_tooltip) | ||||
| 
 | ||||
| 	def on_jingle_button_toggled(self, widget, jingle_type): | ||||
| 		img_name = '%s_%s' % ({'audio': 'mic', 'video': 'cam'}[jingle_type], | ||||
| 		img_name = 'gajim-%s_%s' % ({'audio': 'mic', 'video': 'cam'}[jingle_type], | ||||
| 				{True: 'active', False: 'inactive'}[widget.get_active()]) | ||||
| 		path_to_img = gtkgui_helpers.get_icon_path(img_name) | ||||
| 
 | ||||
|  |  | |||
|  | @ -578,8 +578,6 @@ class CommonConnection: | |||
| 				self.dispatch('STANZA_SENT', unicode(data)) | ||||
| 
 | ||||
| 	def change_status(self, show, msg, auto=False): | ||||
| 		if not show in ['offline', 'online', 'chat', 'away', 'xa', 'dnd']: | ||||
| 			return -1 | ||||
| 		if not msg: | ||||
| 			msg = '' | ||||
| 		sign_msg = False | ||||
|  | @ -598,8 +596,9 @@ class CommonConnection: | |||
| 				self.USE_GPG = True | ||||
| 				self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent')) | ||||
| 			self.connect_and_init(show, msg, sign_msg) | ||||
| 			return | ||||
| 
 | ||||
| 		elif show == 'offline': | ||||
| 		if show == 'offline': | ||||
| 			self.connected = 0 | ||||
| 			if self.connection: | ||||
| 				p = common.xmpp.Presence(typ = 'unavailable') | ||||
|  | @ -612,14 +611,17 @@ class CommonConnection: | |||
| 				self.connection.start_disconnect() | ||||
| 			else: | ||||
| 				self._on_disconnected() | ||||
| 			return | ||||
| 
 | ||||
| 		elif show != 'offline' and self.connected > 0: | ||||
| 		if show != 'offline' and self.connected > 0: | ||||
| 			# dont'try to connect, when we are in state 'connecting' | ||||
| 			if self.connected == 1: | ||||
| 				return | ||||
| 			if show == 'invisible': | ||||
| 				self._change_to_invisible(msg) | ||||
| 				return | ||||
| 			if show not in ['offline', 'online', 'chat', 'away', 'xa', 'dnd']: | ||||
| 				return -1 | ||||
| 			was_invisible = self.connected == gajim.SHOW_LIST.index('invisible') | ||||
| 			self.connected = gajim.SHOW_LIST.index(show) | ||||
| 			if was_invisible: | ||||
|  |  | |||
|  | @ -2714,6 +2714,8 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, | |||
| 		if show == 'invisible': | ||||
| 			self.send_invisible_presence(msg, signed, True) | ||||
| 			return | ||||
| 		if show not in ['offline', 'online', 'chat', 'away', 'xa', 'dnd']: | ||||
| 			return | ||||
| 		priority = gajim.get_priority(self.name, sshow) | ||||
| 		our_jid = helpers.parse_jid(gajim.get_jid_from_account(self.name)) | ||||
| 		vcard = self.get_cached_vcard(our_jid) | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ def get_jingle_content(node): | |||
| 		return contents[namespace](node) | ||||
| 
 | ||||
| 
 | ||||
| class FailedApplication(Exception): | ||||
| class JingleContentSetupException(Exception): | ||||
| 	""" | ||||
| 	Exception that should be raised when a content fails to setup. | ||||
| 	""" | ||||
|  |  | |||
|  | @ -24,7 +24,7 @@ from glib import GError | |||
| import gajim | ||||
| 
 | ||||
| from jingle_transport import JingleTransportICEUDP | ||||
| from jingle_content import contents, JingleContent, FailedApplication | ||||
| from jingle_content import contents, JingleContent, JingleContentSetupException | ||||
| 
 | ||||
| 
 | ||||
| class JingleRTPContent(JingleContent): | ||||
|  | @ -89,16 +89,17 @@ class JingleRTPContent(JingleContent): | |||
| 			and self.p2psession.get_property('codecs-ready')) | ||||
| 
 | ||||
| 	def make_bin_from_config(self, config_key, pipeline, text): | ||||
| 		pipeline = pipeline % gajim.config.get(config_key) | ||||
| 		try: | ||||
| 			bin = gst.parse_bin_from_description(pipeline | ||||
| 				% gajim.config.get(config_key), True) | ||||
| 			bin = gst.parse_bin_from_description(pipeline, True) | ||||
| 			return bin | ||||
| 		except GError, error_str: | ||||
| 			self.session.connection.dispatch('ERROR', | ||||
| 				(_("%s configuration error") % text.capitalize(), | ||||
| 				_("Couldn't setup %s. Check your configuration.\n\nError was:\n%s") | ||||
| 					% (text, error_str))) | ||||
| 			raise FailedApplication | ||||
| 					_("Couldn't setup %s. Check your configuration.\n\n" | ||||
| 						"Pipeline was:\n%s\n\n" | ||||
| 						"Error was:\n%s") % (text, pipeline, error_str))) | ||||
| 			raise JingleContentSetupException | ||||
| 
 | ||||
| 	def add_remote_candidates(self, candidates): | ||||
| 		JingleContent.add_remote_candidates(self, candidates) | ||||
|  | @ -257,6 +258,12 @@ class JingleAudio(JingleRTPContent): | |||
| 		JingleRTPContent.__init__(self, session, 'audio', transport) | ||||
| 		self.setup_stream() | ||||
| 
 | ||||
| 	def set_mic_volume(self, vol): | ||||
| 		""" | ||||
| 		vol must be between 0 ans 1 | ||||
| 		""" | ||||
| 		self.mic_volume.set_property('volume', vol) | ||||
| 
 | ||||
| 	def setup_stream(self): | ||||
| 		JingleRTPContent.setup_stream(self) | ||||
| 
 | ||||
|  | @ -281,7 +288,7 @@ class JingleAudio(JingleRTPContent): | |||
| 			'audioconvert ! %s', _("audio output")) | ||||
| 
 | ||||
| 		self.mic_volume = src_bin.get_by_name('gajim_vol') | ||||
| 		self.mic_volume.set_property('volume', 1) | ||||
| 		self.set_mic_volume(0) | ||||
| 
 | ||||
| 		# link gst elements | ||||
| 		self.pipeline.add(self.sink, src_bin) | ||||
|  | @ -315,7 +322,7 @@ class JingleVideo(JingleRTPContent): | |||
| 		#src_bin.link(caps) | ||||
| 
 | ||||
| 		self.sink = self.make_bin_from_config('video_output_device', | ||||
| 			'%s ! videoscale ! ffmpegcolorspace', _("video output")) | ||||
| 			'videoscale ! ffmpegcolorspace ! %s', _("video output")) | ||||
| 		self.pipeline.add(self.sink) | ||||
| 
 | ||||
| 		src_bin.get_pad('src').link(self.p2psession.get_property('sink-pad')) | ||||
|  | @ -333,4 +340,4 @@ def get_content(desc): | |||
| 
 | ||||
| contents[xmpp.NS_JINGLE_RTP] = get_content | ||||
| 
 | ||||
| # vim: se ts=3: | ||||
| # vim: se ts=3: | ||||
|  |  | |||
|  | @ -29,7 +29,7 @@ Handles Jingle sessions (XEP 0166) | |||
| import gajim #Get rid of that? | ||||
| import xmpp | ||||
| from jingle_transport import get_jingle_transport | ||||
| from jingle_content import get_jingle_content, FailedApplication | ||||
| from jingle_content import get_jingle_content, JingleContentSetupException | ||||
| 
 | ||||
| # FIXME: Move it to JingleSession.States? | ||||
| class JingleStates(object): | ||||
|  | @ -492,7 +492,7 @@ class JingleSession(object): | |||
| 					else: | ||||
| 						reasons.add('unsupported-transports') | ||||
| 						contents_rejected.append((element['name'], 'peer')) | ||||
| 				except FailedApplication: | ||||
| 				except JingleContentSetupException: | ||||
| 					reasons.add('failed-application') | ||||
| 			else: | ||||
| 				contents_rejected.append((element['name'], 'peer')) | ||||
|  |  | |||
							
								
								
									
										12
									
								
								src/gajim.py
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								src/gajim.py
									
										
									
									
									
								
							|  | @ -176,12 +176,12 @@ else: | |||
| 		elif sysname in ('FreeBSD', 'OpenBSD', 'NetBSD'): | ||||
| 			libc.setproctitle('gajim') | ||||
| 
 | ||||
| 	if gtk.pygtk_version < (2, 12, 0): | ||||
| 		pritext = _('Gajim needs PyGTK 2.12 or above') | ||||
| 		sectext = _('Gajim needs PyGTK 2.12 or above to run. Quiting...') | ||||
| 	elif gtk.gtk_version < (2, 12, 0): | ||||
| 		pritext = _('Gajim needs GTK 2.12 or above') | ||||
| 		sectext = _('Gajim needs GTK 2.12 or above to run. Quiting...') | ||||
| 	if gtk.pygtk_version < (2, 16, 0): | ||||
| 		pritext = _('Gajim needs PyGTK 2.16 or above') | ||||
| 		sectext = _('Gajim needs PyGTK 2.16 or above to run. Quiting...') | ||||
| 	elif gtk.gtk_version < (2, 16, 0): | ||||
| 		pritext = _('Gajim needs GTK 2.16 or above') | ||||
| 		sectext = _('Gajim needs GTK 2.16 or above to run. Quiting...') | ||||
| 
 | ||||
| 	try: | ||||
| 		import gtk.glade # check if user has libglade (in pygtk and in gtk) | ||||
|  |  | |||
|  | @ -36,31 +36,11 @@ import pango | |||
| import os | ||||
| import sys | ||||
| 
 | ||||
| import vcard | ||||
| import dialogs | ||||
| 
 | ||||
| import logging | ||||
| log = logging.getLogger('gajim.gtkgui_helpers') | ||||
| 
 | ||||
| 
 | ||||
| HAS_PYWIN32 = True | ||||
| if os.name == 'nt': | ||||
| 	try: | ||||
| 		import win32file | ||||
| 		import win32con | ||||
| 		import pywintypes | ||||
| 	except ImportError: | ||||
| 		HAS_PYWIN32 = False | ||||
| 
 | ||||
| from common import i18n | ||||
| from common import gajim | ||||
| from common import helpers | ||||
| 
 | ||||
| gtk.glade.bindtextdomain(i18n.APP, i18n.DIR) | ||||
| gtk.glade.textdomain(i18n.APP) | ||||
| 
 | ||||
| screen_w = gtk.gdk.screen_width() | ||||
| screen_h = gtk.gdk.screen_height() | ||||
| 
 | ||||
| gtk_icon_theme = gtk.icon_theme_get_default() | ||||
| gtk_icon_theme.append_search_path(gajim.ICONS_DIR) | ||||
|  | @ -82,6 +62,27 @@ def get_icon_path(icon_name, size=16): | |||
| 	except gobject.GError, e: | ||||
| 		log.error("Unable to find icon %s: %s" % (icon_name, str(e))) | ||||
| 
 | ||||
| import vcard | ||||
| import dialogs | ||||
| 
 | ||||
| 
 | ||||
| HAS_PYWIN32 = True | ||||
| if os.name == 'nt': | ||||
| 	try: | ||||
| 		import win32file | ||||
| 		import win32con | ||||
| 		import pywintypes | ||||
| 	except ImportError: | ||||
| 		HAS_PYWIN32 = False | ||||
| 
 | ||||
| from common import helpers | ||||
| 
 | ||||
| gtk.glade.bindtextdomain(i18n.APP, i18n.DIR) | ||||
| gtk.glade.textdomain(i18n.APP) | ||||
| 
 | ||||
| screen_w = gtk.gdk.screen_width() | ||||
| screen_h = gtk.gdk.screen_height() | ||||
| 
 | ||||
| def add_image_to_menuitem(menuitem, icon_name): | ||||
| 	img = gtk.Image() | ||||
| 	path_img = get_icon_path(icon_name) | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue