Remove gsd_* default styles, use named styles instead.

Note: this relies on filetypes.common being installed.
Add load_style_entries(), which makes style initialization
simpler, used in styleset_c_like_init().



git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@3873 ea778897-0a13-0410-b9d1-a72fbfd435f5
This commit is contained in:
Nick Treleaven 2009-06-18 14:20:07 +00:00
parent 0c97d49ed2
commit 385ce9f9a9
4 changed files with 119 additions and 77 deletions

View File

@ -1,3 +1,12 @@
2009-06-18 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
* src/highlighting.c, README.Packagers, HACKING:
Remove gsd_* default styles, use named styles instead.
Note: this relies on filetypes.common being installed.
Add load_style_entries(), which makes style initialization
simpler, used in styleset_c_like_init().
2009-06-17 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* src/win32.c:

18
HACKING
View File

@ -236,19 +236,23 @@ the following things:
1. Write styleset_foo_init() to setup default styles and load style
settings from the filetypes.foo configuration file. You should probably
start by copying and adapting another filetype's initialization, such
as styleset_asm_init().
as styleset_tcl_init(). Another way is to use load_style_entries()
to make style initialization simpler - see styleset_c_like_init().
.. note::
Please try to make your styles fit in with the other filetypes' default
colors, and to use named styles where possible. Filetypes that share a
lexer should have the same colors. Normally, styles should leave the
background color empty to match the default color.
2. Write styleset_foo() to apply styles when a new scintilla widget
is created. Again you could copy and adapt a function like styleset_asm().
is created. Again you could copy and adapt a function like
styleset_tcl().
3. In highlighting_init_styles(), add
``init_styleset_case(GEANY_FILETYPES_FOO, foo);``.
4. In highlighting_set_styles(), add
``styleset_case(GEANY_FILETYPES_FOO, foo);``.
Please try to make your styles fit in with the other filetypes' default
colors, and to use named styles where possible. Filetypes that share a
lexer should have the same colors. Normally, styles should leave the
background color empty to match the default color.
Error message parsing
^^^^^^^^^^^^^^^^^^^^^
New-style error message parsing is done with an extended GNU-style regex

View File

@ -26,8 +26,9 @@ images. But if you do so, please include at least the text form of the
manual.
What you shouldn't skip in your package: the filetype.* files in the
data/ subdirectory, these files are important. If they are missing,
Geany has still a fallback mechanism for syntax highlighting but several
other features for certain filetypes will fail (mainly build support).
Geany still has a fallback mechanism for syntax highlighting (if
filetypes.common is installed) but several other features for certain
filetypes will fail (mainly build support).
Testing your package

View File

@ -106,6 +106,7 @@ static struct
typedef struct
{
gchar *name;
gchar *named_style;
GeanyLexerStyle *style;
} StyleEntry;
@ -114,22 +115,7 @@ typedef struct
* e.g. "comment" => &GeanyLexerStyle{0xd00000, 0xffffff, FALSE, FALSE} */
static GHashTable *named_style_hash = NULL;
/* Geany generic styles, initialized to defaults.
* Currently only used as default styling for C-like languages.
* Note: Ideally named styles would be used as common styling for all programming
* languages (and perhaps all filetypes).
* These could be replaced by default named styles in filetypes.common. */
static GeanyLexerStyle gsd_default = {0x000000, 0xffffff, FALSE, FALSE};
static GeanyLexerStyle gsd_comment = {0xd00000, 0xffffff, FALSE, FALSE};
static GeanyLexerStyle gsd_comment_doc = {0x3f5fbf, 0xffffff, TRUE, FALSE};
static GeanyLexerStyle gsd_number = {0x007f00, 0xffffff, FALSE, FALSE};
static GeanyLexerStyle gsd_reserved_word = {0x00007f, 0xffffff, TRUE, FALSE};
static GeanyLexerStyle gsd_system_word = {0x991111, 0xffffff, TRUE, FALSE};
static GeanyLexerStyle gsd_user_word = {0x0000d0, 0xffffff, TRUE, FALSE};
static GeanyLexerStyle gsd_string = {0xff901e, 0xffffff, FALSE, FALSE};
static GeanyLexerStyle gsd_pragma = {0x007f7f, 0xffffff, FALSE, FALSE};
static GeanyLexerStyle gsd_string_eol = {0x000000, 0xe0c0e0, FALSE, FALSE};
static GeanyLexerStyle gsd_default = {0x000000, 0xffffff, FALSE, FALSE};
static void new_style_array(gint file_type_id, gint styling_count)
@ -190,14 +176,21 @@ static void get_keyfile_wordchars(GKeyFile *config, GKeyFile *configh, gchar **w
}
static void read_named_style(gchar *name, GeanyLexerStyle *style)
/* Like glibc's strdupa, but portable.
* Don't use for long strings. */
#define local_strdup(dest, src) \
dest = g_alloca(strlen(src) + 1); \
strcpy(dest, src);
static void read_named_style(const gchar *named_style, GeanyLexerStyle *style)
{
GeanyLexerStyle *cs;
gchar *comma;
gchar *comma, *name = NULL;
const gchar *bold = NULL;
const gchar *italic = NULL;
g_return_if_fail(name);
g_return_if_fail(named_style);
local_strdup(name, named_style);
comma = strstr(name, ",");
if (comma)
@ -210,11 +203,11 @@ static void read_named_style(gchar *name, GeanyLexerStyle *style)
if (cs)
{
*style = *cs;
if (bold)
style->bold = !style->bold;
if (italic)
style->italic = !style->italic;
*style = *cs;
if (bold)
style->bold = !style->bold;
if (italic)
style->italic = !style->italic;
}
else
{
@ -224,15 +217,6 @@ static void read_named_style(gchar *name, GeanyLexerStyle *style)
}
/* convert 0x..RRGGBB to 0x..BBGGRR */
static gint rotate_rgb(gint color)
{
return ((color & 0xFF0000) >> 16) +
(color & 0x00FF00) +
((color & 0x0000FF) << 16);
}
static void parse_color(const gchar *str, gint *clr)
{
gint c;
@ -261,8 +245,6 @@ static void parse_keyfile_style(gchar **list,
g_return_if_fail(style);
*style = *default_style;
style->foreground = rotate_rgb(default_style->foreground);
style->background = rotate_rgb(default_style->background);
if (!list)
return;
@ -310,6 +292,26 @@ static void get_keyfile_style(GKeyFile *config, GKeyFile *configh,
}
static void get_keyfile_named_style(GKeyFile *config, GKeyFile *configh,
const gchar *key_name, gchar *named_style, GeanyLexerStyle *style)
{
GeanyLexerStyle def;
read_named_style(named_style, &def);
get_keyfile_style(config, configh, key_name, &def, style);
}
/* convert 0x..RRGGBB to 0x..BBGGRR */
static gint rotate_rgb(gint color)
{
return ((color & 0xFF0000) >> 16) +
(color & 0x00FF00) +
((color & 0x0000FF) << 16);
}
/* foreground and background are in 0xRRGGBB format */
static void get_keyfile_hex(GKeyFile *config, GKeyFile *configh,
const gchar *key,
gint foreground, gint background, gboolean bold,
@ -317,6 +319,8 @@ static void get_keyfile_hex(GKeyFile *config, GKeyFile *configh,
{
GeanyLexerStyle def = {foreground, background, bold, FALSE};
def.foreground = rotate_rgb(def.foreground);
def.background = rotate_rgb(def.background);
get_keyfile_style(config, configh, key, &def, style);
}
@ -754,43 +758,67 @@ apply_filetype_properties(ScintillaObject *sci, gint lexer, filetype_id ft_id)
}
#define foreach_range(i, size) \
for (i = 0; i < size; i++)
/* If used, entries[n].style should have foreground and background in 0xRRGGBB format */
static void load_style_entries(GKeyFile *config, GKeyFile *config_home, gint filetype_idx,
StyleEntry *entries, gsize entries_len)
{
guint i;
foreach_range(i, entries_len)
{
StyleEntry *entry = &entries[i];
GeanyLexerStyle *style = &style_sets[filetype_idx].styling[i];
if (entry->named_style)
get_keyfile_named_style(config, config_home, entry->name, entry->named_style, style);
else
if (entry->style)
{
GeanyLexerStyle *def = entry->style;
def->foreground = rotate_rgb(def->foreground);
def->background = rotate_rgb(def->background);
get_keyfile_style(config, config_home, entry->name, def, style);
}
}
}
/* call new_style_array(filetype_idx, >= 20) before using this. */
static void
styleset_c_like_init(GKeyFile *config, GKeyFile *config_home, gint filetype_idx)
{
static GeanyLexerStyle uuid = {0x404080, 0xffffff, FALSE, FALSE};
static GeanyLexerStyle operator = {0x301010, 0xffffff, FALSE, FALSE};
static GeanyLexerStyle verbatim = {0x301010, 0xffffff, FALSE, FALSE};
static GeanyLexerStyle regex = {0x105090, 0xffffff, FALSE, FALSE};
StyleEntry entries[] =
{
{"default", &gsd_default},
{"comment", &gsd_comment},
{"commentline", &gsd_comment},
{"commentdoc", &gsd_comment_doc},
{"number", &gsd_number},
{"word", &gsd_reserved_word},
{"word2", &gsd_system_word},
{"string", &gsd_string},
{"character", &gsd_string},
{"uuid", &uuid},
{"preprocessor",&gsd_pragma},
{"operator", &operator},
{"identifier", &gsd_default},
{"stringeol", &gsd_string_eol},
{"verbatim", &verbatim},
{"regex", &regex},
{"commentlinedoc", &gsd_comment_doc},
{"commentdockeyword", &gsd_comment_doc},
{"commentdockeyworderror", &gsd_comment_doc},
{"globalclass", &gsd_user_word}
{
{"default", "default", NULL},
{"comment", "comment", NULL},
{"commentline", "comment", NULL},
{"commentdoc", "commentdoc", NULL},
{"number", "number", NULL},
{"word", "word", NULL},
{"word2", "word2", NULL},
{"string", "string", NULL},
{"character", "string", NULL},
{"uuid", NULL, &uuid},
{"preprocessor","preprocessor", NULL},
{"operator", "operator", NULL},
{"identifier", "default", NULL},
{"stringeol", "stringeol", NULL},
{"verbatim", NULL, &verbatim},
{"regex", NULL, &regex},
{"commentlinedoc", "commentdoc,bold", NULL},
{"commentdockeyword", "commentdoc,bold,italic", NULL},
{"commentdockeyworderror", "commentdoc", NULL},
{"globalclass", "type", NULL}
};
gint i;
for (i = 0; i < 20; i++)
get_keyfile_style(config, config_home, entries[i].name, entries[i].style,
&style_sets[filetype_idx].styling[i]);
load_style_entries(config, config_home, filetype_idx, entries, G_N_ELEMENTS(entries));
}
@ -1127,7 +1155,7 @@ static void styleset_makefile_init(gint ft_id, GKeyFile *config, GKeyFile *confi
{
new_style_array(GEANY_FILETYPES_MAKE, 7);
get_keyfile_hex(config, config_home, "default", 0x00002f, 0xffffff, FALSE, &style_sets[GEANY_FILETYPES_MAKE].styling[0]);
get_keyfile_style(config, config_home, "comment", &gsd_comment, &style_sets[GEANY_FILETYPES_MAKE].styling[1]);
get_keyfile_named_style(config, config_home, "comment", "comment", &style_sets[GEANY_FILETYPES_MAKE].styling[1]);
get_keyfile_hex(config, config_home, "preprocessor", 0x007f7f, 0xffffff, FALSE, &style_sets[GEANY_FILETYPES_MAKE].styling[2]);
get_keyfile_hex(config, config_home, "identifier", 0x007f00, 0xffffff, FALSE, &style_sets[GEANY_FILETYPES_MAKE].styling[3]);
get_keyfile_hex(config, config_home, "operator", 0x301010, 0xffffff, FALSE, &style_sets[GEANY_FILETYPES_MAKE].styling[4]);
@ -1550,7 +1578,7 @@ static void styleset_perl_init(gint ft_id, GKeyFile *config, GKeyFile *config_ho
new_style_array(GEANY_FILETYPES_PERL, 35);
get_keyfile_hex(config, config_home, "default", 0x000000, 0xffffff, FALSE, &style_sets[GEANY_FILETYPES_PERL].styling[0]);
get_keyfile_hex(config, config_home, "error", 0xff0000, 0xffffff, FALSE, &style_sets[GEANY_FILETYPES_PERL].styling[1]);
get_keyfile_style(config, config_home, "commentline", &gsd_comment, &style_sets[GEANY_FILETYPES_PERL].styling[2]);
get_keyfile_named_style(config, config_home, "commentline", "comment", &style_sets[GEANY_FILETYPES_PERL].styling[2]);
get_keyfile_hex(config, config_home, "number", 0x007f00, 0xffffff, FALSE, &style_sets[GEANY_FILETYPES_PERL].styling[3]);
get_keyfile_hex(config, config_home, "word", 0x111199, 0xffffff, TRUE, &style_sets[GEANY_FILETYPES_PERL].styling[4]);
get_keyfile_hex(config, config_home, "string", 0xff901e, 0xffffff, FALSE, &style_sets[GEANY_FILETYPES_PERL].styling[5]);
@ -1849,7 +1877,7 @@ static void styleset_ruby_init(gint ft_id, GKeyFile *config, GKeyFile *config_ho
{
new_style_array(GEANY_FILETYPES_RUBY, 35);
get_keyfile_hex(config, config_home, "default", 0x000000, 0xffffff, FALSE, &style_sets[GEANY_FILETYPES_RUBY].styling[0]);
get_keyfile_style(config, config_home, "commentline", &gsd_comment, &style_sets[GEANY_FILETYPES_RUBY].styling[1]);
get_keyfile_named_style(config, config_home, "commentline", "comment", &style_sets[GEANY_FILETYPES_RUBY].styling[1]);
get_keyfile_hex(config, config_home, "number", 0x400080, 0xffffff, FALSE, &style_sets[GEANY_FILETYPES_RUBY].styling[2]);
get_keyfile_hex(config, config_home, "string", 0x008000, 0xffffff, FALSE, &style_sets[GEANY_FILETYPES_RUBY].styling[3]);
get_keyfile_hex(config, config_home, "character", 0x008000, 0xffffff, FALSE, &style_sets[GEANY_FILETYPES_RUBY].styling[4]);
@ -1944,7 +1972,7 @@ static void styleset_sh_init(gint ft_id, GKeyFile *config, GKeyFile *config_home
{
new_style_array(GEANY_FILETYPES_SH, 14);
get_keyfile_hex(config, config_home, "default", 0x000000, 0xffffff, FALSE, &style_sets[GEANY_FILETYPES_SH].styling[0]);
get_keyfile_style(config, config_home, "commentline", &gsd_comment, &style_sets[GEANY_FILETYPES_SH].styling[1]);
get_keyfile_named_style(config, config_home, "commentline", "comment", &style_sets[GEANY_FILETYPES_SH].styling[1]);
get_keyfile_hex(config, config_home, "number", 0x007f00, 0xffffff, FALSE, &style_sets[GEANY_FILETYPES_SH].styling[2]);
get_keyfile_hex(config, config_home, "word", 0x119911, 0xffffff, TRUE, &style_sets[GEANY_FILETYPES_SH].styling[3]);
get_keyfile_hex(config, config_home, "string", 0xff901e, 0xffffff, FALSE, &style_sets[GEANY_FILETYPES_SH].styling[4]);
@ -2776,8 +2804,8 @@ static void styleset_tcl_init(gint ft_id, GKeyFile *config, GKeyFile *config_hom
{
new_style_array(GEANY_FILETYPES_TCL, 16);
get_keyfile_hex(config, config_home, "default", 0x000000, 0xffffff, FALSE, &style_sets[GEANY_FILETYPES_TCL].styling[0]);
get_keyfile_style(config, config_home, "comment", &gsd_comment, &style_sets[GEANY_FILETYPES_TCL].styling[1]);
get_keyfile_style(config, config_home, "commentline", &gsd_comment, &style_sets[GEANY_FILETYPES_TCL].styling[2]);
get_keyfile_named_style(config, config_home, "comment", "comment", &style_sets[GEANY_FILETYPES_TCL].styling[1]);
get_keyfile_named_style(config, config_home, "commentline", "comment", &style_sets[GEANY_FILETYPES_TCL].styling[2]);
get_keyfile_hex(config, config_home, "number", 0x007f00, 0xffffff, FALSE, &style_sets[GEANY_FILETYPES_TCL].styling[3]);
get_keyfile_hex(config, config_home, "operator", 0x301010, 0xffffff, FALSE, &style_sets[GEANY_FILETYPES_TCL].styling[4]);
get_keyfile_hex(config, config_home, "identifier", 0xa20000, 0xffffff, FALSE, &style_sets[GEANY_FILETYPES_TCL].styling[5]);