url detection is ready!
This commit is contained in:
parent
3db089b3c4
commit
c5d3e56632
|
@ -452,26 +452,51 @@ class add_contact_window:
|
||||||
agent_combobox.set_active(jid_agents.index(jid_splited[1])+1)
|
agent_combobox.set_active(jid_agents.index(jid_splited[1])+1)
|
||||||
self.xml.signal_autoconnect(self)
|
self.xml.signal_autoconnect(self)
|
||||||
|
|
||||||
class about_window: #FIXME REWRITE: (nk) pygtk2.6 has a built-in window for that
|
class About_dialog:
|
||||||
"""Class for about window"""
|
"""Class for about dialog"""
|
||||||
def delete_event(self, widget):
|
def delete_event(self, widget):
|
||||||
"""close window"""
|
"""close window"""
|
||||||
del self.plugin.windows['about'] # remove us from open windows
|
#del self.plugin.windows['about'] # remove us from open windows
|
||||||
|
pass
|
||||||
|
|
||||||
def on_close(self, widget):
|
def on_close(self, widget):
|
||||||
"""When Close button is clicked"""
|
"""When Close button is clicked"""
|
||||||
widget.get_toplevel().destroy()
|
#widget.get_toplevel().destroy()
|
||||||
|
pass
|
||||||
|
|
||||||
def __init__(self, plugin):
|
def __init__(self, plugin):
|
||||||
xml = gtk.glade.XML(GTKGUI_GLADE, 'about_window', APP)
|
|
||||||
self.window = xml.get_widget('about_window')
|
|
||||||
xml.get_widget('logo_image').set_from_file('plugins/gtkgui/pixmaps/logo.png')
|
|
||||||
|
|
||||||
self.plugin = plugin
|
self.plugin = plugin
|
||||||
xml.signal_connect('gtk_widget_destroy', self.delete_event)
|
#xml.get_widget('logo_image').set_from_file('plugins/gtkgui/pixmaps/logo.png')
|
||||||
xml.signal_connect('on_close_clicked', self.on_close)
|
dlg = gtk.AboutDialog()
|
||||||
|
dlg.set_name('Gajim')
|
||||||
|
dlg.set_version('0.6')
|
||||||
|
dlg.set_copyright('Copyright (C) 2003-2005 Gajim Team')
|
||||||
|
dlg.set_license('''This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published
|
||||||
|
by the Free Software Foundation; version 2 only.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.''')
|
||||||
|
|
||||||
|
dlg.set_comments('The best GTK jabber-only client')
|
||||||
|
dlg.set_website('http://www.gajim.org')
|
||||||
|
dlg.set_authors('Yann')
|
||||||
|
# dlg.set_authors('Yann Le Boulanger')
|
||||||
|
|
||||||
|
dlg.set_logo(gtk.gdk.pixbuf_new_from_file('plugins/gtkgui/pixmaps/logo.png'))
|
||||||
|
|
||||||
|
dlg.run()
|
||||||
|
#dlg.show_all()
|
||||||
|
'''
|
||||||
|
, version='0.6', 'Nikos Kouremenos', 'The best GTK jabber-only client', 'http://www.gajim.org', 'Official Page', 'GPL', 'Yann')
|
||||||
|
dlg.run()
|
||||||
|
'''
|
||||||
|
#xml.signal_connect('gtk_widget_destroy', self.delete_event)
|
||||||
|
#xml.signal_connect('on_close_clicked', self.on_close)
|
||||||
|
|
||||||
self.plugin.windows['about'] = self # add us to open windows
|
#self.plugin.windows['about'] = self # add us to open windows
|
||||||
|
|
||||||
class Confirmation_dialog:
|
class Confirmation_dialog:
|
||||||
"""Class for confirmation dialog"""
|
"""Class for confirmation dialog"""
|
||||||
|
|
|
@ -353,7 +353,7 @@
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="headers_visible">True</property>
|
<property name="headers_visible">True</property>
|
||||||
<property name="rules_hint">True</property>
|
<property name="rules_hint">False</property>
|
||||||
<property name="reorderable">False</property>
|
<property name="reorderable">False</property>
|
||||||
<property name="enable_search">True</property>
|
<property name="enable_search">True</property>
|
||||||
<signal name="cursor_changed" handler="on_accounts_treeview_cursor_changed" last_modification_time="Tue, 01 Mar 2005 18:21:26 GMT"/>
|
<signal name="cursor_changed" handler="on_accounts_treeview_cursor_changed" last_modification_time="Tue, 01 Mar 2005 18:21:26 GMT"/>
|
||||||
|
@ -4060,7 +4060,7 @@ on the server as a vCard</property>
|
||||||
<widget class="GtkRadioButton" id="time_always_radiobutton">
|
<widget class="GtkRadioButton" id="time_always_radiobutton">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="label" translatable="yes">On every lines</property>
|
<property name="label" translatable="yes">On every line</property>
|
||||||
<property name="use_underline">True</property>
|
<property name="use_underline">True</property>
|
||||||
<property name="relief">GTK_RELIEF_NORMAL</property>
|
<property name="relief">GTK_RELIEF_NORMAL</property>
|
||||||
<property name="focus_on_click">True</property>
|
<property name="focus_on_click">True</property>
|
||||||
|
|
|
@ -18,39 +18,6 @@
|
||||||
## GNU General Public License for more details.
|
## GNU General Public License for more details.
|
||||||
##
|
##
|
||||||
|
|
||||||
def usage():
|
|
||||||
#TODO: use i18n
|
|
||||||
print "usage :", sys.argv[0], ' [OPTION]'
|
|
||||||
print " -p\tport on which the sock plugin listen"
|
|
||||||
print " -h, --help\tdisplay this help and exit"
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
import getopt, pickle, sys, socket
|
|
||||||
try:
|
|
||||||
opts, args = getopt.getopt(sys.argv[1:], "p:h", ["help"])
|
|
||||||
except getopt.GetoptError:
|
|
||||||
# print help information and exit:
|
|
||||||
usage()
|
|
||||||
sys.exit(2)
|
|
||||||
port = 8255
|
|
||||||
for o, a in opts:
|
|
||||||
if o == '-p':
|
|
||||||
port = a
|
|
||||||
if o in ("-h", "--help"):
|
|
||||||
usage()
|
|
||||||
sys.exit()
|
|
||||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
||||||
try:
|
|
||||||
sock.connect(('', 8255))
|
|
||||||
except:
|
|
||||||
#TODO: use i18n
|
|
||||||
print "unable to connect to localhost on port ", port
|
|
||||||
else:
|
|
||||||
evp = pickle.dumps(('EXEC_PLUGIN', '', 'gtkgui'))
|
|
||||||
sock.send('<'+evp+'>')
|
|
||||||
sock.close()
|
|
||||||
sys.exit()
|
|
||||||
|
|
||||||
import pygtk
|
import pygtk
|
||||||
pygtk.require('2.0')
|
pygtk.require('2.0')
|
||||||
import gtk
|
import gtk
|
||||||
|
@ -69,12 +36,41 @@ from common import i18n
|
||||||
|
|
||||||
_ = i18n._
|
_ = i18n._
|
||||||
APP = i18n.APP
|
APP = i18n.APP
|
||||||
gtk.glade.bindtextdomain (APP, i18n.DIR)
|
gtk.glade.bindtextdomain(APP, i18n.DIR)
|
||||||
gtk.glade.textdomain (APP)
|
gtk.glade.textdomain(APP)
|
||||||
|
|
||||||
from dialogs import *
|
from dialogs import *
|
||||||
from config import *
|
from config import *
|
||||||
|
|
||||||
|
def usage():
|
||||||
|
#TODO: use i18n
|
||||||
|
print "usage :", sys.argv[0], ' [OPTION]'
|
||||||
|
print " -p\tport on which the sock plugin listen"
|
||||||
|
print " -h, --help\tdisplay this help and exit"
|
||||||
|
|
||||||
|
def launch_browser_mailer(self, kind, url):
|
||||||
|
#kind = 'url' or 'mail'
|
||||||
|
if self.plugin.config['openwith'] == 'gnome-open':
|
||||||
|
app = 'gnome-open'
|
||||||
|
args = ['gnome-open']
|
||||||
|
args.append(url)
|
||||||
|
elif self.plugin.config['openwith'] == 'kfmclient exec':
|
||||||
|
app = 'kfmclient'
|
||||||
|
args = ['kfmclient', 'exec']
|
||||||
|
elif self.plugin.config['openwith'] == 'custom':
|
||||||
|
if kind == 'url':
|
||||||
|
conf = self.plugin.config['custombrowser']
|
||||||
|
if kind == 'mail':
|
||||||
|
conf = self.plugin.config['custommailapp']
|
||||||
|
if conf == '': # if no app is configured
|
||||||
|
return
|
||||||
|
args = conf.split()
|
||||||
|
app = args[0]
|
||||||
|
args.append(url)
|
||||||
|
os.spawnvp(os.P_NOWAIT, app, args)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade'
|
GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade'
|
||||||
|
|
||||||
class ImageCellRenderer(gtk.GenericCellRenderer):
|
class ImageCellRenderer(gtk.GenericCellRenderer):
|
||||||
|
@ -228,27 +224,6 @@ class tabbed_chat_window:
|
||||||
self.on_tabbed_chat_window_key_press_event)
|
self.on_tabbed_chat_window_key_press_event)
|
||||||
self.xml.signal_connect('on_chat_notebook_switch_page', \
|
self.xml.signal_connect('on_chat_notebook_switch_page', \
|
||||||
self.on_chat_notebook_switch_page)
|
self.on_chat_notebook_switch_page)
|
||||||
|
|
||||||
def run_application(self, type, url):
|
|
||||||
#type = 'url' or 'mail'
|
|
||||||
if self.plugin.config['openwith'] == 'gnome-open':
|
|
||||||
app = 'gnome-open'
|
|
||||||
args = ['gnome-open']
|
|
||||||
args.append(url)
|
|
||||||
elif self.plugin.config['openwith'] == 'kfmclient exec':
|
|
||||||
app = 'kfmclient'
|
|
||||||
args = ['kfmclient', 'exec']
|
|
||||||
elif self.plugin.config['openwith'] == 'custom':
|
|
||||||
if type == 'url':
|
|
||||||
conf = self.plugin.config['custombrowser']
|
|
||||||
if type == 'mail':
|
|
||||||
conf = self.plugin.config['custommailapp']
|
|
||||||
if conf == '':
|
|
||||||
return
|
|
||||||
args = conf.split()
|
|
||||||
app = args[0]
|
|
||||||
args.append(url)
|
|
||||||
os.spawnvp(os.P_NOWAIT, app, args)
|
|
||||||
|
|
||||||
def update_tags(self):
|
def update_tags(self):
|
||||||
for jid in self.tagIn:
|
for jid in self.tagIn:
|
||||||
|
@ -353,8 +328,8 @@ class tabbed_chat_window:
|
||||||
jid = self.get_active_jid()
|
jid = self.get_active_jid()
|
||||||
conversation_buffer = self.xmls[jid].get_widget('conversation_textview').\
|
conversation_buffer = self.xmls[jid].get_widget('conversation_textview').\
|
||||||
get_buffer()
|
get_buffer()
|
||||||
deb, end = conversation_buffer.get_bounds()
|
start, end = conversation_buffer.get_bounds()
|
||||||
conversation_buffer.delete(deb, end)
|
conversation_buffer.delete(start, end)
|
||||||
|
|
||||||
def on_close_button_clicked(self, button):
|
def on_close_button_clicked(self, button):
|
||||||
"""When close button is pressed :
|
"""When close button is pressed :
|
||||||
|
@ -462,6 +437,7 @@ class tabbed_chat_window:
|
||||||
tag.set_property('foreground', '#9e9e9e')
|
tag.set_property('foreground', '#9e9e9e')
|
||||||
tag.set_property('scale', pango.SCALE_SMALL)
|
tag.set_property('scale', pango.SCALE_SMALL)
|
||||||
tag.set_property('justification', gtk.JUSTIFY_CENTER)
|
tag.set_property('justification', gtk.JUSTIFY_CENTER)
|
||||||
|
|
||||||
for way in ['status', 'incoming', 'outgoing']:
|
for way in ['status', 'incoming', 'outgoing']:
|
||||||
for special in ['mail', 'italic', 'underline', 'bold', 'url']:
|
for special in ['mail', 'italic', 'underline', 'bold', 'url']:
|
||||||
tag = conversation_buffer.create_tag(way + '_' + special)
|
tag = conversation_buffer.create_tag(way + '_' + special)
|
||||||
|
@ -487,6 +463,7 @@ class tabbed_chat_window:
|
||||||
elif special == 'bold':
|
elif special == 'bold':
|
||||||
tag.set_property('weight', pango.WEIGHT_BOLD)
|
tag.set_property('weight', pango.WEIGHT_BOLD)
|
||||||
link_tag = conversation_buffer.create_tag('hyperlink', foreground='blue')
|
link_tag = conversation_buffer.create_tag('hyperlink', foreground='blue')
|
||||||
|
|
||||||
self.xmls[user.jid].signal_autoconnect(self)
|
self.xmls[user.jid].signal_autoconnect(self)
|
||||||
conversation_scrolledwindow = self.xmls[user.jid].\
|
conversation_scrolledwindow = self.xmls[user.jid].\
|
||||||
get_widget('conversation_scrolledwindow')
|
get_widget('conversation_scrolledwindow')
|
||||||
|
@ -652,7 +629,7 @@ class tabbed_chat_window:
|
||||||
def print_special_word(self, word, jid, contact = ''):
|
def print_special_word(self, word, jid, contact = ''):
|
||||||
conversation_textview = self.xmls[jid].get_widget('conversation_textview')
|
conversation_textview = self.xmls[jid].get_widget('conversation_textview')
|
||||||
conversation_buffer = conversation_textview.get_buffer()
|
conversation_buffer = conversation_textview.get_buffer()
|
||||||
end_iter = conversation_buffer.get_end_iter()
|
|
||||||
if contact == 'status':
|
if contact == 'status':
|
||||||
tag = 'status'
|
tag = 'status'
|
||||||
else:
|
else:
|
||||||
|
@ -662,13 +639,15 @@ class tabbed_chat_window:
|
||||||
tag = 'incoming'
|
tag = 'incoming'
|
||||||
if word in self.plugin.emoticons.keys():
|
if word in self.plugin.emoticons.keys():
|
||||||
#it's a smiley
|
#it's a smiley
|
||||||
|
end_iter = conversation_buffer.get_end_iter()
|
||||||
conversation_buffer.insert_pixbuf(end_iter, self.plugin.emoticons[word])
|
conversation_buffer.insert_pixbuf(end_iter, self.plugin.emoticons[word])
|
||||||
return
|
return
|
||||||
elif word.startswith('mailto'):
|
elif word.startswith('mailto:'):
|
||||||
#it's a mail
|
#it's a mail
|
||||||
tag += '_mail'
|
tag += '_mail'
|
||||||
#TODO: search for sth@sth.sth
|
elif self.plugin.sth_at_sth_dot_sth_re.match(word): # returns match object or None
|
||||||
#it's a mail too
|
#it's a mail too
|
||||||
|
tag += '_mail'
|
||||||
elif word.startswith('/') and word.endswith('/'):
|
elif word.startswith('/') and word.endswith('/'):
|
||||||
#it's an italic text
|
#it's an italic text
|
||||||
tag += '_italic'
|
tag += '_italic'
|
||||||
|
@ -682,7 +661,8 @@ class tabbed_chat_window:
|
||||||
#it's an url
|
#it's an url
|
||||||
tag += '_url'
|
tag += '_url'
|
||||||
|
|
||||||
conversation_buffer.insert_with_tags_by_name(end_iter, text, tag)
|
end_iter = conversation_buffer.get_end_iter()
|
||||||
|
conversation_buffer.insert_with_tags_by_name(end_iter, word, tag)
|
||||||
|
|
||||||
def print_conversation(self, text, jid, contact = '', tim = None):
|
def print_conversation(self, text, jid, contact = '', tim = None):
|
||||||
"""Print a line in the conversation :
|
"""Print a line in the conversation :
|
||||||
|
@ -723,76 +703,38 @@ class tabbed_chat_window:
|
||||||
|
|
||||||
conversation_buffer.insert_with_tags_by_name(end_iter, ttext, tag)
|
conversation_buffer.insert_with_tags_by_name(end_iter, ttext, tag)
|
||||||
|
|
||||||
# regexp meta characters are: . ^ $ * + ? { [ ] \ | ( )
|
|
||||||
# one escapes the metachars with \
|
|
||||||
# \S matches anything but ' ' '\t' '\n' '\r' '\f' and '\v'
|
|
||||||
# \s matches any whitespace character
|
|
||||||
# \w any alphanumeric character
|
|
||||||
# * means 0 or more times
|
|
||||||
# + means 1 or more times
|
|
||||||
# | means or
|
|
||||||
# [^*] anything but * (inside [] you don't have to escape metachars)
|
|
||||||
# url_pattern is one string literal. I've put spaces to make the regexp look better
|
|
||||||
url_pattern = r'http://\S*|' 'https://\S*|' 'news://\S*|' 'ftp://\S*|' 'mailto:\S*|' 'ed2k://\S*|' 'www\.\S*|' 'ftp\.\S*|' '\*\w+[^*]*\w+\*|' '/\w+[^/]*\w+/|' '_\w+[^_]*\w+_|' '\w+[^\s]*@\w+\.\w+'
|
|
||||||
|
|
||||||
start = 0
|
start = 0
|
||||||
end = 0
|
end = 0
|
||||||
index = 0
|
index = 0
|
||||||
|
|
||||||
if len(otext) > 0: # is it necessary? maybe that should be above?
|
if self.plugin.config['useemoticons']: # search for emoticons & urls
|
||||||
|
my_re = sre.compile(self.plugin.emot_and_url_pattern, sre.IGNORECASE)
|
||||||
if self.plugin.config['useemoticons']:
|
iterator = my_re.finditer(otext)
|
||||||
emoticons_pattern = ''
|
|
||||||
for emoticon in self.plugin.roster.emoticons: # travel tru emoticons list
|
|
||||||
emoticon_escaped = sre.escape(emoticon) # espace regexp metachars
|
|
||||||
emoticons_pattern += emoticon_escaped + '|'# or is | in regexp
|
|
||||||
emoticons_pattern = emoticons_pattern[0:-1] # remove the last |
|
|
||||||
|
|
||||||
emoticons_re = sre.compile(emoticons_pattern, sre.IGNORECASE)
|
|
||||||
iterator = emoticons_re.finditer(otext)
|
|
||||||
for match in iterator:
|
|
||||||
emot_start, emot_end = match.span()
|
|
||||||
emot_ascii = otext[emot_start:emot_end]
|
|
||||||
#print 'detected', emot_ascii, 'in (start, end)', '(', emot_start, ',', emot_end, ')'
|
|
||||||
#print 'adding text before emoticon', index, emot_start
|
|
||||||
if emot_start != 0:
|
|
||||||
conversation_buffer.insert(end_iter, otext[index:emot_start])
|
|
||||||
conversation_buffer.insert_pixbuf(end_iter, \
|
|
||||||
self.plugin.roster.emoticons[emot_ascii])
|
|
||||||
index = emot_end # update index
|
|
||||||
|
|
||||||
url_re = sre.compile(url_pattern, sre.IGNORECASE)
|
|
||||||
iterator = url_re.finditer(otext)
|
|
||||||
for match in iterator:
|
for match in iterator:
|
||||||
url_start, url_end = match.span()
|
start, end = match.span()
|
||||||
url_text = otext[url_start:url_end]
|
special_word = otext[start:end]
|
||||||
#print 'detected', url_text, 'in (start, end)', '(', url_start, ',', url_end, ')'
|
if start != 0:
|
||||||
conversation_buffer.insert_with_tags_by_name(end_iter,\
|
text_before_special_word = otext[index:start]
|
||||||
url_text, 'hyperlink')
|
end_iter = conversation_buffer.get_end_iter()
|
||||||
index = url_end # update index
|
conversation_buffer.insert(end_iter, text_before_special_word)
|
||||||
|
self.print_special_word(special_word, jid, contact)
|
||||||
|
index = end # update index
|
||||||
|
else: # search for just urls
|
||||||
|
my_re = sre.compile(self.plugin.url_pattern, sre.IGNORECASE)
|
||||||
|
iterator = my_re.finditer(otext)
|
||||||
|
for match in iterator:
|
||||||
|
start, end = match.span()
|
||||||
|
special_word = otext[start:end]
|
||||||
|
if start != 0:
|
||||||
|
text_before_special_word = otext[index:start]
|
||||||
|
end_iter = conversation_buffer.get_end_iter()
|
||||||
|
conversation_buffer.insert(end_iter, text_before_special_word)
|
||||||
|
self.print_special_word(special_word, jid, contact)
|
||||||
|
index = end # update index
|
||||||
|
|
||||||
#conversation_buffer.insert(end_iter, otext[end:])
|
#add the rest in the index and after
|
||||||
#print 'adding the rest of the text in', index, 'and after'
|
end_iter = conversation_buffer.get_end_iter()
|
||||||
conversation_buffer.insert(end_iter, otext[index:])
|
conversation_buffer.insert(end_iter, otext[index:])
|
||||||
|
|
||||||
'''
|
|
||||||
if len(otext) > 0:
|
|
||||||
beg = 0
|
|
||||||
if self.plugin.config['useemoticons']:
|
|
||||||
index = 0
|
|
||||||
while index < len(otext):
|
|
||||||
for s in self.plugin.roster.emoticons:
|
|
||||||
l = len(s)
|
|
||||||
if s == otext[index:index+l]:
|
|
||||||
conversation_buffer.insert(end_iter, otext[beg:index])
|
|
||||||
conversation_buffer.insert_pixbuf(end_iter, \
|
|
||||||
self.plugin.roster.emoticons[s])
|
|
||||||
index+=l
|
|
||||||
beg = index
|
|
||||||
index+=1
|
|
||||||
|
|
||||||
conversation_buffer.insert(end_iter, otext[beg:])
|
|
||||||
'''
|
|
||||||
|
|
||||||
#scroll to the end of the textview
|
#scroll to the end of the textview
|
||||||
end_rect = conversation_textview.get_iter_location(end_iter)
|
end_rect = conversation_textview.get_iter_location(end_iter)
|
||||||
|
@ -2433,7 +2375,7 @@ class roster_window:
|
||||||
def on_about_menuitem_activate(self, widget):
|
def on_about_menuitem_activate(self, widget):
|
||||||
"""When about is selected :
|
"""When about is selected :
|
||||||
call the about class"""
|
call the about class"""
|
||||||
about_window(self.plugin)
|
About_dialog(self.plugin)
|
||||||
|
|
||||||
def on_accounts_menuitem_activate(self, widget):
|
def on_accounts_menuitem_activate(self, widget):
|
||||||
"""When accounts is seleted :
|
"""When accounts is seleted :
|
||||||
|
@ -2583,34 +2525,6 @@ class roster_window:
|
||||||
self.plugin.windows[account]['browser'] = \
|
self.plugin.windows[account]['browser'] = \
|
||||||
agent_browser_window(self.plugin, account)
|
agent_browser_window(self.plugin, account)
|
||||||
|
|
||||||
def image_is_ok(self, image):
|
|
||||||
if not os.path.exists(image):
|
|
||||||
return 0
|
|
||||||
img = gtk.Image()
|
|
||||||
try:
|
|
||||||
img.set_from_file(image)
|
|
||||||
except:
|
|
||||||
return 0
|
|
||||||
if img.get_storage_type() == gtk.IMAGE_PIXBUF:
|
|
||||||
pix = img.get_pixbuf()
|
|
||||||
else:
|
|
||||||
return 0
|
|
||||||
if pix.get_width() > 24 or pix.get_height() > 24:
|
|
||||||
return 0
|
|
||||||
return 1
|
|
||||||
|
|
||||||
def mkemoticons(self):
|
|
||||||
"""initialize emoticons dictionary"""
|
|
||||||
self.emoticons = dict()
|
|
||||||
split_line = self.plugin.config['emoticons'].split('\t')
|
|
||||||
for i in range(0, len(split_line)/2):
|
|
||||||
# (nk) lost you here. if you remember add some comments about the idea of the algo
|
|
||||||
emot_file = split_line[2*i+1]
|
|
||||||
if not self.image_is_ok(emot_file):
|
|
||||||
continue
|
|
||||||
pix = gtk.gdk.pixbuf_new_from_file(emot_file)
|
|
||||||
self.emoticons[split_line[2*i]] = pix
|
|
||||||
|
|
||||||
def mkpixbufs(self):
|
def mkpixbufs(self):
|
||||||
"""initialise pixbufs array"""
|
"""initialise pixbufs array"""
|
||||||
iconstyle = self.plugin.config['iconstyle']
|
iconstyle = self.plugin.config['iconstyle']
|
||||||
|
@ -2803,8 +2717,6 @@ class roster_window:
|
||||||
model.set_sort_column_id(1, gtk.SORT_ASCENDING)
|
model.set_sort_column_id(1, gtk.SORT_ASCENDING)
|
||||||
self.tree.set_model(model)
|
self.tree.set_model(model)
|
||||||
self.mkpixbufs()
|
self.mkpixbufs()
|
||||||
if self.plugin.config['useemoticons']:
|
|
||||||
self.mkemoticons()
|
|
||||||
|
|
||||||
liststore = gtk.ListStore(gobject.TYPE_STRING, gtk.Image)
|
liststore = gtk.ListStore(gobject.TYPE_STRING, gtk.Image)
|
||||||
self.cb = gtk.ComboBox()
|
self.cb = gtk.ComboBox()
|
||||||
|
@ -3485,9 +3397,27 @@ class plugin:
|
||||||
def hide_systray(self):
|
def hide_systray(self):
|
||||||
self.systray.hide_icon()
|
self.systray.hide_icon()
|
||||||
self.systray_visible = 0
|
self.systray_visible = 0
|
||||||
|
|
||||||
|
def image_is_ok(self, image):
|
||||||
|
if not os.path.exists(image):
|
||||||
|
return False
|
||||||
|
img = gtk.Image()
|
||||||
|
try:
|
||||||
|
img.set_from_file(image)
|
||||||
|
except:
|
||||||
|
return True
|
||||||
|
if img.get_storage_type() == gtk.IMAGE_PIXBUF:
|
||||||
|
pix = img.get_pixbuf()
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
if pix.get_width() > 24 or pix.get_height() > 24:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
def __init__(self, quIN, quOUT):
|
def __init__(self, quIN, quOUT):
|
||||||
gtk.gdk.threads_init()
|
gtk.gdk.threads_init()
|
||||||
|
gtk.about_dialog_set_email_hook(launch_browser_mailer, 'mail')
|
||||||
|
gtk.about_dialog_set_url_hook(launch_browser_mailer, 'url')
|
||||||
self.queueIN = quIN
|
self.queueIN = quIN
|
||||||
self.queueOUT = quOUT
|
self.queueOUT = quOUT
|
||||||
self.send('REG_MESSAGE', 'gtkgui', ['ROSTER', 'WARNING', 'STATUS', \
|
self.send('REG_MESSAGE', 'gtkgui', ['ROSTER', 'WARNING', 'STATUS', \
|
||||||
|
@ -3577,15 +3507,15 @@ class plugin:
|
||||||
path = 'plugins/gtkgui/icons/' + iconstyle + '/'
|
path = 'plugins/gtkgui/icons/' + iconstyle + '/'
|
||||||
files = [path + 'online.gif', path + 'online.png', path + 'online.xpm']
|
files = [path + 'online.gif', path + 'online.png', path + 'online.xpm']
|
||||||
pix = None
|
pix = None
|
||||||
for file in files:
|
for f in files:
|
||||||
if os.path.exists(file):
|
if os.path.exists(f):
|
||||||
pix = gtk.gdk.pixbuf_new_from_file(file)
|
pix = gtk.gdk.pixbuf_new_from_file(f)
|
||||||
break
|
break
|
||||||
if pix:
|
if pix:
|
||||||
gtk.window_set_default_icon(pix)
|
gtk.window_set_default_icon(pix)
|
||||||
self.roster = roster_window(self)
|
self.roster = roster_window(self)
|
||||||
gtk.timeout_add(100, self.read_queue)
|
gobject.timeout_add(100, self.read_queue)
|
||||||
gtk.timeout_add(100, self.read_sleepy)
|
gobject.timeout_add(100, self.read_sleepy)
|
||||||
self.sleeper = common.sleepy.Sleepy( \
|
self.sleeper = common.sleepy.Sleepy( \
|
||||||
self.config['autoawaytime']*60, \
|
self.config['autoawaytime']*60, \
|
||||||
self.config['autoxatime']*60)
|
self.config['autoxatime']*60)
|
||||||
|
@ -3601,9 +3531,71 @@ class plugin:
|
||||||
self.systray = systray(self)
|
self.systray = systray(self)
|
||||||
if self.config['trayicon']:
|
if self.config['trayicon']:
|
||||||
self.show_systray()
|
self.show_systray()
|
||||||
|
|
||||||
|
if self.config['useemoticons']:
|
||||||
|
"""initialize emoticons dictionary"""
|
||||||
|
self.emoticons = dict()
|
||||||
|
split_line = self.config['emoticons'].split('\t')
|
||||||
|
for i in range(0, len(split_line)/2):
|
||||||
|
emot_file = split_line[2*i+1]
|
||||||
|
if not self.image_is_ok(emot_file):
|
||||||
|
continue
|
||||||
|
pix = gtk.gdk.pixbuf_new_from_file(emot_file)
|
||||||
|
self.emoticons[split_line[2*i]] = pix
|
||||||
|
|
||||||
|
# regexp meta characters are: . ^ $ * + ? { } [ ] \ | ( )
|
||||||
|
# one escapes the metachars with \
|
||||||
|
# \S matches anything but ' ' '\t' '\n' '\r' '\f' and '\v'
|
||||||
|
# \s matches any whitespace character
|
||||||
|
# \w any alphanumeric character
|
||||||
|
# * means 0 or more times
|
||||||
|
# + means 1 or more times
|
||||||
|
# | means or
|
||||||
|
# [^*] anything but * (inside [] you don't have to escape metachars)
|
||||||
|
# url_pattern is one string literal. I've put spaces to make the regexp look better
|
||||||
|
self.url_pattern = r'http://\S*|' 'https://\S*|' 'news://\S*|' 'ftp://\S*|' 'mailto:\S*|' 'ed2k://\S*|' 'www\.\S*|' 'ftp\.\S*|' '\*\w+[^*]*\w+\*|' '/\w+[^/]*\w+/|' '_\w+[^_]*\w+_|' '\w+[^\s]*@\w+\.\w+'
|
||||||
|
|
||||||
|
# at least one letter in 3 parts (before @, after @, after .)
|
||||||
|
self.sth_at_sth_dot_sth_re = sre.compile(r'\w+[^\s]*@\w+\.\w+')
|
||||||
|
|
||||||
|
emoticons_pattern = ''
|
||||||
|
for emoticon in self.emoticons: # travel tru emoticons list
|
||||||
|
emoticon_escaped = sre.escape(emoticon) # espace regexp metachars
|
||||||
|
emoticons_pattern += emoticon_escaped + '|'# or is | in regexp
|
||||||
|
#self.emoticons_pattern = self.emoticons_pattern[0:-1] # remove the last |
|
||||||
|
|
||||||
|
self.emot_and_url_pattern = emoticons_pattern + self.url_pattern
|
||||||
|
|
||||||
gtk.gdk.threads_enter()
|
gtk.gdk.threads_enter()
|
||||||
self.autoconnect()
|
self.autoconnect()
|
||||||
gtk.main()
|
gtk.main()
|
||||||
gtk.gdk.threads_leave()
|
gtk.gdk.threads_leave()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import getopt, pickle, sys, socket
|
||||||
|
try:
|
||||||
|
opts, args = getopt.getopt(sys.argv[1:], "p:h", ["help"])
|
||||||
|
except getopt.GetoptError:
|
||||||
|
# print help information and exit:
|
||||||
|
usage()
|
||||||
|
sys.exit(2)
|
||||||
|
port = 8255
|
||||||
|
for o, a in opts:
|
||||||
|
if o == '-p':
|
||||||
|
port = a
|
||||||
|
if o in ("-h", "--help"):
|
||||||
|
usage()
|
||||||
|
sys.exit()
|
||||||
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
try:
|
||||||
|
sock.connect(('', 8255))
|
||||||
|
except:
|
||||||
|
#TODO: use i18n
|
||||||
|
print "unable to connect to localhost on port ", port
|
||||||
|
else:
|
||||||
|
evp = pickle.dumps(('EXEC_PLUGIN', '', 'gtkgui'))
|
||||||
|
sock.send('<'+evp+'>')
|
||||||
|
sock.close()
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
print _("plugin gtkgui loaded")
|
print _("plugin gtkgui loaded")
|
||||||
|
|
Loading…
Reference in New Issue