Mercurial > pidgin
diff finch/libgnt/gntstyle.c @ 15817:0e3a8505ebbe
renamed gaim-text to finch
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Sun, 18 Mar 2007 19:38:15 +0000 |
parents | |
children | 8a54f74fecdf |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/finch/libgnt/gntstyle.c Sun Mar 18 19:38:15 2007 +0000 @@ -0,0 +1,268 @@ +#include "gntstyle.h" +#include "gntcolors.h" + +#include <ctype.h> +#include <string.h> + +#if GLIB_CHECK_VERSION(2,6,0) +static GKeyFile *gkfile; +#endif + +static char * str_styles[GNT_STYLES]; +static int int_styles[GNT_STYLES]; +static int bool_styles[GNT_STYLES]; + +const char *gnt_style_get(GntStyle style) +{ + return str_styles[style]; +} + +gboolean gnt_style_get_bool(GntStyle style, gboolean def) +{ + int i; + const char * str; + + if (bool_styles[style] != -1) + return bool_styles[style]; + + str = gnt_style_get(style); + + if (str) + { + if (strcmp(str, "false") == 0) + def = FALSE; + else if (strcmp(str, "true") == 0) + def = TRUE; + else if (sscanf(str, "%d", &i) == 1) + { + if (i) + def = TRUE; + else + def = FALSE; + } + } + + bool_styles[style] = def; + return bool_styles[style]; +} + +static void +refine(char *text) +{ + char *s = text, *t = text; + + while (*s) + { + if (*s == '^' && *(s + 1) == '[') + { + *t = '\033'; /* escape */ + s++; + } + else if (*s == '\\') + { + if (*(s + 1) == '\0') + *t = ' '; + else + { + s++; + if (*s == 'r' || *s == 'n') + *t = '\r'; + else if (*s == 't') + *t = '\t'; + else + *t = *s; + } + } + else + *t = *s; + t++; + s++; + } + *t = '\0'; +} + +static char * +parse_key(const char *key) +{ + return (char *)gnt_key_translate(key); +} + +void gnt_style_read_actions(GType type, GntBindableClass *klass) +{ +#if GLIB_CHECK_VERSION(2,6,0) + char *name; + GError *error = NULL; + + name = g_strdup_printf("%s::binding", g_type_name(type)); + + if (g_key_file_has_group(gkfile, name)) + { + gsize len = 0; + char **keys; + + keys = g_key_file_get_keys(gkfile, name, &len, &error); + if (error) + { + g_printerr("GntStyle: %s\n", error->message); + g_error_free(error); + g_free(name); + return; + } + + while (len--) + { + char *key, *action; + + key = g_strdup(keys[len]); + action = g_key_file_get_string(gkfile, name, keys[len], &error); + + if (error) + { + g_printerr("GntStyle: %s\n", error->message); + g_error_free(error); + error = NULL; + } + else + { + const char *keycode = parse_key(key); + if (keycode == NULL) { + g_printerr("GntStyle: Invalid key-binding %s\n", key); + } else { + gnt_bindable_register_binding(klass, action, keycode, NULL); + } + } + g_free(key); + g_free(action); + } + g_strfreev(keys); + } + g_free(name); +#endif +} + +void gnt_styles_get_keyremaps(GType type, GHashTable *hash) +{ +#if GLIB_CHECK_VERSION(2,6,0) + char *name; + GError *error = NULL; + + name = g_strdup_printf("%s::remap", g_type_name(type)); + + if (g_key_file_has_group(gkfile, name)) + { + gsize len = 0; + char **keys; + + keys = g_key_file_get_keys(gkfile, name, &len, &error); + if (error) + { + g_printerr("GntStyle: %s\n", error->message); + g_error_free(error); + g_free(name); + return; + } + + while (len--) + { + char *key, *replace; + + key = g_strdup(keys[len]); + replace = g_key_file_get_string(gkfile, name, keys[len], &error); + + if (error) + { + g_printerr("GntStyle: %s\n", error->message); + g_error_free(error); + error = NULL; + g_free(key); + } + else + { + refine(key); + refine(replace); + g_hash_table_insert(hash, key, replace); + } + } + g_strfreev(keys); + } + + g_free(name); +#endif +} + +#if GLIB_CHECK_VERSION(2,6,0) +static void +read_general_style(GKeyFile *kfile) +{ + GError *error = NULL; + gsize nkeys; + char **keys = g_key_file_get_keys(kfile, "general", &nkeys, &error); + int i; + struct + { + const char *style; + GntStyle en; + } styles[] = {{"shadow", GNT_STYLE_SHADOW}, + {"customcolor", GNT_STYLE_COLOR}, + {"mouse", GNT_STYLE_MOUSE}, + {"wm", GNT_STYLE_WM}, + {"remember_position", GNT_STYLE_REMPOS}, + {NULL, 0}}; + + if (error) + { + g_printerr("GntStyle: %s\n", error->message); + g_error_free(error); + } + else + { + for (i = 0; styles[i].style; i++) + { + error = NULL; + str_styles[styles[i].en] = + g_key_file_get_string(kfile, "general", styles[i].style, &error); + } + } + g_strfreev(keys); +} +#endif + +void gnt_style_read_configure_file(const char *filename) +{ +#if GLIB_CHECK_VERSION(2,6,0) + GError *error = NULL; + gkfile = g_key_file_new(); + + if (!g_key_file_load_from_file(gkfile, filename, G_KEY_FILE_NONE, &error)) + { + g_printerr("GntStyle: %s\n", error->message); + g_error_free(error); + return; + } + gnt_colors_parse(gkfile); + read_general_style(gkfile); +#endif +} + +void gnt_init_styles() +{ + int i; + for (i = 0; i < GNT_STYLES; i++) + { + str_styles[i] = NULL; + int_styles[i] = -1; + bool_styles[i] = -1; + } +} + +void gnt_uninit_styles() +{ + int i; + for (i = 0; i < GNT_STYLES; i++) + g_free(str_styles[i]); + +#if GLIB_CHECK_VERSION(2,6,0) + g_key_file_free(gkfile); +#endif +} +