#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"
#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,
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,
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);
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);
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,
"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,
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));
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);
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);
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);
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);
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;
}
g_list_free (window->widgets_disconnected);
g_object_unref (window->tooltips);
+ g_object_unref (window->mc);
g_free (window);
}
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)
main_window_edit_accounts_cb (GtkWidget *widget,
EmpathyMainWindow *window)
{
- //gossip_accounts_dialog_show (NULL);
+ gossip_accounts_dialog_show ();
}
static void
main_window_edit_preferences_cb (GtkWidget *widget,
EmpathyMainWindow *window)
{
- //gossip_preferences_show ();
+ gossip_preferences_show ();
}
static void
return FALSE;
}
- //gossip_accounts_dialog_show (NULL);
+ gossip_accounts_dialog_show ();
return FALSE;
}
#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
}
}
+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);
+ }
+ }
+}
+