]> git.0d.be Git - empathy.git/commitdiff
roster-window: migrate menu bar to GtkBuilder
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Tue, 10 Jan 2012 16:17:43 +0000 (17:17 +0100)
committerDanielle Madeley <danielle.madeley@collabora.co.uk>
Tue, 15 May 2012 10:40:26 +0000 (20:40 +1000)
Rebased-by: Danielle Madeley <danielle.madeley@collabora.co.uk>
src/empathy-roster-window-menubar.ui
src/empathy-roster-window.c

index d342abca80fc9b8750b1618bcfb710e3cca204e8..35a94cf58a0d16113635deee5abe0bdf98a159d5 100644 (file)
 <?xml version="1.0"?>
 <!--*- mode: xml -*-->
 <interface>
-  <object class="GtkUIManager" id="ui_manager">
-    <child>
-      <object class="GtkActionGroup" id="actiongroup1">
-        <child>
-          <object class="GtkAction" id="chat">
-            <property name="name">chat</property>
-            <property name="label" translatable="yes">_Chat</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkAction" id="chat_new_message">
-            <property name="icon-name">im-message-new</property>
-            <property name="name">chat_new_message</property>
-            <property name="label" translatable="yes">_New Conversation…</property>
-          </object>
-          <accelerator key="N" modifiers="GDK_CONTROL_MASK"/>
-        </child>
-        <child>
-          <object class="GtkAction" id="chat_new_call">
-            <property name="icon-name">audio-input-microphone</property>
-            <property name="name">chat_new_call</property>
-            <property name="label" translatable="yes">New _Call…</property>
-          </object>
-          <accelerator key="M" modifiers="GDK_CONTROL_MASK"/>
-        </child>
-        <child>
-          <object class="GtkAction" id="view_history">
-            <property name="icon-name">document-open-recent</property>
-            <property name="name">view_history</property>
-            <property name="label" translatable="yes">_Previous Conversations</property>
-          </object>
-          <accelerator key="F3" modifiers=""/>
-        </child>
-        <child>
-          <object class="GtkAction" id="chat_add_contact">
-            <property name="stock_id">gtk-add</property>
-            <property name="name">chat_add_contact</property>
-            <property name="label" translatable="yes">_Add Contact…</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkAction" id="chat_search_contacts">
-            <property name="stock_id">gtk-find</property>
-            <property name="name">chat_search_contacts</property>
-            <property name="label" translatable="yes">_Search for Contacts…</property>
-          </object>
-          <accelerator key="f" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/>
-        </child>
-        <child>
-          <object class="GtkAction" id="view_show_ft_manager">
-            <property name="icon-name">document-send</property>
-            <property name="name">view_show_ft_manager</property>
-            <property name="label" translatable="yes">_File Transfers</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkToggleAction" id="view_show_offline">
-            <property name="name">view_show_offline</property>
-            <property name="label" translatable="yes">_Offline Contacts</property>
-          </object>
-          <accelerator key="H" modifiers="GDK_CONTROL_MASK"/>
-        </child>
-        <child>
-          <object class="GtkToggleAction" id="view_show_protocols">
-            <property name="name">view_show_protocols</property>
-            <property name="label" translatable="yes">Show P_rotocols</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkToggleAction" id="view_balance_show_in_roster">
-            <property name="name">view_balance_show_in_roster</property>
-            <property name="label" translatable="yes">Credit Balance</property>
-            <property name="visible">False</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkAction" id="view_show_map">
-            <property name="name">view_show_map</property>
-            <property name="label" translatable="yes">Contacts on a _Map</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkAction" id="chat_quit">
-            <property name="stock_id">gtk-quit</property>
-            <property name="name">chat_quit</property>
-          </object>
-          <accelerator key="Q" modifiers="GDK_CONTROL_MASK"/>
-        </child>
-        <child>
-          <object class="GtkAction" id="edit">
-            <property name="name">edit</property>
-            <property name="label" translatable="yes">_Edit</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkAction" id="edit_context">
-            <property name="name">edit_context</property>
-            <property name="label" translatable="no">Context</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkAction" id="edit_accounts">
-            <property name="name">edit_accounts</property>
-            <property name="label" translatable="yes">_Accounts</property>
-          </object>
-          <accelerator key="F4" modifiers=""/>
-        </child>
-        <child>
-          <object class="GtkAction" id="edit_blocked_contacts">
-            <property name="name">edit_blocked_contacts</property>
-            <property name="label" translatable="yes">_Blocked Contacts</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkAction" id="edit_preferences">
-            <property name="stock_id">gtk-preferences</property>
-            <property name="name">edit_preferences</property>
-            <property name="label" translatable="yes">P_references</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkAction" id="edit_search_contacts">
-            <property name="name">edit_search_contacts</property>
-            <property name="label" translatable="yes">Find in Contact _List</property>
-          </object>
-          <accelerator key="f" modifiers="GDK_CONTROL_MASK"/>
-        </child>
-        <child>
-          <object class="GtkAction" id="view">
-            <property name="name">view</property>
-            <property name="label" translatable="yes">_View</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkRadioAction" id="view_sort_by_name">
-            <property name="name">view_sort_by_name</property>
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">Sort by _Name</property>
-            <property name="draw_as_radio">True</property>
-            <property name="value">1</property>
-            <property name="current-value">1</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkRadioAction" id="view_sort_by_status">
-            <property name="name">view_sort_by_status</property>
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">Sort by _Status</property>
-            <property name="draw_as_radio">True</property>
-            <property name="group">view_sort_by_name</property>
-            <property name="value">0</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkRadioAction" id="view_normal_size_with_avatars">
-            <property name="name">view_normal_size_with_avatars</property>
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">Normal Size With _Avatars</property>
-            <property name="draw_as_radio">True</property>
-            <property name="value">0</property>
-            <property name="current-value">0</property>
-          </object>
-          <accelerator key="1" modifiers="GDK_CONTROL_MASK"/>
-        </child>
-        <child>
-          <object class="GtkRadioAction" id="view_normal_size">
-            <property name="name">view_normal_size</property>
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">N_ormal Size</property>
-            <property name="draw_as_radio">True</property>
-            <property name="group">view_normal_size_with_avatars</property>
-            <property name="value">1</property>
-          </object>
-          <accelerator key="2" modifiers="GDK_CONTROL_MASK"/>
-        </child>
-        <child>
-          <object class="GtkRadioAction" id="view_compact_size">
-            <property name="name">view_compact_size</property>
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">_Compact Size</property>
-            <property name="draw_as_radio">True</property>
-            <property name="group">view_normal_size_with_avatars</property>
-            <property name="value">2</property>
-          </object>
-          <accelerator key="3" modifiers="GDK_CONTROL_MASK"/>
-        </child>
-        <child>
-          <object class="GtkAction" id="room">
-            <property name="name">room</property>
-            <property name="label" translatable="yes">_Room</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkAction" id="room_join_new">
-            <property name="name">room_join_new</property>
-            <property name="label" translatable="yes">_Join…</property>
-          </object>
-          <accelerator key="j" modifiers="GDK_CONTROL_MASK"/>
-        </child>
-        <child>
-          <object class="GtkAction" id="room_join_favorites">
-            <property name="name">room_join_favorites</property>
-            <property name="label" translatable="yes">Join _Favorites</property>
-          </object>
-          <accelerator key="F5" modifiers=""/>
-        </child>
-        <child>
-          <object class="GtkAction" id="room_manage_favorites">
-            <property name="icon-name">system-users</property>
-            <property name="name">room_manage_favorites</property>
-            <property name="label" translatable="yes">Manage Favorites</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkAction" id="help">
-            <property name="name">help</property>
-            <property name="label" translatable="yes">_Help</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkAction" id="help_contents">
-            <property name="stock_id">gtk-help</property>
-            <property name="name">help_contents</property>
-            <property name="label" translatable="yes">_Contents</property>
-          </object>
-          <accelerator key="F1" modifiers=""/>
-        </child>
-        <child>
-          <object class="GtkAction" id="help_debug">
-            <property name="name">help_debug</property>
-            <property name="label" translatable="yes">_Debug</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkAction" id="help_about">
-            <property name="stock_id">gtk-about</property>
-            <property name="name">help_about</property>
-          </object>
-        </child>
-      </object>
-    </child>
-    <ui>
-      <menubar name="menubar">
-        <menu action="chat">
-          <menuitem action="chat_new_message"/>
-          <menuitem action="chat_new_call"/>
-          <separator/>
-          <menuitem action="chat_add_contact"/>
-          <menuitem action="chat_search_contacts"/>
-          <separator/>
-          <menuitem action="chat_quit"/>
-        </menu>
-        <menu action="edit">
-          <menuitem action="edit_context"/>
-          <separator name="edit_context_separator"/>
-          <menuitem action="edit_accounts"/>
-          <menuitem action="edit_search_contacts"/>
-          <menuitem action="edit_blocked_contacts"/>
-          <separator/>
-          <menuitem action="edit_preferences"/>
-        </menu>
-        <menu action="view">
-          <menuitem action="view_show_offline"/>
-          <menuitem action="view_show_protocols"/>
-          <separator/>
-          <menuitem action="view_balance_show_in_roster"/>
-          <placeholder name="view_balance_placeholder"/>
-          <separator/>
-          <menuitem action="view_sort_by_name"/>
-          <menuitem action="view_sort_by_status"/>
-          <separator/>
-          <menuitem action="view_normal_size_with_avatars"/>
-          <menuitem action="view_normal_size"/>
-          <menuitem action="view_compact_size"/>
-          <separator/>
-          <menuitem action="view_history"/>
-          <menuitem action="view_show_ft_manager"/>
-          <menuitem action="view_show_map"/>
-        </menu>
-        <menu action="room">
-          <menuitem action="room_join_new"/>
-          <menuitem action="room_join_favorites"/>
-          <separator/>
-          <separator name="room_separator"/>
-          <menuitem action="room_manage_favorites"/>
-        </menu>
-        <menu action="help">
-          <menuitem action="help_contents"/>
-          <menuitem action="help_debug"/>
-          <menuitem action="help_about"/>
-        </menu>
-      </menubar>
-    </ui>
-  </object>
-  <object class="GtkMenuBar" constructor="ui_manager" id="menubar">
-    <property name="visible">True</property>
-  </object>
+  <menu id='menubar'>
+    <submenu label='_Chat'>
+      <section>
+        <item label='_New Conversation...' action='win.chat_new_message' accel='<Primary>n'/>
+        <item label='New _Call...' action='win.chat_new_call' accel='<Primary>m'/>
+        <item label='_Previous Conversations' action='win.view_history' accel='F3'/>
+      </section>
+      <section>
+        <item label='_Add Contacts...' action='win.chat_add_contact'/>
+        <item label='_Search for Contacts...' action='win.chat_search_contacts' accel='<Shift>f'/>
+      </section>
+      <item label='_Quit' action='win.chat_quit' accel='<Primary>q'/>
+    </submenu>
+    <submenu label='_Edit'>
+      <section>
+        <item label='_Accounts' action='win.edit_accounts' accel='F4'/>
+        <item label='Find in Contact _List' action='win.edit_search_contacts' accel='<Primary>f'/>
+        <item label='_Blocked Contacts' action='win.edit_blocked_contacts'/>
+      </section>
+      <section>
+        <item label='P_references' action='win.edit_preferences'/>
+      </section>
+    </submenu>
+    <submenu label='_View'>
+      <section>
+        <item label='_Offline Contacts' action='win.view_show_offline' accel='<Primary>f'/>
+        <item label='Show P_rotocol' action='win.view_show_protocols'/>
+      </section>
+      <item><link name='section' id='balance'></link></item>
+      <section>
+        <item label='Sort by _Name' action='win.view_sort_by_name'/>
+        <item label='Sort by _Status' action='win.view_sort_by_status'/>
+      </section>
+      <section>
+        <item label='Normal Size With _Avatars' action='win.view_normal_size_with_avatars' accel='<Primary>1'/>
+        <item label='N_ormal Size' action='win.view_normal_size' accel='<Primary>2'/>
+        <item label='_Compact Size' action='win.view_compact_size' accel='<Primary>3'/>
+      </section>
+      <section>
+        <item label='_Previous Conversations' action='win.view_history' accel='F3'/>
+        <item label='_File Transfers' action='win.view_show_ft_manager'/>
+        <item label='Contacts on a _Map' action='win.view_show_map'/>
+      </section>
+    </submenu>
+    <submenu label='_Room'>
+      <section>
+        <item label='_Join...' action='win.room_join_new'/>
+        <item label='Join _Favorites' action='win.room_join_favorites' accel='F5'/>
+      </section>
+      <item><link name='section' id='rooms'></link></item>
+      <section>
+        <item label='_Manage Favorites' action='win.room_manage_favorites'/>
+      </section>
+    </submenu>
+    <submenu label='_Help'>
+      <section>
+        <item label='Contents' action='win.help_contents' accel='F1'/>
+        <item label='Debug' action='win.help_debug'/>
+        <item label='About' action='win.help_about'/>
+      </section>
+    </submenu>
+  </menu>
 </interface>
index 77b328e9d6e1d0e3dacaaf3852bc2d87cd841d96..2a4bc27f44fbfa9e30c490e2854c8785c72acb89 100644 (file)
@@ -141,14 +141,13 @@ struct _EmpathyRosterWindowPriv {
 
   GtkUIManager *ui_manager;
   GtkAction *view_history;
-  GtkAction *room_join_favorites;
-  GtkWidget *room_menu;
-  GtkWidget *room_separator;
+  GMenu *rooms_section;
+  GMenu *balance_section;
+  GAction *view_credit_action;
   GtkWidget *edit_context;
   GtkWidget *edit_context_separator;
 
   GtkActionGroup *balance_action_group;
-  GtkAction *view_balance_show_in_roster;
   GtkWidget *balance_vbox;
 
   guint size_timeout_id;
@@ -167,6 +166,9 @@ struct _EmpathyRosterWindowPriv {
   GList *actions_connected;
 
   gboolean shell_running;
+
+  /* GAction => GMenuItem */
+  GHashTable *topup_menu_items;
 };
 
 static void
@@ -1013,7 +1015,7 @@ static void
 roster_window_update_status (EmpathyRosterWindow *self)
 {
   gboolean connected, connecting;
-  GList *l, *children;
+  GList *l;
 
   connected = empathy_account_manager_get_accounts_connected (&connecting);
 
@@ -1031,29 +1033,24 @@ roster_window_update_status (EmpathyRosterWindow *self)
 
   /* Update widgets sensibility */
   for (l = self->priv->actions_connected; l; l = l->next)
-    gtk_action_set_sensitive (l->data, connected);
-
-  /* Update favourite rooms sensitivity */
-  children = gtk_container_get_children (GTK_CONTAINER (self->priv->room_menu));
-  for (l = children; l != NULL; l = l->next)
-    {
-      if (g_object_get_data (G_OBJECT (l->data), "is_favorite") != NULL)
-        gtk_widget_set_sensitive (GTK_WIDGET (l->data), connected);
-    }
-
-  g_list_free (children);
+    g_simple_action_set_enabled (l->data, connected);
 }
 
 static char *
-roster_window_account_to_action_name (TpAccount *account)
+account_to_topup_action_name (TpAccount *account,
+    gboolean prefix)
 {
   char *r;
+  gchar *result;
 
   /* action names can't have '/' in them, replace it with '.' */
   r = g_strdup (tp_account_get_path_suffix (account));
   r = g_strdelimit (r, "/", '.');
 
-  return r;
+  result = g_strconcat (prefix ? "win." : "", "topup-", r, NULL);
+  g_free (r);
+
+  return result;
 }
 
 static void
@@ -1076,18 +1073,37 @@ roster_window_balance_activate_cb (GtkAction *action,
 }
 
 static void
-roster_window_balance_update_balance (GtkAction *action,
-    TpConnection *conn)
+roster_window_balance_update_balance (EmpathyRosterWindow *self,
+    TpAccount *account)
 {
-  TpAccount *account = tp_connection_get_account (conn);
+  TpConnection *conn;
+  GAction *action;
+  GMenuItem *item;
   GtkWidget *label;
   int amount = 0;
   guint scale = G_MAXINT32;
   const gchar *currency = "";
-  char *money, *str;
+  char *money;
+  gchar *name;
+
+  g_print ("111111111\n");
+  conn = tp_account_get_connection (account);
+  if (conn == NULL)
+    return;
+  g_print ("2222222222\n");
+
+  name = account_to_topup_action_name (account, FALSE);
+
+  action = g_action_map_lookup_action (G_ACTION_MAP (self), name);
+  g_free (name);
+
+  if (action == NULL)
+    return;
+  g_print ("333333333\n");
 
   if (!tp_connection_get_balance (conn, &amount, &scale, &currency))
     return;
+  g_print ("44444444444\n");
 
   if (amount == 0 &&
       scale == G_MAXINT32 &&
@@ -1104,13 +1120,21 @@ roster_window_balance_update_balance (GtkAction *action,
       g_free (tmp);
     }
 
-  /* Translators: this string will be something like:
-   * Top up My Account ($1.23)..." */
-  str = g_strdup_printf (_("Top up %s (%s)..."),
-    tp_account_get_display_name (account), money);
+  item = g_hash_table_lookup (self->priv->topup_menu_items, action);
+  g_print ("5555555 %p\n", item);
+  if (item != NULL)
+    {
+      gchar *str;
 
-  gtk_action_set_label (action, str);
-  g_free (str);
+      /* Translators: this string will be something like:
+       * Top up My Account ($1.23)..." */
+      str = g_strdup_printf (_("Top up %s (%s)..."),
+        tp_account_get_display_name (account), money);
+
+      g_print ("SET %s\n", str);
+      g_menu_item_set_label (item, str);
+      g_free (str);
+    }
 
   /* update the money label in the roster */
   label = g_object_get_data (G_OBJECT (action), "money-label");
@@ -1124,82 +1148,65 @@ roster_window_balance_changed_cb (TpConnection *conn,
     guint balance,
     guint scale,
     const gchar *currency,
-    GtkAction *action)
+    EmpathyRosterWindow *self)
 {
-  roster_window_balance_update_balance (action, conn);
+  TpAccount *account;
+
+  account = tp_connection_get_account (conn);
+  if (account == NULL)
+    return;
+
+  roster_window_balance_update_balance (self, account);
 }
 
-static GtkAction *
+static GAction *
 roster_window_setup_balance_create_action (EmpathyRosterWindow *self,
     TpAccount *account)
 {
-  GtkAction *action;
-  char *name, *ui;
-  guint merge_id;
-  GError *error = NULL;
+  GAction *action;
+  gchar *name;
+  GMenuItem *item;
 
-  /* create the action group if required */
-  if (self->priv->balance_action_group == NULL)
-    {
-      self->priv->balance_action_group =
-        gtk_action_group_new ("balance-action-group");
+  /* create the action */
+  name = account_to_topup_action_name (account, FALSE);
 
-      gtk_ui_manager_insert_action_group (self->priv->ui_manager,
-        self->priv->balance_action_group, -1);
-    }
+  action = (GAction *) g_simple_action_new (name, NULL);
 
-  /* create the action */
-  name = roster_window_account_to_action_name (account);
-  action = gtk_action_new (name,
-      tp_account_get_display_name (account),
-      _("Top up account credit"), NULL);
+  g_action_map_add_action (G_ACTION_MAP (self), action);
+  g_free (name);
+
+  /* Add to the menu */
+  name = account_to_topup_action_name (account, TRUE);
 
+  item = g_menu_item_new (_("Top up account credit"), name);
+  g_print ("CREATE %p\n", item);
+
+  g_menu_append_item (self->priv->balance_section, item);
+  g_menu_item_set_label (item, "mushroom");
+
+  /* Pass ownership of action to the hash table */
+  g_hash_table_insert (self->priv->topup_menu_items,
+      action, g_object_ref (item));
+
+  if (0) {
   g_object_bind_property (account, "icon-name", action, "icon-name",
       G_BINDING_SYNC_CREATE);
 
   g_signal_connect (action, "activate",
       G_CALLBACK (roster_window_balance_activate_cb), self);
-
-  gtk_action_group_add_action (self->priv->balance_action_group, action);
-  g_object_unref (action);
-
-  ui = g_strdup_printf (
-      "<ui>"
-      " <menubar name='menubar'>"
-      "  <menu action='view'>"
-      "   <placeholder name='view_balance_placeholder'>"
-      "    <menuitem action='%s'/>"
-      "   </placeholder>"
-      "  </menu>"
-      " </menubar>"
-      "</ui>",
-      name);
-
-  merge_id = gtk_ui_manager_add_ui_from_string (self->priv->ui_manager,
-      ui, -1, &error);
-
-  if (error != NULL)
-    {
-      DEBUG ("Failed to add balance UI for %s: %s",
-        tp_account_get_display_name (account),
-        error->message);
-      g_error_free (error);
-    }
-
-  g_object_set_data (G_OBJECT (action),
-      "merge-id", GUINT_TO_POINTER (merge_id));
+  }
 
   g_free (name);
-  g_free (ui);
 
   return action;
 }
 
 static GtkWidget *
 roster_window_setup_balance_create_widget (EmpathyRosterWindow *self,
-    GtkAction *action,
+    GAction *action,
     TpAccount *account)
 {
+#if 0
   GtkWidget *hbox, *image, *label, *button;
 
   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
@@ -1237,6 +1244,40 @@ roster_window_setup_balance_create_widget (EmpathyRosterWindow *self,
       (GWeakNotify) gtk_widget_destroy, hbox);
 
   return hbox;
+#endif
+  return NULL;
+}
+
+#define ACTION_SHOW_CREDIT_BALANCE "show-credit-balance"
+
+static void
+add_view_credit_balance_item (EmpathyRosterWindow *self)
+{
+  GMenuItem *item;
+
+  if (self->priv->view_credit_action != NULL)
+    return;
+
+  self->priv->view_credit_action = (GAction *) g_simple_action_new (
+      ACTION_SHOW_CREDIT_BALANCE, NULL);
+
+  /* TODO: connect sig */
+  /* bind view_balance_show_in_roster */
+  /*
+  g_settings_bind (self->priv->gsettings_ui, "show-balance-in-roster",
+      self->priv->view_balance_show_in_roster, "active",
+      G_SETTINGS_BIND_DEFAULT);
+  g_object_bind_property (self->priv->view_balance_show_in_roster, "active",
+      self->priv->balance_vbox, "visible",
+      G_BINDING_SYNC_CREATE);
+      */
+
+  g_action_map_add_action (G_ACTION_MAP (self), self->priv->view_credit_action);
+
+  item = g_menu_item_new (_("Credit Balance"),
+      "win." ACTION_SHOW_CREDIT_BALANCE);
+
+  g_menu_append_item (self->priv->balance_section, item);
 }
 
 static void
@@ -1244,7 +1285,7 @@ roster_window_setup_balance (EmpathyRosterWindow *self,
     TpAccount *account)
 {
   TpConnection *conn = tp_account_get_connection (account);
-  GtkAction *action;
+  GAction *action;
   const gchar *uri;
 
   if (conn == NULL)
@@ -1256,14 +1297,14 @@ roster_window_setup_balance (EmpathyRosterWindow *self,
   DEBUG ("Setting up balance for acct: %s",
       tp_account_get_display_name (account));
 
+  add_view_credit_balance_item (self);
+
   /* create the action */
   action = roster_window_setup_balance_create_action (self, account);
 
   if (action == NULL)
     return;
 
-  gtk_action_set_visible (self->priv->view_balance_show_in_roster, TRUE);
-
   /* create the display widget */
   roster_window_setup_balance_create_widget (self, action, account);
 
@@ -1274,23 +1315,56 @@ roster_window_setup_balance (EmpathyRosterWindow *self,
       g_strdup (uri), g_free);
   gtk_action_set_sensitive (GTK_ACTION (action), !tp_str_empty (uri));
 
-  roster_window_balance_update_balance (GTK_ACTION (action), conn);
+  roster_window_balance_update_balance (self, account);
 
   g_signal_connect (conn, "balance-changed",
-      G_CALLBACK (roster_window_balance_changed_cb), action);
+      G_CALLBACK (roster_window_balance_changed_cb), self);
+}
+
+static void
+remove_view_credit_balance_item (EmpathyRosterWindow *self)
+{
+  gint i;
+
+  if (self->priv->view_credit_action == NULL)
+    return;
+
+  for (i = 0; i < g_menu_model_get_n_items (
+        G_MENU_MODEL (self->priv->balance_section)); i++)
+    {
+      const gchar *action;
+
+      if (g_menu_model_get_item_attribute (
+            G_MENU_MODEL (self->priv->balance_section), i,
+            G_MENU_ATTRIBUTE_ACTION, "s", &action))
+        {
+          if (!tp_strdiff (action, "win." ACTION_SHOW_CREDIT_BALANCE))
+            {
+              g_menu_remove (self->priv->balance_section, i);
+              break;
+            }
+        }
+    }
+
+  g_action_map_remove_action (G_ACTION_MAP (self),
+      g_action_get_name (self->priv->view_credit_action));
+
+  g_clear_object (&self->priv->view_credit_action);
 }
 
 static void
 roster_window_remove_balance_action (EmpathyRosterWindow *self,
     TpAccount *account)
 {
+  /* Remove the "Credit Balance" entry if we just removed the last account
+   * supporting balance and so that's the last entry in the section. */
+  if (g_menu_model_get_n_items (G_MENU_MODEL (self->priv->balance_section)) <= 1)
+    remove_view_credit_balance_item (self);
+#if 0
   GtkAction *action;
   char *name;
   GList *a;
 
-  if (self->priv->balance_action_group == NULL)
-    return;
-
   name = roster_window_account_to_action_name (account);
 
   action = gtk_action_group_get_action (
@@ -1320,6 +1394,7 @@ roster_window_remove_balance_action (EmpathyRosterWindow *self,
       g_list_length (a) > 0);
 
   g_list_free (a);
+#endif
 }
 
 static void
@@ -1427,6 +1502,11 @@ empathy_roster_window_finalize (GObject *window)
   g_object_unref (self->priv->gsettings_contacts);
   g_object_unref (self->priv->individual_manager);
 
+  g_object_unref (self->priv->rooms_section);
+  g_object_unref (self->priv->balance_section);
+  g_clear_object (&self->priv->view_credit_action);
+  g_hash_table_unref (self->priv->topup_menu_items);
+
   G_OBJECT_CLASS (empathy_roster_window_parent_class)->finalize (window);
 }
 
@@ -1444,72 +1524,111 @@ roster_window_key_press_event_cb  (GtkWidget *window,
 }
 
 static void
-roster_window_chat_quit_cb (GtkAction *action,
-    EmpathyRosterWindow *self)
+roster_window_chat_quit_cb (GSimpleAction *action,
+    GVariant *parameter,
+    gpointer user_data)
 {
+  EmpathyRosterWindow *self = user_data;
+
   gtk_widget_destroy (GTK_WIDGET (self));
 }
 
 static void
-roster_window_view_history_cb (GtkAction *action,
-    EmpathyRosterWindow *self)
+roster_window_view_history_cb (GSimpleAction *action,
+    GVariant *parameter,
+    gpointer user_data)
 {
+  EmpathyRosterWindow *self = user_data;
+
   empathy_log_window_show (NULL, NULL, FALSE, GTK_WINDOW (self));
 }
 
 static void
-roster_window_chat_new_message_cb (GtkAction *action,
-    EmpathyRosterWindow *self)
+roster_window_chat_new_message_cb (GSimpleAction *action,
+    GVariant *parameter,
+    gpointer user_data)
 {
+  EmpathyRosterWindow *self = user_data;
+
   empathy_new_message_dialog_show (GTK_WINDOW (self));
 }
 
 static void
-roster_window_chat_new_call_cb (GtkAction *action,
-    EmpathyRosterWindow *self)
+roster_window_chat_new_call_cb (GSimpleAction *action,
+    GVariant *parameter,
+    gpointer user_data)
 {
+  EmpathyRosterWindow *self = user_data;
+
   empathy_new_call_dialog_show (GTK_WINDOW (self));
 }
 
 static void
-roster_window_chat_add_contact_cb (GtkAction *action,
-    EmpathyRosterWindow *self)
+roster_window_chat_add_contact_cb (GSimpleAction *action,
+    GVariant *parameter,
+    gpointer user_data)
 {
+  EmpathyRosterWindow *self = user_data;
+
   empathy_new_individual_dialog_show (GTK_WINDOW (self));
 }
 
 static void
-roster_window_chat_search_contacts_cb (GtkAction *action,
-    EmpathyRosterWindow *self)
+roster_window_chat_search_contacts_cb (GSimpleAction *action,
+    GVariant *parameter,
+    gpointer user_data)
 {
-  GtkWidget *dialog = empathy_contact_search_dialog_new (
+  EmpathyRosterWindow *self = user_data;
+  GtkWidget *dialog;
+
+  dialog = empathy_contact_search_dialog_new (
       GTK_WINDOW (self));
 
   gtk_widget_show (dialog);
 }
 
 static void
-roster_window_view_show_ft_manager (GtkAction *action,
-    EmpathyRosterWindow *self)
+roster_window_view_show_ft_manager (GSimpleAction *action,
+    GVariant *parameter,
+    gpointer user_data)
 {
   empathy_ft_manager_show ();
 }
 
 static void
-roster_window_view_show_offline_cb (GtkToggleAction   *action,
-    EmpathyRosterWindow *self)
+activate_toggle (GSimpleAction *action,
+    GVariant *parameter,
+    gpointer user_data)
 {
+  GVariant *state;
+
+  state = g_action_get_state (G_ACTION (action));
+  g_action_change_state (G_ACTION (action),
+      g_variant_new_boolean (!g_variant_get_boolean (state)));
+  g_variant_unref (state);
+}
+
+static void
+roster_window_view_show_offline_cb (GSimpleAction *action,
+    GVariant *state,
+    gpointer user_data)
+{
+  EmpathyRosterWindow *self = user_data;
   gboolean current;
 
-  current = gtk_toggle_action_get_active (action);
+  current = g_variant_get_boolean (state);
+
   g_settings_set_boolean (self->priv->gsettings_ui,
       EMPATHY_PREFS_UI_SHOW_OFFLINE,
       current);
 
   empathy_individual_view_set_show_offline (self->priv->individual_view,
       current);
+
+  g_simple_action_set_state (action, state);
 }
 
+#if 0
 static void
 roster_window_notify_sort_contact_cb (GSettings         *gsettings,
     const gchar *key,
@@ -1543,7 +1662,9 @@ roster_window_notify_sort_contact_cb (GSettings         *gsettings,
     g_free (str);
   }
 }
+#endif
 
+#if 0
 static void
 roster_window_view_sort_contacts_cb (GtkRadioAction *action,
     GtkRadioAction *current,
@@ -1590,12 +1711,14 @@ roster_window_view_show_protocols_cb (GtkToggleAction *action,
   empathy_individual_store_set_show_protocols (self->priv->individual_store,
       value);
 }
+#endif
 
 /* Matches GtkRadioAction values set in empathy-roster-window.ui */
 #define CONTACT_LIST_NORMAL_SIZE_WITH_AVATARS   0
 #define CONTACT_LIST_NORMAL_SIZE      1
 #define CONTACT_LIST_COMPACT_SIZE     2
 
+#if 0
 static void
 roster_window_view_contacts_list_size_cb (GtkRadioAction *action,
     GtkRadioAction *current,
@@ -1660,17 +1783,22 @@ roster_window_notify_contact_list_size_cb (GSettings *gsettings,
      which updates the contacts list */
   gtk_radio_action_set_current_value (self->priv->normal_with_avatars, value);
 }
+#endif
 
 static void
-roster_window_edit_search_contacts_cb (GtkCheckMenuItem  *item,
-    EmpathyRosterWindow *self)
+roster_window_edit_search_contacts_cb (GSimpleAction *action,
+    GVariant *parameter,
+    gpointer user_data)
 {
+  EmpathyRosterWindow *self = user_data;
+
   empathy_individual_view_start_search (self->priv->individual_view);
 }
 
 static void
-roster_window_view_show_map_cb (GtkCheckMenuItem  *item,
-    EmpathyRosterWindow *self)
+roster_window_view_show_map_cb (GSimpleAction *action,
+    GVariant *parameter,
+    gpointer user_data)
 {
 #ifdef HAVE_LIBCHAMPLAIN
   empathy_map_view_show ();
@@ -1798,41 +1926,55 @@ roster_window_favorite_chatroom_join (EmpathyChatroom *chatroom)
 }
 
 static void
-roster_window_favorite_chatroom_menu_activate_cb (GtkMenuItem *menu_item,
+roster_window_favorite_chatroom_menu_activate_cb (GAction *action,
+    GVariant *parameter,
     EmpathyChatroom *chatroom)
 {
   roster_window_favorite_chatroom_join (chatroom);
 }
 
+static gchar *
+dup_join_action_name (EmpathyChatroom *chatroom,
+    gboolean prefix)
+{
+  return g_strconcat (prefix ? "win." : "", "join-",
+      empathy_chatroom_get_name (chatroom), NULL);
+}
+
 static void
 roster_window_favorite_chatroom_menu_add (EmpathyRosterWindow *self,
     EmpathyChatroom *chatroom)
 {
-  GtkWidget *menu_item;
+  GMenuItem *item;
   const gchar *name, *account_name;
-  gchar *label;
-
-  if (g_object_get_data (G_OBJECT (chatroom), "menu_item"))
-    return;
+  gchar *label, *action_name;
+  GAction *action;
 
   name = empathy_chatroom_get_name (chatroom);
   account_name = tp_account_get_display_name (
       empathy_chatroom_get_account (chatroom));
+
   label = g_strdup_printf ("%s (%s)", name, account_name);
-  menu_item = gtk_menu_item_new_with_label (label);
-  g_free (label);
-  g_object_set_data (G_OBJECT (menu_item), "is_favorite",
-      GUINT_TO_POINTER (TRUE));
+  action_name = dup_join_action_name (chatroom, FALSE);
+
+  action = (GAction *) g_simple_action_new (action_name, NULL);
+  g_free (action_name);
 
-  g_object_set_data (G_OBJECT (chatroom), "menu_item", menu_item);
-  g_signal_connect (menu_item, "activate",
+  g_signal_connect (action, "activate",
       G_CALLBACK (roster_window_favorite_chatroom_menu_activate_cb),
       chatroom);
 
-  gtk_menu_shell_insert (GTK_MENU_SHELL (self->priv->room_menu),
-      menu_item, 4);
+  g_action_map_add_action (G_ACTION_MAP (self), action);
+
+  action_name = dup_join_action_name (chatroom, TRUE);
+
+  item = g_menu_item_new (label, action_name);
+  g_menu_item_set_attribute (item, "room-name", "s", name);
+  g_menu_append_item (self->priv->rooms_section, item);
 
-  gtk_widget_show (menu_item);
+  g_free (label);
+  g_free (action_name);
+  g_object_unref (action);
 }
 
 static void
@@ -1841,8 +1983,6 @@ roster_window_favorite_chatroom_menu_added_cb (EmpathyChatroomManager *manager,
     EmpathyRosterWindow *self)
 {
   roster_window_favorite_chatroom_menu_add (self, chatroom);
-  gtk_widget_show (self->priv->room_separator);
-  gtk_action_set_sensitive (self->priv->room_join_favorites, TRUE);
 }
 
 static void
@@ -1851,21 +1991,32 @@ roster_window_favorite_chatroom_menu_removed_cb (
     EmpathyChatroom *chatroom,
     EmpathyRosterWindow *self)
 {
-  GtkWidget *menu_item;
   GList *chatrooms;
+  gchar *act;
+  gint i;
 
-  menu_item = g_object_get_data (G_OBJECT (chatroom), "menu_item");
-  g_object_set_data (G_OBJECT (chatroom), "menu_item", NULL);
-  gtk_widget_destroy (menu_item);
+  act = dup_join_action_name (chatroom, TRUE);
 
-  chatrooms = empathy_chatroom_manager_get_chatrooms (self->priv->chatroom_manager,
-      NULL);
-  if (chatrooms)
-    gtk_widget_show (self->priv->room_separator);
-  else
-    gtk_widget_hide (self->priv->room_separator);
+  g_action_map_remove_action (G_ACTION_MAP (self), act);
+
+  for (i = 0; i < g_menu_model_get_n_items (
+        G_MENU_MODEL (self->priv->rooms_section)); i++)
+    {
+      const gchar *name;
+
+      if (g_menu_model_get_item_attribute (
+            G_MENU_MODEL (self->priv->rooms_section), i, "room-name",
+            "s", &name)
+          && !tp_strdiff (name, empathy_chatroom_get_name (chatroom)))
+        {
+          g_menu_remove (self->priv->rooms_section, i);
+          break;
+        }
+    }
+
+  chatrooms = empathy_chatroom_manager_get_chatrooms (
+      self->priv->chatroom_manager, NULL);
 
-  gtk_action_set_sensitive (self->priv->room_join_favorites, chatrooms != NULL);
   g_list_free (chatrooms);
 }
 
@@ -1873,25 +2024,15 @@ static void
 roster_window_favorite_chatroom_menu_setup (EmpathyRosterWindow *self)
 {
   GList *chatrooms, *l;
-  GtkWidget *room;
 
   self->priv->chatroom_manager = empathy_chatroom_manager_dup_singleton (NULL);
+
   chatrooms = empathy_chatroom_manager_get_chatrooms (
     self->priv->chatroom_manager, NULL);
-  room = gtk_ui_manager_get_widget (self->priv->ui_manager,
-    "/menubar/room");
-  self->priv->room_menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (room));
-  self->priv->room_separator = gtk_ui_manager_get_widget (self->priv->ui_manager,
-    "/menubar/room/room_separator");
 
   for (l = chatrooms; l; l = l->next)
     roster_window_favorite_chatroom_menu_add (self, l->data);
 
-  if (!chatrooms)
-    gtk_widget_hide (self->priv->room_separator);
-
-  gtk_action_set_sensitive (self->priv->room_join_favorites, chatrooms != NULL);
-
   g_signal_connect (self->priv->chatroom_manager, "chatroom-added",
       G_CALLBACK (roster_window_favorite_chatroom_menu_added_cb),
       self);
@@ -1904,16 +2045,21 @@ roster_window_favorite_chatroom_menu_setup (EmpathyRosterWindow *self)
 }
 
 static void
-roster_window_room_join_new_cb (GtkAction *action,
-    EmpathyRosterWindow *self)
+roster_window_room_join_new_cb (GSimpleAction *action,
+    GVariant *parameter,
+    gpointer user_data)
 {
+  EmpathyRosterWindow *self = user_data;
+
   empathy_new_chatroom_dialog_show (GTK_WINDOW (self));
 }
 
 static void
-roster_window_room_join_favorites_cb (GtkAction *action,
-    EmpathyRosterWindow *self)
+roster_window_room_join_favorites_cb (GSimpleAction *action,
+    GVariant *parameter,
+    gpointer user_data)
 {
+  EmpathyRosterWindow *self = user_data;
   GList *chatrooms, *l;
 
   chatrooms = empathy_chatroom_manager_get_chatrooms (self->priv->chatroom_manager,
@@ -1926,12 +2072,16 @@ roster_window_room_join_favorites_cb (GtkAction *action,
 }
 
 static void
-roster_window_room_manage_favorites_cb (GtkAction *action,
-    EmpathyRosterWindow *self)
+roster_window_room_manage_favorites_cb (GSimpleAction *action,
+    GVariant *parameter,
+    gpointer user_data)
 {
+  EmpathyRosterWindow *self = user_data;
+
   empathy_chatrooms_window_show (GTK_WINDOW (self));
 }
 
+#if 0
 static void
 roster_window_edit_cb (GtkAction *action,
     EmpathyRosterWindow *self)
@@ -1981,19 +2131,23 @@ roster_window_edit_cb (GtkAction *action,
 
   return;
 }
+#endif
 
 static void
-roster_window_edit_accounts_cb (GtkAction *action,
-    EmpathyRosterWindow *self)
+roster_window_edit_accounts_cb (GSimpleAction *action,
+    GVariant *parameter,
+    gpointer user_data)
 {
   empathy_accounts_dialog_show_application (gdk_screen_get_default (),
       NULL, FALSE, FALSE);
 }
 
 static void
-roster_window_edit_blocked_contacts_cb (GtkAction *action,
-    EmpathyRosterWindow *self)
+roster_window_edit_blocked_contacts_cb (GSimpleAction *action,
+    GVariant *parameter,
+    gpointer user_data)
 {
+  EmpathyRosterWindow *self = user_data;
   GtkWidget *dialog;
 
   dialog = empathy_contact_blocking_dialog_new (GTK_WINDOW (self));
@@ -2027,30 +2181,40 @@ empathy_roster_window_show_preferences (EmpathyRosterWindow *self,
 }
 
 static void
-roster_window_edit_preferences_cb (GtkAction *action,
-    EmpathyRosterWindow *self)
+roster_window_edit_preferences_cb (GSimpleAction *action,
+    GVariant *parameter,
+    gpointer user_data)
 {
+  EmpathyRosterWindow *self = user_data;
+
   empathy_roster_window_show_preferences (self, NULL);
 }
 
 static void
-roster_window_help_about_cb (GtkAction *action,
-    EmpathyRosterWindow *self)
+roster_window_help_about_cb (GSimpleAction *action,
+    GVariant *parameter,
+    gpointer user_data)
 {
+  EmpathyRosterWindow *self = user_data;
+
   empathy_about_dialog_new (GTK_WINDOW (self));
 }
 
 static void
-roster_window_help_debug_cb (GtkAction *action,
-    EmpathyRosterWindow *self)
+roster_window_help_debug_cb (GSimpleAction *action,
+    GVariant *parameter,
+    gpointer user_data)
 {
   empathy_launch_program (BIN_DIR, "empathy-debugger", NULL);
 }
 
 static void
-roster_window_help_contents_cb (GtkAction *action,
-    EmpathyRosterWindow *self)
+roster_window_help_contents_cb (GSimpleAction *action,
+    GVariant *parameter,
+    gpointer user_data)
 {
+  EmpathyRosterWindow *self = user_data;
+
   empathy_url_show (GTK_WIDGET (self), "help:empathy");
 }
 
@@ -2227,6 +2391,7 @@ roster_window_account_validity_changed_cb (TpAccountManager  *manager,
   set_notebook_page (self);
 }
 
+#if 0
 static void
 roster_window_notify_show_offline_cb (GSettings *gsettings,
     const gchar *key,
@@ -2235,13 +2400,12 @@ roster_window_notify_show_offline_cb (GSettings *gsettings,
   gtk_toggle_action_set_active (toggle_action,
       g_settings_get_boolean (gsettings, key));
 }
+#endif
 
 static void
 roster_window_connection_items_setup (EmpathyRosterWindow *self,
     GtkBuilder *gui)
 {
-  GList *list;
-  GObject *action;
   guint i;
   const gchar *actions_connected[] = {
       "room_join_new",
@@ -2254,13 +2418,16 @@ roster_window_connection_items_setup (EmpathyRosterWindow *self,
       "edit_search_contacts"
   };
 
-  for (i = 0, list = NULL; i < G_N_ELEMENTS (actions_connected); i++)
+  for (i = 0; i < G_N_ELEMENTS (actions_connected); i++)
     {
-      action = gtk_builder_get_object (gui, actions_connected[i]);
-      list = g_list_prepend (list, action);
-    }
+      GAction *action;
+
+      action = g_action_map_lookup_action (G_ACTION_MAP (self),
+          actions_connected[i]);
 
-  self->priv->actions_connected = list;
+      self->priv->actions_connected = g_list_prepend (
+          self->priv->actions_connected, action);
+    }
 }
 
 static void
@@ -2351,6 +2518,102 @@ empathy_roster_window_constructor (GType type,
   return window;
 }
 
+static GActionEntry menubar_entries[] = {
+  { "chat_new_message", roster_window_chat_new_message_cb, NULL, NULL, NULL },
+  { "chat_new_call", roster_window_chat_new_call_cb, NULL, NULL, NULL },
+  { "chat_add_contact", roster_window_chat_add_contact_cb, NULL, NULL, NULL },
+  { "chat_search_contacts", roster_window_chat_search_contacts_cb, NULL, NULL, NULL },
+  { "chat_quit", roster_window_chat_quit_cb, NULL, NULL, NULL },
+
+  { "edit_accounts", roster_window_edit_accounts_cb, NULL, NULL, NULL },
+  { "edit_search_contacts", roster_window_edit_search_contacts_cb, NULL, NULL, NULL },
+  { "edit_blocked_contacts", roster_window_edit_blocked_contacts_cb, NULL, NULL, NULL },
+  { "edit_preferences", roster_window_edit_preferences_cb, NULL, NULL, NULL },
+
+  { "view_show_offline", activate_toggle, NULL, "false", roster_window_view_show_offline_cb },
+  /* TODO */
+  { "view_history", roster_window_view_history_cb, NULL, NULL, NULL },
+  { "view_show_ft_manager", roster_window_view_show_ft_manager, NULL, NULL, NULL },
+  { "view_show_map", roster_window_view_show_map_cb, NULL, NULL, NULL },
+
+  { "room_join_new", roster_window_room_join_new_cb, NULL, NULL, NULL },
+  { "room_join_favorites", roster_window_room_join_favorites_cb, NULL, NULL, NULL },
+  { "room_manage_favorites", roster_window_room_manage_favorites_cb, NULL, NULL, NULL },
+
+  { "help_contents", roster_window_help_contents_cb, NULL, NULL, NULL },
+  { "help_debug", roster_window_help_debug_cb, NULL, NULL, NULL },
+  { "help_about", roster_window_help_about_cb, NULL, NULL, NULL },
+};
+
+static void
+empathy_roster_window_constructed (GObject *object)
+{
+  EmpathyRosterWindow *self = EMPATHY_ROSTER_WINDOW (object);
+  gchar *filename;
+  GtkBuilder *builder;
+  GtkApplication *app;
+  GMenu *menubar;
+  /* TODO: <cassidy> desrt, yeah. So I should basically move all my menu code
+   * from gtkappwin to gtkapp, just deal with it in the app itself and stop
+   * caring about the appwin ? */
+
+  G_OBJECT_CLASS (empathy_roster_window_parent_class)->constructed (object);
+
+  app = gtk_window_get_application (GTK_WINDOW (self));
+  g_return_if_fail (app != NULL);
+
+  g_action_map_add_action_entries (G_ACTION_MAP (self),
+      menubar_entries, G_N_ELEMENTS (menubar_entries), self);
+
+  filename = empathy_file_lookup ("empathy-roster-window-menubar.ui", "src");
+  builder = empathy_builder_get_file (filename,
+      /*
+      "ui_manager", &self->priv->ui_manager,
+      "view_show_offline", &show_offline_widget,
+      "view_show_protocols", &self->priv->show_protocols,
+      "view_sort_by_name", &self->priv->sort_by_name,
+      "view_sort_by_status", &self->priv->sort_by_status,
+      "view_normal_size_with_avatars", &self->priv->normal_with_avatars,
+      "view_normal_size", &self->priv->normal_size,
+      "view_compact_size", &self->priv->compact_size,
+      "view_history", &self->priv->view_history,
+      "menubar", &menubar,
+      */
+      NULL);
+  g_free (filename);
+
+  menubar = G_MENU (gtk_builder_get_object (builder, "menubar"));
+
+  gtk_application_set_menubar (app, G_MENU_MODEL(menubar));
+
+  /* Disable map if built without champlain */
+#ifndef HAVE_LIBCHAMPLAIN
+    {
+      GAction *view_show_map;
+
+      view_show_map = g_action_map_lookup_action (G_ACTION_MAP (self),
+          "view_show_map");
+      g_simple_action_set_enabled (G_SIMPLE_ACTION (view_show_map), FALSE);
+    }
+#endif
+
+  /* Set up connection related actions. */
+  roster_window_connection_items_setup (self, NULL);
+
+  /* Add rooms to the menu */
+  self->priv->rooms_section = G_MENU (gtk_builder_get_object (builder,
+        "rooms"));
+  g_object_ref (self->priv->rooms_section);
+
+  self->priv->balance_section = G_MENU (gtk_builder_get_object (builder,
+        "balance"));
+  g_object_ref (self->priv->balance_section);
+
+  roster_window_favorite_chatroom_menu_setup (self);
+
+  g_object_unref (builder);
+}
+
 static void
 empathy_roster_window_set_property (GObject *object,
     guint property_id,
@@ -2397,6 +2660,7 @@ empathy_roster_window_class_init (EmpathyRosterWindowClass *klass)
 
   object_class->finalize = empathy_roster_window_finalize;
   object_class->constructor = empathy_roster_window_constructor;
+  object_class->constructed = empathy_roster_window_constructed;
 
   object_class->set_property = empathy_roster_window_set_property;
   object_class->get_property = empathy_roster_window_get_property;
@@ -2437,16 +2701,14 @@ contacts_loaded_cb (EmpathyIndividualManager *manager,
 static void
 empathy_roster_window_init (EmpathyRosterWindow *self)
 {
-  GtkBuilder *gui, *gui_mgr;
+  GtkBuilder *gui;
   GtkWidget *sw;
-  GtkToggleAction *show_offline_widget;
-  GtkAction *show_map_widget;
+  //GtkToggleAction *show_offline_widget;
   GtkToolItem *item;
-  gboolean show_offline;
+  //gboolean show_offline;
   gchar *filename;
   GtkTreeModel *model;
   GtkWidget *search_vbox;
-  GtkWidget *menubar;
 
   self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
       EMPATHY_TYPE_ROSTER_WINDOW, EmpathyRosterWindowPriv);
@@ -2481,73 +2743,14 @@ empathy_roster_window_init (EmpathyRosterWindow *self)
       NULL);
   g_free (filename);
 
-  /* Set UI manager */
-  filename = empathy_file_lookup ("empathy-roster-window-menubar.ui", "src");
-  gui_mgr = empathy_builder_get_file (filename,
-      "ui_manager", &self->priv->ui_manager,
-      "view_show_offline", &show_offline_widget,
-      "view_show_protocols", &self->priv->show_protocols,
-      "view_sort_by_name", &self->priv->sort_by_name,
-      "view_sort_by_status", &self->priv->sort_by_status,
-      "view_normal_size_with_avatars", &self->priv->normal_with_avatars,
-      "view_normal_size", &self->priv->normal_size,
-      "view_compact_size", &self->priv->compact_size,
-      "view_history", &self->priv->view_history,
-      "view_show_map", &show_map_widget,
-      "room_join_favorites", &self->priv->room_join_favorites,
-      "view_balance_show_in_roster", &self->priv->view_balance_show_in_roster,
-      "menubar", &menubar,
-      NULL);
-  g_free (filename);
-
-  /* The UI manager is living in its own .ui file as Glade doesn't support
-   * those. The GtkMenubar has to be in this file as well to we manually add
-   * it to the first position of the vbox. */
-  gtk_box_pack_start (GTK_BOX (self->priv->main_vbox), menubar, FALSE, FALSE, 0);
-  gtk_box_reorder_child (GTK_BOX (self->priv->main_vbox), menubar, 0);
-
   gtk_container_add (GTK_CONTAINER (self), self->priv->main_vbox);
   gtk_widget_show (self->priv->main_vbox);
 
   g_signal_connect (self, "key-press-event",
       G_CALLBACK (roster_window_key_press_event_cb), NULL);
 
-  empathy_builder_connect (gui_mgr, self,
-      "chat_quit", "activate", roster_window_chat_quit_cb,
-      "chat_new_message", "activate", roster_window_chat_new_message_cb,
-      "chat_new_call", "activate", roster_window_chat_new_call_cb,
-      "view_history", "activate", roster_window_view_history_cb,
-      "room_join_new", "activate", roster_window_room_join_new_cb,
-      "room_join_favorites", "activate", roster_window_room_join_favorites_cb,
-      "room_manage_favorites", "activate", roster_window_room_manage_favorites_cb,
-      "chat_add_contact", "activate", roster_window_chat_add_contact_cb,
-      "chat_search_contacts", "activate", roster_window_chat_search_contacts_cb,
-      "view_show_ft_manager", "activate", roster_window_view_show_ft_manager,
-      "view_show_offline", "toggled", roster_window_view_show_offline_cb,
-      "view_show_protocols", "toggled", roster_window_view_show_protocols_cb,
-      "view_sort_by_name", "changed", roster_window_view_sort_contacts_cb,
-      "view_normal_size_with_avatars", "changed", roster_window_view_contacts_list_size_cb,
-      "view_show_map", "activate", roster_window_view_show_map_cb,
-      "edit", "activate", roster_window_edit_cb,
-      "edit_accounts", "activate", roster_window_edit_accounts_cb,
-      "edit_blocked_contacts", "activate", roster_window_edit_blocked_contacts_cb,
-      "edit_preferences", "activate", roster_window_edit_preferences_cb,
-      "edit_search_contacts", "activate", roster_window_edit_search_contacts_cb,
-      "help_about", "activate", roster_window_help_about_cb,
-      "help_debug", "activate", roster_window_help_debug_cb,
-      "help_contents", "activate", roster_window_help_contents_cb,
-      NULL);
-
-  /* Set up connection related widgets. */
-  roster_window_connection_items_setup (self, gui_mgr);
-
-  g_object_ref (self->priv->ui_manager);
+  //g_object_ref (self->priv->ui_manager);
   g_object_unref (gui);
-  g_object_unref (gui_mgr);
-
-#ifndef HAVE_LIBCHAMPLAIN
-  gtk_action_set_visible (show_map_widget, FALSE);
-#endif
 
   self->priv->account_manager = tp_account_manager_dup ();
 
@@ -2562,9 +2765,10 @@ empathy_roster_window_init (EmpathyRosterWindow *self)
   self->priv->status_changed_handlers = g_hash_table_new_full (g_direct_hash,
       g_direct_equal, NULL, NULL);
 
-  /* Set up menu */
-  roster_window_favorite_chatroom_menu_setup (self);
+  self->priv->topup_menu_items = g_hash_table_new_full (NULL, NULL,
+      g_object_unref, g_object_unref);
 
+  /*
   self->priv->edit_context = gtk_ui_manager_get_widget (self->priv->ui_manager,
       "/menubar/edit/edit_context");
   self->priv->edit_context_separator = gtk_ui_manager_get_widget (
@@ -2572,6 +2776,7 @@ empathy_roster_window_init (EmpathyRosterWindow *self)
       "/menubar/edit/edit_context_separator");
   gtk_widget_hide (self->priv->edit_context);
   gtk_widget_hide (self->priv->edit_context_separator);
+      */
 
   /* Set up contact list. */
   empathy_status_presets_get_all ();
@@ -2678,17 +2883,6 @@ empathy_roster_window_init (EmpathyRosterWindow *self)
   /* Set window size. */
   empathy_geometry_bind (GTK_WINDOW (self), GEOMETRY_NAME);
 
-  /* bind view_balance_show_in_roster */
-  g_settings_bind (self->priv->gsettings_ui, "show-balance-in-roster",
-      self->priv->view_balance_show_in_roster, "active",
-      G_SETTINGS_BIND_DEFAULT);
-  g_object_bind_property (self->priv->view_balance_show_in_roster, "active",
-      self->priv->balance_vbox, "visible",
-      G_BINDING_SYNC_CREATE);
-
-  g_settings_bind (self->priv->gsettings_ui, "show-groups",
-      self->priv->individual_store, "show-groups", G_SETTINGS_BIND_DEFAULT);
-
   /* Enable event handling */
   self->priv->call_observer = empathy_call_observer_dup_singleton ();
   self->priv->event_manager = empathy_event_manager_dup_singleton ();
@@ -2705,6 +2899,7 @@ empathy_roster_window_init (EmpathyRosterWindow *self)
       G_CALLBACK (roster_window_account_disabled_cb), self);
 
   /* Show offline ? */
+  /*
   show_offline = g_settings_get_boolean (self->priv->gsettings_ui,
       EMPATHY_PREFS_UI_SHOW_OFFLINE);
 
@@ -2713,24 +2908,30 @@ empathy_roster_window_init (EmpathyRosterWindow *self)
       G_CALLBACK (roster_window_notify_show_offline_cb), show_offline_widget);
 
   gtk_toggle_action_set_active (show_offline_widget, show_offline);
+      */
 
   /* Show protocol ? */
+  /*
   g_signal_connect (self->priv->gsettings_ui,
       "changed::" EMPATHY_PREFS_UI_SHOW_PROTOCOLS,
       G_CALLBACK (roster_window_notify_show_protocols_cb), self);
 
   roster_window_notify_show_protocols_cb (self->priv->gsettings_ui,
       EMPATHY_PREFS_UI_SHOW_PROTOCOLS, self);
+      */
 
   /* Sort by name / by status ? */
+  /*
   g_signal_connect (self->priv->gsettings_contacts,
       "changed::" EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM,
       G_CALLBACK (roster_window_notify_sort_contact_cb), self);
 
   roster_window_notify_sort_contact_cb (self->priv->gsettings_contacts,
       EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM, self);
+      */
 
   /* Contacts list size */
+  /*
   g_signal_connect (self->priv->gsettings_ui,
       "changed::" EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST,
       G_CALLBACK (roster_window_notify_contact_list_size_cb), self);
@@ -2739,9 +2940,12 @@ empathy_roster_window_init (EmpathyRosterWindow *self)
       "changed::" EMPATHY_PREFS_UI_SHOW_AVATARS,
       G_CALLBACK (roster_window_notify_contact_list_size_cb),
       self);
+      */
 
+  /*
   roster_window_notify_contact_list_size_cb (self->priv->gsettings_ui,
       EMPATHY_PREFS_UI_SHOW_AVATARS, self);
+      */
 
   g_signal_connect (self->priv->button_account_settings, "clicked",
       G_CALLBACK (button_account_settings_clicked_cb), self);