+#import <ObjXMPP/namespaces.h>
+#include <string.h>
+
#import "JubGtkRosterUI.h"
#import "JubGObjectMap.h"
#import "JubGtkChatUI.h"
#import "JubGtkHelper.h"
-#include <string.h>
-
static void roster_row_activated(GtkTreeView *tree_view, GtkTreePath *path,
GtkTreeViewColumn *column, gpointer data)
{
@try {
GtkTreeView *roster_view;
- GtkComboBox *presence_combo;
GtkBuilder *builder;
groupMap = [[OFMapTable alloc]
presence_combo = GTK_COMBO_BOX(gtk_builder_get_object(builder,
"PresenceComboBox"));
- g_signal_connect(presence_combo, "changed",
- G_CALLBACK(presence_changed), connection);
+ presence_combo_changed_handler_id =
+ g_signal_connect(presence_combo, "changed",
+ G_CALLBACK(presence_changed), connection);
g_object_unref(G_OBJECT(builder));
} @catch (id e) {
}
}
+- (void)client: (JubChatClient*)client
+ didChangePresence: (XMPPPresence*)presence
+{
+ OFString *tooltip = @"";
+ OFString *show =
+ [[presence elementForName: @"show"
+ namespace: XMPP_NS_CLIENT] stringValue];
+ OFString *status =
+ [[presence elementForName: @"status"
+ namespace: XMPP_NS_CLIENT] stringValue];
+
+ if (status != nil)
+ tooltip = [@"<b>Status:</b> " stringByAppendingString: status];
+
+ g_idle_add_block(^{
+ // Block the PresenceComboBox's changed handler, so it doesn't
+ // fire and resend presence
+ g_signal_handler_block(presence_combo,
+ presence_combo_changed_handler_id);
+
+ if ([presence.type isEqual: @"unavailable"])
+ gtk_combo_box_set_active_id(presence_combo,
+ "unavailable");
+ else if (show == nil)
+ gtk_combo_box_set_active_id(presence_combo,
+ "available");
+ else
+ gtk_combo_box_set_active_id(presence_combo,
+ [show UTF8String]);
+
+ // Unblock the changed handler
+ g_signal_handler_unblock(presence_combo,
+ presence_combo_changed_handler_id);
+
+ gtk_widget_set_tooltip_markup(GTK_WIDGET(presence_combo),
+ [tooltip UTF8String]);
+ });
+}
@end