X-Git-Url: http://cgit.babelmonkeys.de/?p=jubjub.git;a=blobdiff_plain;f=src%2Fgui%2Fgtk%2FJubGtkRosterUI.m;h=b3899e34a1d750edf1e57d0d6961d4a8f4baf326;hp=7c81f9552f36e0728276ea3727b98e129162ebff;hb=77e1d677232eeab371a8ac2da1e542bc62bbaea6;hpb=73956f28f94e6137684150bf5d311826dae7f35a diff --git a/src/gui/gtk/JubGtkRosterUI.m b/src/gui/gtk/JubGtkRosterUI.m index 7c81f95..b3899e3 100644 --- a/src/gui/gtk/JubGtkRosterUI.m +++ b/src/gui/gtk/JubGtkRosterUI.m @@ -3,7 +3,9 @@ #import "JubGtkChatUI.h" #import "JubGtkHelper.h" -static gboolean roster_row_activated(GtkTreeView *tree_view, GtkTreePath *path, +#include + +static void roster_row_activated(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer data) { JubGtkRosterUI *roster = data; @@ -18,7 +20,7 @@ static gboolean roster_row_activated(GtkTreeView *tree_view, GtkTreePath *path, gtk_tree_model_get(tree_model, &row_iter, 1, &jid_s, -1); // This was a group row - if (!jid_s) return TRUE; + if (!jid_s) return; pool = [OFAutoreleasePool new]; jid = [XMPPJID JIDWithString: [OFString stringWithUTF8String: jid_s]]; @@ -27,8 +29,27 @@ static gboolean roster_row_activated(GtkTreeView *tree_view, GtkTreePath *path, withObject: jid waitUntilDone: NO]; [pool release]; +} + +static void presence_changed(GtkComboBox *combo_box, gpointer data) +{ + XMPPPresence *pres; + XMPPConnection *connection = data; + OFAutoreleasePool *pool = [OFAutoreleasePool new]; + + const char *status = gtk_combo_box_get_active_id(combo_box); + + if (!strcmp(status, "unavailable")) + pres = [XMPPPresence presenceWithType: @"unavailable"]; + else { + pres = [XMPPPresence presence]; + if (strcmp(status, "available")) + [pres addShow: @(status)]; + } + + [connection sendStanza: pres]; - return TRUE; + [pool release]; } static gboolean filter_roster_by_presence(GtkTreeModel *model, @@ -59,13 +80,14 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model, } @implementation JubGtkRosterUI -- initWithBuilder: (GtkBuilder*)builder_ - connection: (XMPPConnection*)connection_ +- initWithConnection: (XMPPConnection*)connection_ { self = [super init]; @try { GtkTreeView *roster_view; + GtkComboBox *presence_combo; + GtkBuilder *builder; groupMap = [[OFMapTable alloc] initWithKeyFunctions: keyFunctions @@ -75,7 +97,14 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model, presences = [[OFCountedSet alloc] init]; connection = [connection_ retain]; - builder = g_object_ref(builder_); + builder = gtk_builder_new(); + gtk_builder_add_from_file(builder, "data/gtk/roster.ui", NULL); + gtk_builder_connect_signals(builder, NULL); + + roster_window = + GTK_WIDGET(gtk_builder_get_object(builder, "RosterWindow")); + + gtk_widget_show(roster_window); roster_model = GTK_TREE_STORE(gtk_builder_get_object(builder, "RosterTreeStore")); @@ -91,6 +120,14 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model, g_signal_connect(roster_view, "row_activated", G_CALLBACK(roster_row_activated), self); + + presence_combo = GTK_COMBO_BOX(gtk_builder_get_object(builder, + "PresenceComboBox")); + + g_signal_connect(presence_combo, "changed", + G_CALLBACK(presence_changed), connection); + + g_object_unref(G_OBJECT(builder)); } @catch (id e) { [self release]; @throw e; @@ -103,16 +140,11 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model, { [groupMap release]; [contactMap release]; + [chatMap release]; [presences release]; [connection release]; - if (roster_model) - g_object_unref(roster_model); - - if (roster_filter) - g_object_unref(roster_filter); - - g_object_unref(builder); + gtk_widget_destroy(roster_window); [super dealloc]; }