Many changes :
New class and variable names New variable fot glade file Button in chat window instead of label New image loader
This commit is contained in:
parent
f913e4cd0e
commit
60b56d4649
12 changed files with 1505 additions and 709 deletions
BIN
plugins/gtkgui/about.png
Normal file
BIN
plugins/gtkgui/about.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.8 KiB |
File diff suppressed because it is too large
Load diff
|
@ -24,9 +24,10 @@ from gtk import TRUE, FALSE
|
||||||
import gtk.glade,gobject
|
import gtk.glade,gobject
|
||||||
import os,string,time,Queue
|
import os,string,time,Queue
|
||||||
import common.optparser,common.sleepy
|
import common.optparser,common.sleepy
|
||||||
#CONFPATH = "~/.gajim/config"
|
browserWindow = 0
|
||||||
Wbrowser = 0
|
accountsWindow = 0
|
||||||
Waccounts = 0
|
|
||||||
|
GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade'
|
||||||
|
|
||||||
class user:
|
class user:
|
||||||
"""Informations concerning each users"""
|
"""Informations concerning each users"""
|
||||||
|
@ -49,7 +50,7 @@ class user:
|
||||||
self.resource = args[6]
|
self.resource = args[6]
|
||||||
else: raise TypeError, 'bad arguments'
|
else: raise TypeError, 'bad arguments'
|
||||||
|
|
||||||
class info_user:
|
class infoUser_Window:
|
||||||
"""Class for user's information window"""
|
"""Class for user's information window"""
|
||||||
def delete_event(self, widget):
|
def delete_event(self, widget):
|
||||||
"""close window"""
|
"""close window"""
|
||||||
|
@ -61,19 +62,34 @@ class info_user:
|
||||||
|
|
||||||
def on_close(self, widget):
|
def on_close(self, widget):
|
||||||
"""Save user's informations and update the roster on the Jabber server"""
|
"""Save user's informations and update the roster on the Jabber server"""
|
||||||
#TODO: send things to server only if changes are done
|
#update: to know if things have changed to send things
|
||||||
|
# to server only if changes are done
|
||||||
|
update = 0
|
||||||
#update user.name if it's not ""
|
#update user.name if it's not ""
|
||||||
newName = self.entry_name.get_text()
|
newName = self.entry_name.get_text()
|
||||||
if newName != '':
|
if newName != self.user.name:
|
||||||
self.user.name = newName
|
update = 1
|
||||||
|
if newName != '':
|
||||||
|
self.user.name = newName
|
||||||
#update user.groups and redraw the user in the roster
|
#update user.groups and redraw the user in the roster
|
||||||
|
old_groups = self.user.groups
|
||||||
self.r.remove_user(self.user)
|
self.r.remove_user(self.user)
|
||||||
self.user.groups = []
|
self.user.groups = []
|
||||||
model = self.list2.get_model()
|
model = self.list2.get_model()
|
||||||
model.foreach(self.add_grp_to_user)
|
model.foreach(self.add_grp_to_user)
|
||||||
self.r.add_user(self.user)
|
self.r.add_user(self.user)
|
||||||
self.r.queueOUT.put(('UPDUSER', (self.user.jid, self.user.name, \
|
for g in old_groups:
|
||||||
self.user.groups)))
|
if not g in self.user.groups:
|
||||||
|
update = 1
|
||||||
|
break
|
||||||
|
if not update:
|
||||||
|
for g in self.user.groups:
|
||||||
|
if not g in old_groups:
|
||||||
|
update = 1
|
||||||
|
break
|
||||||
|
if update:
|
||||||
|
self.r.queueOUT.put(('UPDUSER', (self.user.jid, self.user.name, \
|
||||||
|
self.user.groups)))
|
||||||
self.delete_event(self)
|
self.delete_event(self)
|
||||||
|
|
||||||
def add_grp(self, model, path, iter, stors):
|
def add_grp(self, model, path, iter, stors):
|
||||||
|
@ -110,25 +126,25 @@ class info_user:
|
||||||
"""Initialize both available and current listStores"""
|
"""Initialize both available and current listStores"""
|
||||||
#list available
|
#list available
|
||||||
store = gtk.ListStore(gobject.TYPE_STRING)
|
store = gtk.ListStore(gobject.TYPE_STRING)
|
||||||
for i in self.r.l_group.keys():
|
for g in self.r.l_group.keys():
|
||||||
if i != 'Agents' and i not in self.user.groups:
|
if g != 'Agents' and g not in self.user.groups:
|
||||||
iter = store.append()
|
iter = store.append()
|
||||||
store.set(iter, 0, i)
|
store.set(iter, 0, g)
|
||||||
self.list1.set_model(store)
|
self.list1.set_model(store)
|
||||||
column = gtk.TreeViewColumn('Available', gtk.CellRendererText(), text=0)
|
column = gtk.TreeViewColumn('Available', gtk.CellRendererText(), text=0)
|
||||||
self.list1.append_column(column)
|
self.list1.append_column(column)
|
||||||
|
|
||||||
#list_current
|
#list_current
|
||||||
store = gtk.ListStore(gobject.TYPE_STRING)
|
store = gtk.ListStore(gobject.TYPE_STRING)
|
||||||
for i in self.user.groups:
|
for g in self.user.groups:
|
||||||
iter = store.append()
|
iter = store.append()
|
||||||
store.set(iter, 0, i)
|
store.set(iter, 0, g)
|
||||||
self.list2.set_model(store)
|
self.list2.set_model(store)
|
||||||
column = gtk.TreeViewColumn('Available', gtk.CellRendererText(), text=0)
|
column = gtk.TreeViewColumn('Available', gtk.CellRendererText(), text=0)
|
||||||
self.list2.append_column(column)
|
self.list2.append_column(column)
|
||||||
|
|
||||||
def __init__(self, user, roster):
|
def __init__(self, user, roster):
|
||||||
xml = gtk.glade.XML('plugins/gtkgui/gtkgui.glade', 'Info_user')
|
xml = gtk.glade.XML(GTKGUI_GLADE, 'Info_user')
|
||||||
self.window = xml.get_widget("Info_user")
|
self.window = xml.get_widget("Info_user")
|
||||||
self.r = roster
|
self.r = roster
|
||||||
self.user = user
|
self.user = user
|
||||||
|
@ -155,7 +171,7 @@ class info_user:
|
||||||
self.on_new_key_pressed)
|
self.on_new_key_pressed)
|
||||||
|
|
||||||
|
|
||||||
class prefs:
|
class preference_Window:
|
||||||
"""Class for Preferences window"""
|
"""Class for Preferences window"""
|
||||||
def delete_event(self, widget):
|
def delete_event(self, widget):
|
||||||
"""close window"""
|
"""close window"""
|
||||||
|
@ -259,20 +275,40 @@ class prefs:
|
||||||
self.write_cfg()
|
self.write_cfg()
|
||||||
self.window.destroy()
|
self.window.destroy()
|
||||||
|
|
||||||
|
def change_notebook_page(self, number):
|
||||||
|
self.notebook.set_current_page(number)
|
||||||
|
|
||||||
|
def on_lookfeel_button_clicked(self, widget, data=None):
|
||||||
|
self.change_notebook_page(0)
|
||||||
|
|
||||||
|
def on_events_button_clicked(self, widget, data=None):
|
||||||
|
self.change_notebook_page(1)
|
||||||
|
|
||||||
|
def on_presence_button_clicked(self, widget, data=None):
|
||||||
|
self.change_notebook_page(2)
|
||||||
|
|
||||||
def __init__(self, roster):
|
def __init__(self, roster):
|
||||||
"""Initialize Preference window"""
|
"""Initialize Preference window"""
|
||||||
xml = gtk.glade.XML('plugins/gtkgui/gtkgui.glade', 'Prefs')
|
xml = gtk.glade.XML(GTKGUI_GLADE, 'preferences_window')
|
||||||
self.window = xml.get_widget("Prefs")
|
self.window = xml.get_widget('preferences_window')
|
||||||
self.r = roster
|
self.r = roster
|
||||||
self.da_in = xml.get_widget("drawing_in")
|
self.da_in = xml.get_widget('drawing_in')
|
||||||
self.da_out = xml.get_widget("drawing_out")
|
self.da_out = xml.get_widget('drawing_out')
|
||||||
self.da_status = xml.get_widget("drawing_status")
|
self.da_status = xml.get_widget('drawing_status')
|
||||||
self.combo_iconstyle = xml.get_widget("combo_iconstyle")
|
self.combo_iconstyle = xml.get_widget('combo_iconstyle')
|
||||||
self.chk_autopp = xml.get_widget("chk_autopopup")
|
self.chk_autopp = xml.get_widget('chk_autopopup')
|
||||||
self.chk_autoaway = xml.get_widget("chk_autoaway")
|
self.chk_autoaway = xml.get_widget('chk_autoaway')
|
||||||
self.spin_autoawaytime = xml.get_widget("spin_autoawaytime")
|
self.spin_autoawaytime = xml.get_widget('spin_autoawaytime')
|
||||||
self.chk_autoxa = xml.get_widget("chk_autoxa")
|
self.chk_autoxa = xml.get_widget('chk_autoxa')
|
||||||
self.spin_autoxatime = xml.get_widget("spin_autoxatime")
|
self.spin_autoxatime = xml.get_widget('spin_autoxatime')
|
||||||
|
self.notebook = xml.get_widget('preferences_notebook')
|
||||||
|
|
||||||
|
button = xml.get_widget('lookfeel_button')
|
||||||
|
button.connect('clicked', self.on_lookfeel_button_clicked)
|
||||||
|
button = xml.get_widget('events_button')
|
||||||
|
button.connect('clicked', self.on_events_button_clicked)
|
||||||
|
button = xml.get_widget('presence_button')
|
||||||
|
button.connect('clicked', self.on_presence_button_clicked)
|
||||||
|
|
||||||
#Color for incomming messages
|
#Color for incomming messages
|
||||||
colSt = self.r.plugin.config['inmsgcolor']
|
colSt = self.r.plugin.config['inmsgcolor']
|
||||||
|
@ -311,34 +347,33 @@ class prefs:
|
||||||
self.combo_iconstyle.entry.set_text(self.r.iconstyle)
|
self.combo_iconstyle.entry.set_text(self.r.iconstyle)
|
||||||
|
|
||||||
#Autopopup
|
#Autopopup
|
||||||
|
st = 0
|
||||||
if self.r.plugin.config.has_key('autopopup'):
|
if self.r.plugin.config.has_key('autopopup'):
|
||||||
st = self.r.plugin.config['autopopup']
|
st = self.r.plugin.config['autopopup']
|
||||||
else:
|
|
||||||
st = 0
|
|
||||||
self.chk_autopp.set_active(st)
|
self.chk_autopp.set_active(st)
|
||||||
|
|
||||||
#Autoaway
|
#Autoaway
|
||||||
|
st = 1
|
||||||
if self.r.plugin.config.has_key('autoaway'):
|
if self.r.plugin.config.has_key('autoaway'):
|
||||||
st = self.r.plugin.config['autoaway']
|
st = self.r.plugin.config['autoaway']
|
||||||
else:
|
|
||||||
st = 1
|
|
||||||
self.chk_autoaway.set_active(st)
|
self.chk_autoaway.set_active(st)
|
||||||
|
|
||||||
|
#Autoawaytime
|
||||||
|
st = 10
|
||||||
if self.r.plugin.config.has_key('autoawaytime'):
|
if self.r.plugin.config.has_key('autoawaytime'):
|
||||||
st = self.r.plugin.config['autoawaytime']
|
st = self.r.plugin.config['autoawaytime']
|
||||||
else:
|
|
||||||
st = 10
|
|
||||||
self.spin_autoawaytime.set_value(st)
|
self.spin_autoawaytime.set_value(st)
|
||||||
|
|
||||||
#Autoxa
|
#Autoxa
|
||||||
|
st = 1
|
||||||
if self.r.plugin.config.has_key('autoxa'):
|
if self.r.plugin.config.has_key('autoxa'):
|
||||||
st = self.r.plugin.config['autoxa']
|
st = self.r.plugin.config['autoxa']
|
||||||
else:
|
|
||||||
st = 1
|
|
||||||
self.chk_autoxa.set_active(st)
|
self.chk_autoxa.set_active(st)
|
||||||
|
|
||||||
|
#Autoxatime
|
||||||
|
st = 20
|
||||||
if self.r.plugin.config.has_key('autoxatime'):
|
if self.r.plugin.config.has_key('autoxatime'):
|
||||||
st = self.r.plugin.config['autoxatime']
|
st = self.r.plugin.config['autoxatime']
|
||||||
else:
|
|
||||||
st = 20
|
|
||||||
self.spin_autoxatime.set_value(st)
|
self.spin_autoxatime.set_value(st)
|
||||||
|
|
||||||
xml.signal_connect('gtk_widget_destroy', self.delete_event)
|
xml.signal_connect('gtk_widget_destroy', self.delete_event)
|
||||||
|
@ -346,7 +381,7 @@ class prefs:
|
||||||
self.on_color_button_clicked)
|
self.on_color_button_clicked)
|
||||||
xml.signal_connect('on_ok_clicked', self.on_ok)
|
xml.signal_connect('on_ok_clicked', self.on_ok)
|
||||||
|
|
||||||
class away_msg:
|
class awayMsg_Window:
|
||||||
"""Class for Away Message Window"""
|
"""Class for Away Message Window"""
|
||||||
def delete_event(self, widget):
|
def delete_event(self, widget):
|
||||||
"""close window"""
|
"""close window"""
|
||||||
|
@ -361,22 +396,21 @@ class away_msg:
|
||||||
def run(self):
|
def run(self):
|
||||||
"""Wait for Ok button to be pressed and return away messsage"""
|
"""Wait for Ok button to be pressed and return away messsage"""
|
||||||
rep = self.window.run()
|
rep = self.window.run()
|
||||||
|
msg = ''
|
||||||
if rep == gtk.RESPONSE_OK:
|
if rep == gtk.RESPONSE_OK:
|
||||||
beg, end = self.txtBuffer.get_bounds()
|
beg, end = self.txtBuffer.get_bounds()
|
||||||
msg = self.txtBuffer.get_text(beg, end, 0)
|
msg = self.txtBuffer.get_text(beg, end, 0)
|
||||||
self.window.destroy()
|
self.window.destroy()
|
||||||
if not msg:
|
|
||||||
msg = ""
|
|
||||||
return msg
|
return msg
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
xml = gtk.glade.XML('plugins/gtkgui/gtkgui.glade', 'Away_msg')
|
xml = gtk.glade.XML(GTKGUI_GLADE, 'Away_msg')
|
||||||
self.window = xml.get_widget("Away_msg")
|
self.window = xml.get_widget("Away_msg")
|
||||||
txt = xml.get_widget("textview")
|
txt = xml.get_widget("textview")
|
||||||
self.txtBuffer = txt.get_buffer()
|
self.txtBuffer = txt.get_buffer()
|
||||||
xml.signal_connect('gtk_widget_destroy', self.delete_event)
|
xml.signal_connect('gtk_widget_destroy', self.delete_event)
|
||||||
|
|
||||||
class add:
|
class addContact_Window:
|
||||||
"""Class for Add user window"""
|
"""Class for Add user window"""
|
||||||
def delete_event(self, widget):
|
def delete_event(self, widget):
|
||||||
"""close window"""
|
"""close window"""
|
||||||
|
@ -394,7 +428,7 @@ class add:
|
||||||
|
|
||||||
def __init__(self, roster, jid=None):
|
def __init__(self, roster, jid=None):
|
||||||
self.r = roster
|
self.r = roster
|
||||||
xml = gtk.glade.XML('plugins/gtkgui/gtkgui.glade', 'Add')
|
xml = gtk.glade.XML(GTKGUI_GLADE, 'Add')
|
||||||
self.entry_who = xml.get_widget('entry_who')
|
self.entry_who = xml.get_widget('entry_who')
|
||||||
self.textview_sub = xml.get_widget("textview_sub")
|
self.textview_sub = xml.get_widget("textview_sub")
|
||||||
if jid:
|
if jid:
|
||||||
|
@ -403,30 +437,30 @@ class add:
|
||||||
xml.signal_connect('gtk_widget_destroy', self.delete_event)
|
xml.signal_connect('gtk_widget_destroy', self.delete_event)
|
||||||
xml.signal_connect('on_button_sub_clicked', self.on_subscribe)
|
xml.signal_connect('on_button_sub_clicked', self.on_subscribe)
|
||||||
|
|
||||||
class warning:
|
class warning_Window:
|
||||||
"""Class for warning window : print a warning message"""
|
"""Class for warning window : print a warning message"""
|
||||||
def delete_event(self, widget):
|
def delete_event(self, widget):
|
||||||
"""close window"""
|
"""close window"""
|
||||||
self.window.destroy()
|
self.window.destroy()
|
||||||
|
|
||||||
def __init__(self, txt):
|
def __init__(self, txt):
|
||||||
xml = gtk.glade.XML('plugins/gtkgui/gtkgui.glade', 'Warning')
|
xml = gtk.glade.XML(GTKGUI_GLADE, 'Warning')
|
||||||
self.window = xml.get_widget("Warning")
|
self.window = xml.get_widget("Warning")
|
||||||
xml.get_widget('label').set_text(txt)
|
xml.get_widget('label').set_text(txt)
|
||||||
xml.signal_connect('gtk_widget_destroy', self.delete_event)
|
xml.signal_connect('gtk_widget_destroy', self.delete_event)
|
||||||
|
|
||||||
class about:
|
class about_Window:
|
||||||
"""Class for about window"""
|
"""Class for about window"""
|
||||||
def delete_event(self, widget):
|
def delete_event(self, widget):
|
||||||
"""close window"""
|
"""close window"""
|
||||||
self.Wabout.destroy()
|
self.Wabout.destroy()
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
xml = gtk.glade.XML('plugins/gtkgui/gtkgui.glade', 'About')
|
xml = gtk.glade.XML(GTKGUI_GLADE, 'About')
|
||||||
self.Wabout = xml.get_widget("About")
|
self.Wabout = xml.get_widget("About")
|
||||||
xml.signal_connect('gtk_widget_destroy', self.delete_event)
|
xml.signal_connect('gtk_widget_destroy', self.delete_event)
|
||||||
|
|
||||||
class account_pref:
|
class accountPreference_Window:
|
||||||
"""Class for account informations"""
|
"""Class for account informations"""
|
||||||
def delete_event(self, widget):
|
def delete_event(self, widget):
|
||||||
"""close window"""
|
"""close window"""
|
||||||
|
@ -448,10 +482,10 @@ class account_pref:
|
||||||
name = self.entryName.get_text()
|
name = self.entryName.get_text()
|
||||||
jid = self.entryJid.get_text()
|
jid = self.entryJid.get_text()
|
||||||
if (name == ''):
|
if (name == ''):
|
||||||
warning('You must enter a name for this account')
|
warning_Window('You must enter a name for this account')
|
||||||
return 0
|
return 0
|
||||||
if (jid == '') or (string.count(jid, '@') != 1):
|
if (jid == '') or (string.count(jid, '@') != 1):
|
||||||
warning('You must enter a Jabber ID for this account\n\
|
warning_Window('You must enter a Jabber ID for this account\n\
|
||||||
For example : login@hostname')
|
For example : login@hostname')
|
||||||
return 0
|
return 0
|
||||||
else:
|
else:
|
||||||
|
@ -464,7 +498,7 @@ class account_pref:
|
||||||
#if it's a new account
|
#if it's a new account
|
||||||
else:
|
else:
|
||||||
if name in self.accs.r.accounts:
|
if name in self.accs.r.accounts:
|
||||||
warning('An account already has this name')
|
warning_Window('An account already has this name')
|
||||||
return 0
|
return 0
|
||||||
#if we neeed to register a new account
|
#if we neeed to register a new account
|
||||||
if self.check.get_active():
|
if self.check.get_active():
|
||||||
|
@ -483,7 +517,7 @@ class account_pref:
|
||||||
|
|
||||||
#info must be a dictionnary
|
#info must be a dictionnary
|
||||||
def __init__(self, accs, infos = {}):
|
def __init__(self, accs, infos = {}):
|
||||||
xml = gtk.glade.XML('plugins/gtkgui/gtkgui.glade', 'Account')
|
xml = gtk.glade.XML(GTKGUI_GLADE, 'Account')
|
||||||
self.window = xml.get_widget("Account")
|
self.window = xml.get_widget("Account")
|
||||||
self.entryPass = xml.get_widget("entry_password")
|
self.entryPass = xml.get_widget("entry_password")
|
||||||
self.entryRessource = xml.get_widget("entry_ressource")
|
self.entryRessource = xml.get_widget("entry_ressource")
|
||||||
|
@ -491,22 +525,21 @@ class account_pref:
|
||||||
self.entryName = xml.get_widget("entry_name")
|
self.entryName = xml.get_widget("entry_name")
|
||||||
self.entryJid = xml.get_widget("entry_jid")
|
self.entryJid = xml.get_widget("entry_jid")
|
||||||
self.accs = accs
|
self.accs = accs
|
||||||
|
self.mod = FALSE
|
||||||
if infos:
|
if infos:
|
||||||
self.mod = TRUE
|
self.mod = TRUE
|
||||||
self.acc = infos['name']
|
self.acc = infos['name']
|
||||||
self.init_account(infos)
|
self.init_account(infos)
|
||||||
self.check.set_sensitive(FALSE)
|
self.check.set_sensitive(FALSE)
|
||||||
else:
|
|
||||||
self.mod = FALSE
|
|
||||||
xml.signal_connect('gtk_widget_destroy', self.delete_event)
|
xml.signal_connect('gtk_widget_destroy', self.delete_event)
|
||||||
xml.signal_connect('on_save_clicked', self.on_save_clicked)
|
xml.signal_connect('on_save_clicked', self.on_save_clicked)
|
||||||
|
|
||||||
class accounts:
|
class accounts_Window:
|
||||||
"""Class for accounts window : lists of accounts"""
|
"""Class for accounts window : lists of accounts"""
|
||||||
def delete_event(self, widget):
|
def delete_event(self, widget):
|
||||||
"""close window"""
|
"""close window"""
|
||||||
global Waccounts
|
global accountsWindow
|
||||||
Waccounts = 0
|
accountsWindow = 0
|
||||||
self.window.destroy()
|
self.window.destroy()
|
||||||
|
|
||||||
def init_accounts(self):
|
def init_accounts(self):
|
||||||
|
@ -525,7 +558,7 @@ class accounts:
|
||||||
|
|
||||||
def on_new_clicked(self, widget):
|
def on_new_clicked(self, widget):
|
||||||
"""When new button is clicked : open an account information window"""
|
"""When new button is clicked : open an account information window"""
|
||||||
account_pref(self)
|
accountPreference_Window(self)
|
||||||
|
|
||||||
def on_delete_clicked(self, widget):
|
def on_delete_clicked(self, widget):
|
||||||
"""When delete button is clicked :
|
"""When delete button is clicked :
|
||||||
|
@ -551,11 +584,11 @@ class accounts:
|
||||||
'@' + self.r.plugin.accounts[account]["hostname"]
|
'@' + self.r.plugin.accounts[account]["hostname"]
|
||||||
infos['password'] = self.r.plugin.accounts[account]["password"]
|
infos['password'] = self.r.plugin.accounts[account]["password"]
|
||||||
infos['ressource'] = self.r.plugin.accounts[account]["ressource"]
|
infos['ressource'] = self.r.plugin.accounts[account]["ressource"]
|
||||||
account_pref(self, infos)
|
accountPreference_Window(self, infos)
|
||||||
|
|
||||||
def __init__(self, roster):
|
def __init__(self, roster):
|
||||||
self.r = roster
|
self.r = roster
|
||||||
xml = gtk.glade.XML('plugins/gtkgui/gtkgui.glade', 'Accounts')
|
xml = gtk.glade.XML(GTKGUI_GLADE, 'Accounts')
|
||||||
self.window = xml.get_widget("Accounts")
|
self.window = xml.get_widget("Accounts")
|
||||||
self.treeview = xml.get_widget("treeview")
|
self.treeview = xml.get_widget("treeview")
|
||||||
self.modButt = xml.get_widget("modify_button")
|
self.modButt = xml.get_widget("modify_button")
|
||||||
|
@ -577,7 +610,7 @@ class accounts:
|
||||||
xml.signal_connect('on_modify_clicked', self.on_modify_clicked)
|
xml.signal_connect('on_modify_clicked', self.on_modify_clicked)
|
||||||
self.init_accounts()
|
self.init_accounts()
|
||||||
|
|
||||||
class confirm:
|
class confirm_Window:
|
||||||
"""Class for confirmation window :
|
"""Class for confirmation window :
|
||||||
window that appears to confirm the removal of a contact"""
|
window that appears to confirm the removal of a contact"""
|
||||||
def delete_event(self, widget):
|
def delete_event(self, widget):
|
||||||
|
@ -596,7 +629,7 @@ class confirm:
|
||||||
self.delete_event(self)
|
self.delete_event(self)
|
||||||
|
|
||||||
def __init__(self, roster, iter):
|
def __init__(self, roster, iter):
|
||||||
xml = gtk.glade.XML('plugins/gtkgui/gtkgui.glade', 'Confirm')
|
xml = gtk.glade.XML(GTKGUI_GLADE, 'Confirm')
|
||||||
self.window = xml.get_widget('Confirm')
|
self.window = xml.get_widget('Confirm')
|
||||||
self.r = roster
|
self.r = roster
|
||||||
self.iter = iter
|
self.iter = iter
|
||||||
|
@ -606,7 +639,7 @@ class confirm:
|
||||||
xml.signal_connect('on_okbutton_clicked', self.req_usub)
|
xml.signal_connect('on_okbutton_clicked', self.req_usub)
|
||||||
xml.signal_connect('gtk_widget_destroy', self.delete_event)
|
xml.signal_connect('gtk_widget_destroy', self.delete_event)
|
||||||
|
|
||||||
class authorize:
|
class authorize_Window:
|
||||||
"""Class for authorization window :
|
"""Class for authorization window :
|
||||||
window that appears when a user wants to add us to his/her roster"""
|
window that appears when a user wants to add us to his/her roster"""
|
||||||
def delete_event(self, widget):
|
def delete_event(self, widget):
|
||||||
|
@ -618,7 +651,7 @@ class authorize:
|
||||||
self.r.queueOUT.put(('AUTH', self.jid))
|
self.r.queueOUT.put(('AUTH', self.jid))
|
||||||
self.delete_event(self)
|
self.delete_event(self)
|
||||||
if not self.r.l_contact.has_key(self.jid):
|
if not self.r.l_contact.has_key(self.jid):
|
||||||
add(self.r, self.jid)
|
addContact_Window(self.r, self.jid)
|
||||||
|
|
||||||
def deny(self, widget):
|
def deny(self, widget):
|
||||||
"""refuse the request"""
|
"""refuse the request"""
|
||||||
|
@ -626,7 +659,7 @@ class authorize:
|
||||||
self.delete_event(self)
|
self.delete_event(self)
|
||||||
|
|
||||||
def __init__(self, roster, jid):
|
def __init__(self, roster, jid):
|
||||||
xml = gtk.glade.XML('plugins/gtkgui/gtkgui.glade', 'Sub_req')
|
xml = gtk.glade.XML(GTKGUI_GLADE, 'Sub_req')
|
||||||
self.window = xml.get_widget('Sub_req')
|
self.window = xml.get_widget('Sub_req')
|
||||||
self.r = roster
|
self.r = roster
|
||||||
self.jid = jid
|
self.jid = jid
|
||||||
|
@ -635,7 +668,7 @@ class authorize:
|
||||||
xml.signal_connect('on_button_deny_clicked', self.deny)
|
xml.signal_connect('on_button_deny_clicked', self.deny)
|
||||||
xml.signal_connect('on_button_close_clicked', self.delete_event)
|
xml.signal_connect('on_button_close_clicked', self.delete_event)
|
||||||
|
|
||||||
class agent_reg:
|
class agentRegistration_Window:
|
||||||
"""Class for agent registration window :
|
"""Class for agent registration window :
|
||||||
window that appears when we want to subscribe to an agent"""
|
window that appears when we want to subscribe to an agent"""
|
||||||
def delete_event(self, widget):
|
def delete_event(self, widget):
|
||||||
|
@ -668,7 +701,7 @@ class agent_reg:
|
||||||
self.delete_event(self)
|
self.delete_event(self)
|
||||||
|
|
||||||
def __init__(self, agent, infos, roster):
|
def __init__(self, agent, infos, roster):
|
||||||
xml = gtk.glade.XML('plugins/gtkgui/gtkgui.glade', 'agent_reg')
|
xml = gtk.glade.XML(GTKGUI_GLADE, 'agent_reg')
|
||||||
self.agent = agent
|
self.agent = agent
|
||||||
self.infos = infos
|
self.infos = infos
|
||||||
self.r = roster
|
self.r = roster
|
||||||
|
@ -682,13 +715,13 @@ class agent_reg:
|
||||||
xml.signal_connect('on_button_cancel_clicked', self.delete_event)
|
xml.signal_connect('on_button_cancel_clicked', self.delete_event)
|
||||||
xml.signal_connect('on_button_ok_clicked', self.on_ok)
|
xml.signal_connect('on_button_ok_clicked', self.on_ok)
|
||||||
|
|
||||||
class browser:
|
class browseAgent_Window:
|
||||||
"""Class for rbowser agent window :
|
"""Class for bowser agent window :
|
||||||
to know the agents on the selected server"""
|
to know the agents on the selected server"""
|
||||||
def delete_event(self, widget):
|
def delete_event(self, widget):
|
||||||
"""close window"""
|
"""close window"""
|
||||||
global Wbrowser
|
global browserWindow
|
||||||
Wbrowser = 0
|
browserWindow = 0
|
||||||
self.window.destroy()
|
self.window.destroy()
|
||||||
|
|
||||||
def browse(self):
|
def browse(self):
|
||||||
|
@ -719,7 +752,7 @@ class browser:
|
||||||
self.delete_event(self)
|
self.delete_event(self)
|
||||||
|
|
||||||
def __init__(self, roster):
|
def __init__(self, roster):
|
||||||
xml = gtk.glade.XML('plugins/gtkgui/gtkgui.glade', 'browser')
|
xml = gtk.glade.XML(GTKGUI_GLADE, 'browser')
|
||||||
self.window = xml.get_widget('browser')
|
self.window = xml.get_widget('browser')
|
||||||
self.treeview = xml.get_widget('treeview')
|
self.treeview = xml.get_widget('treeview')
|
||||||
self.r = roster
|
self.r = roster
|
||||||
|
@ -740,9 +773,9 @@ class browser:
|
||||||
if self.r.connected:
|
if self.r.connected:
|
||||||
self.browse()
|
self.browse()
|
||||||
else:
|
else:
|
||||||
warning("You must be connected to view Agents")
|
warning_Window("You must be connected to view Agents")
|
||||||
|
|
||||||
class message:
|
class message_Window:
|
||||||
"""Class for chat window"""
|
"""Class for chat window"""
|
||||||
def delete_event(self, widget):
|
def delete_event(self, widget):
|
||||||
"""close window"""
|
"""close window"""
|
||||||
|
@ -816,15 +849,16 @@ class message:
|
||||||
def __init__(self, user, roster):
|
def __init__(self, user, roster):
|
||||||
self.user = user
|
self.user = user
|
||||||
self.r = roster
|
self.r = roster
|
||||||
xml = gtk.glade.XML('plugins/gtkgui/gtkgui.glade', 'Chat')
|
xml = gtk.glade.XML(GTKGUI_GLADE, 'Chat')
|
||||||
self.hbox = xml.get_widget('hbox1')
|
self.hbox = xml.get_widget('hbox1')
|
||||||
self.hbox.set_property('resize-mode', 2)
|
self.hbox.set_property('resize-mode', 2)
|
||||||
self.window = xml.get_widget('Chat')
|
self.window = xml.get_widget('Chat')
|
||||||
self.window.set_title('Chat with ' + user.name)
|
self.window.set_title('Chat with ' + user.name)
|
||||||
self.img = xml.get_widget('image')
|
self.img = xml.get_widget('image')
|
||||||
self.img.set_from_pixbuf(self.r.pixbufs[user.show])
|
self.img.set_from_pixbuf(self.r.pixbufs[user.show])
|
||||||
xml.get_widget('label_contact').set_text(user.name + ' <'\
|
xml.get_widget('button_contact').set_label(user.name + ' <'\
|
||||||
+ user.jid + '>')
|
+ user.jid + '>')
|
||||||
|
xml.get_widget('button_contact').set_resize_mode(gtk.RESIZE_QUEUE)
|
||||||
self.message = xml.get_widget('message')
|
self.message = xml.get_widget('message')
|
||||||
self.message.grab_focus()
|
self.message.grab_focus()
|
||||||
self.conversation = xml.get_widget('conversation')
|
self.conversation = xml.get_widget('conversation')
|
||||||
|
@ -850,7 +884,7 @@ class message:
|
||||||
color = '#00ff00' #green
|
color = '#00ff00' #green
|
||||||
self.tagStatus.set_property("foreground", color)
|
self.tagStatus.set_property("foreground", color)
|
||||||
|
|
||||||
class roster:
|
class roster_Window:
|
||||||
"""Class for main gtk window"""
|
"""Class for main gtk window"""
|
||||||
def add_user(self, u):
|
def add_user(self, u):
|
||||||
"""Add a user to the roster and add groups if they aren't in roster"""
|
"""Add a user to the roster and add groups if they aren't in roster"""
|
||||||
|
@ -957,8 +991,8 @@ class roster:
|
||||||
u.status = status
|
u.status = status
|
||||||
|
|
||||||
def on_info(self, widget, jid):
|
def on_info(self, widget, jid):
|
||||||
"""Call info_user class to display user's information"""
|
"""Call infoUser_Window class to display user's information"""
|
||||||
info_user(self.l_contact[jid]['user'], self)
|
infoUser_Window(self.l_contact[jid]['user'], self)
|
||||||
|
|
||||||
def mk_menu_c(self, event, iter):
|
def mk_menu_c(self, event, iter):
|
||||||
"""Make user's popup menu"""
|
"""Make user's popup menu"""
|
||||||
|
@ -1057,12 +1091,12 @@ class roster:
|
||||||
|
|
||||||
def on_req_usub(self, widget, iter):
|
def on_req_usub(self, widget, iter):
|
||||||
"""Remove a user"""
|
"""Remove a user"""
|
||||||
window_confirm = confirm(self, iter)
|
window_confirm = confirm_Window(self, iter)
|
||||||
|
|
||||||
def on_status_changed(self, widget):
|
def on_status_changed(self, widget):
|
||||||
"""When we change our status"""
|
"""When we change our status"""
|
||||||
if widget.name != 'online' and widget.name != 'offline':
|
if widget.name != 'online' and widget.name != 'offline':
|
||||||
w = away_msg()
|
w = awayMsg_Window()
|
||||||
txt = w.run()
|
txt = w.run()
|
||||||
else:
|
else:
|
||||||
txt = widget.name
|
txt = widget.name
|
||||||
|
@ -1071,30 +1105,31 @@ class roster:
|
||||||
|
|
||||||
def on_prefs(self, widget):
|
def on_prefs(self, widget):
|
||||||
"""When preferences is selected :
|
"""When preferences is selected :
|
||||||
call the prefs class"""
|
call the preference_Window class"""
|
||||||
window = prefs(self)
|
window = preference_Window(self)
|
||||||
|
|
||||||
def on_add(self, widget):
|
def on_add(self, widget):
|
||||||
"""When add user is selected :
|
"""When add user is selected :
|
||||||
call the add class"""
|
call the add class"""
|
||||||
window_add = add(self)
|
window_add = addContact_Window(self)
|
||||||
|
|
||||||
def on_about(self, widget):
|
def on_about(self, widget):
|
||||||
"""When about is selected :
|
"""When about is selected :
|
||||||
call the about class"""
|
call the about class"""
|
||||||
window_about = about()
|
window_about = about_Window()
|
||||||
|
|
||||||
def on_accounts(self, widget):
|
def on_accounts(self, widget):
|
||||||
"""When accounts is seleted :
|
"""When accounts is seleted :
|
||||||
call the accounts class to modify accounts"""
|
call the accounts class to modify accounts"""
|
||||||
global Waccounts
|
global accountsWindow
|
||||||
if not Waccounts:
|
if not accountsWindow:
|
||||||
Waccounts = accounts(self)
|
accountsWindow = accounts_Window(self)
|
||||||
|
|
||||||
def on_quit(self, widget):
|
def on_quit(self, widget):
|
||||||
"""When we quit the gtk plugin :
|
"""When we quit the gtk plugin :
|
||||||
tell that to the core and exit gtk"""
|
tell that to the core and exit gtk"""
|
||||||
self.queueOUT.put(('QUIT',''))
|
self.queueOUT.put(('QUIT',''))
|
||||||
|
print "plugin gtkgui stopped"
|
||||||
gtk.mainquit()
|
gtk.mainquit()
|
||||||
|
|
||||||
def on_row_activated(self, widget, path, col=0):
|
def on_row_activated(self, widget, path, col=0):
|
||||||
|
@ -1112,7 +1147,7 @@ class roster:
|
||||||
if self.tab_messages.has_key(jid):
|
if self.tab_messages.has_key(jid):
|
||||||
self.tab_messages[jid].window.present()
|
self.tab_messages[jid].window.present()
|
||||||
elif self.l_contact.has_key(jid):
|
elif self.l_contact.has_key(jid):
|
||||||
self.tab_messages[jid] = message(self.l_contact[jid]['user'], self)
|
self.tab_messages[jid] = message_Window(self.l_contact[jid]['user'], self)
|
||||||
if self.tab_queues.has_key(jid):
|
if self.tab_queues.has_key(jid):
|
||||||
self.tab_messages[jid].read_queue(self.tab_queues[jid])
|
self.tab_messages[jid].read_queue(self.tab_queues[jid])
|
||||||
|
|
||||||
|
@ -1139,7 +1174,7 @@ class roster:
|
||||||
if self.tab_messages.has_key(jid):
|
if self.tab_messages.has_key(jid):
|
||||||
self.tab_messages[jid].window.present()
|
self.tab_messages[jid].window.present()
|
||||||
elif self.l_contact.has_key(jid):
|
elif self.l_contact.has_key(jid):
|
||||||
self.tab_messages[jid] = message(self.l_contact[jid]['user'], self)
|
self.tab_messages[jid] = message_Window(self.l_contact[jid]['user'], self)
|
||||||
if self.tab_queues.has_key(jid):
|
if self.tab_queues.has_key(jid):
|
||||||
self.tab_messages[jid].read_queue(self.tab_queues[jid])
|
self.tab_messages[jid].read_queue(self.tab_queues[jid])
|
||||||
else:
|
else:
|
||||||
|
@ -1151,9 +1186,9 @@ class roster:
|
||||||
def on_browse(self, widget):
|
def on_browse(self, widget):
|
||||||
"""When browse agent is selected :
|
"""When browse agent is selected :
|
||||||
Call browse class"""
|
Call browse class"""
|
||||||
global Wbrowser
|
global browserWindow
|
||||||
if not Wbrowser:
|
if not browserWindow:
|
||||||
Wbrowser = browser(self)
|
browserWindow = browseAgent_Window(self)
|
||||||
|
|
||||||
def mkpixbufs(self):
|
def mkpixbufs(self):
|
||||||
"""initialise pixbufs array"""
|
"""initialise pixbufs array"""
|
||||||
|
@ -1161,17 +1196,21 @@ class roster:
|
||||||
self.pixbufs = {}
|
self.pixbufs = {}
|
||||||
for state in ('online', 'away', 'xa', 'dnd', 'offline', \
|
for state in ('online', 'away', 'xa', 'dnd', 'offline', \
|
||||||
'requested', 'message', 'opened', 'closed', 'not in list'):
|
'requested', 'message', 'opened', 'closed', 'not in list'):
|
||||||
#open an animated gif file if it exists oterelse a xpm file
|
# try to open a pixfile with the correct method
|
||||||
if not os.path.exists(self.path + state + '.gif'):
|
files = []
|
||||||
if not os.path.exists(self.path + state + '.xpm'):
|
files.append(self.path + state + '.gif')
|
||||||
print 'No such file : ' + self.path + state + '.gif / xpm'
|
files.append(self.path + state + '.png')
|
||||||
self.pixbufs[state] = None
|
files.append(self.path + state + '.xpm')
|
||||||
else:
|
self.pixbufs[state] = None
|
||||||
pix = gtk.gdk.pixbuf_new_from_file(self.path + state + '.xpm')
|
for file in files:
|
||||||
self.pixbufs[state] = pix
|
if not os.path.exists(file):
|
||||||
else:
|
continue
|
||||||
pix = gtk.gdk.pixbufAnimation(self.path + state + '.gif')
|
fct = gtk.gdk.pixbuf_new_from_file
|
||||||
|
if file.find('.gif') != -1:
|
||||||
|
fct = gtk.gdk.pixbufAnimation
|
||||||
|
pix = fct(file)
|
||||||
self.pixbufs[state] = pix
|
self.pixbufs[state] = pix
|
||||||
|
break
|
||||||
|
|
||||||
def on_show_off(self, widget):
|
def on_show_off(self, widget):
|
||||||
"""when show offline option is changed :
|
"""when show offline option is changed :
|
||||||
|
@ -1181,7 +1220,7 @@ class roster:
|
||||||
|
|
||||||
def __init__(self, queueOUT, plug):
|
def __init__(self, queueOUT, plug):
|
||||||
# FIXME : handle no file ...
|
# FIXME : handle no file ...
|
||||||
xml = gtk.glade.XML('plugins/gtkgui/gtkgui.glade', 'Gajim')
|
xml = gtk.glade.XML(GTKGUI_GLADE, 'Gajim')
|
||||||
self.window = xml.get_widget('Gajim')
|
self.window = xml.get_widget('Gajim')
|
||||||
self.tree = xml.get_widget('treeview')
|
self.tree = xml.get_widget('treeview')
|
||||||
self.plugin = plug
|
self.plugin = plug
|
||||||
|
@ -1268,17 +1307,25 @@ class plugin:
|
||||||
"""Class called by the core in a new thread"""
|
"""Class called by the core in a new thread"""
|
||||||
def wait(self, what):
|
def wait(self, what):
|
||||||
"""Wait for a message from Core"""
|
"""Wait for a message from Core"""
|
||||||
#TODO: timeout, save messages that don't fit
|
#TODO: timeout
|
||||||
|
temp_q = Queue.Queue(50)
|
||||||
while 1:
|
while 1:
|
||||||
if not self.queueIN.empty():
|
if not self.queueIN.empty():
|
||||||
ev = self.queueIN.get()
|
ev = self.queueIN.get()
|
||||||
if ev[0] == what:
|
if ev[0] == what and ev[1][0] == 'GtkGui':
|
||||||
return ev[1]
|
#Restore messages
|
||||||
|
while not temp_q.empty():
|
||||||
|
ev2 = temp_q.get()
|
||||||
|
self.queueIN.put(ev)
|
||||||
|
return ev[1][1]
|
||||||
|
else:
|
||||||
|
#Save messages
|
||||||
|
temp_q.put(ev)
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
|
|
||||||
def read_queue(self):
|
def read_queue(self):
|
||||||
"""Read queue from the core and execute commands from it"""
|
"""Read queue from the core and execute commands from it"""
|
||||||
global Wbrowser
|
global browserWindow
|
||||||
model = self.r.tree.get_model()
|
model = self.r.tree.get_model()
|
||||||
while self.queueIN.empty() == 0:
|
while self.queueIN.empty() == 0:
|
||||||
ev = self.queueIN.get()
|
ev = self.queueIN.get()
|
||||||
|
@ -1287,7 +1334,7 @@ class plugin:
|
||||||
self.r.mklists(ev[1])
|
self.r.mklists(ev[1])
|
||||||
self.r.draw_roster()
|
self.r.draw_roster()
|
||||||
elif ev[0] == 'WARNING':
|
elif ev[0] == 'WARNING':
|
||||||
warning(ev[1])
|
warning_Window(ev[1])
|
||||||
elif ev[0] == 'STATUS':
|
elif ev[0] == 'STATUS':
|
||||||
st = ""
|
st = ""
|
||||||
for i in range(7):
|
for i in range(7):
|
||||||
|
@ -1302,8 +1349,8 @@ class plugin:
|
||||||
self.r.chg_status(j, 'offline', 'Disconnected')
|
self.r.chg_status(j, 'offline', 'Disconnected')
|
||||||
elif self.r.connected == 0:
|
elif self.r.connected == 0:
|
||||||
self.r.connected = 1
|
self.r.connected = 1
|
||||||
self.sleeper = common.sleepy.Sleepy(\
|
self.sleeper = None#common.sleepy.Sleepy(\
|
||||||
self.autoawaytime*60, self.autoxatime*60)
|
#self.autoawaytime*60, self.autoxatime*60)
|
||||||
|
|
||||||
elif ev[0] == 'NOTIFY':
|
elif ev[0] == 'NOTIFY':
|
||||||
jid = string.split(ev[1][0], '/')[0]
|
jid = string.split(ev[1][0], '/')[0]
|
||||||
|
@ -1366,12 +1413,12 @@ class plugin:
|
||||||
if not self.r.tab_messages.has_key(jid):
|
if not self.r.tab_messages.has_key(jid):
|
||||||
if self.r.l_contact.has_key(jid):
|
if self.r.l_contact.has_key(jid):
|
||||||
self.r.tab_messages[jid] = \
|
self.r.tab_messages[jid] = \
|
||||||
message(self.r.l_contact[jid]['user'], self.r)
|
message_Window(self.r.l_contact[jid]['user'], self.r)
|
||||||
if self.r.tab_messages.has_key(jid):
|
if self.r.tab_messages.has_key(jid):
|
||||||
self.r.tab_messages[jid].print_conversation(ev[1][1])
|
self.r.tab_messages[jid].print_conversation(ev[1][1])
|
||||||
|
|
||||||
elif ev[0] == 'SUBSCRIBE':
|
elif ev[0] == 'SUBSCRIBE':
|
||||||
authorize(self.r, ev[1])
|
authorize_Window(self.r, ev[1])
|
||||||
elif ev[0] == 'SUBSCRIBED':
|
elif ev[0] == 'SUBSCRIBED':
|
||||||
jid = ev[1]['jid']
|
jid = ev[1]['jid']
|
||||||
if self.r.l_contact.has_key(jid):
|
if self.r.l_contact.has_key(jid):
|
||||||
|
@ -1383,25 +1430,25 @@ class plugin:
|
||||||
user1 = user(jid, jid, ['general'], 'online', \
|
user1 = user(jid, jid, ['general'], 'online', \
|
||||||
'online', 'to', ev[1]['ressource'])
|
'online', 'to', ev[1]['ressource'])
|
||||||
self.r.add_user(user1)
|
self.r.add_user(user1)
|
||||||
warning("You are now authorized by " + jid)
|
warning_Window("You are now authorized by " + jid)
|
||||||
elif ev[0] == 'UNSUBSCRIBED':
|
elif ev[0] == 'UNSUBSCRIBED':
|
||||||
warning("You are now unsubscribed by " + jid)
|
warning_Window("You are now unsubscribed by " + jid)
|
||||||
#TODO: change icon
|
#TODO: change icon
|
||||||
elif ev[0] == 'AGENTS':
|
elif ev[0] == 'AGENTS':
|
||||||
if Wbrowser:
|
if browserWindow:
|
||||||
Wbrowser.agents(ev[1])
|
browserWindow.agents(ev[1])
|
||||||
elif ev[0] == 'AGENT_INFO':
|
elif ev[0] == 'AGENT_INFO':
|
||||||
if not ev[1][1].has_key('instructions'):
|
if not ev[1][1].has_key('instructions'):
|
||||||
warning('error contacting %s' % ev[1][0])
|
warning_Window('error contacting %s' % ev[1][0])
|
||||||
else:
|
else:
|
||||||
Wreg = agent_reg(ev[1][0], ev[1][1], self.r)
|
Wreg = agentRegistration_Window(ev[1][0], ev[1][1], self.r)
|
||||||
#('ACC_OK', (hostname, login, pasword, name, ressource))
|
#('ACC_OK', (hostname, login, pasword, name, ressource))
|
||||||
elif ev[0] == 'ACC_OK':
|
elif ev[0] == 'ACC_OK':
|
||||||
self.accounts[ev[1][3]] = {'ressource': ev[1][4], \
|
self.accounts[ev[1][3]] = {'ressource': ev[1][4], \
|
||||||
'password': ev[1][2], 'hostname': ev[1][0], 'name': ev[1][1]}
|
'password': ev[1][2], 'hostname': ev[1][0], 'name': ev[1][1]}
|
||||||
self.r.queueOUT.put(('CONFIG', ('accounts', self.r.plugin.accounts)))
|
self.r.queueOUT.put(('CONFIG', ('accounts', self.r.plugin.accounts)))
|
||||||
if (Waccounts != 0):
|
if (accountsWindow != 0):
|
||||||
Waccounts.init_accounts()
|
accountsWindow.init_accounts()
|
||||||
elif ev[0] == 'QUIT':
|
elif ev[0] == 'QUIT':
|
||||||
self.r.on_quit(self)
|
self.r.on_quit(self)
|
||||||
return 1
|
return 1
|
||||||
|
@ -1436,12 +1483,12 @@ class plugin:
|
||||||
gtk.threads_init()
|
gtk.threads_init()
|
||||||
gtk.threads_enter()
|
gtk.threads_enter()
|
||||||
self.queueIN = quIN
|
self.queueIN = quIN
|
||||||
quOUT.put(('ASK_CONFIG', 'GtkGui'))
|
quOUT.put(('ASK_CONFIG', ('GtkGui', 'GtkGui')))
|
||||||
self.config = self.wait('CONFIG')
|
self.config = self.wait('CONFIG')
|
||||||
quOUT.put(('ASK_CONFIG', 'accounts'))
|
quOUT.put(('ASK_CONFIG', ('GtkGui', 'accounts')))
|
||||||
self.accounts = self.wait('CONFIG')
|
self.accounts = self.wait('CONFIG')
|
||||||
#TODO: if no config : default config and save it
|
#TODO: if no config : default config and save it
|
||||||
self.r = roster(quOUT, self)
|
self.r = roster_Window(quOUT, self)
|
||||||
if self.config.has_key('autoaway'):
|
if self.config.has_key('autoaway'):
|
||||||
self.autoaway = self.config['autoaway']
|
self.autoaway = self.config['autoaway']
|
||||||
else:
|
else:
|
||||||
|
|
125
plugins/gtkgui/icons/sun/away.xpm
Normal file
125
plugins/gtkgui/icons/sun/away.xpm
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * away_xpm[] = {
|
||||||
|
"16 16 106 2",
|
||||||
|
" c None",
|
||||||
|
". c #E3D244",
|
||||||
|
"+ c #EAD735",
|
||||||
|
"@ c #EDDA40",
|
||||||
|
"# c #ECDA43",
|
||||||
|
"$ c #ECDB47",
|
||||||
|
"% c #EDDA42",
|
||||||
|
"& c #EBD943",
|
||||||
|
"* c #EAD944",
|
||||||
|
"= c #EDDC41",
|
||||||
|
"- c #EFDD47",
|
||||||
|
"; c #EDDA3E",
|
||||||
|
"> c #EEDC45",
|
||||||
|
", c #FFEF98",
|
||||||
|
"' c #EEDD47",
|
||||||
|
") c #FFEE5C",
|
||||||
|
"! c #EFDD46",
|
||||||
|
"~ c #FFE849",
|
||||||
|
"{ c #E7D646",
|
||||||
|
"] c #E7D95E",
|
||||||
|
"^ c #E9D847",
|
||||||
|
"/ c #F7E653",
|
||||||
|
"( c #F1E486",
|
||||||
|
"_ c #F6EFA2",
|
||||||
|
": c #EFE48A",
|
||||||
|
"< c #EFEAAA",
|
||||||
|
"[ c #E8EEE3",
|
||||||
|
"} c #E9EFDC",
|
||||||
|
"| c #E2EBE8",
|
||||||
|
"1 c #E7EBD1",
|
||||||
|
"2 c #EAEED9",
|
||||||
|
"3 c #E8EDE6",
|
||||||
|
"4 c #E9E398",
|
||||||
|
"5 c #E1E7E9",
|
||||||
|
"6 c #BEC3C5",
|
||||||
|
"7 c #CED3D5",
|
||||||
|
"8 c #C3C8CA",
|
||||||
|
"9 c #EAECEE",
|
||||||
|
"0 c #E4E8E0",
|
||||||
|
"a c #E7EEE5",
|
||||||
|
"b c #E0E6E6",
|
||||||
|
"c c #DAE1E0",
|
||||||
|
"d c #DBE4E5",
|
||||||
|
"e c #E2EBE9",
|
||||||
|
"f c #E1E9E9",
|
||||||
|
"g c #E2E8E3",
|
||||||
|
"h c #E7EEEF",
|
||||||
|
"i c #E0E6E7",
|
||||||
|
"j c #C1C6C8",
|
||||||
|
"k c #D7DCDE",
|
||||||
|
"l c #C3C8C9",
|
||||||
|
"m c #F1F3F4",
|
||||||
|
"n c #E8EDEB",
|
||||||
|
"o c #E2E7E3",
|
||||||
|
"p c #E4ECE5",
|
||||||
|
"q c #DAE2E1",
|
||||||
|
"r c #D6DEDE",
|
||||||
|
"s c #D6DFDF",
|
||||||
|
"t c #E0E9EA",
|
||||||
|
"u c #E1EAEB",
|
||||||
|
"v c #E2EAEB",
|
||||||
|
"w c #E4EBEC",
|
||||||
|
"x c #DAE1E2",
|
||||||
|
"y c #E2E8E9",
|
||||||
|
"z c #E4EAEB",
|
||||||
|
"A c #CDD2D2",
|
||||||
|
"B c #EDF2ED",
|
||||||
|
"C c #E3E8E6",
|
||||||
|
"D c #E3EBE4",
|
||||||
|
"E c #DDE5E2",
|
||||||
|
"F c #D9E1E0",
|
||||||
|
"G c #DBE3E3",
|
||||||
|
"H c #E3EDEE",
|
||||||
|
"I c #E4EEEF",
|
||||||
|
"J c #E1E9EA",
|
||||||
|
"K c #DDE4E5",
|
||||||
|
"L c #DCE3E4",
|
||||||
|
"M c #E1E7E8",
|
||||||
|
"N c #E3EAEB",
|
||||||
|
"O c #CDD2D3",
|
||||||
|
"P c #C0C5C7",
|
||||||
|
"Q c #E5EDEE",
|
||||||
|
"R c #DEE4E1",
|
||||||
|
"S c #E0E7E3",
|
||||||
|
"T c #E6EDE7",
|
||||||
|
"U c #E6EDED",
|
||||||
|
"V c #E7F0F1",
|
||||||
|
"W c #E5EFF0",
|
||||||
|
"X c #E2E9EA",
|
||||||
|
"Y c #E6EDEE",
|
||||||
|
"Z c #D4DCDD",
|
||||||
|
"` c #D0D7D8",
|
||||||
|
" . c #BEC5C5",
|
||||||
|
".. c #C9D2D2",
|
||||||
|
"+. c #C4CECE",
|
||||||
|
"@. c #C6CECF",
|
||||||
|
"#. c #C9D0D1",
|
||||||
|
"$. c #E8F1F2",
|
||||||
|
"%. c #C3CACB",
|
||||||
|
"&. c #BFC5C6",
|
||||||
|
"*. c #D5DCDD",
|
||||||
|
"=. c #CACFD0",
|
||||||
|
"-. c #CCD1D2",
|
||||||
|
";. c #C4CBCC",
|
||||||
|
">. c #CBD2D2",
|
||||||
|
",. c #B7C0C2",
|
||||||
|
" ",
|
||||||
|
" . + ",
|
||||||
|
" @ # $ . ",
|
||||||
|
" % @ & * = - - ",
|
||||||
|
" ; > , , , , ' ) - ",
|
||||||
|
" ! , , ~ ~ , , { ",
|
||||||
|
"] ] , , ~ ~ ~ ~ , , ^ / - ",
|
||||||
|
" ] ( _ _ ~ ~ ~ ~ , ^ ",
|
||||||
|
" ] : < [ } | 1 2 3 4 5 6 7 ",
|
||||||
|
"8 9 ] 0 a b c d e f g h i j k l ",
|
||||||
|
"8 m n o p q r s t u v w x y z A ",
|
||||||
|
"8 8 B C D E F G H I J K L M N O ",
|
||||||
|
" P Q R S T U V W v X K N Y 6 ",
|
||||||
|
" 8 Z ` ...+.@.#.$.%.&.*.=. ",
|
||||||
|
" -.;. >.,. -. ",
|
||||||
|
" "};
|
21
plugins/gtkgui/icons/sun/closed.xpm
Normal file
21
plugins/gtkgui/icons/sun/closed.xpm
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * closed_xpm[] = {
|
||||||
|
"16 16 2 1",
|
||||||
|
" c None",
|
||||||
|
". c #000000",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" .. ",
|
||||||
|
" ... ",
|
||||||
|
" ... ",
|
||||||
|
" ... ",
|
||||||
|
"............... ",
|
||||||
|
"................",
|
||||||
|
"............... ",
|
||||||
|
" ... ",
|
||||||
|
" ... ",
|
||||||
|
" ... ",
|
||||||
|
" .. ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" "};
|
64
plugins/gtkgui/icons/sun/dnd.xpm
Normal file
64
plugins/gtkgui/icons/sun/dnd.xpm
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * dnd_xpm[] = {
|
||||||
|
"16 16 45 1",
|
||||||
|
" c None",
|
||||||
|
". c #717171",
|
||||||
|
"+ c #9E9E9E",
|
||||||
|
"@ c #9B9B9B",
|
||||||
|
"# c #9F9F9F",
|
||||||
|
"$ c #A1A1A1",
|
||||||
|
"% c #9C9C9C",
|
||||||
|
"& c #989898",
|
||||||
|
"* c #999999",
|
||||||
|
"= c #A3A3A3",
|
||||||
|
"- c #A2A2A2",
|
||||||
|
"; c #959595",
|
||||||
|
"> c #949494",
|
||||||
|
", c #8F8F8F",
|
||||||
|
"' c #898989",
|
||||||
|
") c #969696",
|
||||||
|
"! c #939393",
|
||||||
|
"~ c #888888",
|
||||||
|
"{ c #8C8C8C",
|
||||||
|
"] c #828282",
|
||||||
|
"^ c #7A7A7A",
|
||||||
|
"/ c #858585",
|
||||||
|
"( c #8A8A8A",
|
||||||
|
"_ c #868686",
|
||||||
|
": c #9D9D9D",
|
||||||
|
"< c #8D8D8D",
|
||||||
|
"[ c #8B8B8B",
|
||||||
|
"} c #9A9A9A",
|
||||||
|
"| c #AAAAAA",
|
||||||
|
"1 c #797979",
|
||||||
|
"2 c #909090",
|
||||||
|
"3 c #838383",
|
||||||
|
"4 c #7D7D7D",
|
||||||
|
"5 c #808080",
|
||||||
|
"6 c #B6A200",
|
||||||
|
"7 c #848484",
|
||||||
|
"8 c #979797",
|
||||||
|
"9 c #8E8E8E",
|
||||||
|
"0 c #878787",
|
||||||
|
"a c #B7AE5F",
|
||||||
|
"b c #FFE400",
|
||||||
|
"c c #FEFFA8",
|
||||||
|
"d c #B8AF61",
|
||||||
|
"e c #B7AE60",
|
||||||
|
"f c #FEF466",
|
||||||
|
" .... .... ",
|
||||||
|
" .+@+.....#$.. ",
|
||||||
|
" .%&*=.$-*;;$. ",
|
||||||
|
"..+>,')!&#;~{@..",
|
||||||
|
".-&]^/(_,:)<[}|.",
|
||||||
|
".-)1^2345;)6>@..",
|
||||||
|
".$)7,890.aab%%. ",
|
||||||
|
"..@8....abbca. ",
|
||||||
|
" ... bcaa ",
|
||||||
|
" abca ",
|
||||||
|
" abca ",
|
||||||
|
" aaabcd ",
|
||||||
|
" abbcce ",
|
||||||
|
" abfaa ",
|
||||||
|
" aba ",
|
||||||
|
" a "};
|
21
plugins/gtkgui/icons/sun/message.xpm
Normal file
21
plugins/gtkgui/icons/sun/message.xpm
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * message_xpm[] = {
|
||||||
|
"16 16 2 1",
|
||||||
|
" c None",
|
||||||
|
". c #000000",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" .... ... ",
|
||||||
|
" .... ... ",
|
||||||
|
" .... .... ",
|
||||||
|
" ..... . .. ",
|
||||||
|
" .. .. . .. ",
|
||||||
|
" .. .. . .. ",
|
||||||
|
" .. ... .. .. ",
|
||||||
|
" .. .. . .. ",
|
||||||
|
" .. .. . .. ",
|
||||||
|
" .. ... .. ",
|
||||||
|
" .. .. .. ",
|
||||||
|
" .. .. .. ",
|
||||||
|
" .... .....",
|
||||||
|
" "};
|
62
plugins/gtkgui/icons/sun/offline.xpm
Normal file
62
plugins/gtkgui/icons/sun/offline.xpm
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * offline2_xpm[] = {
|
||||||
|
"16 16 43 1",
|
||||||
|
" c None",
|
||||||
|
". c #887D1D",
|
||||||
|
"+ c #8A801D",
|
||||||
|
"@ c #92851D",
|
||||||
|
"# c #9C8D1D",
|
||||||
|
"$ c #AC9D25",
|
||||||
|
"% c #867B1D",
|
||||||
|
"& c #BFB445",
|
||||||
|
"* c #BFB863",
|
||||||
|
"= c #BFBA76",
|
||||||
|
"- c #C0B969",
|
||||||
|
"; c #93871D",
|
||||||
|
"> c #BFB23B",
|
||||||
|
", c #BFB342",
|
||||||
|
"' c #BFB85D",
|
||||||
|
") c #BFBA77",
|
||||||
|
"! c #BFAE26",
|
||||||
|
"~ c #BFB551",
|
||||||
|
"{ c #BFB866",
|
||||||
|
"] c #BFB86B",
|
||||||
|
"^ c #BFB973",
|
||||||
|
"/ c #BFB02D",
|
||||||
|
"( c #BFB134",
|
||||||
|
"_ c #BFB65B",
|
||||||
|
": c #BFB860",
|
||||||
|
"< c #BFB13A",
|
||||||
|
"[ c #BFB970",
|
||||||
|
"} c #BFB54F",
|
||||||
|
"| c #BFBA80",
|
||||||
|
"1 c #BFB975",
|
||||||
|
"2 c #BFB974",
|
||||||
|
"3 c #BFB33D",
|
||||||
|
"4 c #BFBA7A",
|
||||||
|
"5 c #BFB030",
|
||||||
|
"6 c #BFB136",
|
||||||
|
"7 c #BFB868",
|
||||||
|
"8 c #BFB450",
|
||||||
|
"9 c #BFB85E",
|
||||||
|
"0 c #BFB864",
|
||||||
|
"a c #BFB44E",
|
||||||
|
"b c #BFB96E",
|
||||||
|
"c c #BFB550",
|
||||||
|
"d c #C0B64D",
|
||||||
|
" .+@#$ ",
|
||||||
|
" %%&*=-; ",
|
||||||
|
" %%>,'))% ",
|
||||||
|
" %!!~{]^% ",
|
||||||
|
" %!!/'^)% ",
|
||||||
|
" %/(_:^)% ",
|
||||||
|
" %!<,^][% ",
|
||||||
|
" %!,}|12% ",
|
||||||
|
" %!3,422% ",
|
||||||
|
" %!56777% ",
|
||||||
|
" %!!8999% ",
|
||||||
|
" %!!/'90% ",
|
||||||
|
" %!!a9b=% ",
|
||||||
|
" %%!8b=^% ",
|
||||||
|
" %%c*:d; ",
|
||||||
|
" .+@#$ "};
|
81
plugins/gtkgui/icons/sun/online.xpm
Normal file
81
plugins/gtkgui/icons/sun/online.xpm
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * online_xpm[] = {
|
||||||
|
"16 16 62 1",
|
||||||
|
" c None",
|
||||||
|
". c #E6CB02",
|
||||||
|
"+ c #E6C104",
|
||||||
|
"@ c #E6CA02",
|
||||||
|
"# c #E6D101",
|
||||||
|
"$ c #E6C603",
|
||||||
|
"% c #FFDE03",
|
||||||
|
"& c #E6C902",
|
||||||
|
"* c #E6CD02",
|
||||||
|
"= c #E6BA05",
|
||||||
|
"- c #E6C004",
|
||||||
|
"; c #FFDA04",
|
||||||
|
"> c #FFDC04",
|
||||||
|
", c #FFDE04",
|
||||||
|
"' c #E6D001",
|
||||||
|
") c #E6BA06",
|
||||||
|
"! c #E6BC05",
|
||||||
|
"~ c #FFD305",
|
||||||
|
"{ c #FFD505",
|
||||||
|
"] c #FFD704",
|
||||||
|
"^ c #FFD904",
|
||||||
|
"/ c #FFDB04",
|
||||||
|
"( c #FFDD03",
|
||||||
|
"_ c #FFDF03",
|
||||||
|
": c #E6CC02",
|
||||||
|
"< c #FFD106",
|
||||||
|
"[ c #FFD306",
|
||||||
|
"} c #FFD506",
|
||||||
|
"| c #FFD705",
|
||||||
|
"1 c #FFDD04",
|
||||||
|
"2 c #E6B606",
|
||||||
|
"3 c #FFCD07",
|
||||||
|
"4 c #FFCF06",
|
||||||
|
"5 c #FFD405",
|
||||||
|
"6 c #FFD905",
|
||||||
|
"7 c #E6C903",
|
||||||
|
"8 c #E6B007",
|
||||||
|
"9 c #E6B207",
|
||||||
|
"0 c #FFC807",
|
||||||
|
"a c #FFCB07",
|
||||||
|
"b c #FFCC06",
|
||||||
|
"c c #FFCE07",
|
||||||
|
"d c #FFD007",
|
||||||
|
"e c #E6B307",
|
||||||
|
"f c #FFC808",
|
||||||
|
"g c #FFCA08",
|
||||||
|
"h c #FFCF07",
|
||||||
|
"i c #FFD206",
|
||||||
|
"j c #FFD605",
|
||||||
|
"k c #E6C404",
|
||||||
|
"l c #FFCC07",
|
||||||
|
"m c #FFD006",
|
||||||
|
"n c #FFD406",
|
||||||
|
"o c #E6AE08",
|
||||||
|
"p c #FFC608",
|
||||||
|
"q c #FFCE06",
|
||||||
|
"r c #E6BF04",
|
||||||
|
"s c #E6AA09",
|
||||||
|
"t c #E6B208",
|
||||||
|
"u c #E6B906",
|
||||||
|
"v c #E6BB05",
|
||||||
|
"w c #E6B506",
|
||||||
|
" . ",
|
||||||
|
" + @ # ",
|
||||||
|
" + $%& * ",
|
||||||
|
" = -+;>,&. ' ",
|
||||||
|
" )!~{]^/(_.: ",
|
||||||
|
" =<[}|^/1& ",
|
||||||
|
" 234<~5|6/(7 ",
|
||||||
|
"890abcd[}|6/(7@ ",
|
||||||
|
" efg3h<i5j6k ",
|
||||||
|
" 9fal4min+ ",
|
||||||
|
" o8pfglqdir+ ",
|
||||||
|
" s 8tfgluv + ",
|
||||||
|
" o 9fw u ",
|
||||||
|
" s 9 u ",
|
||||||
|
" 8 ",
|
||||||
|
" "};
|
21
plugins/gtkgui/icons/sun/opened.xpm
Normal file
21
plugins/gtkgui/icons/sun/opened.xpm
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * opened_xpm[] = {
|
||||||
|
"16 16 2 1",
|
||||||
|
" c None",
|
||||||
|
". c #000000",
|
||||||
|
" ... ",
|
||||||
|
" ... ",
|
||||||
|
" ... ",
|
||||||
|
" ... ",
|
||||||
|
" ... ",
|
||||||
|
" ... ",
|
||||||
|
" ... ",
|
||||||
|
" ... ",
|
||||||
|
" ... ",
|
||||||
|
" .. ... .. ",
|
||||||
|
" ... ... ... ",
|
||||||
|
" ......... ",
|
||||||
|
" ....... ",
|
||||||
|
" ..... ",
|
||||||
|
" ... ",
|
||||||
|
" . "};
|
21
plugins/gtkgui/icons/sun/requested.xpm
Normal file
21
plugins/gtkgui/icons/sun/requested.xpm
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * requested_xpm[] = {
|
||||||
|
"16 16 2 1",
|
||||||
|
" c None",
|
||||||
|
". c #000000",
|
||||||
|
" ",
|
||||||
|
" ... ",
|
||||||
|
" . .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" ... .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" . ",
|
||||||
|
" . ",
|
||||||
|
" ",
|
||||||
|
" . ",
|
||||||
|
" ... ",
|
||||||
|
" . ",
|
||||||
|
" "};
|
68
plugins/gtkgui/icons/sun/xa.xpm
Normal file
68
plugins/gtkgui/icons/sun/xa.xpm
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * extend_away_xpm[] = {
|
||||||
|
"16 16 49 1",
|
||||||
|
" c None",
|
||||||
|
". c #B8B8B8",
|
||||||
|
"+ c #AEAEAE",
|
||||||
|
"@ c #AFAFAF",
|
||||||
|
"# c #B5B5B5",
|
||||||
|
"$ c #B7B7B7",
|
||||||
|
"% c #B0B0B0",
|
||||||
|
"& c #A8A8A8",
|
||||||
|
"* c #EAEAEA",
|
||||||
|
"= c #B3B3B3",
|
||||||
|
"- c #ABABAB",
|
||||||
|
"; c #E2E2E2",
|
||||||
|
"> c #DDDDDD",
|
||||||
|
", c #EBEBEB",
|
||||||
|
"' c #B1B1B1",
|
||||||
|
") c #B6B6B6",
|
||||||
|
"! c #A9A9A9",
|
||||||
|
"~ c #D7D7D7",
|
||||||
|
"{ c #D9D9D9",
|
||||||
|
"] c #E8E8E8",
|
||||||
|
"^ c #EFEFEF",
|
||||||
|
"/ c #E3E3E3",
|
||||||
|
"( c #E1E1E1",
|
||||||
|
"_ c #DADADA",
|
||||||
|
": c #F5F5F5",
|
||||||
|
"< c #E0E0E0",
|
||||||
|
"[ c #E7E7E7",
|
||||||
|
"} c #D6D6D6",
|
||||||
|
"| c #DFDFDF",
|
||||||
|
"1 c #E5E5E5",
|
||||||
|
"2 c #EDEDED",
|
||||||
|
"3 c #F1F1F1",
|
||||||
|
"4 c #B2B2B2",
|
||||||
|
"5 c #DEDEDE",
|
||||||
|
"6 c #E6E6E6",
|
||||||
|
"7 c #F0F0F0",
|
||||||
|
"8 c #F3F3F3",
|
||||||
|
"9 c #EEEEEE",
|
||||||
|
"0 c #ECECEC",
|
||||||
|
"a c #ACACAC",
|
||||||
|
"b c #E4E4E4",
|
||||||
|
"c c #F8F8F8",
|
||||||
|
"d c #DCDCDC",
|
||||||
|
"e c #D4D4D4",
|
||||||
|
"f c #ADADAD",
|
||||||
|
"g c #A2A2A2",
|
||||||
|
"h c #B4B4B4",
|
||||||
|
"i c #A3D7F9",
|
||||||
|
"j c #48B1F4",
|
||||||
|
" ... +@#$ ",
|
||||||
|
" %&*=$-;>,'.)## ",
|
||||||
|
".!~{]^/(_],:*<[=",
|
||||||
|
".]}{|1<[/123;>;4",
|
||||||
|
"4[5(//67^890]62#",
|
||||||
|
"a6b5~~<6ac923.. ",
|
||||||
|
"@!&d}e(,'.32f. ",
|
||||||
|
" #agg&+ h' ",
|
||||||
|
" ij ji ij ",
|
||||||
|
" ",
|
||||||
|
" ji ij ji ",
|
||||||
|
" ",
|
||||||
|
" ji ",
|
||||||
|
" ij ij ",
|
||||||
|
" ",
|
||||||
|
" "};
|
Loading…
Add table
Reference in a new issue