gajim.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2026
October
September
August
July
June
May
April
March
February
January
2025
December
November
October
September
August
July
June
May
April
March
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
List overview
Download
Commits
September 2009
----- 2026 -----
October 2026
September 2026
August 2026
July 2026
June 2026
May 2026
April 2026
March 2026
February 2026
January 2026
----- 2025 -----
December 2025
November 2025
October 2025
September 2025
August 2025
July 2025
June 2025
May 2025
April 2025
March 2025
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
commits@gajim.org
5 participants
120 discussions
Start a n
N
ew thread
gajim: coding standards, and other few things
by Thibaut GIRKA
19 Sep '09
19 Sep '09
changeset 2915051a3706 in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=2915051a3706
description: coding standards, and other few things diffstat: src/chat_control.py | 2 +- src/common/jingle.py | 239 +++++++++++++++++++++++------------------------ src/dialogs.py | 6 +- 3 files changed, 122 insertions(+), 125 deletions(-) diffs (truncated from 644 to 300 lines): diff -r 1b82c37f0eef -r 2915051a3706 src/chat_control.py --- a/src/chat_control.py Sat Sep 19 16:35:47 2009 +0200 +++ b/src/chat_control.py Sat Sep 19 17:24:59 2009 +0200 @@ -1775,7 +1775,7 @@ self.set_audio_state('connecting', sid) def on_stop_audio_button_activate(self, *things): - session = gajim.connections[self.account].getJingleSession( + session = gajim.connections[self.account].get_jingle_session( self.contact.get_full_jid(), self.audio_sid) if session: session.end_session() diff -r 1b82c37f0eef -r 2915051a3706 src/common/jingle.py --- a/src/common/jingle.py Sat Sep 19 16:35:47 2009 +0200 +++ b/src/common/jingle.py Sat Sep 19 17:24:59 2009 +0200 @@ -50,7 +50,6 @@ # * handle different kinds of sink and src elements import gajim -import gobject import xmpp import farsight, gst @@ -65,9 +64,9 @@ #FIXME: Move it to JingleSession.States? class JingleStates(object): ''' States in which jingle session may exist. ''' - ended=0 - pending=1 - active=2 + ended = 0 + pending = 1 + active = 2 #FIXME: Move it to JingleTransport.Type? class TransportType(object): @@ -75,9 +74,6 @@ datagram = 1 streaming = 2 -class Error(Exception): pass -class WrongState(Error): pass - class OutOfOrder(Exception): ''' Exception that should be raised when an action is received when in the wrong state. ''' @@ -110,7 +106,7 @@ # callbacks to call on proper contents # use .prepend() to add new callbacks, especially when you're going # to send error instead of ack - self.callbacks={ + self.callbacks = { 'content-accept': [self.__contentAcceptCB, self.__defaultCB], 'content-add': [self.__defaultCB], #TODO 'content-modify': [self.__defaultCB], #TODO @@ -134,39 +130,37 @@ } ''' Interaction with user ''' - def approveSession(self): + def approve_session(self): ''' Called when user accepts session in UI (when we aren't the initiator). ''' self.accepted = True - self.acceptSession() + self.accept_session() - def declineSession(self): + def decline_session(self): ''' Called when user declines session in UI (when we aren't the initiator) ''' reason = xmpp.Node('reason') reason.addChild('decline') - self.__sessionTerminate(reason) + self.__session_terminate(reason) def end_session(self): + ''' Called when user stops or cancel session in UI. ''' reason = xmpp.Node('reason') if self.state == JingleStates.active: reason.addChild('success') else: reason.addChild('cancel') - self.__sessionTerminate(reason) + self.__session_terminate(reason) ''' Middle-level functions to manage contents. Handle local content cache and send change notifications. ''' - def addContent(self, name, content, creator='we'): + def add_content(self, name, content, creator='we'): ''' Add new content to session. If the session is active, this will send proper stanza to update session. The protocol prohibits changing that when pending. Creator must be one of ('we', 'peer', 'initiator', 'responder')''' assert creator in ('we', 'peer', 'initiator', 'responder') - if self.state == JingleStates.pending: - raise WrongState - if (creator == 'we' and self.weinitiate) or (creator == 'peer' and \ not self.weinitiate): creator = 'initiator' @@ -175,47 +169,50 @@ creator = 'responder' content.creator = creator content.name = name - self.contents[(creator,name)] = content + self.contents[(creator, name)] = content if self.state == JingleStates.active: pass # TODO: send proper stanza, shouldn't be needed now - def removeContent(self, creator, name): + def remove_content(self, creator, name): ''' We do not need this now ''' pass - def modifyContent(self, creator, name, *someother): + def modify_content(self, creator, name, *someother): ''' We do not need this now ''' pass - def acceptSession(self): + def accept_session(self): ''' Check if all contents and user agreed to start session. ''' if not self.weinitiate and self.accepted and \ self.state == JingleStates.pending and self.is_ready(): - self.__sessionAccept() + self.__session_accept() def is_ready(self): + ''' Returns True when all codecs and candidates are ready + (for all contents). ''' return all((c.candidates_ready and c.p2psession.get_property('codecs-ready') for c in self.contents.itervalues())) ''' Middle-level function to do stanza exchange. ''' - def startSession(self): + def start_session(self): ''' Start session. ''' #FIXME: Start only once if self.weinitiate and self.state == JingleStates.ended and self.is_ready(): - self.__sessionInitiate() + self.__session_initiate() - def sendSessionInfo(self): pass + def send_session_info(self): + pass - def sendContentAccept(self, content): + def send_content_accept(self, content): assert self.state != JingleStates.ended - stanza, jingle = self.__makeJingle('content-accept') + stanza, jingle = self.__make_jingle('content-accept') jingle.addChild(node=content) self.connection.connection.send(stanza) - def sendTransportInfo(self, content): - assert self.state!=JingleStates.ended - stanza, jingle = self.__makeJingle('transport-info') + def send_transport_info(self, content): + assert self.state != JingleStates.ended + stanza, jingle = self.__make_jingle('transport-info') jingle.addChild(node=content) self.connection.connection.send(stanza) @@ -272,7 +269,7 @@ self.__dispatch_error(xmpp_error, jingle_error, text) #FIXME: Not sure when we would want to do that... if xmpp_error == 'item-not-found': - self.connection.deleteJingle(self) + self.connection.delete_jingle(self) def __transportReplaceCB(self, stanza, jingle, error, action): for content in jingle.iterTags('content'): @@ -286,16 +283,16 @@ #Anyway, content's transport is not modifiable yet pass else: - stanza, jingle = self.__makeJingle('transport-reject') - c = jingle.setTag('content', attrs={'creator': creator, + stanza, jingle = self.__make_jingle('transport-reject') + content = jingle.setTag('content', attrs={'creator': creator, 'name': name}) - c.setTag('transport', namespace=transport_ns) + content.setTag('transport', namespace=transport_ns) self.connection.connection.send(stanza) raise xmpp.NodeProcessed else: #FIXME: This ressource is unknown to us, what should we do? #For now, reject the transport - stanza, jingle = self.__makeJingle('transport-reject') + stanza, jingle = self.__make_jingle('transport-reject') c = jingle.setTag('content', attrs={'creator': creator, 'name': name}) c.setTag('transport', namespace=transport_ns) @@ -317,7 +314,7 @@ if len(self.contents) == 0: reason = xmpp.Node('reason') reason.setTag('success') #FIXME: Is it the good one? - self.__sessionTerminate(reason) + self.__session_terminate(reason) def __sessionAcceptCB(self, stanza, jingle, error, action): if self.state != JingleStates.pending: #FIXME @@ -363,9 +360,9 @@ if tran_ns == xmpp.NS_JINGLE_ICE_UDP: # we've got voip content if media == 'audio': - self.addContent(element['name'], JingleVoIP(self), 'peer') + self.add_content(element['name'], JingleVoIP(self), 'peer') else: - self.addContent(element['name'], JingleVideo(self), 'peer') + self.add_content(element['name'], JingleVideo(self), 'peer') contents.append((media,)) transports_ok = True @@ -375,7 +372,7 @@ reason = xmpp.Node('reason') reason.setTag('unsupported-applications') self.__defaultCB(stanza, jingle, error, action) - self.__sessionTerminate(reason) + self.__session_terminate(reason) raise xmpp.NodeProcessed if not transports_ok: @@ -383,7 +380,7 @@ reason = xmpp.Node('reason') reason.setTag('unsupported-transports') self.__defaultCB(stanza, jingle, error, action) - self.__sessionTerminate(reason) + self.__session_terminate(reason) raise xmpp.NodeProcessed self.state = JingleStates.pending @@ -401,7 +398,7 @@ cn.stanzaCB(stanza, content, error, action) def __sessionTerminateCB(self, stanza, jingle, error, action): - self.connection.deleteJingle(self) + self.connection.delete_jingle(self) reason, text = self.__reason_from_stanza(jingle) if reason not in ('success', 'cancel', 'decline'): self.__dispatch_error(reason, reason, text) @@ -411,6 +408,11 @@ text = reason#TODO self.connection.dispatch('JINGLE_DISCONNECTED', (self.peerjid, self.sid, text)) + def __broadcastAllCB(self, stanza, jingle, error, action): + ''' Broadcast the stanza to all content handlers. ''' + for content in self.contents.itervalues(): + content.stanzaCB(stanza, None, error, action) + def __send_error(self, stanza, error, jingle_error=None, text=None): err = xmpp.Error(stanza, error) err.setNamespace(xmpp.NS_STANZAS) @@ -430,11 +432,6 @@ text = error self.connection.dispatch('JINGLE_ERROR', (self.peerjid, self.sid, text)) - def __broadcastAllCB(self, stanza, jingle, error, action): - ''' Broadcast the stanza to all content handlers. ''' - for content in self.contents.itervalues(): - content.stanzaCB(stanza, None, error, action) - def __reason_from_stanza(self, stanza): reason = 'success' reasons = ['success', 'busy', 'cancel', 'connectivity-error', @@ -453,7 +450,7 @@ ''' Methods that make/send proper pieces of XML. They check if the session is in appropriate state. ''' - def __makeJingle(self, action): + def __make_jingle(self, action): stanza = xmpp.Iq(typ='set', to=xmpp.JID(self.peerjid)) attrs = {'action': action, 'sid': self.sid} @@ -464,46 +461,46 @@ jingle = stanza.addChild('jingle', attrs=attrs, namespace=xmpp.NS_JINGLE) return stanza, jingle - def __appendContent(self, jingle, content): + def __append_content(self, jingle, content): ''' Append <content/> element to <jingle/> element, with (full=True) or without (full=False) <content/> children. ''' jingle.addChild('content', attrs={'name': content.name, 'creator': content.creator}) - def __appendContents(self, jingle): + def __append_contents(self, jingle): ''' Append all <content/> elements to <jingle/>.''' # TODO: integrate with __appendContent? # TODO: parameters 'name', 'content'? for content in self.contents.values(): - self.__appendContent(jingle, content) + self.__append_content(jingle, content) - def __sessionInitiate(self): - assert self.state==JingleStates.ended
1
0
0
0
gajim: merge default branch to jingle
by Thibaut GIRKA
19 Sep '09
19 Sep '09
changeset 1b82c37f0eef in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=1b82c37f0eef
description: merge default branch to jingle diffstat: configure.ac | 2 +- data/glade/service_discovery_window.glade | 45 +- launch.sh | 2 +- src/Makefile.am | 5 + src/chat_control.py | 208 ++++----- src/commands/__init__.py | 20 + src/commands/custom.py | 88 ++++ src/commands/framework.py | 764 ++++++++++++++++++++++++++++++++++ src/commands/implementation.py | 262 +++++++++++ src/commands/middleware.py | 105 ++++ src/common/config.py | 4 +- src/common/connection.py | 15 +- src/common/connection_handlers.py | 15 +- src/common/defs.py | 2 +- src/common/latex.py | 8 +- src/common/optparser.py | 9 + src/common/stanza_session.py | 9 +- src/config.py | 41 +- src/dialogs.py | 3 +- src/disco.py | 6 +- src/gajim.py | 113 +++++- src/groupchat_control.py | 400 +---------------- src/message_window.py | 9 + src/roster_window.py | 142 ++--- src/session.py | 4 + 25 files changed, 1662 insertions(+), 619 deletions(-) diffs (truncated from 3019 to 300 lines): diff -r fbf0a36b11c9 -r 1b82c37f0eef configure.ac --- a/configure.ac Fri Sep 18 20:17:35 2009 +0200 +++ b/configure.ac Sat Sep 19 16:35:47 2009 +0200 @@ -1,5 +1,5 @@ AC_INIT([Gajim - A Jabber Instant Messager], - [
0.12.5.1-dev],[http://trac.gajim.org/],[gajim
]) + [
0.12.5.2-dev],[http://trac.gajim.org/],[gajim
]) AC_PREREQ([2.59]) AC_CONFIG_HEADER(config.h) diff -r fbf0a36b11c9 -r 1b82c37f0eef data/glade/service_discovery_window.glade --- a/data/glade/service_discovery_window.glade Fri Sep 18 20:17:35 2009 +0200 +++ b/data/glade/service_discovery_window.glade Sat Sep 19 16:35:47 2009 +0200 @@ -1,11 +1,11 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd"> -<!--*- mode: xml -*--> +<?xml version="1.0"?> <glade-interface> + <!-- interface-requires gtk+ 2.14 --> + <!-- interface-naming-policy toplevel-contextual --> <widget class="GtkWindow" id="service_discovery_window"> <property name="border_width">6</property> <property name="role">Service Discovery</property> - <property name="default_width">450</property> + <property name="default_width">550</property> <property name="default_height">420</property> <signal name="destroy" handler="on_service_discovery_window_destroy"/> <child> @@ -28,6 +28,9 @@ Agent JID - node</property> <property name="use_markup">True</property> </widget> + <packing> + <property name="position">0</property> + </packing> </child> <child> <widget class="GtkImage" id="banner_agent_icon"> @@ -47,6 +50,7 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> + <property name="position">0</property> </packing> </child> <child> @@ -56,21 +60,11 @@ <property name="n_columns">3</property> <property name="column_spacing">6</property> <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> <widget class="GtkComboBoxEntry" id="address_comboboxentry"> <property name="visible">True</property> <property name="items" translatable="yes"></property> <signal name="changed" handler="on_address_comboboxentry_changed"/> <signal name="key_press_event" handler="on_address_comboboxentry_key_press_event"/> - <child internal-child="entry"> - <widget class="GtkEntry" id="comboboxentry-entry1"> - </widget> - </child> </widget> <packing> <property name="left_attach">1</property> @@ -86,7 +80,7 @@ <property name="can_focus">True</property> <property name="can_default">True</property> <property name="has_default">True</property> - <property name="response_id">0</property> + <property name="receives_default">False</property> <signal name="clicked" handler="on_go_button_clicked"/> <child> <widget class="GtkAlignment" id="alignment93"> @@ -105,6 +99,7 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> + <property name="position">0</property> </packing> </child> <child> @@ -145,6 +140,12 @@ <property name="y_options"></property> </packing> </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> </widget> <packing> <property name="expand">False</property> @@ -155,9 +156,9 @@ <widget class="GtkScrolledWindow" id="services_scrollwin"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <property name="shadow_type">etched-in</property> <child> <widget class="GtkTreeView" id="services_treeview"> <property name="visible">True</property> @@ -184,6 +185,7 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> + <property name="position">0</property> </packing> </child> <child> @@ -200,19 +202,20 @@ <property name="spacing">6</property> <child> <widget class="GtkButton" id="close_button"> + <property name="label">gtk-close</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="has_focus">True</property> <property name="can_default">True</property> - <property name="label">gtk-close</property> + <property name="receives_default">False</property> <property name="use_stock">True</property> - <property name="response_id">0</property> <signal name="clicked" handler="on_close_button_clicked"/> </widget> <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="pack_type">GTK_PACK_END</property> + <property name="pack_type">end</property> + <property name="position">0</property> </packing> </child> </widget> diff -r fbf0a36b11c9 -r 1b82c37f0eef launch.sh --- a/launch.sh Fri Sep 18 20:17:35 2009 +0200 +++ b/launch.sh Sat Sep 19 16:35:47 2009 +0200 @@ -1,3 +1,3 @@ #!/bin/sh cd "$(dirname $0)/src" -exec python -OOt gajim.py $@ +exec python -Ot gajim.py $@ diff -r fbf0a36b11c9 -r 1b82c37f0eef src/Makefile.am --- a/src/Makefile.am Fri Sep 18 20:17:35 2009 +0200 +++ b/src/Makefile.am Sat Sep 19 16:35:47 2009 +0200 @@ -41,12 +41,17 @@ gajimsrc3_PYTHON = \ $(srcdir)/common/zeroconf/*.py +gajimsrc4dir = $(pkgdatadir)/src/commands +gajimsrc4_PYTHON = \ + $(srcdir)/commands/*.py + DISTCLEANFILES = EXTRA_DIST = $(gajimsrc_PYTHON) \ $(gajimsrc1_PYTHON) \ $(gajimsrc2_PYTHON) \ $(gajimsrc3_PYTHON) \ + $(gajimsrc4_PYTHON) \ eggtrayicon.c \ trayiconmodule.c \ eggtrayicon.h \ diff -r fbf0a36b11c9 -r 1b82c37f0eef src/chat_control.py --- a/src/chat_control.py Fri Sep 18 20:17:35 2009 +0200 +++ b/src/chat_control.py Sat Sep 19 16:35:47 2009 +0200 @@ -52,6 +52,8 @@ from common.xmpp.protocol import NS_RECEIPTS, NS_ESESSION from common.xmpp.protocol import NS_JINGLE_RTP_AUDIO +from commands.implementation import CommonCommands, ChatCommands + try: import gtkspell HAS_GTK_SPELL = True @@ -75,11 +77,15 @@ spell.set_language(langs[lang]) except OSError: del langs[lang] + if spell: + spell.detach() + del tv ################################################################################ -class ChatControlBase(MessageControl): +class ChatControlBase(MessageControl, CommonCommands): '''A base class containing a banner, ConversationTextview, MessageTextView ''' + def make_href(self, match): url_color = gajim.config.get('urlmsgcolor') return '<a href="%s"><span color="%s">%s</span></a>' % (match.group(), @@ -146,7 +152,54 @@ event_keymod): # Derived should implement this rather than connecting to the event # itself. - pass + + event = gtk.gdk.Event(gtk.gdk.KEY_PRESS) + event.keyval = event_keyval + event.state = event_keymod + event.time = 0 + + buffer = widget.get_buffer() + start, end = buffer.get_bounds() + + if event.keyval -- gtk.keysyms.Tab: + position = buffer.get_insert() + end = buffer.get_iter_at_mark(position) + + text = buffer.get_text(start, end, False) + text = text.decode('utf8') + + splitted = text.split() + + if (text.startswith(self.COMMAND_PREFIX) and not + text.startswith(self.COMMAND_PREFIX * 2) and len(splitted) == 1): + + text = splitted[0] + bare = text.lstrip(self.COMMAND_PREFIX) + + if len(text) == 1: + self.command_hits = [] + for command in self.list_commands(): + for name in command.names: + self.command_hits.append(name) + else: + if (self.last_key_tabs and self.command_hits and + self.command_hits[0].startswith(bare)): + self.command_hits.append(self.command_hits.pop(0)) + else: + self.command_hits = [] + for command in self.list_commands(): + for name in command.names: + if name.startswith(bare): + self.command_hits.append(name) + + if self.command_hits: + buffer.delete(start, end) + buffer.insert_at_cursor(self.COMMAND_PREFIX + self.command_hits[0] + ' ') + self.last_key_tabs = True + + return True + + self.last_key_tabs = False def status_url_clicked(self, widget, url): helpers.launch_browser_mailer('url', url) @@ -303,6 +356,9 @@ self.smooth = True self.msg_textview.grab_focus() + self.command_hits = [] + self.last_key_tabs = False + def set_speller(self): # now set the one the user selected per_type = 'contacts' @@ -604,45 +660,27 @@ self.drag_entered_conv = True self.conv_textview.tv.set_editable(True) - def _process_command(self, message): - if not message or message[0] != '/': - return False - - message = message[1:] - message_array = message.split(' ', 1) - command = message_array.pop(0).lower() - if message_array == ['']: - message_array = [] - - if command == 'clear' and not len(message_array): - self.conv_textview.clear() # clear conversation - self.clear(self.msg_textview) # clear message textview too - return True - elif message == 'compact' and not len(message_array): - self.chat_buttons_set_visible(not self.hide_chat_buttons) - self.clear(self.msg_textview) - return True - return False - def send_message(self, message, keyID='', type_='chat', chatstate=None, - msg_id=None, composing_xep=None, resource=None, process_command=True, - xhtml=None, callback=None, callback_args=[]): + msg_id=None, composing_xep=None, resource=None, + xhtml=None, callback=None, callback_args=[], process_commands=True): '''Send the given message to the active tab. Doesn't return None if error ''' if not message or message == '\n':
1
0
0
0
gajim: fix some erros from my last commit, fix conditions for se...
by Thibaut GIRKA
18 Sep '09
18 Sep '09
changeset fbf0a36b11c9 in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=fbf0a36b11c9
description: fix some erros from my last commit, fix conditions for session initating and acceptance diffstat: src/chat_control.py | 5 +++-- src/common/jingle.py | 34 +++++++++++++++++++--------------- 2 files changed, 22 insertions(+), 17 deletions(-) diffs (131 lines): diff -r 11edf190084a -r fbf0a36b11c9 src/chat_control.py --- a/src/chat_control.py Thu Sep 17 23:36:26 2009 +0200 +++ b/src/chat_control.py Fri Sep 18 20:17:35 2009 +0200 @@ -1478,7 +1478,9 @@ if self.audio_state in (self.AUDIO_STATE_NOT_AVAILABLE, self.AUDIO_STATE_AVAILABLE): self._audio_image.hide() - elif self.audio_state == self.AUDIO_STATE_CONNECTING: + else: + self._audio_image.show() + if 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: self._audio_image.set_from_stock(gtk.STOCK_NETWORK, 1) @@ -1486,7 +1488,6 @@ self._audio_image.set_from_stock(gtk.STOCK_CONNECT, 1) 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): diff -r 11edf190084a -r fbf0a36b11c9 src/common/jingle.py --- a/src/common/jingle.py Thu Sep 17 23:36:26 2009 +0200 +++ b/src/common/jingle.py Fri Sep 18 20:17:35 2009 +0200 @@ -30,16 +30,17 @@ # * XEP 0177 (raw udp) # * UI: -# - hang up button! # - make state and codec informations available to the user +# - video integration # * config: # - codecs # - STUN + # * DONE: figure out why it doesn't work with pidgin: # That's a bug in pidgin:
http://xmpp.org/extensions/xep-0176.html#protocol-checks
+ # * destroy sessions when user is unavailable, see handle_event_notify? # * timeout -# * video # * security (see XEP 0166) # * split this file in several modules @@ -190,16 +191,18 @@ def acceptSession(self): ''' Check if all contents and user agreed to start session. ''' if not self.weinitiate and self.accepted and \ - all((i.candidates_ready for i in self.contents.itervalues())) and \ - all((i.p2psession.get_property('codecs-ready') for i in self.contents.itervalues())): + self.state == JingleStates.pending and self.is_ready(): self.__sessionAccept() + def is_ready(self): + return all((c.candidates_ready and c.p2psession.get_property('codecs-ready') + for c in self.contents.itervalues())) + ''' Middle-level function to do stanza exchange. ''' def startSession(self): ''' Start session. ''' - if self.weinitiate and \ - all((i.candidates_ready for i in self.contents.itervalues())) and \ - all((i.p2psession.get_property('codecs-ready') for i in self.contents.itervalues())): + #FIXME: Start only once + if self.weinitiate and self.state == JingleStates.ended and self.is_ready(): self.__sessionInitiate() def sendSessionInfo(self): pass @@ -230,11 +233,11 @@ # it's a jingle action action = jingle.getAttr('action') if action not in self.callbacks: - self.__send_error('bad_request') + self.__send_error(stanza, 'bad_request') return #FIXME: If we aren't initiated and it's not a session-initiate... if action != 'session-initiate' and self.state == JingleStates.ended: - self.__send_error('item-not-found', 'unknown-session') + self.__send_error(stanza, 'item-not-found', 'unknown-session') return else: # it's an iq-result (ack) stanza @@ -248,7 +251,7 @@ except xmpp.NodeProcessed: pass except OutOfOrder: - self.__send_error('unexpected-request', 'out-of-order')#FIXME + self.__send_error(stanza, 'unexpected-request', 'out-of-order')#FIXME def __defaultCB(self, stanza, jingle, error, action): ''' Default callback for action stanzas -- simple ack @@ -267,8 +270,9 @@ elif child.getNamespace() == xmpp.NS_STANZAS: xmpp_error = child.getName() self.__dispatch_error(xmpp_error, jingle_error, text) - #FIXME: Not sure if we would want to do that... not yet... - #self.connection.deleteJingle(self) + #FIXME: Not sure when we would want to do that... + if xmpp_error == 'item-not-found': + self.connection.deleteJingle(self) def __transportReplaceCB(self, stanza, jingle, error, action): for content in jingle.iterTags('content'): @@ -301,7 +305,7 @@ def __sessionInfoCB(self, stanza, jingle, error, action): payload = jingle.getPayload() if len(payload) > 0: - self.__send_error('feature-not-implemented', 'unsupported-info') + self.__send_error(stanza, 'feature-not-implemented', 'unsupported-info') raise xmpp.NodeProcessed def __contentRemoveCB(self, stanza, jingle, error, action): @@ -417,7 +421,7 @@ self.connection.connection.send(err) self.__dispatch_error(error, jingle_error, text) - def __dispatch_error(error, jingle_error=None, text=None): + def __dispatch_error(self, error, jingle_error=None, text=None): if jingle_error: error = jingle_error if text: @@ -863,7 +867,7 @@ # sometimes it'll freeze... JingleRTPContent.setupStream(self) # the local parts - src_vid = gst.element_factory_make('videotestsrc') + src_vid = gst.element_factory_make('v4l2src') videoscale = gst.element_factory_make('videoscale') caps = gst.element_factory_make('capsfilter') caps.set_property('caps', gst.caps_from_string('video/x-raw-yuv, width=320, height=240'))
1
0
0
0
gajim: Gajim's build system is a little bit funky. Fixes 5274
by red-agent
18 Sep '09
18 Sep '09
changeset a2021b65ddac in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=a2021b65ddac
description: Gajim's build system is a little bit funky. Fixes 5274 diffstat: src/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff -r 8cd3e447cf49 -r a2021b65ddac src/Makefile.am --- a/src/Makefile.am Fri Sep 18 17:32:27 2009 +0300 +++ b/src/Makefile.am Fri Sep 18 18:45:08 2009 +0300 @@ -41,7 +41,7 @@ gajimsrc3_PYTHON = \ $(srcdir)/common/zeroconf/*.py -gajimsrc4dir = $(pkglibdir)/src/commands +gajimsrc4dir = $(pkgdatadir)/src/commands gajimsrc4_PYTHON = \ $(srcdir)/commands/*.py
1
0
0
0
gajim: Added the new command system to the build system
by red-agent
18 Sep '09
18 Sep '09
changeset 8cd3e447cf49 in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=8cd3e447cf49
description: Added the new command system to the build system diffstat: src/Makefile.am | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diffs (21 lines): diff -r f2074e45932d -r 8cd3e447cf49 src/Makefile.am --- a/src/Makefile.am Thu Sep 17 23:22:48 2009 +0300 +++ b/src/Makefile.am Fri Sep 18 17:32:27 2009 +0300 @@ -41,12 +41,17 @@ gajimsrc3_PYTHON = \ $(srcdir)/common/zeroconf/*.py +gajimsrc4dir = $(pkglibdir)/src/commands +gajimsrc4_PYTHON = \ + $(srcdir)/commands/*.py + DISTCLEANFILES = EXTRA_DIST = $(gajimsrc_PYTHON) \ $(gajimsrc1_PYTHON) \ $(gajimsrc2_PYTHON) \ $(gajimsrc3_PYTHON) \ + $(gajimsrc4_PYTHON) \ eggtrayicon.c \ trayiconmodule.c \ eggtrayicon.h \
1
0
0
0
gajim: send messages to the gui, wait for codecs, and other things
by Thibaut GIRKA
17 Sep '09
17 Sep '09
changeset 11edf190084a in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=11edf190084a
description: send messages to the gui, wait for codecs, and other things JingleSession now sends messages about errors or session terminating to the GUI. Another thing is that it'll wait for all transports candidates and all codecs to be ready before starting or accepting a session. This is required by video, which is only missing a GUI. :) diffstat: src/chat_control.py | 1 - src/common/jingle.py | 110 ++++++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 88 insertions(+), 23 deletions(-) diffs (263 lines): diff -r 4ffe25482e8c -r 11edf190084a src/chat_control.py --- a/src/chat_control.py Thu Sep 17 22:21:06 2009 +0200 +++ b/src/chat_control.py Thu Sep 17 23:36:26 2009 +0200 @@ -1478,7 +1478,6 @@ 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_CONNECTING: self._audio_image.set_from_stock(gtk.STOCK_CONVERT, 1) elif self.audio_state == self.AUDIO_STATE_CONNECTION_RECEIVED: diff -r 4ffe25482e8c -r 11edf190084a src/common/jingle.py --- a/src/common/jingle.py Thu Sep 17 22:21:06 2009 +0200 +++ b/src/common/jingle.py Thu Sep 17 23:36:26 2009 +0200 @@ -105,7 +105,6 @@ self.sid = sid # sessionid self.accepted = True # is this session accepted by user - self.candidates_ready = False # True when local candidates are prepared # callbacks to call on proper contents # use .prepend() to add new callbacks, especially when you're going @@ -130,7 +129,7 @@ 'transport-accept': [self.__defaultCB], #TODO 'transport-reject': [self.__defaultCB], #TODO 'iq-result': [], - 'iq-error': [], + 'iq-error': [self.__errorCB], } ''' Interaction with user ''' @@ -152,7 +151,7 @@ if self.state == JingleStates.active: reason.addChild('success') else: - reason.addChild('abort') + reason.addChild('cancel') self.__sessionTerminate(reason) ''' Middle-level functions to manage contents. Handle local content @@ -190,13 +189,17 @@ def acceptSession(self): ''' Check if all contents and user agreed to start session. ''' - if not self.weinitiate and self.accepted and self.candidates_ready: + if not self.weinitiate and self.accepted and \ + all((i.candidates_ready for i in self.contents.itervalues())) and \ + all((i.p2psession.get_property('codecs-ready') for i in self.contents.itervalues())): self.__sessionAccept() ''' Middle-level function to do stanza exchange. ''' def startSession(self): ''' Start session. ''' - if self.weinitiate and self.candidates_ready: + if self.weinitiate and \ + all((i.candidates_ready for i in self.contents.itervalues())) and \ + all((i.p2psession.get_property('codecs-ready') for i in self.contents.itervalues())): self.__sessionInitiate() def sendSessionInfo(self): pass @@ -227,15 +230,11 @@ # it's a jingle action action = jingle.getAttr('action') if action not in self.callbacks: - err = xmpp.Error(stanza, xmpp.NS_STANZAS + ' bad_request') - self.connection.connection.send(err) + self.__send_error('bad_request') return #FIXME: If we aren't initiated and it's not a session-initiate... if action != 'session-initiate' and self.state == JingleStates.ended: - err = xmpp.Error(stanza, xmpp.NS_STANZAS + ' item-not-found') - err.setTag('unknown-session', namespace=xmpp.NS_JINGLE_ERRORS) - self.connection.connection.send(err) - self.connection.deleteJingle(self) + self.__send_error('item-not-found', 'unknown-session') return else: # it's an iq-result (ack) stanza @@ -249,9 +248,7 @@ except xmpp.NodeProcessed: pass except OutOfOrder: - err = xmpp.Error(stanza, xmpp.NS_STANZAS + ' unexpected-request') - err.setTag('out-of-order', namespace=xmpp.NS_JINGLE_ERRORS) - self.connection.connection.send(err) + self.__send_error('unexpected-request', 'out-of-order')#FIXME def __defaultCB(self, stanza, jingle, error, action): ''' Default callback for action stanzas -- simple ack @@ -259,6 +256,20 @@ response = stanza.buildReply('result') self.connection.connection.send(response) + def __errorCB(self, stanza, jingle, error, action): + #FIXME + text = error.getTagData('text') + jingle_error = None + xmpp_error = None + for child in error.getChildren(): + if child.getNamespace() == xmpp.NS_JINGLE_ERRORS: + jingle_error = child.getName() + elif child.getNamespace() == xmpp.NS_STANZAS: + xmpp_error = child.getName() + self.__dispatch_error(xmpp_error, jingle_error, text) + #FIXME: Not sure if we would want to do that... not yet... + #self.connection.deleteJingle(self) + def __transportReplaceCB(self, stanza, jingle, error, action): for content in jingle.iterTags('content'): creator = content['creator'] @@ -290,9 +301,7 @@ def __sessionInfoCB(self, stanza, jingle, error, action): payload = jingle.getPayload() if len(payload) > 0: - err = xmpp.Error(stanza, xmpp.NS_STANZAS + ' feature-not-implemented') - err.setTag('unsupported-info', namespace=xmpp.NS_JINGLE_ERRORS) - self.connection.connection.send(err) + self.__send_error('feature-not-implemented', 'unsupported-info') raise xmpp.NodeProcessed def __contentRemoveCB(self, stanza, jingle, error, action): @@ -309,6 +318,7 @@ def __sessionAcceptCB(self, stanza, jingle, error, action): if self.state != JingleStates.pending: #FIXME raise OutOfOrder + self.state = JingleStates.active def __contentAcceptCB(self, stanza, jingle, error, action): ''' Called when we get content-accept stanza or equivalent one @@ -388,13 +398,55 @@ def __sessionTerminateCB(self, stanza, jingle, error, action): self.connection.deleteJingle(self) - self.connection.dispatch('JINGLE_DISCONNECTED', (self.peerjid, self.sid)) + reason, text = self.__reason_from_stanza(jingle) + if reason not in ('success', 'cancel', 'decline'): + self.__dispatch_error(reason, reason, text) + if text: + text = '%s (%s)' % (reason, text) + else: + text = reason#TODO + self.connection.dispatch('JINGLE_DISCONNECTED', (self.peerjid, self.sid, text)) + + def __send_error(self, stanza, error, jingle_error=None, text=None): + err = xmpp.Error(stanza, error) + err.setNamespace(xmpp.NS_STANZAS) + if jingle_error: + err.setTag(jingle_error, namespace=xmpp.NS_JINGLE_ERRORS) + if text: + err.setTagData('text', text) + self.connection.connection.send(err) + self.__dispatch_error(error, jingle_error, text) + + def __dispatch_error(error, jingle_error=None, text=None): + if jingle_error: + error = jingle_error + if text: + text = '%s (%s)' % (error, text) + else: + text = error + self.connection.dispatch('JINGLE_ERROR', (self.peerjid, self.sid, text)) def __broadcastAllCB(self, stanza, jingle, error, action): ''' Broadcast the stanza to all content handlers. ''' for content in self.contents.itervalues(): content.stanzaCB(stanza, None, error, action) + def __reason_from_stanza(self, stanza): + reason = 'success' + reasons = ['success', 'busy', 'cancel', 'connectivity-error', + 'decline', 'expired', 'failed-application', 'failed-transport', + 'general-error', 'gone', 'incompatible-parameters', 'media-error', + 'security-error', 'timeout', 'unsupported-applications', + 'unsupported-transports'] + tag = stanza.getTag('reason') + if tag: + text = tag.getTagData('text') + for r in reasons: + if tag.getTag(r): + reason = r + break + return (reason, text) + ''' Methods that make/send proper pieces of XML. They check if the session is in appropriate state. ''' def __makeJingle(self, action): @@ -436,7 +488,7 @@ self.__appendContents(jingle) self.__broadcastCB(stanza, jingle, None, 'session-accept-sent') self.connection.connection.send(stanza) - self.state=JingleStates.active + self.state = JingleStates.active def __sessionInfo(self, payload=None): assert self.state != JingleStates.ended @@ -452,6 +504,14 @@ jingle.addChild(node=reason) self.__broadcastAllCB(stanza, jingle, None, 'session-terminate-sent') self.connection.connection.send(stanza) + reason, text = self.__reason_from_stanza(jingle) + if reason not in ('success', 'cancel', 'decline'): + self.__dispatch_error(reason, reason, text) + if text: + text = '%s (%s)' % (reason, text) + else: + text = reason + self.connection.dispatch('JINGLE_DISCONNECTED', (self.peerjid, self.sid, text)) self.connection.deleteJingle(self) def __contentAdd(self): @@ -618,6 +678,8 @@ 'video': farsight.MEDIA_TYPE_VIDEO}[media] self.got_codecs = False + self.candidates_ready = False # True when local candidates are prepared + self.callbacks['content-accept'] += [self.__getRemoteCodecsCB] self.callbacks['session-accept'] += [self.__getRemoteCodecsCB] self.callbacks['session-initiate'] += [self.__getRemoteCodecsCB] @@ -658,14 +720,17 @@ pass elif name == 'farsight-recv-codecs-changed': pass + elif name == 'farsight-codecs-changed': + self.session.acceptSession() + self.session.startSession() elif name == 'farsight-local-candidates-prepared': - self.session.candidates_ready = True + self.candidates_ready = True self.session.acceptSession() self.session.startSession() elif name == 'farsight-new-local-candidate': candidate = message.structure['candidate'] self.candidates.append(candidate) - if self.session.candidates_ready: + if self.candidates_ready: #FIXME: Is this case even possible? self.send_candidate(candidate) elif name == 'farsight-component-state-changed': @@ -734,7 +799,6 @@ over an ICE UDP protocol. ''' def __init__(self, session, node=None): JingleRTPContent.__init__(self, session, 'audio', node) - self.setupStream() @@ -786,6 +850,7 @@ # The following is needed for farsight to process ICE requests: self.pipeline.set_state(gst.STATE_PLAYING) + class JingleVideo(JingleRTPContent): def __init__(self, session, node=None): JingleRTPContent.__init__(self, session, 'video', node) @@ -824,6 +889,7 @@ # The following is needed for farsight to process ICE requests: self.pipeline.set_state(gst.STATE_PLAYING) + class ConnectionJingle(object): ''' This object depends on that it is a part of Connection class. ''' def __init__(self):
1
0
0
0
gajim: Merge the new command system in
by red-agent
17 Sep '09
17 Sep '09
changeset f2074e45932d in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=f2074e45932d
description: Merge the new command system in diffstat: configure.ac | 2 +- src/chat_control.py | 20 ++++++++++++++++++++ src/common/config.py | 2 +- src/common/connection_handlers.py | 7 ++++--- src/common/defs.py | 2 +- src/common/latex.py | 8 +++++++- src/common/optparser.py | 9 +++++++++ src/config.py | 41 ++++++++++++++++++++++++++++++++++++----- src/dialogs.py | 3 ++- src/gajim.py | 19 +++++++++++++++++++ src/message_window.py | 9 +++++++++ src/session.py | 4 ++-- 12 files changed, 111 insertions(+), 15 deletions(-) diffs (truncated from 375 to 300 lines): diff -r 5c7d35a996fa -r f2074e45932d configure.ac --- a/configure.ac Thu Sep 17 19:06:38 2009 +0300 +++ b/configure.ac Thu Sep 17 23:22:48 2009 +0300 @@ -1,5 +1,5 @@ AC_INIT([Gajim - A Jabber Instant Messager], - [
0.12.5.1-dev],[http://trac.gajim.org/],[gajim
]) + [
0.12.5.2-dev],[http://trac.gajim.org/],[gajim
]) AC_PREREQ([2.59]) AC_CONFIG_HEADER(config.h) diff -r 5c7d35a996fa -r f2074e45932d src/chat_control.py --- a/src/chat_control.py Thu Sep 17 19:06:38 2009 +0300 +++ b/src/chat_control.py Thu Sep 17 23:22:48 2009 +0300 @@ -76,6 +76,9 @@ spell.set_language(langs[lang]) except OSError: del langs[lang] + if spell: + spell.detach() + del tv ################################################################################ class ChatControlBase(MessageControl, CommonCommands): @@ -1469,6 +1472,19 @@ else: self._tune_image.hide() + def change_resource(self, resource): + old_full_jid = self.get_full_jid() + self.resource = resource + new_full_jid = self.get_full_jid() + # update gajim.last_message_time + if old_full_jid in gajim.last_message_time[self.account]: + gajim.last_message_time[self.account][new_full_jid] = \ + gajim.last_message_time[self.account][old_full_jid] + # update events + gajim.events.change_jid(self.account, old_full_jid, new_full_jid) + # update MessageWindow._controls + self.parent_win.change_jid(self.account, old_full_jid, new_full_jid) + def on_avatar_eventbox_enter_notify_event(self, widget, event): ''' we enter the eventbox area so we under conditions add a timeout @@ -2299,6 +2315,10 @@ self.handlers[i].disconnect(i) del self.handlers[i] self.conv_textview.del_handlers() + if gajim.config.get('use_speller') and HAS_GTK_SPELL: + spell_obj = gtkspell.get_from_text_view(self.msg_textview) + if spell_obj: + spell_obj.detach() self.msg_textview.destroy() def minimizable(self): diff -r 5c7d35a996fa -r f2074e45932d src/common/config.py --- a/src/common/config.py Thu Sep 17 19:06:38 2009 +0300 +++ b/src/common/config.py Thu Sep 17 23:22:48 2009 +0300 @@ -67,7 +67,6 @@ __options = { # name: [ type, default_value, help_string ] 'verbose': [ opt_bool, False, '', True ], - 'alwaysauth': [ opt_bool, False ], 'autopopup': [ opt_bool, False ], 'notify_on_signin': [ opt_bool, True ], 'notify_on_signout': [ opt_bool, False ], @@ -287,6 +286,7 @@ 'autoconnect_as': [ opt_str, 'online', _('Status used to autoconnect as. Can be online, chat, away, xa, dnd, invisible. NOTE: this option is used only if restore_last_status is disabled'), True ], 'restore_last_status': [ opt_bool, False, _('If enabled, restore the last status that was used.') ], 'autoreconnect': [ opt_bool, True ], + 'autoauth': [ opt_bool, False, _('If True, Contacts requesting authorization will be automatically accepted.')], 'active': [ opt_bool, True], 'proxy': [ opt_str, '', '', True ], 'keyid': [ opt_str, '', '', True ], diff -r 5c7d35a996fa -r f2074e45932d src/common/connection_handlers.py --- a/src/common/connection_handlers.py Thu Sep 17 19:06:38 2009 +0300 +++ b/src/common/connection_handlers.py Thu Sep 17 23:22:48 2009 +0300 @@ -2353,13 +2353,14 @@ if ptype == 'subscribe': log.debug('subscribe request from %s' % who) - if gajim.config.get('alwaysauth') or who.find("@") <= 0 or \ - jid_stripped in self.jids_for_auto_auth or transport_auto_auth: + if gajim.config.get_per('accounts', self.name, 'autoauth') or \ + who.find('@') <= 0 or jid_stripped in self.jids_for_auto_auth or \ + transport_auto_auth: if self.connection: p = common.xmpp.Presence(who, 'subscribed') p = self.add_sha(p) self.connection.send(p) - if who.find("@") <= 0 or transport_auto_auth: + if who.find('@') <= 0 or transport_auto_auth: self.dispatch('NOTIFY', (jid_stripped, 'offline', 'offline', resource, prio, keyID, timestamp, None)) if transport_auto_auth: diff -r 5c7d35a996fa -r f2074e45932d src/common/defs.py --- a/src/common/defs.py Thu Sep 17 19:06:38 2009 +0300 +++ b/src/common/defs.py Thu Sep 17 23:22:48 2009 +0300 @@ -27,7 +27,7 @@ datadir = '../' localedir = '../po' -version = '0.12.5.1-dev' +version = '0.12.5.2-dev' import sys, os.path for base in ('.', 'common'): diff -r 5c7d35a996fa -r f2074e45932d src/common/latex.py --- a/src/common/latex.py Thu Sep 17 19:06:38 2009 +0300 +++ b/src/common/latex.py Thu Sep 17 23:22:48 2009 +0300 @@ -114,6 +114,12 @@ result = None exitcode = 0 + try: + bg_str, fg_str = gajim.interface.get_bg_fg_colors() + except: + # interface may not be available when we test latext at startup + bg_str, fg_str = 'rgb 1.0 1.0 1.0', 'rgb 0.0 0.0 0.0' + # filter latex code with bad commands if check_blacklist(str_): # we triggered the blacklist, immediately return None @@ -131,7 +137,7 @@ if exitcode == 0: # convert dvi to png latex_png_dpi = gajim.config.get('latex_png_dpi') - exitcode = try_run(['dvipng', '-bg', 'rgb 1.0 1.0 1.0', '-T', + exitcode = try_run(['dvipng', '-bg', bg_str, '-fg', fg_str, '-T', 'tight', '-D', latex_png_dpi, tmpfile + '.dvi', '-o', tmpfile + '.png']) diff -r 5c7d35a996fa -r f2074e45932d src/common/optparser.py --- a/src/common/optparser.py Thu Sep 17 19:06:38 2009 +0300 +++ b/src/common/optparser.py Thu Sep 17 23:22:48 2009 +0300 @@ -202,6 +202,8 @@ self.update_config_to_01231() if old < [0, 12, 5, 1] and new >= [0, 12, 5, 1]: self.update_config_to_01251() + if old < [0, 12, 5, 2] and new >= [0, 12, 5, 2]: + self.update_config_to_01252() gajim.logger.init_vars() gajim.config.set('version', new_version) @@ -727,4 +729,11 @@ con.close() gajim.config.set('version', '0.12.5.1') + def update_config_to_01252(self): + if 'alwaysauth' in self.old_values: + val = self.old_values['alwaysauth'] + for account in gajim.config.get_per('accounts'): + gajim.config.set_per('accounts', account, 'autoauth', val) + gajim.config.set('version', '0.12.5.2') + # vim: se ts=3: diff -r 5c7d35a996fa -r f2074e45932d src/config.py --- a/src/config.py Thu Sep 17 19:06:38 2009 +0300 +++ b/src/config.py Thu Sep 17 23:22:48 2009 +0300 @@ -1077,6 +1077,7 @@ self.proxytype_combobox = self.xml.get_widget('proxytype_combobox') self.init_list() + self.block_signal = False self.xml.signal_autoconnect(self) self.window.show_all() # hide the BOSH fields by default @@ -1134,6 +1135,7 @@ iter_ = model.append() model.set(iter_, 0, 'proxy' + unicode(i)) gajim.config.add_per('proxies', 'proxy' + unicode(i)) + self.proxies_treeview.set_cursor(model.get_path(iter_)) def on_remove_proxy_button_clicked(self, widget): (model, iter_) = self.proxies_treeview.get_selection().get_selected() @@ -1143,11 +1145,16 @@ model.remove(iter_) gajim.config.del_per('proxies', proxy) self.xml.get_widget('remove_proxy_button').set_sensitive(False) + self.block_signal = True + self.on_proxies_treeview_cursor_changed(self.proxies_treeview) + self.block_signal = False def on_close_button_clicked(self, widget): self.window.destroy() def on_useauth_checkbutton_toggled(self, widget): + if self.block_signal: + return act = widget.get_active() proxy = self.proxyname_entry.get_text().decode('utf-8') gajim.config.set_per('proxies', proxy, 'useauth', act) @@ -1155,6 +1162,8 @@ self.xml.get_widget('proxypass_entry').set_sensitive(act) def on_boshuseproxy_checkbutton_toggled(self, widget): + if self.block_signal: + return act = widget.get_active() proxy = self.proxyname_entry.get_text().decode('utf-8') gajim.config.set_per('proxies', proxy, 'bosh_useproxy', act) @@ -1164,11 +1173,6 @@ def on_proxies_treeview_cursor_changed(self, widget): #FIXME: check if off proxy settings are correct (see #
http://trac.gajim.org/changeset/1921#file2
line 1221 - (model, iter_) = widget.get_selection().get_selected() - if not iter_: - return - proxy = model[iter_][0] - self.xml.get_widget('proxyname_entry').set_text(proxy) proxyhost_entry = self.xml.get_widget('proxyhost_entry') proxyport_entry = self.xml.get_widget('proxyport_entry') proxyuser_entry = self.xml.get_widget('proxyuser_entry') @@ -1176,6 +1180,7 @@ boshuri_entry = self.xml.get_widget('boshuri_entry') useauth_checkbutton = self.xml.get_widget('useauth_checkbutton') boshuseproxy_checkbutton = self.xml.get_widget('boshuseproxy_checkbutton') + self.block_signal = True proxyhost_entry.set_text('') proxyport_entry.set_text('') proxyuser_entry.set_text('') @@ -1188,6 +1193,17 @@ #useauth_checkbutton.set_active(False) #self.on_useauth_checkbutton_toggled(useauth_checkbutton) + (model, iter_) = widget.get_selection().get_selected() + if not iter_: + self.xml.get_widget('proxyname_entry').set_text('') + self.xml.get_widget('proxytype_combobox').set_sensitive(False) + self.xml.get_widget('proxy_table').set_sensitive(False) + self.block_signal = False + return + + proxy = model[iter_][0] + self.xml.get_widget('proxyname_entry').set_text(proxy) + if proxy == _('None'): # special proxy None self.show_bosh_fields(False) self.proxyname_entry.set_editable(False) @@ -1219,12 +1235,15 @@ gajim.config.get_per('proxies', proxy, 'bosh_useproxy')) useauth_checkbutton.set_active( gajim.config.get_per('proxies', proxy, 'useauth')) + self.block_signal = False def on_proxies_treeview_key_press_event(self, widget, event): if event.keyval == gtk.keysyms.Delete: self.on_remove_proxy_button_clicked(widget) def on_proxyname_entry_changed(self, widget): + if self.block_signal: + return (model, iter_) = self.proxies_treeview.get_selection().get_selected() if not iter_: return @@ -1243,6 +1262,8 @@ model.set_value(iter_, 0, new_name) def on_proxytype_combobox_changed(self, widget): + if self.block_signal: + return types = ['http', 'socks5', 'bosh'] type_ = self.proxytype_combobox.get_active() self.show_bosh_fields(types[type_]=='bosh') @@ -1250,26 +1271,36 @@ gajim.config.set_per('proxies', proxy, 'type', types[type_]) def on_proxyhost_entry_changed(self, widget): + if self.block_signal: + return value = widget.get_text().decode('utf-8') proxy = self.proxyname_entry.get_text().decode('utf-8') gajim.config.set_per('proxies', proxy, 'host', value) def on_proxyport_entry_changed(self, widget): + if self.block_signal: + return value = widget.get_text().decode('utf-8') proxy = self.proxyname_entry.get_text().decode('utf-8') gajim.config.set_per('proxies', proxy, 'port', value) def on_proxyuser_entry_changed(self, widget): + if self.block_signal: + return value = widget.get_text().decode('utf-8') proxy = self.proxyname_entry.get_text().decode('utf-8') gajim.config.set_per('proxies', proxy, 'user', value) def on_boshuri_entry_changed(self, widget): + if self.block_signal: + return value = widget.get_text().decode('utf-8') proxy = self.proxyname_entry.get_text().decode('utf-8') gajim.config.set_per('proxies', proxy, 'bosh_uri', value) def on_proxypass_entry_changed(self, widget): + if self.block_signal: + return value = widget.get_text().decode('utf-8') proxy = self.proxyname_entry.get_text().decode('utf-8') gajim.config.set_per('proxies', proxy, 'pass', value)
1
0
0
0
gajim: A bunch of fixes for the command completion
by red-agent
17 Sep '09
17 Sep '09
changeset 5c7d35a996fa in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=5c7d35a996fa
description: A bunch of fixes for the command completion diffstat: src/chat_control.py | 7 +++++-- src/groupchat_control.py | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diffs (38 lines): diff -r fa58ef7e5935 -r 5c7d35a996fa src/chat_control.py --- a/src/chat_control.py Thu Sep 17 13:25:25 2009 +0300 +++ b/src/chat_control.py Thu Sep 17 19:06:38 2009 +0300 @@ -164,10 +164,12 @@ text = buffer.get_text(start, end, False) text = text.decode('utf8') + splitted = text.split() + if (text.startswith(self.COMMAND_PREFIX) and not - text.startswith(self.COMMAND_PREFIX * 2)): + text.startswith(self.COMMAND_PREFIX * 2) and len(splitted) == 1): - text = text.split()[0] + text = splitted[0] bare = text.lstrip(self.COMMAND_PREFIX) if len(text) == 1: @@ -351,6 +353,7 @@ self.msg_textview.grab_focus() self.command_hits = [] + self.last_key_tabs = False def set_speller(self): # now set the one the user selected diff -r fa58ef7e5935 -r 5c7d35a996fa src/groupchat_control.py --- a/src/groupchat_control.py Thu Sep 17 13:25:25 2009 +0300 +++ b/src/groupchat_control.py Thu Sep 17 19:06:38 2009 +0300 @@ -1785,7 +1785,7 @@ # HACK: Not the best soltution. if (text.startswith(self.COMMAND_PREFIX) and not - text.startswith(self.COMMAND_PREFIX * 2)): + text.startswith(self.COMMAND_PREFIX * 2) and len(splitted_text) == 1): return super(GroupchatControl, self).handle_message_textview_mykey_press(widget, event_keyval, event_keymod)
1
0
0
0
gajim: Command auto-completion along with some fixes
by red-agent
17 Sep '09
17 Sep '09
changeset fa58ef7e5935 in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=fa58ef7e5935
description: Command auto-completion along with some fixes diffstat: src/chat_control.py | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- src/commands/framework.py | 5 ++--- src/groupchat_control.py | 7 +++++++ 3 files changed, 57 insertions(+), 4 deletions(-) diffs (100 lines): diff -r e5c6399db4e4 -r fa58ef7e5935 src/chat_control.py --- a/src/chat_control.py Thu Sep 17 11:36:47 2009 +0300 +++ b/src/chat_control.py Thu Sep 17 13:25:25 2009 +0300 @@ -148,7 +148,52 @@ event_keymod): # Derived should implement this rather than connecting to the event # itself. - pass + + event = gtk.gdk.Event(gtk.gdk.KEY_PRESS) + event.keyval = event_keyval + event.state = event_keymod + event.time = 0 + + buffer = widget.get_buffer() + start, end = buffer.get_bounds() + + if event.keyval -- gtk.keysyms.Tab: + position = buffer.get_insert() + end = buffer.get_iter_at_mark(position) + + text = buffer.get_text(start, end, False) + text = text.decode('utf8') + + if (text.startswith(self.COMMAND_PREFIX) and not + text.startswith(self.COMMAND_PREFIX * 2)): + + text = text.split()[0] + bare = text.lstrip(self.COMMAND_PREFIX) + + if len(text) == 1: + self.command_hits = [] + for command in self.list_commands(): + for name in command.names: + self.command_hits.append(name) + else: + if (self.last_key_tabs and self.command_hits and + self.command_hits[0].startswith(bare)): + self.command_hits.append(self.command_hits.pop(0)) + else: + self.command_hits = [] + for command in self.list_commands(): + for name in command.names: + if name.startswith(bare): + self.command_hits.append(name) + + if self.command_hits: + buffer.delete(start, end) + buffer.insert_at_cursor(self.COMMAND_PREFIX + self.command_hits[0] + ' ') + self.last_key_tabs = True + + return True + + self.last_key_tabs = False def status_url_clicked(self, widget, url): helpers.launch_browser_mailer('url', url) @@ -305,6 +350,8 @@ self.smooth = True self.msg_textview.grab_focus() + self.command_hits = [] + def set_speller(self): # now set the one the user selected per_type = 'contacts' diff -r e5c6399db4e4 -r fa58ef7e5935 src/commands/framework.py --- a/src/commands/framework.py Thu Sep 17 11:36:47 2009 +0300 +++ b/src/commands/framework.py Thu Sep 17 13:25:25 2009 +0300 @@ -370,11 +370,10 @@ """ command_name = self.SAFE_NAME_SCAN_PATTERN.match(name) if command_name: - command = Dispatcher.retrieve_command(self, command_name.group('name')) + command = self.retrieve_command(command_name.group('name')) if command: return command - raise AttributeError(name) - return super(CommandProcessor, self).__getattr__(name) + raise AttributeError(name) @classmethod def prepare_name(cls, name): diff -r e5c6399db4e4 -r fa58ef7e5935 src/groupchat_control.py --- a/src/groupchat_control.py Thu Sep 17 11:36:47 2009 +0300 +++ b/src/groupchat_control.py Thu Sep 17 13:25:25 2009 +0300 @@ -1783,6 +1783,13 @@ splitted_text = text.split() + # HACK: Not the best soltution. + if (text.startswith(self.COMMAND_PREFIX) and not + text.startswith(self.COMMAND_PREFIX * 2)): + return super(GroupchatControl, + self).handle_message_textview_mykey_press(widget, event_keyval, + event_keymod) + # nick completion # check if tab is pressed with empty message if len(splitted_text): # if there are any words
1
0
0
0
gajim: Fixed arguments check in raw commands
by red-agent
17 Sep '09
17 Sep '09
changeset e5c6399db4e4 in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=e5c6399db4e4
description: Fixed arguments check in raw commands diffstat: src/commands/framework.py | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diffs (15 lines): diff -r dc13ace4be89 -r e5c6399db4e4 src/commands/framework.py --- a/src/commands/framework.py Thu Sep 17 11:24:58 2009 +0300 +++ b/src/commands/framework.py Thu Sep 17 11:36:47 2009 +0300 @@ -512,7 +512,10 @@ args.sort(key=itemgetter(1)) if spec_len > 1: - stopper, (start, end) = args[spec_len - 2] + try: + stopper, (start, end) = args[spec_len - 2] + except IndexError: + raise CommandError("Missing arguments", command) raw = arguments[end:] raw = raw.strip() or None
1
0
0
0
← Newer
1
2
3
4
5
6
7
8
9
...
12
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
Results per page:
10
25
50
100
200