static void roomlist_selection_changed(GntWidget *widget, gpointer old, gpointer current, gpointer null) { GList *iter, *field; PurpleRoomlistRoom *room = current; GntTextView *tv = GNT_TEXT_VIEW(froomlist.details); gboolean first = TRUE; gnt_text_view_clear(tv); if (!room) return; for (iter = purple_roomlist_room_get_fields(room), field = purple_roomlist_get_fields(froomlist.roomlist); iter && field; iter = iter->next, field = field->next) { PurpleRoomlistField *f = field->data; char *label = NULL; if (purple_roomlist_field_get_hidden(f)) { continue; } if (!first) gnt_text_view_append_text_with_flags(tv, "\n", GNT_TEXT_FLAG_NORMAL); gnt_text_view_append_text_with_flags(tv, purple_roomlist_field_get_label(f), GNT_TEXT_FLAG_BOLD); gnt_text_view_append_text_with_flags(tv, ": ", GNT_TEXT_FLAG_BOLD); switch (purple_roomlist_field_get_type(f)) { case PURPLE_ROOMLIST_FIELD_BOOL: label = g_strdup(iter->data ? "True" : "False"); break; case PURPLE_ROOMLIST_FIELD_INT: label = g_strdup_printf("%d", (int)iter->data); break; case PURPLE_ROOMLIST_FIELD_STRING: label = g_strdup(iter->data); break; } gnt_text_view_append_text_with_flags(tv, label, GNT_TEXT_FLAG_NORMAL); g_free(label); first = FALSE; } if (purple_roomlist_room_get_type(room) == PURPLE_ROOMLIST_ROOMTYPE_CATEGORY) { if (!first) gnt_text_view_append_text_with_flags(tv, "\n", GNT_TEXT_FLAG_NORMAL); gnt_text_view_append_text_with_flags(tv, _("Hit 'Enter' to find more rooms of this category."), GNT_TEXT_FLAG_NORMAL); } }
void campfire_join_chat_after_room_query(CampfireConn *campfire, gchar *room_name) { /*alternate when not using "Room List" */ /* @TODO: error checking may be too simple */ GList *fields; GList *rooms; PurpleRoomlistRoom *r; PurpleRoomlistField *f; gsize i; gsize list_size; gsize id_field_index = 0; gboolean found = FALSE; gchar *id = NULL; gchar *name = NULL; gboolean room_name_error = FALSE; fields = purple_roomlist_get_fields(campfire->roomlist); g_list_foreach(fields, campfire_print_field_name, NULL); list_size = g_list_length(fields); /* find "id" field */ for (i = 0; i < list_size; i++) { f = g_list_nth_data(fields, i); purple_debug_info("campfire", "field name: %s\n", f->name); if (strcmp("id", f->name) == 0) { id_field_index = i; found = TRUE; break; } } if (!found) { room_name_error = TRUE; purple_notify_message(campfire->gc, PURPLE_NOTIFY_MSG_ERROR, "campfire error", "couldn't find 'id' field in roomlist.", NULL, NULL, NULL); } else { found = FALSE; } rooms = campfire->roomlist->rooms; list_size = g_list_length(rooms); purple_debug_info("campfire", "join debug 6\n"); /* find typed/chosen room name in available room names */ for (i = 0; i < list_size; i++) { r = (PurpleRoomlistRoom *)g_list_nth_data(rooms, i); if (strcmp(r->name, room_name) == 0) { purple_debug_info("campfire", "room found\n"); purple_debug_info("campfire", "room desired: %s\n", room_name); purple_debug_info("campfire", "room found: %s\n", r->name); id = g_list_nth_data(r->fields, id_field_index); name = r->name; found = TRUE; break; } } if (!found) { room_name_error = TRUE; purple_notify_message(campfire->gc, PURPLE_NOTIFY_MSG_ERROR, "campfire error", "couldn't find room name in roomlist.", room_name, NULL, NULL); } if (!room_name_error) { purple_debug_info("campfire", "trying to JOIN CHAT room id %s\n", id); campfire_room_join(campfire, id, name); } }