diff --git a/plugins/gtkgui/about.png b/plugins/gtkgui/about.png
new file mode 100644
index 000000000..c33125c7b
Binary files /dev/null and b/plugins/gtkgui/about.png differ
diff --git a/plugins/gtkgui/gtkgui.glade b/plugins/gtkgui/gtkgui.glade
index cfcdca28e..5c68c3ec7 100644
--- a/plugins/gtkgui/gtkgui.glade
+++ b/plugins/gtkgui/gtkgui.glade
@@ -510,23 +510,18 @@
-
+
True
+ True
Anonymous <id@server/res>
- False
- False
- GTK_JUSTIFY_LEFT
- True
- False
- 0
- 0.5
- 0
- 0
+ True
+ GTK_RELIEF_NONE
+
0
- True
- True
+ False
+ False
@@ -830,6 +825,7 @@
True
+ about.png
0.5
0.5
0
@@ -847,12 +843,11 @@
True
<b>Gajim</b>
-Copyright © 2003 Gajim Team
+Copyright © 2003-2004 Gajim Team
<b>Gajim Team</b>
Vincent Hanquez (tab@tuxfamily.org)
-Yann Le Boulanger (asterix@crans.org)
-David Ferlier (david@yazzy.org)
+Yann Le Boulanger (asterix@crans.org)
False
True
GTK_JUSTIFY_LEFT
@@ -1442,12 +1437,29 @@ David Ferlier (david@yazzy.org)
False
0
+
+
+ True
+ gtk-redo
+ 4
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ True
+ True
+
+
+
145
8
True
- Send subscription to :
+ Send subscription to :
False
False
GTK_JUSTIFY_RIGHT
@@ -1501,20 +1513,56 @@ David Ferlier (david@yazzy.org)
GTK_CORNER_TOP_LEFT
-
+
True
- True
- True
- GTK_JUSTIFY_LEFT
- GTK_WRAP_WORD
- True
- 0
- 0
- 0
- 0
- 0
- 0
- I would like to add you to my contact list, please.
+ GTK_SHADOW_IN
+
+
+
+ 2
+ True
+ 0
+ 0.5
+ GTK_SHADOW_IN
+
+
+
+ True
+ True
+ True
+ GTK_JUSTIFY_LEFT
+ GTK_WRAP_WORD
+ True
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ I would like to add you to my contact list, please.
+
+
+
+
+
+ True
+
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ label_item
+
+
+
+
@@ -1541,7 +1589,7 @@ David Ferlier (david@yazzy.org)
10
True
GTK_BUTTONBOX_END
- 30
+ 10
@@ -2527,7 +2575,7 @@ David Ferlier (david@yazzy.org)
-
+
True
Préférences
GTK_WINDOW_TOPLEVEL
@@ -2544,374 +2592,62 @@ David Ferlier (david@yazzy.org)
0
-
+
True
- True
- True
- True
- GTK_POS_TOP
- False
- False
+ False
+ 0
-
+
+ 6
True
+ GTK_BUTTONBOX_SPREAD
+ 0
-
- 200
- 200
+
True
- 0
- 0.5
- GTK_SHADOW_ETCHED_IN
+ True
+ True
+ GTK_RELIEF_HALF
+
-
- True
- 3
- 2
- False
- 10
- 3
-
-
-
- 100
- True
- Outgoing Messages
- False
- False
- GTK_JUSTIFY_CENTER
- True
- False
- 0
- 0.5
- 0
- 0
-
-
- 0
- 1
- 1
- 2
- fill
-
-
-
-
-
-
- 100
- True
- Status Messages
- False
- False
- GTK_JUSTIFY_CENTER
- True
- False
- 0
- 0.5
- 0
- 0
-
-
- 0
- 1
- 2
- 3
- fill
-
-
-
-
-
-
- 100
- True
- Incomming Messages
- False
- False
- GTK_JUSTIFY_CENTER
- True
- False
- 0
- 0.5
- 0
- 0
-
-
- 0
- 1
- 0
- 1
- fill
-
-
-
-
-
-
- True
- True
- GTK_RELIEF_NORMAL
-
-
-
-
- 40
- 20
- True
-
-
-
-
- 1
- 2
- 1
- 2
- fill
-
-
-
-
-
-
- True
- True
- GTK_RELIEF_NORMAL
-
-
-
-
- 40
- 20
- True
-
-
-
-
- 1
- 2
- 2
- 3
- fill
-
-
-
-
-
-
- True
- True
- GTK_RELIEF_NORMAL
-
-
-
-
- 40
- 20
- True
-
-
-
-
- 1
- 2
- 0
- 1
- fill
-
-
-
-
-
-
-
-
- True
- Color
- False
- False
- GTK_JUSTIFY_LEFT
- False
- False
- 0.5
- 0.5
- 0
- 0
-
-
- label_item
-
-
-
-
- 0
- 0
-
-
-
-
-
- 150
- 70
- True
- 0
- 0.5
- GTK_SHADOW_ETCHED_IN
-
-
-
- True
- True
- False
- False
- True
- False
-
-
-
- True
- True
- True
- True
- 0
-
- True
- *
- False
-
-
-
-
-
- True
- GTK_SELECTION_BROWSE
-
-
-
-
-
-
-
- True
- Icon Style
- False
- False
- GTK_JUSTIFY_LEFT
- False
- False
- 0.5
- 0.5
- 0
- 0
-
-
- label_item
-
-
-
-
- 210
- 0
-
-
-
-
- False
- True
-
-
-
-
-
- True
- Look
- False
- False
- GTK_JUSTIFY_LEFT
- False
- False
- 0.5
- 0.5
- 0
- 0
-
-
- tab
-
-
-
-
-
- True
-
-
-
- 200
- 150
- True
- 0
- 0.5
- GTK_SHADOW_ETCHED_IN
-
-
-
+
True
False
0
-
-
-
-
-
- True
- False
- True
- checkbutton5
- True
- GTK_RELIEF_NORMAL
- False
- False
- True
+ Look&Feel
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
0
@@ -2921,262 +2657,780 @@ when NOT onlie
-
-
-
- True
- AutoPopup
- False
- False
- GTK_JUSTIFY_LEFT
- False
- False
- 0.5
- 0.5
- 0
- 0
-
-
- label_item
-
-
-
- 0
- 0
-
-
-
- False
- True
-
-
-
-
-
- True
- Events
- False
- False
- GTK_JUSTIFY_LEFT
- False
- False
- 0.5
- 0.5
- 0
- 0
-
-
- tab
-
-
-
-
-
- True
-
- 325
- 142
+
True
- 0
- 0.5
- GTK_SHADOW_ETCHED_IN
+ True
+ True
+ GTK_RELIEF_HALF
+
-
+
True
- 3
- 3
False
- 4
- 5
+ 0
-
+
True
- True
- Auto Away After
- True
- GTK_RELIEF_NORMAL
- False
- False
- True
-
-
- 0
- 1
- 0
- 1
- fill
-
-
-
-
-
-
- True
- Minutes
- False
- False
- GTK_JUSTIFY_LEFT
- False
- False
- 0
+ gtk-select-color
+ 4
+ 0.5
0.5
0
0
- 2
- 3
- 0
- 1
-
+ 0
+ True
+ True
-
- 50
+
True
- True
- 1
- 0
- False
- GTK_UPDATE_ALWAYS
- False
- False
- 10 1 100 1 10 10
-
-
- 1
- 2
- 0
- 1
- fill
-
-
-
-
-
-
- True
- True
- Auto eXtanded Away After
- True
- GTK_RELIEF_NORMAL
- False
- False
- True
-
-
- 0
- 1
- 1
- 2
- fill
-
-
-
-
-
-
- 50
- True
- True
- 1
- 0
- False
- GTK_UPDATE_ALWAYS
- False
- False
- 20 1 100 1 10 10
-
-
- 1
- 2
- 1
- 2
-
-
-
-
-
-
- True
- Minutes
+ Events
False
False
GTK_JUSTIFY_LEFT
False
False
- 0
+ 0.5
0.5
0
0
- 2
- 3
- 1
- 2
- fill
-
+ 0
+ False
+ False
+
+
+
+
+
+
+
+
+
+ True
+ True
+ True
+ GTK_RELIEF_HALF
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ gtk-dialog-info
+ 4
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ True
+ Presence
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ False
-
-
-
- True
- Auto Status
- False
- False
- GTK_JUSTIFY_LEFT
- False
- False
- 0.5
- 0.5
- 0
- 0
-
-
- label_item
-
-
-
- 0
- 0
-
- False
- True
+ 0
+ False
+ True
-
+
True
- Presence
- False
- False
- GTK_JUSTIFY_LEFT
- False
- False
- 0.5
- 0.5
- 0
- 0
- tab
+ 0
+ True
+ False
+
+
+
+
+
+ 10
+ True
+ False
+ False
+ GTK_POS_TOP
+ False
+ False
+
+
+
+ True
+
+
+
+ 150
+ 70
+ True
+ 0
+ 0.5
+ GTK_SHADOW_ETCHED_IN
+
+
+
+ True
+ True
+ False
+ False
+ True
+ False
+
+
+
+ True
+ True
+ True
+ True
+ 0
+
+ True
+ *
+ False
+
+
+
+
+
+ True
+ GTK_SELECTION_BROWSE
+
+
+
+
+
+
+
+ True
+ Icon Style
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ label_item
+
+
+
+
+ 210
+ 0
+
+
+
+
+
+ 200
+ 200
+ True
+ 0
+ 0.5
+ GTK_SHADOW_ETCHED_IN
+
+
+
+ True
+ 3
+ 2
+ False
+ 10
+ 3
+
+
+
+ 100
+ True
+ Outgoing Messages
+ False
+ False
+ GTK_JUSTIFY_CENTER
+ True
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 0
+ 1
+ 1
+ 2
+ fill
+
+
+
+
+
+
+ 100
+ True
+ Status Messages
+ False
+ False
+ GTK_JUSTIFY_CENTER
+ True
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 0
+ 1
+ 2
+ 3
+ fill
+
+
+
+
+
+
+ 100
+ True
+ Incoming Messages
+ False
+ False
+ GTK_JUSTIFY_CENTER
+ True
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 0
+ 1
+ 0
+ 1
+ fill
+
+
+
+
+
+
+ True
+ True
+ GTK_RELIEF_NORMAL
+
+
+
+
+ 40
+ 20
+ True
+
+
+
+
+ 1
+ 2
+ 1
+ 2
+ fill
+
+
+
+
+
+
+ True
+ True
+ GTK_RELIEF_NORMAL
+
+
+
+
+ 40
+ 20
+ True
+
+
+
+
+ 1
+ 2
+ 2
+ 3
+ fill
+
+
+
+
+
+
+ True
+ True
+ GTK_RELIEF_NORMAL
+
+
+
+
+ 40
+ 20
+ True
+
+
+
+
+ 1
+ 2
+ 0
+ 1
+ fill
+
+
+
+
+
+
+
+
+ True
+ Color
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ label_item
+
+
+
+
+ 0
+ 0
+
+
+
+
+ False
+ True
+
+
+
+
+
+ True
+ Look
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ tab
+
+
+
+
+
+ True
+
+
+
+ 200
+ 150
+ True
+ 0
+ 0.5
+ GTK_SHADOW_ETCHED_IN
+
+
+
+ True
+ False
+ 0
+
+
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ False
+ True
+ Allow AutoPopup
+when NOT onlie
+ True
+ GTK_RELIEF_NORMAL
+ False
+ False
+ True
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ False
+ True
+ checkbutton5
+ True
+ GTK_RELIEF_NORMAL
+ False
+ False
+ True
+
+
+ 0
+ False
+ False
+
+
+
+
+
+
+
+ True
+ AutoPopup
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ label_item
+
+
+
+
+ 0
+ 0
+
+
+
+
+ False
+ True
+
+
+
+
+
+ True
+ Events
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ tab
+
+
+
+
+
+ True
+
+
+
+ 325
+ 142
+ True
+ 0
+ 0.5
+ GTK_SHADOW_ETCHED_IN
+
+
+
+ True
+ 2
+ 3
+ False
+ 4
+ 5
+
+
+
+ True
+ True
+ Auto Away After
+ True
+ GTK_RELIEF_NORMAL
+ False
+ False
+ True
+
+
+ 0
+ 1
+ 0
+ 1
+ fill
+
+
+
+
+
+
+ True
+ Minutes
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 2
+ 3
+ 0
+ 1
+
+
+
+
+
+
+ 50
+ True
+ True
+ 1
+ 0
+ False
+ GTK_UPDATE_ALWAYS
+ False
+ False
+ 10 1 100 1 10 10
+
+
+ 1
+ 2
+ 0
+ 1
+ fill
+
+
+
+
+
+
+ True
+ True
+ Auto eXtanded Away After
+ True
+ GTK_RELIEF_NORMAL
+ False
+ False
+ True
+
+
+ 0
+ 1
+ 1
+ 2
+ fill
+
+
+
+
+
+
+ 50
+ True
+ True
+ 1
+ 0
+ False
+ GTK_UPDATE_ALWAYS
+ False
+ False
+ 20 1 100 1 10 10
+
+
+ 1
+ 2
+ 1
+ 2
+
+
+
+
+
+
+ True
+ Minutes
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 2
+ 3
+ 1
+ 2
+ fill
+
+
+
+
+
+
+
+
+ True
+ Auto Status
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ label_item
+
+
+
+
+ 0
+ 0
+
+
+
+
+ False
+ True
+
+
+
+
+
+ True
+ Presence
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ tab
+
+
+
+
+ 0
+ True
+ True
@@ -3187,6 +3441,17 @@ when NOT onlie
+
+
+ True
+
+
+ 0
+ False
+ True
+
+
+
5
diff --git a/plugins/gtkgui/gtkgui.py b/plugins/gtkgui/gtkgui.py
index da230438b..f1f100af9 100644
--- a/plugins/gtkgui/gtkgui.py
+++ b/plugins/gtkgui/gtkgui.py
@@ -24,9 +24,10 @@ from gtk import TRUE, FALSE
import gtk.glade,gobject
import os,string,time,Queue
import common.optparser,common.sleepy
-#CONFPATH = "~/.gajim/config"
-Wbrowser = 0
-Waccounts = 0
+browserWindow = 0
+accountsWindow = 0
+
+GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade'
class user:
"""Informations concerning each users"""
@@ -49,7 +50,7 @@ class user:
self.resource = args[6]
else: raise TypeError, 'bad arguments'
-class info_user:
+class infoUser_Window:
"""Class for user's information window"""
def delete_event(self, widget):
"""close window"""
@@ -61,19 +62,34 @@ class info_user:
def on_close(self, widget):
"""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 ""
newName = self.entry_name.get_text()
- if newName != '':
- self.user.name = newName
+ if newName != self.user.name:
+ update = 1
+ if newName != '':
+ self.user.name = newName
#update user.groups and redraw the user in the roster
+ old_groups = self.user.groups
self.r.remove_user(self.user)
self.user.groups = []
model = self.list2.get_model()
model.foreach(self.add_grp_to_user)
self.r.add_user(self.user)
- self.r.queueOUT.put(('UPDUSER', (self.user.jid, self.user.name, \
- self.user.groups)))
+ for g in old_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)
def add_grp(self, model, path, iter, stors):
@@ -110,25 +126,25 @@ class info_user:
"""Initialize both available and current listStores"""
#list available
store = gtk.ListStore(gobject.TYPE_STRING)
- for i in self.r.l_group.keys():
- if i != 'Agents' and i not in self.user.groups:
+ for g in self.r.l_group.keys():
+ if g != 'Agents' and g not in self.user.groups:
iter = store.append()
- store.set(iter, 0, i)
+ store.set(iter, 0, g)
self.list1.set_model(store)
column = gtk.TreeViewColumn('Available', gtk.CellRendererText(), text=0)
self.list1.append_column(column)
#list_current
store = gtk.ListStore(gobject.TYPE_STRING)
- for i in self.user.groups:
+ for g in self.user.groups:
iter = store.append()
- store.set(iter, 0, i)
+ store.set(iter, 0, g)
self.list2.set_model(store)
column = gtk.TreeViewColumn('Available', gtk.CellRendererText(), text=0)
self.list2.append_column(column)
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.r = roster
self.user = user
@@ -155,7 +171,7 @@ class info_user:
self.on_new_key_pressed)
-class prefs:
+class preference_Window:
"""Class for Preferences window"""
def delete_event(self, widget):
"""close window"""
@@ -259,20 +275,40 @@ class prefs:
self.write_cfg()
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):
"""Initialize Preference window"""
- xml = gtk.glade.XML('plugins/gtkgui/gtkgui.glade', 'Prefs')
- self.window = xml.get_widget("Prefs")
+ xml = gtk.glade.XML(GTKGUI_GLADE, 'preferences_window')
+ self.window = xml.get_widget('preferences_window')
self.r = roster
- self.da_in = xml.get_widget("drawing_in")
- self.da_out = xml.get_widget("drawing_out")
- self.da_status = xml.get_widget("drawing_status")
- self.combo_iconstyle = xml.get_widget("combo_iconstyle")
- self.chk_autopp = xml.get_widget("chk_autopopup")
- self.chk_autoaway = xml.get_widget("chk_autoaway")
- self.spin_autoawaytime = xml.get_widget("spin_autoawaytime")
- self.chk_autoxa = xml.get_widget("chk_autoxa")
- self.spin_autoxatime = xml.get_widget("spin_autoxatime")
+ self.da_in = xml.get_widget('drawing_in')
+ self.da_out = xml.get_widget('drawing_out')
+ self.da_status = xml.get_widget('drawing_status')
+ self.combo_iconstyle = xml.get_widget('combo_iconstyle')
+ self.chk_autopp = xml.get_widget('chk_autopopup')
+ self.chk_autoaway = xml.get_widget('chk_autoaway')
+ self.spin_autoawaytime = xml.get_widget('spin_autoawaytime')
+ self.chk_autoxa = xml.get_widget('chk_autoxa')
+ 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
colSt = self.r.plugin.config['inmsgcolor']
@@ -311,34 +347,33 @@ class prefs:
self.combo_iconstyle.entry.set_text(self.r.iconstyle)
#Autopopup
+ st = 0
if self.r.plugin.config.has_key('autopopup'):
st = self.r.plugin.config['autopopup']
- else:
- st = 0
self.chk_autopp.set_active(st)
#Autoaway
+ st = 1
if self.r.plugin.config.has_key('autoaway'):
st = self.r.plugin.config['autoaway']
- else:
- st = 1
self.chk_autoaway.set_active(st)
+
+ #Autoawaytime
+ st = 10
if self.r.plugin.config.has_key('autoawaytime'):
st = self.r.plugin.config['autoawaytime']
- else:
- st = 10
self.spin_autoawaytime.set_value(st)
#Autoxa
+ st = 1
if self.r.plugin.config.has_key('autoxa'):
st = self.r.plugin.config['autoxa']
- else:
- st = 1
self.chk_autoxa.set_active(st)
+
+ #Autoxatime
+ st = 20
if self.r.plugin.config.has_key('autoxatime'):
st = self.r.plugin.config['autoxatime']
- else:
- st = 20
self.spin_autoxatime.set_value(st)
xml.signal_connect('gtk_widget_destroy', self.delete_event)
@@ -346,7 +381,7 @@ class prefs:
self.on_color_button_clicked)
xml.signal_connect('on_ok_clicked', self.on_ok)
-class away_msg:
+class awayMsg_Window:
"""Class for Away Message Window"""
def delete_event(self, widget):
"""close window"""
@@ -361,22 +396,21 @@ class away_msg:
def run(self):
"""Wait for Ok button to be pressed and return away messsage"""
rep = self.window.run()
+ msg = ''
if rep == gtk.RESPONSE_OK:
beg, end = self.txtBuffer.get_bounds()
msg = self.txtBuffer.get_text(beg, end, 0)
self.window.destroy()
- if not msg:
- msg = ""
return msg
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")
txt = xml.get_widget("textview")
self.txtBuffer = txt.get_buffer()
xml.signal_connect('gtk_widget_destroy', self.delete_event)
-class add:
+class addContact_Window:
"""Class for Add user window"""
def delete_event(self, widget):
"""close window"""
@@ -394,7 +428,7 @@ class add:
def __init__(self, roster, jid=None):
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.textview_sub = xml.get_widget("textview_sub")
if jid:
@@ -403,30 +437,30 @@ class add:
xml.signal_connect('gtk_widget_destroy', self.delete_event)
xml.signal_connect('on_button_sub_clicked', self.on_subscribe)
-class warning:
+class warning_Window:
"""Class for warning window : print a warning message"""
def delete_event(self, widget):
"""close window"""
self.window.destroy()
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")
xml.get_widget('label').set_text(txt)
xml.signal_connect('gtk_widget_destroy', self.delete_event)
-class about:
+class about_Window:
"""Class for about window"""
def delete_event(self, widget):
"""close window"""
self.Wabout.destroy()
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")
xml.signal_connect('gtk_widget_destroy', self.delete_event)
-class account_pref:
+class accountPreference_Window:
"""Class for account informations"""
def delete_event(self, widget):
"""close window"""
@@ -448,10 +482,10 @@ class account_pref:
name = self.entryName.get_text()
jid = self.entryJid.get_text()
if (name == ''):
- warning('You must enter a name for this account')
+ warning_Window('You must enter a name for this account')
return 0
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')
return 0
else:
@@ -464,7 +498,7 @@ class account_pref:
#if it's a new account
else:
if name in self.accs.r.accounts:
- warning('An account already has this name')
+ warning_Window('An account already has this name')
return 0
#if we neeed to register a new account
if self.check.get_active():
@@ -483,7 +517,7 @@ class account_pref:
#info must be a dictionnary
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.entryPass = xml.get_widget("entry_password")
self.entryRessource = xml.get_widget("entry_ressource")
@@ -491,22 +525,21 @@ class account_pref:
self.entryName = xml.get_widget("entry_name")
self.entryJid = xml.get_widget("entry_jid")
self.accs = accs
+ self.mod = FALSE
if infos:
self.mod = TRUE
self.acc = infos['name']
self.init_account(infos)
self.check.set_sensitive(FALSE)
- else:
- self.mod = FALSE
xml.signal_connect('gtk_widget_destroy', self.delete_event)
xml.signal_connect('on_save_clicked', self.on_save_clicked)
-class accounts:
+class accounts_Window:
"""Class for accounts window : lists of accounts"""
def delete_event(self, widget):
"""close window"""
- global Waccounts
- Waccounts = 0
+ global accountsWindow
+ accountsWindow = 0
self.window.destroy()
def init_accounts(self):
@@ -525,7 +558,7 @@ class accounts:
def on_new_clicked(self, widget):
"""When new button is clicked : open an account information window"""
- account_pref(self)
+ accountPreference_Window(self)
def on_delete_clicked(self, widget):
"""When delete button is clicked :
@@ -551,11 +584,11 @@ class accounts:
'@' + self.r.plugin.accounts[account]["hostname"]
infos['password'] = self.r.plugin.accounts[account]["password"]
infos['ressource'] = self.r.plugin.accounts[account]["ressource"]
- account_pref(self, infos)
+ accountPreference_Window(self, infos)
def __init__(self, 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.treeview = xml.get_widget("treeview")
self.modButt = xml.get_widget("modify_button")
@@ -577,7 +610,7 @@ class accounts:
xml.signal_connect('on_modify_clicked', self.on_modify_clicked)
self.init_accounts()
-class confirm:
+class confirm_Window:
"""Class for confirmation window :
window that appears to confirm the removal of a contact"""
def delete_event(self, widget):
@@ -596,7 +629,7 @@ class confirm:
self.delete_event(self)
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.r = roster
self.iter = iter
@@ -606,7 +639,7 @@ class confirm:
xml.signal_connect('on_okbutton_clicked', self.req_usub)
xml.signal_connect('gtk_widget_destroy', self.delete_event)
-class authorize:
+class authorize_Window:
"""Class for authorization window :
window that appears when a user wants to add us to his/her roster"""
def delete_event(self, widget):
@@ -618,7 +651,7 @@ class authorize:
self.r.queueOUT.put(('AUTH', self.jid))
self.delete_event(self)
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):
"""refuse the request"""
@@ -626,7 +659,7 @@ class authorize:
self.delete_event(self)
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.r = roster
self.jid = jid
@@ -635,7 +668,7 @@ class authorize:
xml.signal_connect('on_button_deny_clicked', self.deny)
xml.signal_connect('on_button_close_clicked', self.delete_event)
-class agent_reg:
+class agentRegistration_Window:
"""Class for agent registration window :
window that appears when we want to subscribe to an agent"""
def delete_event(self, widget):
@@ -668,7 +701,7 @@ class agent_reg:
self.delete_event(self)
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.infos = infos
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_ok_clicked', self.on_ok)
-class browser:
- """Class for rbowser agent window :
+class browseAgent_Window:
+ """Class for bowser agent window :
to know the agents on the selected server"""
def delete_event(self, widget):
"""close window"""
- global Wbrowser
- Wbrowser = 0
+ global browserWindow
+ browserWindow = 0
self.window.destroy()
def browse(self):
@@ -719,7 +752,7 @@ class browser:
self.delete_event(self)
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.treeview = xml.get_widget('treeview')
self.r = roster
@@ -740,9 +773,9 @@ class browser:
if self.r.connected:
self.browse()
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"""
def delete_event(self, widget):
"""close window"""
@@ -816,15 +849,16 @@ class message:
def __init__(self, user, roster):
self.user = user
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.set_property('resize-mode', 2)
self.window = xml.get_widget('Chat')
self.window.set_title('Chat with ' + user.name)
self.img = xml.get_widget('image')
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 + '>')
+ xml.get_widget('button_contact').set_resize_mode(gtk.RESIZE_QUEUE)
self.message = xml.get_widget('message')
self.message.grab_focus()
self.conversation = xml.get_widget('conversation')
@@ -850,7 +884,7 @@ class message:
color = '#00ff00' #green
self.tagStatus.set_property("foreground", color)
-class roster:
+class roster_Window:
"""Class for main gtk window"""
def add_user(self, u):
"""Add a user to the roster and add groups if they aren't in roster"""
@@ -957,8 +991,8 @@ class roster:
u.status = status
def on_info(self, widget, jid):
- """Call info_user class to display user's information"""
- info_user(self.l_contact[jid]['user'], self)
+ """Call infoUser_Window class to display user's information"""
+ infoUser_Window(self.l_contact[jid]['user'], self)
def mk_menu_c(self, event, iter):
"""Make user's popup menu"""
@@ -1057,12 +1091,12 @@ class roster:
def on_req_usub(self, widget, iter):
"""Remove a user"""
- window_confirm = confirm(self, iter)
+ window_confirm = confirm_Window(self, iter)
def on_status_changed(self, widget):
"""When we change our status"""
if widget.name != 'online' and widget.name != 'offline':
- w = away_msg()
+ w = awayMsg_Window()
txt = w.run()
else:
txt = widget.name
@@ -1071,30 +1105,31 @@ class roster:
def on_prefs(self, widget):
"""When preferences is selected :
- call the prefs class"""
- window = prefs(self)
+ call the preference_Window class"""
+ window = preference_Window(self)
def on_add(self, widget):
"""When add user is selected :
call the add class"""
- window_add = add(self)
+ window_add = addContact_Window(self)
def on_about(self, widget):
"""When about is selected :
call the about class"""
- window_about = about()
+ window_about = about_Window()
def on_accounts(self, widget):
"""When accounts is seleted :
call the accounts class to modify accounts"""
- global Waccounts
- if not Waccounts:
- Waccounts = accounts(self)
+ global accountsWindow
+ if not accountsWindow:
+ accountsWindow = accounts_Window(self)
def on_quit(self, widget):
"""When we quit the gtk plugin :
tell that to the core and exit gtk"""
self.queueOUT.put(('QUIT',''))
+ print "plugin gtkgui stopped"
gtk.mainquit()
def on_row_activated(self, widget, path, col=0):
@@ -1112,7 +1147,7 @@ class roster:
if self.tab_messages.has_key(jid):
self.tab_messages[jid].window.present()
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):
self.tab_messages[jid].read_queue(self.tab_queues[jid])
@@ -1139,7 +1174,7 @@ class roster:
if self.tab_messages.has_key(jid):
self.tab_messages[jid].window.present()
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):
self.tab_messages[jid].read_queue(self.tab_queues[jid])
else:
@@ -1151,9 +1186,9 @@ class roster:
def on_browse(self, widget):
"""When browse agent is selected :
Call browse class"""
- global Wbrowser
- if not Wbrowser:
- Wbrowser = browser(self)
+ global browserWindow
+ if not browserWindow:
+ browserWindow = browseAgent_Window(self)
def mkpixbufs(self):
"""initialise pixbufs array"""
@@ -1161,17 +1196,21 @@ class roster:
self.pixbufs = {}
for state in ('online', 'away', 'xa', 'dnd', 'offline', \
'requested', 'message', 'opened', 'closed', 'not in list'):
- #open an animated gif file if it exists oterelse a xpm file
- if not os.path.exists(self.path + state + '.gif'):
- if not os.path.exists(self.path + state + '.xpm'):
- print 'No such file : ' + self.path + state + '.gif / xpm'
- self.pixbufs[state] = None
- else:
- pix = gtk.gdk.pixbuf_new_from_file(self.path + state + '.xpm')
- self.pixbufs[state] = pix
- else:
- pix = gtk.gdk.pixbufAnimation(self.path + state + '.gif')
+ # try to open a pixfile with the correct method
+ files = []
+ files.append(self.path + state + '.gif')
+ files.append(self.path + state + '.png')
+ files.append(self.path + state + '.xpm')
+ self.pixbufs[state] = None
+ for file in files:
+ if not os.path.exists(file):
+ continue
+ fct = gtk.gdk.pixbuf_new_from_file
+ if file.find('.gif') != -1:
+ fct = gtk.gdk.pixbufAnimation
+ pix = fct(file)
self.pixbufs[state] = pix
+ break
def on_show_off(self, widget):
"""when show offline option is changed :
@@ -1181,7 +1220,7 @@ class roster:
def __init__(self, queueOUT, plug):
# 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.tree = xml.get_widget('treeview')
self.plugin = plug
@@ -1268,17 +1307,25 @@ class plugin:
"""Class called by the core in a new thread"""
def wait(self, what):
"""Wait for a message from Core"""
- #TODO: timeout, save messages that don't fit
+ #TODO: timeout
+ temp_q = Queue.Queue(50)
while 1:
if not self.queueIN.empty():
ev = self.queueIN.get()
- if ev[0] == what:
- return ev[1]
+ if ev[0] == what and ev[1][0] == 'GtkGui':
+ #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)
def read_queue(self):
"""Read queue from the core and execute commands from it"""
- global Wbrowser
+ global browserWindow
model = self.r.tree.get_model()
while self.queueIN.empty() == 0:
ev = self.queueIN.get()
@@ -1287,7 +1334,7 @@ class plugin:
self.r.mklists(ev[1])
self.r.draw_roster()
elif ev[0] == 'WARNING':
- warning(ev[1])
+ warning_Window(ev[1])
elif ev[0] == 'STATUS':
st = ""
for i in range(7):
@@ -1302,8 +1349,8 @@ class plugin:
self.r.chg_status(j, 'offline', 'Disconnected')
elif self.r.connected == 0:
self.r.connected = 1
- self.sleeper = common.sleepy.Sleepy(\
- self.autoawaytime*60, self.autoxatime*60)
+ self.sleeper = None#common.sleepy.Sleepy(\
+ #self.autoawaytime*60, self.autoxatime*60)
elif ev[0] == 'NOTIFY':
jid = string.split(ev[1][0], '/')[0]
@@ -1366,12 +1413,12 @@ class plugin:
if not self.r.tab_messages.has_key(jid):
if self.r.l_contact.has_key(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):
self.r.tab_messages[jid].print_conversation(ev[1][1])
elif ev[0] == 'SUBSCRIBE':
- authorize(self.r, ev[1])
+ authorize_Window(self.r, ev[1])
elif ev[0] == 'SUBSCRIBED':
jid = ev[1]['jid']
if self.r.l_contact.has_key(jid):
@@ -1383,25 +1430,25 @@ class plugin:
user1 = user(jid, jid, ['general'], 'online', \
'online', 'to', ev[1]['ressource'])
self.r.add_user(user1)
- warning("You are now authorized by " + jid)
+ warning_Window("You are now authorized by " + jid)
elif ev[0] == 'UNSUBSCRIBED':
- warning("You are now unsubscribed by " + jid)
+ warning_Window("You are now unsubscribed by " + jid)
#TODO: change icon
elif ev[0] == 'AGENTS':
- if Wbrowser:
- Wbrowser.agents(ev[1])
+ if browserWindow:
+ browserWindow.agents(ev[1])
elif ev[0] == 'AGENT_INFO':
if not ev[1][1].has_key('instructions'):
- warning('error contacting %s' % ev[1][0])
+ warning_Window('error contacting %s' % ev[1][0])
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))
elif ev[0] == 'ACC_OK':
self.accounts[ev[1][3]] = {'ressource': ev[1][4], \
'password': ev[1][2], 'hostname': ev[1][0], 'name': ev[1][1]}
self.r.queueOUT.put(('CONFIG', ('accounts', self.r.plugin.accounts)))
- if (Waccounts != 0):
- Waccounts.init_accounts()
+ if (accountsWindow != 0):
+ accountsWindow.init_accounts()
elif ev[0] == 'QUIT':
self.r.on_quit(self)
return 1
@@ -1436,12 +1483,12 @@ class plugin:
gtk.threads_init()
gtk.threads_enter()
self.queueIN = quIN
- quOUT.put(('ASK_CONFIG', 'GtkGui'))
+ quOUT.put(('ASK_CONFIG', ('GtkGui', 'GtkGui')))
self.config = self.wait('CONFIG')
- quOUT.put(('ASK_CONFIG', 'accounts'))
+ quOUT.put(('ASK_CONFIG', ('GtkGui', 'accounts')))
self.accounts = self.wait('CONFIG')
#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'):
self.autoaway = self.config['autoaway']
else:
diff --git a/plugins/gtkgui/icons/sun/away.xpm b/plugins/gtkgui/icons/sun/away.xpm
new file mode 100644
index 000000000..6d7a131f4
--- /dev/null
+++ b/plugins/gtkgui/icons/sun/away.xpm
@@ -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 ` ...+.@.#.$.%.&.*.=. ",
+" -.;. >.,. -. ",
+" "};
diff --git a/plugins/gtkgui/icons/sun/closed.xpm b/plugins/gtkgui/icons/sun/closed.xpm
new file mode 100644
index 000000000..a430bcb97
--- /dev/null
+++ b/plugins/gtkgui/icons/sun/closed.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char * closed_xpm[] = {
+"16 16 2 1",
+" c None",
+". c #000000",
+" ",
+" ",
+" .. ",
+" ... ",
+" ... ",
+" ... ",
+"............... ",
+"................",
+"............... ",
+" ... ",
+" ... ",
+" ... ",
+" .. ",
+" ",
+" ",
+" "};
diff --git a/plugins/gtkgui/icons/sun/dnd.xpm b/plugins/gtkgui/icons/sun/dnd.xpm
new file mode 100644
index 000000000..d1756c6e1
--- /dev/null
+++ b/plugins/gtkgui/icons/sun/dnd.xpm
@@ -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 "};
diff --git a/plugins/gtkgui/icons/sun/message.xpm b/plugins/gtkgui/icons/sun/message.xpm
new file mode 100644
index 000000000..4bf250c1e
--- /dev/null
+++ b/plugins/gtkgui/icons/sun/message.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char * message_xpm[] = {
+"16 16 2 1",
+" c None",
+". c #000000",
+" ",
+" ",
+" .... ... ",
+" .... ... ",
+" .... .... ",
+" ..... . .. ",
+" .. .. . .. ",
+" .. .. . .. ",
+" .. ... .. .. ",
+" .. .. . .. ",
+" .. .. . .. ",
+" .. ... .. ",
+" .. .. .. ",
+" .. .. .. ",
+" .... .....",
+" "};
diff --git a/plugins/gtkgui/icons/sun/offline.xpm b/plugins/gtkgui/icons/sun/offline.xpm
new file mode 100644
index 000000000..054edb083
--- /dev/null
+++ b/plugins/gtkgui/icons/sun/offline.xpm
@@ -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; ",
+" .+@#$ "};
diff --git a/plugins/gtkgui/icons/sun/online.xpm b/plugins/gtkgui/icons/sun/online.xpm
new file mode 100644
index 000000000..42791668d
--- /dev/null
+++ b/plugins/gtkgui/icons/sun/online.xpm
@@ -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 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 ",
+" ",
+" "};