Fix 'null' listed in both primary and secondary keyword lists.
[geany-mirror.git] / src / highlighting.c
bloba06933a53603d4f813f325162c5ce15cf9b0cfcf
1 /*
2 * highlighting.c - this file is part of Geany, a fast and lightweight IDE
4 * Copyright 2005-2010 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
5 * Copyright 2006-2010 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 * $Id$
24 /**
25 * @file highlighting.h
26 * Syntax highlighting for the different filetypes, using the Scintilla lexers.
29 #include "geany.h"
31 #include <stdlib.h>
32 #include <ctype.h>
33 #include <string.h>
35 #include "SciLexer.h"
36 #include "highlighting.h"
37 #include "editor.h"
38 #include "utils.h"
39 #include "filetypes.h"
40 #include "symbols.h"
41 #include "ui_utils.h"
42 #include "utils.h"
43 #include "main.h"
44 #include "support.h"
45 #include "sciwrappers.h"
48 #define GEANY_COLORSCHEMES_SUBDIR "colorschemes"
50 /* Whitespace has to be set after setting wordchars. */
51 #define GEANY_WHITESPACE_CHARS " \t" "!\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~"
54 static gchar *whitespace_chars;
57 static void styleset_markup(ScintillaObject *sci, gboolean set_keywords);
60 typedef struct
62 gsize count; /* number of styles */
63 GeanyLexerStyle *styling; /* array of styles, NULL if not used or uninitialised */
64 gchar **keywords;
65 gchar *wordchars; /* NULL used for style sets with no styles */
66 gchar **property_keys;
67 gchar **property_values;
68 } StyleSet;
70 /* each filetype has a styleset but GEANY_FILETYPES_NONE uses common_style_set for styling */
71 static StyleSet *style_sets = NULL;
74 enum /* Geany common styling */
76 GCS_DEFAULT,
77 GCS_SELECTION,
78 GCS_BRACE_GOOD,
79 GCS_BRACE_BAD,
80 GCS_MARGIN_LINENUMBER,
81 GCS_MARGIN_FOLDING,
82 GCS_CURRENT_LINE,
83 GCS_CARET,
84 GCS_INDENT_GUIDE,
85 GCS_WHITE_SPACE,
86 GCS_LINE_WRAP_VISUALS,
87 GCS_LINE_WRAP_INDENT,
88 GCS_TRANSLUCENCY,
89 GCS_MARKER_LINE,
90 GCS_MARKER_SEARCH,
91 GCS_MARKER_MARK,
92 GCS_MARKER_TRANSLUCENCY,
93 GCS_LINE_HEIGHT,
94 GCS_CALLTIPS,
95 GCS_MAX
98 static struct
100 GeanyLexerStyle styling[GCS_MAX];
102 /* icon style, 1-4 */
103 gint fold_marker;
104 /* vertical line style, 0-2 */
105 gint fold_lines;
106 /* horizontal line when folded, 0-2 */
107 gint fold_draw_line;
109 gchar *wordchars;
110 } common_style_set;
113 /* For filetypes.common [named_styles] section.
114 * 0xBBGGRR format.
115 * e.g. "comment" => &GeanyLexerStyle{0x0000d0, 0xffffff, FALSE, FALSE} */
116 static GHashTable *named_style_hash = NULL;
118 /* 0xBBGGRR format, set by "default" named style. */
119 static GeanyLexerStyle gsd_default = {0x000000, 0xffffff, FALSE, FALSE};
122 /* Note: use sciwrappers.h instead where possible.
123 * Do not use SSM in files unrelated to scintilla. */
124 #define SSM(s, m, w, l) scintilla_send_message(s, m, w, l)
126 /* filetypes should use the filetypes.foo [lexer_properties] group instead of hardcoding */
127 static void sci_set_property(ScintillaObject *sci, const gchar *name, const gchar *value)
129 SSM(sci, SCI_SETPROPERTY, (uptr_t) name, (sptr_t) value);
133 static void new_styleset(gint file_type_id, gint styling_count)
135 StyleSet *set = &style_sets[file_type_id];
137 set->count = styling_count;
138 set->styling = g_new0(GeanyLexerStyle, styling_count);
142 static void free_styleset(gint file_type_id)
144 StyleSet *style_ptr;
145 style_ptr = &style_sets[file_type_id];
147 style_ptr->count = 0;
148 g_free(style_ptr->styling);
149 style_ptr->styling = NULL;
150 g_strfreev(style_ptr->keywords);
151 style_ptr->keywords = NULL;
152 g_free(style_ptr->wordchars);
153 style_ptr->wordchars = NULL;
154 g_strfreev(style_ptr->property_keys);
155 style_ptr->property_keys = NULL;
156 g_strfreev(style_ptr->property_values);
157 style_ptr->property_values = NULL;
161 static void get_keyfile_keywords(GKeyFile *config, GKeyFile *configh,
162 const gchar *key, gint ft_id, gint pos)
164 const gchar section[] = "keywords";
165 gchar *result;
166 const gchar *default_value = "";
168 if (config == NULL || configh == NULL)
170 style_sets[ft_id].keywords[pos] = g_strdup(default_value);
171 return;
174 result = g_key_file_get_string(configh, section, key, NULL);
175 if (result == NULL)
176 result = g_key_file_get_string(config, section, key, NULL);
178 if (result == NULL)
180 style_sets[ft_id].keywords[pos] = g_strdup(default_value);
182 else
184 style_sets[ft_id].keywords[pos] = result;
189 static void get_keyfile_wordchars(GKeyFile *config, GKeyFile *configh, gchar **wordchars)
191 gchar *result;
193 if (config == NULL || configh == NULL)
195 *wordchars = g_strdup(GEANY_WORDCHARS);
196 return;
199 result = g_key_file_get_string(configh, "settings", "wordchars", NULL);
200 if (result == NULL) result = g_key_file_get_string(config, "settings", "wordchars", NULL);
202 if (result == NULL)
204 *wordchars = g_strdup(GEANY_WORDCHARS);
206 else
207 *wordchars = result;
211 static void read_named_style(const gchar *named_style, GeanyLexerStyle *style)
213 GeanyLexerStyle *cs;
214 gchar *comma, *name = NULL;
215 const gchar *bold = NULL;
216 const gchar *italic = NULL;
218 g_return_if_fail(named_style);
219 name = utils_strdupa(named_style); /* named_style must not be written to, may be a static string */
221 comma = strstr(name, ",");
222 if (comma)
224 bold = strstr(comma, ",bold");
225 italic = strstr(comma, ",italic");
226 *comma = '\0'; /* terminate name to make lookup work */
228 cs = g_hash_table_lookup(named_style_hash, name);
230 if (cs)
232 *style = *cs;
233 if (bold)
234 style->bold = !style->bold;
235 if (italic)
236 style->italic = !style->italic;
238 else
240 *style = gsd_default;
241 geany_debug("No named style '%s'! Check filetypes.common.", name);
246 static void parse_color(const gchar *str, gint *clr)
248 gint c;
250 /* ignore empty strings */
251 if (!NZV(str))
252 return;
254 c = utils_strtod(str, NULL, FALSE);
255 if (c > -1)
257 *clr = c;
258 return;
260 geany_debug("Bad color '%s'", str);
264 static void parse_keyfile_style(gchar **list,
265 const GeanyLexerStyle *default_style, GeanyLexerStyle *style)
267 gsize len;
268 gchar *str;
270 g_return_if_fail(default_style);
271 g_return_if_fail(style);
273 *style = *default_style;
275 if (!list)
276 return;
278 len = g_strv_length(list);
280 str = list[0];
281 if (len == 1 && isalpha(str[0]))
282 read_named_style(str, style);
283 else
285 switch (len)
287 case 4:
288 style->italic = utils_atob(list[3]);
289 case 3:
290 style->bold = utils_atob(list[2]);
291 case 2:
292 parse_color(list[1], &style->background);
293 case 1:
294 parse_color(list[0], &style->foreground);
300 static void get_keyfile_style(GKeyFile *config, GKeyFile *configh,
301 const gchar *key_name, GeanyLexerStyle *style)
303 gchar **list;
304 gsize len;
306 g_return_if_fail(config);
307 g_return_if_fail(configh);
308 g_return_if_fail(key_name);
309 g_return_if_fail(style);
311 list = g_key_file_get_string_list(configh, "styling", key_name, &len, NULL);
312 if (list == NULL)
313 list = g_key_file_get_string_list(config, "styling", key_name, &len, NULL);
315 parse_keyfile_style(list, &gsd_default, style);
316 g_strfreev(list);
320 /* Convert 0xRRGGBB to 0xBBGGRR, which scintilla expects. */
321 static gint rotate_rgb(gint color)
323 return ((color & 0xFF0000) >> 16) +
324 (color & 0x00FF00) +
325 ((color & 0x0000FF) << 16);
329 static void convert_int(const gchar *int_str, gint *val)
331 gchar *end;
332 gint v = strtol(int_str, &end, 10);
334 if (int_str != end)
335 *val = v;
339 /* Get first and second integer numbers, store in foreground and background fields of @a style. */
340 static void get_keyfile_int(GKeyFile *config, GKeyFile *configh, const gchar *section,
341 const gchar *key, gint fdefault_val, gint sdefault_val,
342 GeanyLexerStyle *style)
344 gchar **list;
345 gsize len;
346 GeanyLexerStyle def = {fdefault_val, sdefault_val, FALSE, FALSE};
348 g_return_if_fail(config);
349 g_return_if_fail(configh);
350 g_return_if_fail(section);
351 g_return_if_fail(key);
353 list = g_key_file_get_string_list(configh, section, key, &len, NULL);
354 if (list == NULL)
355 list = g_key_file_get_string_list(config, section, key, &len, NULL);
357 *style = def;
358 if (!list)
359 return;
361 if (list[0])
363 convert_int(list[0], &style->foreground);
364 if (list[1])
366 convert_int(list[1], &style->background);
369 g_strfreev(list);
373 /* first or second can be NULL. */
374 static void get_keyfile_ints(GKeyFile *config, GKeyFile *configh, const gchar *section,
375 const gchar *key,
376 gint fdefault_val, gint sdefault_val,
377 gint *first, gint *second)
379 GeanyLexerStyle tmp_style;
381 get_keyfile_int(config, configh, section, key, fdefault_val, sdefault_val, &tmp_style);
382 if (first)
383 *first = tmp_style.foreground;
384 if (second)
385 *second = tmp_style.background;
389 static guint invert(guint icolour)
391 if (interface_prefs.highlighting_invert_all)
392 return utils_invert_color(icolour);
394 return icolour;
398 static GeanyLexerStyle *get_style(guint ft_id, guint styling_index)
400 g_assert(ft_id < filetypes_array->len);
402 if (G_UNLIKELY(ft_id == GEANY_FILETYPES_NONE))
404 g_assert(styling_index < GCS_MAX);
405 return &common_style_set.styling[styling_index];
407 else
409 StyleSet *set = &style_sets[ft_id];
411 g_assert(styling_index < set->count);
412 return &set->styling[styling_index];
417 static void set_sci_style(ScintillaObject *sci, gint style, guint ft_id, guint styling_index)
419 GeanyLexerStyle *style_ptr = get_style(ft_id, styling_index);
421 SSM(sci, SCI_STYLESETFORE, style, invert(style_ptr->foreground));
422 SSM(sci, SCI_STYLESETBACK, style, invert(style_ptr->background));
423 SSM(sci, SCI_STYLESETBOLD, style, style_ptr->bold);
424 SSM(sci, SCI_STYLESETITALIC, style, style_ptr->italic);
428 void highlighting_free_styles()
430 guint i;
432 for (i = 0; i < filetypes_array->len; i++)
433 free_styleset(i);
435 if (named_style_hash)
436 g_hash_table_destroy(named_style_hash);
438 if (style_sets)
439 g_free(style_sets);
443 static GString *get_global_typenames(gint lang)
445 GString *s = NULL;
447 if (app->tm_workspace)
449 GPtrArray *tags_array = app->tm_workspace->global_tags;
451 if (tags_array)
453 s = symbols_find_tags_as_string(tags_array, TM_GLOBAL_TYPE_MASK, lang);
456 return s;
460 static gchar*
461 get_keyfile_whitespace_chars(GKeyFile *config, GKeyFile *configh)
463 gchar *result;
465 if (config == NULL || configh == NULL)
467 result = NULL;
469 else
471 result = g_key_file_get_string(configh, "settings", "whitespace_chars", NULL);
472 if (result == NULL)
473 result = g_key_file_get_string(config, "settings", "whitespace_chars", NULL);
475 if (result == NULL)
476 result = g_strdup(GEANY_WHITESPACE_CHARS);
477 return result;
481 static void add_named_style(GKeyFile *config, const gchar *key)
483 const gchar group[] = "named_styles";
484 gchar **list;
485 gsize len;
487 list = g_key_file_get_string_list(config, group, key, &len, NULL);
488 /* we allow a named style to reference another style above it */
489 if (list && len >= 1)
491 GeanyLexerStyle *style = g_new0(GeanyLexerStyle, 1);
493 parse_keyfile_style(list, &gsd_default, style);
494 g_hash_table_insert(named_style_hash, g_strdup(key), style);
496 g_strfreev(list);
500 static void get_named_styles(GKeyFile *config)
502 const gchar group[] = "named_styles";
503 gchar **keys = g_key_file_get_keys(config, group, NULL, NULL);
504 gchar **ptr = keys;
506 if (!ptr)
507 return;
509 while (1)
511 const gchar *key = *ptr;
513 if (!key)
514 break;
516 /* don't replace already read default style with system one */
517 if (!g_str_equal(key, "default"))
518 add_named_style(config, key);
520 ptr++;
522 g_strfreev(keys);
526 static GKeyFile *utils_key_file_new(const gchar *filename)
528 GKeyFile *config = g_key_file_new();
530 g_key_file_load_from_file(config, filename, G_KEY_FILE_KEEP_COMMENTS, NULL);
531 return config;
535 static void load_named_styles(GKeyFile *config, GKeyFile *config_home)
537 const gchar *scheme = editor_prefs.color_scheme;
538 gboolean free_kf = FALSE;
540 if (named_style_hash)
541 g_hash_table_destroy(named_style_hash); /* reloading */
543 named_style_hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
545 if (NZV(scheme))
547 gchar *path, *path_home;
549 path = g_build_path(G_DIR_SEPARATOR_S, app->datadir, GEANY_COLORSCHEMES_SUBDIR, scheme, NULL);
550 path_home = g_build_path(G_DIR_SEPARATOR_S, app->configdir, GEANY_COLORSCHEMES_SUBDIR, scheme, NULL);
552 if (g_file_test(path, G_FILE_TEST_EXISTS) || g_file_test(path_home, G_FILE_TEST_EXISTS))
554 config = utils_key_file_new(path);
555 config_home = utils_key_file_new(path_home);
556 free_kf = TRUE;
558 /* if color scheme is missing, use default */
559 g_free(path);
560 g_free(path_home);
562 /* first set default to the "default" named style */
563 add_named_style(config, "default");
564 read_named_style("default", &gsd_default); /* in case user overrides but not with both colors */
565 add_named_style(config_home, "default");
566 read_named_style("default", &gsd_default);
568 get_named_styles(config);
569 /* home overrides any system named style */
570 get_named_styles(config_home);
572 if (free_kf)
574 g_key_file_free(config);
575 g_key_file_free(config_home);
580 static void styleset_common_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
582 load_named_styles(config, config_home);
584 get_keyfile_style(config, config_home, "default", &common_style_set.styling[GCS_DEFAULT]);
585 get_keyfile_style(config, config_home, "selection", &common_style_set.styling[GCS_SELECTION]);
586 get_keyfile_style(config, config_home, "brace_good", &common_style_set.styling[GCS_BRACE_GOOD]);
587 get_keyfile_style(config, config_home, "brace_bad", &common_style_set.styling[GCS_BRACE_BAD]);
588 get_keyfile_style(config, config_home, "margin_linenumber", &common_style_set.styling[GCS_MARGIN_LINENUMBER]);
589 get_keyfile_style(config, config_home, "margin_folding", &common_style_set.styling[GCS_MARGIN_FOLDING]);
590 get_keyfile_style(config, config_home, "current_line", &common_style_set.styling[GCS_CURRENT_LINE]);
591 get_keyfile_style(config, config_home, "caret", &common_style_set.styling[GCS_CARET]);
592 get_keyfile_style(config, config_home, "indent_guide", &common_style_set.styling[GCS_INDENT_GUIDE]);
593 get_keyfile_style(config, config_home, "white_space", &common_style_set.styling[GCS_WHITE_SPACE]);
594 get_keyfile_style(config, config_home, "marker_line", &common_style_set.styling[GCS_MARKER_LINE]);
595 get_keyfile_style(config, config_home, "marker_search", &common_style_set.styling[GCS_MARKER_SEARCH]);
596 get_keyfile_style(config, config_home, "marker_mark", &common_style_set.styling[GCS_MARKER_MARK]);
597 get_keyfile_style(config, config_home, "calltips", &common_style_set.styling[GCS_CALLTIPS]);
599 get_keyfile_ints(config, config_home, "styling", "folding_style",
600 1, 1, &common_style_set.fold_marker, &common_style_set.fold_lines);
601 get_keyfile_ints(config, config_home, "styling", "folding_horiz_line",
602 2, 0, &common_style_set.fold_draw_line, NULL);
603 get_keyfile_ints(config, config_home, "styling", "caret_width",
604 1, 0, &common_style_set.styling[GCS_CARET].background, NULL); /* caret.foreground used earlier */
605 get_keyfile_int(config, config_home, "styling", "line_wrap_visuals",
606 3, 0, &common_style_set.styling[GCS_LINE_WRAP_VISUALS]);
607 get_keyfile_int(config, config_home, "styling", "line_wrap_indent",
608 0, 0, &common_style_set.styling[GCS_LINE_WRAP_INDENT]);
609 get_keyfile_int(config, config_home, "styling", "translucency",
610 256, 256, &common_style_set.styling[GCS_TRANSLUCENCY]);
611 get_keyfile_int(config, config_home, "styling", "marker_translucency",
612 256, 256, &common_style_set.styling[GCS_MARKER_TRANSLUCENCY]);
613 get_keyfile_int(config, config_home, "styling", "line_height",
614 0, 0, &common_style_set.styling[GCS_LINE_HEIGHT]);
616 get_keyfile_wordchars(config, config_home, &common_style_set.wordchars);
617 whitespace_chars = get_keyfile_whitespace_chars(config, config_home);
621 static void styleset_common(ScintillaObject *sci, filetype_id ft_id)
623 SSM(sci, SCI_STYLECLEARALL, 0, 0);
625 SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) (ft_id == GEANY_FILETYPES_NONE ?
626 common_style_set.wordchars : style_sets[ft_id].wordchars));
627 /* have to set whitespace after setting wordchars */
628 SSM(sci, SCI_SETWHITESPACECHARS, 0, (sptr_t) whitespace_chars);
630 /* caret colour, style and width */
631 SSM(sci, SCI_SETCARETFORE, invert(common_style_set.styling[GCS_CARET].foreground), 0);
632 SSM(sci, SCI_SETCARETWIDTH, common_style_set.styling[GCS_CARET].background, 0);
633 if (common_style_set.styling[GCS_CARET].bold)
634 SSM(sci, SCI_SETCARETSTYLE, CARETSTYLE_BLOCK, 0);
635 else
636 SSM(sci, SCI_SETCARETSTYLE, CARETSTYLE_LINE, 0);
638 /* line height */
639 SSM(sci, SCI_SETEXTRAASCENT, common_style_set.styling[GCS_LINE_HEIGHT].foreground, 0);
640 SSM(sci, SCI_SETEXTRADESCENT, common_style_set.styling[GCS_LINE_HEIGHT].background, 0);
642 /* colourise the current line */
643 SSM(sci, SCI_SETCARETLINEBACK, invert(common_style_set.styling[GCS_CURRENT_LINE].background), 0);
644 /* bold=enable current line */
645 SSM(sci, SCI_SETCARETLINEVISIBLE, common_style_set.styling[GCS_CURRENT_LINE].bold, 0);
647 /* Translucency for current line and selection */
648 SSM(sci, SCI_SETCARETLINEBACKALPHA, common_style_set.styling[GCS_TRANSLUCENCY].foreground, 0);
649 SSM(sci, SCI_SETSELALPHA, common_style_set.styling[GCS_TRANSLUCENCY].background, 0);
651 /* line wrapping visuals */
652 SSM(sci, SCI_SETWRAPVISUALFLAGS,
653 common_style_set.styling[GCS_LINE_WRAP_VISUALS].foreground, 0);
654 SSM(sci, SCI_SETWRAPVISUALFLAGSLOCATION,
655 common_style_set.styling[GCS_LINE_WRAP_VISUALS].background, 0);
656 SSM(sci, SCI_SETWRAPSTARTINDENT, common_style_set.styling[GCS_LINE_WRAP_INDENT].foreground, 0);
657 SSM(sci, SCI_SETWRAPINDENTMODE, common_style_set.styling[GCS_LINE_WRAP_INDENT].background, 0);
659 /* Error indicator */
660 SSM(sci, SCI_INDICSETSTYLE, GEANY_INDICATOR_ERROR, INDIC_SQUIGGLE);
661 SSM(sci, SCI_INDICSETFORE, GEANY_INDICATOR_ERROR, invert(rotate_rgb(0xff0000)));
663 /* Search indicator, used for 'Mark' matches */
664 SSM(sci, SCI_INDICSETSTYLE, GEANY_INDICATOR_SEARCH, INDIC_ROUNDBOX);
665 SSM(sci, SCI_INDICSETFORE, GEANY_INDICATOR_SEARCH,
666 invert(common_style_set.styling[GCS_MARKER_SEARCH].background));
667 SSM(sci, SCI_INDICSETALPHA, GEANY_INDICATOR_SEARCH, 60);
669 /* define marker symbols
670 * 0 -> line marker */
671 SSM(sci, SCI_MARKERDEFINE, 0, SC_MARK_SHORTARROW);
672 SSM(sci, SCI_MARKERSETFORE, 0, invert(common_style_set.styling[GCS_MARKER_LINE].foreground));
673 SSM(sci, SCI_MARKERSETBACK, 0, invert(common_style_set.styling[GCS_MARKER_LINE].background));
674 SSM(sci, SCI_MARKERSETALPHA, 0, common_style_set.styling[GCS_MARKER_TRANSLUCENCY].foreground);
676 /* 1 -> user marker */
677 SSM(sci, SCI_MARKERDEFINE, 1, SC_MARK_PLUS);
678 SSM(sci, SCI_MARKERSETFORE, 1, invert(common_style_set.styling[GCS_MARKER_MARK].foreground));
679 SSM(sci, SCI_MARKERSETBACK, 1, invert(common_style_set.styling[GCS_MARKER_MARK].background));
680 SSM(sci, SCI_MARKERSETALPHA, 1, common_style_set.styling[GCS_MARKER_TRANSLUCENCY].background);
682 /* 2 -> folding marker, other folding settings */
683 SSM(sci, SCI_SETMARGINTYPEN, 2, SC_MARGIN_SYMBOL);
684 SSM(sci, SCI_SETMARGINMASKN, 2, SC_MASK_FOLDERS);
686 /* drawing a horizontal line when text if folded */
687 switch (common_style_set.fold_draw_line)
689 case 1:
691 SSM(sci, SCI_SETFOLDFLAGS, 4, 0);
692 break;
694 case 2:
696 SSM(sci, SCI_SETFOLDFLAGS, 16, 0);
697 break;
699 default:
701 SSM(sci, SCI_SETFOLDFLAGS, 0, 0);
702 break;
706 /* choose the folding style - boxes or circles, I prefer boxes, so it is default ;-) */
707 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDEREND, SC_MARK_EMPTY);
708 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY);
709 switch (common_style_set.fold_marker)
711 case 2:
712 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDEROPEN, SC_MARK_CIRCLEMINUS);
713 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDER, SC_MARK_CIRCLEPLUS);
714 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDEREND, SC_MARK_CIRCLEPLUSCONNECTED);
715 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDEROPENMID, SC_MARK_CIRCLEMINUSCONNECTED);
716 break;
717 default:
718 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDEROPEN, SC_MARK_BOXMINUS);
719 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDER, SC_MARK_BOXPLUS);
720 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDEREND, SC_MARK_BOXPLUSCONNECTED);
721 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDEROPENMID, SC_MARK_BOXMINUSCONNECTED);
722 break;
723 case 3:
724 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDEROPEN, SC_MARK_ARROWDOWN);
725 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDER, SC_MARK_ARROW);
726 break;
727 case 4:
728 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDEROPEN, SC_MARK_MINUS);
729 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDER, SC_MARK_PLUS);
730 break;
733 /* choose the folding style - straight or curved, I prefer straight, so it is default ;-) */
734 switch (common_style_set.fold_lines)
736 case 2:
737 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_TCORNERCURVE);
738 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDERTAIL, SC_MARK_LCORNERCURVE);
739 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDERSUB, SC_MARK_VLINE);
740 break;
741 default:
742 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_TCORNER);
743 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDERTAIL, SC_MARK_LCORNER);
744 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDERSUB, SC_MARK_VLINE);
745 break;
746 case 0:
747 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_EMPTY);
748 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDERTAIL, SC_MARK_EMPTY);
749 SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_FOLDERSUB, SC_MARK_EMPTY);
750 break;
753 SSM(sci, SCI_MARKERSETFORE, SC_MARKNUM_FOLDEROPEN,
754 invert(common_style_set.styling[GCS_MARGIN_FOLDING].background));
755 SSM(sci, SCI_MARKERSETBACK, SC_MARKNUM_FOLDEROPEN,
756 invert(common_style_set.styling[GCS_MARGIN_FOLDING].foreground));
757 SSM(sci, SCI_MARKERSETFORE, SC_MARKNUM_FOLDER,
758 invert(common_style_set.styling[GCS_MARGIN_FOLDING].background));
759 SSM(sci, SCI_MARKERSETBACK, SC_MARKNUM_FOLDER,
760 invert(common_style_set.styling[GCS_MARGIN_FOLDING].foreground));
761 SSM(sci, SCI_MARKERSETFORE, SC_MARKNUM_FOLDERSUB,
762 invert(common_style_set.styling[GCS_MARGIN_FOLDING].background));
763 SSM(sci, SCI_MARKERSETBACK, SC_MARKNUM_FOLDERSUB,
764 invert(common_style_set.styling[GCS_MARGIN_FOLDING].foreground));
765 SSM(sci, SCI_MARKERSETFORE, SC_MARKNUM_FOLDERTAIL,
766 invert(common_style_set.styling[GCS_MARGIN_FOLDING].background));
767 SSM(sci, SCI_MARKERSETBACK, SC_MARKNUM_FOLDERTAIL,
768 invert(common_style_set.styling[GCS_MARGIN_FOLDING].foreground));
769 SSM(sci, SCI_MARKERSETFORE, SC_MARKNUM_FOLDEREND,
770 invert(common_style_set.styling[GCS_MARGIN_FOLDING].background));
771 SSM(sci, SCI_MARKERSETBACK, SC_MARKNUM_FOLDEREND,
772 invert(common_style_set.styling[GCS_MARGIN_FOLDING].foreground));
773 SSM(sci, SCI_MARKERSETFORE, SC_MARKNUM_FOLDEROPENMID,
774 invert(common_style_set.styling[GCS_MARGIN_FOLDING].background));
775 SSM(sci, SCI_MARKERSETBACK, SC_MARKNUM_FOLDEROPENMID,
776 invert(common_style_set.styling[GCS_MARGIN_FOLDING].foreground));
777 SSM(sci, SCI_MARKERSETFORE, SC_MARKNUM_FOLDERMIDTAIL,
778 invert(common_style_set.styling[GCS_MARGIN_FOLDING].background));
779 SSM(sci, SCI_MARKERSETBACK, SC_MARKNUM_FOLDERMIDTAIL,
780 invert(common_style_set.styling[GCS_MARGIN_FOLDING].foreground));
782 sci_set_property(sci, "fold", "1");
783 sci_set_property(sci, "fold.compact", "0");
784 sci_set_property(sci, "fold.comment", "1");
785 sci_set_property(sci, "fold.preprocessor", "1");
786 sci_set_property(sci, "fold.at.else", "1");
789 /* bold (3rd argument) is whether to override default foreground selection */
790 if (common_style_set.styling[GCS_SELECTION].bold)
791 SSM(sci, SCI_SETSELFORE, 1, invert(common_style_set.styling[GCS_SELECTION].foreground));
792 /* italic (4th argument) is whether to override default background selection */
793 if (common_style_set.styling[GCS_SELECTION].italic)
794 SSM(sci, SCI_SETSELBACK, 1, invert(common_style_set.styling[GCS_SELECTION].background));
796 SSM(sci, SCI_SETSTYLEBITS, SSM(sci, SCI_GETSTYLEBITSNEEDED, 0, 0), 0);
798 /* TODO maybe we want to split the colour and hicolour to allow more fine-grained control */
799 SSM(sci, SCI_SETFOLDMARGINCOLOUR, 1, invert(common_style_set.styling[GCS_MARGIN_FOLDING].background));
800 SSM(sci, SCI_SETFOLDMARGINHICOLOUR, 1, invert(common_style_set.styling[GCS_MARGIN_FOLDING].background));
801 set_sci_style(sci, STYLE_LINENUMBER, GEANY_FILETYPES_NONE, GCS_MARGIN_LINENUMBER);
802 set_sci_style(sci, STYLE_BRACELIGHT, GEANY_FILETYPES_NONE, GCS_BRACE_GOOD);
803 set_sci_style(sci, STYLE_BRACEBAD, GEANY_FILETYPES_NONE, GCS_BRACE_BAD);
804 set_sci_style(sci, STYLE_INDENTGUIDE, GEANY_FILETYPES_NONE, GCS_INDENT_GUIDE);
806 /* bold = common whitespace settings enabled */
807 SSM(sci, SCI_SETWHITESPACEFORE, common_style_set.styling[GCS_WHITE_SPACE].bold,
808 invert(common_style_set.styling[GCS_WHITE_SPACE].foreground));
809 SSM(sci, SCI_SETWHITESPACEBACK, common_style_set.styling[GCS_WHITE_SPACE].italic,
810 invert(common_style_set.styling[GCS_WHITE_SPACE].background));
812 if (common_style_set.styling[GCS_CALLTIPS].bold)
813 SSM(sci, SCI_CALLTIPSETFORE, invert(common_style_set.styling[GCS_CALLTIPS].foreground), 1);
814 if (common_style_set.styling[GCS_CALLTIPS].italic)
815 SSM(sci, SCI_CALLTIPSETBACK, invert(common_style_set.styling[GCS_CALLTIPS].background), 1);
819 /* Merge & assign global typedefs and user secondary keywords.
820 * keyword_idx is used for both style_sets[].keywords and scintilla keyword style number */
821 static void merge_type_keywords(ScintillaObject *sci, gint ft_id, gint keyword_idx)
823 const gchar *user_words = style_sets[ft_id].keywords[keyword_idx];
824 GString *s;
826 s = get_global_typenames(filetypes[ft_id]->lang);
827 if (G_UNLIKELY(s == NULL))
828 s = g_string_sized_new(200);
829 else
830 g_string_append_c(s, ' '); /* append a space as delimiter to the existing list of words */
832 g_string_append(s, user_words);
834 sci_set_keywords(sci, keyword_idx, s->str);
835 g_string_free(s, TRUE);
839 /* All stylesets except None should call this. */
840 static void
841 apply_filetype_properties(ScintillaObject *sci, gint lexer, filetype_id ft_id)
843 g_assert(ft_id != GEANY_FILETYPES_NONE);
845 SSM(sci, SCI_SETLEXER, lexer, 0);
847 styleset_common(sci, ft_id);
851 #define foreach_range(i, size) \
852 for (i = 0; i < size; i++)
854 /* names: the style names for the filetype. */
855 static void load_style_entries(GKeyFile *config, GKeyFile *config_home, gint filetype_idx,
856 const gchar **names, gsize names_len)
858 guint i;
860 foreach_range(i, names_len)
862 const gchar *name = names[i];
863 GeanyLexerStyle *style = &style_sets[filetype_idx].styling[i];
865 get_keyfile_style(config, config_home, name, style);
870 /* styles: the style IDs for the filetype.
871 * STYLE_DEFAULT will be set to match the first style. */
872 static void apply_style_entries(ScintillaObject *sci, gint filetype_idx,
873 gint *styles, gsize styles_len)
875 guint i;
877 g_return_if_fail(styles_len > 0);
879 set_sci_style(sci, STYLE_DEFAULT, filetype_idx, 0);
881 foreach_range(i, styles_len)
882 set_sci_style(sci, styles[i], filetype_idx, i);
886 /* call new_styleset(filetype_idx, >= 20) before using this. */
887 static void
888 styleset_c_like_init(GKeyFile *config, GKeyFile *config_home, gint filetype_idx)
890 const gchar *entries[] =
892 "default",
893 "comment",
894 "commentline",
895 "commentdoc",
896 "number",
897 "word",
898 "word2",
899 "string",
900 "character",
901 "uuid",
902 "preprocessor",
903 "operator",
904 "identifier",
905 "stringeol",
906 "verbatim",
907 "regex",
908 "commentlinedoc",
909 "commentdockeyword",
910 "commentdockeyworderror",
911 "globalclass"
914 new_styleset(filetype_idx, G_N_ELEMENTS(entries));
915 load_style_entries(config, config_home, filetype_idx, entries, G_N_ELEMENTS(entries));
919 static void styleset_c_like(ScintillaObject *sci, gint ft_id)
921 gint styles[] = {
922 SCE_C_DEFAULT,
923 SCE_C_COMMENT,
924 SCE_C_COMMENTLINE,
925 SCE_C_COMMENTDOC,
926 SCE_C_NUMBER,
927 SCE_C_WORD,
928 SCE_C_WORD2,
929 SCE_C_STRING,
930 SCE_C_CHARACTER,
931 SCE_C_UUID,
932 SCE_C_PREPROCESSOR,
933 SCE_C_OPERATOR,
934 SCE_C_IDENTIFIER,
935 SCE_C_STRINGEOL,
936 SCE_C_VERBATIM,
937 SCE_C_REGEX,
938 SCE_C_COMMENTLINEDOC,
939 SCE_C_COMMENTDOCKEYWORD,
940 SCE_C_COMMENTDOCKEYWORDERROR,
941 /* used for local structs and typedefs */
942 SCE_C_GLOBALCLASS
945 apply_filetype_properties(sci, SCLEX_CPP, ft_id);
947 apply_style_entries(sci, ft_id, styles, G_N_ELEMENTS(styles));
951 static void styleset_c_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
953 styleset_c_like_init(config, config_home, ft_id);
955 style_sets[ft_id].keywords = g_new(gchar*, 4);
956 get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
957 get_keyfile_keywords(config, config_home, "secondary", ft_id, 1);
958 get_keyfile_keywords(config, config_home, "docComment", ft_id, 2);
959 style_sets[ft_id].keywords[3] = NULL;
963 static void styleset_c(ScintillaObject *sci, gint ft_id)
965 styleset_c_like(sci, ft_id);
967 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
968 /* SCI_SETKEYWORDS = 1 - secondary + global tags file types, see below */
969 sci_set_keywords(sci, 2, style_sets[ft_id].keywords[2]);
970 /* SCI_SETKEYWORDS = 3 is for current session types - see editor_lexer_get_type_keyword_idx() */
972 /* assign global types, merge them with user defined keywords and set them */
973 merge_type_keywords(sci, ft_id, 1);
977 static void styleset_pascal_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
979 new_styleset(ft_id, 15);
980 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
981 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[1]);
982 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[2]);
983 get_keyfile_style(config, config_home, "comment2", &style_sets[ft_id].styling[3]);
984 get_keyfile_style(config, config_home, "commentline", &style_sets[ft_id].styling[4]);
985 get_keyfile_style(config, config_home, "preprocessor", &style_sets[ft_id].styling[5]);
986 get_keyfile_style(config, config_home, "preprocessor2", &style_sets[ft_id].styling[6]);
987 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[7]);
988 get_keyfile_style(config, config_home, "hexnumber", &style_sets[ft_id].styling[8]);
989 get_keyfile_style(config, config_home, "word", &style_sets[ft_id].styling[9]);
990 get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[10]);
991 get_keyfile_style(config, config_home, "stringeol", &style_sets[ft_id].styling[11]);
992 get_keyfile_style(config, config_home, "character", &style_sets[ft_id].styling[12]);
993 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[13]);
994 get_keyfile_style(config, config_home, "asm", &style_sets[ft_id].styling[14]);
996 style_sets[ft_id].keywords = g_new(gchar*, 2);
997 get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
998 style_sets[ft_id].keywords[1] = NULL;
1002 static void styleset_pascal(ScintillaObject *sci, gint ft_id)
1004 apply_filetype_properties(sci, SCLEX_PASCAL, ft_id);
1006 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
1008 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
1009 set_sci_style(sci, SCE_PAS_DEFAULT, ft_id, 0);
1010 set_sci_style(sci, SCE_PAS_IDENTIFIER, ft_id, 1);
1011 set_sci_style(sci, SCE_PAS_COMMENT, ft_id, 2);
1012 set_sci_style(sci, SCE_PAS_COMMENT2, ft_id, 3);
1013 set_sci_style(sci, SCE_PAS_COMMENTLINE, ft_id, 4);
1014 set_sci_style(sci, SCE_PAS_PREPROCESSOR, ft_id, 5);
1015 set_sci_style(sci, SCE_PAS_PREPROCESSOR2, ft_id, 6);
1016 set_sci_style(sci, SCE_PAS_NUMBER, ft_id, 7);
1017 set_sci_style(sci, SCE_PAS_HEXNUMBER, ft_id, 8);
1018 set_sci_style(sci, SCE_PAS_WORD, ft_id, 9);
1019 set_sci_style(sci, SCE_PAS_STRING, ft_id, 10);
1020 set_sci_style(sci, SCE_PAS_STRINGEOL, ft_id, 11);
1021 set_sci_style(sci, SCE_PAS_CHARACTER, ft_id, 12);
1022 set_sci_style(sci, SCE_PAS_OPERATOR, ft_id, 13);
1023 set_sci_style(sci, SCE_PAS_ASM, ft_id, 14);
1027 static void styleset_makefile_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
1029 new_styleset(ft_id, 7);
1030 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
1031 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
1032 get_keyfile_style(config, config_home, "preprocessor", &style_sets[ft_id].styling[2]);
1033 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[3]);
1034 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[4]);
1035 get_keyfile_style(config, config_home, "target", &style_sets[ft_id].styling[5]);
1036 get_keyfile_style(config, config_home, "ideol", &style_sets[ft_id].styling[6]);
1038 style_sets[ft_id].keywords = NULL;
1042 static void styleset_makefile(ScintillaObject *sci, gint ft_id)
1044 apply_filetype_properties(sci, SCLEX_MAKEFILE, ft_id);
1046 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
1047 set_sci_style(sci, SCE_MAKE_DEFAULT, ft_id, 0);
1048 set_sci_style(sci, SCE_MAKE_COMMENT, ft_id, 1);
1049 set_sci_style(sci, SCE_MAKE_PREPROCESSOR, ft_id, 2);
1050 set_sci_style(sci, SCE_MAKE_IDENTIFIER, ft_id, 3);
1051 set_sci_style(sci, SCE_MAKE_OPERATOR, ft_id, 4);
1052 set_sci_style(sci, SCE_MAKE_TARGET, ft_id, 5);
1053 set_sci_style(sci, SCE_MAKE_IDEOL, ft_id, 6);
1057 static void styleset_diff_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
1059 new_styleset(ft_id, 8);
1060 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
1061 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
1062 get_keyfile_style(config, config_home, "command", &style_sets[ft_id].styling[2]);
1063 get_keyfile_style(config, config_home, "header", &style_sets[ft_id].styling[3]);
1064 get_keyfile_style(config, config_home, "position", &style_sets[ft_id].styling[4]);
1065 get_keyfile_style(config, config_home, "deleted", &style_sets[ft_id].styling[5]);
1066 get_keyfile_style(config, config_home, "added", &style_sets[ft_id].styling[6]);
1067 get_keyfile_style(config, config_home, "changed", &style_sets[ft_id].styling[7]);
1069 style_sets[ft_id].keywords = NULL;
1073 static void styleset_diff(ScintillaObject *sci, gint ft_id)
1075 apply_filetype_properties(sci, SCLEX_DIFF, ft_id);
1077 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
1078 set_sci_style(sci, SCE_DIFF_DEFAULT, ft_id, 0);
1079 set_sci_style(sci, SCE_DIFF_COMMENT, ft_id, 1);
1080 set_sci_style(sci, SCE_DIFF_COMMAND, ft_id, 2);
1081 set_sci_style(sci, SCE_DIFF_HEADER, ft_id, 3);
1082 set_sci_style(sci, SCE_DIFF_POSITION, ft_id, 4);
1083 set_sci_style(sci, SCE_DIFF_DELETED, ft_id, 5);
1084 set_sci_style(sci, SCE_DIFF_ADDED, ft_id, 6);
1085 set_sci_style(sci, SCE_DIFF_CHANGED, ft_id, 7);
1089 static void styleset_latex_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
1091 new_styleset(ft_id, 5);
1092 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
1093 get_keyfile_style(config, config_home, "command", &style_sets[ft_id].styling[1]);
1094 get_keyfile_style(config, config_home, "tag", &style_sets[ft_id].styling[2]);
1095 get_keyfile_style(config, config_home, "math", &style_sets[ft_id].styling[3]);
1096 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[4]);
1098 style_sets[ft_id].keywords = g_new(gchar*, 2);
1099 get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
1100 style_sets[ft_id].keywords[1] = NULL;
1104 static void styleset_latex(ScintillaObject *sci, gint ft_id)
1106 apply_filetype_properties(sci, SCLEX_LATEX, ft_id);
1108 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
1110 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
1111 set_sci_style(sci, SCE_L_DEFAULT, ft_id, 0);
1112 set_sci_style(sci, SCE_L_COMMAND, ft_id, 1);
1113 set_sci_style(sci, SCE_L_TAG, ft_id, 2);
1114 set_sci_style(sci, SCE_L_MATH, ft_id, 3);
1115 set_sci_style(sci, SCE_L_COMMENT, ft_id, 4);
1119 static void styleset_php_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
1121 style_sets[ft_id].styling = NULL;
1122 style_sets[ft_id].keywords = NULL;
1126 static void styleset_php(ScintillaObject *sci, gint ft_id)
1128 apply_filetype_properties(sci, SCLEX_HTML, ft_id);
1130 /* use the same colouring as for XML */
1131 styleset_markup(sci, TRUE);
1135 static void styleset_html_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
1137 style_sets[ft_id].styling = NULL;
1138 style_sets[ft_id].keywords = NULL;
1142 static void styleset_html(ScintillaObject *sci, gint ft_id)
1144 apply_filetype_properties(sci, SCLEX_HTML, ft_id);
1146 /* use the same colouring for HTML; XML and so on */
1147 styleset_markup(sci, TRUE);
1151 static void styleset_markup_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
1153 new_styleset(GEANY_FILETYPES_XML, 56);
1154 get_keyfile_style(config, config_home, "html_default", &style_sets[GEANY_FILETYPES_XML].styling[0]);
1155 get_keyfile_style(config, config_home, "html_tag", &style_sets[GEANY_FILETYPES_XML].styling[1]);
1156 get_keyfile_style(config, config_home, "html_tagunknown", &style_sets[GEANY_FILETYPES_XML].styling[2]);
1157 get_keyfile_style(config, config_home, "html_attribute", &style_sets[GEANY_FILETYPES_XML].styling[3]);
1158 get_keyfile_style(config, config_home, "html_attributeunknown", &style_sets[GEANY_FILETYPES_XML].styling[4]);
1159 get_keyfile_style(config, config_home, "html_number", &style_sets[GEANY_FILETYPES_XML].styling[5]);
1160 get_keyfile_style(config, config_home, "html_doublestring", &style_sets[GEANY_FILETYPES_XML].styling[6]);
1161 get_keyfile_style(config, config_home, "html_singlestring", &style_sets[GEANY_FILETYPES_XML].styling[7]);
1162 get_keyfile_style(config, config_home, "html_other", &style_sets[GEANY_FILETYPES_XML].styling[8]);
1163 get_keyfile_style(config, config_home, "html_comment", &style_sets[GEANY_FILETYPES_XML].styling[9]);
1164 get_keyfile_style(config, config_home, "html_entity", &style_sets[GEANY_FILETYPES_XML].styling[10]);
1165 get_keyfile_style(config, config_home, "html_tagend", &style_sets[GEANY_FILETYPES_XML].styling[11]);
1166 get_keyfile_style(config, config_home, "html_xmlstart", &style_sets[GEANY_FILETYPES_XML].styling[12]);
1167 get_keyfile_style(config, config_home, "html_xmlend", &style_sets[GEANY_FILETYPES_XML].styling[13]);
1168 get_keyfile_style(config, config_home, "html_script", &style_sets[GEANY_FILETYPES_XML].styling[14]);
1169 get_keyfile_style(config, config_home, "html_asp", &style_sets[GEANY_FILETYPES_XML].styling[15]);
1170 get_keyfile_style(config, config_home, "html_aspat", &style_sets[GEANY_FILETYPES_XML].styling[16]);
1171 get_keyfile_style(config, config_home, "html_cdata", &style_sets[GEANY_FILETYPES_XML].styling[17]);
1172 get_keyfile_style(config, config_home, "html_question", &style_sets[GEANY_FILETYPES_XML].styling[18]);
1173 get_keyfile_style(config, config_home, "html_value", &style_sets[GEANY_FILETYPES_XML].styling[19]);
1174 get_keyfile_style(config, config_home, "html_xccomment", &style_sets[GEANY_FILETYPES_XML].styling[20]);
1176 get_keyfile_style(config, config_home, "sgml_default", &style_sets[GEANY_FILETYPES_XML].styling[21]);
1177 get_keyfile_style(config, config_home, "sgml_comment", &style_sets[GEANY_FILETYPES_XML].styling[22]);
1178 get_keyfile_style(config, config_home, "sgml_special", &style_sets[GEANY_FILETYPES_XML].styling[23]);
1179 get_keyfile_style(config, config_home, "sgml_command", &style_sets[GEANY_FILETYPES_XML].styling[24]);
1180 get_keyfile_style(config, config_home, "sgml_doublestring", &style_sets[GEANY_FILETYPES_XML].styling[25]);
1181 get_keyfile_style(config, config_home, "sgml_simplestring", &style_sets[GEANY_FILETYPES_XML].styling[26]);
1182 get_keyfile_style(config, config_home, "sgml_1st_param", &style_sets[GEANY_FILETYPES_XML].styling[27]);
1183 get_keyfile_style(config, config_home, "sgml_entity", &style_sets[GEANY_FILETYPES_XML].styling[28]);
1184 get_keyfile_style(config, config_home, "sgml_block_default", &style_sets[GEANY_FILETYPES_XML].styling[29]);
1185 get_keyfile_style(config, config_home, "sgml_1st_param_comment", &style_sets[GEANY_FILETYPES_XML].styling[30]);
1186 get_keyfile_style(config, config_home, "sgml_error", &style_sets[GEANY_FILETYPES_XML].styling[31]);
1188 get_keyfile_style(config, config_home, "php_default", &style_sets[GEANY_FILETYPES_XML].styling[32]);
1189 get_keyfile_style(config, config_home, "php_simplestring", &style_sets[GEANY_FILETYPES_XML].styling[33]);
1190 get_keyfile_style(config, config_home, "php_hstring", &style_sets[GEANY_FILETYPES_XML].styling[34]);
1191 get_keyfile_style(config, config_home, "php_number", &style_sets[GEANY_FILETYPES_XML].styling[35]);
1192 get_keyfile_style(config, config_home, "php_word", &style_sets[GEANY_FILETYPES_XML].styling[36]);
1193 get_keyfile_style(config, config_home, "php_variable", &style_sets[GEANY_FILETYPES_XML].styling[37]);
1194 get_keyfile_style(config, config_home, "php_comment", &style_sets[GEANY_FILETYPES_XML].styling[38]);
1195 get_keyfile_style(config, config_home, "php_commentline", &style_sets[GEANY_FILETYPES_XML].styling[39]);
1196 get_keyfile_style(config, config_home, "php_operator", &style_sets[GEANY_FILETYPES_XML].styling[40]);
1197 get_keyfile_style(config, config_home, "php_hstring_variable", &style_sets[GEANY_FILETYPES_XML].styling[41]);
1198 get_keyfile_style(config, config_home, "php_complex_variable", &style_sets[GEANY_FILETYPES_XML].styling[42]);
1200 get_keyfile_style(config, config_home, "jscript_start", &style_sets[GEANY_FILETYPES_XML].styling[43]);
1201 get_keyfile_style(config, config_home, "jscript_default", &style_sets[GEANY_FILETYPES_XML].styling[44]);
1202 get_keyfile_style(config, config_home, "jscript_comment", &style_sets[GEANY_FILETYPES_XML].styling[45]);
1203 get_keyfile_style(config, config_home, "jscript_commentline", &style_sets[GEANY_FILETYPES_XML].styling[46]);
1204 get_keyfile_style(config, config_home, "jscript_commentdoc", &style_sets[GEANY_FILETYPES_XML].styling[47]);
1205 get_keyfile_style(config, config_home, "jscript_number", &style_sets[GEANY_FILETYPES_XML].styling[48]);
1206 get_keyfile_style(config, config_home, "jscript_word", &style_sets[GEANY_FILETYPES_XML].styling[49]);
1207 get_keyfile_style(config, config_home, "jscript_keyword", &style_sets[GEANY_FILETYPES_XML].styling[50]);
1208 get_keyfile_style(config, config_home, "jscript_doublestring", &style_sets[GEANY_FILETYPES_XML].styling[51]);
1209 get_keyfile_style(config, config_home, "jscript_singlestring", &style_sets[GEANY_FILETYPES_XML].styling[52]);
1210 get_keyfile_style(config, config_home, "jscript_symbols", &style_sets[GEANY_FILETYPES_XML].styling[53]);
1211 get_keyfile_style(config, config_home, "jscript_stringeol", &style_sets[GEANY_FILETYPES_XML].styling[54]);
1212 get_keyfile_style(config, config_home, "jscript_regex", &style_sets[GEANY_FILETYPES_XML].styling[55]);
1214 style_sets[GEANY_FILETYPES_XML].keywords = g_new(gchar*, 7);
1215 get_keyfile_keywords(config, config_home, "html", GEANY_FILETYPES_XML, 0);
1216 get_keyfile_keywords(config, config_home, "javascript", GEANY_FILETYPES_XML, 1);
1217 get_keyfile_keywords(config, config_home, "vbscript", GEANY_FILETYPES_XML, 2);
1218 get_keyfile_keywords(config, config_home, "python", GEANY_FILETYPES_XML, 3);
1219 get_keyfile_keywords(config, config_home, "php", GEANY_FILETYPES_XML, 4);
1220 get_keyfile_keywords(config, config_home, "sgml", GEANY_FILETYPES_XML, 5);
1221 style_sets[GEANY_FILETYPES_XML].keywords[6] = NULL;
1225 static void styleset_markup(ScintillaObject *sci, gboolean set_keywords)
1227 guint i;
1228 const gchar *keywords;
1230 /* Used by several filetypes */
1231 if (style_sets[GEANY_FILETYPES_XML].styling == NULL)
1232 filetypes_load_config(GEANY_FILETYPES_XML, FALSE);
1234 /* manually initialise filetype Python for use with embedded Python */
1235 filetypes_load_config(GEANY_FILETYPES_PYTHON, FALSE);
1237 /* Set keywords. If we don't want to use keywords, we must at least unset maybe previously set
1238 * keywords, e.g. when switching between filetypes. */
1239 for (i = 0; i < 5; i++)
1241 keywords = (set_keywords) ? style_sets[GEANY_FILETYPES_XML].keywords[i] : "";
1242 sci_set_keywords(sci, i, keywords);
1244 /* always set SGML keywords */
1245 sci_set_keywords(sci, 5, style_sets[GEANY_FILETYPES_XML].keywords[5]);
1247 set_sci_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_XML, 0);
1248 set_sci_style(sci, SCE_H_DEFAULT, GEANY_FILETYPES_XML, 0);
1249 set_sci_style(sci, SCE_H_TAG, GEANY_FILETYPES_XML, 1);
1250 set_sci_style(sci, SCE_H_TAGUNKNOWN, GEANY_FILETYPES_XML, 2);
1251 set_sci_style(sci, SCE_H_ATTRIBUTE, GEANY_FILETYPES_XML, 3);
1252 set_sci_style(sci, SCE_H_ATTRIBUTEUNKNOWN, GEANY_FILETYPES_XML, 4);
1253 set_sci_style(sci, SCE_H_NUMBER, GEANY_FILETYPES_XML, 5);
1254 set_sci_style(sci, SCE_H_DOUBLESTRING, GEANY_FILETYPES_XML, 6);
1255 set_sci_style(sci, SCE_H_SINGLESTRING, GEANY_FILETYPES_XML, 7);
1256 set_sci_style(sci, SCE_H_OTHER, GEANY_FILETYPES_XML, 8);
1257 set_sci_style(sci, SCE_H_COMMENT, GEANY_FILETYPES_XML, 9);
1258 set_sci_style(sci, SCE_H_ENTITY, GEANY_FILETYPES_XML, 10);
1259 set_sci_style(sci, SCE_H_TAGEND, GEANY_FILETYPES_XML, 11);
1260 SSM(sci, SCI_STYLESETEOLFILLED, SCE_H_XMLSTART, 1);
1261 set_sci_style(sci, SCE_H_XMLSTART, GEANY_FILETYPES_XML, 12);
1262 set_sci_style(sci, SCE_H_XMLEND, GEANY_FILETYPES_XML, 13);
1263 set_sci_style(sci, SCE_H_SCRIPT, GEANY_FILETYPES_XML, 14);
1264 SSM(sci, SCI_STYLESETEOLFILLED, SCE_H_ASP, 1);
1265 set_sci_style(sci, SCE_H_ASP, GEANY_FILETYPES_XML, 15);
1266 SSM(sci, SCI_STYLESETEOLFILLED, SCE_H_ASPAT, 1);
1267 set_sci_style(sci, SCE_H_ASPAT, GEANY_FILETYPES_XML, 16);
1268 set_sci_style(sci, SCE_H_CDATA, GEANY_FILETYPES_XML, 17);
1269 set_sci_style(sci, SCE_H_QUESTION, GEANY_FILETYPES_XML, 18);
1270 set_sci_style(sci, SCE_H_VALUE, GEANY_FILETYPES_XML, 19);
1271 set_sci_style(sci, SCE_H_XCCOMMENT, GEANY_FILETYPES_XML, 20);
1273 set_sci_style(sci, SCE_H_SGML_DEFAULT, GEANY_FILETYPES_XML, 21);
1274 set_sci_style(sci, SCE_H_SGML_COMMENT, GEANY_FILETYPES_XML, 22);
1275 set_sci_style(sci, SCE_H_SGML_SPECIAL, GEANY_FILETYPES_XML, 23);
1276 set_sci_style(sci, SCE_H_SGML_COMMAND, GEANY_FILETYPES_XML, 24);
1277 set_sci_style(sci, SCE_H_SGML_DOUBLESTRING, GEANY_FILETYPES_XML, 25);
1278 set_sci_style(sci, SCE_H_SGML_SIMPLESTRING, GEANY_FILETYPES_XML, 26);
1279 set_sci_style(sci, SCE_H_SGML_1ST_PARAM, GEANY_FILETYPES_XML, 27);
1280 set_sci_style(sci, SCE_H_SGML_ENTITY, GEANY_FILETYPES_XML, 28);
1281 set_sci_style(sci, SCE_H_SGML_BLOCK_DEFAULT, GEANY_FILETYPES_XML, 29);
1282 set_sci_style(sci, SCE_H_SGML_1ST_PARAM_COMMENT, GEANY_FILETYPES_XML, 30);
1283 set_sci_style(sci, SCE_H_SGML_ERROR, GEANY_FILETYPES_XML, 31);
1285 /* embedded JavaScript */
1286 set_sci_style(sci, SCE_HJ_START, GEANY_FILETYPES_XML, 43);
1287 set_sci_style(sci, SCE_HJ_DEFAULT, GEANY_FILETYPES_XML, 44);
1288 set_sci_style(sci, SCE_HJ_COMMENT, GEANY_FILETYPES_XML, 45);
1289 set_sci_style(sci, SCE_HJ_COMMENTLINE, GEANY_FILETYPES_XML, 46);
1290 set_sci_style(sci, SCE_HJ_COMMENTDOC, GEANY_FILETYPES_XML, 47);
1291 set_sci_style(sci, SCE_HJ_NUMBER, GEANY_FILETYPES_XML, 48);
1292 set_sci_style(sci, SCE_HJ_WORD, GEANY_FILETYPES_XML, 49);
1293 set_sci_style(sci, SCE_HJ_KEYWORD, GEANY_FILETYPES_XML, 50);
1294 set_sci_style(sci, SCE_HJ_DOUBLESTRING, GEANY_FILETYPES_XML, 51);
1295 set_sci_style(sci, SCE_HJ_SINGLESTRING, GEANY_FILETYPES_XML, 52);
1296 set_sci_style(sci, SCE_HJ_SYMBOLS, GEANY_FILETYPES_XML, 53);
1297 set_sci_style(sci, SCE_HJ_STRINGEOL, GEANY_FILETYPES_XML, 54);
1298 set_sci_style(sci, SCE_HJ_REGEX, GEANY_FILETYPES_XML, 55);
1300 /* for HB, VBScript?, use the same styles as for JavaScript */
1301 set_sci_style(sci, SCE_HB_START, GEANY_FILETYPES_XML, 43);
1302 set_sci_style(sci, SCE_HB_DEFAULT, GEANY_FILETYPES_XML, 44);
1303 set_sci_style(sci, SCE_HB_COMMENTLINE, GEANY_FILETYPES_XML, 46);
1304 set_sci_style(sci, SCE_HB_NUMBER, GEANY_FILETYPES_XML, 48);
1305 set_sci_style(sci, SCE_HB_WORD, GEANY_FILETYPES_XML, 50); /* keywords */
1306 set_sci_style(sci, SCE_HB_STRING, GEANY_FILETYPES_XML, 51);
1307 set_sci_style(sci, SCE_HB_IDENTIFIER, GEANY_FILETYPES_XML, 53);
1308 set_sci_style(sci, SCE_HB_STRINGEOL, GEANY_FILETYPES_XML, 54);
1310 /* for HBA, VBScript?, use the same styles as for JavaScript */
1311 set_sci_style(sci, SCE_HBA_START, GEANY_FILETYPES_XML, 43);
1312 set_sci_style(sci, SCE_HBA_DEFAULT, GEANY_FILETYPES_XML, 44);
1313 set_sci_style(sci, SCE_HBA_COMMENTLINE, GEANY_FILETYPES_XML, 46);
1314 set_sci_style(sci, SCE_HBA_NUMBER, GEANY_FILETYPES_XML, 48);
1315 set_sci_style(sci, SCE_HBA_WORD, GEANY_FILETYPES_XML, 50); /* keywords */
1316 set_sci_style(sci, SCE_HBA_STRING, GEANY_FILETYPES_XML, 51);
1317 set_sci_style(sci, SCE_HBA_IDENTIFIER, GEANY_FILETYPES_XML, 53);
1318 set_sci_style(sci, SCE_HBA_STRINGEOL, GEANY_FILETYPES_XML, 54);
1320 /* for HJA, ASP Javascript, use the same styles as for JavaScript */
1321 set_sci_style(sci, SCE_HJA_START, GEANY_FILETYPES_XML, 43);
1322 set_sci_style(sci, SCE_HJA_DEFAULT, GEANY_FILETYPES_XML, 44);
1323 set_sci_style(sci, SCE_HJA_COMMENT, GEANY_FILETYPES_XML, 45);
1324 set_sci_style(sci, SCE_HJA_COMMENTLINE, GEANY_FILETYPES_XML, 46);
1325 set_sci_style(sci, SCE_HJA_COMMENTDOC, GEANY_FILETYPES_XML, 47);
1326 set_sci_style(sci, SCE_HJA_NUMBER, GEANY_FILETYPES_XML, 48);
1327 set_sci_style(sci, SCE_HJA_WORD, GEANY_FILETYPES_XML, 49);
1328 set_sci_style(sci, SCE_HJA_KEYWORD, GEANY_FILETYPES_XML, 50);
1329 set_sci_style(sci, SCE_HJA_DOUBLESTRING, GEANY_FILETYPES_XML, 51);
1330 set_sci_style(sci, SCE_HJA_SINGLESTRING, GEANY_FILETYPES_XML, 52);
1331 set_sci_style(sci, SCE_HJA_SYMBOLS, GEANY_FILETYPES_XML, 53);
1332 set_sci_style(sci, SCE_HJA_STRINGEOL, GEANY_FILETYPES_XML, 54);
1334 /* for embedded Python we use the Python styles */
1335 set_sci_style(sci, SCE_HP_START, GEANY_FILETYPES_XML, 43);
1336 set_sci_style(sci, SCE_HP_DEFAULT, GEANY_FILETYPES_PYTHON, 0);
1337 set_sci_style(sci, SCE_HP_COMMENTLINE, GEANY_FILETYPES_PYTHON, 1);
1338 set_sci_style(sci, SCE_HP_NUMBER, GEANY_FILETYPES_PYTHON, 2);
1339 set_sci_style(sci, SCE_HP_STRING, GEANY_FILETYPES_PYTHON, 3);
1340 set_sci_style(sci, SCE_HP_CHARACTER, GEANY_FILETYPES_PYTHON, 4);
1341 set_sci_style(sci, SCE_HP_WORD, GEANY_FILETYPES_PYTHON, 5);
1342 set_sci_style(sci, SCE_HP_TRIPLE, GEANY_FILETYPES_PYTHON, 6);
1343 set_sci_style(sci, SCE_HP_TRIPLEDOUBLE, GEANY_FILETYPES_PYTHON, 7);
1344 set_sci_style(sci, SCE_HP_CLASSNAME, GEANY_FILETYPES_PYTHON, 8);
1345 set_sci_style(sci, SCE_HP_DEFNAME, GEANY_FILETYPES_PYTHON, 9);
1346 set_sci_style(sci, SCE_HP_OPERATOR, GEANY_FILETYPES_PYTHON, 10);
1347 set_sci_style(sci, SCE_HP_IDENTIFIER, GEANY_FILETYPES_PYTHON, 11);
1349 /* for embedded HPA (what is this?) we use the Python styles */
1350 set_sci_style(sci, SCE_HPA_START, GEANY_FILETYPES_XML, 43);
1351 set_sci_style(sci, SCE_HPA_DEFAULT, GEANY_FILETYPES_PYTHON, 0);
1352 set_sci_style(sci, SCE_HPA_COMMENTLINE, GEANY_FILETYPES_PYTHON, 1);
1353 set_sci_style(sci, SCE_HPA_NUMBER, GEANY_FILETYPES_PYTHON, 2);
1354 set_sci_style(sci, SCE_HPA_STRING, GEANY_FILETYPES_PYTHON, 3);
1355 set_sci_style(sci, SCE_HPA_CHARACTER, GEANY_FILETYPES_PYTHON, 4);
1356 set_sci_style(sci, SCE_HPA_WORD, GEANY_FILETYPES_PYTHON, 5);
1357 set_sci_style(sci, SCE_HPA_TRIPLE, GEANY_FILETYPES_PYTHON, 6);
1358 set_sci_style(sci, SCE_HPA_TRIPLEDOUBLE, GEANY_FILETYPES_PYTHON, 7);
1359 set_sci_style(sci, SCE_HPA_CLASSNAME, GEANY_FILETYPES_PYTHON, 8);
1360 set_sci_style(sci, SCE_HPA_DEFNAME, GEANY_FILETYPES_PYTHON, 9);
1361 set_sci_style(sci, SCE_HPA_OPERATOR, GEANY_FILETYPES_PYTHON, 10);
1362 set_sci_style(sci, SCE_HPA_IDENTIFIER, GEANY_FILETYPES_PYTHON, 11);
1364 /* PHP */
1365 set_sci_style(sci, SCE_HPHP_DEFAULT, GEANY_FILETYPES_XML, 32);
1366 set_sci_style(sci, SCE_HPHP_SIMPLESTRING, GEANY_FILETYPES_XML, 33);
1367 set_sci_style(sci, SCE_HPHP_HSTRING, GEANY_FILETYPES_XML, 34);
1368 set_sci_style(sci, SCE_HPHP_NUMBER, GEANY_FILETYPES_XML, 35);
1369 set_sci_style(sci, SCE_HPHP_WORD, GEANY_FILETYPES_XML, 36);
1370 set_sci_style(sci, SCE_HPHP_VARIABLE, GEANY_FILETYPES_XML, 37);
1371 set_sci_style(sci, SCE_HPHP_COMMENT, GEANY_FILETYPES_XML, 38);
1372 set_sci_style(sci, SCE_HPHP_COMMENTLINE, GEANY_FILETYPES_XML, 39);
1373 set_sci_style(sci, SCE_HPHP_OPERATOR, GEANY_FILETYPES_XML, 40);
1374 set_sci_style(sci, SCE_HPHP_HSTRING_VARIABLE, GEANY_FILETYPES_XML, 41);
1375 set_sci_style(sci, SCE_HPHP_COMPLEX_VARIABLE, GEANY_FILETYPES_XML, 42);
1377 /* note: normally this would be in the filetype file instead */
1378 sci_set_property(sci, "fold.html", "1");
1379 sci_set_property(sci, "fold.html.preprocessor", "0");
1383 static void styleset_java_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
1385 styleset_c_like_init(config, config_home, ft_id);
1387 style_sets[ft_id].keywords = g_new(gchar*, 5);
1388 get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
1389 get_keyfile_keywords(config, config_home, "secondary", ft_id, 1);
1390 get_keyfile_keywords(config, config_home, "doccomment", ft_id, 2);
1391 get_keyfile_keywords(config, config_home, "typedefs", ft_id, 3);
1392 style_sets[ft_id].keywords[4] = NULL;
1396 static void styleset_java(ScintillaObject *sci, gint ft_id)
1398 styleset_c_like(sci, ft_id);
1400 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
1401 /* SCI_SETKEYWORDS = 1 - secondary + global tags file types, see below */
1402 sci_set_keywords(sci, 2, style_sets[ft_id].keywords[2]);
1403 /* SCI_SETKEYWORDS = 3 is for current session types - see editor_lexer_get_type_keyword_idx() */
1404 sci_set_keywords(sci, 4, style_sets[ft_id].keywords[3]);
1406 /* assign global types, merge them with user defined keywords and set them */
1407 merge_type_keywords(sci, ft_id, 1);
1411 static void styleset_perl_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
1413 new_styleset(ft_id, 35);
1414 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
1415 get_keyfile_style(config, config_home, "error", &style_sets[ft_id].styling[1]);
1416 get_keyfile_style(config, config_home, "commentline", &style_sets[ft_id].styling[2]);
1417 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[3]);
1418 get_keyfile_style(config, config_home, "word", &style_sets[ft_id].styling[4]);
1419 get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[5]);
1420 get_keyfile_style(config, config_home, "character", &style_sets[ft_id].styling[6]);
1421 get_keyfile_style(config, config_home, "preprocessor", &style_sets[ft_id].styling[7]);
1422 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[8]);
1423 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[9]);
1424 get_keyfile_style(config, config_home, "scalar", &style_sets[ft_id].styling[10]);
1425 get_keyfile_style(config, config_home, "pod", &style_sets[ft_id].styling[11]);
1426 get_keyfile_style(config, config_home, "regex", &style_sets[ft_id].styling[12]);
1427 get_keyfile_style(config, config_home, "array", &style_sets[ft_id].styling[13]);
1428 get_keyfile_style(config, config_home, "hash", &style_sets[ft_id].styling[14]);
1429 get_keyfile_style(config, config_home, "symboltable", &style_sets[ft_id].styling[15]);
1430 get_keyfile_style(config, config_home, "backticks", &style_sets[ft_id].styling[16]);
1431 get_keyfile_style(config, config_home, "pod_verbatim", &style_sets[ft_id].styling[17]);
1432 get_keyfile_style(config, config_home, "reg_subst", &style_sets[ft_id].styling[18]);
1433 get_keyfile_style(config, config_home, "datasection", &style_sets[ft_id].styling[19]);
1434 get_keyfile_style(config, config_home, "here_delim", &style_sets[ft_id].styling[20]);
1435 get_keyfile_style(config, config_home, "here_q", &style_sets[ft_id].styling[21]);
1436 get_keyfile_style(config, config_home, "here_qq", &style_sets[ft_id].styling[22]);
1437 get_keyfile_style(config, config_home, "here_qx", &style_sets[ft_id].styling[23]);
1438 get_keyfile_style(config, config_home, "string_q", &style_sets[ft_id].styling[24]);
1439 get_keyfile_style(config, config_home, "string_qq", &style_sets[ft_id].styling[25]);
1440 get_keyfile_style(config, config_home, "string_qx", &style_sets[ft_id].styling[26]);
1441 get_keyfile_style(config, config_home, "string_qr", &style_sets[ft_id].styling[27]);
1442 get_keyfile_style(config, config_home, "string_qw", &style_sets[ft_id].styling[28]);
1443 get_keyfile_style(config, config_home, "variable_indexer", &style_sets[ft_id].styling[29]);
1444 get_keyfile_style(config, config_home, "punctuation", &style_sets[ft_id].styling[30]);
1445 get_keyfile_style(config, config_home, "longquote", &style_sets[ft_id].styling[31]);
1446 get_keyfile_style(config, config_home, "sub_prototype", &style_sets[ft_id].styling[32]);
1447 get_keyfile_style(config, config_home, "format_ident", &style_sets[ft_id].styling[33]);
1448 get_keyfile_style(config, config_home, "format", &style_sets[ft_id].styling[34]);
1451 style_sets[ft_id].keywords = g_new(gchar*, 2);
1452 get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
1453 style_sets[ft_id].keywords[1] = NULL;
1457 static void styleset_perl(ScintillaObject *sci, gint ft_id)
1459 apply_filetype_properties(sci, SCLEX_PERL, ft_id);
1461 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
1463 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
1464 set_sci_style(sci, SCE_PL_DEFAULT, ft_id, 0);
1465 set_sci_style(sci, SCE_PL_ERROR, ft_id, 1);
1466 set_sci_style(sci, SCE_PL_COMMENTLINE, ft_id, 2);
1467 set_sci_style(sci, SCE_PL_NUMBER, ft_id, 3);
1468 set_sci_style(sci, SCE_PL_WORD, ft_id, 4);
1469 set_sci_style(sci, SCE_PL_STRING, ft_id, 5);
1470 set_sci_style(sci, SCE_PL_CHARACTER, ft_id, 6);
1471 set_sci_style(sci, SCE_PL_PREPROCESSOR, ft_id, 7);
1472 set_sci_style(sci, SCE_PL_OPERATOR, ft_id, 8);
1473 set_sci_style(sci, SCE_PL_IDENTIFIER, ft_id, 9);
1474 set_sci_style(sci, SCE_PL_SCALAR, ft_id, 10);
1475 set_sci_style(sci, SCE_PL_POD, ft_id, 11);
1476 set_sci_style(sci, SCE_PL_REGEX, ft_id, 12);
1477 set_sci_style(sci, SCE_PL_ARRAY, ft_id, 13);
1478 set_sci_style(sci, SCE_PL_HASH, ft_id, 14);
1479 set_sci_style(sci, SCE_PL_SYMBOLTABLE, ft_id, 15);
1480 set_sci_style(sci, SCE_PL_BACKTICKS, ft_id, 16);
1481 set_sci_style(sci, SCE_PL_POD_VERB, ft_id, 17);
1482 set_sci_style(sci, SCE_PL_REGSUBST, ft_id, 18);
1483 set_sci_style(sci, SCE_PL_DATASECTION, ft_id, 19);
1484 set_sci_style(sci, SCE_PL_HERE_DELIM, ft_id, 20);
1485 set_sci_style(sci, SCE_PL_HERE_Q, ft_id, 21);
1486 set_sci_style(sci, SCE_PL_HERE_QQ, ft_id, 22);
1487 set_sci_style(sci, SCE_PL_HERE_QX, ft_id, 23);
1488 set_sci_style(sci, SCE_PL_STRING_Q, ft_id, 24);
1489 set_sci_style(sci, SCE_PL_STRING_QQ, ft_id, 25);
1490 set_sci_style(sci, SCE_PL_STRING_QX, ft_id, 26);
1491 set_sci_style(sci, SCE_PL_STRING_QR, ft_id, 27);
1492 set_sci_style(sci, SCE_PL_STRING_QW, ft_id, 28);
1493 set_sci_style(sci, SCE_PL_VARIABLE_INDEXER, ft_id, 29);
1494 set_sci_style(sci, SCE_PL_PUNCTUATION, ft_id, 30);
1495 set_sci_style(sci, SCE_PL_LONGQUOTE, ft_id, 31);
1496 set_sci_style(sci, SCE_PL_SUB_PROTOTYPE, ft_id, 32);
1497 set_sci_style(sci, SCE_PL_FORMAT_IDENT, ft_id, 33);
1498 set_sci_style(sci, SCE_PL_FORMAT, ft_id, 34);
1502 static void styleset_python_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
1504 new_styleset(ft_id, 16);
1505 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
1506 get_keyfile_style(config, config_home, "commentline", &style_sets[ft_id].styling[1]);
1507 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[2]);
1508 get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[3]);
1509 get_keyfile_style(config, config_home, "character", &style_sets[ft_id].styling[4]);
1510 get_keyfile_style(config, config_home, "word", &style_sets[ft_id].styling[5]);
1511 get_keyfile_style(config, config_home, "triple", &style_sets[ft_id].styling[6]);
1512 get_keyfile_style(config, config_home, "tripledouble", &style_sets[ft_id].styling[7]);
1513 get_keyfile_style(config, config_home, "classname", &style_sets[ft_id].styling[8]);
1514 get_keyfile_style(config, config_home, "defname", &style_sets[ft_id].styling[9]);
1515 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[10]);
1516 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[11]);
1517 get_keyfile_style(config, config_home, "commentblock", &style_sets[ft_id].styling[12]);
1518 get_keyfile_style(config, config_home, "stringeol", &style_sets[ft_id].styling[13]);
1519 get_keyfile_style(config, config_home, "word2", &style_sets[ft_id].styling[14]);
1520 get_keyfile_style(config, config_home, "decorator", &style_sets[ft_id].styling[15]);
1522 style_sets[ft_id].keywords = g_new(gchar*, 3);
1523 get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
1524 get_keyfile_keywords(config, config_home, "identifiers", ft_id, 1);
1525 style_sets[ft_id].keywords[2] = NULL;
1529 static void styleset_python(ScintillaObject *sci, gint ft_id)
1531 apply_filetype_properties(sci, SCLEX_PYTHON, ft_id);
1533 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
1534 sci_set_keywords(sci, 1, style_sets[ft_id].keywords[1]);
1536 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
1537 set_sci_style(sci, SCE_P_DEFAULT, ft_id, 0);
1538 set_sci_style(sci, SCE_P_COMMENTLINE, ft_id, 1);
1539 set_sci_style(sci, SCE_P_NUMBER, ft_id, 2);
1540 set_sci_style(sci, SCE_P_STRING, ft_id, 3);
1541 set_sci_style(sci, SCE_P_CHARACTER, ft_id, 4);
1542 set_sci_style(sci, SCE_P_WORD, ft_id, 5);
1543 set_sci_style(sci, SCE_P_TRIPLE, ft_id, 6);
1544 set_sci_style(sci, SCE_P_TRIPLEDOUBLE, ft_id, 7);
1545 set_sci_style(sci, SCE_P_CLASSNAME, ft_id, 8);
1546 set_sci_style(sci, SCE_P_DEFNAME, ft_id, 9);
1547 set_sci_style(sci, SCE_P_OPERATOR, ft_id, 10);
1548 set_sci_style(sci, SCE_P_IDENTIFIER, ft_id, 11);
1549 set_sci_style(sci, SCE_P_COMMENTBLOCK, ft_id, 12);
1550 set_sci_style(sci, SCE_P_STRINGEOL, ft_id, 13);
1551 set_sci_style(sci, SCE_P_WORD2, ft_id, 14);
1552 set_sci_style(sci, SCE_P_DECORATOR, ft_id, 15);
1556 static void styleset_cmake_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
1558 new_styleset(ft_id, 15);
1559 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
1560 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
1561 get_keyfile_style(config, config_home, "stringdq", &style_sets[ft_id].styling[2]);
1562 get_keyfile_style(config, config_home, "stringlq", &style_sets[ft_id].styling[3]);
1563 get_keyfile_style(config, config_home, "stringrq", &style_sets[ft_id].styling[4]);
1564 get_keyfile_style(config, config_home, "command", &style_sets[ft_id].styling[5]);
1565 get_keyfile_style(config, config_home, "parameters", &style_sets[ft_id].styling[6]);
1566 get_keyfile_style(config, config_home, "variable", &style_sets[ft_id].styling[7]);
1567 get_keyfile_style(config, config_home, "userdefined", &style_sets[ft_id].styling[8]);
1568 get_keyfile_style(config, config_home, "whiledef", &style_sets[ft_id].styling[9]);
1569 get_keyfile_style(config, config_home, "foreachdef", &style_sets[ft_id].styling[10]);
1570 get_keyfile_style(config, config_home, "ifdefinedef", &style_sets[ft_id].styling[11]);
1571 get_keyfile_style(config, config_home, "macrodef", &style_sets[ft_id].styling[12]);
1572 get_keyfile_style(config, config_home, "stringvar", &style_sets[ft_id].styling[13]);
1573 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[14]);
1575 style_sets[ft_id].keywords = g_new(gchar*, 4);
1576 get_keyfile_keywords(config, config_home, "commands", ft_id, 0);
1577 get_keyfile_keywords(config, config_home, "parameters", ft_id, 1);
1578 get_keyfile_keywords(config, config_home, "userdefined", ft_id, 2);
1579 style_sets[ft_id].keywords[3] = NULL;
1583 static void styleset_cmake(ScintillaObject *sci, gint ft_id)
1585 apply_filetype_properties(sci, SCLEX_CMAKE, ft_id);
1587 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
1588 sci_set_keywords(sci, 1, style_sets[ft_id].keywords[1]);
1589 sci_set_keywords(sci, 2, style_sets[ft_id].keywords[2]);
1591 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
1592 set_sci_style(sci, SCE_CMAKE_DEFAULT, ft_id, 0);
1593 set_sci_style(sci, SCE_CMAKE_COMMENT, ft_id, 1);
1594 set_sci_style(sci, SCE_CMAKE_STRINGDQ, ft_id, 2);
1595 set_sci_style(sci, SCE_CMAKE_STRINGLQ, ft_id, 3);
1596 set_sci_style(sci, SCE_CMAKE_STRINGRQ, ft_id, 4);
1597 set_sci_style(sci, SCE_CMAKE_COMMANDS, ft_id, 5);
1598 set_sci_style(sci, SCE_CMAKE_PARAMETERS, ft_id, 6);
1599 set_sci_style(sci, SCE_CMAKE_VARIABLE, ft_id, 7);
1600 set_sci_style(sci, SCE_CMAKE_USERDEFINED, ft_id, 8);
1601 set_sci_style(sci, SCE_CMAKE_WHILEDEF, ft_id, 9);
1602 set_sci_style(sci, SCE_CMAKE_FOREACHDEF, ft_id, 10);
1603 set_sci_style(sci, SCE_CMAKE_IFDEFINEDEF, ft_id, 11);
1604 set_sci_style(sci, SCE_CMAKE_MACRODEF, ft_id, 12);
1605 set_sci_style(sci, SCE_CMAKE_STRINGVAR, ft_id, 13);
1606 set_sci_style(sci, SCE_CMAKE_NUMBER, ft_id, 14);
1610 static void styleset_r_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
1612 new_styleset(ft_id, 12);
1614 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
1615 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
1616 get_keyfile_style(config, config_home, "kword", &style_sets[ft_id].styling[2]);
1617 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[3]);
1618 get_keyfile_style(config, config_home, "basekword", &style_sets[ft_id].styling[4]);
1619 get_keyfile_style(config, config_home, "otherkword", &style_sets[ft_id].styling[5]);
1620 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[6]);
1621 get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[7]);
1622 get_keyfile_style(config, config_home, "string2", &style_sets[ft_id].styling[8]);
1623 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[9]);
1624 get_keyfile_style(config, config_home, "infix", &style_sets[ft_id].styling[10]);
1625 get_keyfile_style(config, config_home, "infixeol", &style_sets[ft_id].styling[11]);
1627 style_sets[ft_id].keywords = g_new(gchar*, 4);
1628 get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
1629 get_keyfile_keywords(config, config_home, "package", ft_id, 1);
1630 get_keyfile_keywords(config, config_home, "package_other", ft_id, 2);
1631 style_sets[ft_id].keywords[3] = NULL;
1635 static void styleset_r(ScintillaObject *sci, gint ft_id)
1637 apply_filetype_properties(sci, SCLEX_R, ft_id);
1639 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
1640 sci_set_keywords(sci, 1, style_sets[ft_id].keywords[1]);
1641 sci_set_keywords(sci, 2, style_sets[ft_id].keywords[2]);
1643 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
1644 set_sci_style(sci, SCE_R_DEFAULT, ft_id, 0);
1645 set_sci_style(sci, SCE_R_COMMENT, ft_id, 1);
1646 set_sci_style(sci, SCE_R_KWORD, ft_id, 2);
1647 set_sci_style(sci, SCE_R_OPERATOR, ft_id, 3);
1648 set_sci_style(sci, SCE_R_BASEKWORD, ft_id, 4);
1649 set_sci_style(sci, SCE_R_OTHERKWORD, ft_id, 5);
1650 set_sci_style(sci, SCE_R_NUMBER, ft_id, 6);
1651 set_sci_style(sci, SCE_R_STRING, ft_id, 7);
1652 set_sci_style(sci, SCE_R_STRING2, ft_id, 8);
1653 set_sci_style(sci, SCE_R_IDENTIFIER, ft_id, 9);
1654 set_sci_style(sci, SCE_R_INFIX, ft_id, 10);
1655 set_sci_style(sci, SCE_R_INFIXEOL, ft_id, 11);
1659 static void styleset_ruby_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
1661 new_styleset(ft_id, 35);
1662 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
1663 get_keyfile_style(config, config_home, "commentline", &style_sets[ft_id].styling[1]);
1664 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[2]);
1665 get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[3]);
1666 get_keyfile_style(config, config_home, "character", &style_sets[ft_id].styling[4]);
1667 get_keyfile_style(config, config_home, "word", &style_sets[ft_id].styling[5]);
1668 get_keyfile_style(config, config_home, "global", &style_sets[ft_id].styling[6]);
1669 get_keyfile_style(config, config_home, "symbol", &style_sets[ft_id].styling[7]);
1670 get_keyfile_style(config, config_home, "classname", &style_sets[ft_id].styling[8]);
1671 get_keyfile_style(config, config_home, "defname", &style_sets[ft_id].styling[9]);
1672 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[10]);
1673 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[11]);
1674 get_keyfile_style(config, config_home, "modulename", &style_sets[ft_id].styling[12]);
1675 get_keyfile_style(config, config_home, "backticks", &style_sets[ft_id].styling[13]);
1676 get_keyfile_style(config, config_home, "instancevar", &style_sets[ft_id].styling[14]);
1677 get_keyfile_style(config, config_home, "classvar", &style_sets[ft_id].styling[15]);
1678 get_keyfile_style(config, config_home, "datasection", &style_sets[ft_id].styling[16]);
1679 get_keyfile_style(config, config_home, "heredelim", &style_sets[ft_id].styling[17]);
1680 get_keyfile_style(config, config_home, "worddemoted", &style_sets[ft_id].styling[18]);
1681 get_keyfile_style(config, config_home, "stdin", &style_sets[ft_id].styling[19]);
1682 get_keyfile_style(config, config_home, "stdout", &style_sets[ft_id].styling[20]);
1683 get_keyfile_style(config, config_home, "stderr", &style_sets[ft_id].styling[21]);
1684 get_keyfile_style(config, config_home, "datasection", &style_sets[ft_id].styling[22]);
1685 get_keyfile_style(config, config_home, "regex", &style_sets[ft_id].styling[23]);
1686 get_keyfile_style(config, config_home, "here_q", &style_sets[ft_id].styling[24]);
1687 get_keyfile_style(config, config_home, "here_qq", &style_sets[ft_id].styling[25]);
1688 get_keyfile_style(config, config_home, "here_qx", &style_sets[ft_id].styling[26]);
1689 get_keyfile_style(config, config_home, "string_q", &style_sets[ft_id].styling[27]);
1690 get_keyfile_style(config, config_home, "string_qq", &style_sets[ft_id].styling[28]);
1691 get_keyfile_style(config, config_home, "string_qx", &style_sets[ft_id].styling[29]);
1692 get_keyfile_style(config, config_home, "string_qr", &style_sets[ft_id].styling[30]);
1693 get_keyfile_style(config, config_home, "string_qw", &style_sets[ft_id].styling[31]);
1694 get_keyfile_style(config, config_home, "upper_bound", &style_sets[ft_id].styling[32]);
1695 get_keyfile_style(config, config_home, "error", &style_sets[ft_id].styling[33]);
1696 get_keyfile_style(config, config_home, "pod", &style_sets[ft_id].styling[34]);
1698 style_sets[ft_id].keywords = g_new(gchar*, 2);
1699 get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
1700 style_sets[ft_id].keywords[1] = NULL;
1704 static void styleset_ruby(ScintillaObject *sci, gint ft_id)
1706 apply_filetype_properties(sci, SCLEX_RUBY, ft_id);
1708 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
1710 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
1711 set_sci_style(sci, SCE_RB_DEFAULT, ft_id, 0);
1712 set_sci_style(sci, SCE_RB_COMMENTLINE, ft_id, 1);
1713 set_sci_style(sci, SCE_RB_NUMBER, ft_id, 2);
1714 set_sci_style(sci, SCE_RB_STRING, ft_id, 3);
1715 set_sci_style(sci, SCE_RB_CHARACTER, ft_id, 4);
1716 set_sci_style(sci, SCE_RB_WORD, ft_id, 5);
1717 set_sci_style(sci, SCE_RB_GLOBAL, ft_id, 6);
1718 set_sci_style(sci, SCE_RB_SYMBOL, ft_id, 7);
1719 set_sci_style(sci, SCE_RB_CLASSNAME, ft_id, 8);
1720 set_sci_style(sci, SCE_RB_DEFNAME, ft_id, 9);
1721 set_sci_style(sci, SCE_RB_OPERATOR, ft_id, 10);
1722 set_sci_style(sci, SCE_RB_IDENTIFIER, ft_id, 11);
1723 set_sci_style(sci, SCE_RB_MODULE_NAME, ft_id, 12);
1724 set_sci_style(sci, SCE_RB_BACKTICKS, ft_id, 13);
1725 set_sci_style(sci, SCE_RB_INSTANCE_VAR, ft_id, 14);
1726 set_sci_style(sci, SCE_RB_CLASS_VAR, ft_id, 15);
1727 set_sci_style(sci, SCE_RB_DATASECTION, ft_id, 16);
1728 set_sci_style(sci, SCE_RB_HERE_DELIM, ft_id, 17);
1729 set_sci_style(sci, SCE_RB_WORD_DEMOTED, ft_id, 18);
1730 set_sci_style(sci, SCE_RB_STDIN, ft_id, 19);
1731 set_sci_style(sci, SCE_RB_STDOUT, ft_id, 20);
1732 set_sci_style(sci, SCE_RB_STDERR, ft_id, 21);
1733 set_sci_style(sci, SCE_RB_DATASECTION, ft_id, 22);
1734 set_sci_style(sci, SCE_RB_REGEX, ft_id, 23);
1735 set_sci_style(sci, SCE_RB_HERE_Q, ft_id, 24);
1736 set_sci_style(sci, SCE_RB_HERE_QQ, ft_id, 25);
1737 set_sci_style(sci, SCE_RB_HERE_QX, ft_id, 26);
1738 set_sci_style(sci, SCE_RB_STRING_Q, ft_id, 27);
1739 set_sci_style(sci, SCE_RB_STRING_QQ, ft_id, 28);
1740 set_sci_style(sci, SCE_RB_STRING_QX, ft_id, 29);
1741 set_sci_style(sci, SCE_RB_STRING_QR, ft_id, 30);
1742 set_sci_style(sci, SCE_RB_STRING_QW, ft_id, 31);
1743 set_sci_style(sci, SCE_RB_UPPER_BOUND, ft_id, 32);
1744 set_sci_style(sci, SCE_RB_ERROR, ft_id, 33);
1745 set_sci_style(sci, SCE_RB_POD, ft_id, 34);
1749 static void styleset_sh_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
1751 new_styleset(ft_id, 14);
1752 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
1753 get_keyfile_style(config, config_home, "commentline", &style_sets[ft_id].styling[1]);
1754 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[2]);
1755 get_keyfile_style(config, config_home, "word", &style_sets[ft_id].styling[3]);
1756 get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[4]);
1757 get_keyfile_style(config, config_home, "character", &style_sets[ft_id].styling[5]);
1758 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[6]);
1759 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[7]);
1760 get_keyfile_style(config, config_home, "backticks", &style_sets[ft_id].styling[8]);
1761 get_keyfile_style(config, config_home, "param", &style_sets[ft_id].styling[9]);
1762 get_keyfile_style(config, config_home, "scalar", &style_sets[ft_id].styling[10]);
1763 get_keyfile_style(config, config_home, "error", &style_sets[ft_id].styling[11]);
1764 get_keyfile_style(config, config_home, "here_delim", &style_sets[ft_id].styling[12]);
1765 get_keyfile_style(config, config_home, "here_q", &style_sets[ft_id].styling[13]);
1767 style_sets[ft_id].keywords = g_new(gchar*, 2);
1768 get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
1769 style_sets[ft_id].keywords[1] = NULL;
1773 static void styleset_sh(ScintillaObject *sci, gint ft_id)
1775 apply_filetype_properties(sci, SCLEX_BASH, ft_id);
1777 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
1779 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
1780 set_sci_style(sci, SCE_SH_DEFAULT, ft_id, 0);
1781 set_sci_style(sci, SCE_SH_COMMENTLINE, ft_id, 1);
1782 set_sci_style(sci, SCE_SH_NUMBER, ft_id, 2);
1783 set_sci_style(sci, SCE_SH_WORD, ft_id, 3);
1784 set_sci_style(sci, SCE_SH_STRING, ft_id, 4);
1785 set_sci_style(sci, SCE_SH_CHARACTER, ft_id, 5);
1786 set_sci_style(sci, SCE_SH_OPERATOR, ft_id, 6);
1787 set_sci_style(sci, SCE_SH_IDENTIFIER, ft_id, 7);
1788 set_sci_style(sci, SCE_SH_BACKTICKS, ft_id, 8);
1789 set_sci_style(sci, SCE_SH_PARAM, ft_id, 9);
1790 set_sci_style(sci, SCE_SH_SCALAR, ft_id, 10);
1791 set_sci_style(sci, SCE_SH_ERROR, ft_id, 11);
1792 set_sci_style(sci, SCE_SH_HERE_DELIM, ft_id, 12);
1793 set_sci_style(sci, SCE_SH_HERE_Q, ft_id, 13);
1797 static void styleset_xml(ScintillaObject *sci, gint ft_id)
1799 apply_filetype_properties(sci, SCLEX_XML, ft_id);
1801 /* use the same colouring for HTML; XML and so on */
1802 styleset_markup(sci, FALSE);
1806 static void styleset_docbook_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
1808 new_styleset(ft_id, 29);
1809 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
1810 get_keyfile_style(config, config_home, "tag", &style_sets[ft_id].styling[1]);
1811 get_keyfile_style(config, config_home, "tagunknown", &style_sets[ft_id].styling[2]);
1812 get_keyfile_style(config, config_home, "attribute", &style_sets[ft_id].styling[3]);
1813 get_keyfile_style(config, config_home, "attributeunknown", &style_sets[ft_id].styling[4]);
1814 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[5]);
1815 get_keyfile_style(config, config_home, "doublestring", &style_sets[ft_id].styling[6]);
1816 get_keyfile_style(config, config_home, "singlestring", &style_sets[ft_id].styling[7]);
1817 get_keyfile_style(config, config_home, "other", &style_sets[ft_id].styling[8]);
1818 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[9]);
1819 get_keyfile_style(config, config_home, "entity", &style_sets[ft_id].styling[10]);
1820 get_keyfile_style(config, config_home, "tagend", &style_sets[ft_id].styling[11]);
1821 get_keyfile_style(config, config_home, "xmlstart", &style_sets[ft_id].styling[12]);
1822 get_keyfile_style(config, config_home, "xmlend", &style_sets[ft_id].styling[13]);
1823 get_keyfile_style(config, config_home, "cdata", &style_sets[ft_id].styling[14]);
1824 get_keyfile_style(config, config_home, "question", &style_sets[ft_id].styling[15]);
1825 get_keyfile_style(config, config_home, "value", &style_sets[ft_id].styling[16]);
1826 get_keyfile_style(config, config_home, "xccomment", &style_sets[ft_id].styling[17]);
1827 get_keyfile_style(config, config_home, "sgml_default", &style_sets[ft_id].styling[18]);
1828 get_keyfile_style(config, config_home, "sgml_comment", &style_sets[ft_id].styling[19]);
1829 get_keyfile_style(config, config_home, "sgml_special", &style_sets[ft_id].styling[20]);
1830 get_keyfile_style(config, config_home, "sgml_command", &style_sets[ft_id].styling[21]);
1831 get_keyfile_style(config, config_home, "sgml_doublestring", &style_sets[ft_id].styling[22]);
1832 get_keyfile_style(config, config_home, "sgml_simplestring", &style_sets[ft_id].styling[23]);
1833 get_keyfile_style(config, config_home, "sgml_1st_param", &style_sets[ft_id].styling[24]);
1834 get_keyfile_style(config, config_home, "sgml_entity", &style_sets[ft_id].styling[25]);
1835 get_keyfile_style(config, config_home, "sgml_block_default", &style_sets[ft_id].styling[26]);
1836 get_keyfile_style(config, config_home, "sgml_1st_param_comment", &style_sets[ft_id].styling[27]);
1837 get_keyfile_style(config, config_home, "sgml_error", &style_sets[ft_id].styling[28]);
1839 style_sets[ft_id].keywords = g_new(gchar*, 3);
1840 get_keyfile_keywords(config, config_home, "elements", ft_id, 0);
1841 get_keyfile_keywords(config, config_home, "dtd", ft_id, 1);
1842 style_sets[ft_id].keywords[2] = NULL;
1846 static void styleset_docbook(ScintillaObject *sci, gint ft_id)
1848 apply_filetype_properties(sci, SCLEX_XML, ft_id);
1850 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
1851 sci_set_keywords(sci, 5, style_sets[ft_id].keywords[1]);
1853 /* Unknown tags and attributes are highlighed in red.
1854 * If a tag is actually OK, it should be added in lower case to the htmlKeyWords string. */
1856 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
1857 set_sci_style(sci, SCE_H_DEFAULT, ft_id, 0);
1858 set_sci_style(sci, SCE_H_TAG, ft_id, 1);
1859 set_sci_style(sci, SCE_H_TAGUNKNOWN, ft_id, 2);
1860 set_sci_style(sci, SCE_H_ATTRIBUTE, ft_id, 3);
1861 set_sci_style(sci, SCE_H_ATTRIBUTEUNKNOWN, ft_id, 4);
1862 set_sci_style(sci, SCE_H_NUMBER, ft_id, 5);
1863 set_sci_style(sci, SCE_H_DOUBLESTRING, ft_id, 6);
1864 set_sci_style(sci, SCE_H_SINGLESTRING, ft_id, 7);
1865 set_sci_style(sci, SCE_H_OTHER, ft_id, 8);
1866 set_sci_style(sci, SCE_H_COMMENT, ft_id, 9);
1867 set_sci_style(sci, SCE_H_ENTITY, ft_id, 10);
1868 set_sci_style(sci, SCE_H_TAGEND, ft_id, 11);
1869 SSM(sci, SCI_STYLESETEOLFILLED, SCE_H_XMLSTART, 1);
1870 set_sci_style(sci, SCE_H_XMLSTART, ft_id, 12);
1871 set_sci_style(sci, SCE_H_XMLEND, ft_id, 13);
1872 set_sci_style(sci, SCE_H_CDATA, ft_id, 14);
1873 set_sci_style(sci, SCE_H_QUESTION, ft_id, 15);
1874 set_sci_style(sci, SCE_H_VALUE, ft_id, 16);
1875 set_sci_style(sci, SCE_H_XCCOMMENT, ft_id, 17);
1876 set_sci_style(sci, SCE_H_SGML_DEFAULT, ft_id, 18);
1877 set_sci_style(sci, SCE_H_DEFAULT, ft_id, 19);
1878 set_sci_style(sci, SCE_H_SGML_SPECIAL, ft_id, 20);
1879 set_sci_style(sci, SCE_H_SGML_COMMAND, ft_id, 21);
1880 set_sci_style(sci, SCE_H_SGML_DOUBLESTRING, ft_id, 22);
1881 set_sci_style(sci, SCE_H_SGML_SIMPLESTRING, ft_id, 23);
1882 set_sci_style(sci, SCE_H_SGML_1ST_PARAM, ft_id, 24);
1883 set_sci_style(sci, SCE_H_SGML_ENTITY, ft_id, 25);
1884 set_sci_style(sci, SCE_H_SGML_BLOCK_DEFAULT, ft_id, 26);
1885 set_sci_style(sci, SCE_H_SGML_1ST_PARAM_COMMENT, ft_id, 27);
1886 set_sci_style(sci, SCE_H_SGML_ERROR, ft_id, 28);
1890 static void styleset_default(ScintillaObject *sci, gint ft_id)
1892 SSM(sci, SCI_SETLEXER, SCLEX_NULL, 0);
1894 /* we need to set STYLE_DEFAULT before we call SCI_STYLECLEARALL in styleset_common() */
1895 set_sci_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_NONE, GCS_DEFAULT);
1897 styleset_common(sci, ft_id);
1901 static void styleset_css_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
1903 new_styleset(ft_id, 22);
1904 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
1905 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
1906 get_keyfile_style(config, config_home, "tag", &style_sets[ft_id].styling[2]);
1907 get_keyfile_style(config, config_home, "class", &style_sets[ft_id].styling[3]);
1908 get_keyfile_style(config, config_home, "pseudoclass", &style_sets[ft_id].styling[4]);
1909 get_keyfile_style(config, config_home, "unknown_pseudoclass", &style_sets[ft_id].styling[5]);
1910 get_keyfile_style(config, config_home, "unknown_identifier", &style_sets[ft_id].styling[6]);
1911 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[7]);
1912 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[8]);
1913 get_keyfile_style(config, config_home, "doublestring", &style_sets[ft_id].styling[9]);
1914 get_keyfile_style(config, config_home, "singlestring", &style_sets[ft_id].styling[10]);
1915 get_keyfile_style(config, config_home, "attribute", &style_sets[ft_id].styling[11]);
1916 get_keyfile_style(config, config_home, "value", &style_sets[ft_id].styling[12]);
1917 get_keyfile_style(config, config_home, "id", &style_sets[ft_id].styling[13]);
1918 get_keyfile_style(config, config_home, "identifier2", &style_sets[ft_id].styling[14]);
1919 get_keyfile_style(config, config_home, "important", &style_sets[ft_id].styling[15]);
1920 get_keyfile_style(config, config_home, "directive", &style_sets[ft_id].styling[16]);
1921 get_keyfile_style(config, config_home, "identifier3", &style_sets[ft_id].styling[17]);
1922 get_keyfile_style(config, config_home, "pseudoelement", &style_sets[ft_id].styling[18]);
1923 get_keyfile_style(config, config_home, "extended_identifier", &style_sets[ft_id].styling[19]);
1924 get_keyfile_style(config, config_home, "extended_pseudoclass", &style_sets[ft_id].styling[20]);
1925 get_keyfile_style(config, config_home, "extended_pseudoelement", &style_sets[ft_id].styling[21]);
1927 style_sets[ft_id].keywords = g_new(gchar*, 9);
1928 get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
1929 get_keyfile_keywords(config, config_home, "pseudoclasses", ft_id, 1);
1930 get_keyfile_keywords(config, config_home, "secondary", ft_id, 2);
1931 get_keyfile_keywords(config, config_home, "css3_properties", ft_id, 3);
1932 get_keyfile_keywords(config, config_home, "pseudo_elements", ft_id, 4);
1933 get_keyfile_keywords(config, config_home, "browser_css_properties", ft_id, 5);
1934 get_keyfile_keywords(config, config_home, "browser_pseudo_classes", ft_id, 6);
1935 get_keyfile_keywords(config, config_home, "browser_pseudo_elements", ft_id, 7);
1936 style_sets[ft_id].keywords[8] = NULL;
1940 static void styleset_css(ScintillaObject *sci, gint ft_id)
1942 guint i;
1944 apply_filetype_properties(sci, SCLEX_CSS, ft_id);
1946 for (i = 0; i < 8; i++)
1948 sci_set_keywords(sci, i, style_sets[ft_id].keywords[i]);
1951 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
1952 set_sci_style(sci, SCE_CSS_DEFAULT, ft_id, 0);
1953 set_sci_style(sci, SCE_CSS_COMMENT, ft_id, 1);
1954 set_sci_style(sci, SCE_CSS_TAG, ft_id, 2);
1955 set_sci_style(sci, SCE_CSS_CLASS, ft_id, 3);
1956 set_sci_style(sci, SCE_CSS_PSEUDOCLASS, ft_id, 4);
1957 set_sci_style(sci, SCE_CSS_UNKNOWN_PSEUDOCLASS, ft_id, 5);
1958 set_sci_style(sci, SCE_CSS_UNKNOWN_IDENTIFIER, ft_id, 6);
1959 set_sci_style(sci, SCE_CSS_OPERATOR, ft_id, 7);
1960 set_sci_style(sci, SCE_CSS_IDENTIFIER, ft_id, 8);
1961 set_sci_style(sci, SCE_CSS_DOUBLESTRING, ft_id, 9);
1962 set_sci_style(sci, SCE_CSS_SINGLESTRING, ft_id, 10);
1963 set_sci_style(sci, SCE_CSS_ATTRIBUTE, ft_id, 11);
1964 set_sci_style(sci, SCE_CSS_VALUE, ft_id, 12);
1965 set_sci_style(sci, SCE_CSS_ID, ft_id, 13);
1966 set_sci_style(sci, SCE_CSS_IDENTIFIER2, ft_id, 14);
1967 set_sci_style(sci, SCE_CSS_IMPORTANT, ft_id, 15);
1968 set_sci_style(sci, SCE_CSS_DIRECTIVE, ft_id, 16);
1969 set_sci_style(sci, SCE_CSS_IDENTIFIER3, ft_id, 17);
1970 set_sci_style(sci, SCE_CSS_PSEUDOELEMENT, ft_id, 18);
1971 set_sci_style(sci, SCE_CSS_EXTENDED_IDENTIFIER, ft_id, 19);
1972 set_sci_style(sci, SCE_CSS_EXTENDED_PSEUDOCLASS, ft_id, 20);
1973 set_sci_style(sci, SCE_CSS_EXTENDED_PSEUDOELEMENT, ft_id, 21);
1977 static void styleset_nsis_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
1979 new_styleset(ft_id, 19);
1980 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
1981 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
1982 get_keyfile_style(config, config_home, "stringdq", &style_sets[ft_id].styling[2]);
1983 get_keyfile_style(config, config_home, "stringlq", &style_sets[ft_id].styling[3]);
1984 get_keyfile_style(config, config_home, "stringrq", &style_sets[ft_id].styling[4]);
1985 get_keyfile_style(config, config_home, "function", &style_sets[ft_id].styling[5]);
1986 get_keyfile_style(config, config_home, "variable", &style_sets[ft_id].styling[6]);
1987 get_keyfile_style(config, config_home, "label", &style_sets[ft_id].styling[7]);
1988 get_keyfile_style(config, config_home, "userdefined", &style_sets[ft_id].styling[8]);
1989 get_keyfile_style(config, config_home, "sectiondef", &style_sets[ft_id].styling[9]);
1990 get_keyfile_style(config, config_home, "subsectiondef", &style_sets[ft_id].styling[10]);
1991 get_keyfile_style(config, config_home, "ifdefinedef", &style_sets[ft_id].styling[11]);
1992 get_keyfile_style(config, config_home, "macrodef", &style_sets[ft_id].styling[12]);
1993 get_keyfile_style(config, config_home, "stringvar", &style_sets[ft_id].styling[13]);
1994 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[14]);
1995 get_keyfile_style(config, config_home, "sectiongroup", &style_sets[ft_id].styling[15]);
1996 get_keyfile_style(config, config_home, "pageex", &style_sets[ft_id].styling[16]);
1997 get_keyfile_style(config, config_home, "functiondef", &style_sets[ft_id].styling[17]);
1998 get_keyfile_style(config, config_home, "commentbox", &style_sets[ft_id].styling[18]);
2000 style_sets[ft_id].keywords = g_new(gchar*, 5);
2001 get_keyfile_keywords(config, config_home, "functions", ft_id, 0);
2002 get_keyfile_keywords(config, config_home, "variables", ft_id, 1);
2003 get_keyfile_keywords(config, config_home, "lables", ft_id, 2);
2004 get_keyfile_keywords(config, config_home, "userdefined", ft_id, 3);
2005 style_sets[ft_id].keywords[4] = NULL;
2009 static void styleset_nsis(ScintillaObject *sci, gint ft_id)
2011 apply_filetype_properties(sci, SCLEX_NSIS, ft_id);
2013 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
2014 sci_set_keywords(sci, 1, style_sets[ft_id].keywords[1]);
2015 sci_set_keywords(sci, 2, style_sets[ft_id].keywords[2]);
2016 sci_set_keywords(sci, 3, style_sets[ft_id].keywords[3]);
2018 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
2019 set_sci_style(sci, SCE_NSIS_DEFAULT, ft_id, 0);
2020 set_sci_style(sci, SCE_NSIS_COMMENT, ft_id, 1);
2021 set_sci_style(sci, SCE_NSIS_STRINGDQ, ft_id, 2);
2022 set_sci_style(sci, SCE_NSIS_STRINGLQ, ft_id, 3);
2023 set_sci_style(sci, SCE_NSIS_STRINGRQ, ft_id, 4);
2024 set_sci_style(sci, SCE_NSIS_FUNCTION, ft_id, 5);
2025 set_sci_style(sci, SCE_NSIS_VARIABLE, ft_id, 6);
2026 set_sci_style(sci, SCE_NSIS_LABEL, ft_id, 7);
2027 set_sci_style(sci, SCE_NSIS_USERDEFINED, ft_id, 8);
2028 set_sci_style(sci, SCE_NSIS_SECTIONDEF, ft_id, 9);
2029 set_sci_style(sci, SCE_NSIS_SUBSECTIONDEF, ft_id, 10);
2030 set_sci_style(sci, SCE_NSIS_IFDEFINEDEF, ft_id, 11);
2031 set_sci_style(sci, SCE_NSIS_MACRODEF, ft_id, 12);
2032 set_sci_style(sci, SCE_NSIS_STRINGVAR, ft_id, 13);
2033 set_sci_style(sci, SCE_NSIS_NUMBER, ft_id, 14);
2034 set_sci_style(sci, SCE_NSIS_SECTIONGROUP, ft_id, 15);
2035 set_sci_style(sci, SCE_NSIS_PAGEEX, ft_id, 16);
2036 set_sci_style(sci, SCE_NSIS_FUNCTIONDEF, ft_id, 17);
2037 set_sci_style(sci, SCE_NSIS_COMMENTBOX, ft_id, 18);
2041 static void styleset_po_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2043 new_styleset(ft_id, 9);
2044 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
2045 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
2046 get_keyfile_style(config, config_home, "msgid", &style_sets[ft_id].styling[2]);
2047 get_keyfile_style(config, config_home, "msgid_text", &style_sets[ft_id].styling[3]);
2048 get_keyfile_style(config, config_home, "msgstr", &style_sets[ft_id].styling[4]);
2049 get_keyfile_style(config, config_home, "msgstr_text", &style_sets[ft_id].styling[5]);
2050 get_keyfile_style(config, config_home, "msgctxt", &style_sets[ft_id].styling[6]);
2051 get_keyfile_style(config, config_home, "msgctxt_text", &style_sets[ft_id].styling[7]);
2052 get_keyfile_style(config, config_home, "fuzzy", &style_sets[ft_id].styling[8]);
2054 style_sets[ft_id].keywords = NULL;
2058 static void styleset_po(ScintillaObject *sci, gint ft_id)
2060 apply_filetype_properties(sci, SCLEX_PO, ft_id);
2062 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
2063 set_sci_style(sci, SCE_PO_DEFAULT, ft_id, 0);
2064 set_sci_style(sci, SCE_PO_COMMENT, ft_id, 1);
2065 set_sci_style(sci, SCE_PO_MSGID, ft_id, 2);
2066 set_sci_style(sci, SCE_PO_MSGID_TEXT, ft_id, 3);
2067 set_sci_style(sci, SCE_PO_MSGSTR, ft_id, 4);
2068 set_sci_style(sci, SCE_PO_MSGSTR_TEXT, ft_id, 5);
2069 set_sci_style(sci, SCE_PO_MSGCTXT, ft_id, 6);
2070 set_sci_style(sci, SCE_PO_MSGCTXT_TEXT, ft_id, 7);
2071 set_sci_style(sci, SCE_PO_FUZZY, ft_id, 8);
2075 static void styleset_conf_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2077 new_styleset(ft_id, 6);
2078 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
2079 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
2080 get_keyfile_style(config, config_home, "section", &style_sets[ft_id].styling[2]);
2081 get_keyfile_style(config, config_home, "key", &style_sets[ft_id].styling[3]);
2082 get_keyfile_style(config, config_home, "assignment", &style_sets[ft_id].styling[4]);
2083 get_keyfile_style(config, config_home, "defval", &style_sets[ft_id].styling[5]);
2085 style_sets[ft_id].keywords = NULL;
2089 static void styleset_conf(ScintillaObject *sci, gint ft_id)
2091 apply_filetype_properties(sci, SCLEX_PROPERTIES, ft_id);
2093 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
2094 set_sci_style(sci, SCE_PROPS_DEFAULT, ft_id, 0);
2095 set_sci_style(sci, SCE_PROPS_COMMENT, ft_id, 1);
2096 set_sci_style(sci, SCE_PROPS_SECTION, ft_id, 2);
2097 set_sci_style(sci, SCE_PROPS_KEY, ft_id, 3);
2098 set_sci_style(sci, SCE_PROPS_ASSIGNMENT, ft_id, 4);
2099 set_sci_style(sci, SCE_PROPS_DEFVAL, ft_id, 5);
2103 static void styleset_asm_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2105 new_styleset(ft_id, 15);
2106 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
2107 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
2108 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[2]);
2109 get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[3]);
2110 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[4]);
2111 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[5]);
2112 get_keyfile_style(config, config_home, "cpuinstruction", &style_sets[ft_id].styling[6]);
2113 get_keyfile_style(config, config_home, "mathinstruction", &style_sets[ft_id].styling[7]);
2114 get_keyfile_style(config, config_home, "register", &style_sets[ft_id].styling[8]);
2115 get_keyfile_style(config, config_home, "directive", &style_sets[ft_id].styling[9]);
2116 get_keyfile_style(config, config_home, "directiveoperand", &style_sets[ft_id].styling[10]);
2117 get_keyfile_style(config, config_home, "commentblock", &style_sets[ft_id].styling[11]);
2118 get_keyfile_style(config, config_home, "character", &style_sets[ft_id].styling[12]);
2119 get_keyfile_style(config, config_home, "stringeol", &style_sets[ft_id].styling[13]);
2120 get_keyfile_style(config, config_home, "extinstruction", &style_sets[ft_id].styling[14]);
2122 style_sets[ft_id].keywords = g_new(gchar*, 4);
2123 get_keyfile_keywords(config, config_home, "instructions", ft_id, 0);
2124 get_keyfile_keywords(config, config_home, "registers", ft_id, 1);
2125 get_keyfile_keywords(config, config_home, "directives", ft_id, 2);
2126 style_sets[ft_id].keywords[3] = NULL;
2130 static void styleset_asm(ScintillaObject *sci, gint ft_id)
2132 apply_filetype_properties(sci, SCLEX_ASM, ft_id);
2134 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
2135 /*sci_set_keywords(sci, 1, style_sets[ft_id].keywords[0]);*/
2136 sci_set_keywords(sci, 2, style_sets[ft_id].keywords[1]);
2137 sci_set_keywords(sci, 3, style_sets[ft_id].keywords[2]);
2138 /*sci_set_keywords(sci, 5, style_sets[ft_id].keywords[0]);*/
2140 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
2141 set_sci_style(sci, SCE_ASM_DEFAULT, ft_id, 0);
2142 set_sci_style(sci, SCE_ASM_COMMENT, ft_id, 1);
2143 set_sci_style(sci, SCE_ASM_NUMBER, ft_id, 2);
2144 set_sci_style(sci, SCE_ASM_STRING, ft_id, 3);
2145 set_sci_style(sci, SCE_ASM_OPERATOR, ft_id, 4);
2146 set_sci_style(sci, SCE_ASM_IDENTIFIER, ft_id, 5);
2147 set_sci_style(sci, SCE_ASM_CPUINSTRUCTION, ft_id, 6);
2148 set_sci_style(sci, SCE_ASM_MATHINSTRUCTION, ft_id, 7);
2149 set_sci_style(sci, SCE_ASM_REGISTER, ft_id, 8);
2150 set_sci_style(sci, SCE_ASM_DIRECTIVE, ft_id, 9);
2151 set_sci_style(sci, SCE_ASM_DIRECTIVEOPERAND, ft_id, 10);
2152 set_sci_style(sci, SCE_ASM_COMMENTBLOCK, ft_id, 11);
2153 set_sci_style(sci, SCE_ASM_CHARACTER, ft_id, 12);
2154 set_sci_style(sci, SCE_ASM_STRINGEOL, ft_id, 13);
2155 set_sci_style(sci, SCE_ASM_EXTINSTRUCTION, ft_id, 14);
2159 static void styleset_f77_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2161 new_styleset(ft_id, 15);
2162 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
2163 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
2164 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[2]);
2165 get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[3]);
2166 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[4]);
2167 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[5]);
2168 get_keyfile_style(config, config_home, "string2", &style_sets[ft_id].styling[6]);
2169 get_keyfile_style(config, config_home, "word", &style_sets[ft_id].styling[7]);
2170 get_keyfile_style(config, config_home, "word2", &style_sets[ft_id].styling[8]);
2171 get_keyfile_style(config, config_home, "word3", &style_sets[ft_id].styling[9]);
2172 get_keyfile_style(config, config_home, "preprocessor", &style_sets[ft_id].styling[10]);
2173 get_keyfile_style(config, config_home, "operator2", &style_sets[ft_id].styling[11]);
2174 get_keyfile_style(config, config_home, "continuation", &style_sets[ft_id].styling[12]);
2175 get_keyfile_style(config, config_home, "stringeol", &style_sets[ft_id].styling[13]);
2176 get_keyfile_style(config, config_home, "label", &style_sets[ft_id].styling[14]);
2178 style_sets[ft_id].keywords = g_new(gchar*, 4);
2179 get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
2180 get_keyfile_keywords(config, config_home, "intrinsic_functions", ft_id, 1);
2181 get_keyfile_keywords(config, config_home, "user_functions", ft_id, 2);
2182 style_sets[ft_id].keywords[3] = NULL;
2186 static void styleset_f77(ScintillaObject *sci, gint ft_id)
2188 apply_filetype_properties(sci, SCLEX_F77, ft_id);
2190 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
2191 sci_set_keywords(sci, 1, style_sets[ft_id].keywords[1]);
2192 sci_set_keywords(sci, 2, style_sets[ft_id].keywords[2]);
2194 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
2195 set_sci_style(sci, SCE_F_DEFAULT, ft_id, 0);
2196 set_sci_style(sci, SCE_F_COMMENT, ft_id, 1);
2197 set_sci_style(sci, SCE_F_NUMBER, ft_id, 2);
2198 set_sci_style(sci, SCE_F_STRING1, ft_id, 3);
2199 set_sci_style(sci, SCE_F_OPERATOR, ft_id, 4);
2200 set_sci_style(sci, SCE_F_IDENTIFIER, ft_id, 5);
2201 set_sci_style(sci, SCE_F_STRING2, ft_id, 6);
2202 set_sci_style(sci, SCE_F_WORD, ft_id, 7);
2203 set_sci_style(sci, SCE_F_WORD2, ft_id, 8);
2204 set_sci_style(sci, SCE_F_WORD3, ft_id, 9);
2205 set_sci_style(sci, SCE_F_PREPROCESSOR, ft_id, 10);
2206 set_sci_style(sci, SCE_F_OPERATOR2, ft_id, 11);
2207 set_sci_style(sci, SCE_F_CONTINUATION, ft_id, 12);
2208 set_sci_style(sci, SCE_F_STRINGEOL, ft_id, 13);
2209 set_sci_style(sci, SCE_F_LABEL, ft_id, 14);
2213 static void styleset_fortran_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2215 new_styleset(ft_id, 15);
2216 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
2217 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
2218 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[2]);
2219 get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[3]);
2220 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[4]);
2221 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[5]);
2222 get_keyfile_style(config, config_home, "string2", &style_sets[ft_id].styling[6]);
2223 get_keyfile_style(config, config_home, "word", &style_sets[ft_id].styling[7]);
2224 get_keyfile_style(config, config_home, "word2", &style_sets[ft_id].styling[8]);
2225 get_keyfile_style(config, config_home, "word3", &style_sets[ft_id].styling[9]);
2226 get_keyfile_style(config, config_home, "preprocessor", &style_sets[ft_id].styling[10]);
2227 get_keyfile_style(config, config_home, "operator2", &style_sets[ft_id].styling[11]);
2228 get_keyfile_style(config, config_home, "continuation", &style_sets[ft_id].styling[12]);
2229 get_keyfile_style(config, config_home, "stringeol", &style_sets[ft_id].styling[13]);
2230 get_keyfile_style(config, config_home, "label", &style_sets[ft_id].styling[14]);
2232 style_sets[ft_id].keywords = g_new(gchar*, 4);
2233 get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
2234 get_keyfile_keywords(config, config_home, "intrinsic_functions", ft_id, 1);
2235 get_keyfile_keywords(config, config_home, "user_functions", ft_id, 2);
2236 style_sets[ft_id].keywords[3] = NULL;
2240 static void styleset_fortran(ScintillaObject *sci, gint ft_id)
2242 apply_filetype_properties(sci, SCLEX_FORTRAN, ft_id);
2244 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
2245 sci_set_keywords(sci, 1, style_sets[ft_id].keywords[1]);
2246 sci_set_keywords(sci, 2, style_sets[ft_id].keywords[2]);
2248 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
2249 set_sci_style(sci, SCE_F_DEFAULT, ft_id, 0);
2250 set_sci_style(sci, SCE_F_COMMENT, ft_id, 1);
2251 set_sci_style(sci, SCE_F_NUMBER, ft_id, 2);
2252 set_sci_style(sci, SCE_F_STRING1, ft_id, 3);
2253 set_sci_style(sci, SCE_F_OPERATOR, ft_id, 4);
2254 set_sci_style(sci, SCE_F_IDENTIFIER, ft_id, 5);
2255 set_sci_style(sci, SCE_F_STRING2, ft_id, 6);
2256 set_sci_style(sci, SCE_F_WORD, ft_id, 7);
2257 set_sci_style(sci, SCE_F_WORD2, ft_id, 8);
2258 set_sci_style(sci, SCE_F_WORD3, ft_id, 9);
2259 set_sci_style(sci, SCE_F_PREPROCESSOR, ft_id, 10);
2260 set_sci_style(sci, SCE_F_OPERATOR2, ft_id, 11);
2261 set_sci_style(sci, SCE_F_CONTINUATION, ft_id, 12);
2262 set_sci_style(sci, SCE_F_STRINGEOL, ft_id, 13);
2263 set_sci_style(sci, SCE_F_LABEL, ft_id, 14);
2267 static void styleset_sql_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2269 new_styleset(ft_id, 15);
2270 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
2271 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
2272 get_keyfile_style(config, config_home, "commentline", &style_sets[ft_id].styling[2]);
2273 get_keyfile_style(config, config_home, "commentdoc", &style_sets[ft_id].styling[3]);
2274 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[4]);
2275 get_keyfile_style(config, config_home, "word", &style_sets[ft_id].styling[5]);
2276 get_keyfile_style(config, config_home, "word2", &style_sets[ft_id].styling[6]);
2277 get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[7]);
2278 get_keyfile_style(config, config_home, "character", &style_sets[ft_id].styling[8]);
2279 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[9]);
2280 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[10]);
2281 get_keyfile_style(config, config_home, "sqlplus", &style_sets[ft_id].styling[11]);
2282 get_keyfile_style(config, config_home, "sqlplus_prompt", &style_sets[ft_id].styling[12]);
2283 get_keyfile_style(config, config_home, "sqlplus_comment", &style_sets[ft_id].styling[13]);
2284 get_keyfile_style(config, config_home, "quotedidentifier", &style_sets[ft_id].styling[14]);
2286 style_sets[ft_id].keywords = g_new(gchar*, 2);
2287 get_keyfile_keywords(config, config_home, "keywords", ft_id, 0);
2288 style_sets[ft_id].keywords[1] = NULL;
2292 static void styleset_sql(ScintillaObject *sci, gint ft_id)
2294 apply_filetype_properties(sci, SCLEX_SQL, ft_id);
2296 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
2298 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
2299 set_sci_style(sci, SCE_SQL_DEFAULT, ft_id, 0);
2300 set_sci_style(sci, SCE_SQL_COMMENT, ft_id, 1);
2301 set_sci_style(sci, SCE_SQL_COMMENTLINE, ft_id, 2);
2302 set_sci_style(sci, SCE_SQL_COMMENTDOC, ft_id, 3);
2303 set_sci_style(sci, SCE_SQL_NUMBER, ft_id, 4);
2304 set_sci_style(sci, SCE_SQL_WORD, ft_id, 5);
2305 set_sci_style(sci, SCE_SQL_WORD2, ft_id, 6);
2306 set_sci_style(sci, SCE_SQL_STRING, ft_id, 7);
2307 set_sci_style(sci, SCE_SQL_CHARACTER, ft_id, 8);
2308 set_sci_style(sci, SCE_SQL_OPERATOR, ft_id, 9);
2309 set_sci_style(sci, SCE_SQL_IDENTIFIER, ft_id, 10);
2310 set_sci_style(sci, SCE_SQL_SQLPLUS, ft_id, 11);
2311 set_sci_style(sci, SCE_SQL_SQLPLUS_PROMPT, ft_id, 12);
2312 set_sci_style(sci, SCE_SQL_SQLPLUS_COMMENT, ft_id, 13);
2313 set_sci_style(sci, SCE_SQL_QUOTEDIDENTIFIER, ft_id, 14);
2317 static void styleset_markdown_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2319 new_styleset(ft_id, 17);
2321 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
2322 get_keyfile_style(config, config_home, "strong", &style_sets[ft_id].styling[1]);
2323 get_keyfile_style(config, config_home, "emphasis", &style_sets[ft_id].styling[2]);
2324 get_keyfile_style(config, config_home, "header1", &style_sets[ft_id].styling[3]);
2325 get_keyfile_style(config, config_home, "header2", &style_sets[ft_id].styling[4]);
2326 get_keyfile_style(config, config_home, "header3", &style_sets[ft_id].styling[5]);
2327 get_keyfile_style(config, config_home, "header4", &style_sets[ft_id].styling[6]);
2328 get_keyfile_style(config, config_home, "header5", &style_sets[ft_id].styling[7]);
2329 get_keyfile_style(config, config_home, "header6", &style_sets[ft_id].styling[8]);
2330 get_keyfile_style(config, config_home, "ulist_item", &style_sets[ft_id].styling[9]);
2331 get_keyfile_style(config, config_home, "olist_item", &style_sets[ft_id].styling[10]);
2332 get_keyfile_style(config, config_home, "blockquote", &style_sets[ft_id].styling[11]);
2333 get_keyfile_style(config, config_home, "strikeout", &style_sets[ft_id].styling[12]);
2334 get_keyfile_style(config, config_home, "hrule", &style_sets[ft_id].styling[13]);
2335 get_keyfile_style(config, config_home, "link", &style_sets[ft_id].styling[14]);
2336 get_keyfile_style(config, config_home, "code", &style_sets[ft_id].styling[15]);
2337 get_keyfile_style(config, config_home, "codebk", &style_sets[ft_id].styling[16]);
2339 style_sets[ft_id].keywords = NULL;
2343 static void styleset_markdown(ScintillaObject *sci, gint ft_id)
2345 apply_filetype_properties(sci, SCLEX_MARKDOWN, ft_id);
2347 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
2348 set_sci_style(sci, SCE_MARKDOWN_DEFAULT, ft_id, 0);
2349 set_sci_style(sci, SCE_MARKDOWN_LINE_BEGIN, ft_id, 0);
2350 set_sci_style(sci, SCE_MARKDOWN_PRECHAR, ft_id, 0);
2351 set_sci_style(sci, SCE_MARKDOWN_STRONG1, ft_id, 1);
2352 set_sci_style(sci, SCE_MARKDOWN_STRONG2, ft_id, 1);
2353 set_sci_style(sci, SCE_MARKDOWN_EM1, ft_id, 2);
2354 set_sci_style(sci, SCE_MARKDOWN_EM2, ft_id, 2);
2355 set_sci_style(sci, SCE_MARKDOWN_HEADER1, ft_id, 3);
2356 set_sci_style(sci, SCE_MARKDOWN_HEADER2, ft_id, 4);
2357 set_sci_style(sci, SCE_MARKDOWN_HEADER3, ft_id, 5);
2358 set_sci_style(sci, SCE_MARKDOWN_HEADER4, ft_id, 6);
2359 set_sci_style(sci, SCE_MARKDOWN_HEADER5, ft_id, 7);
2360 set_sci_style(sci, SCE_MARKDOWN_HEADER6, ft_id, 8);
2361 set_sci_style(sci, SCE_MARKDOWN_ULIST_ITEM, ft_id, 9);
2362 set_sci_style(sci, SCE_MARKDOWN_OLIST_ITEM, ft_id, 10);
2363 set_sci_style(sci, SCE_MARKDOWN_BLOCKQUOTE, ft_id, 11);
2364 set_sci_style(sci, SCE_MARKDOWN_STRIKEOUT, ft_id, 12);
2365 set_sci_style(sci, SCE_MARKDOWN_HRULE, ft_id, 13);
2366 set_sci_style(sci, SCE_MARKDOWN_LINK, ft_id, 14);
2367 set_sci_style(sci, SCE_MARKDOWN_CODE, ft_id, 15);
2368 set_sci_style(sci, SCE_MARKDOWN_CODE2, ft_id, 15);
2369 set_sci_style(sci, SCE_MARKDOWN_CODEBK, ft_id, 16);
2373 static void styleset_haskell_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2375 new_styleset(ft_id, 17);
2377 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
2378 get_keyfile_style(config, config_home, "commentline", &style_sets[ft_id].styling[1]);
2379 get_keyfile_style(config, config_home, "commentblock", &style_sets[ft_id].styling[2]);
2380 get_keyfile_style(config, config_home, "commentblock2", &style_sets[ft_id].styling[3]);
2381 get_keyfile_style(config, config_home, "commentblock3", &style_sets[ft_id].styling[4]);
2382 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[5]);
2383 get_keyfile_style(config, config_home, "keyword", &style_sets[ft_id].styling[6]);
2384 get_keyfile_style(config, config_home, "import", &style_sets[ft_id].styling[7]);
2385 get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[8]);
2386 get_keyfile_style(config, config_home, "character", &style_sets[ft_id].styling[9]);
2387 get_keyfile_style(config, config_home, "class", &style_sets[ft_id].styling[10]);
2388 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[11]);
2389 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[12]);
2390 get_keyfile_style(config, config_home, "instance", &style_sets[ft_id].styling[13]);
2391 get_keyfile_style(config, config_home, "capital", &style_sets[ft_id].styling[14]);
2392 get_keyfile_style(config, config_home, "module", &style_sets[ft_id].styling[15]);
2393 get_keyfile_style(config, config_home, "data", &style_sets[ft_id].styling[16]);
2395 style_sets[ft_id].keywords = g_new(gchar*, 2);
2396 get_keyfile_keywords(config, config_home, "keywords", ft_id, 0);
2397 style_sets[ft_id].keywords[1] = NULL;
2401 static void styleset_haskell(ScintillaObject *sci, gint ft_id)
2403 apply_filetype_properties(sci, SCLEX_HASKELL, ft_id);
2405 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
2407 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
2408 set_sci_style(sci, SCE_HA_DEFAULT, ft_id, 0);
2409 set_sci_style(sci, SCE_HA_COMMENTLINE, ft_id, 1);
2410 set_sci_style(sci, SCE_HA_COMMENTBLOCK, ft_id, 2);
2411 set_sci_style(sci, SCE_HA_COMMENTBLOCK2, ft_id, 3);
2412 set_sci_style(sci, SCE_HA_COMMENTBLOCK3, ft_id, 4);
2413 set_sci_style(sci, SCE_HA_NUMBER, ft_id, 5);
2414 set_sci_style(sci, SCE_HA_KEYWORD, ft_id, 6);
2415 set_sci_style(sci, SCE_HA_IMPORT, ft_id, 7);
2416 set_sci_style(sci, SCE_HA_STRING, ft_id, 8);
2417 set_sci_style(sci, SCE_HA_CHARACTER, ft_id, 9);
2418 set_sci_style(sci, SCE_HA_CLASS, ft_id, 10);
2419 set_sci_style(sci, SCE_HA_OPERATOR, ft_id, 11);
2420 set_sci_style(sci, SCE_HA_IDENTIFIER, ft_id, 12);
2421 set_sci_style(sci, SCE_HA_INSTANCE, ft_id, 13);
2422 set_sci_style(sci, SCE_HA_CAPITAL, ft_id, 14);
2423 set_sci_style(sci, SCE_HA_MODULE, ft_id, 15);
2424 set_sci_style(sci, SCE_HA_DATA, ft_id, 16);
2428 static void styleset_caml_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2430 new_styleset(ft_id, 14);
2432 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
2433 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
2434 get_keyfile_style(config, config_home, "comment1", &style_sets[ft_id].styling[2]);
2435 get_keyfile_style(config, config_home, "comment2", &style_sets[ft_id].styling[3]);
2436 get_keyfile_style(config, config_home, "comment3", &style_sets[ft_id].styling[4]);
2437 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[5]);
2438 get_keyfile_style(config, config_home, "keyword", &style_sets[ft_id].styling[6]);
2439 get_keyfile_style(config, config_home, "keyword2", &style_sets[ft_id].styling[7]);
2440 get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[8]);
2441 get_keyfile_style(config, config_home, "char", &style_sets[ft_id].styling[9]);
2442 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[10]);
2443 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[11]);
2444 get_keyfile_style(config, config_home, "tagname", &style_sets[ft_id].styling[12]);
2445 get_keyfile_style(config, config_home, "linenum", &style_sets[ft_id].styling[13]);
2447 style_sets[ft_id].keywords = g_new(gchar*, 3);
2448 get_keyfile_keywords(config, config_home, "keywords", ft_id, 0);
2449 get_keyfile_keywords(config, config_home, "keywords_optional", ft_id, 1);
2450 style_sets[ft_id].keywords[2] = NULL;
2454 static void styleset_caml(ScintillaObject *sci, gint ft_id)
2456 apply_filetype_properties(sci, SCLEX_CAML, ft_id);
2458 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
2459 sci_set_keywords(sci, 1, style_sets[ft_id].keywords[1]);
2461 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
2462 set_sci_style(sci, SCE_CAML_DEFAULT, ft_id, 0);
2463 set_sci_style(sci, SCE_CAML_COMMENT, ft_id, 1);
2464 set_sci_style(sci, SCE_CAML_COMMENT1, ft_id, 2);
2465 set_sci_style(sci, SCE_CAML_COMMENT2, ft_id, 3);
2466 set_sci_style(sci, SCE_CAML_COMMENT3, ft_id, 4);
2467 set_sci_style(sci, SCE_CAML_NUMBER, ft_id, 5);
2468 set_sci_style(sci, SCE_CAML_KEYWORD, ft_id, 6);
2469 set_sci_style(sci, SCE_CAML_KEYWORD2, ft_id, 7);
2470 set_sci_style(sci, SCE_CAML_STRING, ft_id, 8);
2471 set_sci_style(sci, SCE_CAML_CHAR, ft_id, 9);
2472 set_sci_style(sci, SCE_CAML_OPERATOR, ft_id, 10);
2473 set_sci_style(sci, SCE_CAML_IDENTIFIER, ft_id, 11);
2474 set_sci_style(sci, SCE_CAML_TAGNAME, ft_id, 12);
2475 set_sci_style(sci, SCE_CAML_LINENUM, ft_id, 13);
2479 static void styleset_tcl_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2481 new_styleset(ft_id, 16);
2482 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
2483 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
2484 get_keyfile_style(config, config_home, "commentline", &style_sets[ft_id].styling[2]);
2485 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[3]);
2486 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[4]);
2487 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[5]);
2488 get_keyfile_style(config, config_home, "wordinquote", &style_sets[ft_id].styling[6]);
2489 get_keyfile_style(config, config_home, "inquote", &style_sets[ft_id].styling[7]);
2490 get_keyfile_style(config, config_home, "substitution", &style_sets[ft_id].styling[8]);
2491 get_keyfile_style(config, config_home, "modifier", &style_sets[ft_id].styling[9]);
2492 get_keyfile_style(config, config_home, "expand", &style_sets[ft_id].styling[10]);
2493 get_keyfile_style(config, config_home, "wordtcl", &style_sets[ft_id].styling[11]);
2494 get_keyfile_style(config, config_home, "wordtk", &style_sets[ft_id].styling[12]);
2495 get_keyfile_style(config, config_home, "worditcl", &style_sets[ft_id].styling[13]);
2496 get_keyfile_style(config, config_home, "wordtkcmds", &style_sets[ft_id].styling[14]);
2497 get_keyfile_style(config, config_home, "wordexpand", &style_sets[ft_id].styling[15]);
2499 style_sets[ft_id].keywords = g_new(gchar*, 6);
2500 get_keyfile_keywords(config, config_home, "tcl", ft_id, 0);
2501 get_keyfile_keywords(config, config_home, "tk", ft_id, 1);
2502 get_keyfile_keywords(config, config_home, "itcl", ft_id, 2);
2503 get_keyfile_keywords(config, config_home, "tkcommands", ft_id, 3);
2504 get_keyfile_keywords(config, config_home, "expand", ft_id, 4);
2505 style_sets[ft_id].keywords[5] = NULL;
2509 static void styleset_tcl(ScintillaObject *sci, gint ft_id)
2511 apply_filetype_properties(sci, SCLEX_TCL, ft_id);
2513 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
2514 sci_set_keywords(sci, 1, style_sets[ft_id].keywords[1]);
2515 sci_set_keywords(sci, 2, style_sets[ft_id].keywords[2]);
2516 sci_set_keywords(sci, 3, style_sets[ft_id].keywords[3]);
2517 sci_set_keywords(sci, 4, style_sets[ft_id].keywords[4]);
2519 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
2520 set_sci_style(sci, SCE_TCL_DEFAULT, ft_id, 0);
2521 set_sci_style(sci, SCE_TCL_COMMENT, ft_id, 1);
2522 set_sci_style(sci, SCE_TCL_COMMENTLINE, ft_id, 2);
2523 set_sci_style(sci, SCE_TCL_NUMBER, ft_id, 3);
2524 set_sci_style(sci, SCE_TCL_OPERATOR, ft_id, 4);
2525 set_sci_style(sci, SCE_TCL_IDENTIFIER, ft_id, 5);
2526 set_sci_style(sci, SCE_TCL_WORD_IN_QUOTE, ft_id, 6);
2527 set_sci_style(sci, SCE_TCL_IN_QUOTE, ft_id, 7);
2528 set_sci_style(sci, SCE_TCL_SUBSTITUTION, ft_id, 8);
2529 set_sci_style(sci, SCE_TCL_MODIFIER, ft_id, 9);
2530 set_sci_style(sci, SCE_TCL_EXPAND, ft_id, 10);
2531 set_sci_style(sci, SCE_TCL_WORD, ft_id, 11);
2532 set_sci_style(sci, SCE_TCL_WORD2, ft_id, 12);
2533 set_sci_style(sci, SCE_TCL_WORD3, ft_id, 13);
2534 set_sci_style(sci, SCE_TCL_WORD4, ft_id, 14);
2535 set_sci_style(sci, SCE_TCL_WORD5, ft_id, 15);
2539 static void styleset_matlab_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2541 new_styleset(ft_id, 9);
2542 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
2543 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
2544 get_keyfile_style(config, config_home, "command", &style_sets[ft_id].styling[2]);
2545 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[3]);
2546 get_keyfile_style(config, config_home, "keyword", &style_sets[ft_id].styling[4]);
2547 get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[5]);
2548 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[6]);
2549 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[7]);
2550 get_keyfile_style(config, config_home, "doublequotedstring", &style_sets[ft_id].styling[8]);
2552 style_sets[ft_id].keywords = g_new(gchar*, 2);
2553 get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
2554 style_sets[ft_id].keywords[1] = NULL;
2558 static void styleset_matlab(ScintillaObject *sci, gint ft_id)
2560 apply_filetype_properties(sci, SCLEX_MATLAB, ft_id);
2562 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
2564 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
2565 set_sci_style(sci, SCE_MATLAB_DEFAULT, ft_id, 0);
2566 set_sci_style(sci, SCE_MATLAB_COMMENT, ft_id, 1);
2567 set_sci_style(sci, SCE_MATLAB_COMMAND, ft_id, 2);
2568 set_sci_style(sci, SCE_MATLAB_NUMBER, ft_id, 3);
2569 set_sci_style(sci, SCE_MATLAB_KEYWORD, ft_id, 4);
2570 set_sci_style(sci, SCE_MATLAB_STRING, ft_id, 5);
2571 set_sci_style(sci, SCE_MATLAB_OPERATOR, ft_id, 6);
2572 set_sci_style(sci, SCE_MATLAB_IDENTIFIER, ft_id, 7);
2573 set_sci_style(sci, SCE_MATLAB_DOUBLEQUOTESTRING, ft_id, 8);
2577 static void styleset_d_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2579 new_styleset(ft_id, 18);
2581 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
2582 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
2583 get_keyfile_style(config, config_home, "commentline", &style_sets[ft_id].styling[2]);
2584 get_keyfile_style(config, config_home, "commentdoc", &style_sets[ft_id].styling[3]);
2585 get_keyfile_style(config, config_home, "commentdocnested", &style_sets[ft_id].styling[4]);
2586 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[5]);
2587 get_keyfile_style(config, config_home, "word", &style_sets[ft_id].styling[6]);
2588 get_keyfile_style(config, config_home, "word2", &style_sets[ft_id].styling[7]);
2589 get_keyfile_style(config, config_home, "word3", &style_sets[ft_id].styling[8]);
2590 get_keyfile_style(config, config_home, "typedef", &style_sets[ft_id].styling[9]);
2591 get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[10]);
2592 get_keyfile_style(config, config_home, "stringeol", &style_sets[ft_id].styling[11]);
2593 get_keyfile_style(config, config_home, "character", &style_sets[ft_id].styling[12]);
2594 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[13]);
2595 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[14]);
2596 get_keyfile_style(config, config_home, "commentlinedoc", &style_sets[ft_id].styling[15]);
2597 get_keyfile_style(config, config_home, "commentdockeyword", &style_sets[ft_id].styling[16]);
2598 get_keyfile_style(config, config_home, "commentdockeyworderror", &style_sets[ft_id].styling[17]);
2600 style_sets[ft_id].keywords = g_new(gchar*, 5);
2601 get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
2602 get_keyfile_keywords(config, config_home, "secondary", ft_id, 1);
2603 get_keyfile_keywords(config, config_home, "docComment", ft_id, 2);
2604 get_keyfile_keywords(config, config_home, "types", ft_id, 3);
2605 style_sets[ft_id].keywords[4] = NULL;
2609 static void styleset_d(ScintillaObject *sci, gint ft_id)
2611 apply_filetype_properties(sci, SCLEX_D, ft_id);
2613 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
2614 /* SCI_SETKEYWORDS = 1 - secondary + global tags file types, see below */
2615 sci_set_keywords(sci, 2, style_sets[ft_id].keywords[2]);
2616 /* SCI_SETKEYWORDS = 3 is for current session types - see editor_lexer_get_type_keyword_idx() */
2617 sci_set_keywords(sci, 4, style_sets[ft_id].keywords[3]);
2619 /* assign global types, merge them with user defined keywords and set them */
2620 merge_type_keywords(sci, ft_id, 1);
2622 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
2623 set_sci_style(sci, SCE_D_DEFAULT, ft_id, 0);
2624 set_sci_style(sci, SCE_D_COMMENT, ft_id, 1);
2625 set_sci_style(sci, SCE_D_COMMENTLINE, ft_id, 2);
2626 set_sci_style(sci, SCE_D_COMMENTDOC, ft_id, 3);
2627 set_sci_style(sci, SCE_D_COMMENTNESTED, ft_id, 4);
2628 set_sci_style(sci, SCE_D_NUMBER, ft_id, 5);
2629 set_sci_style(sci, SCE_D_WORD, ft_id, 6);
2630 set_sci_style(sci, SCE_D_WORD2, ft_id, 7);
2631 set_sci_style(sci, SCE_D_WORD3, ft_id, 8);
2632 set_sci_style(sci, SCE_D_TYPEDEF, ft_id, 9);
2633 set_sci_style(sci, SCE_D_WORD5, ft_id, 9);
2634 set_sci_style(sci, SCE_D_STRING, ft_id, 10);
2635 set_sci_style(sci, SCE_D_STRINGB, ft_id, 10);
2636 set_sci_style(sci, SCE_D_STRINGR, ft_id, 10);
2637 set_sci_style(sci, SCE_D_STRINGEOL, ft_id, 11);
2638 set_sci_style(sci, SCE_D_CHARACTER, ft_id, 12);
2639 set_sci_style(sci, SCE_D_OPERATOR, ft_id, 13);
2640 set_sci_style(sci, SCE_D_IDENTIFIER, ft_id, 14);
2641 set_sci_style(sci, SCE_D_COMMENTLINEDOC, ft_id, 15);
2642 set_sci_style(sci, SCE_D_COMMENTDOCKEYWORD, ft_id, 16);
2643 set_sci_style(sci, SCE_D_COMMENTDOCKEYWORDERROR, ft_id, 17);
2647 static void styleset_ferite_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2649 styleset_c_like_init(config, config_home, ft_id);
2651 style_sets[ft_id].keywords = g_new(gchar*, 4);
2652 get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
2653 get_keyfile_keywords(config, config_home, "types", ft_id, 1);
2654 get_keyfile_keywords(config, config_home, "docComment", ft_id, 2);
2655 style_sets[ft_id].keywords[3] = NULL;
2659 static void styleset_ferite(ScintillaObject *sci, gint ft_id)
2661 styleset_c_like(sci, ft_id);
2663 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
2664 sci_set_keywords(sci, 1, style_sets[ft_id].keywords[1]);
2665 sci_set_keywords(sci, 2, style_sets[ft_id].keywords[2]);
2669 static void styleset_vhdl_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2671 new_styleset(ft_id, 15);
2673 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
2674 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
2675 get_keyfile_style(config, config_home, "comment_line_bang", &style_sets[ft_id].styling[2]);
2676 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[3]);
2677 get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[4]);
2678 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[5]);
2679 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[6]);
2680 get_keyfile_style(config, config_home, "stringeol", &style_sets[ft_id].styling[7]);
2681 get_keyfile_style(config, config_home, "keyword", &style_sets[ft_id].styling[8]);
2682 get_keyfile_style(config, config_home, "stdoperator", &style_sets[ft_id].styling[9]);
2683 get_keyfile_style(config, config_home, "attribute", &style_sets[ft_id].styling[10]);
2684 get_keyfile_style(config, config_home, "stdfunction", &style_sets[ft_id].styling[11]);
2685 get_keyfile_style(config, config_home, "stdpackage", &style_sets[ft_id].styling[12]);
2686 get_keyfile_style(config, config_home, "stdtype", &style_sets[ft_id].styling[13]);
2687 get_keyfile_style(config, config_home, "userword", &style_sets[ft_id].styling[14]);
2689 style_sets[ft_id].keywords = g_new(gchar*, 8);
2690 get_keyfile_keywords(config, config_home, "keywords", ft_id, 0);
2691 get_keyfile_keywords(config, config_home, "operators", ft_id, 1);
2692 get_keyfile_keywords(config, config_home, "attributes", ft_id, 2);
2693 get_keyfile_keywords(config, config_home, "std_functions", ft_id, 3);
2694 get_keyfile_keywords(config, config_home, "std_packages", ft_id, 4);
2695 get_keyfile_keywords(config, config_home, "std_types", ft_id, 5);
2696 get_keyfile_keywords(config, config_home, "userwords", ft_id, 6);
2697 style_sets[ft_id].keywords[7] = NULL;
2701 static void styleset_vhdl(ScintillaObject *sci, gint ft_id)
2703 apply_filetype_properties(sci, SCLEX_VHDL, ft_id);
2705 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
2706 sci_set_keywords(sci, 1, style_sets[ft_id].keywords[1]);
2707 sci_set_keywords(sci, 2, style_sets[ft_id].keywords[2]);
2708 sci_set_keywords(sci, 3, style_sets[ft_id].keywords[3]);
2709 sci_set_keywords(sci, 4, style_sets[ft_id].keywords[4]);
2710 sci_set_keywords(sci, 5, style_sets[ft_id].keywords[5]);
2711 sci_set_keywords(sci, 6, style_sets[ft_id].keywords[6]);
2713 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
2714 set_sci_style(sci, SCE_VHDL_DEFAULT, ft_id, 0);
2715 set_sci_style(sci, SCE_VHDL_COMMENT, ft_id, 1);
2716 set_sci_style(sci, SCE_VHDL_COMMENTLINEBANG, ft_id, 2);
2717 set_sci_style(sci, SCE_VHDL_NUMBER, ft_id, 3);
2718 set_sci_style(sci, SCE_VHDL_STRING, ft_id, 4);
2719 set_sci_style(sci, SCE_VHDL_OPERATOR, ft_id, 5);
2720 set_sci_style(sci, SCE_VHDL_IDENTIFIER, ft_id, 6);
2721 set_sci_style(sci, SCE_VHDL_STRINGEOL, ft_id, 7);
2722 set_sci_style(sci, SCE_VHDL_KEYWORD, ft_id, 8);
2723 set_sci_style(sci, SCE_VHDL_STDOPERATOR, ft_id, 9);
2724 set_sci_style(sci, SCE_VHDL_ATTRIBUTE, ft_id, 10);
2725 set_sci_style(sci, SCE_VHDL_STDFUNCTION, ft_id, 11);
2726 set_sci_style(sci, SCE_VHDL_STDPACKAGE, ft_id, 12);
2727 set_sci_style(sci, SCE_VHDL_STDTYPE, ft_id, 13);
2728 set_sci_style(sci, SCE_VHDL_USERWORD, ft_id, 14);
2732 static void styleset_verilog_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2734 new_styleset(ft_id, 14);
2736 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
2737 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
2738 get_keyfile_style(config, config_home, "comment_line", &style_sets[ft_id].styling[2]);
2739 get_keyfile_style(config, config_home, "comment_line_bang", &style_sets[ft_id].styling[3]);
2740 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[4]);
2741 get_keyfile_style(config, config_home, "word", &style_sets[ft_id].styling[5]);
2742 get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[6]);
2743 get_keyfile_style(config, config_home, "word2", &style_sets[ft_id].styling[7]);
2744 get_keyfile_style(config, config_home, "word3", &style_sets[ft_id].styling[8]);
2745 get_keyfile_style(config, config_home, "preprocessor", &style_sets[ft_id].styling[9]);
2746 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[10]);
2747 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[11]);
2748 get_keyfile_style(config, config_home, "stringeol", &style_sets[ft_id].styling[12]);
2749 get_keyfile_style(config, config_home, "userword", &style_sets[ft_id].styling[13]);
2751 style_sets[ft_id].keywords = g_new(gchar*, 4);
2752 get_keyfile_keywords(config, config_home, "word", ft_id, 0);
2753 get_keyfile_keywords(config, config_home, "word2", ft_id, 1);
2754 get_keyfile_keywords(config, config_home, "word3", ft_id, 2);
2755 style_sets[ft_id].keywords[3] = NULL;
2759 static void styleset_verilog(ScintillaObject *sci, gint ft_id)
2761 apply_filetype_properties(sci, SCLEX_VERILOG, ft_id);
2763 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
2764 sci_set_keywords(sci, 1, style_sets[ft_id].keywords[1]);
2765 sci_set_keywords(sci, 2, style_sets[ft_id].keywords[2]);
2767 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
2768 set_sci_style(sci, SCE_V_DEFAULT, ft_id, 0);
2769 set_sci_style(sci, SCE_V_COMMENT, ft_id, 1);
2770 set_sci_style(sci, SCE_V_COMMENTLINE, ft_id, 2);
2771 set_sci_style(sci, SCE_V_COMMENTLINEBANG, ft_id, 3);
2772 set_sci_style(sci, SCE_V_NUMBER, ft_id, 4);
2773 set_sci_style(sci, SCE_V_WORD, ft_id,5);
2774 set_sci_style(sci, SCE_V_STRING, ft_id, 6);
2775 set_sci_style(sci, SCE_V_WORD2, ft_id, 7);
2776 set_sci_style(sci, SCE_V_WORD3, ft_id, 8);
2777 set_sci_style(sci, SCE_V_PREPROCESSOR, ft_id, 9);
2778 set_sci_style(sci, SCE_V_OPERATOR, ft_id, 10);
2779 set_sci_style(sci, SCE_V_IDENTIFIER, ft_id, 11);
2780 set_sci_style(sci, SCE_V_STRINGEOL, ft_id, 12);
2781 set_sci_style(sci, SCE_V_USER, ft_id, 13);
2785 static void styleset_yaml_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2787 new_styleset(ft_id, 10);
2789 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
2790 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
2791 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[2]);
2792 get_keyfile_style(config, config_home, "keyword", &style_sets[ft_id].styling[3]);
2793 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[4]);
2794 get_keyfile_style(config, config_home, "reference", &style_sets[ft_id].styling[5]);
2795 get_keyfile_style(config, config_home, "document", &style_sets[ft_id].styling[6]);
2796 get_keyfile_style(config, config_home, "text", &style_sets[ft_id].styling[7]);
2797 get_keyfile_style(config, config_home, "error", &style_sets[ft_id].styling[8]);
2798 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[9]);
2800 style_sets[ft_id].keywords = g_new(gchar*, 2);
2801 get_keyfile_keywords(config, config_home, "keywords", ft_id, 0);
2802 style_sets[ft_id].keywords[1] = NULL;
2806 static void styleset_yaml(ScintillaObject *sci, gint ft_id)
2808 apply_filetype_properties(sci, SCLEX_YAML, ft_id);
2810 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
2812 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
2813 set_sci_style(sci, SCE_YAML_DEFAULT, ft_id, 0);
2814 set_sci_style(sci, SCE_YAML_COMMENT, ft_id, 1);
2815 set_sci_style(sci, SCE_YAML_IDENTIFIER, ft_id, 2);
2816 set_sci_style(sci, SCE_YAML_KEYWORD, ft_id, 3);
2817 set_sci_style(sci, SCE_YAML_NUMBER, ft_id, 4);
2818 set_sci_style(sci, SCE_YAML_REFERENCE, ft_id, 5);
2819 set_sci_style(sci, SCE_YAML_DOCUMENT, ft_id, 6);
2820 set_sci_style(sci, SCE_YAML_TEXT, ft_id, 7);
2821 set_sci_style(sci, SCE_YAML_ERROR, ft_id, 8);
2822 set_sci_style(sci, SCE_YAML_OPERATOR, ft_id, 9);
2826 static void styleset_js_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2828 styleset_c_like_init(config, config_home, ft_id);
2830 style_sets[ft_id].keywords = g_new(gchar*, 2);
2831 get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
2832 style_sets[ft_id].keywords[1] = NULL;
2836 static void styleset_js(ScintillaObject *sci, gint ft_id)
2838 styleset_c_like(sci, ft_id);
2840 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
2844 static void styleset_lua_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2846 new_styleset(ft_id, 20);
2848 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
2849 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
2850 get_keyfile_style(config, config_home, "commentline", &style_sets[ft_id].styling[2]);
2851 get_keyfile_style(config, config_home, "commentdoc", &style_sets[ft_id].styling[3]);
2852 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[4]);
2853 get_keyfile_style(config, config_home, "word", &style_sets[ft_id].styling[5]);
2854 get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[6]);
2855 get_keyfile_style(config, config_home, "character", &style_sets[ft_id].styling[7]);
2856 get_keyfile_style(config, config_home, "literalstring", &style_sets[ft_id].styling[8]);
2857 get_keyfile_style(config, config_home, "preprocessor", &style_sets[ft_id].styling[9]);
2858 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[10]);
2859 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[11]);
2860 get_keyfile_style(config, config_home, "stringeol", &style_sets[ft_id].styling[12]);
2861 get_keyfile_style(config, config_home, "function_basic", &style_sets[ft_id].styling[13]);
2862 get_keyfile_style(config, config_home, "function_other", &style_sets[ft_id].styling[14]);
2863 get_keyfile_style(config, config_home, "coroutines", &style_sets[ft_id].styling[15]);
2864 get_keyfile_style(config, config_home, "word5", &style_sets[ft_id].styling[16]);
2865 get_keyfile_style(config, config_home, "word6", &style_sets[ft_id].styling[17]);
2866 get_keyfile_style(config, config_home, "word7", &style_sets[ft_id].styling[18]);
2867 get_keyfile_style(config, config_home, "word8", &style_sets[ft_id].styling[19]);
2869 style_sets[ft_id].keywords = g_new(gchar*, 9);
2870 get_keyfile_keywords(config, config_home, "keywords", ft_id, 0);
2871 get_keyfile_keywords(config, config_home, "function_basic", ft_id, 1);
2872 get_keyfile_keywords(config, config_home, "function_other", ft_id, 2);
2873 get_keyfile_keywords(config, config_home, "coroutines", ft_id, 3);
2874 get_keyfile_keywords(config, config_home, "user1", ft_id, 4);
2875 get_keyfile_keywords(config, config_home, "user2", ft_id, 5);
2876 get_keyfile_keywords(config, config_home, "user3", ft_id, 6);
2877 get_keyfile_keywords(config, config_home, "user4", ft_id, 7);
2878 style_sets[ft_id].keywords[8] = NULL;
2882 static void styleset_lua(ScintillaObject *sci, gint ft_id)
2884 apply_filetype_properties(sci, SCLEX_LUA, ft_id);
2886 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
2887 sci_set_keywords(sci, 1, style_sets[ft_id].keywords[1]);
2888 sci_set_keywords(sci, 2, style_sets[ft_id].keywords[2]);
2889 sci_set_keywords(sci, 3, style_sets[ft_id].keywords[3]);
2890 sci_set_keywords(sci, 4, style_sets[ft_id].keywords[4]);
2891 sci_set_keywords(sci, 5, style_sets[ft_id].keywords[5]);
2892 sci_set_keywords(sci, 6, style_sets[ft_id].keywords[6]);
2893 sci_set_keywords(sci, 7, style_sets[ft_id].keywords[7]);
2895 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
2896 set_sci_style(sci, SCE_LUA_DEFAULT, ft_id, 0);
2897 set_sci_style(sci, SCE_LUA_COMMENT, ft_id, 1);
2898 set_sci_style(sci, SCE_LUA_COMMENTLINE, ft_id, 2);
2899 set_sci_style(sci, SCE_LUA_COMMENTDOC, ft_id, 3);
2900 set_sci_style(sci, SCE_LUA_NUMBER, ft_id, 4);
2901 set_sci_style(sci, SCE_LUA_WORD, ft_id, 5);
2902 set_sci_style(sci, SCE_LUA_STRING, ft_id, 6);
2903 set_sci_style(sci, SCE_LUA_CHARACTER, ft_id, 7);
2904 set_sci_style(sci, SCE_LUA_LITERALSTRING, ft_id, 8);
2905 set_sci_style(sci, SCE_LUA_PREPROCESSOR, ft_id, 9);
2906 set_sci_style(sci, SCE_LUA_OPERATOR, ft_id, 10);
2907 set_sci_style(sci, SCE_LUA_IDENTIFIER, ft_id, 11);
2908 set_sci_style(sci, SCE_LUA_STRINGEOL, ft_id, 12);
2909 set_sci_style(sci, SCE_LUA_WORD2, ft_id, 13);
2910 set_sci_style(sci, SCE_LUA_WORD3, ft_id, 14);
2911 set_sci_style(sci, SCE_LUA_WORD4, ft_id, 15);
2912 set_sci_style(sci, SCE_LUA_WORD5, ft_id, 16);
2913 set_sci_style(sci, SCE_LUA_WORD6, ft_id, 17);
2914 set_sci_style(sci, SCE_LUA_WORD7, ft_id, 18);
2915 set_sci_style(sci, SCE_LUA_WORD8, ft_id, 19);
2919 static void styleset_basic_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2921 new_styleset(ft_id, 19);
2923 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
2924 get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
2925 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[2]);
2926 get_keyfile_style(config, config_home, "word", &style_sets[ft_id].styling[3]);
2927 get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[4]);
2928 get_keyfile_style(config, config_home, "preprocessor", &style_sets[ft_id].styling[5]);
2929 get_keyfile_style(config, config_home, "operator", &style_sets[ft_id].styling[6]);
2930 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[7]);
2931 get_keyfile_style(config, config_home, "date", &style_sets[ft_id].styling[8]);
2932 get_keyfile_style(config, config_home, "stringeol", &style_sets[ft_id].styling[9]);
2933 get_keyfile_style(config, config_home, "word2", &style_sets[ft_id].styling[10]);
2934 get_keyfile_style(config, config_home, "word3", &style_sets[ft_id].styling[11]);
2935 get_keyfile_style(config, config_home, "word4", &style_sets[ft_id].styling[12]);
2936 get_keyfile_style(config, config_home, "constant", &style_sets[ft_id].styling[13]);
2937 get_keyfile_style(config, config_home, "asm", &style_sets[ft_id].styling[14]);
2938 get_keyfile_style(config, config_home, "label", &style_sets[ft_id].styling[15]);
2939 get_keyfile_style(config, config_home, "error", &style_sets[ft_id].styling[16]);
2940 get_keyfile_style(config, config_home, "hexnumber", &style_sets[ft_id].styling[17]);
2941 get_keyfile_style(config, config_home, "binnumber", &style_sets[ft_id].styling[18]);
2943 style_sets[ft_id].keywords = g_new(gchar*, 5);
2944 get_keyfile_keywords(config, config_home, "keywords", ft_id, 0);
2945 get_keyfile_keywords(config, config_home, "preprocessor", ft_id, 1);
2946 get_keyfile_keywords(config, config_home, "user1", ft_id, 2);
2947 get_keyfile_keywords(config, config_home, "user2", ft_id, 3);
2948 style_sets[ft_id].keywords[4] = NULL;
2952 static void styleset_basic(ScintillaObject *sci, gint ft_id)
2954 apply_filetype_properties(sci, SCLEX_FREEBASIC, ft_id);
2956 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
2957 sci_set_keywords(sci, 1, style_sets[ft_id].keywords[1]);
2958 sci_set_keywords(sci, 2, style_sets[ft_id].keywords[2]);
2959 sci_set_keywords(sci, 3, style_sets[ft_id].keywords[3]);
2961 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
2962 set_sci_style(sci, SCE_B_DEFAULT, ft_id, 0);
2963 set_sci_style(sci, SCE_B_COMMENT, ft_id, 1);
2964 set_sci_style(sci, SCE_B_NUMBER, ft_id, 2);
2965 set_sci_style(sci, SCE_B_KEYWORD, ft_id, 3);
2966 set_sci_style(sci, SCE_B_STRING, ft_id, 4);
2967 set_sci_style(sci, SCE_B_PREPROCESSOR, ft_id, 5);
2968 set_sci_style(sci, SCE_B_OPERATOR, ft_id, 6);
2969 set_sci_style(sci, SCE_B_IDENTIFIER, ft_id, 7);
2970 set_sci_style(sci, SCE_B_DATE, ft_id, 8);
2971 set_sci_style(sci, SCE_B_STRINGEOL, ft_id, 9);
2972 set_sci_style(sci, SCE_B_KEYWORD2, ft_id, 10);
2973 set_sci_style(sci, SCE_B_KEYWORD3, ft_id, 11);
2974 set_sci_style(sci, SCE_B_KEYWORD4, ft_id, 12);
2975 set_sci_style(sci, SCE_B_CONSTANT, ft_id, 13);
2976 set_sci_style(sci, SCE_B_ASM, ft_id, 14); /* (still?) unused by the lexer */
2977 set_sci_style(sci, SCE_B_LABEL, ft_id, 15);
2978 set_sci_style(sci, SCE_B_ERROR, ft_id, 16);
2979 set_sci_style(sci, SCE_B_HEXNUMBER, ft_id, 17);
2980 set_sci_style(sci, SCE_B_BINNUMBER, ft_id, 18);
2984 static void styleset_actionscript_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
2986 styleset_c_like_init(config, config_home, ft_id);
2988 style_sets[ft_id].keywords = g_new(gchar *, 4);
2989 get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
2990 get_keyfile_keywords(config, config_home, "secondary", ft_id, 1);
2991 get_keyfile_keywords(config, config_home, "classes", ft_id, 2);
2992 style_sets[ft_id].keywords[3] = NULL;
2996 static void styleset_actionscript(ScintillaObject *sci, gint ft_id)
2998 styleset_c_like(sci, ft_id);
3000 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
3001 sci_set_keywords(sci, 1, style_sets[ft_id].keywords[2]);
3002 sci_set_keywords(sci, 3, style_sets[ft_id].keywords[1]);
3006 static void styleset_haxe_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
3008 styleset_c_like_init(config, config_home, ft_id);
3010 style_sets[ft_id].keywords = g_new(gchar*, 4);
3011 get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
3012 get_keyfile_keywords(config, config_home, "secondary", ft_id, 1);
3013 get_keyfile_keywords(config, config_home, "classes", ft_id, 2);
3014 style_sets[ft_id].keywords[3] = NULL;
3018 static void styleset_haxe(ScintillaObject *sci, gint ft_id)
3020 styleset_c_like(sci, ft_id);
3022 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
3023 sci_set_keywords(sci, 1, style_sets[ft_id].keywords[1]);
3024 sci_set_keywords(sci, 3, style_sets[ft_id].keywords[2]);
3028 static void styleset_ada_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
3030 new_styleset(ft_id, 12);
3032 get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
3033 get_keyfile_style(config, config_home, "word", &style_sets[ft_id].styling[1]);
3034 get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[2]);
3035 get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[3]);
3036 get_keyfile_style(config, config_home, "delimiter", &style_sets[ft_id].styling[4]);
3037 get_keyfile_style(config, config_home, "character", &style_sets[ft_id].styling[5]);
3038 get_keyfile_style(config, config_home, "charactereol", &style_sets[ft_id].styling[6]);
3039 get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[7]);
3040 get_keyfile_style(config, config_home, "stringeol", &style_sets[ft_id].styling[8]);
3041 get_keyfile_style(config, config_home, "label", &style_sets[ft_id].styling[9]);
3042 get_keyfile_style(config, config_home, "commentline", &style_sets[ft_id].styling[10]);
3043 get_keyfile_style(config, config_home, "illegal", &style_sets[ft_id].styling[11]);
3045 style_sets[ft_id].keywords = g_new(gchar*, 2);
3046 get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
3047 style_sets[ft_id].keywords[1] = NULL;
3051 static void styleset_ada(ScintillaObject *sci, gint ft_id)
3053 apply_filetype_properties(sci, SCLEX_ADA, ft_id);
3055 sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
3057 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
3058 set_sci_style(sci, SCE_ADA_DEFAULT, ft_id, 0);
3059 set_sci_style(sci, SCE_ADA_WORD, ft_id, 1);
3060 set_sci_style(sci, SCE_ADA_IDENTIFIER, ft_id, 2);
3061 set_sci_style(sci, SCE_ADA_NUMBER, ft_id, 3);
3062 set_sci_style(sci, SCE_ADA_DELIMITER, ft_id, 4);
3063 set_sci_style(sci, SCE_ADA_CHARACTER, ft_id, 5);
3064 set_sci_style(sci, SCE_ADA_CHARACTEREOL, ft_id, 6);
3065 set_sci_style(sci, SCE_ADA_STRING, ft_id, 7);
3066 set_sci_style(sci, SCE_ADA_STRINGEOL, ft_id, 8);
3067 set_sci_style(sci, SCE_ADA_LABEL, ft_id, 9);
3068 set_sci_style(sci, SCE_ADA_COMMENTLINE, ft_id, 10);
3069 set_sci_style(sci, SCE_ADA_ILLEGAL, ft_id, 11);
3073 static void get_key_values(GKeyFile *config, const gchar *group, gchar **keys, gchar **values)
3075 while (*keys)
3077 gchar *str = g_key_file_get_string(config, group, *keys, NULL);
3079 if (str)
3080 setptr(*values, str);
3082 keys++;
3083 values++;
3088 #define foreach_strv(strptr, strv) \
3089 for (strptr = strv; *strptr; strptr++)
3091 static void read_properties(GeanyFiletype *ft, GKeyFile *config, GKeyFile *configh)
3093 gchar group[] = "lexer_properties";
3094 gchar **keys = g_key_file_get_keys(config, group, NULL, NULL);
3095 gchar **keysh = g_key_file_get_keys(configh, group, NULL, NULL);
3097 /* move/merge keysh into keys */
3098 if (!keys)
3099 keys = keysh;
3100 else if (keysh)
3102 gchar **strv = g_new0(gchar*, g_strv_length(keys) + g_strv_length(keysh) + 1);
3103 gchar **read, **write = strv;
3105 /* may have same key in each, but home will override so it's OK */
3106 foreach_strv(read, keys)
3107 *write++ = *read;
3108 foreach_strv(read, keysh)
3109 *write++ = *read;
3110 g_free(keys);
3111 g_free(keysh);
3112 keys = strv;
3115 if (keys)
3117 gchar **values = g_new0(gchar*, g_strv_length(keys) + 1);
3119 style_sets[ft->id].property_keys = keys;
3120 style_sets[ft->id].property_values = values;
3122 get_key_values(config, group, keys, values);
3123 get_key_values(configh, group, keys, values);
3128 static gint get_lexer_filetype(GeanyFiletype *ft)
3130 ft = NVL(ft->lexer_filetype, ft);
3131 return ft->id;
3135 /* lang_name is the name used for the styleset_foo_init function, e.g. foo. */
3136 #define init_styleset_case(ft_id, init_styleset_func) \
3137 case (ft_id): \
3138 init_styleset_func(filetype_idx, config, configh); \
3139 break
3141 /* Called by filetypes_load_config(). */
3142 void highlighting_init_styles(gint filetype_idx, GKeyFile *config, GKeyFile *configh)
3144 GeanyFiletype *ft = filetypes[filetype_idx];
3145 gint lexer_id = get_lexer_filetype(ft);
3147 if (!style_sets)
3148 style_sets = g_new0(StyleSet, filetypes_array->len);
3150 /* Clear old information if necessary - e.g. when reloading config */
3151 free_styleset(filetype_idx);
3153 read_properties(ft, config, configh);
3155 /* None filetype handled specially */
3156 if (filetype_idx == GEANY_FILETYPES_NONE)
3158 styleset_common_init(GEANY_FILETYPES_NONE, config, configh);
3159 return;
3161 /* All stylesets depend on filetypes.common */
3162 filetypes_load_config(GEANY_FILETYPES_NONE, FALSE);
3164 switch (lexer_id)
3166 init_styleset_case(GEANY_FILETYPES_ADA, styleset_ada_init);
3167 init_styleset_case(GEANY_FILETYPES_ASM, styleset_asm_init);
3168 init_styleset_case(GEANY_FILETYPES_BASIC, styleset_basic_init);
3169 init_styleset_case(GEANY_FILETYPES_C, styleset_c_init);
3170 init_styleset_case(GEANY_FILETYPES_CAML, styleset_caml_init);
3171 init_styleset_case(GEANY_FILETYPES_CMAKE, styleset_cmake_init);
3172 init_styleset_case(GEANY_FILETYPES_CONF, styleset_conf_init);
3173 init_styleset_case(GEANY_FILETYPES_CSS, styleset_css_init);
3174 init_styleset_case(GEANY_FILETYPES_D, styleset_d_init);
3175 init_styleset_case(GEANY_FILETYPES_DIFF, styleset_diff_init);
3176 init_styleset_case(GEANY_FILETYPES_DOCBOOK, styleset_docbook_init);
3177 init_styleset_case(GEANY_FILETYPES_FERITE, styleset_ferite_init);
3178 init_styleset_case(GEANY_FILETYPES_F77, styleset_f77_init);
3179 init_styleset_case(GEANY_FILETYPES_FORTRAN, styleset_fortran_init);
3180 init_styleset_case(GEANY_FILETYPES_HASKELL, styleset_haskell_init);
3181 init_styleset_case(GEANY_FILETYPES_HAXE, styleset_haxe_init);
3182 init_styleset_case(GEANY_FILETYPES_AS, styleset_actionscript_init);
3183 init_styleset_case(GEANY_FILETYPES_HTML, styleset_html_init);
3184 init_styleset_case(GEANY_FILETYPES_JAVA, styleset_java_init);
3185 init_styleset_case(GEANY_FILETYPES_JS, styleset_js_init);
3186 init_styleset_case(GEANY_FILETYPES_LATEX, styleset_latex_init);
3187 init_styleset_case(GEANY_FILETYPES_LUA, styleset_lua_init);
3188 init_styleset_case(GEANY_FILETYPES_MAKE, styleset_makefile_init);
3189 init_styleset_case(GEANY_FILETYPES_MATLAB, styleset_matlab_init);
3190 init_styleset_case(GEANY_FILETYPES_MARKDOWN, styleset_markdown_init);
3191 init_styleset_case(GEANY_FILETYPES_NSIS, styleset_nsis_init);
3192 init_styleset_case(GEANY_FILETYPES_PASCAL, styleset_pascal_init);
3193 init_styleset_case(GEANY_FILETYPES_PERL, styleset_perl_init);
3194 init_styleset_case(GEANY_FILETYPES_PHP, styleset_php_init);
3195 init_styleset_case(GEANY_FILETYPES_PO, styleset_po_init);
3196 init_styleset_case(GEANY_FILETYPES_PYTHON, styleset_python_init);
3197 init_styleset_case(GEANY_FILETYPES_R, styleset_r_init);
3198 init_styleset_case(GEANY_FILETYPES_RUBY, styleset_ruby_init);
3199 init_styleset_case(GEANY_FILETYPES_SH, styleset_sh_init);
3200 init_styleset_case(GEANY_FILETYPES_SQL, styleset_sql_init);
3201 init_styleset_case(GEANY_FILETYPES_TCL, styleset_tcl_init);
3202 init_styleset_case(GEANY_FILETYPES_VHDL, styleset_vhdl_init);
3203 init_styleset_case(GEANY_FILETYPES_VERILOG, styleset_verilog_init);
3204 init_styleset_case(GEANY_FILETYPES_XML, styleset_markup_init);
3205 init_styleset_case(GEANY_FILETYPES_YAML, styleset_yaml_init);
3206 default:
3207 if (ft->lexer_filetype)
3208 geany_debug("Filetype %s has a recursive lexer_filetype %s set!",
3209 ft->name, ft->lexer_filetype->name);
3212 /* should be done in filetypes.c really: */
3213 get_keyfile_wordchars(config, configh, &style_sets[filetype_idx].wordchars);
3217 /* lang_name is the name used for the styleset_foo function, e.g. foo. */
3218 #define styleset_case(ft_id, styleset_func) \
3219 case (ft_id): \
3220 styleset_func(sci, ft->id); \
3221 break
3223 /** Sets up highlighting and other visual settings.
3224 * @param sci Scintilla widget.
3225 * @param ft Filetype settings to use. */
3226 void highlighting_set_styles(ScintillaObject *sci, GeanyFiletype *ft)
3228 gint lexer_id = get_lexer_filetype(ft);
3230 filetypes_load_config(ft->id, FALSE); /* load filetypes.ext */
3232 switch (lexer_id)
3234 styleset_case(GEANY_FILETYPES_ADA, styleset_ada);
3235 styleset_case(GEANY_FILETYPES_ASM, styleset_asm);
3236 styleset_case(GEANY_FILETYPES_BASIC, styleset_basic);
3237 styleset_case(GEANY_FILETYPES_C, styleset_c);
3238 styleset_case(GEANY_FILETYPES_CAML, styleset_caml);
3239 styleset_case(GEANY_FILETYPES_CMAKE, styleset_cmake);
3240 styleset_case(GEANY_FILETYPES_CONF, styleset_conf);
3241 styleset_case(GEANY_FILETYPES_CSS, styleset_css);
3242 styleset_case(GEANY_FILETYPES_D, styleset_d);
3243 styleset_case(GEANY_FILETYPES_DIFF, styleset_diff);
3244 styleset_case(GEANY_FILETYPES_DOCBOOK, styleset_docbook);
3245 styleset_case(GEANY_FILETYPES_FERITE, styleset_ferite);
3246 styleset_case(GEANY_FILETYPES_F77, styleset_f77);
3247 styleset_case(GEANY_FILETYPES_FORTRAN, styleset_fortran);
3248 styleset_case(GEANY_FILETYPES_HASKELL, styleset_haskell);
3249 styleset_case(GEANY_FILETYPES_HAXE, styleset_haxe);
3250 styleset_case(GEANY_FILETYPES_AS, styleset_actionscript);
3251 styleset_case(GEANY_FILETYPES_HTML, styleset_html);
3252 styleset_case(GEANY_FILETYPES_JAVA, styleset_java);
3253 styleset_case(GEANY_FILETYPES_JS, styleset_js);
3254 styleset_case(GEANY_FILETYPES_LATEX, styleset_latex);
3255 styleset_case(GEANY_FILETYPES_LUA, styleset_lua);
3256 styleset_case(GEANY_FILETYPES_MAKE, styleset_makefile);
3257 styleset_case(GEANY_FILETYPES_MARKDOWN, styleset_markdown);
3258 styleset_case(GEANY_FILETYPES_MATLAB, styleset_matlab);
3259 styleset_case(GEANY_FILETYPES_NSIS, styleset_nsis);
3260 styleset_case(GEANY_FILETYPES_PASCAL, styleset_pascal);
3261 styleset_case(GEANY_FILETYPES_PERL, styleset_perl);
3262 styleset_case(GEANY_FILETYPES_PHP, styleset_php);
3263 styleset_case(GEANY_FILETYPES_PO, styleset_po);
3264 styleset_case(GEANY_FILETYPES_PYTHON, styleset_python);
3265 styleset_case(GEANY_FILETYPES_R, styleset_r);
3266 styleset_case(GEANY_FILETYPES_RUBY, styleset_ruby);
3267 styleset_case(GEANY_FILETYPES_SH, styleset_sh);
3268 styleset_case(GEANY_FILETYPES_SQL, styleset_sql);
3269 styleset_case(GEANY_FILETYPES_TCL, styleset_tcl);
3270 styleset_case(GEANY_FILETYPES_VHDL, styleset_vhdl);
3271 styleset_case(GEANY_FILETYPES_VERILOG, styleset_verilog);
3272 styleset_case(GEANY_FILETYPES_XML, styleset_xml);
3273 styleset_case(GEANY_FILETYPES_YAML, styleset_yaml);
3274 case GEANY_FILETYPES_NONE:
3275 default:
3276 styleset_default(sci, ft->id);
3278 /* [lexer_properties] settings */
3279 if (style_sets[ft->id].property_keys)
3281 gchar **prop = style_sets[ft->id].property_keys;
3282 gchar **val = style_sets[ft->id].property_values;
3284 while (*prop)
3286 sci_set_property(sci, *prop, *val);
3287 prop++;
3288 val++;
3294 /** Retrieves a style @a style_id for the filetype @a ft_id.
3295 * If the style was not already initialised
3296 * (e.g. by by opening a file of this type), it will be initialised. The returned pointer is
3297 * owned by Geany and must not be freed.
3298 * @param ft_id Filetype ID, e.g. @c GEANY_FILETYPES_DIFF.
3299 * @param style_id A Scintilla lexer style, e.g. @c SCE_DIFF_ADDED. See scintilla/include/SciLexer.h.
3300 * @return A pointer to the style struct.
3301 * @see Scintilla messages @c SCI_STYLEGETFORE, etc, for use with scintilla_send_message(). */
3302 const GeanyLexerStyle *highlighting_get_style(gint ft_id, gint style_id)
3304 if (ft_id < 0 || ft_id >= (gint)filetypes_array->len)
3305 return NULL;
3307 /* ensure filetype loaded */
3308 filetypes_load_config(ft_id, FALSE);
3310 /* TODO: style_id might not be the real array index (Scintilla styles are not always synced
3311 * with array indices) */
3312 return get_style(ft_id, style_id);
3316 static void
3317 on_color_scheme_clicked(GtkMenuItem *menuitem, gpointer user_data)
3319 gchar *fname;
3320 gchar *path;
3322 /* check if default item */
3323 if (user_data)
3325 setptr(editor_prefs.color_scheme, NULL);
3326 filetypes_reload();
3327 return;
3329 fname = ui_menu_item_get_text(menuitem);
3330 setptr(fname, utils_get_locale_from_utf8(fname));
3332 /* fname is just the basename from the menu item, so prepend the custom files path */
3333 path = g_build_path(G_DIR_SEPARATOR_S, app->configdir, GEANY_COLORSCHEMES_SUBDIR, fname, NULL);
3334 if (!g_file_test(path, G_FILE_TEST_EXISTS))
3336 /* try the system path */
3337 g_free(path);
3338 path = g_build_path(G_DIR_SEPARATOR_S, app->datadir, GEANY_COLORSCHEMES_SUBDIR, fname, NULL);
3340 if (g_file_test(path, G_FILE_TEST_EXISTS))
3342 setptr(editor_prefs.color_scheme, fname);
3343 fname = NULL;
3344 filetypes_reload();
3346 else
3348 setptr(fname, utils_get_utf8_from_locale(fname));
3349 ui_set_statusbar(TRUE, _("Could not find file '%s'."), fname);
3351 g_free(path);
3352 g_free(fname);
3356 static void add_color_scheme_item(const gchar *fname, GtkWidget *menu)
3358 GtkWidget *tmp_button;
3359 gchar *label;
3361 g_return_if_fail(fname);
3362 g_return_if_fail(menu);
3364 label = utils_get_utf8_from_locale(fname);
3366 tmp_button = gtk_menu_item_new_with_label(label);
3367 gtk_widget_show(tmp_button);
3368 gtk_container_add(GTK_CONTAINER(menu), tmp_button);
3369 g_signal_connect(tmp_button, "activate", G_CALLBACK(on_color_scheme_clicked), NULL);
3371 g_free(label);
3375 static gboolean add_color_scheme_items(GtkWidget *menu)
3377 GSList *list = utils_get_config_files(GEANY_COLORSCHEMES_SUBDIR);
3378 GSList *node;
3380 foreach_slist(node, list)
3382 gchar *fname = node->data;
3384 if (g_str_has_suffix(fname, ".conf"))
3385 add_color_scheme_item(fname, menu);
3386 g_free(fname);
3388 g_slist_free(list);
3389 return list != NULL;
3393 static void create_color_scheme_menu(void)
3395 GtkWidget *item, *menu, *root;
3397 menu = ui_lookup_widget(main_widgets.window, "menu_view_editor1_menu");
3398 item = ui_image_menu_item_new(GTK_STOCK_SELECT_COLOR, _("_Color Schemes"));
3399 gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), item);
3400 root = item;
3402 menu = gtk_menu_new();
3403 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), menu);
3405 item = gtk_menu_item_new_with_mnemonic(_("_Default"));
3406 gtk_container_add(GTK_CONTAINER(menu), item);
3407 g_signal_connect(item, "activate", G_CALLBACK(on_color_scheme_clicked), GINT_TO_POINTER(TRUE));
3409 /* for now we don't show the color scheme menu unless there are files */
3410 if (add_color_scheme_items(menu))
3411 gtk_widget_show_all(root);
3415 void highlighting_init(void)
3417 create_color_scheme_menu();