]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-main-window.c
[darcs-to-svn @ New object: EmpathyStatusIcon]
[empathy.git] / libempathy-gtk / empathy-main-window.c
index 257ade9bd9380e1ba042407e172bd5021d31cab4..6394a6498eb53ceee08c1f0ee6446678c7b2bf9e 100644 (file)
 #include <glade/glade.h>
 #include <glib/gi18n.h>
 
+#include <libtelepathy/tp-helpers.h>
+#include <libmissioncontrol/mission-control.h>
+
 #include <libempathy/gossip-conf.h>
 #include <libempathy/gossip-contact.h>
 #include <libempathy/gossip-debug.h>
+#include <libempathy/gossip-utils.h>
 
 #include "empathy-main-window.h"
 #include "ephy-spinner.h"
@@ -39,8 +43,9 @@
 #include "gossip-status-presets.h"
 #include "gossip-geometry.h"
 #include "gossip-preferences.h"
+#include "gossip-accounts-dialog.h"
 
-#define DEBUG_DOMAIN "EmpathyMainWindow"
+#define DEBUG_DOMAIN "MainWindow"
 
 /* Minimum width of roster window if something goes wrong. */
 #define MIN_WIDTH 50
 #define GEOMETRY_NAME "main-window"
 
 typedef struct {
-       GossipContactList     *contact_list;
+       GossipContactList *contact_list;
+       MissionControl    *mc;
 
        /* Main widgets */
-       GtkWidget             *window;
-       GtkWidget             *main_vbox;
+       GtkWidget         *window;
+       GtkWidget         *main_vbox;
 
        /* Tooltips for all widgets */
-       GtkTooltips           *tooltips;
+       GtkTooltips       *tooltips;
 
        /* Menu widgets */
-       GtkWidget             *chat_connect;
-       GtkWidget             *chat_disconnect;
-       GtkWidget             *chat_search;
-       GtkWidget             *room;
-       GtkWidget             *room_menu;
-       GtkWidget             *room_sep;
-       GtkWidget             *room_join_favorites;
-       GtkWidget             *edit_context;
-       GtkWidget             *edit_context_separator;
+       GtkWidget         *room;
+       GtkWidget         *room_menu;
+       GtkWidget         *room_sep;
+       GtkWidget         *room_join_favorites;
+       GtkWidget         *edit_context;
+       GtkWidget         *edit_context_separator;
 
        /* Throbber */
-       GtkWidget             *throbber;
+       GtkWidget         *throbber;
 
        /* Widgets that are enabled when we're connected/disconnected */
-       GList                 *widgets_connected;
-       GList                 *widgets_disconnected;
+       GList             *widgets_connected;
+       GList             *widgets_disconnected;
 
        /* Status popup */
-       GtkWidget             *presence_toolbar;
-       GtkWidget             *presence_chooser;
+       GtkWidget         *presence_toolbar;
+       GtkWidget         *presence_chooser;
 
        /* Misc */
-       guint                  size_timeout_id;
+       guint              size_timeout_id;
 } EmpathyMainWindow;
 
 static void     main_window_destroy_cb                     (GtkWidget           *widget,
@@ -95,12 +98,6 @@ static void     main_window_destroy_cb                     (GtkWidget
 static void     main_window_favorite_chatroom_menu_setup   (void);
 static void     main_window_chat_quit_cb                   (GtkWidget           *widget,
                                                            EmpathyMainWindow   *window);
-static void     main_window_chat_connect_cb                (GtkWidget           *widget,
-                                                           EmpathyMainWindow   *window);
-static void     main_window_chat_disconnect_cb             (GtkWidget           *widget,
-                                                           EmpathyMainWindow   *window);
-static void     main_window_chat_search_cb                 (GtkWidget           *widget,
-                                                           EmpathyMainWindow   *window);
 static void     main_window_chat_new_message_cb            (GtkWidget           *widget,
                                                            EmpathyMainWindow   *window);
 static void     main_window_chat_history_cb                (GtkWidget           *widget,
@@ -136,8 +133,11 @@ static void     main_window_accels_save                    (void);
 static void     main_window_connection_items_setup         (EmpathyMainWindow   *window,
                                                            GladeXML            *glade);
 //static void     main_window_connection_items_update        (void);
+static void     main_window_presence_changed_cb            (MissionControl      *mc,
+                                                           McPresence           state,
+                                                           EmpathyMainWindow   *window);
 static void     main_window_presence_chooser_changed_cb    (GtkWidget           *chooser,
-                                                           GossipPresenceState  state,
+                                                           McPresence           state,
                                                            const gchar         *status,
                                                            EmpathyMainWindow   *window);
 static gboolean main_window_configure_event_timeout_cb     (EmpathyMainWindow   *window);
@@ -153,22 +153,31 @@ static void     main_window_notify_show_avatars_cb         (GossipConf
 static void     main_window_notify_compact_contact_list_cb (GossipConf          *conf,
                                                            const gchar         *key,
                                                            EmpathyMainWindow   *window);
+static void     main_window_notify_sort_criterium_cb       (GossipConf          *conf,
+                                                           const gchar         *key,
+                                                           EmpathyMainWindow   *window);
 
 GtkWidget *
-empathy_main_window_new (void)
-{
-       EmpathyMainWindow *window;
-       GladeXML          *glade;
-       GossipConf        *conf;
-       GtkWidget         *sw;
-       GtkWidget         *show_offline_widget;
-       GtkWidget         *ebox;
-       GtkToolItem       *item;
-       gchar             *str;
-       gboolean           show_offline;
-       gboolean           show_avatars;
-       gboolean           compact_contact_list;
-       gint               x, y, w, h;
+empathy_main_window_show (void)
+{
+       static EmpathyMainWindow *window = NULL;
+       GladeXML                 *glade;
+       GossipConf               *conf;
+       GtkWidget                *sw;
+       GtkWidget                *show_offline_widget;
+       GtkWidget                *ebox;
+       GtkToolItem              *item;
+       gchar                    *str;
+       McPresence                state;
+       gboolean                  show_offline;
+       gboolean                  show_avatars;
+       gboolean                  compact_contact_list;
+       gint                      x, y, w, h;
+
+       if (window) {
+               gtk_window_present (GTK_WINDOW (window->window));
+               return window->window;
+       }
 
        window = g_new0 (EmpathyMainWindow, 1);
 
@@ -178,9 +187,6 @@ empathy_main_window_new (void)
                                       NULL,
                                       "main_window", &window->window,
                                       "main_vbox", &window->main_vbox,
-                                      "chat_connect", &window->chat_connect,
-                                      "chat_disconnect", &window->chat_disconnect,
-                                      "chat_search", &window->chat_search,
                                       "chat_show_offline", &show_offline_widget,
                                       "room", &window->room,
                                       "room_sep", &window->room_sep,
@@ -196,9 +202,6 @@ empathy_main_window_new (void)
                              "main_window", "destroy", main_window_destroy_cb,
                              "main_window", "configure_event", main_window_configure_event_cb,
                              "chat_quit", "activate", main_window_chat_quit_cb,
-                             "chat_connect", "activate", main_window_chat_connect_cb,
-                             "chat_disconnect", "activate", main_window_chat_disconnect_cb,
-                             "chat_search", "activate", main_window_chat_search_cb,
                              "chat_new_message", "activate", main_window_chat_new_message_cb,
                              "chat_history", "activate", main_window_chat_history_cb,
                              "room_join_new", "activate", main_window_room_join_new_cb,
@@ -227,10 +230,21 @@ empathy_main_window_new (void)
        gtk_widget_hide (window->edit_context_separator);
 
        /* Set up presence chooser */
+       window->mc = mission_control_new (tp_get_bus ());
        window->presence_chooser = gossip_presence_chooser_new ();
-       gtk_widget_show (window->presence_chooser);
        gossip_presence_chooser_set_flash_interval (GOSSIP_PRESENCE_CHOOSER (window->presence_chooser),
                                                    FLASH_TIMEOUT);
+       dbus_g_proxy_connect_signal (DBUS_G_PROXY (window->mc),
+                                    "PresenceStatusActual",
+                                    G_CALLBACK (main_window_presence_changed_cb),
+                                    window, NULL);
+       g_signal_connect (window->presence_chooser,
+                         "changed",
+                         G_CALLBACK (main_window_presence_chooser_changed_cb),
+                         window);
+       state = mission_control_get_presence_actual (window->mc, NULL);
+       main_window_presence_changed_cb (window->mc, state, window);
+       gtk_widget_show (window->presence_chooser);
 
        item = gtk_tool_item_new ();
        gtk_widget_show (GTK_WIDGET (item));
@@ -239,11 +253,6 @@ empathy_main_window_new (void)
        gtk_tool_item_set_expand (item, TRUE);
        gtk_toolbar_insert (GTK_TOOLBAR (window->presence_toolbar), item, -1);
 
-       g_signal_connect (window->presence_chooser,
-                         "changed",
-                         G_CALLBACK (main_window_presence_chooser_changed_cb),
-                         window);
-
        window->widgets_connected = g_list_prepend (window->widgets_connected,
                                                  window->presence_chooser);
 
@@ -299,8 +308,9 @@ empathy_main_window_new (void)
                gtk_window_move (GTK_WINDOW (window->window), x, y);
        }
 
-       /* Get preferences */
        conf = gossip_conf_get ();
+       
+       /* Show offline ? */
        gossip_conf_get_bool (conf,
                              GOSSIP_PREFS_CONTACTS_SHOW_OFFLINE,
                              &show_offline);
@@ -312,6 +322,7 @@ empathy_main_window_new (void)
        gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (show_offline_widget),
                                        show_offline);
 
+       /* Show avatars ? */
        gossip_conf_get_bool (conf,
                              GOSSIP_PREFS_UI_SHOW_AVATARS,
                              &show_avatars);
@@ -319,6 +330,9 @@ empathy_main_window_new (void)
                                GOSSIP_PREFS_UI_SHOW_AVATARS,
                                (GossipConfNotifyFunc) main_window_notify_show_avatars_cb,
                                window);
+       gossip_contact_list_set_show_avatars (window->contact_list, show_avatars);
+
+       /* Is compact ? */
        gossip_conf_get_bool (conf,
                              GOSSIP_PREFS_UI_COMPACT_CONTACT_LIST,
                              &compact_contact_list);
@@ -326,11 +340,18 @@ empathy_main_window_new (void)
                                GOSSIP_PREFS_UI_COMPACT_CONTACT_LIST,
                                (GossipConfNotifyFunc) main_window_notify_compact_contact_list_cb,
                                window);
+       gossip_contact_list_set_is_compact (window->contact_list, compact_contact_list);
+
+       /* Sort criterium */
+       gossip_conf_notify_add (conf,
+                               GOSSIP_PREFS_CONTACTS_SORT_CRITERIUM,
+                               (GossipConfNotifyFunc) main_window_notify_sort_criterium_cb,
+                               window);
+       main_window_notify_sort_criterium_cb (conf,
+                                             GOSSIP_PREFS_CONTACTS_SORT_CRITERIUM,
+                                             window);
 
-       g_object_set (window->contact_list,
-                     "show-avatars", show_avatars,
-                     "is-compact", compact_contact_list,
-                     NULL);
+       gtk_widget_show (window->window);
 
        return window->window;
 }
@@ -350,6 +371,7 @@ main_window_destroy_cb (GtkWidget         *widget,
        g_list_free (window->widgets_disconnected);
 
        g_object_unref (window->tooltips);
+       g_object_unref (window->mc);
 
        g_free (window);
 }
@@ -366,24 +388,6 @@ main_window_chat_quit_cb (GtkWidget         *widget,
        gtk_widget_destroy (window->window);
 }
 
-static void
-main_window_chat_connect_cb (GtkWidget         *widget,
-                            EmpathyMainWindow *window)
-{
-}
-
-static void
-main_window_chat_disconnect_cb (GtkWidget         *widget,
-                               EmpathyMainWindow *window)
-{
-}
-
-static void
-main_window_chat_search_cb (GtkWidget         *widget,
-                           EmpathyMainWindow *window)
-{
-}
-
 static void
 main_window_chat_new_message_cb (GtkWidget         *widget,
                                 EmpathyMainWindow *window)
@@ -509,7 +513,7 @@ static void
 main_window_edit_accounts_cb (GtkWidget         *widget,
                              EmpathyMainWindow *window)
 {
-       //gossip_accounts_dialog_show (NULL);
+       gossip_accounts_dialog_show ();
 }
 
 static void
@@ -523,7 +527,7 @@ static void
 main_window_edit_preferences_cb (GtkWidget         *widget,
                                 EmpathyMainWindow *window)
 {
-       //gossip_preferences_show ();
+       gossip_preferences_show ();
 }
 
 static void
@@ -550,7 +554,7 @@ main_window_throbber_button_press_event_cb (GtkWidget      *throbber_ebox,
                return FALSE;
        }
 
-       //gossip_accounts_dialog_show (NULL);
+       gossip_accounts_dialog_show ();
 
        return FALSE;
 }
@@ -755,12 +759,36 @@ main_window_connection_items_update (void)
 #endif
 
 static void
-main_window_presence_chooser_changed_cb (GtkWidget           *chooser,
-                                        GossipPresenceState  state,
-                                        const gchar         *status,
-                                        EmpathyMainWindow   *window)
+main_window_presence_changed_cb (MissionControl    *mc,
+                                McPresence         state,
+                                EmpathyMainWindow *window)
+{
+       gchar *status;
+
+       gossip_debug (DEBUG_DOMAIN, "presence changed to %d", state);
+
+       status = mission_control_get_presence_message_actual (window->mc, NULL);
+
+       if (G_STR_EMPTY (status)) {
+               g_free (status);
+               status = g_strdup (gossip_presence_state_get_default_status (state));
+       }
+
+       gossip_presence_chooser_set_state (GOSSIP_PRESENCE_CHOOSER (window->presence_chooser),
+                                          state);
+       gossip_presence_chooser_set_status (GOSSIP_PRESENCE_CHOOSER (window->presence_chooser),
+                                           status);
+       g_free (status);
+}
+
+static void
+main_window_presence_chooser_changed_cb (GtkWidget         *chooser,
+                                        McPresence         state,
+                                        const gchar       *status,
+                                        EmpathyMainWindow *window)
 {
        gossip_status_presets_set_default (state, status);
+       mission_control_set_presence (window->mc, state, status, NULL, NULL);
 }
 
 static gboolean
@@ -833,3 +861,26 @@ main_window_notify_compact_contact_list_cb (GossipConf        *conf,
        }
 }
 
+static void
+main_window_notify_sort_criterium_cb (GossipConf        *conf,
+                                     const gchar       *key,
+                                     EmpathyMainWindow *window)
+{
+       gchar *str = NULL;
+
+       if (gossip_conf_get_string (conf, key, &str)) {
+               GType       type;
+               GEnumClass *enum_class;
+               GEnumValue *enum_value;
+
+               type = gossip_contact_list_sort_get_type ();
+               enum_class = G_ENUM_CLASS (g_type_class_peek (type));
+               enum_value = g_enum_get_value_by_nick (enum_class, str);
+
+               if (enum_value) {
+                       gossip_contact_list_set_sort_criterium (window->contact_list, 
+                                                               enum_value->value);
+               }
+       }
+}
+