pidgin/prefs/pidginprefs.c

changeset 41034
fe203b2245fb
parent 41030
ec8b76f3bf0a
child 41086
631e6cba8635
equal deleted inserted replaced
41033:2abcdcea1ee0 41034:fe203b2245fb
36 36
37 #include "gtkblist.h" 37 #include "gtkblist.h"
38 #include "gtkconv.h" 38 #include "gtkconv.h"
39 #include "gtkdialogs.h" 39 #include "gtkdialogs.h"
40 #include "gtksavedstatuses.h" 40 #include "gtksavedstatuses.h"
41 #include "gtksmiley-theme.h"
42 #include "gtkstatus-icon-theme.h" 41 #include "gtkstatus-icon-theme.h"
43 #include "gtkutils.h" 42 #include "gtkutils.h"
44 #include "pidgincore.h" 43 #include "pidgincore.h"
45 #include "pidgindebug.h" 44 #include "pidgindebug.h"
46 #include "pidginprefs.h" 45 #include "pidginprefs.h"
121 } im; 120 } im;
122 GtkWidget *use_smooth_scrolling; 121 GtkWidget *use_smooth_scrolling;
123 struct { 122 struct {
124 GtkWidget *blink_im; 123 GtkWidget *blink_im;
125 } win32; 124 } win32;
126 GtkWidget *resize_custom_smileys;
127 GtkWidget *custom_smileys_size;
128 GtkWidget *minimum_entry_lines; 125 GtkWidget *minimum_entry_lines;
129 GtkTextBuffer *format_buffer; 126 GtkTextBuffer *format_buffer;
130 GtkWidget *format_view; 127 GtkWidget *format_view;
131 /* Win32 specific frame */ 128 /* Win32 specific frame */
132 GtkWidget *font_frame; 129 GtkWidget *font_frame;
192 189
193 /* Themes page */ 190 /* Themes page */
194 struct { 191 struct {
195 SoupSession *session; 192 SoupSession *session;
196 GtkWidget *status; 193 GtkWidget *status;
197 GtkWidget *smiley;
198 } theme; 194 } theme;
199 195
200 #ifdef USE_VV 196 #ifdef USE_VV
201 /* Voice/Video page */ 197 /* Voice/Video page */
202 struct { 198 struct {
225 /* Main dialog */ 221 /* Main dialog */
226 static PidginPrefsWindow *prefs = NULL; 222 static PidginPrefsWindow *prefs = NULL;
227 223
228 /* Themes page */ 224 /* Themes page */
229 static GtkWidget *prefs_status_themes_combo_box; 225 static GtkWidget *prefs_status_themes_combo_box;
230 static GtkWidget *prefs_smiley_themes_combo_box;
231 226
232 /* These exist outside the lifetime of the prefs dialog */ 227 /* These exist outside the lifetime of the prefs dialog */
233 static GtkListStore *prefs_status_icon_themes; 228 static GtkListStore *prefs_status_icon_themes;
234 static GtkListStore *prefs_smiley_themes;
235 229
236 /* 230 /*
237 * PROTOTYPES 231 * PROTOTYPES
238 */ 232 */
239 G_DEFINE_TYPE(PidginPrefsWindow, pidgin_prefs_window, GTK_TYPE_DIALOG); 233 G_DEFINE_TYPE(PidginPrefsWindow, pidgin_prefs_window, GTK_TYPE_DIALOG);
819 /* Unregister callbacks. */ 813 /* Unregister callbacks. */
820 purple_prefs_disconnect_by_handle(prefs); 814 purple_prefs_disconnect_by_handle(prefs);
821 815
822 /* NULL-ify globals */ 816 /* NULL-ify globals */
823 prefs_status_themes_combo_box = NULL; 817 prefs_status_themes_combo_box = NULL;
824 prefs_smiley_themes_combo_box = NULL;
825 818
826 g_free(prefs->proxy.gnome_program_path); 819 g_free(prefs->proxy.gnome_program_path);
827 prefs = NULL; 820 prefs = NULL;
828 } 821 }
829 822
834 827
835 return g_strdup_printf("<b>%s</b>%s%s%s%s\n<span foreground='dim grey'>%s</span>", 828 return g_strdup_printf("<b>%s</b>%s%s%s%s\n<span foreground='dim grey'>%s</span>",
836 name, custom ? " " : "", custom ? _("(Custom)") : "", 829 name, custom ? " " : "", custom ? _("(Custom)") : "",
837 author != NULL ? " - " : "", author != NULL ? author : "", 830 author != NULL ? " - " : "", author != NULL ? author : "",
838 description != NULL ? description : ""); 831 description != NULL ? description : "");
839 }
840
841 static void
842 smileys_refresh_theme_list(void)
843 {
844 GList *it;
845 GtkTreeIter iter;
846 gchar *description;
847
848 description = get_theme_markup(_("none"), FALSE, _("Penguin Pimps"),
849 _("Selecting this disables graphical emoticons."));
850 gtk_list_store_append(prefs_smiley_themes, &iter);
851 gtk_list_store_set(prefs_smiley_themes, &iter,
852 0, NULL, 1, description, 2, "none", -1);
853 g_free(description);
854
855 for (it = pidgin_smiley_theme_get_all(); it; it = g_list_next(it)) {
856 PidginSmileyTheme *theme = it->data;
857
858 description = get_theme_markup(
859 _(pidgin_smiley_theme_get_name(theme)), FALSE,
860 _(pidgin_smiley_theme_get_author(theme)),
861 _(pidgin_smiley_theme_get_description(theme)));
862
863 gtk_list_store_append(prefs_smiley_themes, &iter);
864 gtk_list_store_set(prefs_smiley_themes, &iter,
865 0, pidgin_smiley_theme_get_icon(theme),
866 1, description,
867 2, pidgin_smiley_theme_get_name(theme),
868 -1);
869
870 g_free(description);
871 }
872 } 832 }
873 833
874 /* adds the themes to the theme list from the manager so they can be displayed in prefs */ 834 /* adds the themes to the theme list from the manager so they can be displayed in prefs */
875 static void 835 static void
876 prefs_themes_sort(PurpleTheme *theme) 836 prefs_themes_sort(PurpleTheme *theme)
955 gtk_list_store_set(prefs_status_icon_themes, &iter, 0, pixbuf, 1, tmp, 2, "", -1); 915 gtk_list_store_set(prefs_status_icon_themes, &iter, 0, pixbuf, 1, tmp, 2, "", -1);
956 g_free(tmp); 916 g_free(tmp);
957 if (pixbuf) 917 if (pixbuf)
958 g_object_unref(G_OBJECT(pixbuf)); 918 g_object_unref(G_OBJECT(pixbuf));
959 919
960 /* smiley themes */
961 gtk_list_store_clear(prefs_smiley_themes);
962
963 purple_theme_manager_for_each_theme(prefs_themes_sort); 920 purple_theme_manager_for_each_theme(prefs_themes_sort);
964 smileys_refresh_theme_list();
965 921
966 /* set active */ 922 /* set active */
967 prefs_set_active_theme_combo(prefs_status_themes_combo_box, prefs_status_icon_themes, purple_prefs_get_string(PIDGIN_PREFS_ROOT "/status/icon-theme")); 923 prefs_set_active_theme_combo(prefs_status_themes_combo_box, prefs_status_icon_themes, purple_prefs_get_string(PIDGIN_PREFS_ROOT "/status/icon-theme"));
968 prefs_set_active_theme_combo(prefs_smiley_themes_combo_box, prefs_smiley_themes, purple_prefs_get_string(PIDGIN_PREFS_ROOT "/smileys/theme"));
969 } 924 }
970 925
971 /* init all the theme variables so that the themes can be sorted later and used by pref pages */ 926 /* init all the theme variables so that the themes can be sorted later and used by pref pages */
972 static void 927 static void
973 prefs_themes_init(void) 928 prefs_themes_init(void)
974 { 929 {
975 prefs_status_icon_themes = gtk_list_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING); 930 prefs_status_icon_themes = gtk_list_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING);
976
977 prefs_smiley_themes = gtk_list_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING);
978 } 931 }
979 932
980 /* 933 /*
981 * prefs_theme_find_theme: 934 * prefs_theme_find_theme:
982 * @path: A directory containing a theme. The theme could be at the 935 * @path: A directory containing a theme. The theme could be at the
1051 static void 1004 static void
1052 theme_install_theme(char *path, struct theme_info *info) 1005 theme_install_theme(char *path, struct theme_info *info)
1053 { 1006 {
1054 gchar *destdir; 1007 gchar *destdir;
1055 const char *tail; 1008 const char *tail;
1056 gboolean is_smiley_theme, is_archive; 1009 gboolean is_archive;
1057 PurpleTheme *theme = NULL; 1010 PurpleTheme *theme = NULL;
1058 1011
1059 if (info == NULL) 1012 if (info == NULL)
1060 return; 1013 return;
1061 1014
1070 is_archive = !g_ascii_strcasecmp(tail, ".gz") || !g_ascii_strcasecmp(tail, ".tgz"); 1023 is_archive = !g_ascii_strcasecmp(tail, ".gz") || !g_ascii_strcasecmp(tail, ".tgz");
1071 1024
1072 /* Just to be safe */ 1025 /* Just to be safe */
1073 g_strchomp(path); 1026 g_strchomp(path);
1074 1027
1075 if ((is_smiley_theme = purple_strequal(info->type, "smiley"))) 1028 destdir = g_build_filename(purple_data_dir(), "themes", "temp", NULL);
1076 destdir = g_build_filename(purple_data_dir(), "smileys", NULL);
1077 else
1078 destdir = g_build_filename(purple_data_dir(), "themes", "temp", NULL);
1079 1029
1080 /* We'll check this just to make sure. This also lets us do something different on 1030 /* We'll check this just to make sure. This also lets us do something different on
1081 * other platforms, if need be */ 1031 * other platforms, if need be */
1082 if (is_archive) { 1032 if (is_archive) {
1083 #ifndef _WIN32 1033 #ifndef _WIN32
1110 return; 1060 return;
1111 } 1061 }
1112 #endif 1062 #endif
1113 } 1063 }
1114 1064
1115 if (is_smiley_theme) { 1065 if (is_archive) {
1116 /* just extract the folder to the smiley directory */
1117 prefs_themes_refresh();
1118
1119 } else if (is_archive) {
1120 theme = prefs_theme_find_theme(destdir, info->type); 1066 theme = prefs_theme_find_theme(destdir, info->type);
1121 1067
1122 if (PURPLE_IS_THEME(theme)) { 1068 if (PURPLE_IS_THEME(theme)) {
1123 /* create the location for the theme */ 1069 /* create the location for the theme */
1124 gchar *theme_dest = g_build_filename(purple_data_dir(), "themes", 1070 gchar *theme_dest = g_build_filename(purple_data_dir(), "themes",
1327 sizeof(te) / sizeof(GtkTargetEntry) , GDK_ACTION_COPY | GDK_ACTION_MOVE); 1273 sizeof(te) / sizeof(GtkTargetEntry) , GDK_ACTION_COPY | GDK_ACTION_MOVE);
1328 1274
1329 g_signal_connect(G_OBJECT(combo_box), "drag_data_received", G_CALLBACK(theme_dnd_recv), (gpointer) type); 1275 g_signal_connect(G_OBJECT(combo_box), "drag_data_received", G_CALLBACK(theme_dnd_recv), (gpointer) type);
1330 } 1276 }
1331 1277
1332 /* sets the current smiley theme */
1333 static void
1334 prefs_set_smiley_theme_cb(GtkComboBox *combo_box, gpointer user_data)
1335 {
1336 gchar *new_theme;
1337 GtkTreeIter new_iter;
1338
1339 if (gtk_combo_box_get_active_iter(combo_box, &new_iter)) {
1340
1341 gtk_tree_model_get(GTK_TREE_MODEL(prefs_smiley_themes), &new_iter, 2, &new_theme, -1);
1342
1343 purple_prefs_set_string(PIDGIN_PREFS_ROOT "/smileys/theme", new_theme);
1344
1345 g_free(new_theme);
1346 }
1347 }
1348
1349
1350 /* Does same as normal sort, except "none" is sorted first */
1351 static gint pidgin_sort_smileys (GtkTreeModel *model,
1352 GtkTreeIter *a,
1353 GtkTreeIter *b,
1354 gpointer userdata)
1355 {
1356 gint ret = 0;
1357 gchar *name1 = NULL, *name2 = NULL;
1358
1359 gtk_tree_model_get(model, a, 2, &name1, -1);
1360 gtk_tree_model_get(model, b, 2, &name2, -1);
1361
1362 if (name1 == NULL || name2 == NULL) {
1363 if (!(name1 == NULL && name2 == NULL))
1364 ret = (name1 == NULL) ? -1: 1;
1365 } else if (!g_ascii_strcasecmp(name1, "none")) {
1366 if (!g_utf8_collate(name1, name2))
1367 ret = 0;
1368 else
1369 /* Sort name1 first */
1370 ret = -1;
1371 } else if (!g_ascii_strcasecmp(name2, "none")) {
1372 /* Sort name2 first */
1373 ret = 1;
1374 } else {
1375 /* Neither string is "none", default to normal sort */
1376 ret = purple_utf8_strcasecmp(name1, name2);
1377 }
1378
1379 g_free(name1);
1380 g_free(name2);
1381
1382 return ret;
1383 }
1384
1385 /* sets the current icon theme */ 1278 /* sets the current icon theme */
1386 static void 1279 static void
1387 prefs_set_status_icon_theme_cb(GtkComboBox *combo_box, gpointer user_data) 1280 prefs_set_status_icon_theme_cb(GtkComboBox *combo_box, gpointer user_data)
1388 { 1281 {
1389 PidginStatusIconTheme *theme = NULL; 1282 PidginStatusIconTheme *theme = NULL;
1410 /* Status Icon Themes */ 1303 /* Status Icon Themes */
1411 prefs_build_theme_combo_box(win->theme.status, prefs_status_icon_themes, 1304 prefs_build_theme_combo_box(win->theme.status, prefs_status_icon_themes,
1412 PIDGIN_PREFS_ROOT "/status/icon-theme", 1305 PIDGIN_PREFS_ROOT "/status/icon-theme",
1413 "icon"); 1306 "icon");
1414 prefs_status_themes_combo_box = win->theme.status; 1307 prefs_status_themes_combo_box = win->theme.status;
1415
1416 /* Smiley Themes */
1417 prefs_build_theme_combo_box(win->theme.smiley, prefs_smiley_themes,
1418 PIDGIN_PREFS_ROOT "/smileys/theme",
1419 "smiley");
1420 prefs_smiley_themes_combo_box = win->theme.smiley;
1421
1422 /* Custom sort so "none" theme is at top of list */
1423 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(prefs_smiley_themes),
1424 2, pidgin_sort_smileys, NULL, NULL);
1425 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(prefs_smiley_themes),
1426 2, GTK_SORT_ASCENDING);
1427 } 1308 }
1428 1309
1429 static void 1310 static void
1430 formatting_toggle_cb(TalkatuActionGroup *ag, GAction *action, const gchar *name, gpointer data) 1311 formatting_toggle_cb(TalkatuActionGroup *ag, GAction *action, const gchar *name, gpointer data)
1431 { 1312 {
1530 #ifdef _WIN32 1411 #ifdef _WIN32
1531 pidgin_prefs_bind_checkbox(PIDGIN_PREFS_ROOT "/win32/blink_im", 1412 pidgin_prefs_bind_checkbox(PIDGIN_PREFS_ROOT "/win32/blink_im",
1532 win->conversations.win32.blink_im); 1413 win->conversations.win32.blink_im);
1533 #else 1414 #else
1534 gtk_widget_hide(win->conversations.win32.blink_im); 1415 gtk_widget_hide(win->conversations.win32.blink_im);
1535 #endif
1536
1537 #if 0
1538 /* TODO: it's not implemented */
1539 pidgin_prefs_bind_checkbox(
1540 PIDGIN_PREFS_ROOT "/conversations/resize_custom_smileys",
1541 win->conversations.resize_custom_smileys);
1542
1543 pidgin_prefs_bind_spin_button(
1544 PIDGIN_PREFS_ROOT "/conversations/custom_smileys_size",
1545 win->conversations.custom_smileys_size);
1546
1547 g_object_bind_property(win->conversations.resize_custom_smileys, "active",
1548 win->conversations.custom_smileys_size, "sensitive",
1549 G_BINDING_SYNC_CREATE);
1550 #endif 1416 #endif
1551 1417
1552 pidgin_prefs_bind_spin_button( 1418 pidgin_prefs_bind_spin_button(
1553 PIDGIN_PREFS_ROOT "/conversations/minimum_entry_lines", 1419 PIDGIN_PREFS_ROOT "/conversations/minimum_entry_lines",
1554 win->conversations.minimum_entry_lines); 1420 win->conversations.minimum_entry_lines);
2506 gtk_widget_class_bind_template_child( 2372 gtk_widget_class_bind_template_child(
2507 widget_class, PidginPrefsWindow, 2373 widget_class, PidginPrefsWindow,
2508 conversations.win32.blink_im); 2374 conversations.win32.blink_im);
2509 gtk_widget_class_bind_template_child( 2375 gtk_widget_class_bind_template_child(
2510 widget_class, PidginPrefsWindow, 2376 widget_class, PidginPrefsWindow,
2511 conversations.resize_custom_smileys);
2512 gtk_widget_class_bind_template_child(
2513 widget_class, PidginPrefsWindow,
2514 conversations.custom_smileys_size);
2515 gtk_widget_class_bind_template_child(
2516 widget_class, PidginPrefsWindow,
2517 conversations.minimum_entry_lines); 2377 conversations.minimum_entry_lines);
2518 gtk_widget_class_bind_template_child( 2378 gtk_widget_class_bind_template_child(
2519 widget_class, PidginPrefsWindow, 2379 widget_class, PidginPrefsWindow,
2520 conversations.format_buffer); 2380 conversations.format_buffer);
2521 gtk_widget_class_bind_template_child( 2381 gtk_widget_class_bind_template_child(
2648 widget_class, PidginPrefsWindow, away.startup_label); 2508 widget_class, PidginPrefsWindow, away.startup_label);
2649 2509
2650 /* Themes page */ 2510 /* Themes page */
2651 gtk_widget_class_bind_template_child( 2511 gtk_widget_class_bind_template_child(
2652 widget_class, PidginPrefsWindow, theme.status); 2512 widget_class, PidginPrefsWindow, theme.status);
2653 gtk_widget_class_bind_template_child(
2654 widget_class, PidginPrefsWindow, theme.smiley);
2655 gtk_widget_class_bind_template_callback(widget_class, 2513 gtk_widget_class_bind_template_callback(widget_class,
2656 prefs_set_status_icon_theme_cb); 2514 prefs_set_status_icon_theme_cb);
2657 gtk_widget_class_bind_template_callback(widget_class,
2658 prefs_set_smiley_theme_cb);
2659 } 2515 }
2660 2516
2661 static void 2517 static void
2662 pidgin_prefs_window_init(PidginPrefsWindow *win) 2518 pidgin_prefs_window_init(PidginPrefsWindow *win)
2663 { 2519 {
2683 prefs = PIDGIN_PREFS_WINDOW(g_object_new( 2539 prefs = PIDGIN_PREFS_WINDOW(g_object_new(
2684 pidgin_prefs_window_get_type(), NULL)); 2540 pidgin_prefs_window_get_type(), NULL));
2685 } 2541 }
2686 2542
2687 gtk_window_present(GTK_WINDOW(prefs)); 2543 gtk_window_present(GTK_WINDOW(prefs));
2688 }
2689
2690 static void
2691 smiley_theme_pref_cb(const char *name, PurplePrefType type,
2692 gconstpointer value, gpointer data)
2693 {
2694 const gchar *theme_name = value;
2695 GList *themes, *it;
2696
2697 if (purple_strequal(theme_name, "none")) {
2698 purple_smiley_theme_set_current(NULL);
2699 return;
2700 }
2701
2702 /* XXX: could be cached when initializing prefs view */
2703 themes = pidgin_smiley_theme_get_all();
2704
2705 for (it = themes; it; it = g_list_next(it)) {
2706 PidginSmileyTheme *theme = it->data;
2707
2708 if (!purple_strequal(pidgin_smiley_theme_get_name(theme), theme_name))
2709 continue;
2710
2711 purple_smiley_theme_set_current(PURPLE_SMILEY_THEME(theme));
2712 }
2713 } 2544 }
2714 2545
2715 void 2546 void
2716 pidgin_prefs_init(void) 2547 pidgin_prefs_init(void)
2717 { 2548 {
2728 purple_prefs_add_path(PIDGIN_PREFS_ROOT "/filelocations/last_open_folder", ""); 2559 purple_prefs_add_path(PIDGIN_PREFS_ROOT "/filelocations/last_open_folder", "");
2729 purple_prefs_add_path(PIDGIN_PREFS_ROOT "/filelocations/last_icon_folder", ""); 2560 purple_prefs_add_path(PIDGIN_PREFS_ROOT "/filelocations/last_icon_folder", "");
2730 2561
2731 /* Themes */ 2562 /* Themes */
2732 prefs_themes_init(); 2563 prefs_themes_init();
2733
2734 /* Smiley Themes */
2735 purple_prefs_add_none(PIDGIN_PREFS_ROOT "/smileys");
2736 purple_prefs_add_string(PIDGIN_PREFS_ROOT "/smileys/theme", "Default");
2737
2738 /* Smiley Callbacks */
2739 purple_prefs_connect_callback(&prefs, PIDGIN_PREFS_ROOT "/smileys/theme",
2740 smiley_theme_pref_cb, NULL);
2741 2564
2742 #ifdef USE_VV 2565 #ifdef USE_VV
2743 /* Voice/Video */ 2566 /* Voice/Video */
2744 purple_prefs_add_none(PIDGIN_PREFS_ROOT "/vvconfig"); 2567 purple_prefs_add_none(PIDGIN_PREFS_ROOT "/vvconfig");
2745 purple_prefs_add_none(PIDGIN_PREFS_ROOT "/vvconfig/audio"); 2568 purple_prefs_add_none(PIDGIN_PREFS_ROOT "/vvconfig/audio");
2792 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/enter_sends"); 2615 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/enter_sends");
2793 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/escape_closes"); 2616 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/escape_closes");
2794 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/html_shortcuts"); 2617 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/html_shortcuts");
2795 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/icons_on_tabs"); 2618 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/icons_on_tabs");
2796 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/send_formatting"); 2619 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/send_formatting");
2797 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/show_smileys");
2798 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/show_urls_as_links"); 2620 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/show_urls_as_links");
2799 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/smiley_shortcuts");
2800 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/use_custom_bgcolor"); 2621 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/use_custom_bgcolor");
2801 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/use_custom_fgcolor"); 2622 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/use_custom_fgcolor");
2802 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/use_custom_font"); 2623 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/use_custom_font");
2803 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/use_custom_size"); 2624 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/use_custom_size");
2804 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/chat/old_tab_complete"); 2625 purple_prefs_remove(PIDGIN_PREFS_ROOT "/conversations/chat/old_tab_complete");

mercurial