+static void
+empathy_chat_window_init (EmpathyChatWindow *self)
+{
+ GtkBuilder *gui;
+ GtkAccelGroup *accel_group;
+ GClosure *closure;
+ GtkWidget *menu;
+ GtkWidget *submenu;
+ guint i;
+ GtkWidget *chat_vbox;
+ GtkWidget *main_box;
+ gchar *filename;
+ EmpathySmileyManager *smiley_manager;
+
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
+ EMPATHY_TYPE_CHAT_WINDOW, EmpathyChatWindowPriv);
+
+ filename = empathy_file_lookup ("empathy-chat-window.ui", "src");
+ gui = tpaw_builder_get_file (filename,
+ "chat_vbox", &chat_vbox,
+ "main_box", &main_box,
+ "ui_manager", &self->priv->ui_manager,
+ "menu_conv_insert_smiley", &self->priv->menu_conv_insert_smiley,
+ "menu_conv_favorite", &self->priv->menu_conv_favorite,
+ "menu_conv_join_chat", &self->priv->menu_conv_join_chat,
+ "menu_conv_leave_chat", &self->priv->menu_conv_leave_chat,
+ "menu_conv_always_urgent", &self->priv->menu_conv_always_urgent,
+ "menu_conv_toggle_contacts", &self->priv->menu_conv_toggle_contacts,
+ "menu_edit_cut", &self->priv->menu_edit_cut,
+ "menu_edit_copy", &self->priv->menu_edit_copy,
+ "menu_edit_paste", &self->priv->menu_edit_paste,
+ "menu_edit_find", &self->priv->menu_edit_find,
+ "menu_tabs_next", &self->priv->menu_tabs_next,
+ "menu_tabs_prev", &self->priv->menu_tabs_prev,
+ "menu_tabs_undo_close_tab", &self->priv->menu_tabs_undo_close_tab,
+ "menu_tabs_left", &self->priv->menu_tabs_left,
+ "menu_tabs_right", &self->priv->menu_tabs_right,
+ "menu_tabs_detach", &self->priv->menu_tabs_detach,
+ NULL);
+ g_free (filename);
+
+ tpaw_builder_connect (gui, self,
+ "menu_conv", "activate", chat_window_conv_activate_cb,
+ "menu_conv_clear", "activate", chat_window_clear_activate_cb,
+ "menu_conv_favorite", "toggled", chat_window_favorite_toggled_cb,
+ "menu_conv_always_urgent", "toggled", chat_window_always_urgent_toggled_cb,
+ "menu_conv_toggle_contacts", "toggled", chat_window_contacts_toggled_cb,
+ "menu_conv_invite_participant", "activate", chat_window_invite_participant_activate_cb,
+ "menu_conv_join_chat", "activate", chat_window_join_chat_activate_cb,
+ "menu_conv_leave_chat", "activate", chat_window_leave_chat_activate_cb,
+ "menu_conv_close", "activate", chat_window_close_activate_cb,
+ "menu_edit", "activate", chat_window_edit_activate_cb,
+ "menu_edit_cut", "activate", chat_window_cut_activate_cb,
+ "menu_edit_copy", "activate", chat_window_copy_activate_cb,
+ "menu_edit_paste", "activate", chat_window_paste_activate_cb,
+ "menu_edit_find", "activate", chat_window_find_activate_cb,
+ "menu_tabs_next", "activate", chat_window_tabs_next_activate_cb,
+ "menu_tabs_prev", "activate", chat_window_tabs_previous_activate_cb,
+ "menu_tabs_undo_close_tab", "activate", chat_window_tabs_undo_close_tab_activate_cb,
+ "menu_tabs_left", "activate", chat_window_tabs_left_activate_cb,
+ "menu_tabs_right", "activate", chat_window_tabs_right_activate_cb,
+ "menu_tabs_detach", "activate", chat_window_detach_activate_cb,
+ "menu_help_contents", "activate", chat_window_help_contents_activate_cb,
+ "menu_help_about", "activate", chat_window_help_about_activate_cb,
+ NULL);
+
+ empathy_set_css_provider (GTK_WIDGET (self));
+
+ self->priv->gsettings_chat = g_settings_new (EMPATHY_PREFS_CHAT_SCHEMA);
+ self->priv->gsettings_notif = g_settings_new (EMPATHY_PREFS_NOTIFICATIONS_SCHEMA);
+ self->priv->gsettings_ui = g_settings_new (EMPATHY_PREFS_UI_SCHEMA);
+ self->priv->chatroom_manager = empathy_chatroom_manager_dup_singleton (NULL);
+
+ self->priv->sound_mgr = empathy_sound_manager_dup_singleton ();
+
+ self->priv->notebook = gtk_notebook_new ();
+ //gtk_notebook_set_show_tabs (GTK_NOTEBOOK (self->priv->notebook), FALSE);
+
+ g_signal_connect (self->priv->notebook, "create-window",
+ G_CALLBACK (notebook_create_window_cb), self);
+
+ gtk_container_add (GTK_CONTAINER (self), main_box);
+
+ gtk_notebook_set_group_name (GTK_NOTEBOOK (self->priv->notebook),
+ "EmpathyChatWindow");
+ gtk_notebook_set_scrollable (GTK_NOTEBOOK (self->priv->notebook), TRUE);
+ gtk_notebook_popup_enable (GTK_NOTEBOOK (self->priv->notebook));
+ gtk_box_pack_start (GTK_BOX (chat_vbox), self->priv->notebook, TRUE, TRUE, 0);
+ gtk_widget_show (self->priv->notebook);
+
+#if 0 /* no top level window yet at this point */
+ /* Set up accels */
+ accel_group = gtk_accel_group_new ();
+ gtk_window_add_accel_group (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))), accel_group);
+
+ for (i = 0; i < G_N_ELEMENTS (tab_accel_keys); i++)
+ {
+ closure = g_cclosure_new (G_CALLBACK (chat_window_accel_cb), self,
+ NULL);
+
+ gtk_accel_group_connect (accel_group, tab_accel_keys[i], GDK_MOD1_MASK, 0,
+ closure);
+ }
+
+ g_object_unref (accel_group);
+#endif
+
+ /* Set up drag target lists */
+ self->priv->contact_targets = gtk_target_list_new (drag_types_dest_contact,
+ G_N_ELEMENTS (drag_types_dest_contact));
+
+ self->priv->file_targets = gtk_target_list_new (drag_types_dest_file,
+ G_N_ELEMENTS (drag_types_dest_file));
+
+ /* Set up smiley menu */
+ smiley_manager = empathy_smiley_manager_dup_singleton ();
+ submenu = empathy_smiley_menu_new (smiley_manager,
+ chat_window_insert_smiley_activate_cb, self);
+
+ menu = gtk_ui_manager_get_widget (self->priv->ui_manager,
+ "/chats_menubar/menu_conv/menu_conv_insert_smiley");
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu), submenu);
+ g_object_unref (smiley_manager);
+
+ /* Set up signals we can't do with ui file since we may need to
+ * block/unblock them at some later stage.
+ */
+
+ g_signal_connect (self, "delete_event",
+ G_CALLBACK (chat_window_delete_event_cb), self);
+ g_signal_connect (self, "focus_in_event",
+ G_CALLBACK (chat_window_focus_in_event_cb), self);
+ g_signal_connect (self, "focus_out_event",
+ G_CALLBACK (chat_window_focus_out_event_cb), self);
+ g_signal_connect_after (self->priv->notebook, "switch_page",
+ G_CALLBACK (chat_window_page_switched_cb), self);
+ g_signal_connect (self->priv->notebook, "page_added",
+ G_CALLBACK (chat_window_page_added_cb), self);
+ g_signal_connect (self->priv->notebook, "page_removed",
+ G_CALLBACK (chat_window_page_removed_cb), self);
+
+ /* Set up drag and drop */
+ gtk_drag_dest_set (GTK_WIDGET (self->priv->notebook),
+ GTK_DEST_DEFAULT_HIGHLIGHT,
+ drag_types_dest,
+ G_N_ELEMENTS (drag_types_dest),
+ GDK_ACTION_MOVE | GDK_ACTION_COPY);
+
+ /* connect_after to allow GtkNotebook's built-in tab switching */
+ g_signal_connect_after (self->priv->notebook, "drag-motion",
+ G_CALLBACK (chat_window_drag_motion), self);
+ g_signal_connect (self->priv->notebook, "drag-data-received",
+ G_CALLBACK (chat_window_drag_data_received), self);
+ g_signal_connect (self->priv->notebook, "drag-drop",
+ G_CALLBACK (chat_window_drag_drop), self);
+
+ chat_windows = g_list_prepend (chat_windows, self);
+
+ /* Set up private details */
+ self->priv->chats = NULL;
+ self->priv->current_chat = NULL;
+ self->priv->notification = NULL;
+
+ self->priv->notify_mgr = empathy_notify_manager_dup_singleton ();
+
+ self->priv->chat_manager = empathy_chat_manager_dup_singleton ();
+ self->priv->chat_manager_chats_changed_id = g_signal_connect (
+ self->priv->chat_manager, "closed-chats-changed",
+ G_CALLBACK (chat_window_chat_manager_chats_changed_cb), self);
+
+ chat_window_chat_manager_chats_changed_cb (self->priv->chat_manager,
+ empathy_chat_manager_get_num_closed_chats (self->priv->chat_manager), self);
+
+ g_object_ref (self->priv->ui_manager);
+ g_object_unref (gui);