aboutsummaryrefslogtreecommitdiffstats
path: root/src/empathy-main-window.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/empathy-main-window.c')
-rw-r--r--src/empathy-main-window.c466
1 files changed, 264 insertions, 202 deletions
diff --git a/src/empathy-main-window.c b/src/empathy-main-window.c
index 9b818bc4c..8e2973a6c 100644
--- a/src/empathy-main-window.c
+++ b/src/empathy-main-window.c
@@ -19,6 +19,7 @@
* Boston, MA 02110-1301 USA
*
* Authors: Xavier Claessens <xclaesse@gmail.com>
+ * Danielle Madeley <danielle.madeley@collabora.co.uk>
*/
#include <config.h>
@@ -82,7 +83,11 @@
/* Name in the geometry file */
#define GEOMETRY_NAME "main-window"
-typedef struct {
+G_DEFINE_TYPE (EmpathyMainWindow, empathy_main_window, GTK_TYPE_WINDOW);
+
+#define GET_PRIV(self) ((EmpathyMainWindowPriv*)((EmpathyMainWindow*)self)->priv)
+
+struct _EmpathyMainWindowPriv {
EmpathyContactListView *list_view;
EmpathyContactListStore *list_store;
TpAccountManager *account_manager;
@@ -94,7 +99,6 @@ typedef struct {
GSettings *gsettings_ui;
GSettings *gsettings_contacts;
- GtkWidget *window;
GtkWidget *main_vbox;
GtkWidget *throbber;
GtkWidget *throbber_tool_item;
@@ -130,21 +134,21 @@ typedef struct {
/* The idle event source to migrate butterfly's logs */
guint butterfly_log_migration_members_changed_id;
-} EmpathyMainWindow;
-
-static EmpathyMainWindow *main_window = NULL;
+};
static void
main_window_flash_stop (EmpathyMainWindow *window)
{
- if (window->flash_timeout_id == 0) {
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
+
+ if (priv->flash_timeout_id == 0) {
return;
}
DEBUG ("Stop flashing");
- g_source_remove (window->flash_timeout_id);
- window->flash_timeout_id = 0;
- window->flash_on = FALSE;
+ g_source_remove (priv->flash_timeout_id);
+ priv->flash_timeout_id = 0;
+ priv->flash_on = FALSE;
}
typedef struct {
@@ -185,7 +189,7 @@ main_window_flash_foreach (GtkTreeModel *model,
pixbuf = empathy_pixbuf_from_icon_name (icon_name, GTK_ICON_SIZE_MENU);
} else {
pixbuf = contact_list_store_get_contact_status_icon (
- data->window->list_store,
+ GET_PRIV (data->window)->list_store,
contact);
}
@@ -213,16 +217,17 @@ main_window_flash_foreach (GtkTreeModel *model,
static gboolean
main_window_flash_cb (EmpathyMainWindow *window)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
GtkTreeModel *model;
GSList *events, *l;
gboolean found_event = FALSE;
FlashForeachData data;
- window->flash_on = !window->flash_on;
- data.on = window->flash_on;
- model = GTK_TREE_MODEL (window->list_store);
+ priv->flash_on = !priv->flash_on;
+ data.on = priv->flash_on;
+ model = GTK_TREE_MODEL (priv->list_store);
- events = empathy_event_manager_get_events (window->event_manager);
+ events = empathy_event_manager_get_events (priv->event_manager);
for (l = events; l; l = l->next) {
data.event = l->data;
data.window = window;
@@ -246,14 +251,16 @@ main_window_flash_cb (EmpathyMainWindow *window)
static void
main_window_flash_start (EmpathyMainWindow *window)
{
- if (window->flash_timeout_id != 0) {
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
+
+ if (priv->flash_timeout_id != 0) {
return;
}
DEBUG ("Start flashing");
- window->flash_timeout_id = g_timeout_add (FLASH_TIMEOUT,
- (GSourceFunc) main_window_flash_cb,
- window);
+ priv->flash_timeout_id = g_timeout_add (FLASH_TIMEOUT,
+ (GSourceFunc) main_window_flash_cb,
+ window);
main_window_flash_cb (window);
}
@@ -272,6 +279,7 @@ main_window_event_removed_cb (EmpathyEventManager *manager,
EmpathyEvent *event,
EmpathyMainWindow *window)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
FlashForeachData data;
if (!event->contact) {
@@ -281,7 +289,7 @@ main_window_event_removed_cb (EmpathyEventManager *manager,
data.on = FALSE;
data.event = event;
data.window = window;
- gtk_tree_model_foreach (GTK_TREE_MODEL (window->list_store),
+ gtk_tree_model_foreach (GTK_TREE_MODEL (priv->list_store),
main_window_flash_foreach,
&data);
}
@@ -292,12 +300,13 @@ main_window_row_activated_cb (EmpathyContactListView *view,
GtkTreeViewColumn *col,
EmpathyMainWindow *window)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
EmpathyContact *contact;
GtkTreeModel *model;
GtkTreeIter iter;
GSList *events, *l;
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (window->list_view));
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->list_view));
gtk_tree_model_get_iter (model, &iter, path);
gtk_tree_model_get (model, &iter,
EMPATHY_CONTACT_LIST_STORE_COL_CONTACT, &contact,
@@ -309,7 +318,7 @@ main_window_row_activated_cb (EmpathyContactListView *view,
/* If the contact has an event activate it, otherwise the
* default handler of row-activated will be called. */
- events = empathy_event_manager_get_events (window->event_manager);
+ events = empathy_event_manager_get_events (priv->event_manager);
for (l = events; l; l = l->next) {
EmpathyEvent *event = l->data;
@@ -331,12 +340,13 @@ static void
main_window_remove_error (EmpathyMainWindow *window,
TpAccount *account)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
GtkWidget *error_widget;
- error_widget = g_hash_table_lookup (window->errors, account);
+ error_widget = g_hash_table_lookup (priv->errors, account);
if (error_widget != NULL) {
gtk_widget_destroy (error_widget);
- g_hash_table_remove (window->errors, account);
+ g_hash_table_remove (priv->errors, account);
}
}
@@ -390,6 +400,7 @@ main_window_error_display (EmpathyMainWindow *window,
TpAccount *account,
const gchar *message)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
GtkWidget *info_bar;
GtkWidget *content_area;
GtkWidget *label;
@@ -406,7 +417,7 @@ main_window_error_display (EmpathyMainWindow *window,
tp_account_get_display_name (account),
message);
- info_bar = g_hash_table_lookup (window->errors, account);
+ info_bar = g_hash_table_lookup (priv->errors, account);
if (info_bar) {
label = g_object_get_data (G_OBJECT (info_bar), "label");
@@ -421,7 +432,7 @@ main_window_error_display (EmpathyMainWindow *window,
gtk_info_bar_set_message_type (GTK_INFO_BAR (info_bar), GTK_MESSAGE_ERROR);
gtk_widget_set_no_show_all (info_bar, TRUE);
- gtk_box_pack_start (GTK_BOX (window->errors_vbox), info_bar, FALSE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (priv->errors_vbox), info_bar, FALSE, TRUE, 0);
gtk_widget_show (info_bar);
icon_name = tp_account_get_icon_name (account);
@@ -498,14 +509,15 @@ main_window_error_display (EmpathyMainWindow *window,
G_CALLBACK (main_window_error_retry_clicked_cb),
window);
- gtk_widget_show (window->errors_vbox);
+ gtk_widget_show (priv->errors_vbox);
- g_hash_table_insert (window->errors, g_object_ref (account), info_bar);
+ g_hash_table_insert (priv->errors, g_object_ref (account), info_bar);
}
static void
main_window_update_status (EmpathyMainWindow *window)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
gboolean connected, connecting;
GList *l;
@@ -513,15 +525,15 @@ main_window_update_status (EmpathyMainWindow *window)
/* Update the spinner state */
if (connecting) {
- gtk_spinner_start (GTK_SPINNER (window->throbber));
- gtk_widget_show (window->throbber_tool_item);
+ gtk_spinner_start (GTK_SPINNER (priv->throbber));
+ gtk_widget_show (priv->throbber_tool_item);
} else {
- gtk_spinner_stop (GTK_SPINNER (window->throbber));
- gtk_widget_hide (window->throbber_tool_item);
+ gtk_spinner_stop (GTK_SPINNER (priv->throbber));
+ gtk_widget_hide (priv->throbber_tool_item);
}
/* Update widgets sensibility */
- for (l = window->actions_connected; l; l = l->next) {
+ for (l = priv->actions_connected; l; l = l->next) {
gtk_action_set_sensitive (l->data, connected);
}
}
@@ -547,12 +559,12 @@ main_window_connection_changed_cb (TpAccount *account,
}
if (current == TP_CONNECTION_STATUS_DISCONNECTED) {
- empathy_sound_play (GTK_WIDGET (window->window),
+ empathy_sound_play (GTK_WIDGET (window),
EMPATHY_SOUND_ACCOUNT_DISCONNECTED);
}
if (current == TP_CONNECTION_STATUS_CONNECTED) {
- empathy_sound_play (GTK_WIDGET (window->window),
+ empathy_sound_play (GTK_WIDGET (window),
EMPATHY_SOUND_ACCOUNT_CONNECTED);
/* Account connected without error, remove error message if any */
@@ -592,43 +604,43 @@ main_window_accels_save (void)
}
static void
-main_window_destroy_cb (GtkWidget *widget,
- EmpathyMainWindow *window)
+empathy_main_window_finalize (GObject *window)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
GHashTableIter iter;
gpointer key, value;
/* Save user-defined accelerators. */
main_window_accels_save ();
- g_list_free (window->actions_connected);
+ g_list_free (priv->actions_connected);
- g_object_unref (window->account_manager);
- g_object_unref (window->list_store);
- g_hash_table_destroy (window->errors);
+ g_object_unref (priv->account_manager);
+ g_object_unref (priv->list_store);
+ g_hash_table_destroy (priv->errors);
/* disconnect all handlers of status-changed signal */
- g_hash_table_iter_init (&iter, window->status_changed_handlers);
+ g_hash_table_iter_init (&iter, priv->status_changed_handlers);
while (g_hash_table_iter_next (&iter, &key, &value))
g_signal_handler_disconnect (TP_ACCOUNT (key),
GPOINTER_TO_UINT (value));
- g_hash_table_destroy (window->status_changed_handlers);
+ g_hash_table_destroy (priv->status_changed_handlers);
- g_signal_handlers_disconnect_by_func (window->event_manager,
+ g_signal_handlers_disconnect_by_func (priv->event_manager,
main_window_event_added_cb,
window);
- g_signal_handlers_disconnect_by_func (window->event_manager,
+ g_signal_handlers_disconnect_by_func (priv->event_manager,
main_window_event_removed_cb,
window);
- g_object_unref (window->event_manager);
- g_object_unref (window->ui_manager);
- g_object_unref (window->chatroom_manager);
+ g_object_unref (priv->event_manager);
+ g_object_unref (priv->ui_manager);
+ g_object_unref (priv->chatroom_manager);
- g_object_unref (window->gsettings_ui);
- g_object_unref (window->gsettings_contacts);
+ g_object_unref (priv->gsettings_ui);
+ g_object_unref (priv->gsettings_contacts);
- g_free (window);
+ G_OBJECT_CLASS (empathy_main_window_parent_class)->finalize (window);
}
static gboolean
@@ -659,28 +671,28 @@ static void
main_window_view_history_cb (GtkAction *action,
EmpathyMainWindow *window)
{
- empathy_log_window_show (NULL, NULL, FALSE, GTK_WINDOW (window->window));
+ empathy_log_window_show (NULL, NULL, FALSE, GTK_WINDOW (window));
}
static void
main_window_chat_new_message_cb (GtkAction *action,
EmpathyMainWindow *window)
{
- empathy_new_message_dialog_show (GTK_WINDOW (window->window));
+ empathy_new_message_dialog_show (GTK_WINDOW (window));
}
static void
main_window_chat_new_call_cb (GtkAction *action,
EmpathyMainWindow *window)
{
- empathy_new_call_dialog_show (GTK_WINDOW (window->window));
+ empathy_new_call_dialog_show (GTK_WINDOW (window));
}
static void
main_window_chat_add_contact_cb (GtkAction *action,
EmpathyMainWindow *window)
{
- empathy_new_contact_dialog_show (GTK_WINDOW (window->window));
+ empathy_new_contact_dialog_show (GTK_WINDOW (window));
}
static void
@@ -694,16 +706,17 @@ static void
main_window_view_show_offline_cb (GtkToggleAction *action,
EmpathyMainWindow *window)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
gboolean current;
current = gtk_toggle_action_get_active (action);
- g_settings_set_boolean (window->gsettings_ui,
+ g_settings_set_boolean (priv->gsettings_ui,
EMPATHY_PREFS_UI_SHOW_OFFLINE,
current);
/* Turn off sound just while we alter the contact list. */
// FIXME: empathy_sound_set_enabled (FALSE);
- empathy_contact_list_store_set_show_offline (window->list_store, current);
+ empathy_contact_list_store_set_show_offline (priv->list_store, current);
//empathy_sound_set_enabled (TRUE);
}
@@ -712,6 +725,7 @@ main_window_notify_sort_contact_cb (GSettings *gsettings,
const gchar *key,
EmpathyMainWindow *window)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
gchar *str;
str = g_settings_get_string (gsettings, key);
@@ -728,7 +742,7 @@ main_window_notify_sort_contact_cb (GSettings *gsettings,
/* By changing the value of the GtkRadioAction,
it emits a signal that calls main_window_view_sort_contacts_cb
which updates the contacts list */
- gtk_radio_action_set_current_value (window->sort_by_name,
+ gtk_radio_action_set_current_value (priv->sort_by_name,
enum_value->value);
} else {
g_warning ("Wrong value for sort_criterium configuration : %s", str);
@@ -742,6 +756,7 @@ main_window_view_sort_contacts_cb (GtkRadioAction *action,
GtkRadioAction *current,
EmpathyMainWindow *window)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
EmpathyContactListStoreSort value;
GSList *group;
GType type;
@@ -760,25 +775,26 @@ main_window_view_sort_contacts_cb (GtkRadioAction *action,
g_warning ("No GEnumValue for EmpathyContactListSort with GtkRadioAction index:%d",
g_slist_index (group, action));
} else {
- g_settings_set_string (window->gsettings_contacts,
+ g_settings_set_string (priv->gsettings_contacts,
EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM,
enum_value->value_nick);
}
- empathy_contact_list_store_set_sort_criterium (window->list_store, value);
+ empathy_contact_list_store_set_sort_criterium (priv->list_store, value);
}
static void
main_window_view_show_protocols_cb (GtkToggleAction *action,
EmpathyMainWindow *window)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
gboolean value;
value = gtk_toggle_action_get_active (action);
- g_settings_set_boolean (window->gsettings_ui,
+ g_settings_set_boolean (priv->gsettings_ui,
EMPATHY_PREFS_UI_SHOW_PROTOCOLS,
value);
- empathy_contact_list_store_set_show_protocols (window->list_store,
+ empathy_contact_list_store_set_show_protocols (priv->list_store,
value);
}
@@ -792,6 +808,7 @@ main_window_view_contacts_list_size_cb (GtkRadioAction *action,
GtkRadioAction *current,
EmpathyMainWindow *window)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
GSettings *gsettings_ui;
gint value;
@@ -812,9 +829,9 @@ main_window_view_contacts_list_size_cb (GtkRadioAction *action,
value == CONTACT_LIST_COMPACT_SIZE);
g_settings_apply (gsettings_ui);
- empathy_contact_list_store_set_show_avatars (window->list_store,
+ empathy_contact_list_store_set_show_avatars (priv->list_store,
value == CONTACT_LIST_NORMAL_SIZE_WITH_AVATARS);
- empathy_contact_list_store_set_is_compact (window->list_store,
+ empathy_contact_list_store_set_is_compact (priv->list_store,
value == CONTACT_LIST_COMPACT_SIZE);
g_object_unref (gsettings_ui);
@@ -824,7 +841,9 @@ static void main_window_notify_show_protocols_cb (GSettings *gsettings,
const gchar *key,
EmpathyMainWindow *window)
{
- gtk_toggle_action_set_active (window->show_protocols,
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
+
+ gtk_toggle_action_set_active (priv->show_protocols,
g_settings_get_boolean (gsettings,
EMPATHY_PREFS_UI_SHOW_PROTOCOLS));
}
@@ -835,6 +854,7 @@ main_window_notify_contact_list_size_cb (GSettings *gsettings,
const gchar *key,
EmpathyMainWindow *window)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
gint value;
if (g_settings_get_boolean (gsettings,
@@ -852,7 +872,7 @@ main_window_notify_contact_list_size_cb (GSettings *gsettings,
/* By changing the value of the GtkRadioAction,
it emits a signal that calls main_window_view_contacts_list_size_cb
which updates the contacts list */
- gtk_radio_action_set_current_value (window->normal_with_avatars, value);
+ gtk_radio_action_set_current_value (priv->normal_with_avatars, value);
}
static void
@@ -993,6 +1013,7 @@ static void
main_window_favorite_chatroom_menu_add (EmpathyMainWindow *window,
EmpathyChatroom *chatroom)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
GtkWidget *menu_item;
const gchar *name;
@@ -1008,7 +1029,7 @@ main_window_favorite_chatroom_menu_add (EmpathyMainWindow *window,
G_CALLBACK (main_window_favorite_chatroom_menu_activate_cb),
chatroom);
- gtk_menu_shell_insert (GTK_MENU_SHELL (window->room_menu),
+ gtk_menu_shell_insert (GTK_MENU_SHELL (priv->room_menu),
menu_item, 4);
gtk_widget_show (menu_item);
@@ -1019,9 +1040,11 @@ main_window_favorite_chatroom_menu_added_cb (EmpathyChatroomManager *manager,
EmpathyChatroom *chatroom,
EmpathyMainWindow *window)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
+
main_window_favorite_chatroom_menu_add (window, chatroom);
- gtk_widget_show (window->room_separator);
- gtk_action_set_sensitive (window->room_join_favorites, TRUE);
+ gtk_widget_show (priv->room_separator);
+ gtk_action_set_sensitive (priv->room_join_favorites, TRUE);
}
static void
@@ -1029,6 +1052,7 @@ main_window_favorite_chatroom_menu_removed_cb (EmpathyChatroomManager *manager,
EmpathyChatroom *chatroom,
EmpathyMainWindow *window)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
GtkWidget *menu_item;
GList *chatrooms;
@@ -1036,29 +1060,31 @@ main_window_favorite_chatroom_menu_removed_cb (EmpathyChatroomManager *manager,
g_object_set_data (G_OBJECT (chatroom), "menu_item", NULL);
gtk_widget_destroy (menu_item);
- chatrooms = empathy_chatroom_manager_get_chatrooms (window->chatroom_manager, NULL);
+ chatrooms = empathy_chatroom_manager_get_chatrooms (priv->chatroom_manager, NULL);
if (chatrooms) {
- gtk_widget_show (window->room_separator);
+ gtk_widget_show (priv->room_separator);
} else {
- gtk_widget_hide (window->room_separator);
+ gtk_widget_hide (priv->room_separator);
}
- gtk_action_set_sensitive (window->room_join_favorites, chatrooms != NULL);
+ gtk_action_set_sensitive (priv->room_join_favorites, chatrooms != NULL);
g_list_free (chatrooms);
}
static void
main_window_favorite_chatroom_menu_setup (EmpathyMainWindow *window)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
GList *chatrooms, *l;
GtkWidget *room;
- window->chatroom_manager = empathy_chatroom_manager_dup_singleton (NULL);
- chatrooms = empathy_chatroom_manager_get_chatrooms (window->chatroom_manager, NULL);
- room = gtk_ui_manager_get_widget (window->ui_manager,
+ priv->chatroom_manager = empathy_chatroom_manager_dup_singleton (NULL);
+ chatrooms = empathy_chatroom_manager_get_chatrooms (
+ priv->chatroom_manager, NULL);
+ room = gtk_ui_manager_get_widget (priv->ui_manager,
"/menubar/room");
- window->room_menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (room));
- window->room_separator = gtk_ui_manager_get_widget (window->ui_manager,
+ priv->room_menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (room));
+ priv->room_separator = gtk_ui_manager_get_widget (priv->ui_manager,
"/menubar/room/room_separator");
for (l = chatrooms; l; l = l->next) {
@@ -1066,15 +1092,15 @@ main_window_favorite_chatroom_menu_setup (EmpathyMainWindow *window)
}
if (!chatrooms) {
- gtk_widget_hide (window->room_separator);
+ gtk_widget_hide (priv->room_separator);
}
- gtk_action_set_sensitive (window->room_join_favorites, chatrooms != NULL);
+ gtk_action_set_sensitive (priv->room_join_favorites, chatrooms != NULL);
- g_signal_connect (window->chatroom_manager, "chatroom-added",
+ g_signal_connect (priv->chatroom_manager, "chatroom-added",
G_CALLBACK (main_window_favorite_chatroom_menu_added_cb),
window);
- g_signal_connect (window->chatroom_manager, "chatroom-removed",
+ g_signal_connect (priv->chatroom_manager, "chatroom-removed",
G_CALLBACK (main_window_favorite_chatroom_menu_removed_cb),
window);
@@ -1085,16 +1111,17 @@ static void
main_window_room_join_new_cb (GtkAction *action,
EmpathyMainWindow *window)
{
- empathy_new_chatroom_dialog_show (GTK_WINDOW (window->window));
+ empathy_new_chatroom_dialog_show (GTK_WINDOW (window));
}
static void
main_window_room_join_favorites_cb (GtkAction *action,
EmpathyMainWindow *window)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
GList *chatrooms, *l;
- chatrooms = empathy_chatroom_manager_get_chatrooms (window->chatroom_manager, NULL);
+ chatrooms = empathy_chatroom_manager_get_chatrooms (priv->chatroom_manager, NULL);
for (l = chatrooms; l; l = l->next) {
main_window_favorite_chatroom_join (l->data);
}
@@ -1105,52 +1132,53 @@ static void
main_window_room_manage_favorites_cb (GtkAction *action,
EmpathyMainWindow *window)
{
- empathy_chatrooms_window_show (GTK_WINDOW (window->window));
+ empathy_chatrooms_window_show (GTK_WINDOW (window));
}
static void
main_window_edit_cb (GtkAction *action,
EmpathyMainWindow *window)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
GtkWidget *submenu;
/* FIXME: It should use the UIManager to merge the contact/group submenu */
- submenu = empathy_contact_list_view_get_contact_menu (window->list_view);
+ submenu = empathy_contact_list_view_get_contact_menu (priv->list_view);
if (submenu) {
GtkMenuItem *item;
GtkWidget *label;
- item = GTK_MENU_ITEM (window->edit_context);
+ item = GTK_MENU_ITEM (priv->edit_context);
label = gtk_bin_get_child (GTK_BIN (item));
gtk_label_set_text (GTK_LABEL (label), _("Contact"));
- gtk_widget_show (window->edit_context);
- gtk_widget_show (window->edit_context_separator);
+ gtk_widget_show (priv->edit_context);
+ gtk_widget_show (priv->edit_context_separator);
gtk_menu_item_set_submenu (item, submenu);
return;
}
- submenu = empathy_contact_list_view_get_group_menu (window->list_view);
+ submenu = empathy_contact_list_view_get_group_menu (priv->list_view);
if (submenu) {
GtkMenuItem *item;
GtkWidget *label;
- item = GTK_MENU_ITEM (window->edit_context);
+ item = GTK_MENU_ITEM (priv->edit_context);
label = gtk_bin_get_child (GTK_BIN (item));
gtk_label_set_text (GTK_LABEL (label), _("Group"));
- gtk_widget_show (window->edit_context);
- gtk_widget_show (window->edit_context_separator);
+ gtk_widget_show (priv->edit_context);
+ gtk_widget_show (priv->edit_context_separator);
gtk_menu_item_set_submenu (item, submenu);
return;
}
- gtk_widget_hide (window->edit_context);
- gtk_widget_hide (window->edit_context_separator);
+ gtk_widget_hide (priv->edit_context);
+ gtk_widget_hide (priv->edit_context_separator);
return;
}
@@ -1167,21 +1195,21 @@ static void
main_window_edit_personal_information_cb (GtkAction *action,
EmpathyMainWindow *window)
{
- empathy_contact_personal_dialog_show (GTK_WINDOW (window->window));
+ empathy_contact_personal_dialog_show (GTK_WINDOW (window));
}
static void
main_window_edit_preferences_cb (GtkAction *action,
EmpathyMainWindow *window)
{
- empathy_preferences_show (GTK_WINDOW (window->window));
+ empathy_preferences_show (GTK_WINDOW (window));
}
static void
main_window_help_about_cb (GtkAction *action,
EmpathyMainWindow *window)
{
- empathy_about_dialog_new (GTK_WINDOW (window->window));
+ empathy_about_dialog_new (GTK_WINDOW (window));
}
static void
@@ -1223,7 +1251,7 @@ static void
main_window_help_contents_cb (GtkAction *action,
EmpathyMainWindow *window)
{
- empathy_url_show (window->window, "ghelp:empathy");
+ empathy_url_show (GTK_WIDGET (window), "ghelp:empathy");
}
static gboolean
@@ -1248,11 +1276,12 @@ main_window_account_removed_cb (TpAccountManager *manager,
TpAccount *account,
EmpathyMainWindow *window)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
GList *a;
a = tp_account_manager_get_valid_accounts (manager);
- gtk_action_set_sensitive (window->view_history,
+ gtk_action_set_sensitive (priv->view_history,
g_list_length (a) > 0);
g_list_free (a);
@@ -1267,10 +1296,12 @@ main_window_account_validity_changed_cb (TpAccountManager *manager,
gboolean valid,
EmpathyMainWindow *window)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
+
if (valid) {
gulong handler_id;
handler_id = GPOINTER_TO_UINT (g_hash_table_lookup (
- window->status_changed_handlers, account));
+ priv->status_changed_handlers, account));
/* connect signal only if it was not connected yet */
if (handler_id == 0) {
@@ -1278,7 +1309,7 @@ main_window_account_validity_changed_cb (TpAccountManager *manager,
"status-changed",
G_CALLBACK (main_window_connection_changed_cb),
window);
- g_hash_table_insert (window->status_changed_handlers,
+ g_hash_table_insert (priv->status_changed_handlers,
account, GUINT_TO_POINTER (handler_id));
}
}
@@ -1299,6 +1330,7 @@ static void
main_window_connection_items_setup (EmpathyMainWindow *window,
GtkBuilder *gui)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
GList *list;
GObject *action;
guint i;
@@ -1315,13 +1347,7 @@ main_window_connection_items_setup (EmpathyMainWindow *window,
list = g_list_prepend (list, action);
}
- window->actions_connected = list;
-}
-
-GtkWidget *
-empathy_main_window_get (void)
-{
- return main_window != NULL ? main_window->window : NULL;
+ priv->actions_connected = list;
}
static void
@@ -1332,6 +1358,7 @@ account_manager_prepared_cb (GObject *source_object,
GList *accounts, *j;
TpAccountManager *manager = TP_ACCOUNT_MANAGER (source_object);
EmpathyMainWindow *window = user_data;
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
GError *error = NULL;
if (!tp_account_manager_prepare_finish (manager, result, &error)) {
@@ -1340,7 +1367,7 @@ account_manager_prepared_cb (GObject *source_object,
return;
}
- accounts = tp_account_manager_get_valid_accounts (window->account_manager);
+ accounts = tp_account_manager_get_valid_accounts (priv->account_manager);
for (j = accounts; j != NULL; j = j->next) {
TpAccount *account = TP_ACCOUNT (j->data);
gulong handler_id;
@@ -1348,7 +1375,7 @@ account_manager_prepared_cb (GObject *source_object,
handler_id = g_signal_connect (account, "status-changed",
G_CALLBACK (main_window_connection_changed_cb),
window);
- g_hash_table_insert (window->status_changed_handlers,
+ g_hash_table_insert (priv->status_changed_handlers,
account, GUINT_TO_POINTER (handler_id));
}
@@ -1359,7 +1386,7 @@ account_manager_prepared_cb (GObject *source_object,
main_window_update_status (window);
/* Disable the "Previous Conversations" menu entry if there is no account */
- gtk_action_set_sensitive (window->view_history,
+ gtk_action_set_sensitive (priv->view_history,
g_list_length (accounts) > 0);
g_list_free (accounts);
@@ -1374,20 +1401,51 @@ main_window_members_changed_cb (EmpathyContactList *list,
gboolean is_member,
EmpathyMainWindow *window)
{
+ EmpathyMainWindowPriv *priv = GET_PRIV (window);
+
if (!is_member)
return;
if (!empathy_migrate_butterfly_logs (contact)) {
g_signal_handler_disconnect (list,
- window->butterfly_log_migration_members_changed_id);
- window->butterfly_log_migration_members_changed_id = 0;
+ priv->butterfly_log_migration_members_changed_id);
+ priv->butterfly_log_migration_members_changed_id = 0;
}
}
-GtkWidget *
-empathy_main_window_show (void)
+static GObject *
+empathy_main_window_constructor (GType type,
+ guint n_construct_params,
+ GObjectConstructParam *construct_params)
{
- EmpathyMainWindow *window;
+ static GObject *window = NULL;
+
+ if (window != NULL)
+ return g_object_ref (window);
+
+ window = G_OBJECT_CLASS (empathy_main_window_parent_class)->constructor (
+ type, n_construct_params, construct_params);
+
+ g_object_add_weak_pointer (window, (gpointer) &window);
+
+ return window;
+}
+
+static void
+empathy_main_window_class_init (EmpathyMainWindowClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = empathy_main_window_finalize;
+ object_class->constructor = empathy_main_window_constructor;
+
+ g_type_class_add_private (object_class, sizeof (EmpathyMainWindowPriv));
+}
+
+static void
+empathy_main_window_init (EmpathyMainWindow *window)
+{
+ EmpathyMainWindowPriv *priv;
EmpathyContactList *list_iface;
GtkBuilder *gui;
GtkWidget *sw;
@@ -1398,41 +1456,41 @@ empathy_main_window_show (void)
gchar *filename;
GSList *l;
- if (main_window) {
- empathy_window_present (GTK_WINDOW (main_window->window));
- return main_window->window;
- }
+ priv = window->priv = G_TYPE_INSTANCE_GET_PRIVATE (window,
+ EMPATHY_TYPE_MAIN_WINDOW, EmpathyMainWindowPriv);
- main_window = g_new0 (EmpathyMainWindow, 1);
- window = main_window;
+ priv->gsettings_ui = g_settings_new (EMPATHY_PREFS_UI_SCHEMA);
+ priv->gsettings_contacts = g_settings_new (EMPATHY_PREFS_CONTACTS_SCHEMA);
- window->gsettings_ui = g_settings_new (EMPATHY_PREFS_UI_SCHEMA);
- window->gsettings_contacts = g_settings_new (EMPATHY_PREFS_CONTACTS_SCHEMA);
+ gtk_window_set_title (GTK_WINDOW (window), _("Contact List"));
+ gtk_window_set_role (GTK_WINDOW (window), "contact_list");
+ gtk_window_set_default_size (GTK_WINDOW (window), 225, 325);
/* Set up interface */
filename = empathy_file_lookup ("empathy-main-window.ui", "src");
gui = empathy_builder_get_file (filename,
- "main_window", &window->window,
- "main_vbox", &window->main_vbox,
- "errors_vbox", &window->errors_vbox,
- "ui_manager", &window->ui_manager,
+ "main_vbox", &priv->main_vbox,
+ "errors_vbox", &priv->errors_vbox,
+ "ui_manager", &priv->ui_manager,
"view_show_offline", &show_offline_widget,
- "view_show_protocols", &window->show_protocols,
- "view_sort_by_name", &window->sort_by_name,
- "view_sort_by_status", &window->sort_by_status,
- "view_normal_size_with_avatars", &window->normal_with_avatars,
- "view_normal_size", &window->normal_size,
- "view_compact_size", &window->compact_size,
- "view_history", &window->view_history,
+ "view_show_protocols", &priv->show_protocols,
+ "view_sort_by_name", &priv->sort_by_name,
+ "view_sort_by_status", &priv->sort_by_status,
+ "view_normal_size_with_avatars", &priv->normal_with_avatars,
+ "view_normal_size", &priv->normal_size,
+ "view_compact_size", &priv->compact_size,
+ "view_history", &priv->view_history,
"view_show_map", &show_map_widget,
- "room_join_favorites", &window->room_join_favorites,
- "presence_toolbar", &window->presence_toolbar,
+ "room_join_favorites", &priv->room_join_favorites,
+ "presence_toolbar", &priv->presence_toolbar,
"roster_scrolledwindow", &sw,
NULL);
g_free (filename);
+ gtk_container_add (GTK_CONTAINER (window), priv->main_vbox);
+ gtk_widget_show (priv->main_vbox);
+
empathy_builder_connect (gui, window,
- "main_window", "destroy", main_window_destroy_cb,
"main_window", "key-press-event", main_window_key_press_event_cb,
"chat_quit", "activate", main_window_chat_quit_cb,
"chat_new_message", "activate", main_window_chat_new_message_cb,
@@ -1460,133 +1518,134 @@ empathy_main_window_show (void)
/* Set up connection related widgets. */
main_window_connection_items_setup (window, gui);
- g_object_ref (window->ui_manager);
+ g_object_ref (priv->ui_manager);
g_object_unref (gui);
#if !HAVE_LIBCHAMPLAIN
gtk_action_set_visible (show_map_widget, FALSE);
#endif
- window->account_manager = tp_account_manager_dup ();
+ priv->account_manager = tp_account_manager_dup ();
- tp_account_manager_prepare_async (window->account_manager, NULL,
+ tp_account_manager_prepare_async (priv->account_manager, NULL,
account_manager_prepared_cb, window);
- window->errors = g_hash_table_new_full (g_direct_hash,
- g_direct_equal,
- g_object_unref,
- NULL);
+ priv->errors = g_hash_table_new_full (g_direct_hash,
+ g_direct_equal,
+ g_object_unref,
+ NULL);
- window->status_changed_handlers = g_hash_table_new_full (g_direct_hash,
- g_direct_equal,
- NULL,
- NULL);
+ priv->status_changed_handlers = g_hash_table_new_full (g_direct_hash,
+ g_direct_equal,
+ NULL,
+ NULL);
/* Set up menu */
main_window_favorite_chatroom_menu_setup (window);
- window->edit_context = gtk_ui_manager_get_widget (window->ui_manager,
+ priv->edit_context = gtk_ui_manager_get_widget (priv->ui_manager,
"/menubar/edit/edit_context");
- window->edit_context_separator = gtk_ui_manager_get_widget (window->ui_manager,
+ priv->edit_context_separator = gtk_ui_manager_get_widget (
+ priv->ui_manager,
"/menubar/edit/edit_context_separator");
- gtk_widget_hide (window->edit_context);
- gtk_widget_hide (window->edit_context_separator);
+ gtk_widget_hide (priv->edit_context);
+ gtk_widget_hide (priv->edit_context_separator);
/* Set up contact list. */
empathy_status_presets_get_all ();
/* Set up presence chooser */
- window->presence_chooser = empathy_presence_chooser_new ();
- gtk_widget_show (window->presence_chooser);
+ priv->presence_chooser = empathy_presence_chooser_new ();
+ gtk_widget_show (priv->presence_chooser);
item = gtk_tool_item_new ();
gtk_widget_show (GTK_WIDGET (item));
- gtk_container_add (GTK_CONTAINER (item), window->presence_chooser);
+ gtk_container_add (GTK_CONTAINER (item), priv->presence_chooser);
gtk_tool_item_set_is_important (item, TRUE);
gtk_tool_item_set_expand (item, TRUE);
- gtk_toolbar_insert (GTK_TOOLBAR (window->presence_toolbar), item, -1);
+ gtk_toolbar_insert (GTK_TOOLBAR (priv->presence_toolbar), item, -1);
/* Set up the throbber */
- window->throbber = gtk_spinner_new ();
- gtk_widget_set_size_request (window->throbber, 16, -1);
- gtk_widget_set_tooltip_text (window->throbber, _("Show and edit accounts"));
- gtk_widget_set_has_window (GTK_WIDGET (window->throbber), TRUE);
- gtk_widget_set_events (window->throbber, GDK_BUTTON_PRESS_MASK);
- g_signal_connect (window->throbber, "button-press-event",
+ priv->throbber = gtk_spinner_new ();
+ gtk_widget_set_size_request (priv->throbber, 16, -1);
+ gtk_widget_set_tooltip_text (priv->throbber, _("Show and edit accounts"));
+ gtk_widget_set_has_window (GTK_WIDGET (priv->throbber), TRUE);
+ gtk_widget_set_events (priv->throbber, GDK_BUTTON_PRESS_MASK);
+ g_signal_connect (priv->throbber, "button-press-event",
G_CALLBACK (main_window_throbber_button_press_event_cb),
window);
- gtk_widget_show (window->throbber);
+ gtk_widget_show (priv->throbber);
item = gtk_tool_item_new ();
gtk_container_set_border_width (GTK_CONTAINER (item), 6);
- gtk_toolbar_insert (GTK_TOOLBAR (window->presence_toolbar), item, -1);
- gtk_container_add (GTK_CONTAINER (item), window->throbber);
- window->throbber_tool_item = GTK_WIDGET (item);
+ gtk_toolbar_insert (GTK_TOOLBAR (priv->presence_toolbar), item, -1);
+ gtk_container_add (GTK_CONTAINER (item), priv->throbber);
+ priv->throbber_tool_item = GTK_WIDGET (item);
list_iface = EMPATHY_CONTACT_LIST (empathy_contact_manager_dup_singleton ());
- window->list_store = empathy_contact_list_store_new (list_iface);
- window->list_view = empathy_contact_list_view_new (window->list_store,
- EMPATHY_CONTACT_LIST_FEATURE_ALL,
- EMPATHY_CONTACT_FEATURE_ALL);
+ priv->list_store = empathy_contact_list_store_new (list_iface);
+ priv->list_view = empathy_contact_list_view_new (priv->list_store,
+ EMPATHY_CONTACT_LIST_FEATURE_ALL,
+ EMPATHY_CONTACT_FEATURE_ALL);
- window->butterfly_log_migration_members_changed_id = g_signal_connect (
+ priv->butterfly_log_migration_members_changed_id = g_signal_connect (
list_iface, "members-changed",
G_CALLBACK (main_window_members_changed_cb), window);
g_object_unref (list_iface);
- gtk_widget_show (GTK_WIDGET (window->list_view));
+ gtk_widget_show (GTK_WIDGET (priv->list_view));
gtk_container_add (GTK_CONTAINER (sw),
- GTK_WIDGET (window->list_view));
- g_signal_connect (window->list_view, "row-activated",
+ GTK_WIDGET (priv->list_view));
+ g_signal_connect (priv->list_view, "row-activated",
G_CALLBACK (main_window_row_activated_cb),
window);
/* Set up search bar */
- window->search_bar = empathy_live_search_new (
- GTK_WIDGET (window->list_view));
- empathy_contact_list_view_set_live_search (window->list_view,
- EMPATHY_LIVE_SEARCH (window->search_bar));
- gtk_box_pack_start (GTK_BOX (window->main_vbox), window->search_bar,
+ priv->search_bar = empathy_live_search_new (
+ GTK_WIDGET (priv->list_view));
+ empathy_contact_list_view_set_live_search (priv->list_view,
+ EMPATHY_LIVE_SEARCH (priv->search_bar));
+ gtk_box_pack_start (GTK_BOX (priv->main_vbox), priv->search_bar,
FALSE, TRUE, 0);
- g_signal_connect_swapped (window->window, "map",
- G_CALLBACK (gtk_widget_grab_focus), window->list_view);
+ g_signal_connect_swapped (window, "map",
+ G_CALLBACK (gtk_widget_grab_focus), priv->list_view);
/* Load user-defined accelerators. */
main_window_accels_load ();
/* Set window size. */
- empathy_geometry_bind (GTK_WINDOW (window->window), GEOMETRY_NAME);
+ empathy_geometry_bind (GTK_WINDOW (window), GEOMETRY_NAME);
/* Enable event handling */
- window->event_manager = empathy_event_manager_dup_singleton ();
- g_signal_connect (window->event_manager, "event-added",
+ priv->event_manager = empathy_event_manager_dup_singleton ();
+ g_signal_connect (priv->event_manager, "event-added",
G_CALLBACK (main_window_event_added_cb),
window);
- g_signal_connect (window->event_manager, "event-removed",
+ g_signal_connect (priv->event_manager, "event-removed",
G_CALLBACK (main_window_event_removed_cb),
window);
- g_signal_connect (window->account_manager, "account-validity-changed",
+ g_signal_connect (priv->account_manager, "account-validity-changed",
G_CALLBACK (main_window_account_validity_changed_cb),
window);
- g_signal_connect (window->account_manager, "account-removed",
+ g_signal_connect (priv->account_manager, "account-removed",
G_CALLBACK (main_window_account_removed_cb),
window);
- g_signal_connect (window->account_manager, "account-disabled",
+ g_signal_connect (priv->account_manager, "account-disabled",
G_CALLBACK (main_window_account_disabled_cb),
window);
- l = empathy_event_manager_get_events (window->event_manager);
+ l = empathy_event_manager_get_events (priv->event_manager);
while (l) {
- main_window_event_added_cb (window->event_manager,
+ main_window_event_added_cb (priv->event_manager,
l->data, window);
l = l->next;
}
/* Show offline ? */
- show_offline = g_settings_get_boolean (window->gsettings_ui,
+ show_offline = g_settings_get_boolean (priv->gsettings_ui,
EMPATHY_PREFS_UI_SHOW_OFFLINE);
- g_signal_connect (window->gsettings_ui,
+ g_signal_connect (priv->gsettings_ui,
"changed::" EMPATHY_PREFS_UI_SHOW_OFFLINE,
G_CALLBACK (main_window_notify_show_offline_cb),
show_offline_widget);
@@ -1594,39 +1653,42 @@ empathy_main_window_show (void)
gtk_toggle_action_set_active (show_offline_widget, show_offline);
/* Show protocol ? */
- g_signal_connect (window->gsettings_ui,
+ g_signal_connect (priv->gsettings_ui,
"changed::" EMPATHY_PREFS_UI_SHOW_PROTOCOLS,
G_CALLBACK (main_window_notify_show_protocols_cb),
window);
- main_window_notify_show_protocols_cb (window->gsettings_ui,
+ main_window_notify_show_protocols_cb (priv->gsettings_ui,
EMPATHY_PREFS_UI_SHOW_PROTOCOLS,
window);
/* Sort by name / by status ? */
- g_signal_connect (window->gsettings_contacts,
+ g_signal_connect (priv->gsettings_contacts,
"changed::" EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM,
G_CALLBACK (main_window_notify_sort_contact_cb),
window);
- main_window_notify_sort_contact_cb (window->gsettings_contacts,
+ main_window_notify_sort_contact_cb (priv->gsettings_contacts,
EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM,
window);
/* Contacts list size */
- g_signal_connect (window->gsettings_ui,
+ g_signal_connect (priv->gsettings_ui,
"changed::" EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST,
G_CALLBACK (main_window_notify_contact_list_size_cb),
window);
- g_signal_connect (window->gsettings_ui,
+ g_signal_connect (priv->gsettings_ui,
"changed::" EMPATHY_PREFS_UI_SHOW_AVATARS,
G_CALLBACK (main_window_notify_contact_list_size_cb),
window);
- main_window_notify_contact_list_size_cb (window->gsettings_ui,
+ main_window_notify_contact_list_size_cb (priv->gsettings_ui,
EMPATHY_PREFS_UI_SHOW_AVATARS,
window);
-
- return window->window;
}
+GtkWidget *
+empathy_main_window_dup (void)
+{
+ return g_object_new (EMPATHY_TYPE_MAIN_WINDOW, NULL);
+}