From 0afc7b23286b29206cca7455a2312772fd0677d4 Mon Sep 17 00:00:00 2001
From: Travis Shirk <travis@pobox.com>
Date: Tue, 18 Dec 2007 23:42:22 +0000
Subject: [PATCH] Merge one_window branch

Merged revisions 9143,9145-9155,9157-9162,9164-9169,9171-9177 via svnmerge from
svn://88.191.11.156/gajim/branches/one_window

........
  r9145 | nicfit | 2007-12-13 21:49:09 -0700 (Thu, 13 Dec 2007) | 2 lines

  Implemented the original Nikos patch with an HPaned instead of a HBox and only do this mode when one_message_window == 'always'
........
  r9152 | nicfit | 2007-12-15 13:33:56 -0700 (Sat, 15 Dec 2007) | 2 lines

  Added config and GUI for one_message_window_with_roster
........
  r9153 | nicfit | 2007-12-15 13:41:46 -0700 (Sat, 15 Dec 2007) | 2 lines

  Use one_message_window_with_roster and some whitespace cleanup
........
  r9154 | nicfit | 2007-12-15 14:04:49 -0700 (Sat, 15 Dec 2007) | 2 lines

  Scratch the chckbox for with roster mode, use one_message_window opt and combo
........
  r9155 | nicfit | 2007-12-15 17:01:13 -0700 (Sat, 15 Dec 2007) | 2 lines

  MessageWindowMgr knows about ONE_MESSAGE_WINDOW_ALWAYS_WITH_ROSTER and MessageWindow can reparent itself rather then the roster having to do so.
........
  r9157 | nicfit | 2007-12-15 17:47:20 -0700 (Sat, 15 Dec 2007) | 2 lines

  Resizing fixes and make the roster window shrink when last tab is removed
........
  r9158 | nicfit | 2007-12-15 19:15:11 -0700 (Sat, 15 Dec 2007) | 2 lines

  Added "Show roster" (CTRL+R) to view menu when using always_with_roster to quickly hide/show the roster.
........
  r9159 | nicfit | 2007-12-15 19:49:30 -0700 (Sat, 15 Dec 2007) | 2 lines

  Handle window title setting in always_with_roster mode.
........
  r9160 | nicfit | 2007-12-15 20:13:57 -0700 (Sat, 15 Dec 2007) | 2 lines

  Removed FIXME
........
  r9167 | nicfit | 2007-12-17 18:40:59 -0700 (Mon, 17 Dec 2007) | 2 lines

  When roster is hidden, show it when the number of MessageWindow controls == 0
........
  r9168 | nicfit | 2007-12-17 19:07:49 -0700 (Mon, 17 Dec 2007) | 2 lines

  Disable hiding roster when there are no message controls open
........
  r9169 | nicfit | 2007-12-17 20:41:11 -0700 (Mon, 17 Dec 2007) | 2 lines

  Bunch of saved size bugs fixed
........
---
 data/glade/preferences_window.glade | 779 ++++++++++++++--------------
 data/glade/roster_window.glade      |  87 +++-
 src/common/config.py                |   4 +-
 src/config.py                       |   7 +-
 src/message_control.py              |   8 +-
 src/message_window.py               | 173 +++---
 src/remote_control.py               |   1 +
 src/roster_window.py                | 114 ++--
 8 files changed, 656 insertions(+), 517 deletions(-)

diff --git a/data/glade/preferences_window.glade b/data/glade/preferences_window.glade
index b604fb39d0..34409f075e 100644
--- a/data/glade/preferences_window.glade
+++ b/data/glade/preferences_window.glade
@@ -127,63 +127,36 @@
                             <property name="column_spacing">6</property>
                             <property name="row_spacing">6</property>
                             <child>
-                              <widget class="GtkLabel" id="label387">
-                                <property name="visible">True</property>
-                                <property name="xalign">0</property>
-                                <property name="xpad">1</property>
-                                <property name="label" translatable="yes">Treat all incoming messages as:</property>
-                              </widget>
-                              <packing>
-                                <property name="top_attach">1</property>
-                                <property name="bottom_attach">2</property>
-                                <property name="x_options">GTK_FILL</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <widget class="GtkLabel" id="label379">
-                                <property name="visible">True</property>
-                                <property name="xalign">0</property>
-                                <property name="xpad">1</property>
-                                <property name="label" translatable="yes">Use only one message _window:</property>
+                              <widget class="GtkCheckButton" id="speller_checkbutton">
+                                <property name="can_focus">True</property>
+                                <property name="label" translatable="yes">_Highlight misspelled words</property>
                                 <property name="use_underline">True</property>
-                                <property name="mnemonic_widget">one_window_type_combobox</property>
-                              </widget>
-                              <packing>
-                                <property name="top_attach">2</property>
-                                <property name="bottom_attach">3</property>
-                                <property name="x_options">GTK_FILL</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <widget class="GtkComboBox" id="treat_incoming_messages_combobox">
-                                <property name="visible">True</property>
-                                <property name="items" translatable="yes">Determined by sender
-Chat message
-Single message</property>
-                                <signal name="changed" handler="on_treat_incoming_messages_combobox_changed"/>
+                                <property name="response_id">0</property>
+                                <property name="draw_indicator">True</property>
+                                <signal name="toggled" handler="on_speller_checkbutton_toggled"/>
                               </widget>
                               <packing>
-                                <property name="left_attach">1</property>
                                 <property name="right_attach">2</property>
-                                <property name="top_attach">1</property>
-                                <property name="bottom_attach">2</property>
+                                <property name="top_attach">5</property>
+                                <property name="bottom_attach">6</property>
                                 <property name="x_options">GTK_FILL</property>
                               </packing>
                             </child>
                             <child>
-                              <widget class="GtkComboBox" id="one_window_type_combobox">
+                              <widget class="GtkCheckButton" id="xhtml_checkbutton">
                                 <property name="visible">True</property>
-                                <property name="items" translatable="yes">Never
-Always
-Per account
-Per type</property>
-                                <signal name="changed" handler="on_one_window_type_combo_changed"/>
+                                <property name="can_focus">True</property>
+                                <property name="tooltip" translatable="yes">Some messages may include rich content (formatting, colors etc). If checked, Gajim will just display the raw message text.</property>
+                                <property name="label" translatable="yes">Ignore rich content in incoming messages</property>
+                                <property name="use_underline">True</property>
+                                <property name="response_id">0</property>
+                                <property name="draw_indicator">True</property>
+                                <signal name="toggled" handler="on_xhtml_checkbutton_toggled"/>
                               </widget>
                               <packing>
-                                <property name="left_attach">1</property>
                                 <property name="right_attach">2</property>
-                                <property name="top_attach">2</property>
-                                <property name="bottom_attach">3</property>
+                                <property name="top_attach">4</property>
+                                <property name="bottom_attach">5</property>
                                 <property name="x_options">GTK_FILL</property>
                               </packing>
                             </child>
@@ -205,64 +178,92 @@ Per type</property>
                               </packing>
                             </child>
                             <child>
-                              <widget class="GtkCheckButton" id="xhtml_checkbutton">
+                              <widget class="GtkEventBox" id="eventbox5">
                                 <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="tooltip" translatable="yes">Some messages may include rich content (formatting, colors etc). If checked, Gajim will just display the raw message text.</property>
-                                <property name="label" translatable="yes">Ignore rich content in incoming messages</property>
-                                <property name="use_underline">True</property>
-                                <property name="response_id">0</property>
-                                <property name="draw_indicator">True</property>
-                                <signal name="toggled" handler="on_xhtml_checkbutton_toggled"/>
+                                <property name="tooltip" translatable="yes">If not disabled, Gajim will replace ascii smilies like ':)' with equivalent animated or static graphical emoticons</property>
+                                <child>
+                                  <widget class="GtkLabel" id="label381">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="xpad">1</property>
+                                    <property name="label" translatable="yes">Emoticons:</property>
+                                  </widget>
+                                </child>
+                              </widget>
+                              <packing>
+                                <property name="x_options">GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <widget class="GtkComboBox" id="emoticons_combobox">
+                                <property name="visible">True</property>
+                                <signal name="changed" handler="on_emoticons_combobox_changed"/>
                               </widget>
                               <packing>
+                                <property name="left_attach">1</property>
                                 <property name="right_attach">2</property>
-                                <property name="top_attach">4</property>
-                                <property name="bottom_attach">5</property>
                                 <property name="x_options">GTK_FILL</property>
                               </packing>
                             </child>
                             <child>
-                              <widget class="GtkCheckButton" id="speller_checkbutton">
-                                <property name="can_focus">True</property>
-                                <property name="label" translatable="yes">_Highlight misspelled words</property>
-                                <property name="use_underline">True</property>
-                                <property name="response_id">0</property>
-                                <property name="draw_indicator">True</property>
-                                <signal name="toggled" handler="on_speller_checkbutton_toggled"/>
+                              <widget class="GtkComboBox" id="one_window_type_combobox">
+                                <property name="visible">True</property>
+                                <property name="items" translatable="yes">Never
+Always
+Always (with Roster)
+Per account
+Per type</property>
+                                <signal name="changed" handler="on_one_window_type_combo_changed"/>
                               </widget>
                               <packing>
+                                <property name="left_attach">1</property>
                                 <property name="right_attach">2</property>
-                                <property name="top_attach">5</property>
-                                <property name="bottom_attach">6</property>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
                                 <property name="x_options">GTK_FILL</property>
                               </packing>
                             </child>
                             <child>
-                              <widget class="GtkComboBox" id="emoticons_combobox">
+                              <widget class="GtkComboBox" id="treat_incoming_messages_combobox">
                                 <property name="visible">True</property>
-                                <signal name="changed" handler="on_emoticons_combobox_changed"/>
+                                <property name="items" translatable="yes">Determined by sender
+Chat message
+Single message</property>
+                                <signal name="changed" handler="on_treat_incoming_messages_combobox_changed"/>
                               </widget>
                               <packing>
                                 <property name="left_attach">1</property>
                                 <property name="right_attach">2</property>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
                                 <property name="x_options">GTK_FILL</property>
                               </packing>
                             </child>
                             <child>
-                              <widget class="GtkEventBox" id="eventbox5">
+                              <widget class="GtkLabel" id="label379">
                                 <property name="visible">True</property>
-                                <property name="tooltip" translatable="yes">If not disabled, Gajim will replace ascii smilies like ':)' with equivalent animated or static graphical emoticons</property>
-                                <child>
-                                  <widget class="GtkLabel" id="label381">
-                                    <property name="visible">True</property>
-                                    <property name="xalign">0</property>
-                                    <property name="xpad">1</property>
-                                    <property name="label" translatable="yes">Emoticons:</property>
-                                  </widget>
-                                </child>
+                                <property name="xalign">0</property>
+                                <property name="xpad">1</property>
+                                <property name="label" translatable="yes">Use only one message _window:</property>
+                                <property name="use_underline">True</property>
+                                <property name="mnemonic_widget">one_window_type_combobox</property>
+                              </widget>
+                              <packing>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                                <property name="x_options">GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <widget class="GtkLabel" id="label387">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xpad">1</property>
+                                <property name="label" translatable="yes">Treat all incoming messages as:</property>
                               </widget>
                               <packing>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
                                 <property name="x_options">GTK_FILL</property>
                               </packing>
                             </child>
@@ -307,55 +308,42 @@ Per type</property>
                             <property name="column_spacing">6</property>
                             <property name="row_spacing">6</property>
                             <child>
-                              <widget class="GtkLabel" id="label6">
+                              <widget class="GtkLabel" id="label4">
                                 <property name="visible">True</property>
                                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                               </widget>
                               <packing>
-                                <property name="left_attach">2</property>
+                                <property name="left_attach">3</property>
                                 <property name="right_attach">4</property>
-                                <property name="top_attach">1</property>
-                                <property name="bottom_attach">2</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <widget class="GtkLabel" id="label249">
-                                <property name="visible">True</property>
-                                <property name="xalign">0</property>
-                                <property name="label" translatable="yes">T_heme:</property>
-                                <property name="use_underline">True</property>
-                                <property name="mnemonic_widget">theme_combobox</property>
-                              </widget>
-                              <packing>
-                                <property name="x_options">GTK_FILL</property>
-                                <property name="y_options">GTK_FILL</property>
                               </packing>
                             </child>
                             <child>
-                              <widget class="GtkButton" id="manage_theme_button">
+                              <widget class="GtkCheckButton" id="transports_iconsets_checkbutton">
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="tooltip" translatable="yes">Configure color and font of the interface</property>
-                                <property name="label" translatable="yes">Ma_nage...</property>
+                                <property name="tooltip" translatable="yes">If checked, Gajim will use protocol-specific status icons. (eg. A contact from MSN will have the equivalent msn icon for status online, away, busy, etc...)</property>
+                                <property name="label" translatable="yes">Use _transports iconsets</property>
                                 <property name="use_underline">True</property>
                                 <property name="response_id">0</property>
-                                <signal name="clicked" handler="on_manage_theme_button_clicked"/>
+                                <property name="draw_indicator">True</property>
+                                <signal name="toggled" handler="on_transports_iconsets_checkbutton_toggled"/>
                               </widget>
                               <packing>
-                                <property name="left_attach">2</property>
-                                <property name="right_attach">3</property>
-                                <property name="x_options">GTK_FILL</property>
-                                <property name="y_options">GTK_FILL</property>
+                                <property name="right_attach">4</property>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
                               </packing>
                             </child>
                             <child>
-                              <widget class="GtkComboBox" id="theme_combobox">
+                              <widget class="GtkComboBox" id="iconset_combobox">
                                 <property name="visible">True</property>
-                                <signal name="changed" handler="on_theme_combobox_changed"/>
+                                <signal name="changed" handler="on_iconset_combobox_changed"/>
                               </widget>
                               <packing>
                                 <property name="left_attach">1</property>
                                 <property name="right_attach">2</property>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
                                 <property name="x_options">GTK_FILL</property>
                                 <property name="y_options">GTK_FILL</property>
                               </packing>
@@ -376,44 +364,57 @@ Per type</property>
                               </packing>
                             </child>
                             <child>
-                              <widget class="GtkComboBox" id="iconset_combobox">
+                              <widget class="GtkComboBox" id="theme_combobox">
                                 <property name="visible">True</property>
-                                <signal name="changed" handler="on_iconset_combobox_changed"/>
+                                <signal name="changed" handler="on_theme_combobox_changed"/>
                               </widget>
                               <packing>
                                 <property name="left_attach">1</property>
                                 <property name="right_attach">2</property>
-                                <property name="top_attach">1</property>
-                                <property name="bottom_attach">2</property>
                                 <property name="x_options">GTK_FILL</property>
                                 <property name="y_options">GTK_FILL</property>
                               </packing>
                             </child>
                             <child>
-                              <widget class="GtkCheckButton" id="transports_iconsets_checkbutton">
+                              <widget class="GtkButton" id="manage_theme_button">
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="tooltip" translatable="yes">If checked, Gajim will use protocol-specific status icons. (eg. A contact from MSN will have the equivalent msn icon for status online, away, busy, etc...)</property>
-                                <property name="label" translatable="yes">Use _transports iconsets</property>
+                                <property name="tooltip" translatable="yes">Configure color and font of the interface</property>
+                                <property name="label" translatable="yes">Ma_nage...</property>
                                 <property name="use_underline">True</property>
                                 <property name="response_id">0</property>
-                                <property name="draw_indicator">True</property>
-                                <signal name="toggled" handler="on_transports_iconsets_checkbutton_toggled"/>
+                                <signal name="clicked" handler="on_manage_theme_button_clicked"/>
                               </widget>
                               <packing>
-                                <property name="right_attach">4</property>
-                                <property name="top_attach">2</property>
-                                <property name="bottom_attach">3</property>
+                                <property name="left_attach">2</property>
+                                <property name="right_attach">3</property>
+                                <property name="x_options">GTK_FILL</property>
+                                <property name="y_options">GTK_FILL</property>
                               </packing>
                             </child>
                             <child>
-                              <widget class="GtkLabel" id="label4">
+                              <widget class="GtkLabel" id="label249">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="label" translatable="yes">T_heme:</property>
+                                <property name="use_underline">True</property>
+                                <property name="mnemonic_widget">theme_combobox</property>
+                              </widget>
+                              <packing>
+                                <property name="x_options">GTK_FILL</property>
+                                <property name="y_options">GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <widget class="GtkLabel" id="label6">
                                 <property name="visible">True</property>
                                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                               </widget>
                               <packing>
-                                <property name="left_attach">3</property>
+                                <property name="left_attach">2</property>
                                 <property name="right_attach">4</property>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
                               </packing>
                             </child>
                           </widget>
@@ -474,33 +475,36 @@ Per type</property>
                             <property name="column_spacing">6</property>
                             <property name="row_spacing">6</property>
                             <child>
-                              <widget class="GtkComboBox" id="outgoing_chat_states_combobox">
+                              <widget class="GtkCheckButton" id="ignore_events_from_unknown_contacts_checkbutton">
                                 <property name="visible">True</property>
-                                <property name="items" translatable="yes">All chat states
-Composing only
-Disabled</property>
-                                <signal name="changed" handler="on_outgoing_chat_states_combobox_changed"/>
+                                <property name="can_focus">True</property>
+                                <property name="tooltip" translatable="yes">Check this option, only if someone you don't have in the roster spams/annoys you. Use with caution, because it blocks all messages from any contact that is not in the roster</property>
+                                <property name="label" translatable="yes">_Ignore events from contacts not in the roster</property>
+                                <property name="use_underline">True</property>
+                                <property name="response_id">0</property>
+                                <property name="draw_indicator">True</property>
+                                <signal name="toggled" handler="on_ignore_events_from_unknown_contacts_checkbutton_toggled"/>
                               </widget>
                               <packing>
-                                <property name="left_attach">1</property>
                                 <property name="right_attach">2</property>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
                                 <property name="x_options">GTK_FILL</property>
                               </packing>
                             </child>
                             <child>
-                              <widget class="GtkEventBox" id="eventbox4">
+                              <widget class="GtkComboBox" id="displayed_chat_states_combobox">
                                 <property name="visible">True</property>
-                                <property name="tooltip" translatable="yes">Gajim can send and receive meta-information related to a conversation you may have with a contact. Here you can specify which chatstates you want to send to the other party.</property>
-                                <child>
-                                  <widget class="GtkLabel" id="label354">
-                                    <property name="visible">True</property>
-                                    <property name="xalign">0</property>
-                                    <property name="label" translatable="yes">_Send chat state notifications:</property>
-                                    <property name="use_underline">True</property>
-                                  </widget>
-                                </child>
+                                <property name="items" translatable="yes">All chat states
+Composing only
+Disabled</property>
+                                <signal name="changed" handler="on_displayed_chat_states_combobox_changed"/>
                               </widget>
                               <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
                                 <property name="x_options">GTK_FILL</property>
                               </packing>
                             </child>
@@ -524,36 +528,33 @@ Disabled</property>
                               </packing>
                             </child>
                             <child>
-                              <widget class="GtkComboBox" id="displayed_chat_states_combobox">
+                              <widget class="GtkEventBox" id="eventbox4">
                                 <property name="visible">True</property>
-                                <property name="items" translatable="yes">All chat states
-Composing only
-Disabled</property>
-                                <signal name="changed" handler="on_displayed_chat_states_combobox_changed"/>
+                                <property name="tooltip" translatable="yes">Gajim can send and receive meta-information related to a conversation you may have with a contact. Here you can specify which chatstates you want to send to the other party.</property>
+                                <child>
+                                  <widget class="GtkLabel" id="label354">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">_Send chat state notifications:</property>
+                                    <property name="use_underline">True</property>
+                                  </widget>
+                                </child>
                               </widget>
                               <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">1</property>
-                                <property name="bottom_attach">2</property>
                                 <property name="x_options">GTK_FILL</property>
                               </packing>
                             </child>
                             <child>
-                              <widget class="GtkCheckButton" id="ignore_events_from_unknown_contacts_checkbutton">
+                              <widget class="GtkComboBox" id="outgoing_chat_states_combobox">
                                 <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="tooltip" translatable="yes">Check this option, only if someone you don't have in the roster spams/annoys you. Use with caution, because it blocks all messages from any contact that is not in the roster</property>
-                                <property name="label" translatable="yes">_Ignore events from contacts not in the roster</property>
-                                <property name="use_underline">True</property>
-                                <property name="response_id">0</property>
-                                <property name="draw_indicator">True</property>
-                                <signal name="toggled" handler="on_ignore_events_from_unknown_contacts_checkbutton_toggled"/>
+                                <property name="items" translatable="yes">All chat states
+Composing only
+Disabled</property>
+                                <signal name="changed" handler="on_outgoing_chat_states_combobox_changed"/>
                               </widget>
                               <packing>
+                                <property name="left_attach">1</property>
                                 <property name="right_attach">2</property>
-                                <property name="top_attach">2</property>
-                                <property name="bottom_attach">3</property>
                                 <property name="x_options">GTK_FILL</property>
                               </packing>
                             </child>
@@ -599,152 +600,79 @@ Disabled</property>
                                 <property name="column_spacing">12</property>
                                 <property name="row_spacing">6</property>
                                 <child>
-                                  <widget class="GtkCheckButton" id="default_chat_font">
+                                  <widget class="GtkLabel" id="label72">
                                     <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="label" translatable="yes">Use system _default</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">_Incoming message:</property>
                                     <property name="use_underline">True</property>
-                                    <property name="response_id">0</property>
-                                    <property name="draw_indicator">True</property>
-                                    <signal name="toggled" handler="on_default_chat_font_toggled"/>
+                                    <property name="justify">GTK_JUSTIFY_CENTER</property>
+                                    <property name="wrap">True</property>
+                                    <property name="mnemonic_widget">incoming_msg_colorbutton</property>
                                   </widget>
                                   <packing>
-                                    <property name="left_attach">2</property>
-                                    <property name="right_attach">4</property>
-                                    <property name="top_attach">3</property>
-                                    <property name="bottom_attach">4</property>
                                     <property name="x_options">GTK_FILL</property>
                                     <property name="y_options"></property>
                                   </packing>
                                 </child>
                                 <child>
-                                  <widget class="GtkHBox" id="hbox3021">
+                                  <widget class="GtkColorButton" id="incoming_msg_colorbutton">
                                     <property name="visible">True</property>
-                                    <property name="spacing">6</property>
-                                    <child>
-                                      <widget class="GtkLabel" id="font_label">
-                                        <property name="visible">True</property>
-                                        <property name="xalign">0</property>
-                                        <property name="label" translatable="yes">_Font:</property>
-                                        <property name="use_underline">True</property>
-                                        <property name="mnemonic_widget">conversation_fontbutton</property>
-                                      </widget>
-                                    </child>
-                                    <child>
-                                      <widget class="GtkFontButton" id="conversation_fontbutton">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">True</property>
-                                        <property name="response_id">0</property>
-                                        <signal name="font_set" handler="on_conversation_fontbutton_font_set"/>
-                                      </widget>
-                                      <packing>
-                                        <property name="expand">False</property>
-                                        <property name="position">1</property>
-                                      </packing>
-                                    </child>
+                                    <property name="can_focus">True</property>
+                                    <property name="has_focus">True</property>
+                                    <property name="can_default">True</property>
+                                    <property name="has_default">True</property>
+                                    <property name="response_id">0</property>
+                                    <signal name="color_set" handler="on_incoming_msg_colorbutton_color_set"/>
                                   </widget>
                                   <packing>
+                                    <property name="left_attach">1</property>
                                     <property name="right_attach">2</property>
-                                    <property name="top_attach">3</property>
-                                    <property name="bottom_attach">4</property>
-                                    <property name="x_options">GTK_FILL</property>
+                                    <property name="x_options"></property>
+                                    <property name="y_options"></property>
                                   </packing>
                                 </child>
                                 <child>
-                                  <widget class="GtkHBox" id="hbox3022">
+                                  <widget class="GtkLabel" id="label70">
                                     <property name="visible">True</property>
-                                    <child>
-                                      <widget class="GtkLabel" id="label383">
-                                        <property name="visible">True</property>
-                                      </widget>
-                                      <packing>
-                                        <property name="fill">False</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <widget class="GtkButton" id="reset_colors_button">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">True</property>
-                                        <property name="focus_on_click">False</property>
-                                        <property name="response_id">0</property>
-                                        <signal name="clicked" handler="on_reset_colors_button_clicked"/>
-                                        <child>
-                                          <widget class="GtkAlignment" id="alignment52">
-                                            <property name="visible">True</property>
-                                            <property name="xscale">0</property>
-                                            <property name="yscale">0</property>
-                                            <child>
-                                              <widget class="GtkHBox" id="hbox2936">
-                                                <property name="visible">True</property>
-                                                <property name="spacing">2</property>
-                                                <child>
-                                                  <widget class="GtkImage" id="image439">
-                                                    <property name="visible">True</property>
-                                                    <property name="stock">gtk-revert-to-saved</property>
-                                                  </widget>
-                                                  <packing>
-                                                    <property name="expand">False</property>
-                                                    <property name="fill">False</property>
-                                                  </packing>
-                                                </child>
-                                                <child>
-                                                  <widget class="GtkLabel" id="label217">
-                                                    <property name="visible">True</property>
-                                                    <property name="label" translatable="yes">_Reset to Default Colors</property>
-                                                    <property name="use_underline">True</property>
-                                                  </widget>
-                                                  <packing>
-                                                    <property name="expand">False</property>
-                                                    <property name="fill">False</property>
-                                                    <property name="position">1</property>
-                                                  </packing>
-                                                </child>
-                                              </widget>
-                                            </child>
-                                          </widget>
-                                        </child>
-                                      </widget>
-                                      <packing>
-                                        <property name="expand">False</property>
-                                        <property name="fill">False</property>
-                                        <property name="position">1</property>
-                                      </packing>
-                                    </child>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">_Outgoing message:</property>
+                                    <property name="use_underline">True</property>
+                                    <property name="justify">GTK_JUSTIFY_CENTER</property>
+                                    <property name="wrap">True</property>
+                                    <property name="mnemonic_widget">outgoing_msg_colorbutton</property>
                                   </widget>
                                   <packing>
-                                    <property name="right_attach">4</property>
-                                    <property name="top_attach">2</property>
-                                    <property name="bottom_attach">3</property>
+                                    <property name="left_attach">2</property>
+                                    <property name="right_attach">3</property>
                                     <property name="x_options">GTK_FILL</property>
+                                    <property name="y_options"></property>
                                   </packing>
                                 </child>
                                 <child>
-                                  <widget class="GtkColorButton" id="url_msg_colorbutton">
+                                  <widget class="GtkColorButton" id="outgoing_msg_colorbutton">
                                     <property name="visible">True</property>
                                     <property name="can_focus">True</property>
                                     <property name="response_id">0</property>
-                                    <signal name="color_set" handler="on_url_msg_colorbutton_color_set"/>
+                                    <signal name="color_set" handler="on_outgoing_msg_colorbutton_color_set"/>
                                   </widget>
                                   <packing>
                                     <property name="left_attach">3</property>
                                     <property name="right_attach">4</property>
-                                    <property name="top_attach">1</property>
-                                    <property name="bottom_attach">2</property>
                                     <property name="x_options">GTK_FILL</property>
                                     <property name="y_options"></property>
                                   </packing>
                                 </child>
                                 <child>
-                                  <widget class="GtkLabel" id="label371">
+                                  <widget class="GtkLabel" id="label71">
                                     <property name="visible">True</property>
                                     <property name="xalign">0</property>
-                                    <property name="label" translatable="yes">_URL:</property>
+                                    <property name="label" translatable="yes">_Status message:</property>
                                     <property name="use_underline">True</property>
-                                    <property name="mnemonic_widget">url_msg_colorbutton</property>
+                                    <property name="justify">GTK_JUSTIFY_CENTER</property>
+                                    <property name="wrap">True</property>
+                                    <property name="mnemonic_widget">status_msg_colorbutton</property>
                                   </widget>
                                   <packing>
-                                    <property name="left_attach">2</property>
-                                    <property name="right_attach">3</property>
                                     <property name="top_attach">1</property>
                                     <property name="bottom_attach">2</property>
                                     <property name="x_options">GTK_FILL</property>
@@ -768,16 +696,16 @@ Disabled</property>
                                   </packing>
                                 </child>
                                 <child>
-                                  <widget class="GtkLabel" id="label71">
+                                  <widget class="GtkLabel" id="label371">
                                     <property name="visible">True</property>
                                     <property name="xalign">0</property>
-                                    <property name="label" translatable="yes">_Status message:</property>
+                                    <property name="label" translatable="yes">_URL:</property>
                                     <property name="use_underline">True</property>
-                                    <property name="justify">GTK_JUSTIFY_CENTER</property>
-                                    <property name="wrap">True</property>
-                                    <property name="mnemonic_widget">status_msg_colorbutton</property>
+                                    <property name="mnemonic_widget">url_msg_colorbutton</property>
                                   </widget>
                                   <packing>
+                                    <property name="left_attach">2</property>
+                                    <property name="right_attach">3</property>
                                     <property name="top_attach">1</property>
                                     <property name="bottom_attach">2</property>
                                     <property name="x_options">GTK_FILL</property>
@@ -785,64 +713,137 @@ Disabled</property>
                                   </packing>
                                 </child>
                                 <child>
-                                  <widget class="GtkColorButton" id="outgoing_msg_colorbutton">
+                                  <widget class="GtkColorButton" id="url_msg_colorbutton">
                                     <property name="visible">True</property>
                                     <property name="can_focus">True</property>
                                     <property name="response_id">0</property>
-                                    <signal name="color_set" handler="on_outgoing_msg_colorbutton_color_set"/>
+                                    <signal name="color_set" handler="on_url_msg_colorbutton_color_set"/>
+                                  </widget>
+                                  <packing>
+                                    <property name="left_attach">3</property>
+                                    <property name="right_attach">4</property>
+                                    <property name="top_attach">1</property>
+                                    <property name="bottom_attach">2</property>
+                                    <property name="x_options">GTK_FILL</property>
+                                    <property name="y_options"></property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <widget class="GtkHBox" id="hbox3022">
+                                    <property name="visible">True</property>
+                                    <child>
+                                      <widget class="GtkLabel" id="label383">
+                                        <property name="visible">True</property>
+                                      </widget>
+                                      <packing>
+                                        <property name="fill">False</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <widget class="GtkButton" id="reset_colors_button">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="focus_on_click">False</property>
+                                        <property name="response_id">0</property>
+                                        <signal name="clicked" handler="on_reset_colors_button_clicked"/>
+                                        <child>
+                                          <widget class="GtkAlignment" id="alignment52">
+                                            <property name="visible">True</property>
+                                            <property name="xscale">0</property>
+                                            <property name="yscale">0</property>
+                                            <child>
+                                              <widget class="GtkHBox" id="hbox2936">
+                                                <property name="visible">True</property>
+                                                <property name="spacing">2</property>
+                                                <child>
+                                                  <widget class="GtkImage" id="image439">
+                                                    <property name="visible">True</property>
+                                                    <property name="stock">gtk-revert-to-saved</property>
+                                                  </widget>
+                                                  <packing>
+                                                    <property name="expand">False</property>
+                                                    <property name="fill">False</property>
+                                                  </packing>
+                                                </child>
+                                                <child>
+                                                  <widget class="GtkLabel" id="label217">
+                                                    <property name="visible">True</property>
+                                                    <property name="label" translatable="yes">_Reset to Default Colors</property>
+                                                    <property name="use_underline">True</property>
+                                                  </widget>
+                                                  <packing>
+                                                    <property name="expand">False</property>
+                                                    <property name="fill">False</property>
+                                                    <property name="position">1</property>
+                                                  </packing>
+                                                </child>
+                                              </widget>
+                                            </child>
+                                          </widget>
+                                        </child>
+                                      </widget>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">False</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
                                   </widget>
                                   <packing>
-                                    <property name="left_attach">3</property>
                                     <property name="right_attach">4</property>
+                                    <property name="top_attach">2</property>
+                                    <property name="bottom_attach">3</property>
                                     <property name="x_options">GTK_FILL</property>
-                                    <property name="y_options"></property>
                                   </packing>
                                 </child>
                                 <child>
-                                  <widget class="GtkLabel" id="label70">
+                                  <widget class="GtkHBox" id="hbox3021">
                                     <property name="visible">True</property>
-                                    <property name="xalign">0</property>
-                                    <property name="label" translatable="yes">_Outgoing message:</property>
-                                    <property name="use_underline">True</property>
-                                    <property name="justify">GTK_JUSTIFY_CENTER</property>
-                                    <property name="wrap">True</property>
-                                    <property name="mnemonic_widget">outgoing_msg_colorbutton</property>
+                                    <property name="spacing">6</property>
+                                    <child>
+                                      <widget class="GtkLabel" id="font_label">
+                                        <property name="visible">True</property>
+                                        <property name="xalign">0</property>
+                                        <property name="label" translatable="yes">_Font:</property>
+                                        <property name="use_underline">True</property>
+                                        <property name="mnemonic_widget">conversation_fontbutton</property>
+                                      </widget>
+                                    </child>
+                                    <child>
+                                      <widget class="GtkFontButton" id="conversation_fontbutton">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="response_id">0</property>
+                                        <signal name="font_set" handler="on_conversation_fontbutton_font_set"/>
+                                      </widget>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
                                   </widget>
                                   <packing>
-                                    <property name="left_attach">2</property>
-                                    <property name="right_attach">3</property>
+                                    <property name="right_attach">2</property>
+                                    <property name="top_attach">3</property>
+                                    <property name="bottom_attach">4</property>
                                     <property name="x_options">GTK_FILL</property>
-                                    <property name="y_options"></property>
                                   </packing>
                                 </child>
                                 <child>
-                                  <widget class="GtkColorButton" id="incoming_msg_colorbutton">
+                                  <widget class="GtkCheckButton" id="default_chat_font">
                                     <property name="visible">True</property>
                                     <property name="can_focus">True</property>
-                                    <property name="has_focus">True</property>
-                                    <property name="can_default">True</property>
-                                    <property name="has_default">True</property>
-                                    <property name="response_id">0</property>
-                                    <signal name="color_set" handler="on_incoming_msg_colorbutton_color_set"/>
-                                  </widget>
-                                  <packing>
-                                    <property name="left_attach">1</property>
-                                    <property name="right_attach">2</property>
-                                    <property name="x_options"></property>
-                                    <property name="y_options"></property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <widget class="GtkLabel" id="label72">
-                                    <property name="visible">True</property>
-                                    <property name="xalign">0</property>
-                                    <property name="label" translatable="yes">_Incoming message:</property>
+                                    <property name="label" translatable="yes">Use system _default</property>
                                     <property name="use_underline">True</property>
-                                    <property name="justify">GTK_JUSTIFY_CENTER</property>
-                                    <property name="wrap">True</property>
-                                    <property name="mnemonic_widget">incoming_msg_colorbutton</property>
+                                    <property name="response_id">0</property>
+                                    <property name="draw_indicator">True</property>
+                                    <signal name="toggled" handler="on_default_chat_font_toggled"/>
                                   </widget>
                                   <packing>
+                                    <property name="left_attach">2</property>
+                                    <property name="right_attach">4</property>
+                                    <property name="top_attach">3</property>
+                                    <property name="bottom_attach">4</property>
                                     <property name="x_options">GTK_FILL</property>
                                     <property name="y_options"></property>
                                   </packing>
@@ -1249,56 +1250,63 @@ Show only in roster</property>
                     <property name="column_spacing">12</property>
                     <property name="row_spacing">6</property>
                     <child>
-                      <widget class="GtkEntry" id="auto_xa_message_entry">
+                      <widget class="GtkCheckButton" id="auto_away_checkbutton">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
-                        <property name="tooltip" translatable="yes">The auto not available status message</property>
-                        <signal name="changed" handler="on_auto_xa_message_entry_changed"/>
+                        <property name="label" translatable="yes">Auto _away after:</property>
+                        <property name="use_underline">True</property>
+                        <property name="response_id">0</property>
+                        <property name="draw_indicator">True</property>
+                        <signal name="toggled" handler="on_auto_away_checkbutton_toggled"/>
+                      </widget>
+                      <packing>
+                        <property name="x_options">GTK_FILL</property>
+                        <property name="y_options"></property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkCheckButton" id="auto_xa_checkbutton">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="label" translatable="yes">Auto _not available after:</property>
+                        <property name="use_underline">True</property>
+                        <property name="response_id">0</property>
+                        <property name="draw_indicator">True</property>
+                        <signal name="toggled" handler="on_auto_xa_checkbutton_toggled"/>
                       </widget>
                       <packing>
-                        <property name="left_attach">3</property>
-                        <property name="right_attach">4</property>
                         <property name="top_attach">1</property>
                         <property name="bottom_attach">2</property>
+                        <property name="x_options">GTK_FILL</property>
                         <property name="y_options"></property>
                       </packing>
                     </child>
                     <child>
-                      <widget class="GtkEntry" id="auto_away_message_entry">
+                      <widget class="GtkLabel" id="label77">
                         <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="tooltip" translatable="yes">The auto away status message</property>
-                        <signal name="changed" handler="on_auto_away_message_entry_changed"/>
+                        <property name="xalign">0</property>
+                        <property name="label" translatable="yes">minutes</property>
                       </widget>
                       <packing>
-                        <property name="left_attach">3</property>
-                        <property name="right_attach">4</property>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                        <property name="x_options">GTK_FILL</property>
                         <property name="y_options"></property>
                       </packing>
                     </child>
                     <child>
-                      <widget class="GtkAlignment" id="alignment34">
+                      <widget class="GtkLabel" id="label78">
                         <property name="visible">True</property>
-                        <property name="xalign">1</property>
-                        <property name="xscale">0</property>
-                        <child>
-                          <widget class="GtkSpinButton" id="auto_xa_time_spinbutton">
-                            <property name="width_request">50</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="adjustment">20 1 1440 1 10 10</property>
-                            <property name="climb_rate">1</property>
-                            <signal name="value_changed" handler="on_auto_xa_time_spinbutton_value_changed"/>
-                          </widget>
-                        </child>
+                        <property name="xalign">0</property>
+                        <property name="label" translatable="yes">minutes</property>
                       </widget>
                       <packing>
-                        <property name="left_attach">1</property>
-                        <property name="right_attach">2</property>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
                         <property name="top_attach">1</property>
                         <property name="bottom_attach">2</property>
                         <property name="x_options">GTK_FILL</property>
-                        <property name="y_options">GTK_FILL</property>
+                        <property name="y_options"></property>
                       </packing>
                     </child>
                     <child>
@@ -1325,62 +1333,55 @@ Show only in roster</property>
                       </packing>
                     </child>
                     <child>
-                      <widget class="GtkLabel" id="label78">
+                      <widget class="GtkAlignment" id="alignment34">
                         <property name="visible">True</property>
-                        <property name="xalign">0</property>
-                        <property name="label" translatable="yes">minutes</property>
+                        <property name="xalign">1</property>
+                        <property name="xscale">0</property>
+                        <child>
+                          <widget class="GtkSpinButton" id="auto_xa_time_spinbutton">
+                            <property name="width_request">50</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="adjustment">20 1 1440 1 10 10</property>
+                            <property name="climb_rate">1</property>
+                            <signal name="value_changed" handler="on_auto_xa_time_spinbutton_value_changed"/>
+                          </widget>
+                        </child>
                       </widget>
                       <packing>
-                        <property name="left_attach">2</property>
-                        <property name="right_attach">3</property>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
                         <property name="top_attach">1</property>
                         <property name="bottom_attach">2</property>
                         <property name="x_options">GTK_FILL</property>
-                        <property name="y_options"></property>
+                        <property name="y_options">GTK_FILL</property>
                       </packing>
                     </child>
                     <child>
-                      <widget class="GtkLabel" id="label77">
+                      <widget class="GtkEntry" id="auto_away_message_entry">
                         <property name="visible">True</property>
-                        <property name="xalign">0</property>
-                        <property name="label" translatable="yes">minutes</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip" translatable="yes">The auto away status message</property>
+                        <signal name="changed" handler="on_auto_away_message_entry_changed"/>
                       </widget>
                       <packing>
-                        <property name="left_attach">2</property>
-                        <property name="right_attach">3</property>
-                        <property name="x_options">GTK_FILL</property>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
                         <property name="y_options"></property>
                       </packing>
                     </child>
                     <child>
-                      <widget class="GtkCheckButton" id="auto_xa_checkbutton">
+                      <widget class="GtkEntry" id="auto_xa_message_entry">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
-                        <property name="label" translatable="yes">Auto _not available after:</property>
-                        <property name="use_underline">True</property>
-                        <property name="response_id">0</property>
-                        <property name="draw_indicator">True</property>
-                        <signal name="toggled" handler="on_auto_xa_checkbutton_toggled"/>
+                        <property name="tooltip" translatable="yes">The auto not available status message</property>
+                        <signal name="changed" handler="on_auto_xa_message_entry_changed"/>
                       </widget>
                       <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
                         <property name="top_attach">1</property>
                         <property name="bottom_attach">2</property>
-                        <property name="x_options">GTK_FILL</property>
-                        <property name="y_options"></property>
-                      </packing>
-                    </child>
-                    <child>
-                      <widget class="GtkCheckButton" id="auto_away_checkbutton">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="label" translatable="yes">Auto _away after:</property>
-                        <property name="use_underline">True</property>
-                        <property name="response_id">0</property>
-                        <property name="draw_indicator">True</property>
-                        <signal name="toggled" handler="on_auto_away_checkbutton_toggled"/>
-                      </widget>
-                      <packing>
-                        <property name="x_options">GTK_FILL</property>
                         <property name="y_options"></property>
                       </packing>
                     </child>
@@ -1877,85 +1878,85 @@ Custom</property>
                                         <property name="column_spacing">12</property>
                                         <property name="row_spacing">6</property>
                                         <child>
-                                          <widget class="GtkEntry" id="custom_file_manager_entry">
+                                          <widget class="GtkLabel" id="label199">
                                             <property name="visible">True</property>
-                                            <property name="can_focus">True</property>
-                                            <signal name="changed" handler="on_custom_file_manager_entry_changed"/>
+                                            <property name="xalign">0</property>
+                                            <property name="label" translatable="yes">_Browser:</property>
+                                            <property name="use_underline">True</property>
+                                            <property name="mnemonic_widget">custom_browser_entry</property>
                                           </widget>
                                           <packing>
-                                            <property name="left_attach">1</property>
-                                            <property name="right_attach">2</property>
-                                            <property name="top_attach">2</property>
-                                            <property name="bottom_attach">3</property>
+                                            <property name="x_options">GTK_FILL</property>
                                             <property name="y_options"></property>
                                           </packing>
                                         </child>
                                         <child>
-                                          <widget class="GtkLabel" id="label355">
+                                          <widget class="GtkLabel" id="label200">
                                             <property name="visible">True</property>
                                             <property name="xalign">0</property>
-                                            <property name="label" translatable="yes">_File manager:</property>
+                                            <property name="label" translatable="yes">_Mail client:</property>
                                             <property name="use_underline">True</property>
-                                            <property name="mnemonic_widget">custom_file_manager_entry</property>
+                                            <property name="mnemonic_widget">custom_mail_client_entry</property>
                                           </widget>
                                           <packing>
-                                            <property name="top_attach">2</property>
-                                            <property name="bottom_attach">3</property>
+                                            <property name="top_attach">1</property>
+                                            <property name="bottom_attach">2</property>
                                             <property name="x_options">GTK_FILL</property>
                                             <property name="y_options"></property>
                                           </packing>
                                         </child>
                                         <child>
-                                          <widget class="GtkEntry" id="custom_browser_entry">
+                                          <widget class="GtkEntry" id="custom_mail_client_entry">
                                             <property name="visible">True</property>
                                             <property name="can_focus">True</property>
-                                            <signal name="changed" handler="on_custom_browser_entry_changed"/>
+                                            <signal name="changed" handler="on_custom_mail_client_entry_changed"/>
                                           </widget>
                                           <packing>
                                             <property name="left_attach">1</property>
                                             <property name="right_attach">2</property>
+                                            <property name="top_attach">1</property>
+                                            <property name="bottom_attach">2</property>
                                             <property name="y_options"></property>
                                           </packing>
                                         </child>
                                         <child>
-                                          <widget class="GtkEntry" id="custom_mail_client_entry">
+                                          <widget class="GtkEntry" id="custom_browser_entry">
                                             <property name="visible">True</property>
                                             <property name="can_focus">True</property>
-                                            <signal name="changed" handler="on_custom_mail_client_entry_changed"/>
+                                            <signal name="changed" handler="on_custom_browser_entry_changed"/>
                                           </widget>
                                           <packing>
                                             <property name="left_attach">1</property>
                                             <property name="right_attach">2</property>
-                                            <property name="top_attach">1</property>
-                                            <property name="bottom_attach">2</property>
                                             <property name="y_options"></property>
                                           </packing>
                                         </child>
                                         <child>
-                                          <widget class="GtkLabel" id="label200">
+                                          <widget class="GtkLabel" id="label355">
                                             <property name="visible">True</property>
                                             <property name="xalign">0</property>
-                                            <property name="label" translatable="yes">_Mail client:</property>
+                                            <property name="label" translatable="yes">_File manager:</property>
                                             <property name="use_underline">True</property>
-                                            <property name="mnemonic_widget">custom_mail_client_entry</property>
+                                            <property name="mnemonic_widget">custom_file_manager_entry</property>
                                           </widget>
                                           <packing>
-                                            <property name="top_attach">1</property>
-                                            <property name="bottom_attach">2</property>
+                                            <property name="top_attach">2</property>
+                                            <property name="bottom_attach">3</property>
                                             <property name="x_options">GTK_FILL</property>
                                             <property name="y_options"></property>
                                           </packing>
                                         </child>
                                         <child>
-                                          <widget class="GtkLabel" id="label199">
+                                          <widget class="GtkEntry" id="custom_file_manager_entry">
                                             <property name="visible">True</property>
-                                            <property name="xalign">0</property>
-                                            <property name="label" translatable="yes">_Browser:</property>
-                                            <property name="use_underline">True</property>
-                                            <property name="mnemonic_widget">custom_browser_entry</property>
+                                            <property name="can_focus">True</property>
+                                            <signal name="changed" handler="on_custom_file_manager_entry_changed"/>
                                           </widget>
                                           <packing>
-                                            <property name="x_options">GTK_FILL</property>
+                                            <property name="left_attach">1</property>
+                                            <property name="right_attach">2</property>
+                                            <property name="top_attach">2</property>
+                                            <property name="bottom_attach">3</property>
                                             <property name="y_options"></property>
                                           </packing>
                                         </child>
diff --git a/data/glade/roster_window.glade b/data/glade/roster_window.glade
index dc482bb8a2..ff908d794c 100644
--- a/data/glade/roster_window.glade
+++ b/data/glade/roster_window.glade
@@ -230,6 +230,17 @@
                         <signal name="activate" handler="on_show_transports_menuitem_activate"/>
                       </widget>
                     </child>
+                    <child>
+                      <widget class="GtkCheckMenuItem" id="show_roster_menuitem">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="label" translatable="yes">Show _roster</property>
+                        <property name="use_underline">True</property>
+                        <property name="active">True</property>
+                        <signal name="toggled" handler="on_show_roster_menuitem_toggled"/>
+                        <accelerator key="R" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+                      </widget>
+                    </child>
                     <child>
                       <widget class="GtkSeparatorMenuItem" id="separator3">
                         <property name="visible">True</property>
@@ -352,45 +363,65 @@
           </packing>
         </child>
         <child>
-          <widget class="GtkScrolledWindow" id="scrolledwindow">
+          <widget class="GtkHPaned" id="roster_hpaned">
             <property name="visible">True</property>
             <property name="can_focus">True</property>
-            <property name="border_width">2</property>
-            <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
-            <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
             <child>
-              <widget class="GtkTreeView" id="roster_treeview">
+              <widget class="GtkVBox" id="roster_vbox2">
                 <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="headers_visible">False</property>
-                <property name="reorderable">True</property>
-                <signal name="leave_notify_event" handler="on_roster_treeview_leave_notify_event"/>
-                <signal name="button_press_event" handler="on_roster_treeview_button_press_event"/>
-                <signal name="motion_notify_event" handler="on_roster_treeview_motion_notify_event"/>
-                <signal name="row_collapsed" handler="on_roster_treeview_row_collapsed"/>
-                <signal name="row_expanded" handler="on_roster_treeview_row_expanded"/>
-                <signal name="key_press_event" handler="on_roster_treeview_key_press_event"/>
-                <signal name="row_activated" handler="on_roster_treeview_row_activated"/>
-                <signal name="button_release_event" handler="on_roster_treeview_button_release_event"/>
-                <signal name="scroll_event" handler="on_roster_treeview_scroll_event"/>
-                <signal name="style_set" handler="on_roster_treeview_style_set"/>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <child>
+                  <widget class="GtkScrolledWindow" id="scrolledwindow">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="border_width">2</property>
+                    <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+                    <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                    <child>
+                      <widget class="GtkTreeView" id="roster_treeview">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="headers_visible">False</property>
+                        <property name="reorderable">True</property>
+                        <signal name="leave_notify_event" handler="on_roster_treeview_leave_notify_event"/>
+                        <signal name="button_press_event" handler="on_roster_treeview_button_press_event"/>
+                        <signal name="motion_notify_event" handler="on_roster_treeview_motion_notify_event"/>
+                        <signal name="row_collapsed" handler="on_roster_treeview_row_collapsed"/>
+                        <signal name="row_expanded" handler="on_roster_treeview_row_expanded"/>
+                        <signal name="key_press_event" handler="on_roster_treeview_key_press_event"/>
+                        <signal name="row_activated" handler="on_roster_treeview_row_activated"/>
+                        <signal name="button_release_event" handler="on_roster_treeview_button_release_event"/>
+                        <signal name="scroll_event" handler="on_roster_treeview_scroll_event"/>
+                        <signal name="style_set" handler="on_roster_treeview_style_set"/>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+                <child>
+                  <widget class="GtkComboBox" id="status_combobox">
+                    <property name="visible">True</property>
+                    <signal name="changed" handler="on_status_combobox_changed"/>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
               </widget>
+              <packing>
+                <property name="resize">False</property>
+                <property name="shrink">True</property>
+              </packing>
+            </child>
+            <child>
+              <placeholder/>
             </child>
           </widget>
           <packing>
             <property name="position">1</property>
           </packing>
         </child>
-        <child>
-          <widget class="GtkComboBox" id="status_combobox">
-            <property name="visible">True</property>
-            <signal name="changed" handler="on_status_combobox_changed"/>
-          </widget>
-          <packing>
-            <property name="expand">False</property>
-            <property name="position">2</property>
-          </packing>
-        </child>
       </widget>
     </child>
   </widget>
diff --git a/src/common/config.py b/src/common/config.py
index 1570059ade..96a73b8084 100644
--- a/src/common/config.py
+++ b/src/common/config.py
@@ -45,7 +45,7 @@ opt_int = [ 'integer', 0 ]
 opt_str = [ 'string', 0 ]
 opt_bool = [ 'boolean', 0 ]
 opt_color = [ 'color', '^(#[0-9a-fA-F]{6})|()$' ]
-opt_one_window_types = ['never', 'always', 'peracct', 'pertype']
+opt_one_window_types = ['never', 'always', 'always_with_roster', 'peracct', 'pertype']
 opt_treat_incoming_messages = ['', 'chat', 'normal']
 
 class Config:
@@ -229,7 +229,7 @@ class Config:
 		'send_sha_in_gc_presence': [opt_bool, True, _('Jabberd1.4 does not like sha info when one join a password protected group chat. Turn this option to False to stop sending sha info in group chat presences.')],
 		'one_message_window': [opt_str, 'always',
 #always, never, peracct, pertype should not be translated
-			_('Controls the window where new messages are placed.\n\'always\' - All messages are sent to a single window.\n\'never\' - All messages get their own window.\n\'peracct\' - Messages for each account are sent to a specific window.\n\'pertype\' - Each message type (e.g., chats vs. groupchats) are sent to a specific window. Note, changing this option requires restarting Gajim before the changes will take effect.')],
+			_('Controls the window where new messages are placed.\n\'always\' - All messages are sent to a single window.\n\'always_with_roster\' - Like \'always\' but the messages are in a single window along with the roster.\n\'never\' - All messages get their own window.\n\'peracct\' - Messages for each account are sent to a specific window.\n\'pertype\' - Each message type (e.g., chats vs. groupchats) are sent to a specific window.')],
 		'show_avatar_in_chat': [opt_bool, True, _('If False, you will no longer see the avatar in the chat window.')],
 		'escape_key_closes': [opt_bool, True, _('If True, pressing the escape key closes a tab/window.')],
 		'compact_view': [opt_bool, False, _('Hides the buttons in chat windows.')],
diff --git a/src/config.py b/src/config.py
index b344e3203c..58e58b17fd 100644
--- a/src/config.py
+++ b/src/config.py
@@ -6,6 +6,7 @@
 ## Copyright (C) 2003-2005 Vincent Hanquez <tab@snarc.org>
 ## Copyright (C) 2006 Stefan Bethge <stefan@lanpartei.de>
 ## Copyright (C) 2007 Stephan Erb <steve-e@h3c.de> 
+## Copyright (C) 2007 Travis Shirk <travis@pobox.com>
 ##
 ## This file is part of Gajim.
 ##
@@ -174,7 +175,7 @@ class PreferencesWindow:
 		# iconset
 		iconsets_list = os.listdir(os.path.join(gajim.DATA_DIR, 'iconsets'))
 		if os.path.isdir(gajim.MY_ICONSETS_PATH):
-			iconsets_list += os.listdir(gajim.MY_ICONSETS_PATH) 
+			iconsets_list += os.listdir(gajim.MY_ICONSETS_PATH)
 		# new model, image in 0, string in 1
 		model = gtk.ListStore(gtk.Image, str)
 		renderer_image = cell_renderer_image.CellRendererImage(0, 0)
@@ -537,9 +538,9 @@ class PreferencesWindow:
 					self.on_msg_treemodel_row_deleted)
 		self.default_msg_tree.get_model().connect('row-changed',
 					self.on_default_msg_treemodel_row_changed)
-		
+
 		self.theme_preferences = None
-		
+
 		self.notebook.set_current_page(0)
 		if not gajim.config.get('use_pep'):
 			self.notebook.remove_page(4)
diff --git a/src/message_control.py b/src/message_control.py
index cd417cd797..a81532bc18 100644
--- a/src/message_control.py
+++ b/src/message_control.py
@@ -1,6 +1,6 @@
 ##	message_control.py
 ##
-## Copyright (C) 2006 Travis Shirk <travis@pobox.com>
+## Copyright (C) 2006-2007 Travis Shirk <travis@pobox.com>
 ## Copyright (C) 2007 Stephan Erb <steve-e@h3c.de> 
 ##
 ## This file is part of Gajim.
@@ -34,7 +34,7 @@ class MessageControl:
 	def __init__(self, type_id, parent_win, widget_name, contact, account, resource = None):
 		# dict { cb id : widget} 
 		# keep all registered callbacks of widgets, created by self.xml
-		self.handlers = {} 
+		self.handlers = {}
 		self.type_id = type_id
 		self.parent_win = parent_win
 		self.widget_name = widget_name
@@ -126,8 +126,8 @@ class MessageControl:
 			if self.session.enable_encryption:
 				was_encrypted = True
 
-			print "starting a new session, dropping the old one!"
-			gajim.connections[self.account].delete_session(self.session.jid, self.session.thread_id)
+			gajim.connections[self.account].delete_session(self.session.jid,
+									self.session.thread_id)
 
 		self.session = session
 
diff --git a/src/message_window.py b/src/message_window.py
index c2ebe27699..ebb5262df0 100644
--- a/src/message_window.py
+++ b/src/message_window.py
@@ -6,10 +6,9 @@
 ##                    Vincent Hanquez <tab@snarc.org>
 ##                    Nikos Kouremenos <kourem@gmail.com>
 ##                    Dimitur Kirov <dkirov@gmail.com>
-##                    Travis Shirk <travis@pobox.com>
 ##                    Norman Rasmussen <norman@rasmussen.co.za>
-## Copyright (C) 2006 Travis Shirk <travis@pobox.com>
-##                    Geobert Quach <geobert@gmail.com>
+## Copyright (C) 2005-2007 Travis Shirk <travis@pobox.com>
+## Copyright (C) 2006 Geobert Quach <geobert@gmail.com>
 ## Copyright (C) 2007 Stephan Erb <steve-e@h3c.de> 
 ##
 ## This file is part of Gajim.
@@ -39,7 +38,7 @@ from common import gajim
 
 ####################
 
-class MessageWindow:
+class MessageWindow(object):
 	'''Class for windows which contain message like things; chats,
 	groupchats, etc.'''
 
@@ -53,8 +52,8 @@ class MessageWindow:
 		CLOSE_COMMAND,
 		CLOSE_CTRL_KEY
 	) = range(5)
-	
-	def __init__(self, acct, type):
+
+	def __init__(self, acct, type, parent_window=None, parent_paned=None):
 		# A dictionary of dictionaries where _contacts[account][jid] == A MessageControl
 		self._controls = {}
 		# If None, the window is not tied to any specific account
@@ -68,6 +67,18 @@ class MessageWindow:
 		self.widget_name = 'message_window'
 		self.xml = gtkgui_helpers.get_glade('%s.glade' % self.widget_name)
 		self.window = self.xml.get_widget(self.widget_name)
+		self.notebook = self.xml.get_widget('notebook')
+		self.parent_paned = None
+
+		if parent_window:
+			orig_window = self.window
+			self.window = parent_window
+			self.parent_paned = parent_paned
+			self.notebook.reparent(self.parent_paned)
+			self.parent_paned.pack2(self.notebook, resize=True, shrink=True)
+			orig_window.destroy()
+			del orig_window
+
 		id = self.window.connect('delete-event', self._on_window_delete)
 		self.handlers[id] = self.window
 		id = self.window.connect('destroy', self._on_window_destroy)
@@ -91,7 +102,6 @@ class MessageWindow:
 		self.window.add_events(gtk.gdk.POINTER_MOTION_MASK)
 		self.alignment = self.xml.get_widget('alignment')
 
-		self.notebook = self.xml.get_widget('notebook')
 		id = self.notebook.connect('switch-page',
 			self._on_notebook_switch_page)
 		self.handlers[id] = self.notebook
@@ -144,6 +154,9 @@ class MessageWindow:
 			n += len(dict)
 		return n
 
+	def resize(self, width, height):
+		gtkgui_helpers.resize_window(self.window, width, height)
+
 	def _on_window_focus(self, widget, event):
 		# window received focus, so if we had urgency REMOVE IT
 		# NOTE: we do not have to read the message (it maybe in a bg tab)
@@ -179,6 +192,8 @@ class MessageWindow:
 		for ctrl in self.controls():
 			ctrl.shutdown()
 		self._controls.clear()
+		# Clean up handlers connected to the parent window, this is important since
+		# self.window may be the RosterWindow
 		for i in self.handlers.keys():
 			if self.handlers[i].handler_is_connected(i):
 				self.handlers[i].disconnect(i)
@@ -210,8 +225,9 @@ class MessageWindow:
 		widget =  xml.get_widget('tab_close_button')
 		id = widget.connect('clicked', self._on_close_button_clicked, control)
 		control.handlers[id] = widget
-		
-		id = tab_label_box.connect('button-press-event', self.on_tab_eventbox_button_press_event, control.widget)
+
+		id = tab_label_box.connect('button-press-event', self.on_tab_eventbox_button_press_event,
+					control.widget)
 		control.handlers[id] = tab_label_box
 		self.notebook.append_page(control.widget, tab_label_box)
 
@@ -263,7 +279,7 @@ class MessageWindow:
 		if not control:
 			# No more control in this window
 			return
-		
+
 		# CTRL mask
 		if modifier & gtk.gdk.CONTROL_MASK:
 			if keyval == gtk.keysyms.h:
@@ -286,7 +302,7 @@ class MessageWindow:
 			# Tab switch bindings
 			if keyval == gtk.keysyms.Right: # ALT + RIGHT
 				new = self.notebook.get_current_page() + 1
-				if new >= self.notebook.get_n_pages(): 
+				if new >= self.notebook.get_n_pages():
 					new = 0
 				self.notebook.set_current_page(new)
 			elif keyval == gtk.keysyms.Left: # ALT + LEFT
@@ -307,7 +323,7 @@ class MessageWindow:
 		'''When close button is pressed: close a tab'''
 		self.remove_tab(control, self.CLOSE_CLOSE_BUTTON)
 
-	def show_title(self, urgent = True, control = None):
+	def show_title(self, urgent=True, control=None):
 		'''redraw the window's title'''
 		if not control:
 			control = self.get_active_control()
@@ -341,10 +357,7 @@ class MessageWindow:
 				name += '/' + control.resource
 
 		window_mode = gajim.interface.msg_win_mgr.mode
-
-		if self.get_num_controls() == 1:
-			label = name
-		elif window_mode == MessageWindowMgr.ONE_MSG_WINDOW_PERTYPE:
+		if window_mode == MessageWindowMgr.ONE_MSG_WINDOW_PERTYPE:
 			# Show the plural form since number of tabs > 1
 			if self.type == 'chat':
 				label = _('Chats')
@@ -352,9 +365,16 @@ class MessageWindow:
 				label = _('Group Chats')
 			else:
 				label = _('Private Chats')
+		elif window_mode == MessageWindowMgr.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER:
+			label = None
+		elif self.get_num_controls() == 1:
+			label = name
 		else:
 			label = _('Messages')
-		title = _('%s - Gajim') % label
+
+		title = 'Gajim'
+		if label:
+			title = _('%s - %s') % (label, title)
 
 		if window_mode == MessageWindowMgr.ONE_MSG_WINDOW_PERACCT:
 			title = title + ": " + control.account
@@ -370,7 +390,7 @@ class MessageWindow:
 		ctrl = self._controls[acct][jid]
 		ctrl_page = self.notebook.page_num(ctrl.widget)
 		self.notebook.set_current_page(ctrl_page)
-	
+
 	def remove_tab(self, ctrl, method, reason = None, force = False):
 		'''reason is only for gc (offline status message)
 		if force is True, do not ask any confirmation'''
@@ -413,7 +433,13 @@ class MessageWindow:
 			gajim.interface.msg_win_mgr._on_window_destroy(self.window)
 			# dnd clean up
 			self.notebook.drag_dest_unset()
-			self.window.destroy()
+			if self.parent_paned:
+				# Don't close parent window, just remove the child
+				child = self.parent_paned.get_child2()
+				self.parent_paned.remove(child)
+				# FIXME: restore preferred roster size
+			else:
+				self.window.destroy()
 			return # don't show_title, we are dead
 		elif self.get_num_controls() == 1: # we are going from two tabs to one
 			show_tabs_if_one_tab = gajim.config.get('tabs_always_visible')
@@ -542,7 +568,7 @@ class MessageWindow:
 		first_composing_ind = -1 # id of first composing ctrl to switch to
 										# if no others controls have awaiting events
 		# loop until finding an unread tab or having done a complete cycle
-		while True: 
+		while True:
 			if forward == True: # look for the first unread tab on the right
 				ind = ind + 1
 				if ind >= self.notebook.get_n_pages():
@@ -590,7 +616,7 @@ class MessageWindow:
 		if old_no >= 0:
 			old_ctrl = self._widget_to_control(notebook.get_nth_page(old_no))
 			old_ctrl.set_control_active(False)
-		
+
 		new_ctrl = self._widget_to_control(notebook.get_nth_page(page_num))
 		new_ctrl.set_control_active(True)
 		self.show_title(control = new_ctrl)
@@ -598,8 +624,8 @@ class MessageWindow:
 	def _on_notebook_key_press(self, widget, event):
 		control = self.get_active_control()
 		# Ctrl+PageUP / DOWN has to be handled by notebook
-		if event.state & gtk.gdk.CONTROL_MASK and event.keyval in (
-		gtk.keysyms.Page_Down, gtk.keysyms.Page_Up):
+		if (event.state & gtk.gdk.CONTROL_MASK and
+				event.keyval in (gtk.keysyms.Page_Down, gtk.keysyms.Page_Up)):
 			return False
 		if isinstance(control, ChatControlBase):
 			# we forwarded it to message textview
@@ -609,7 +635,7 @@ class MessageWindow:
 	def setup_tab_dnd(self, child):
 		'''Set tab label as drag source and connect the drag_data_get signal'''
 		tab_label = self.notebook.get_tab_label(child)
-		tab_label.dnd_handler = tab_label.connect('drag_data_get', 
+		tab_label.dnd_handler = tab_label.connect('drag_data_get',
 			self.on_tab_label_drag_data_get_cb)
 		self.handlers[tab_label.dnd_handler] = tab_label
 		tab_label.drag_source_set(gtk.gdk.BUTTON1_MASK, self.DND_TARGETS,
@@ -630,11 +656,11 @@ class MessageWindow:
 		source_child = self.notebook.get_nth_page(source_page_num)
 		if dest_page_num != source_page_num:
 			self.notebook.reorder_child(source_child, dest_page_num)
-		
+
 	def get_tab_at_xy(self, x, y):
 		'''Thanks to Gaim
 		Return the tab under xy and
-		if its nearer from left or right side of the tab	
+		if its nearer from left or right side of the tab
 		'''
 		page_num = -1
 		to_right = False
@@ -655,7 +681,7 @@ class MessageWindow:
 				if (y >= tab_alloc.y) and \
 				(y <= (tab_alloc.y + tab_alloc.height)):
 					page_num = i
-				
+
 					if y > tab_alloc.y + (tab_alloc.height / 2.0):
 						to_right = True
 					break
@@ -679,36 +705,53 @@ class MessageWindow:
 		tab_label.disconnect(tab_label.dnd_handler)
 
 ################################################################################
-class MessageWindowMgr:
+class MessageWindowMgr(gobject.GObject):
 	'''A manager and factory for MessageWindow objects'''
+	__gsignals__ = {
+		'window-delete': (gobject.SIGNAL_RUN_LAST, None, (object,)),
+	}
 
 	# These constants map to common.config.opt_one_window_types indices
 	(
 	ONE_MSG_WINDOW_NEVER,
 	ONE_MSG_WINDOW_ALWAYS,
+	ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER,
 	ONE_MSG_WINDOW_PERACCT,
-	ONE_MSG_WINDOW_PERTYPE
-	) = range(4)
-	# A key constant for the main window for all messages
+	ONE_MSG_WINDOW_PERTYPE,
+	) = range(5)
+	# A key constant for the main window in ONE_MSG_WINDOW_ALWAYS mode
 	MAIN_WIN = 'main'
+	# A key constant for the main window in ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER mode
+	ROSTER_MAIN_WIN = 'roster'
 
-	def __init__(self):
+	def __init__(self, parent_window, parent_paned):
 		''' A dictionary of windows; the key depends on the config:
 		ONE_MSG_WINDOW_NEVER: The key is the contact JID
-		ONE_MSG_WINDOW_ALWAYS: The key is MessageWindowMgr.MAIN_WIN 
+		ONE_MSG_WINDOW_ALWAYS: The key is MessageWindowMgr.MAIN_WIN
+		ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: The key is MessageWindowMgr.MAIN_WIN
 		ONE_MSG_WINDOW_PERACCT: The key is the account name
 		ONE_MSG_WINDOW_PERTYPE: The key is a message type constant'''
+		gobject.GObject.__init__(self)
 		self._windows = {}
+
 		# Map the mode to a int constant for frequent compares
 		mode = gajim.config.get('one_message_window')
 		self.mode = common.config.opt_one_window_types.index(mode)
 
+		self.parent_win = parent_window
+		self.parent_paned = parent_paned
+
 	def change_account_name(self, old_name, new_name):
 		for win in self.windows():
 			win.change_account_name(old_name, new_name)
 
 	def _new_window(self, acct, type):
-		win = MessageWindow(acct, type)
+		parent_win = None
+		parent_paned = None
+		if self.mode == self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER:
+			parent_win = self.parent_win
+			parent_paned = self.parent_paned
+		win = MessageWindow(acct, type, parent_win, parent_paned)
 		# we track the lifetime of this window
 		win.window.connect('delete-event', self._on_window_delete)
 		win.window.connect('destroy', self._on_window_destroy)
@@ -729,7 +772,7 @@ class MessageWindowMgr:
 	def has_window(self, jid, acct):
 		return self.get_window(jid, acct) != None
 
-	def one_window_opened(self, contact, acct, type):
+	def one_window_opened(self, contact=None, acct=None, type=None):
 		try:
 			return self._windows[self._mode_to_key(contact, acct, type)] != None
 		except KeyError:
@@ -739,10 +782,14 @@ class MessageWindowMgr:
 		'''Resizes window according to config settings'''
 		if not gajim.config.get('saveposition'):
 			return
-			
-		if self.mode == self.ONE_MSG_WINDOW_ALWAYS:
+
+		if self.mode in (self.ONE_MSG_WINDOW_ALWAYS,
+				self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER):
 			size = (gajim.config.get('msgwin-width'),
 				gajim.config.get('msgwin-height'))
+			if self.mode == self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER:
+				parent_size = win.window.get_size()
+				size = (parent_size[0] + size[0], size[1])
 		elif self.mode == self.ONE_MSG_WINDOW_PERACCT:
 			size = (gajim.config.get_per('accounts', acct, 'msgwin-width'),
 				gajim.config.get_per('accounts', acct, 'msgwin-height'))
@@ -754,13 +801,13 @@ class MessageWindowMgr:
 			size = (gajim.config.get(opt_width), gajim.config.get(opt_height))
 		else:
 			return
+		win.resize(size[0], size[1])
 
-		gtkgui_helpers.resize_window(win.window, size[0], size[1])
-	
 	def _position_window(self, win, acct, type):
 		'''Moves window according to config settings'''
-		if not gajim.config.get('saveposition') or\
-		self.mode == self.ONE_MSG_WINDOW_NEVER:
+		if (not gajim.config.get('saveposition') or
+		self.mode in [self.ONE_MSG_WINDOW_NEVER,
+				self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER]):
 			return
 
 		if self.mode == self.ONE_MSG_WINDOW_ALWAYS:
@@ -782,21 +829,22 @@ class MessageWindowMgr:
 			key = acct + contact.jid
 			if resource:
 				key += '/' + resource
+			return key
 		elif self.mode == self.ONE_MSG_WINDOW_ALWAYS:
-			key = self.MAIN_WIN
+			return self.MAIN_WIN
+		elif self.mode == self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER:
+			return self.ROSTER_MAIN_WIN
 		elif self.mode == self.ONE_MSG_WINDOW_PERACCT:
-			key = acct
+			return acct
 		elif self.mode == self.ONE_MSG_WINDOW_PERTYPE:
-			key = type
-		return key
+			return type
 
 	def create_window(self, contact, acct, type, resource = None):
-		key = None
 		win_acct = None
 		win_type = None
-		win_role = 'messages'
+		win_role = None  # X11 window role
 
-		key = self._mode_to_key(contact, acct, type, resource)
+		win_key = self._mode_to_key(contact, acct, type, resource)
 		if self.mode == self.ONE_MSG_WINDOW_PERACCT:
 			win_acct = acct
 			win_role = acct
@@ -806,21 +854,24 @@ class MessageWindowMgr:
 		elif self.mode == self.ONE_MSG_WINDOW_NEVER:
 			win_type = type
 			win_role = contact.jid
+		elif self.mode == self.ONE_MSG_WINDOW_ALWAYS:
+			win_role = 'messages'
 
 		win = None
 		try:
-			win = self._windows[key]
+			win = self._windows[win_key]
 		except KeyError:
 			win = self._new_window(win_acct, win_type)
 
-		win.window.set_role(win_role)
+		if win_role:
+			win.window.set_role(win_role)
 
 		# Position and size window based on saved state and window mode
 		if not self.one_window_opened(contact, acct, type):
 			self._position_window(win, acct, type)
 			self._resize_window(win, acct, type)
 
-		self._windows[key] = win
+		self._windows[win_key] = win
 		return win
 
 	def change_key(self, old_jid, new_jid, acct):
@@ -842,6 +893,7 @@ class MessageWindowMgr:
 	def _on_window_destroy(self, win):
 		for k in self._windows.keys():
 			if self._windows[k].window == win:
+				self.emit('window-delete', self._windows[k])
 				del self._windows[k]
 				return
 
@@ -870,17 +922,17 @@ class MessageWindowMgr:
 			for c in w.controls():
 				yield c
 
-	def shutdown(self):
+	def shutdown(self, width_adjust=0):
 		for w in self.windows():
-			self.save_state(w)
+			self.save_state(w, width_adjust)
 			w.window.hide()
 			w.window.destroy()
 		gajim.interface.save_config()
 
-	def save_state(self, msg_win):
+	def save_state(self, msg_win, width_adjust=0):
 		if not gajim.config.get('saveposition'):
 			return
-		
+
 		# Save window size and position
 		pos_x_key = 'msgwin-x-position'
 		pos_y_key = 'msgwin-y-position'
@@ -907,6 +959,9 @@ class MessageWindowMgr:
 			type = msg_win.type
 			size_width_key = type + '-msgwin-width'
 			size_height_key = type + '-msgwin-height'
+		elif self.mode == self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER:
+			# Ignore any hpaned width
+			width = msg_win.notebook.allocation.width
 
 		if acct:
 			gajim.config.set_per('accounts', acct, size_width_key, width)
@@ -915,11 +970,12 @@ class MessageWindowMgr:
 			if self.mode != self.ONE_MSG_WINDOW_NEVER:
 				gajim.config.set_per('accounts', acct, pos_x_key, x)
 				gajim.config.set_per('accounts', acct, pos_y_key, y)
-		
+
 		else:
+			width += width_adjust
 			gajim.config.set(size_width_key, width)
 			gajim.config.set(size_height_key, height)
-			
+
 			if self.mode != self.ONE_MSG_WINDOW_NEVER:
 				gajim.config.set(pos_x_key, x)
 				gajim.config.set(pos_y_key, y)
@@ -944,8 +1000,7 @@ class MessageWindowMgr:
 				w.notebook.remove_page(0)
 				page.unparent()
 				controls.append(ctrl)
-			# Must clear _controls from window to prevent
-			# MessageControl.shutdown calls
+			# Must clear _controls from window to prevent MessageControl.shutdown calls
 			w._controls = {}
 			w.window.destroy()
 
diff --git a/src/remote_control.py b/src/remote_control.py
index a1c646aaa6..2594935365 100644
--- a/src/remote_control.py
+++ b/src/remote_control.py
@@ -6,6 +6,7 @@
 ## Copyright (C) 2005-2006 Andrew Sayman <lorien420@myrealbox.com>
 ## Copyright (C) 2007 Lukas Petrovicky <lukas@petrovicky.net>
 ## Copyright (C) 2007 Julien Pivotto <roidelapluie@gmail.com>
+## Copyright (C) 2007 Travis Shirk <travis@pobox.com> 
 ##
 ## This file is part of Gajim.
 ##
diff --git a/src/roster_window.py b/src/roster_window.py
index 801d533faa..61211170ee 100644
--- a/src/roster_window.py
+++ b/src/roster_window.py
@@ -3,6 +3,7 @@
 ##
 ## Copyright (C) 2003-2007 Yann Leboulanger <asterix@lagaule.org>
 ## Copyright (C) 2005-2007 Nikos Kouremenos <kourem@gmail.com>
+##                         Travis Shirk <travis@pobox.com> 
 ## Copyright (C) 2005-2006 Dimitur Kirov <dkirov@gmail.com>
 ## Copyright (C) 2007 Lukas Petrovicky <lukas@petrovicky.net>
 ## Copyright (C) 2007 Julien Pivotto <roidelapluie@gmail.com>
@@ -1019,7 +1020,7 @@ class RosterWindow:
 
 				if gajim.config.get_per('accounts', account, 'is_zeroconf'):
 					continue
-				
+
 				# single message
 				single_message_item = gtk.MenuItem(_('using account %s') % account,
 					False)
@@ -1378,8 +1379,7 @@ class RosterWindow:
 				if contact.resource != '':
 					name += '/' + contact.resource
 				jid_with_resource = contact.jid + '/' + contact.resource
-				if gajim.interface.msg_win_mgr.has_window(jid_with_resource,
-				account):
+				if gajim.interface.msg_win_mgr.has_window(jid_with_resource, account):
 					win = gajim.interface.msg_win_mgr.get_window(jid_with_resource,
 						account)
 					ctrl = win.get_control(jid_with_resource, account)
@@ -2661,7 +2661,7 @@ class RosterWindow:
 		ctrl = gajim.interface.minimized_controls[account][jid]
 		mw = gajim.interface.msg_win_mgr.get_window(ctrl.contact.jid, ctrl.account)
 		if not mw:
-			mw = gajim.interface.msg_win_mgr.create_window(ctrl.contact, \
+			mw = gajim.interface.msg_win_mgr.create_window(ctrl.contact,
 				ctrl.account, ctrl.type_id)
 		ctrl.parent_win = mw
 		mw.new_tab(ctrl)
@@ -3085,8 +3085,8 @@ class RosterWindow:
 			contact = gajim.contacts.create_contact(jid = hostname) # Fake contact
 			execute_command_menuitem.connect('activate',
 				self.on_execute_command, contact, account)
-			
-			start_chat_menuitem.connect('activate', 
+
+			start_chat_menuitem.connect('activate',
 				self.on_new_chat_menuitem_activate, account)
 
 			gc_sub_menu = gtk.Menu() # gc is always a submenu
@@ -4150,7 +4150,7 @@ class RosterWindow:
 			gajim.interface.instances['file_transfers'].window.present()
 		else:
 			gajim.interface.instances['file_transfers'].window.show_all()
-	
+
 	def on_history_menuitem_activate(self, widget):
 		if gajim.interface.instances.has_key('logs'):
 			gajim.interface.instances['logs'].window.present()
@@ -4252,6 +4252,7 @@ class RosterWindow:
 	def quit_gtkgui_interface(self):
 		'''When we quit the gtk interface :
 		tell that to the core and exit gtk'''
+		msgwin_width_adjust = 0
 		if gajim.config.get('saveposition'):
 			# in case show_roster_on_start is False and roster is never shown
 			# window.window is None
@@ -4260,12 +4261,21 @@ class RosterWindow:
 				gajim.config.set('roster_x-position', x)
 				gajim.config.set('roster_y-position', y)
 				width, height = self.window.get_size()
+				# For the width use the size of the vbox containing the tree and
+				# status combo, this will cancel out any hpaned width 
+				width = self.xml.get_widget('roster_vbox2').allocation.width
 				gajim.config.set('roster_width', width)
 				gajim.config.set('roster_height', height)
+				if not self.xml.get_widget('roster_vbox2').get_property('visible'):
+					# The roster vbox is hidden, so the message window is larger
+					# then we want to save (i.e. the window will grow every startup)
+					# so adjust.
+					msgwin_width_adjust = -1 * width
+
 
 		gajim.config.set('show_roster_on_startup',
 			self.window.get_property('visible'))
-		gajim.interface.msg_win_mgr.shutdown()
+		gajim.interface.msg_win_mgr.shutdown(msgwin_width_adjust)
 
 		gajim.config.set('collapsed_rows', '\t'.join(self.collapsed_rows))
 		gajim.interface.save_config()
@@ -4667,6 +4677,25 @@ class RosterWindow:
 		gajim.config.set('showoffline', not gajim.config.get('showoffline'))
 		self.draw_roster()
 
+	def on_view_menu_activate(self, widget):
+		# Hide the show roster menu if we are not in the right windowing mode.
+		if self.hpaned.get_child2() is not None:
+			self.xml.get_widget('show_roster_menuitem').show()
+		else:
+			self.xml.get_widget('show_roster_menuitem').hide()
+
+	def on_show_roster_menuitem_toggled(self, widget):
+		# when num controls is 0 this menuitem is hidden, but still need to
+		# disable keybinding
+		if self.hpaned.get_child2() is not None:
+			self.show_roster_vbox(widget.get_active())
+
+	def show_roster_vbox(self, active):
+		if active:
+			self.xml.get_widget('roster_vbox2').show()
+		else:
+			self.xml.get_widget('roster_vbox2').hide()
+
 	def set_renderer_color(self, renderer, style, set_background = True):
 		'''set style for treeview cell, using PRELIGHT system color'''
 		if set_background:
@@ -4986,7 +5015,7 @@ class RosterWindow:
 			# FIXME: Why do groups have to be redrawn by hand?
 			for g in old_groups:
 				self.draw_group(g, account_source)
-			self.draw_account(account_source)	
+			self.draw_account(account_source)
 			context.finish(True, True, etime)
 
 		confirm_metacontacts = gajim.config.get('confirm_metacontacts')
@@ -5058,7 +5087,7 @@ class RosterWindow:
 			return
 		if position == gtk.TREE_VIEW_DROP_BEFORE and len(path_dest) == 2:
 			# dropped before a group: we drop it in the previous group every time
-			path_dest = (path_dest[0], path_dest[1]-1)	
+			path_dest = (path_dest[0], path_dest[1]-1)
 		# destination: the row something got dropped on
 		iter_dest = model.get_iter(path_dest)
 		type_dest = model[iter_dest][C_TYPE].decode('utf-8')
@@ -5112,7 +5141,7 @@ class RosterWindow:
 				uri_splitted))
 			dialog.popup()
 			return
-		
+
 		# a roster entry was dragged and dropped somewhere in the roster
 
 		# source: the row that was dragged
@@ -5120,9 +5149,9 @@ class RosterWindow:
 		iter_source = model.get_iter(path_source)
 		type_source = model[iter_source][C_TYPE]
 		account_source = model[iter_source][C_ACCOUNT].decode('utf-8')
-		
+
 		# Only normal contacts can be dragged	
-		if type_source != 'contact': 
+		if type_source != 'contact':
 			return
 		if gajim.config.get_per('accounts', account_source, 'is_zeroconf'):
 			return
@@ -5172,7 +5201,7 @@ class RosterWindow:
 			if grp_source == grp_dest and account_source == account_dest:
 				# Drop on self
 				return
-		
+
 		# contact drop somewhere in or on a foreign account
 		if (type_dest == 'account' or not self.regroup) and \
 				account_source != account_dest:
@@ -5180,7 +5209,7 @@ class RosterWindow:
 			dialogs.AddNewContactWindow(account = account_dest, jid = jid_source,
 				user_nick = c_source.name, group = grp_dest)
 			return
-		
+
 		# we may not add contacts from special_groups
 		if grp_source in helpers.special_groups :
 			return
@@ -5194,7 +5223,7 @@ class RosterWindow:
 			self.on_drop_in_group(None, account_source, c_source, grp_dest,
 				is_big_brother, context, etime, grp_source)
 			return
-		
+
 		# Contact drop on another contact, make meta contacts
 		if position == gtk.TREE_VIEW_DROP_INTO_OR_AFTER or \
 				position == gtk.TREE_VIEW_DROP_INTO_OR_BEFORE:
@@ -5209,21 +5238,30 @@ class RosterWindow:
 
 	def show_title(self):
 		change_title_allowed = gajim.config.get('change_roster_title')
+		if not change_title_allowed:
+			return
+
+		if gajim.config.get('one_message_window') == 'always_with_roster':
+			# always_with_roster mode defers to the MessageWindow
+			if not gajim.interface.msg_win_mgr.one_window_opened():
+				# No MessageWindow to defer to
+				self.window.set_title('Gajim')
+			return
+
 		nb_unread = 0
-		if change_title_allowed:
-			start = ''
-			for account in gajim.connections:
-				# Count events in roster title only if we don't auto open them
-				if not helpers.allow_popup_window(account):
-					nb_unread += gajim.events.get_nb_events(['chat', 'normal',
-						'file-request', 'file-error', 'file-completed',
-						'file-request-error', 'file-send-error', 'file-stopped',
-						'printed_chat'], account)
-			if nb_unread > 1:
-				start = '[' + str(nb_unread) + ']  '
-			elif nb_unread == 1:
-				start = '*  '
-			self.window.set_title(start + 'Gajim')
+		start = ''
+		for account in gajim.connections:
+			# Count events in roster title only if we don't auto open them
+			if not helpers.allow_popup_window(account):
+				nb_unread += gajim.events.get_nb_events(['chat', 'normal',
+					'file-request', 'file-error', 'file-completed',
+					'file-request-error', 'file-send-error', 'file-stopped',
+					'printed_chat'], account)
+		if nb_unread > 1:
+			start = '[' + str(nb_unread) + ']  '
+		elif nb_unread == 1:
+			start = '*  '
+		self.window.set_title(start + 'Gajim')
 
 		gtkgui_helpers.set_unset_urgency_hint(self.window, nb_unread)
 
@@ -5304,7 +5342,7 @@ class RosterWindow:
 		accels = gtk.AccelGroup()
 		self.xml.get_widget('roster_window').add_accel_group(accels)
 		prefs_item.add_accelerator('activate', accels, ord(','),
-								   gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
+						gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
 		app_menu.append(prefs_item)
 		app_menu.append(gtk.MenuItem('__SKIP__'))
 		app_menu.append(gtk.MenuItem('__SKIP__'))
@@ -5322,11 +5360,20 @@ class RosterWindow:
 		#self.xml.get_widget('menubar').hide()
 		return
 
+	def _on_message_window_delete(self, win_mgr, msg_win):
+		if gajim.config.get('one_message_window') == 'always_with_roster':
+			self.show_roster_vbox(True)
+			gtkgui_helpers.resize_window(self.window,
+				gajim.config.get('roster_width'),
+				gajim.config.get('roster_height'))
+
 	def __init__(self):
 		self.xml = gtkgui_helpers.get_glade('roster_window.glade')
 		self.window = self.xml.get_widget('roster_window')
+		self.hpaned = self.xml.get_widget('roster_hpaned')
 		self._music_track_changed_signal = None
-		gajim.interface.msg_win_mgr = MessageWindowMgr()
+		gajim.interface.msg_win_mgr = MessageWindowMgr(self.window, self.hpaned)
+		gajim.interface.msg_win_mgr.connect('window-delete', self._on_message_window_delete)
 		self.advanced_menus = [] # We keep them to destroy them
 		if gajim.config.get('roster_window_skip_taskbar'):
 			self.window.set_property('skip-taskbar-hint', True)
@@ -5460,6 +5507,8 @@ class RosterWindow:
 		self.xml.get_widget('show_transports_menuitem').set_active(
 			show_transports_group)
 
+		self.xml.get_widget('show_roster_menuitem').set_active(True)
+
 		# columns
 
 		# this col has 3 cells:
@@ -5549,3 +5598,4 @@ class RosterWindow:
 
 		if sys.platform == 'darwin':
 			self.setup_for_osx()
+
-- 
GitLab