/*
 * grn_config.c: functions for configuration saving/retrieving
 *
 * $Id: grn_config.c,v 1.32 2000/06/28 11:28:28 sc Exp $
 */
/* Copyright (C) 1999-2000  Sergey Chernikov (sc@ivvs.ul.ru)
 *
 * Authors: Sergey Chernikov <sc@ivvs.ul.ru>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
 */

#include "grn_consts.h"
#include <unistd.h>
#include <pwd.h>
#include <gnome.h>
#include "grn_config.h"
#include "grn_vars.h"
#include "grn_util.h"


static void grn_prefs_alloc(void)
{
}

static void grn_prefs_free(void)
{
  gint i;
  GSList *l;

  str_free(&(grn_prefs.nntp_server));
  str_free(&(grn_prefs.nntp_login));
  str_free(&(grn_prefs.nntp_passwd));
  str_free(&(grn_prefs.smtp_server));
  str_free(&(grn_prefs.re_quoting));
  str_free(&(grn_prefs.name));
  str_free(&(grn_prefs.email));
  str_free(&(grn_prefs.replyto));
  str_free(&(grn_prefs.org));
  str_free(&(grn_prefs.ua));
  for (i=0; i<NFONTS; i++)  str_free(&(grn_prefs.fonts[i]));
  for (i=0; i<NPIXMAPS; i++)
  {
    if (grn_prefs.pixmaps[i])  gdk_pixmap_unref(grn_prefs.pixmaps[i]);
    str_free(&(grn_prefs.pm_names[i]));
  }
  for (l=grn_prefs.fontpal; l; l=l->next)  g_free(l->data);
  for (l=grn_prefs.colorpal; l; l=l->next)  g_free(l->data);
  g_slist_free(grn_prefs.fontpal);   grn_prefs.fontpal = NULL;
  g_slist_free(grn_prefs.colorpal);  grn_prefs.colorpal = NULL;
}

#define FNT_BODY_P	"-*-helvetica-medium-r-normal--12-*"
#define FNT_BODY_M	"-*-fixed-medium-r-normal-*-*-140-*"
static void fill_fonts()
{
  grn_prefs.fonts[0] = g_strdup(FNT_BODY_P);
  grn_prefs.fonts[1] = g_strdup(FNT_BODY_M);
  grn_prefs.fonts[2] = g_strdup(FNT_BODY_P);
  grn_prefs.fonts[3] = g_strdup(FNT_BODY_P);
  grn_prefs.fonts[4] = g_strdup(FNT_BODY_P);
}

gchar *prefs_fg_colors_ids[NCOLORS] =
{
  "/GRN/Fg_Colors/article_body",
  "/GRN/Fg_Colors/quoted_text",
  "/GRN/Fg_Colors/signature"
};
gchar *prefs_bg_colors_ids[NCOLORS] =
{
  "/GRN/Bg_Colors/article_body",
  "/GRN/Bg_Colors/quoted_text",
  "/GRN/Bg_Colors/signature"
};
static void fill_def_fg_colors(GdkColor *colors)
{
  colors[0].red = 0;       colors[0].green = 0;       colors[0].blue = 0;
  colors[1].red = 0xffff;  colors[1].green = 0;       colors[1].blue = 0xffff;
  colors[2].red = 0;       colors[2].green = 0;       colors[2].blue = 0xffff;
}
static void fill_def_bg_colors(GdkColor *colors)
{
  colors[0].red = 0xffff;  colors[0].green = 0xffff;  colors[0].blue = 0xffff;
  colors[1].red = 0;       colors[1].green = 0;       colors[1].blue = 0;
  colors[2].red = 0;       colors[2].green = 0;       colors[2].blue = 0;
}

void grn_prefs_init(void)
{
  gint i;
  struct passwd *pwd;
  gchar *buf, *p;

  grn_prefs_alloc();

  grn_prefs.srv_autoconnect = FALSE;
  grn_prefs.nntp_auth = FALSE;
  grn_prefs.groups_desc = TRUE;
  grn_prefs.scripts_autoload = TRUE;
  grn_prefs.tl_show_read = FALSE;
  grn_prefs.tl_ac = TRUE;
  grn_prefs.mw_prop = TRUE;
  grn_prefs.tooltips = TRUE;
  grn_prefs.smooth_scrolling = FALSE;
  for (i=0; i<NCFMS; i++)  grn_prefs.cfms[i] = TRUE;
  grn_prefs.toolbar_style = -1;
  grn_prefs.srt_ng_subscr = 0;
  grn_prefs.srt_ng_col = 3;
  grn_prefs.thrd_tl_type = 0;
  grn_prefs.srt_tl_col = 5;
  for (i=0; i<NWINSTATES; i++)
  {
    grn_prefs.ws[i].width = 0;  grn_prefs.ws[i].height = 0;
    grn_prefs.ws[i].x = 0;        grn_prefs.ws[i].y = 0;
  }
  
  pwd = getpwuid(getuid());
  buf = g_strdup(pwd->pw_gecos);
  p = strchr(buf, ',');
  if (p)  *p = 0;
  grn_prefs.name = g_strdup(buf);
  str_free(&buf);
  grn_prefs.nntp_server = g_strdup("news");
  grn_prefs.nntp_login = NULL;  grn_prefs.nntp_passwd = NULL;
  grn_prefs.smtp_server = g_strdup("mail");
  grn_prefs.email = g_strdup_printf("%s@%s", g_get_user_name(), get_fqdn(NULL));
  grn_prefs.replyto = g_strdup("");
  grn_prefs.org = g_strdup(_("@un_n (change this!)"));
  grn_prefs.ua = g_strdup(_("@longpid v.@ver [@uname]"));
  grn_prefs.re_quoting = g_strdup("^ *[A-Za-z_@.]*[>|]+");
  grn_prefs.paths[0] = g_strdup("~/.newsrc");
  grn_prefs.paths[1] = g_strdup("~/.oldnewsrc");
  fill_fonts();
  for (i=0; i<NPIXMAPS; i++)
  {
    grn_prefs.pm_names[i] = NULL;
    grn_prefs.pixmaps[i] = NULL;
  }
  grn_prefs.fontpal = NULL;  grn_prefs.colorpal = NULL;
}

void grn_prefs_done(void)
{
  grn_prefs_free();
}


void grn_find_load(grn_find *gf)
{
  g_return_if_fail(gf != NULL);

  str_free(&(gf->data));
  gf->data = gnome_config_get_string(GRN_SRCH_DATA);
  str_free(&(gf->hdr));
  gf->hdr = gnome_config_get_string(GRN_SRCH_HDR_DATA"=X-Comment-To");
  gf->search_from = gnome_config_get_bool(GRN_SRCH_FROM"=false");
  gf->search_subj = gnome_config_get_bool(GRN_SRCH_SUBJ"=true");
  gf->search_body = gnome_config_get_bool(GRN_SRCH_BODY"=false");
  gf->search_hdr = gnome_config_get_bool(GRN_SRCH_HDR"=false");
  gf->is_regex = gnome_config_get_bool(GRN_SRCH_REGEX"=false");
  gf->sensitive = gnome_config_get_bool(GRN_SRCH_SENS"=false");
  gf->unread_only = gnome_config_get_bool(GRN_SRCH_UNREAD"=true");
}

void grn_prefs_load(void)
{
  gint flag, i, n;
  GdkColor def_fg_colors[NCOLORS], def_bg_colors[NCOLORS];
  gchar *buf;

  grn_prefs.srv_autoconnect = gnome_config_get_bool(GRN_PREFS_AUTOCONNECT"=false");
  grn_prefs.nntp_auth = gnome_config_get_bool(GRN_PREFS_NNTP_AUTH"=false");
  grn_prefs.groups_desc = gnome_config_get_bool(GRN_PREFS_GROUPS_DESC"=true");
  grn_prefs.scripts_autoload = gnome_config_get_bool(GRN_PREFS_SCR_AUTOLOAD"=true");
  grn_prefs.tl_show_read = gnome_config_get_bool(GRN_PREFS_TL_SHOW_READ"=false");
  grn_prefs.tl_ac = gnome_config_get_bool(GRN_PREFS_TL_AC"=true");
  grn_prefs.mw_prop = gnome_config_get_bool(GRN_PREFS_MW_PROP"=true");
  grn_prefs.tooltips = gnome_config_get_bool(GRN_PREFS_TOOLTIPS"=true");
  grn_prefs.smooth_scrolling = gnome_config_get_bool(GRN_PREFS_SSCROLL"=false");
  grn_prefs.srt_ng_subscr = gnome_config_get_int(GRN_PREFS_SRT_NG_SUBSCR"=0");
  grn_prefs.srt_ng_col = gnome_config_get_int(GRN_PREFS_SRT_NG_COL"=3");
  grn_prefs.thrd_tl_type = gnome_config_get_int(GRN_PREFS_THRD_TL_TYPE"=0");
  grn_prefs.srt_tl_col = gnome_config_get_int(GRN_PREFS_SRT_TL_COL"=6");

  grn_prefs.toolbar_style = gnome_config_get_int_with_default(GRN_PREFS_TBSTYLE, &flag);
  if (flag)  grn_prefs.toolbar_style = -1;

  str_free(&(grn_prefs.nntp_server));
  grn_prefs.nntp_server = gnome_config_get_string(GRN_PREFS_NNTPSERV"=news");
  
  str_free(&(grn_prefs.nntp_login));
  grn_prefs.nntp_login = gnome_config_get_string(GRN_PREFS_NNTP_LOGIN"=login");

  str_free(&(grn_prefs.nntp_passwd));
  grn_prefs.nntp_passwd = gnome_config_get_string(GRN_PREFS_NNTP_PWD"=password");

  str_free(&(grn_prefs.smtp_server));
  grn_prefs.smtp_server = gnome_config_get_string(GRN_PREFS_SMTPSERV"=mail");

  buf = gnome_config_get_string_with_default(GRN_PREFS_NAME, &flag);
  if (! flag)
  {
    str_free(&(grn_prefs.name));
    grn_prefs.name = buf;
  }
  else  str_free(&buf);

  buf = gnome_config_get_string_with_default(GRN_PREFS_EMAIL, &flag);
  if (! flag)
  {
    str_free(&(grn_prefs.email));
    grn_prefs.email = buf;
  }
  else  str_free(&buf);

  str_free(&(grn_prefs.replyto));
  grn_prefs.replyto = gnome_config_get_string(GRN_PREFS_REPLYTO"=");

  buf = gnome_config_get_string_with_default(GRN_PREFS_ORG, &flag);
  if (! flag)
  {
    str_free(&(grn_prefs.org));
    grn_prefs.org = buf;
  }
  else  str_free(&buf);

  buf = gnome_config_get_string_with_default(GRN_PREFS_UA, &flag);
  if (! flag)
  {
    str_free(&(grn_prefs.ua));  grn_prefs.ua = buf;
  }
  else  str_free(&buf);

  str_free(&(grn_prefs.re_quoting));
  grn_prefs.re_quoting = gnome_config_get_string(GRN_PREFS_QUOTING"=^ *[A-Za-z_@.]*[>|]+.+");

  for (i=0; i<NPATHS; i++)
  {
    gchar *prefs_id = g_strdup_printf("%s%d", GRN_PREFS_PATHS, i);
    buf = gnome_config_get_string_with_default(prefs_id, &flag);
    str_free(&prefs_id);
    if (! flag)
    {
      str_free(&(grn_prefs.paths[i]));  grn_prefs.paths[i] = buf;
    }
    else  str_free(&buf);
  }

  str_free(&(grn_prefs.fonts[0]));
  grn_prefs.fonts[0] = gnome_config_get_string(GRN_PREFS_FNT_BODY_P"="FNT_BODY_P);
  str_free(&(grn_prefs.fonts[1]));
  grn_prefs.fonts[1] = gnome_config_get_string(GRN_PREFS_FNT_BODY_M"="FNT_BODY_M);
  str_free(&(grn_prefs.fonts[2]));
  grn_prefs.fonts[2] = gnome_config_get_string(GRN_PREFS_FNT_HDRS"="FNT_BODY_P);
  str_free(&(grn_prefs.fonts[3]));
  grn_prefs.fonts[3] = gnome_config_get_string(GRN_PREFS_FNT_THRDLIST"="FNT_BODY_P);
  str_free(&(grn_prefs.fonts[4]));
  grn_prefs.fonts[4] = gnome_config_get_string(GRN_PREFS_FNT_NGLIST"="FNT_BODY_P);
  
  fill_def_fg_colors(def_fg_colors);  fill_def_bg_colors(def_bg_colors);
  for (i=0; i<NCOLORS; i++)
  {
    gchar prefs_id[512];
    g_snprintf(prefs_id, 512, "%s_r=%d", prefs_fg_colors_ids[i], def_fg_colors[i].red);
    grn_prefs.fg_colors[i].red = gnome_config_get_int(prefs_id);
    g_snprintf(prefs_id, 512, "%s_g=%d", prefs_fg_colors_ids[i], def_fg_colors[i].green);
    grn_prefs.fg_colors[i].green = gnome_config_get_int(prefs_id);
    g_snprintf(prefs_id, 512, "%s_b=%d", prefs_fg_colors_ids[i], def_fg_colors[i].blue);
    grn_prefs.fg_colors[i].blue = gnome_config_get_int(prefs_id);

    g_snprintf(prefs_id, 512, "%s_r=%d", prefs_bg_colors_ids[i], def_bg_colors[i].red);
    grn_prefs.bg_colors[i].red = gnome_config_get_int(prefs_id);
    g_snprintf(prefs_id, 512, "%s_g=%d", prefs_bg_colors_ids[i], def_bg_colors[i].green);
    grn_prefs.bg_colors[i].green = gnome_config_get_int(prefs_id);
    g_snprintf(prefs_id, 512, "%s_b=%d", prefs_bg_colors_ids[i], def_bg_colors[i].blue);
    grn_prefs.bg_colors[i].blue = gnome_config_get_int(prefs_id);
  }
  for (i=0; i<NPIXMAPS; i++)
  {
    gchar *buf = g_strdup_printf("%s%d", GRN_PREFS_PIXMAPS, i);
    str_free(&grn_prefs.pm_names[i]);
    grn_prefs.pm_names[i] = gnome_config_get_string(buf);
    grn_prefs.pixmaps[i] = grn_load_pixmap(grn_prefs.pm_names[i]);
    str_free(&buf);
  }
  for (i=0; i<NCFMS; i++)
  {
    gchar *buf = g_strdup_printf("%s%d=true", GRN_PREFS_CFM, i);
    grn_prefs.cfms[i] = gnome_config_get_bool(buf);
    str_free(&buf);
  }

  n = gnome_config_get_int(GRN_PREFS_FONT_N_PAL"=0");
  for (i=0; i<n; i++)
  {
    gchar *buf = g_strdup_printf("%s%d=", GRN_PREFS_FONT_PAL, i);
    grn_prefs.fontpal = g_slist_prepend(grn_prefs.fontpal, gnome_config_get_string(buf));
  }
  grn_prefs.fontpal = g_slist_reverse(grn_prefs.fontpal);

  n = gnome_config_get_int(GRN_PREFS_COLOR_N_PAL"=0");
  for (i=0; i<n; i++)
  {
    GdkColor *clr = g_new(GdkColor, 1);
    gchar *buf;
    buf = g_strdup_printf("%s%d_r=", GRN_PREFS_COLOR_PAL, i);
    clr->red = gnome_config_get_int(buf);  str_free(&buf);
    buf = g_strdup_printf("%s%d_g=", GRN_PREFS_COLOR_PAL, i);
    clr->green = gnome_config_get_int(buf);  str_free(&buf);
    buf = g_strdup_printf("%s%d_b=", GRN_PREFS_COLOR_PAL, i);
    clr->blue = gnome_config_get_int(buf);  str_free(&buf);
    grn_prefs.colorpal = g_slist_prepend(grn_prefs.colorpal, clr);
  }
  grn_prefs.colorpal = g_slist_reverse(grn_prefs.colorpal);

  for (i=0; i<NWINSTATES; i++)
  {
    gchar *buf;
    gint n;
    buf = g_strdup_printf("%s%d_w", GRN_PREFS_WINSTATES, i);
    n = gnome_config_get_int_with_default(buf, &flag);
    if (! flag)  grn_prefs.ws[i].width = n;
    buf = g_strdup_printf("%s%d_h", GRN_PREFS_WINSTATES, i);
    n = gnome_config_get_int_with_default(buf, &flag);
    if (! flag)  grn_prefs.ws[i].height = n;
    buf = g_strdup_printf("%s%d_x", GRN_PREFS_WINSTATES, i);
    n = gnome_config_get_int_with_default(buf, &flag);
    if (! flag)  grn_prefs.ws[i].x = n;
    buf = g_strdup_printf("%s%d_y", GRN_PREFS_WINSTATES, i);
    n = gnome_config_get_int_with_default(buf, &flag);
    if (! flag)  grn_prefs.ws[i].y = n;
  }
}

void grn_find_save(grn_find *gf)
{
  g_return_if_fail(gf != NULL);

  gnome_config_set_string(GRN_SRCH_DATA, gf->data);
  gnome_config_set_string(GRN_SRCH_HDR_DATA, gf->hdr);
  gnome_config_set_bool(GRN_SRCH_FROM, gf->search_from);
  gnome_config_set_bool(GRN_SRCH_SUBJ, gf->search_subj);
  gnome_config_set_bool(GRN_SRCH_BODY, gf->search_body);
  gnome_config_set_bool(GRN_SRCH_HDR, gf->search_hdr);
  gnome_config_set_bool(GRN_SRCH_REGEX, gf->is_regex);
  gnome_config_set_bool(GRN_SRCH_SENS, gf->sensitive);
  gnome_config_set_bool(GRN_SRCH_UNREAD, gf->unread_only);
  gnome_config_sync();
}


void grn_prefs_save(void)
{
  gint i, n;
  GSList *l;

  gnome_config_set_bool(GRN_PREFS_AUTOCONNECT, grn_prefs.srv_autoconnect);
  gnome_config_set_bool(GRN_PREFS_NNTP_AUTH, grn_prefs.nntp_auth);
  gnome_config_set_bool(GRN_PREFS_GROUPS_DESC, grn_prefs.groups_desc);
  gnome_config_set_bool(GRN_PREFS_SCR_AUTOLOAD, grn_prefs.scripts_autoload);
  gnome_config_set_bool(GRN_PREFS_TL_SHOW_READ, grn_prefs.tl_show_read);
  gnome_config_set_bool(GRN_PREFS_TL_AC, grn_prefs.tl_ac);
  gnome_config_set_bool(GRN_PREFS_MW_PROP, grn_prefs.mw_prop);
  gnome_config_set_bool(GRN_PREFS_TOOLTIPS, grn_prefs.tooltips);
  gnome_config_set_bool(GRN_PREFS_SSCROLL, grn_prefs.smooth_scrolling);
  gnome_config_set_int(GRN_PREFS_TBSTYLE, grn_prefs.toolbar_style);
  gnome_config_set_int(GRN_PREFS_SRT_NG_SUBSCR, grn_prefs.srt_ng_subscr);
  gnome_config_set_int(GRN_PREFS_SRT_NG_COL, grn_prefs.srt_ng_col);
  gnome_config_set_int(GRN_PREFS_THRD_TL_TYPE, grn_prefs.thrd_tl_type);
  gnome_config_set_int(GRN_PREFS_SRT_TL_COL, grn_prefs.srt_tl_col);
  gnome_config_set_string(GRN_PREFS_NNTPSERV, grn_prefs.nntp_server);
  gnome_config_set_string(GRN_PREFS_NNTP_LOGIN, grn_prefs.nntp_login);
  gnome_config_set_string(GRN_PREFS_NNTP_PWD, grn_prefs.nntp_passwd);
  gnome_config_set_string(GRN_PREFS_SMTPSERV, grn_prefs.smtp_server);
  gnome_config_set_string(GRN_PREFS_NAME, grn_prefs.name);
  gnome_config_set_string(GRN_PREFS_EMAIL, grn_prefs.email);
  gnome_config_set_string(GRN_PREFS_REPLYTO, grn_prefs.replyto);
  gnome_config_set_string(GRN_PREFS_ORG, grn_prefs.org);
  gnome_config_set_string(GRN_PREFS_UA, grn_prefs.ua);
  gnome_config_set_string(GRN_PREFS_QUOTING, grn_prefs.re_quoting);
  gnome_config_set_string(GRN_PREFS_FNT_BODY_P, grn_prefs.fonts[0]);
  gnome_config_set_string(GRN_PREFS_FNT_BODY_M, grn_prefs.fonts[1]);
  gnome_config_set_string(GRN_PREFS_FNT_HDRS, grn_prefs.fonts[2]);
  gnome_config_set_string(GRN_PREFS_FNT_THRDLIST, grn_prefs.fonts[3]);
  gnome_config_set_string(GRN_PREFS_FNT_NGLIST, grn_prefs.fonts[4]);
  for (i=0; i<NPATHS; i++)
  {
    gchar *prefs_id = g_strdup_printf("%s%d", GRN_PREFS_PATHS, i);
    gnome_config_set_string(prefs_id, grn_prefs.paths[i]);
    str_free(&prefs_id);
  }
  for (i=0; i<NCOLORS; i++)
  {
    gchar prefs_id[512];
    snprintf(prefs_id, 512, "%s_r", prefs_fg_colors_ids[i]);
    gnome_config_set_int(prefs_id, grn_prefs.fg_colors[i].red);
    snprintf(prefs_id, 512, "%s_g", prefs_fg_colors_ids[i]);
    gnome_config_set_int(prefs_id, grn_prefs.fg_colors[i].green);
    snprintf(prefs_id, 512, "%s_b", prefs_fg_colors_ids[i]);
    gnome_config_set_int(prefs_id, grn_prefs.fg_colors[i].blue);

    snprintf(prefs_id, 512, "%s_r", prefs_bg_colors_ids[i]);
    gnome_config_set_int(prefs_id, grn_prefs.bg_colors[i].red);
    snprintf(prefs_id, 512, "%s_g", prefs_bg_colors_ids[i]);
    gnome_config_set_int(prefs_id, grn_prefs.bg_colors[i].green);
    snprintf(prefs_id, 512, "%s_b", prefs_bg_colors_ids[i]);
    gnome_config_set_int(prefs_id, grn_prefs.bg_colors[i].blue);
  }
  for (i=0; i<NPIXMAPS; i++)
  {
    gchar *buf = g_strdup_printf("%s%d", GRN_PREFS_PIXMAPS, i);
    gnome_config_set_string(buf, grn_prefs.pm_names[i]);
    str_free(&buf);
  }
  for (i=0; i<NCFMS; i++)
  {
    gchar *buf = g_strdup_printf("%s%d", GRN_PREFS_CFM, i);
    gnome_config_set_bool(buf, grn_prefs.cfms[i]);
    str_free(&buf);
  }
  
  n = g_slist_length(grn_prefs.fontpal);
  if (n > 0)
  {
    gnome_config_set_int(GRN_PREFS_FONT_N_PAL, n);
    l = grn_prefs.fontpal;
    i = 0;
    while (l && (i < n))
    {
      gchar *buf = g_strdup_printf("%s%d", GRN_PREFS_FONT_PAL, i);
      gnome_config_set_string(buf, l->data);  str_free(&buf);
      l = l->next;  i++;
    }
  }
  n = g_slist_length(grn_prefs.colorpal);
  if (n > 0)
  {
    gnome_config_set_int(GRN_PREFS_COLOR_N_PAL, n);
    l = grn_prefs.colorpal;
    i = 0;
    while (l && (i < n))
    {
      gchar *buf;
      GdkColor *clr = (GdkColor *) l->data;
      buf = g_strdup_printf("%s%d_r", GRN_PREFS_COLOR_PAL, i);
      gnome_config_set_int(buf, clr->red);  str_free(&buf);
      buf = g_strdup_printf("%s%d_g", GRN_PREFS_COLOR_PAL, i);
      gnome_config_set_int(buf, clr->green);  str_free(&buf);
      buf = g_strdup_printf("%s%d_b", GRN_PREFS_COLOR_PAL, i);
      gnome_config_set_int(buf, clr->blue);  str_free(&buf);
      l = l->next;  i++;
    }
  }
  for (i=0; i<NWINSTATES; i++)
  {
    gchar *buf;
    buf = g_strdup_printf("%s%d_w", GRN_PREFS_WINSTATES, i);
    gnome_config_set_int(buf, grn_prefs.ws[i].width);  str_free(&buf);
    buf = g_strdup_printf("%s%d_h", GRN_PREFS_WINSTATES, i);
    gnome_config_set_int(buf, grn_prefs.ws[i].height);  str_free(&buf);
    buf = g_strdup_printf("%s%d_x", GRN_PREFS_WINSTATES, i);
    gnome_config_set_int(buf, grn_prefs.ws[i].x);  str_free(&buf);
    buf = g_strdup_printf("%s%d_y", GRN_PREFS_WINSTATES, i);
    gnome_config_set_int(buf, grn_prefs.ws[i].y);  str_free(&buf);
  }
  gnome_config_sync();
}

void grn_prefs_realize(void)
{
  GnomeDockItem *item;
  GtkWidget *toolbar;

  item = gnome_app_get_dock_item_by_name(GNOME_APP(GRN->window), GNOME_APP_TOOLBAR_NAME);
  if (item)
  {
    toolbar = gnome_dock_item_get_child(item);
    if (toolbar)  gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), grn_get_toolbar_style());
  }
  if (GRN->tooltips)
  {
    if (grn_prefs.tooltips)  gtk_tooltips_enable(GRN->tooltips);
    else  gtk_tooltips_disable(GRN->tooltips);
  }
  if (GRN->msgwin)
  {
    GtkWidget *text = gtk_object_get_data(GTK_OBJECT(GRN->msgwin), KEY_TXT_BODY);
    GtkWidget *w;
    gchar *fnt_name;
    
    if (grn_prefs.mw_prop)  fnt_name = grn_prefs.fonts[0];
    else  fnt_name = grn_prefs.fonts[1];
    if (text)  grn_widget_set_style(text, fnt_name, NULL,
                 &(grn_prefs.bg_colors[0]), grn_prefs.pixmaps[0]);
    w = gtk_object_get_data(GTK_OBJECT(GRN->msgwin), KEY_MW_FROM);
    if (w)  grn_widget_set_style(w, grn_prefs.fonts[2], NULL, NULL, NULL);
    w = gtk_object_get_data(GTK_OBJECT(GRN->msgwin), KEY_MW_TO);
    if (w)  grn_widget_set_style(w, grn_prefs.fonts[2], NULL, NULL, NULL);
    w = gtk_object_get_data(GTK_OBJECT(GRN->msgwin), KEY_MW_DATE);
    if (w)  grn_widget_set_style(w, grn_prefs.fonts[2], NULL, NULL, NULL);
    w = gtk_object_get_data(GTK_OBJECT(GRN->msgwin), KEY_MW_SUBJ);
    if (w)  grn_widget_set_style(w, grn_prefs.fonts[2], NULL, NULL, NULL);
  }
  if (GRN->threadlist)
  {
    GtkWidget *ctree = gtk_object_get_data(GTK_OBJECT(GRN->threadlist), KEY_CT_MSGS);
    if (ctree)  grn_widget_set_style(ctree, grn_prefs.fonts[3], NULL, NULL, NULL);
  }
  if (GRN->grouplist)
  {
    GtkWidget *clist = gtk_object_get_data(GTK_OBJECT(GRN->grouplist), KEY_CL_GROUPS);
    if (clist)  grn_widget_set_style(clist, grn_prefs.fonts[4], NULL, NULL, NULL);
  }
}


gint grn_get_toolbar_style(void)
{
  if (grn_prefs.toolbar_style > (-1))  return grn_prefs.toolbar_style;
  if (gnome_preferences_get_toolbar_labels())  return GTK_TOOLBAR_BOTH;
  else  return GTK_TOOLBAR_ICONS;
}


syntax highlighted by Code2HTML, v. 0.9.1