static PurpleCmdRet lastlog_cb(PurpleConversation *conv, const char *cmd, char **args, char **error, gpointer null) { FinchConv *ggconv = FINCH_CONV(conv); char **strings = g_strsplit(GNT_TEXT_VIEW(ggconv->tv)->string->str, "\n", 0); GntWidget *win, *tv; int i, j; win = gnt_window_new(); gnt_box_set_title(GNT_BOX(win), _("Lastlog")); tv = gnt_text_view_new(); gnt_box_add_widget(GNT_BOX(win), tv); gnt_widget_show(win); for (i = 0; strings[i]; i++) { if (strstr(strings[i], args[0]) != NULL) { char **finds = g_strsplit(strings[i], args[0], 0); for (j = 0; finds[j]; j++) { if (j) gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(tv), args[0], GNT_TEXT_FLAG_BOLD); gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(tv), finds[j], GNT_TEXT_FLAG_NORMAL); } g_strfreev(finds); gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(tv), "\n", GNT_TEXT_FLAG_NORMAL); } } g_signal_connect(G_OBJECT(win), "key_pressed", G_CALLBACK(window_kpress_cb), tv); g_strfreev(strings); return PURPLE_CMD_RET_OK; }
static void gnt_text_view_reflow(GntTextView *view) { /* This is pretty ugly, and inefficient. Someone do something about it. */ GntTextLine *line; GList *back, *iter, *list; GString *string; int pos = 0; /* no. of 'real' lines */ list = view->list; while (list->prev) { line = list->data; if (!line->soft) pos++; list = list->prev; } back = g_list_last(view->list); view->list = NULL; string = view->string; view->string = NULL; reset_text_view(view); view->string = g_string_set_size(view->string, string->len); view->string->len = 0; GNT_WIDGET_SET_FLAGS(GNT_WIDGET(view), GNT_WIDGET_DRAWING); for (; back; back = back->prev) { line = back->data; if (back->next && !line->soft) { gnt_text_view_append_text_with_flags(view, "\n", GNT_TEXT_FLAG_NORMAL); } for (iter = line->segments; iter; iter = iter->next) { GntTextSegment *seg = iter->data; char *start = string->str + seg->start; char *end = string->str + seg->end; char back = *end; *end = '\0'; gnt_text_view_append_text_with_flags(view, start, seg->tvflag); *end = back; } free_text_line(line, NULL); } g_list_free(list); list = view->list = g_list_first(view->list); /* Go back to the line that was in view before resizing started */ while (pos--) { while (((GntTextLine*)list->data)->soft) list = list->next; list = list->next; } view->list = list; GNT_WIDGET_UNSET_FLAGS(GNT_WIDGET(view), GNT_WIDGET_DRAWING); if (GNT_WIDGET(view)->window) gnt_widget_draw(GNT_WIDGET(view)); g_string_free(string, TRUE); }
static void selection_changed(GntWidget *widget, gpointer old, gpointer current, gpointer null) { PurplePlugin *plugin = current; char *text; GList *list = NULL, *iter = NULL; if (!plugin) return; /* If the selected plugin was unseen before, mark it as seen. But save the list * only when the plugin list is closed. So if the user enables a plugin, and it * crashes, it won't get marked as seen so the user can fix the bug and still * quickly find the plugin in the list. * I probably mean 'plugin developers' by 'users' here. */ list = g_object_get_data(G_OBJECT(widget), "seen-list"); if (list) iter = g_list_find_custom(list, plugin->path, (GCompareFunc)strcmp); if (!iter) { list = g_list_prepend(list, g_strdup(plugin->path)); g_object_set_data(G_OBJECT(widget), "seen-list", list); } /* XXX: Use formatting and stuff */ gnt_text_view_clear(GNT_TEXT_VIEW(plugins.aboot)); text = g_strdup_printf(_("Name: %s\nVersion: %s\nDescription: %s\nAuthor: %s\nWebsite: %s\nFilename: %s\n"), SAFE(_(plugin->info->name)), SAFE(_(plugin->info->version)), SAFE(_(plugin->info->description)), SAFE(_(plugin->info->author)), SAFE(_(plugin->info->homepage)), SAFE(plugin->path)); gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(plugins.aboot), text, GNT_TEXT_FLAG_NORMAL); gnt_text_view_scroll(GNT_TEXT_VIEW(plugins.aboot), 0); g_free(text); decide_conf_button(plugin); }
static void selection_changed(GntWidget *widget, gpointer old, gpointer current, gpointer null) { PurplePlugin *plugin = current; PurplePluginInfo *info; char *text, *authors = NULL; const char * const *authorlist; GList *list = NULL, *iter = NULL; if (!plugin) return; info = purple_plugin_get_info(plugin); authorlist = purple_plugin_info_get_authors(info); if (authorlist) authors = g_strjoinv(", ", (gchar **)authorlist); /* If the selected plugin was unseen before, mark it as seen. But save the list * only when the plugin list is closed. So if the user enables a plugin, and it * crashes, it won't get marked as seen so the user can fix the bug and still * quickly find the plugin in the list. * I probably mean 'plugin developers' by 'users' here. */ list = g_object_get_data(G_OBJECT(widget), "seen-list"); if (list) iter = g_list_find_custom(list, purple_plugin_get_filename(plugin), (GCompareFunc)strcmp); if (!iter) { list = g_list_prepend(list, g_strdup(purple_plugin_get_filename(plugin))); g_object_set_data(G_OBJECT(widget), "seen-list", list); } /* XXX: Use formatting and stuff */ gnt_text_view_clear(GNT_TEXT_VIEW(plugins.aboot)); text = g_strdup_printf((g_strv_length((gchar **)authorlist) > 1 ? _("Name: %s\nVersion: %s\nDescription: %s\nAuthors: %s\nWebsite: %s\nFilename: %s\n") : _("Name: %s\nVersion: %s\nDescription: %s\nAuthor: %s\nWebsite: %s\nFilename: %s\n")), SAFE(_(purple_plugin_info_get_name(info))), SAFE(_(purple_plugin_info_get_version(info))), SAFE(_(purple_plugin_info_get_description(info))), SAFE(authors), SAFE(_(purple_plugin_info_get_website(info))), SAFE(purple_plugin_get_filename(plugin))); gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(plugins.aboot), text, GNT_TEXT_FLAG_NORMAL); gnt_text_view_scroll(GNT_TEXT_VIEW(plugins.aboot), 0); g_free(text); g_free(authors); decide_conf_button(plugin); }
/* Frees 'urls' */ static void process_urls(PurpleConversation *conv, GList *urls) { GList *iter; int c; FinchConv *fconv = FINCH_CONV(conv); GntTextView *tv = GNT_TEXT_VIEW(fconv->tv); for (iter = urls, c = 1; iter; iter = iter->next, c++) { int i; CbInfo *cbdata; gchar *url, *str; gchar *original_url; const gchar *tiny_url; i = gnt_text_view_get_lines_below(tv); original_url = purple_unescape_html((char *)iter->data); tiny_url = g_hash_table_lookup(tinyurl_cache, original_url); if (tiny_url) { gchar *str = g_strdup_printf("\n[%d] %s", c, tiny_url); g_free(original_url); gnt_text_view_append_text_with_flags(tv, str, GNT_TEXT_FLAG_DIM); if (i == 0) gnt_text_view_scroll(tv, 0); g_free(str); continue; } cbdata = g_new(CbInfo, 1); cbdata->num = c; cbdata->original_url = original_url; cbdata->tag = g_strdup_printf("%s%d", "tiny_", tag_num++); cbdata->conv = conv; if (g_ascii_strncasecmp(original_url, "http://", 7) && g_ascii_strncasecmp(original_url, "https://", 8)) { url = g_strdup_printf("%shttp%%3A%%2F%%2F%s", purple_prefs_get_string(PREF_URL), purple_url_encode(original_url)); } else { url = g_strdup_printf("%s%s", purple_prefs_get_string(PREF_URL), purple_url_encode(original_url)); } purple_http_get(NULL, url_fetched, cbdata, url); str = g_strdup_printf(_("\nFetching TinyURL...")); gnt_text_view_append_text_with_tag((tv), str, GNT_TEXT_FLAG_DIM, cbdata->tag); g_free(str); if (i == 0) gnt_text_view_scroll(tv, 0); g_free(iter->data); g_free(url); } g_list_free(urls); }
static void finch_debug_print(PurpleDebugLevel level, const char *category, const char *args) { if (debug.window && !debug.paused && match_string(category, args)) { int pos = gnt_text_view_get_lines_below(GNT_TEXT_VIEW(debug.tview)); GntTextFormatFlags flag = GNT_TEXT_FLAG_NORMAL; const char *mdate; time_t mtime = time(NULL); mdate = purple_utf8_strftime("%H:%M:%S ", localtime(&mtime)); gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(debug.tview), mdate, flag); gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(debug.tview), category, GNT_TEXT_FLAG_BOLD); gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(debug.tview), ": ", GNT_TEXT_FLAG_BOLD); switch (level) { case PURPLE_DEBUG_WARNING: flag |= GNT_TEXT_FLAG_UNDERLINE; case PURPLE_DEBUG_ERROR: case PURPLE_DEBUG_FATAL: flag |= GNT_TEXT_FLAG_BOLD; break; default: break; } gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(debug.tview), args, flag); if (pos <= 1) gnt_text_view_scroll(GNT_TEXT_VIEW(debug.tview), 0); } }
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); } }
static void * finch_notify_userinfo(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info) { char *primary; char *info; void *ui_handle; char *key = userinfo_hash(purple_connection_get_account(gc), who); info = purple_notify_user_info_get_xhtml(user_info); ui_handle = g_hash_table_lookup(userinfo, key); if (ui_handle != NULL) { GntTextView *msg = GNT_TEXT_VIEW(g_object_get_data(G_OBJECT(ui_handle), "info-widget")); char *strip = purple_markup_strip_html(info); int tvw, tvh, width, height, ntvw, ntvh; while (GNT_WIDGET(ui_handle)->parent) ui_handle = GNT_WIDGET(ui_handle)->parent; gnt_widget_get_size(GNT_WIDGET(ui_handle), &width, &height); gnt_widget_get_size(GNT_WIDGET(msg), &tvw, &tvh); gnt_text_view_clear(msg); if (!gnt_util_parse_xhtml_to_textview(info, msg)) gnt_text_view_append_text_with_flags(msg, strip, GNT_TEXT_FLAG_NORMAL); gnt_text_view_scroll(msg, 0); gnt_util_get_text_bound(strip, &ntvw, &ntvh); ntvw += 3; ntvh++; gnt_screen_resize_widget(GNT_WIDGET(ui_handle), width + MAX(0, ntvw - tvw), height + MAX(0, ntvh - tvh)); g_free(strip); g_free(key); } else { primary = g_strdup_printf(_("Info for %s"), who); ui_handle = finch_notify_formatted(_("Buddy Information"), primary, NULL, info); g_hash_table_insert(userinfo, key, ui_handle); g_free(primary); g_signal_connect(G_OBJECT(ui_handle), "destroy", G_CALLBACK(remove_userinfo), key); } g_free(info); return ui_handle; }
static void * finch_notify_common(PurpleNotifyType ntype, PurpleNotifyMsgType msgtype, const char *title, const char *primary, const char *secondary) { GntWidget *window, *button; GntTextFormatFlags pf = 0, sf = 0; switch (msgtype) { case PURPLE_NOTIFY_MSG_ERROR: sf |= GNT_TEXT_FLAG_BOLD; /* fall through */ case PURPLE_NOTIFY_MSG_WARNING: pf |= GNT_TEXT_FLAG_UNDERLINE; /* fall through */ case PURPLE_NOTIFY_MSG_INFO: pf |= GNT_TEXT_FLAG_BOLD; break; } window = gnt_window_box_new(FALSE, TRUE); gnt_box_set_title(GNT_BOX(window), title); gnt_box_set_fill(GNT_BOX(window), FALSE); gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID); gnt_box_set_pad(GNT_BOX(window), 0); if (primary) gnt_box_add_widget(GNT_BOX(window), gnt_label_new_with_format(primary, pf)); button = gnt_button_new(_("OK")); if (secondary) { GntWidget *msg; if (ntype == PURPLE_NOTIFY_FORMATTED) { int width = -1, height = -1; char *plain = (char*)secondary; msg = gnt_text_view_new(); gnt_text_view_set_flag(GNT_TEXT_VIEW(msg), GNT_TEXT_VIEW_TOP_ALIGN | GNT_TEXT_VIEW_NO_SCROLL); plain = purple_markup_strip_html(secondary); if (!gnt_util_parse_xhtml_to_textview(secondary, GNT_TEXT_VIEW(msg))) gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(msg), plain, sf); gnt_text_view_attach_scroll_widget(GNT_TEXT_VIEW(msg), button); gnt_util_get_text_bound(plain, &width, &height); gnt_widget_set_size(msg, width + 3, height + 1); if (plain != secondary) g_free(plain); } else { msg = gnt_label_new_with_format(secondary, sf); } gnt_box_add_widget(GNT_BOX(window), msg); g_object_set_data(G_OBJECT(window), "info-widget", msg); } gnt_box_add_widget(GNT_BOX(window), button); g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gnt_widget_destroy), window); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(notify_msg_window_destroy_cb), GINT_TO_POINTER(ntype)); gnt_widget_show(window); return window; }