geany  1.38
About: Geany is a text editor (using GTK2) with basic features of an integrated development environment (syntax highlighting, code folding, symbol name auto-completion, ...). F: office T: editor programming GTK+ IDE
  Fossies Dox: geany-1.38.tar.bz2  ("unofficial" and yet experimental doxygen-generated source code documentation)  

highlighting.c
Go to the documentation of this file.
1/*
2 * highlighting.c - this file is part of Geany, a fast and lightweight IDE
3 *
4 * Copyright 2005 The Geany contributors
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 */
20
21/**
22 * @file highlighting.h
23 * Syntax highlighting for the different filetypes, using the Scintilla lexers.
24 */
25
26#ifdef HAVE_CONFIG_H
27# include "config.h"
28#endif
29
30#include "highlighting.h"
32
33#include "app.h"
34#include "dialogs.h"
35#include "document.h"
36#include "editor.h"
37#include "filetypesprivate.h"
38#include "sciwrappers.h"
39#include "support.h"
40#include "symbols.h"
41#include "ui_utils.h"
42#include "utils.h"
43
44#include "SciLexer.h"
45
46#include <stdlib.h>
47#include <ctype.h>
48#include <string.h>
49#include <glib.h>
50#include <glib/gprintf.h>
51
52
53#define GEANY_COLORSCHEMES_SUBDIR "colorschemes"
54
55/* Whitespace has to be set after setting wordchars. */
56#define GEANY_WHITESPACE_CHARS " \t" "!\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~"
57
58
59static gchar *whitespace_chars = NULL;
60
61
62typedef struct
63{
64 gsize count; /* number of styles */
65 GeanyLexerStyle *styling; /* array of styles, NULL if not used or uninitialised */
66 gchar **keywords;
67 gchar *wordchars; /* NULL used for style sets with no styles */
70} StyleSet;
71
72/* each filetype has a styleset but GEANY_FILETYPES_NONE uses common_style_set for styling */
74
75
76enum /* Geany common styling */
77{
101
102static struct
103{
105
106 /* icon style, 1-4 */
108 /* vertical line style, 0-2 */
110 /* horizontal line when folded, 0-2 */
112
113 gchar *wordchars;
114} common_style_set = { { { 0 } }, 0, 0, 0, NULL };
115
116
117/* For filetypes.common [named_styles] section.
118 * 0xBBGGRR format.
119 * e.g. "comment" => &GeanyLexerStyle{0x0000d0, 0xffffff, FALSE, FALSE} */
120static GHashTable *named_style_hash = NULL;
121
122/* 0xBBGGRR format, set by "default" named style. */
123static GeanyLexerStyle gsd_default = {0x000000, 0xffffff, FALSE, FALSE};
124
125
126/* filetypes should use the filetypes.foo [lexer_properties] group instead of hardcoding */
127static void sci_set_property(ScintillaObject *sci, const gchar *name, const gchar *value)
128{
129 SSM(sci, SCI_SETPROPERTY, (uptr_t) name, (sptr_t) value);
130}
131
132
133static void new_styleset(guint file_type_id, gsize styling_count)
134{
135 StyleSet *set = &style_sets[file_type_id];
136
137 set->count = styling_count;
138 set->styling = g_new0(GeanyLexerStyle, styling_count);
139}
140
141
142static void free_styleset(guint file_type_id)
143{
144 StyleSet *style_ptr;
145 style_ptr = &style_sets[file_type_id];
146
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;
158}
159
160
161static void get_keyfile_keywords(GKeyFile *config, GKeyFile *configh,
162 const gchar *key, guint ft_id, guint pos)
163{
164 style_sets[ft_id].keywords[pos] =
165 utils_get_setting(string, configh, config, "keywords", key, "");
166}
167
168
169static void get_keyfile_wordchars(GKeyFile *config, GKeyFile *configh, gchar **wordchars,
170 const gchar *default_wordchars)
171{
172 *wordchars = utils_get_setting(string, configh, config,
173 "settings", "wordchars", default_wordchars);
174}
175
176
177static gboolean read_named_style(const gchar *named_style, GeanyLexerStyle *style)
178{
179 GeanyLexerStyle *cs;
180 gchar *comma, *name = NULL;
181 const gchar *bold = NULL;
182 const gchar *italic = NULL;
183
184 g_return_val_if_fail(named_style, FALSE);
185 name = utils_strdupa(named_style); /* named_style must not be written to, may be a static string */
186
187 comma = strstr(name, ",");
188 if (comma)
189 {
190 bold = strstr(comma, ",bold");
191 italic = strstr(comma, ",italic");
192 *comma = '\0'; /* terminate name to make lookup work */
193 }
194 cs = g_hash_table_lookup(named_style_hash, name);
195
196 if (cs)
197 {
198 *style = *cs;
199 if (bold)
200 style->bold = !style->bold;
201 if (italic)
202 style->italic = !style->italic;
203 }
204 else
205 {
206 *style = gsd_default;
207 }
208 return (cs != NULL);
209}
210
211
212/* Parses a color in `str` which can be an HTML color (ex. #0099cc),
213 * an abbreviated HTML color (ex. #09c) or a hex string color
214 * (ex. 0x0099cc). The result of the conversion is stored into the
215 * location pointed to by `clr`. */
216static void parse_color(GKeyFile *kf, const gchar *str, gint *clr)
217{
218 gint c;
219 gchar *named_color = NULL;
220
221 g_return_if_fail(clr != NULL);
222
223 if (G_UNLIKELY(EMPTY(str)))
224 return;
225
226 named_color = g_key_file_get_string(kf, "named_colors", str, NULL);
227 if (named_color)
228 str = named_color;
229
231 if (c == -1)
232 geany_debug("Bad color '%s'", str);
233 else
234 *clr = c;
235
236 g_free(named_color);
237}
238
239
240static void parse_keyfile_style(GKeyFile *kf, gchar **list,
241 const GeanyLexerStyle *default_style, GeanyLexerStyle *style)
242{
243 gsize len;
244
245 g_return_if_fail(default_style);
246 g_return_if_fail(style);
247
248 *style = *default_style;
249
250 if (!list)
251 return;
252
253 len = g_strv_length(list);
254 if (len == 0)
255 return;
256 else if (len == 1)
257 {
258 gchar **items = g_strsplit(list[0], ",", 0);
259 if (items != NULL)
260 {
261 if (g_strv_length(items) > 0)
262 {
263 if (g_hash_table_lookup(named_style_hash, items[0]) != NULL)
264 {
265 if (!read_named_style(list[0], style))
266 geany_debug("Unable to read named style '%s'", items[0]);
267 g_strfreev(items);
268 return;
269 }
270 else if (strchr(list[0], ',') != NULL)
271 {
272 geany_debug("Unknown named style '%s'", items[0]);
273 g_strfreev(items);
274 return;
275 }
276 }
277 g_strfreev(items);
278 }
279 }
280
281 switch (len)
282 {
283 case 4:
284 style->italic = utils_atob(list[3]);
285 /* fall through */
286 case 3:
287 style->bold = utils_atob(list[2]);
288 /* fall through */
289 case 2:
290 parse_color(kf, list[1], &style->background);
291 /* fall through */
292 case 1:
293 parse_color(kf, list[0], &style->foreground);
294 }
295}
296
297
298static void get_keyfile_style(GKeyFile *config, GKeyFile *configh,
299 const gchar *key_name, GeanyLexerStyle *style)
300{
301 gchar **list;
302 gsize len;
303
304 g_return_if_fail(config);
305 g_return_if_fail(configh);
306 g_return_if_fail(key_name);
307 g_return_if_fail(style);
308
309 list = g_key_file_get_string_list(configh, "styling", key_name, &len, NULL);
310 if (list == NULL)
311 {
312 list = g_key_file_get_string_list(config, "styling", key_name, &len, NULL);
313 parse_keyfile_style(config, list, &gsd_default, style);
314 }
315 else
316 parse_keyfile_style(configh, list, &gsd_default, style);
317
318 g_strfreev(list);
319}
320
321
322static void convert_int(const gchar *int_str, gint *val)
323{
324 gchar *end;
325 gint v = strtol(int_str, &end, 10);
326
327 if (int_str != end)
328 *val = v;
329}
330
331
332/* Get first and second integer numbers, store in foreground and background fields of @a style. */
333static void get_keyfile_int(GKeyFile *config, GKeyFile *configh, const gchar *section,
334 const gchar *key, gint fdefault_val, gint sdefault_val,
335 GeanyLexerStyle *style)
336{
337 gchar **list;
338 gsize len;
339 GeanyLexerStyle def = {fdefault_val, sdefault_val, FALSE, FALSE};
340
341 g_return_if_fail(config);
342 g_return_if_fail(configh);
343 g_return_if_fail(section);
344 g_return_if_fail(key);
345
346 list = g_key_file_get_string_list(configh, section, key, &len, NULL);
347 if (list == NULL)
348 list = g_key_file_get_string_list(config, section, key, &len, NULL);
349
350 *style = def;
351 if (!list)
352 return;
353
354 if (list[0])
355 {
356 convert_int(list[0], &style->foreground);
357 if (list[1])
358 {
359 convert_int(list[1], &style->background);
360 }
361 }
362 g_strfreev(list);
363}
364
365
366/* first or second can be NULL. */
367static void get_keyfile_ints(GKeyFile *config, GKeyFile *configh, const gchar *section,
368 const gchar *key,
369 gint fdefault_val, gint sdefault_val,
370 gint *first, gint *second)
371{
372 GeanyLexerStyle tmp_style;
373
374 get_keyfile_int(config, configh, section, key, fdefault_val, sdefault_val, &tmp_style);
375 if (first)
376 *first = tmp_style.foreground;
377 if (second)
378 *second = tmp_style.background;
379}
380
381
382static guint invert(guint icolour)
383{
385 return 0xffffff - icolour;
386
387 return icolour;
388}
389
390
391static GeanyLexerStyle *get_style(guint ft_id, guint styling_index)
392{
393 g_assert(ft_id < filetypes_array->len);
394
395 if (G_UNLIKELY(ft_id == GEANY_FILETYPES_NONE))
396 {
397 g_assert(styling_index < GCS_MAX);
398 return &common_style_set.styling[styling_index];
399 }
400 else
401 {
402 StyleSet *set = &style_sets[ft_id];
403
404 g_assert(styling_index < set->count);
405 return &set->styling[styling_index];
406 }
407}
408
409
410static void set_sci_style(ScintillaObject *sci, guint style, guint ft_id, guint styling_index)
411{
412 GeanyLexerStyle *style_ptr = get_style(ft_id, styling_index);
413
414 SSM(sci, SCI_STYLESETFORE, style, invert(style_ptr->foreground));
415 SSM(sci, SCI_STYLESETBACK, style, invert(style_ptr->background));
416 SSM(sci, SCI_STYLESETBOLD, style, style_ptr->bold);
417 SSM(sci, SCI_STYLESETITALIC, style, style_ptr->italic);
418}
419
420
422{
423 guint i;
424
425 for (i = 0; i < filetypes_array->len; i++)
426 free_styleset(i);
427
429 g_hash_table_destroy(named_style_hash);
430
431 g_free(style_sets);
432}
433
434
435static gchar*
436get_keyfile_whitespace_chars(GKeyFile *config, GKeyFile *configh)
437{
438 return utils_get_setting(string, configh, config,
439 "settings", "whitespace_chars", GEANY_WHITESPACE_CHARS);
440}
441
442
443static void add_named_style(GKeyFile *config, const gchar *key)
444{
445 const gchar group[] = "named_styles";
446 gchar **list;
447 gsize len;
448
449 list = g_key_file_get_string_list(config, group, key, &len, NULL);
450 /* we allow a named style to reference another style above it */
451 if (list && len >= 1)
452 {
453 GeanyLexerStyle *style = g_new0(GeanyLexerStyle, 1);
454
455 parse_keyfile_style(config, list, &gsd_default, style);
456 g_hash_table_insert(named_style_hash, g_strdup(key), style);
457 }
458 g_strfreev(list);
459}
460
461
462static void get_named_styles(GKeyFile *config)
463{
464 const gchar group[] = "named_styles";
465 gchar **keys = g_key_file_get_keys(config, group, NULL, NULL);
466 gchar **ptr = keys;
467
468 if (!ptr)
469 return;
470
471 while (1)
472 {
473 const gchar *key = *ptr;
474
475 if (!key)
476 break;
477
478 /* don't replace already read default style with system one */
479 if (!g_str_equal(key, "default"))
480 add_named_style(config, key);
481
482 ptr++;
483 }
484 g_strfreev(keys);
485}
486
487
488static GKeyFile *utils_key_file_new(const gchar *filename)
489{
490 GKeyFile *config = g_key_file_new();
491
492 g_key_file_load_from_file(config, filename, G_KEY_FILE_KEEP_COMMENTS, NULL);
493 return config;
494}
495
496
497static void load_named_styles(GKeyFile *config, GKeyFile *config_home)
498{
499 const gchar *scheme = editor_prefs.color_scheme;
500 gboolean free_kf = FALSE;
501
503 g_hash_table_destroy(named_style_hash); /* reloading */
504
505 named_style_hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
506
507 if (!EMPTY(scheme))
508 {
509 gchar *path, *path_home;
510
511 path = g_build_path(G_DIR_SEPARATOR_S, app->datadir, GEANY_COLORSCHEMES_SUBDIR, scheme, NULL);
512 path_home = g_build_path(G_DIR_SEPARATOR_S, app->configdir, GEANY_COLORSCHEMES_SUBDIR, scheme, NULL);
513
514 if (g_file_test(path, G_FILE_TEST_EXISTS) || g_file_test(path_home, G_FILE_TEST_EXISTS))
515 {
516 config = utils_key_file_new(path);
517 config_home = utils_key_file_new(path_home);
518 free_kf = TRUE;
519 }
520 /* if color scheme is missing, use default */
521 g_free(path);
522 g_free(path_home);
523 }
524 /* first set default to the "default" named style */
525 add_named_style(config, "default");
526 read_named_style("default", &gsd_default); /* in case user overrides but not with both colors */
527 add_named_style(config_home, "default");
528 read_named_style("default", &gsd_default);
529
530 get_named_styles(config);
531 /* home overrides any system named style */
532 get_named_styles(config_home);
533
534 if (free_kf)
535 {
536 g_key_file_free(config);
537 g_key_file_free(config_home);
538 }
539}
540
541
542static void styleset_common_init(GKeyFile *config, GKeyFile *config_home)
543{
544 load_named_styles(config, config_home);
545
546 get_keyfile_style(config, config_home, "default", &common_style_set.styling[GCS_DEFAULT]);
547 get_keyfile_style(config, config_home, "selection", &common_style_set.styling[GCS_SELECTION]);
548 get_keyfile_style(config, config_home, "brace_good", &common_style_set.styling[GCS_BRACE_GOOD]);
549 get_keyfile_style(config, config_home, "brace_bad", &common_style_set.styling[GCS_BRACE_BAD]);
550 get_keyfile_style(config, config_home, "margin_linenumber", &common_style_set.styling[GCS_MARGIN_LINENUMBER]);
551 get_keyfile_style(config, config_home, "margin_folding", &common_style_set.styling[GCS_MARGIN_FOLDING]);
552 get_keyfile_style(config, config_home, "fold_symbol_highlight", &common_style_set.styling[GCS_FOLD_SYMBOL_HIGHLIGHT]);
553 get_keyfile_style(config, config_home, "current_line", &common_style_set.styling[GCS_CURRENT_LINE]);
554 get_keyfile_style(config, config_home, "caret", &common_style_set.styling[GCS_CARET]);
555 get_keyfile_style(config, config_home, "indent_guide", &common_style_set.styling[GCS_INDENT_GUIDE]);
556 get_keyfile_style(config, config_home, "white_space", &common_style_set.styling[GCS_WHITE_SPACE]);
557 get_keyfile_style(config, config_home, "marker_line", &common_style_set.styling[GCS_MARKER_LINE]);
558 get_keyfile_style(config, config_home, "marker_search", &common_style_set.styling[GCS_MARKER_SEARCH]);
559 get_keyfile_style(config, config_home, "marker_mark", &common_style_set.styling[GCS_MARKER_MARK]);
560 get_keyfile_style(config, config_home, "calltips", &common_style_set.styling[GCS_CALLTIPS]);
561 get_keyfile_style(config, config_home, "indicator_error", &common_style_set.styling[GCS_INDICATOR_ERROR]);
562
563 get_keyfile_ints(config, config_home, "styling", "folding_style",
564 1, 1, &common_style_set.fold_marker, &common_style_set.fold_lines);
565 get_keyfile_ints(config, config_home, "styling", "folding_horiz_line",
566 2, 0, &common_style_set.fold_draw_line, NULL);
567 get_keyfile_ints(config, config_home, "styling", "caret_width",
568 1, 0, &common_style_set.styling[GCS_CARET].background, NULL); /* caret.foreground used earlier */
569 get_keyfile_int(config, config_home, "styling", "line_wrap_visuals",
571 get_keyfile_int(config, config_home, "styling", "line_wrap_indent",
572 0, 0, &common_style_set.styling[GCS_LINE_WRAP_INDENT]);
573 get_keyfile_int(config, config_home, "styling", "translucency",
574 256, 256, &common_style_set.styling[GCS_TRANSLUCENCY]);
575 get_keyfile_int(config, config_home, "styling", "marker_translucency",
576 256, 256, &common_style_set.styling[GCS_MARKER_TRANSLUCENCY]);
577 get_keyfile_int(config, config_home, "styling", "line_height",
578 0, 0, &common_style_set.styling[GCS_LINE_HEIGHT]);
579
580 g_free(common_style_set.wordchars);
581 get_keyfile_wordchars(config, config_home, &common_style_set.wordchars, GEANY_WORDCHARS);
582 g_free(whitespace_chars);
583 whitespace_chars = get_keyfile_whitespace_chars(config, config_home);
584}
585
586
587static void set_character_classes(ScintillaObject *sci, guint ft_id)
588{
589 const gchar *word = (ft_id == GEANY_FILETYPES_NONE ?
590 common_style_set.wordchars : style_sets[ft_id].wordchars);
591 gchar *whitespace;
592 guint i, j;
593
594 SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) word);
595
596 /* setting wordchars resets character classes, so we have to set whitespaces after
597 * wordchars, but we want wordchars to have precenence over whitepace chars */
598 whitespace = g_malloc0(strlen(whitespace_chars) + 1);
599 for (i = 0, j = 0; whitespace_chars[i] != 0; i++)
600 {
601 if (! strchr(word, whitespace_chars[i]))
602 whitespace[j++] = whitespace_chars[i];
603 }
604 whitespace[j] = 0;
605
606 SSM(sci, SCI_SETWHITESPACECHARS, 0, (sptr_t) whitespace);
607
608 g_free(whitespace);
609}
610
611
612static void styleset_common(ScintillaObject *sci, guint ft_id)
613{
614 GeanyLexerStyle *style;
615
616 SSM(sci, SCI_STYLECLEARALL, 0, 0);
617
619
620 /* caret colour, style and width */
621 SSM(sci, SCI_SETCARETFORE, invert(common_style_set.styling[GCS_CARET].foreground), 0);
622 SSM(sci, SCI_SETCARETWIDTH, common_style_set.styling[GCS_CARET].background, 0);
623 if (common_style_set.styling[GCS_CARET].bold)
625 else
627
628 /* line height */
629 SSM(sci, SCI_SETEXTRAASCENT, common_style_set.styling[GCS_LINE_HEIGHT].foreground, 0);
630 SSM(sci, SCI_SETEXTRADESCENT, common_style_set.styling[GCS_LINE_HEIGHT].background, 0);
631
632 /* colourise the current line */
633 SSM(sci, SCI_SETCARETLINEBACK, invert(common_style_set.styling[GCS_CURRENT_LINE].background), 0);
634 /* bold=enable current line */
636
637 /* Translucency for current line and selection */
639 SSM(sci, SCI_SETSELALPHA, common_style_set.styling[GCS_TRANSLUCENCY].background, 0);
640
641 /* line wrapping visuals */
643 common_style_set.styling[GCS_LINE_WRAP_VISUALS].foreground, 0);
645 common_style_set.styling[GCS_LINE_WRAP_VISUALS].background, 0);
648
649 /* Error indicator */
652 invert(common_style_set.styling[GCS_INDICATOR_ERROR].foreground));
653
654 /* Search indicator, used for 'Mark' matches */
657 invert(common_style_set.styling[GCS_MARKER_SEARCH].background));
659
660 /* Snippet cursor indicator, when inserting snippets with multiple
661 * cursor positions. */
664
665 /* define marker symbols
666 * 0 -> line marker */
668 SSM(sci, SCI_MARKERSETFORE, 0, invert(common_style_set.styling[GCS_MARKER_LINE].foreground));
669 SSM(sci, SCI_MARKERSETBACK, 0, invert(common_style_set.styling[GCS_MARKER_LINE].background));
671
672 /* 1 -> user marker */
674 SSM(sci, SCI_MARKERSETFORE, 1, invert(common_style_set.styling[GCS_MARKER_MARK].foreground));
675 SSM(sci, SCI_MARKERSETBACK, 1, invert(common_style_set.styling[GCS_MARKER_MARK].background));
677
678 /* 2 -> folding marker, other folding settings */
681
682 /* drawing a horizontal line when text if folded */
683 switch (common_style_set.fold_draw_line)
684 {
685 case 1:
686 {
687 SSM(sci, SCI_SETFOLDFLAGS, 4, 0);
688 break;
689 }
690 case 2:
691 {
692 SSM(sci, SCI_SETFOLDFLAGS, 16, 0);
693 break;
694 }
695 default:
696 {
697 SSM(sci, SCI_SETFOLDFLAGS, 0, 0);
698 break;
699 }
700 }
701
702 /* choose the folding style - boxes or circles, I prefer boxes, so it is default ;-) */
705 switch (common_style_set.fold_marker)
706 {
707 case 2:
712 break;
713 default:
718 break;
719 case 3:
722 break;
723 case 4:
726 break;
727 }
728
729 /* choose the folding style - straight or curved, I prefer straight, so it is default ;-) */
730 switch (common_style_set.fold_lines)
731 {
732 case 2:
736 break;
737 default:
741 break;
742 case 0:
746 break;
747 }
748 {
749 gint markers[] = {
757 };
758 guint i;
759
760 foreach_range(i, G_N_ELEMENTS(markers))
761 {
762 SSM(sci, SCI_MARKERSETFORE, markers[i],
764 SSM(sci, SCI_MARKERSETBACK, markers[i],
765 invert(common_style_set.styling[GCS_MARGIN_FOLDING].foreground));
766 }
767 }
768
769 /* set some common defaults */
770 sci_set_property(sci, "fold", "1");
771 sci_set_property(sci, "fold.compact", "0");
772 sci_set_property(sci, "fold.comment", "1");
773 sci_set_property(sci, "fold.preprocessor", "1");
774 sci_set_property(sci, "fold.at.else", "1");
775
776 style = &common_style_set.styling[GCS_SELECTION];
777 if (!style->bold && !style->italic)
778 {
779 geany_debug("selection style is set to invisible - ignoring!");
780 style->italic = TRUE;
781 style->background = 0xc0c0c0;
782 }
783 /* bold (3rd argument) is whether to override default foreground selection */
784 SSM(sci, SCI_SETSELFORE, style->bold, invert(style->foreground));
785 /* italic (4th argument) is whether to override default background selection */
786 SSM(sci, SCI_SETSELBACK, style->italic, invert(style->background));
787
794
795 /* bold = common whitespace settings enabled */
797 invert(common_style_set.styling[GCS_WHITE_SPACE].foreground));
799 invert(common_style_set.styling[GCS_WHITE_SPACE].background));
800
801 if (common_style_set.styling[GCS_CALLTIPS].bold)
802 SSM(sci, SCI_CALLTIPSETFORE, invert(common_style_set.styling[GCS_CALLTIPS].foreground), 1);
803 if (common_style_set.styling[GCS_CALLTIPS].italic)
804 SSM(sci, SCI_CALLTIPSETBACK, invert(common_style_set.styling[GCS_CALLTIPS].background), 1);
805}
806
807
808/* Merge & assign global typedefs and user secondary keywords.
809 * keyword_idx is used for both style_sets[].keywords and scintilla keyword style number */
810static void merge_type_keywords(ScintillaObject *sci, guint ft_id, guint keyword_idx)
811{
812 const gchar *user_words = style_sets[ft_id].keywords[keyword_idx];
813 GString *s;
814
815 s = symbols_find_typenames_as_string(filetypes[ft_id]->lang, TRUE);
816 if (G_UNLIKELY(s == NULL))
817 s = g_string_sized_new(200);
818 else
819 g_string_append_c(s, ' '); /* append a space as delimiter to the existing list of words */
820
821 g_string_append(s, user_words);
822
823 sci_set_keywords(sci, keyword_idx, s->str);
824 g_string_free(s, TRUE);
825}
826
827
828static void styleset_init_from_mapping(guint ft_id, GKeyFile *config, GKeyFile *config_home,
829 const HLStyle *styles, gsize n_styles,
830 const HLKeyword *keywords, gsize n_keywords)
831{
832 gsize i;
833
834 /* styles */
835 new_styleset(ft_id, n_styles);
836 foreach_range(i, n_styles)
837 {
838 GeanyLexerStyle *style = &style_sets[ft_id].styling[i];
839
840 get_keyfile_style(config, config_home, styles[i].name, style);
841 }
842
843 /* keywords */
844 if (n_keywords < 1)
845 style_sets[ft_id].keywords = NULL;
846 else
847 {
848 style_sets[ft_id].keywords = g_new(gchar*, n_keywords + 1);
849 foreach_range(i, n_keywords)
850 get_keyfile_keywords(config, config_home, keywords[i].key, ft_id, i);
851 style_sets[ft_id].keywords[i] = NULL;
852 }
853}
854
855
856/* STYLE_DEFAULT will be set to match the first style. */
857static void styleset_from_mapping(ScintillaObject *sci, guint ft_id, guint lexer,
858 const HLStyle *styles, gsize n_styles,
859 const HLKeyword *keywords, gsize n_keywords,
860 const HLProperty *properties, gsize n_properties)
861{
862 gsize i;
863
864 g_assert(ft_id != GEANY_FILETYPES_NONE);
865
866 /* lexer */
867 sci_set_lexer(sci, lexer);
868
869 /* styles */
870 styleset_common(sci, ft_id);
871 if (n_styles > 0)
872 {
873 /* first style is also default one */
874 set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
875 foreach_range(i, n_styles)
876 {
877 if (styles[i].fill_eol)
878 SSM(sci, SCI_STYLESETEOLFILLED, styles[i].style, TRUE);
879 set_sci_style(sci, styles[i].style, ft_id, i);
880 }
881 }
882
883 /* keywords */
884 foreach_range(i, n_keywords)
885 {
886 if (keywords[i].merge)
887 merge_type_keywords(sci, ft_id, i);
888 else
889 sci_set_keywords(sci, keywords[i].id, style_sets[ft_id].keywords[i]);
890 }
891
892 /* properties */
893 foreach_range(i, n_properties)
894 sci_set_property(sci, properties[i].property, properties[i].value);
895}
896
897
898
899static void styleset_default(ScintillaObject *sci, guint ft_id)
900{
902
903 /* we need to set STYLE_DEFAULT before we call SCI_STYLECLEARALL in styleset_common() */
905
906 styleset_common(sci, ft_id);
907}
908
909
910static void get_key_values(GKeyFile *config, const gchar *group, gchar **keys, gchar **values)
911{
912 while (*keys)
913 {
914 gchar *str = g_key_file_get_string(config, group, *keys, NULL);
915
916 if (str)
917 SETPTR(*values, str);
918
919 keys++;
920 values++;
921 }
922}
923
924
925static void read_properties(GeanyFiletype *ft, GKeyFile *config, GKeyFile *configh)
926{
927 gchar group[] = "lexer_properties";
928 gchar **keys;
929 gchar **keysh = g_key_file_get_keys(configh, group, NULL, NULL);
930 gchar **ptr;
931
932 /* remove overridden keys from system keyfile */
933 foreach_strv(ptr, keysh)
934 g_key_file_remove_key(config, group, *ptr, NULL);
935
936 /* merge sys and user keys */
937 keys = g_key_file_get_keys(config, group, NULL, NULL);
938 keys = utils_strv_join(keys, keysh);
939
940 if (keys)
941 {
942 gchar **values = g_new0(gchar*, g_strv_length(keys) + 1);
943
944 style_sets[ft->id].property_keys = keys;
945 style_sets[ft->id].property_values = values;
946
947 get_key_values(config, group, keys, values);
948 get_key_values(configh, group, keys, values);
949 }
950}
951
952
954{
955 ft = FALLBACK(ft->lexer_filetype, ft);
956 return ft->id;
957}
958
959
960#define init_styleset_case(LANG_NAME) \
961 case (GEANY_FILETYPES_##LANG_NAME): \
962 styleset_init_from_mapping(filetype_idx, config, configh, \
963 highlighting_styles_##LANG_NAME, \
964 HL_N_ENTRIES(highlighting_styles_##LANG_NAME), \
965 highlighting_keywords_##LANG_NAME, \
966 HL_N_ENTRIES(highlighting_keywords_##LANG_NAME)); \
967 break
968
969/* Called by filetypes_load_config(). */
970void highlighting_init_styles(guint filetype_idx, GKeyFile *config, GKeyFile *configh)
971{
972 GeanyFiletype *ft = filetypes[filetype_idx];
973 guint lexer_id = get_lexer_filetype(ft);
974 gchar *default_str;
975
976 if (!style_sets)
977 style_sets = g_new0(StyleSet, filetypes_array->len);
978
979 /* Clear old information if necessary - e.g. when reloading config */
980 free_styleset(filetype_idx);
981
982 read_properties(ft, config, configh);
983 /* If a default style exists, check it uses a named style
984 * Note: almost all filetypes have a "default" style, except HTML ones */
985 default_str = utils_get_setting(string, configh, config,
986 "styling", "default", "default");
987 ft->priv->warn_color_scheme = !g_ascii_isalpha(*default_str);
988 g_free(default_str);
989
990 /* None filetype handled specially */
991 if (filetype_idx == GEANY_FILETYPES_NONE)
992 {
993 styleset_common_init(config, configh);
994 return;
995 }
996 /* All stylesets depend on filetypes.common */
998
999 switch (lexer_id)
1000 {
1001 init_styleset_case(ABAQUS);
1002 init_styleset_case(ADA);
1003 init_styleset_case(ASM);
1004 init_styleset_case(BASIC);
1005 init_styleset_case(BATCH);
1007 init_styleset_case(CAML);
1008 init_styleset_case(CMAKE);
1009 init_styleset_case(COBOL);
1010 init_styleset_case(COFFEESCRIPT);
1011 init_styleset_case(CONF);
1012 init_styleset_case(CSS);
1014 init_styleset_case(DIFF);
1015 init_styleset_case(LISP);
1016 init_styleset_case(ERLANG);
1017 init_styleset_case(DOCBOOK);
1018 init_styleset_case(FERITE);
1019 init_styleset_case(F77);
1020 init_styleset_case(FORTH);
1021 init_styleset_case(FORTRAN);
1023 init_styleset_case(HASKELL);
1024 init_styleset_case(HAXE);
1026 init_styleset_case(HTML);
1027 init_styleset_case(JAVA);
1029 init_styleset_case(JULIA);
1030 init_styleset_case(LATEX);
1031 init_styleset_case(LUA);
1032 init_styleset_case(MAKE);
1033 init_styleset_case(MATLAB);
1034 init_styleset_case(MARKDOWN);
1035 init_styleset_case(NSIS);
1036 init_styleset_case(OBJECTIVEC);
1037 init_styleset_case(PASCAL);
1038 init_styleset_case(PERL);
1039 init_styleset_case(PHP);
1041 init_styleset_case(POWERSHELL);
1042 init_styleset_case(PYTHON);
1044 init_styleset_case(RUBY);
1045 init_styleset_case(RUST);
1047 init_styleset_case(SMALLTALK);
1048 init_styleset_case(SQL);
1049 init_styleset_case(TCL);
1050 init_styleset_case(TXT2TAGS);
1051 init_styleset_case(VHDL);
1052 init_styleset_case(VERILOG);
1053 init_styleset_case(XML);
1054 init_styleset_case(YAML);
1055 init_styleset_case(ZEPHIR);
1056 default:
1057 if (ft->lexer_filetype)
1058 geany_debug("Filetype %s has a recursive lexer_filetype %s set!",
1059 ft->name, ft->lexer_filetype->name);
1060 }
1061
1062 /* should be done in filetypes.c really: */
1063 get_keyfile_wordchars(config, configh, &style_sets[filetype_idx].wordchars,
1064 common_style_set.wordchars);
1065}
1066
1067
1068#define styleset_case(LANG_NAME) \
1069 case (GEANY_FILETYPES_##LANG_NAME): \
1070 styleset_from_mapping(sci, ft->id, highlighting_lexer_##LANG_NAME, \
1071 highlighting_styles_##LANG_NAME, \
1072 HL_N_ENTRIES(highlighting_styles_##LANG_NAME), \
1073 highlighting_keywords_##LANG_NAME, \
1074 HL_N_ENTRIES(highlighting_keywords_##LANG_NAME), \
1075 highlighting_properties_##LANG_NAME, \
1076 HL_N_ENTRIES(highlighting_properties_##LANG_NAME)); \
1077 break
1078
1079/** Sets up highlighting and other visual settings.
1080 * @param sci Scintilla widget.
1081 * @param ft Filetype settings to use. */
1082GEANY_API_SYMBOL
1083void highlighting_set_styles(ScintillaObject *sci, GeanyFiletype *ft)
1084{
1085 guint lexer_id = get_lexer_filetype(ft);
1086
1087 filetypes_load_config(ft->id, FALSE); /* load filetypes.ext */
1088
1089 switch (lexer_id)
1090 {
1091 styleset_case(ABAQUS);
1092 styleset_case(ADA);
1093 styleset_case(ASM);
1094 styleset_case(BASIC);
1095 styleset_case(BATCH);
1096 styleset_case(C);
1097 styleset_case(CAML);
1098 styleset_case(CMAKE);
1099 styleset_case(COBOL);
1100 styleset_case(COFFEESCRIPT);
1101 styleset_case(CONF);
1102 styleset_case(CSS);
1103 styleset_case(D);
1104 styleset_case(DIFF);
1105 styleset_case(LISP);
1106 styleset_case(ERLANG);
1107 styleset_case(DOCBOOK);
1108 styleset_case(FERITE);
1109 styleset_case(F77);
1110 styleset_case(FORTH);
1111 styleset_case(FORTRAN);
1112 styleset_case(GO);
1113 styleset_case(HASKELL);
1114 styleset_case(HAXE);
1115 styleset_case(AS);
1116 styleset_case(HTML);
1117 styleset_case(JAVA);
1118 styleset_case(JS);
1119 styleset_case(JULIA);
1120 styleset_case(LATEX);
1121 styleset_case(LUA);
1122 styleset_case(MAKE);
1123 styleset_case(MARKDOWN);
1124 styleset_case(MATLAB);
1125 styleset_case(NSIS);
1126 styleset_case(OBJECTIVEC);
1127 styleset_case(PASCAL);
1128 styleset_case(PERL);
1129 styleset_case(PHP);
1130 styleset_case(PO);
1131 styleset_case(POWERSHELL);
1132 styleset_case(PYTHON);
1133 styleset_case(R);
1134 styleset_case(RUBY);
1135 styleset_case(RUST);
1136 styleset_case(SH);
1137 styleset_case(SMALLTALK);
1138 styleset_case(SQL);
1139 styleset_case(TCL);
1140 styleset_case(TXT2TAGS);
1141 styleset_case(VHDL);
1142 styleset_case(VERILOG);
1143 styleset_case(XML);
1144 styleset_case(YAML);
1145 styleset_case(ZEPHIR);
1147 default:
1148 styleset_default(sci, ft->id);
1149 }
1150 /* [lexer_properties] settings */
1151 if (style_sets[ft->id].property_keys)
1152 {
1153 gchar **prop = style_sets[ft->id].property_keys;
1154 gchar **val = style_sets[ft->id].property_values;
1155
1156 while (*prop)
1157 {
1158 sci_set_property(sci, *prop, *val);
1159 prop++;
1160 val++;
1161 }
1162 }
1163}
1164
1165
1166/** Retrieves a style @a style_id for the filetype @a ft_id.
1167 * If the style was not already initialised
1168 * (e.g. by by opening a file of this type), it will be initialised. The returned pointer is
1169 * owned by Geany and must not be freed.
1170 * @param ft_id Filetype ID, e.g. @c GEANY_FILETYPES_DIFF.
1171 * @param style_id A Scintilla lexer style, e.g. @c SCE_DIFF_ADDED. See scintilla/include/SciLexer.h.
1172 * @return A pointer to the style struct.
1173 * @see Scintilla messages @c SCI_STYLEGETFORE, etc, for use with scintilla_send_message(). */
1174GEANY_API_SYMBOL
1175const GeanyLexerStyle *highlighting_get_style(gint ft_id, gint style_id)
1176{
1177 g_return_val_if_fail(ft_id >= 0 && (guint) ft_id < filetypes_array->len, NULL);
1178 g_return_val_if_fail(style_id >= 0, NULL);
1179
1180 /* ensure filetype loaded */
1181 filetypes_load_config((guint) ft_id, FALSE);
1182
1183 /* TODO: style_id might not be the real array index (Scintilla styles are not always synced
1184 * with array indices) */
1185 return get_style((guint) ft_id, (guint) style_id);
1186}
1187
1188
1189enum
1190{
1195
1196static void on_color_scheme_changed(GtkTreeSelection *treesel, gpointer dummy)
1197{
1198 GtkTreeModel *model;
1199 GtkTreeIter iter;
1200 gchar *fname;
1201 gchar *path;
1202
1203 if (!gtk_tree_selection_get_selected(treesel, &model, &iter))
1204 return;
1205 gtk_tree_model_get(model, &iter, SCHEME_FILE, &fname, -1);
1206
1207 /* check if default item */
1208 if (!fname)
1209 {
1212 return;
1213 }
1214 SETPTR(fname, utils_get_locale_from_utf8(fname));
1215
1216 /* fname is just the basename from the menu item, so prepend the custom files path */
1217 path = g_build_path(G_DIR_SEPARATOR_S, app->configdir, GEANY_COLORSCHEMES_SUBDIR, fname, NULL);
1218 if (!g_file_test(path, G_FILE_TEST_EXISTS))
1219 {
1220 /* try the system path */
1221 g_free(path);
1222 path = g_build_path(G_DIR_SEPARATOR_S, app->datadir, GEANY_COLORSCHEMES_SUBDIR, fname, NULL);
1223 }
1224 if (g_file_test(path, G_FILE_TEST_EXISTS))
1225 {
1227 fname = NULL;
1229 }
1230 else
1231 {
1232 SETPTR(fname, utils_get_utf8_from_locale(fname));
1233 ui_set_statusbar(TRUE, _("Could not find file '%s'."), fname);
1234 }
1235 g_free(path);
1236 g_free(fname);
1237}
1238
1239
1240static gchar *utils_get_setting_locale_string(GKeyFile *keyfile,
1241 const gchar *group, const gchar *key, const gchar *default_value)
1242{
1243 gchar *result = g_key_file_get_locale_string(keyfile, group, key, NULL, NULL);
1244
1245 return FALLBACK(result, g_strdup(default_value));
1246}
1247
1248
1249static void add_color_scheme_item(GtkListStore *store,
1250 gchar *name, gchar *desc, const gchar *fn, GtkTreeIter *current_iter)
1251{
1252 GtkTreeIter iter;
1253 gchar *markup;
1254
1255 /* reuse parameters */
1256 name = g_markup_escape_text(name, -1);
1257 desc = g_markup_escape_text(desc, -1);
1258 markup = g_strdup_printf("<big><b>%s</b></big>\n%s", name, desc);
1259 g_free(name);
1260 g_free(desc);
1261
1262 gtk_list_store_append(store, &iter);
1263 gtk_list_store_set(store, &iter, SCHEME_MARKUP, markup,
1264 SCHEME_FILE, fn, -1);
1265 g_free(markup);
1266
1267 /* select the current iter if the the color scheme matches, or if it's the
1268 * default (fn == NULL), in case of bad config file. the default theme is
1269 * first anyway so if a later scheme matches it will override default */
1270 if ((! fn || utils_str_equal(fn, editor_prefs.color_scheme)) && current_iter)
1271 *current_iter = iter;
1272}
1273
1274
1275static void add_color_scheme_file(GtkListStore *store, const gchar *fname, GtkTreeIter *current_iter)
1276{
1277 GKeyFile *hkeyfile, *skeyfile;
1278 gchar *path, *theme_name, *theme_desc;
1279 gchar *theme_fn = utils_get_utf8_from_locale(fname);
1280
1281 path = g_build_filename(app->configdir, GEANY_COLORSCHEMES_SUBDIR, fname, NULL);
1282 hkeyfile = utils_key_file_new(path);
1283 SETPTR(path, g_build_filename(app->datadir, GEANY_COLORSCHEMES_SUBDIR, fname, NULL));
1284 skeyfile = utils_key_file_new(path);
1285
1286 theme_name = utils_get_setting(locale_string, hkeyfile, skeyfile, "theme_info", "name", theme_fn);
1287 theme_desc = utils_get_setting(locale_string, hkeyfile, skeyfile, "theme_info", "description", NULL);
1288 add_color_scheme_item(store, theme_name, theme_desc, theme_fn, current_iter);
1289
1290 g_free(path);
1291 g_free(theme_fn);
1292 g_free(theme_name);
1293 g_free(theme_desc);
1294 g_key_file_free(hkeyfile);
1295 g_key_file_free(skeyfile);
1296}
1297
1298
1299static gboolean add_color_scheme_items(GtkListStore *store, GtkTreeIter *current_iter)
1300{
1301 GSList *list, *node;
1302
1303 add_color_scheme_item(store, _("Default"), _("Default"), NULL, current_iter);
1305
1306 foreach_slist(node, list)
1307 {
1308 gchar *fname = node->data;
1309
1310 if (g_str_has_suffix(fname, ".conf"))
1311 add_color_scheme_file(store, fname, current_iter);
1312
1313 g_free(fname);
1314 }
1315 g_slist_free(list);
1316 return list != NULL;
1317}
1318
1319
1321 gint response, gpointer *dialog_ptr)
1322{
1323 *dialog_ptr = NULL;
1324 gtk_widget_destroy(dialog);
1325}
1326
1327
1329{
1330 static GtkWidget *dialog = NULL;
1331 GtkListStore *store = gtk_list_store_new(SCHEME_COLUMNS,
1332 G_TYPE_STRING, G_TYPE_STRING);
1333 GtkCellRenderer *text_renderer;
1334 GtkTreeViewColumn *column;
1335 GtkTreeSelection *treesel;
1336 GtkTreeIter current_iter;
1337 GtkTreePath *path;
1338 GtkWidget *vbox, *swin, *tree;
1339 GeanyDocument *doc;
1340
1341 doc = document_get_current();
1342 if (doc && doc->file_type->priv->warn_color_scheme)
1343 dialogs_show_msgbox_with_secondary(GTK_MESSAGE_WARNING,
1344 _("The current filetype overrides the default style."),
1345 _("This may cause color schemes to display incorrectly."));
1346
1347 tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
1348 g_object_unref(store);
1349 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree), TRUE);
1350 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), FALSE);
1351
1352 text_renderer = gtk_cell_renderer_text_new();
1353 g_object_set(text_renderer, "wrap-mode", PANGO_WRAP_WORD, NULL);
1354 column = gtk_tree_view_column_new_with_attributes(
1355 NULL, text_renderer, "markup", SCHEME_MARKUP, NULL);
1356 gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
1357
1358 add_color_scheme_items(store, &current_iter);
1359
1360 treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
1361 gtk_tree_selection_select_iter(treesel, &current_iter);
1362 path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &current_iter);
1363 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(tree), path, NULL, FALSE, 0, 0);
1364 gtk_tree_path_free(path);
1365 g_signal_connect(treesel, "changed", G_CALLBACK(on_color_scheme_changed), NULL);
1366
1367 /* old dialog may still be showing */
1368 if (dialog)
1369 gtk_widget_destroy(dialog);
1370 dialog = gtk_dialog_new_with_buttons(_("Color Schemes"),
1371 GTK_WINDOW(main_widgets.window), GTK_DIALOG_DESTROY_WITH_PARENT,
1372 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL);
1373 vbox = ui_dialog_vbox_new(GTK_DIALOG(dialog));
1374 gtk_box_set_spacing(GTK_BOX(vbox), 6);
1375 gtk_widget_set_name(dialog, "GeanyDialog");
1376 gtk_window_set_default_size(GTK_WINDOW(dialog),
1378
1379 swin = gtk_scrolled_window_new(NULL, NULL);
1380 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(swin), GTK_SHADOW_IN);
1381 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swin),
1382 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1383 gtk_container_add(GTK_CONTAINER(swin), tree);
1384 gtk_box_pack_start(GTK_BOX(vbox), swin, TRUE, TRUE, 0);
1385 g_signal_connect(dialog, "response", G_CALLBACK(on_color_scheme_dialog_response), &dialog);
1387}
1388
1389
1390/** Checks whether the given style is a string for the given lexer.
1391 *
1392 * @param lexer Scintilla lexer type (@c SCLEX_*).
1393 * @param style Scintilla style (@c SCE_*).
1394 *
1395 * @return @c TRUE if the style is a string, @c FALSE otherwise.
1396 */
1397GEANY_API_SYMBOL
1398gboolean highlighting_is_string_style(gint lexer, gint style)
1399{
1400 /* Don't forget STRINGEOL, to prevent completion whilst typing a string with no closing char. */
1401
1402 switch (lexer)
1403 {
1404 case SCLEX_CPP:
1405 return (style == SCE_C_CHARACTER ||
1406 style == SCE_C_STRING ||
1407 style == SCE_C_STRINGEOL ||
1408 style == SCE_C_STRINGRAW ||
1409 style == SCE_C_VERBATIM ||
1410 style == SCE_C_USERLITERAL ||
1411 style == SCE_C_TRIPLEVERBATIM ||
1412 style == SCE_C_REGEX ||
1413 style == SCE_C_HASHQUOTEDSTRING ||
1414 style == SCE_C_ESCAPESEQUENCE);
1415
1416 case SCLEX_PASCAL:
1417 return (style == SCE_PAS_CHARACTER ||
1418 style == SCE_PAS_STRING ||
1419 style == SCE_PAS_STRINGEOL);
1420
1421 case SCLEX_D:
1422 return (style == SCE_D_STRING ||
1423 style == SCE_D_STRINGEOL ||
1424 style == SCE_D_CHARACTER ||
1425 style == SCE_D_STRINGB ||
1426 style == SCE_D_STRINGR);
1427
1428 case SCLEX_PYTHON:
1429 return (style == SCE_P_STRING ||
1430 style == SCE_P_TRIPLE ||
1431 style == SCE_P_TRIPLEDOUBLE ||
1432 style == SCE_P_CHARACTER ||
1433 style == SCE_P_FSTRING ||
1434 style == SCE_P_FCHARACTER ||
1435 style == SCE_P_FTRIPLE ||
1436 style == SCE_P_FTRIPLEDOUBLE ||
1437 style == SCE_P_STRINGEOL);
1438
1439 case SCLEX_F77:
1440 case SCLEX_FORTRAN:
1441 return (style == SCE_F_STRING1 ||
1442 style == SCE_F_STRING2 ||
1443 style == SCE_F_STRINGEOL);
1444
1445 case SCLEX_PERL:
1446 return (style == SCE_PL_STRING ||
1447 style == SCE_PL_CHARACTER ||
1448 style == SCE_PL_HERE_DELIM ||
1449 style == SCE_PL_HERE_Q ||
1450 style == SCE_PL_HERE_QQ ||
1451 style == SCE_PL_HERE_QX ||
1452 style == SCE_PL_POD ||
1453 style == SCE_PL_STRING_Q ||
1454 style == SCE_PL_STRING_QQ ||
1455 style == SCE_PL_STRING_QX ||
1456 style == SCE_PL_STRING_QR ||
1457 style == SCE_PL_STRING_QW ||
1458 style == SCE_PL_POD_VERB ||
1459 style == SCE_PL_REGEX ||
1460 style == SCE_PL_REGEX_VAR ||
1461 style == SCE_PL_XLAT
1462 /* we don't include any STRING_*_VAR for autocompletion */);
1463
1464 case SCLEX_PO:
1465 return (style == SCE_PO_MSGCTXT_TEXT ||
1466 style == SCE_PO_MSGCTXT_TEXT_EOL ||
1467 style == SCE_PO_MSGID_TEXT ||
1468 style == SCE_PO_MSGID_TEXT_EOL ||
1469 style == SCE_PO_MSGSTR_TEXT ||
1470 style == SCE_PO_MSGSTR_TEXT_EOL);
1471
1472 case SCLEX_R:
1473 return (style == SCE_R_STRING);
1474
1475 case SCLEX_RUBY:
1476 return (style == SCE_RB_CHARACTER ||
1477 style == SCE_RB_STRING ||
1478 style == SCE_RB_HERE_DELIM ||
1479 style == SCE_RB_HERE_Q ||
1480 style == SCE_RB_HERE_QQ ||
1481 style == SCE_RB_HERE_QX ||
1482 style == SCE_RB_REGEX ||
1483 style == SCE_RB_STRING_Q ||
1484 style == SCE_RB_STRING_QQ ||
1485 style == SCE_RB_STRING_QX ||
1486 style == SCE_RB_STRING_QR ||
1487 style == SCE_RB_STRING_QW ||
1488 style == SCE_RB_POD);
1489
1490 case SCLEX_BASH:
1491 return (style == SCE_SH_STRING);
1492
1493 case SCLEX_SQL:
1494 return (style == SCE_SQL_STRING);
1495
1496 case SCLEX_TCL:
1497 return (style == SCE_TCL_IN_QUOTE);
1498
1499 case SCLEX_LUA:
1500 return (style == SCE_LUA_LITERALSTRING ||
1501 style == SCE_LUA_CHARACTER ||
1502 style == SCE_LUA_STRINGEOL ||
1503 style == SCE_LUA_STRING);
1504
1505 case SCLEX_HASKELL:
1507 return (style == SCE_HA_CHARACTER ||
1508 style == SCE_HA_STRINGEOL ||
1509 style == SCE_HA_STRING);
1510
1511 case SCLEX_FREEBASIC:
1512 return (style == SCE_B_STRING ||
1513 style == SCE_B_STRINGEOL);
1514
1515 case SCLEX_OCTAVE:
1516 return (style == SCE_MATLAB_STRING ||
1518
1519 case SCLEX_JULIA:
1520 return (style == SCE_JULIA_CHAR ||
1521 style == SCE_JULIA_STRING ||
1522 style == SCE_JULIA_DOCSTRING ||
1523 style == SCE_JULIA_COMMAND ||
1524 style == SCE_JULIA_STRINGINTERP);
1525
1526 case SCLEX_XML:
1527 case SCLEX_HTML:
1528 case SCLEX_PHPSCRIPT:
1529 return (
1530 style == SCE_HBA_STRING ||
1531 style == SCE_HBA_STRINGEOL ||
1532 style == SCE_HB_STRING ||
1533 style == SCE_HB_STRINGEOL ||
1534 style == SCE_H_CDATA ||
1535 style == SCE_H_DOUBLESTRING ||
1536 style == SCE_HJA_DOUBLESTRING ||
1537 style == SCE_HJA_SINGLESTRING ||
1538 style == SCE_HJA_STRINGEOL ||
1539 style == SCE_HJA_REGEX ||
1540 style == SCE_HJ_DOUBLESTRING ||
1541 style == SCE_HJ_SINGLESTRING ||
1542 style == SCE_HJ_STRINGEOL ||
1543 style == SCE_HJ_REGEX ||
1544 style == SCE_HPA_CHARACTER ||
1545 style == SCE_HPA_STRING ||
1546 style == SCE_HPA_TRIPLE ||
1547 style == SCE_HPA_TRIPLEDOUBLE ||
1548 style == SCE_HP_CHARACTER ||
1549 style == SCE_HPHP_HSTRING || /* HSTRING is a heredoc */
1550 style == SCE_HPHP_HSTRING_VARIABLE ||
1551 style == SCE_HPHP_SIMPLESTRING ||
1552 style == SCE_HP_STRING ||
1553 style == SCE_HP_TRIPLE ||
1554 style == SCE_HP_TRIPLEDOUBLE ||
1555 style == SCE_H_SGML_DOUBLESTRING ||
1556 style == SCE_H_SGML_SIMPLESTRING ||
1557 style == SCE_H_SINGLESTRING);
1558
1559 case SCLEX_CMAKE:
1560 return (style == SCE_CMAKE_STRINGDQ ||
1561 style == SCE_CMAKE_STRINGLQ ||
1562 style == SCE_CMAKE_STRINGRQ ||
1563 style == SCE_CMAKE_STRINGVAR);
1564
1565 case SCLEX_NSIS:
1566 return (style == SCE_NSIS_STRINGDQ ||
1567 style == SCE_NSIS_STRINGLQ ||
1568 style == SCE_NSIS_STRINGRQ ||
1569 style == SCE_NSIS_STRINGVAR);
1570
1571 case SCLEX_ADA:
1572 return (style == SCE_ADA_CHARACTER ||
1573 style == SCE_ADA_STRING ||
1574 style == SCE_ADA_CHARACTEREOL ||
1575 style == SCE_ADA_STRINGEOL);
1576
1577 case SCLEX_ABAQUS:
1578 return (style == SCE_ABAQUS_STRING);
1579
1580 case SCLEX_RUST:
1581 return (style == SCE_RUST_CHARACTER ||
1582 style == SCE_RUST_BYTECHARACTER ||
1583 style == SCE_RUST_STRING ||
1584 style == SCE_RUST_STRINGR ||
1585 style == SCE_RUST_BYTESTRING ||
1586 style == SCE_RUST_BYTESTRINGR ||
1587 style == SCE_RUST_LEXERROR);
1588
1589 case SCLEX_COFFEESCRIPT:
1590 return (style == SCE_COFFEESCRIPT_CHARACTER ||
1591 style == SCE_COFFEESCRIPT_STRING ||
1592 style == SCE_COFFEESCRIPT_REGEX ||
1595
1596 case SCLEX_VERILOG:
1597 return (style == SCE_V_STRING);
1598
1599 case SCLEX_VHDL:
1600 return (style == SCE_VHDL_STRING ||
1601 style == SCE_VHDL_STRINGEOL);
1602
1603 case SCLEX_CAML:
1604 return (style == SCE_CAML_CHAR ||
1605 style == SCE_CAML_STRING);
1606
1607 case SCLEX_CSS:
1608 return (style == SCE_CSS_DOUBLESTRING ||
1609 style == SCE_CSS_SINGLESTRING);
1610
1611 case SCLEX_ERLANG:
1612 return (style == SCE_ERLANG_STRING ||
1613 style == SCE_ERLANG_CHARACTER);
1614
1615 case SCLEX_LISP:
1616 return (style == SCE_LISP_STRING ||
1617 style == SCE_LISP_STRINGEOL);
1618
1619 case SCLEX_FORTH:
1620 return (style == SCE_FORTH_STRING);
1621
1622 case SCLEX_POWERSHELL:
1623 return (style == SCE_POWERSHELL_STRING ||
1624 style == SCE_POWERSHELL_CHARACTER);
1625
1626 case SCLEX_BATCH:
1627 case SCLEX_DIFF:
1628 case SCLEX_LATEX:
1629 case SCLEX_MAKEFILE:
1630 case SCLEX_MARKDOWN:
1631 case SCLEX_PROPERTIES:
1632 case SCLEX_TXT2TAGS:
1633 case SCLEX_YAML:
1634 /* there is no string type in those lexers, listing here just for completeness */
1635 return FALSE;
1636 }
1637 return FALSE;
1638}
1639
1640
1641/** Checks whether the given style is a comment for the given lexer.
1642 *
1643 * @param lexer Scintilla lexer type (@c SCLEX_*).
1644 * @param style Scintilla style (@c SCE_*).
1645 *
1646 * @return @c TRUE if the style is a comment, @c FALSE otherwise.
1647 */
1648GEANY_API_SYMBOL
1649gboolean highlighting_is_comment_style(gint lexer, gint style)
1650{
1651 switch (lexer)
1652 {
1653 case SCLEX_COBOL:
1654 case SCLEX_CPP:
1655 return (style == SCE_C_COMMENT ||
1656 style == SCE_C_COMMENTLINE ||
1657 style == SCE_C_COMMENTDOC ||
1658 style == SCE_C_PREPROCESSORCOMMENT ||
1660 style == SCE_C_COMMENTLINEDOC ||
1661 style == SCE_C_COMMENTDOCKEYWORD ||
1663 style == SCE_C_TASKMARKER);
1664
1665 case SCLEX_PASCAL:
1666 return (style == SCE_PAS_COMMENT ||
1667 style == SCE_PAS_COMMENT2 ||
1668 style == SCE_PAS_COMMENTLINE);
1669
1670 case SCLEX_D:
1671 return (style == SCE_D_COMMENT ||
1672 style == SCE_D_COMMENTLINE ||
1673 style == SCE_D_COMMENTDOC ||
1674 style == SCE_D_COMMENTNESTED ||
1675 style == SCE_D_COMMENTLINEDOC ||
1676 style == SCE_D_COMMENTDOCKEYWORD ||
1678
1679 case SCLEX_PYTHON:
1680 return (style == SCE_P_COMMENTLINE ||
1681 style == SCE_P_COMMENTBLOCK);
1682
1683 case SCLEX_F77:
1684 case SCLEX_FORTRAN:
1685 return (style == SCE_F_COMMENT);
1686
1687 case SCLEX_PERL:
1688 return (style == SCE_PL_COMMENTLINE);
1689
1690 case SCLEX_PROPERTIES:
1691 return (style == SCE_PROPS_COMMENT);
1692
1693 case SCLEX_PO:
1694 return (style == SCE_PO_COMMENT ||
1695 style == SCE_PO_PROGRAMMER_COMMENT);
1696
1697 case SCLEX_LATEX:
1698 return (style == SCE_L_COMMENT ||
1699 style == SCE_L_COMMENT2);
1700
1701 case SCLEX_MAKEFILE:
1702 return (style == SCE_MAKE_COMMENT);
1703
1704 case SCLEX_RUBY:
1705 return (style == SCE_RB_COMMENTLINE);
1706
1707 case SCLEX_BASH:
1708 return (style == SCE_SH_COMMENTLINE);
1709
1710 case SCLEX_R:
1711 return (style == SCE_R_COMMENT);
1712
1713 case SCLEX_SQL:
1714 return (style == SCE_SQL_COMMENT ||
1715 style == SCE_SQL_COMMENTLINE ||
1716 style == SCE_SQL_COMMENTDOC ||
1717 style == SCE_SQL_COMMENTLINEDOC ||
1718 style == SCE_SQL_COMMENTDOCKEYWORD ||
1720
1721 case SCLEX_TCL:
1722 return (style == SCE_TCL_COMMENT ||
1723 style == SCE_TCL_COMMENTLINE ||
1724 style == SCE_TCL_COMMENT_BOX ||
1725 style == SCE_TCL_BLOCK_COMMENT);
1726
1727 case SCLEX_OCTAVE:
1728 return (style == SCE_MATLAB_COMMENT);
1729
1730 case SCLEX_JULIA:
1731 return (style == SCE_JULIA_COMMENT);
1732
1733 case SCLEX_LUA:
1734 return (style == SCE_LUA_COMMENT ||
1735 style == SCE_LUA_COMMENTLINE ||
1736 style == SCE_LUA_COMMENTDOC);
1737
1738 case SCLEX_HASKELL:
1740 return (style == SCE_HA_COMMENTLINE ||
1741 style == SCE_HA_COMMENTBLOCK ||
1742 style == SCE_HA_COMMENTBLOCK2 ||
1743 style == SCE_HA_COMMENTBLOCK3 ||
1744 style == SCE_HA_LITERATE_COMMENT ||
1745 style == SCE_HA_LITERATE_CODEDELIM);
1746
1747 case SCLEX_FREEBASIC:
1748 return (style == SCE_B_COMMENT ||
1749 style == SCE_B_COMMENTBLOCK ||
1750 style == SCE_B_DOCLINE ||
1751 style == SCE_B_DOCBLOCK ||
1752 style == SCE_B_DOCKEYWORD);
1753
1754 case SCLEX_YAML:
1755 return (style == SCE_YAML_COMMENT);
1756
1757 case SCLEX_XML:
1758 case SCLEX_HTML:
1759 case SCLEX_PHPSCRIPT:
1760 return (
1761 style == SCE_HBA_COMMENTLINE ||
1762 style == SCE_HB_COMMENTLINE ||
1763 style == SCE_H_COMMENT ||
1764 style == SCE_HJA_COMMENT ||
1765 style == SCE_HJA_COMMENTDOC ||
1766 style == SCE_HJA_COMMENTLINE ||
1767 style == SCE_HJ_COMMENT ||
1768 style == SCE_HJ_COMMENTDOC ||
1769 style == SCE_HJ_COMMENTLINE ||
1770 style == SCE_HPA_COMMENTLINE ||
1771 style == SCE_HP_COMMENTLINE ||
1772 style == SCE_HPHP_COMMENT ||
1773 style == SCE_HPHP_COMMENTLINE ||
1774 style == SCE_H_SGML_COMMENT);
1775
1776 case SCLEX_CMAKE:
1777 return (style == SCE_CMAKE_COMMENT);
1778
1779 case SCLEX_NSIS:
1780 return (style == SCE_NSIS_COMMENT ||
1781 style == SCE_NSIS_COMMENTBOX);
1782
1783 case SCLEX_ADA:
1784 return (style == SCE_ADA_COMMENTLINE);
1785
1786 case SCLEX_ABAQUS:
1787 return (style == SCE_ABAQUS_COMMENT ||
1788 style == SCE_ABAQUS_COMMENTBLOCK);
1789
1790 case SCLEX_ASM:
1791 return (style == SCE_ASM_COMMENT ||
1792 style == SCE_ASM_COMMENTBLOCK ||
1793 style == SCE_ASM_COMMENTDIRECTIVE);
1794
1795 case SCLEX_RUST:
1796 return (style == SCE_RUST_COMMENTBLOCK ||
1797 style == SCE_RUST_COMMENTLINE ||
1798 style == SCE_RUST_COMMENTBLOCKDOC ||
1799 style == SCE_RUST_COMMENTLINEDOC);
1800
1801 case SCLEX_COFFEESCRIPT:
1802 return (style == SCE_COFFEESCRIPT_COMMENTLINE ||
1805
1806 case SCLEX_VERILOG:
1807 return (style == SCE_V_COMMENT ||
1808 style == SCE_V_COMMENTLINE ||
1809 style == SCE_V_COMMENTLINEBANG ||
1810 style == SCE_V_COMMENT_WORD);
1811
1812 case SCLEX_VHDL:
1813 return (style == SCE_VHDL_COMMENT ||
1814 style == SCE_VHDL_COMMENTLINEBANG ||
1815 style == SCE_VHDL_BLOCK_COMMENT);
1816
1817 case SCLEX_BATCH:
1818 return (style == SCE_BAT_COMMENT);
1819
1820 case SCLEX_CAML:
1821 return (style == SCE_CAML_COMMENT ||
1822 style == SCE_CAML_COMMENT1 ||
1823 style == SCE_CAML_COMMENT2 ||
1824 style == SCE_CAML_COMMENT3);
1825
1826 case SCLEX_ERLANG:
1827 return (style == SCE_ERLANG_COMMENT ||
1828 style == SCE_ERLANG_COMMENT_FUNCTION ||
1829 style == SCE_ERLANG_COMMENT_MODULE ||
1830 style == SCE_ERLANG_COMMENT_DOC ||
1832
1833 case SCLEX_FORTH:
1834 return (style == SCE_FORTH_COMMENT ||
1835 style == SCE_FORTH_COMMENT_ML);
1836
1837 case SCLEX_CSS:
1838 return (style == SCE_CSS_COMMENT);
1839
1840 case SCLEX_DIFF:
1841 return (style == SCE_DIFF_COMMENT);
1842
1843 case SCLEX_LISP:
1844 return (style == SCE_LISP_COMMENT ||
1845 style == SCE_LISP_MULTI_COMMENT);
1846
1847 case SCLEX_POWERSHELL:
1848 return (style == SCE_POWERSHELL_COMMENT ||
1851
1852 case SCLEX_TXT2TAGS:
1853 return (style == SCE_TXT2TAGS_COMMENT);
1854
1855 case SCLEX_MARKDOWN:
1856 /* there is no comment type in those lexers, listing here just for completeness */
1857 return FALSE;
1858 }
1859 return FALSE;
1860}
1861
1862
1863/** Checks whether the given style is normal code (not string, comment, preprocessor, etc).
1864 *
1865 * @param lexer Scintilla lexer type (@c SCLEX_*).
1866 * @param style Scintilla style (@c SCE_*).
1867 *
1868 * @return @c TRUE if the style is code, @c FALSE otherwise.
1869 */
1870GEANY_API_SYMBOL
1871gboolean highlighting_is_code_style(gint lexer, gint style)
1872{
1873 switch (lexer)
1874 {
1875 case SCLEX_CPP:
1876 {
1877 if (style == SCE_C_PREPROCESSOR)
1878 return FALSE;
1879 break;
1880 }
1881 case SCLEX_HASKELL:
1883 {
1884 if (style == SCE_HA_PREPROCESSOR)
1885 return FALSE;
1886 break;
1887 }
1888 case SCLEX_VERILOG:
1889 {
1890 if (style == SCE_V_PREPROCESSOR)
1891 return FALSE;
1892 break;
1893 }
1894 }
1895 return !(highlighting_is_comment_style(lexer, style) ||
1896 highlighting_is_string_style(lexer, style));
1897}
static void StyleSet(GtkWidget *w, GtkStyle *, void *)
Definition: PlatGTK.cxx:1370
Interface to the added lexer functions in the SciLexer version of the edit control.
#define SCE_ERLANG_COMMENT_DOC_MACRO
Definition: SciLexer.h:927
#define SCE_COFFEESCRIPT_CHARACTER
Definition: SciLexer.h:1618
#define SCE_RB_STRING_QW
Definition: SciLexer.h:427
#define SCE_HBA_COMMENTLINE
Definition: SciLexer.h:311
#define SCE_C_ESCAPESEQUENCE
Definition: SciLexer.h:197
#define SCE_TCL_COMMENT_BOX
Definition: SciLexer.h:241
#define SCE_ASM_COMMENT
Definition: SciLexer.h:716
#define SCE_HA_LITERATE_CODEDELIM
Definition: SciLexer.h:1140
#define SCLEX_HTML
Definition: SciLexer.h:21
#define SCE_HJA_COMMENTLINE
Definition: SciLexer.h:291
#define SCE_LISP_COMMENT
Definition: SciLexer.h:639
#define SCE_C_HASHQUOTEDSTRING
Definition: SciLexer.h:192
#define SCE_C_USERLITERAL
Definition: SciLexer.h:195
#define SCE_HA_COMMENTBLOCK2
Definition: SciLexer.h:1133
#define SCE_HJ_STRINGEOL
Definition: SciLexer.h:286
#define SCE_P_TRIPLE
Definition: SciLexer.h:156
#define SCLEX_DIFF
Definition: SciLexer.h:33
#define SCLEX_LITERATEHASKELL
Definition: SciLexer.h:123
#define SCE_HB_STRINGEOL
Definition: SciLexer.h:308
#define SCE_H_SGML_SIMPLESTRING
Definition: SciLexer.h:268
#define SCE_ABAQUS_COMMENT
Definition: SciLexer.h:1360
#define SCE_HJA_DOUBLESTRING
Definition: SciLexer.h:296
#define SCE_HPHP_HSTRING
Definition: SciLexer.h:345
#define SCE_SH_COMMENTLINE
Definition: SciLexer.h:1063
#define SCE_C_PREPROCESSORCOMMENT
Definition: SciLexer.h:193
#define SCE_HPHP_HSTRING_VARIABLE
Definition: SciLexer.h:352
#define SCE_P_STRING
Definition: SciLexer.h:153
#define SCE_COFFEESCRIPT_COMMENTLINE
Definition: SciLexer.h:1613
#define SCLEX_ADA
Definition: SciLexer.h:37
#define SCE_ERLANG_COMMENT_MODULE
Definition: SciLexer.h:925
#define SCE_POWERSHELL_CHARACTER
Definition: SciLexer.h:1416
#define SCLEX_PYTHON
Definition: SciLexer.h:19
#define SCE_P_FTRIPLEDOUBLE
Definition: SciLexer.h:169
#define SCLEX_LUA
Definition: SciLexer.h:32
#define SCE_HBA_STRINGEOL
Definition: SciLexer.h:316
#define SCE_ERLANG_STRING
Definition: SciLexer.h:915
#define SCE_HP_TRIPLEDOUBLE
Definition: SciLexer.h:325
#define SCE_RUST_LEXERROR
Definition: SciLexer.h:1774
#define SCE_V_COMMENTLINE
Definition: SciLexer.h:977
#define SCE_POWERSHELL_STRING
Definition: SciLexer.h:1415
#define SCE_CSS_COMMENT
Definition: SciLexer.h:755
#define SCE_C_STRINGEOL
Definition: SciLexer.h:182
#define SCE_HJ_REGEX
Definition: SciLexer.h:287
#define SCE_SQL_COMMENTDOC
Definition: SciLexer.h:1194
#define SCE_PL_CHARACTER
Definition: SciLexer.h:361
#define SCE_HJ_DOUBLESTRING
Definition: SciLexer.h:283
#define SCE_HPA_CHARACTER
Definition: SciLexer.h:336
#define SCE_RUST_COMMENTLINEDOC
Definition: SciLexer.h:1758
#define SCE_C_REGEX
Definition: SciLexer.h:184
#define SCE_RB_HERE_Q
Definition: SciLexer.h:420
#define SCE_MAKE_COMMENT
Definition: SciLexer.h:558
#define SCE_HJ_SINGLESTRING
Definition: SciLexer.h:284
#define SCE_COFFEESCRIPT_REGEX
Definition: SciLexer.h:1625
#define SCE_TCL_COMMENTLINE
Definition: SciLexer.h:223
#define SCE_SQL_COMMENTLINE
Definition: SciLexer.h:1193
#define SCE_LUA_LITERALSTRING
Definition: SciLexer.h:483
#define SCE_C_TASKMARKER
Definition: SciLexer.h:196
#define SCE_ADA_CHARACTER
Definition: SciLexer.h:606
#define SCE_PL_STRING
Definition: SciLexer.h:360
#define SCE_C_PREPROCESSOR
Definition: SciLexer.h:179
#define SCE_RB_STRING_Q
Definition: SciLexer.h:423
#define SCE_NSIS_STRINGDQ
Definition: SciLexer.h:828
#define SCE_PL_HERE_DELIM
Definition: SciLexer.h:376
#define SCE_RB_HERE_QX
Definition: SciLexer.h:422
#define SCE_COFFEESCRIPT_VERBOSE_REGEX_COMMENT
Definition: SciLexer.h:1635
#define SCE_DIFF_COMMENT
Definition: SciLexer.h:565
#define SCE_RB_HERE_DELIM
Definition: SciLexer.h:419
#define SCE_H_COMMENT
Definition: SciLexer.h:252
#define SCE_PO_MSGCTXT_TEXT_EOL
Definition: SciLexer.h:1467
#define SCLEX_SQL
Definition: SciLexer.h:24
#define SCE_HJ_COMMENTDOC
Definition: SciLexer.h:279
#define SCE_RB_HERE_QQ
Definition: SciLexer.h:421
#define SCE_TCL_BLOCK_COMMENT
Definition: SciLexer.h:242
#define SCE_RB_POD
Definition: SciLexer.h:402
#define SCE_C_TRIPLEVERBATIM
Definition: SciLexer.h:191
#define SCE_ABAQUS_STRING
Definition: SciLexer.h:1363
#define SCE_D_CHARACTER
Definition: SciLexer.h:210
#define SCE_CSS_SINGLESTRING
Definition: SciLexer.h:760
#define SCLEX_NSIS
Definition: SciLexer.h:58
#define SCE_RUST_COMMENTBLOCK
Definition: SciLexer.h:1755
#define SCE_SH_STRING
Definition: SciLexer.h:1066
#define SCE_HA_LITERATE_COMMENT
Definition: SciLexer.h:1139
#define SCE_HJA_STRINGEOL
Definition: SciLexer.h:299
#define SCE_RB_CHARACTER
Definition: SciLexer.h:406
#define SCE_D_COMMENTDOCKEYWORDERROR
Definition: SciLexer.h:215
#define SCLEX_JULIA
Definition: SciLexer.h:147
#define SCLEX_VERILOG
Definition: SciLexer.h:71
#define SCE_C_STRINGRAW
Definition: SciLexer.h:190
#define SCE_NSIS_STRINGRQ
Definition: SciLexer.h:830
#define SCE_HJ_COMMENTLINE
Definition: SciLexer.h:278
#define SCLEX_PROPERTIES
Definition: SciLexer.h:26
#define SCE_H_SINGLESTRING
Definition: SciLexer.h:250
#define SCE_HPA_TRIPLEDOUBLE
Definition: SciLexer.h:339
#define SCE_CAML_COMMENT1
Definition: SciLexer.h:1115
#define SCE_RUST_BYTESTRINGR
Definition: SciLexer.h:1776
#define SCE_BAT_COMMENT
Definition: SciLexer.h:539
#define SCE_PL_HERE_Q
Definition: SciLexer.h:377
#define SCLEX_R
Definition: SciLexer.h:101
#define SCLEX_ERLANG
Definition: SciLexer.h:68
#define SCE_RB_STRING_QR
Definition: SciLexer.h:426
#define SCE_LUA_COMMENTDOC
Definition: SciLexer.h:478
#define SCE_C_PREPROCESSORCOMMENTDOC
Definition: SciLexer.h:194
#define SCE_PL_STRING_QR
Definition: SciLexer.h:383
#define SCE_HP_TRIPLE
Definition: SciLexer.h:324
#define SCLEX_FREEBASIC
Definition: SciLexer.h:90
#define SCE_HA_PREPROCESSOR
Definition: SciLexer.h:1136
#define SCE_HA_COMMENTLINE
Definition: SciLexer.h:1131
#define SCE_C_COMMENT
Definition: SciLexer.h:171
#define SCE_RB_COMMENTLINE
Definition: SciLexer.h:401
#define SCE_PL_STRING_QW
Definition: SciLexer.h:384
#define SCLEX_COFFEESCRIPT
Definition: SciLexer.h:117
#define SCE_TCL_COMMENT
Definition: SciLexer.h:222
#define SCE_TCL_IN_QUOTE
Definition: SciLexer.h:226
#define SCLEX_FORTH
Definition: SciLexer.h:67
#define SCE_VHDL_COMMENTLINEBANG
Definition: SciLexer.h:1088
#define SCE_VHDL_COMMENT
Definition: SciLexer.h:1087
#define SCE_RUST_BYTESTRING
Definition: SciLexer.h:1775
#define SCE_CMAKE_STRINGDQ
Definition: SciLexer.h:1313
#define SCE_LISP_MULTI_COMMENT
Definition: SciLexer.h:649
#define SCE_F_STRING1
Definition: SciLexer.h:734
#define SCE_D_STRINGB
Definition: SciLexer.h:216
#define SCE_P_COMMENTBLOCK
Definition: SciLexer.h:162
#define SCE_HB_COMMENTLINE
Definition: SciLexer.h:303
#define SCE_RUST_CHARACTER
Definition: SciLexer.h:1769
#define SCLEX_OCTAVE
Definition: SciLexer.h:69
#define SCE_RB_REGEX
Definition: SciLexer.h:411
#define SCE_C_VERBATIM
Definition: SciLexer.h:183
#define SCE_CSS_DOUBLESTRING
Definition: SciLexer.h:759
#define SCE_P_FCHARACTER
Definition: SciLexer.h:167
#define SCE_ADA_STRINGEOL
Definition: SciLexer.h:609
#define SCE_SQL_COMMENTLINEDOC
Definition: SciLexer.h:1204
#define SCE_HBA_STRING
Definition: SciLexer.h:314
#define SCE_PAS_STRINGEOL
Definition: SciLexer.h:1480
#define SCE_LUA_COMMENT
Definition: SciLexer.h:476
#define SCE_POWERSHELL_COMMENTDOCKEYWORD
Definition: SciLexer.h:1429
#define SCE_CAML_COMMENT3
Definition: SciLexer.h:1117
#define SCE_HJA_SINGLESTRING
Definition: SciLexer.h:297
#define SCE_F_STRING2
Definition: SciLexer.h:735
#define SCE_RB_STRING_QX
Definition: SciLexer.h:425
#define SCE_SQL_COMMENTDOCKEYWORDERROR
Definition: SciLexer.h:1207
#define SCLEX_TXT2TAGS
Definition: SciLexer.h:114
#define SCE_PL_REGEX_VAR
Definition: SciLexer.h:391
#define SCLEX_HASKELL
Definition: SciLexer.h:83
#define SCLEX_LISP
Definition: SciLexer.h:38
#define SCE_COFFEESCRIPT_STRINGEOL
Definition: SciLexer.h:1623
#define SCE_ASM_COMMENTDIRECTIVE
Definition: SciLexer.h:730
#define SCE_NSIS_STRINGVAR
Definition: SciLexer.h:839
#define SCE_PL_HERE_QX
Definition: SciLexer.h:379
#define SCE_HA_STRING
Definition: SciLexer.h:1122
#define SCE_LUA_STRINGEOL
Definition: SciLexer.h:487
#define SCLEX_CSS
Definition: SciLexer.h:53
#define SCE_L_COMMENT2
Definition: SciLexer.h:469
#define SCE_YAML_COMMENT
Definition: SciLexer.h:888
#define SCE_JULIA_STRINGINTERP
Definition: SciLexer.h:949
#define SCE_P_FTRIPLE
Definition: SciLexer.h:168
#define SCE_HP_CHARACTER
Definition: SciLexer.h:322
#define SCE_R_STRING
Definition: SciLexer.h:1390
#define SCLEX_XML
Definition: SciLexer.h:22
#define SCE_V_COMMENT_WORD
Definition: SciLexer.h:989
#define SCE_FORTH_COMMENT
Definition: SciLexer.h:671
#define SCE_HJ_COMMENT
Definition: SciLexer.h:277
#define SCE_D_COMMENTDOC
Definition: SciLexer.h:201
#define SCE_HP_COMMENTLINE
Definition: SciLexer.h:319
#define SCE_NSIS_STRINGLQ
Definition: SciLexer.h:829
#define SCLEX_TCL
Definition: SciLexer.h:42
#define SCLEX_NULL
Definition: SciLexer.h:18
#define SCE_CAML_STRING
Definition: SciLexer.h:1113
#define SCE_JULIA_CHAR
Definition: SciLexer.h:942
#define SCE_PROPS_COMMENT
Definition: SciLexer.h:457
#define SCLEX_ABAQUS
Definition: SciLexer.h:99
#define SCE_C_COMMENTLINE
Definition: SciLexer.h:172
#define SCE_LISP_STRINGEOL
Definition: SciLexer.h:645
#define SCE_PL_STRING_QX
Definition: SciLexer.h:382
#define SCE_ADA_CHARACTEREOL
Definition: SciLexer.h:607
#define SCE_RUST_STRING
Definition: SciLexer.h:1767
#define SCE_HJA_COMMENTDOC
Definition: SciLexer.h:292
#define SCE_SQL_COMMENTDOCKEYWORD
Definition: SciLexer.h:1206
#define SCE_HPHP_COMMENT
Definition: SciLexer.h:350
#define SCLEX_YAML
Definition: SciLexer.h:63
#define SCE_PL_STRING_Q
Definition: SciLexer.h:380
#define SCE_B_DOCKEYWORD
Definition: SciLexer.h:455
#define SCE_RB_STRING
Definition: SciLexer.h:405
#define SCLEX_CAML
Definition: SciLexer.h:80
#define SCE_HPA_COMMENTLINE
Definition: SciLexer.h:333
#define SCE_H_SGML_COMMENT
Definition: SciLexer.h:272
#define SCE_C_COMMENTDOCKEYWORDERROR
Definition: SciLexer.h:188
#define SCE_PL_POD
Definition: SciLexer.h:357
#define SCE_CMAKE_STRINGVAR
Definition: SciLexer.h:1324
#define SCE_POWERSHELL_COMMENTSTREAM
Definition: SciLexer.h:1426
#define SCE_H_SGML_DOUBLESTRING
Definition: SciLexer.h:267
#define SCE_FORTH_STRING
Definition: SciLexer.h:680
#define SCE_COFFEESCRIPT_VERBOSE_REGEX
Definition: SciLexer.h:1634
#define SCE_C_STRING
Definition: SciLexer.h:176
#define SCLEX_F77
Definition: SciLexer.h:52
#define SCLEX_VHDL
Definition: SciLexer.h:79
#define SCE_ADA_COMMENTLINE
Definition: SciLexer.h:611
#define SCE_VHDL_STRINGEOL
Definition: SciLexer.h:1093
#define SCE_PAS_COMMENT
Definition: SciLexer.h:1471
#define SCE_HA_CHARACTER
Definition: SciLexer.h:1123
#define SCE_PO_MSGID_TEXT_EOL
Definition: SciLexer.h:1465
#define SCE_CMAKE_STRINGLQ
Definition: SciLexer.h:1314
#define SCE_ERLANG_COMMENT_FUNCTION
Definition: SciLexer.h:924
#define SCE_ADA_STRING
Definition: SciLexer.h:608
#define SCE_PAS_CHARACTER
Definition: SciLexer.h:1481
#define SCE_PL_POD_VERB
Definition: SciLexer.h:385
#define SCE_HB_STRING
Definition: SciLexer.h:306
#define SCLEX_LATEX
Definition: SciLexer.h:31
#define SCE_CAML_CHAR
Definition: SciLexer.h:1111
#define SCE_HA_COMMENTBLOCK3
Definition: SciLexer.h:1134
#define SCE_JULIA_STRING
Definition: SciLexer.h:946
#define SCE_D_COMMENTNESTED
Definition: SciLexer.h:202
#define SCLEX_MARKDOWN
Definition: SciLexer.h:113
#define SCE_NSIS_COMMENTBOX
Definition: SciLexer.h:844
#define SCE_H_DOUBLESTRING
Definition: SciLexer.h:249
#define SCE_LISP_STRING
Definition: SciLexer.h:644
#define SCE_P_COMMENTLINE
Definition: SciLexer.h:151
#define SCE_P_FSTRING
Definition: SciLexer.h:166
#define SCE_JULIA_COMMAND
Definition: SciLexer.h:952
#define SCE_NSIS_COMMENT
Definition: SciLexer.h:827
#define SCE_D_COMMENT
Definition: SciLexer.h:199
#define SCE_V_STRING
Definition: SciLexer.h:981
#define SCE_F_STRINGEOL
Definition: SciLexer.h:736
#define SCE_B_STRINGEOL
Definition: SciLexer.h:442
#define SCE_P_CHARACTER
Definition: SciLexer.h:154
#define SCLEX_PERL
Definition: SciLexer.h:23
#define SCE_D_STRING
Definition: SciLexer.h:208
#define SCE_SQL_COMMENT
Definition: SciLexer.h:1192
#define SCE_PL_STRING_QQ
Definition: SciLexer.h:381
#define SCE_RUST_COMMENTBLOCKDOC
Definition: SciLexer.h:1757
#define SCLEX_PO
Definition: SciLexer.h:105
#define SCE_PAS_COMMENTLINE
Definition: SciLexer.h:1473
#define SCE_ERLANG_CHARACTER
Definition: SciLexer.h:919
#define SCE_PO_COMMENT
Definition: SciLexer.h:1454
#define SCE_HPHP_COMMENTLINE
Definition: SciLexer.h:351
#define SCE_P_TRIPLEDOUBLE
Definition: SciLexer.h:157
#define SCE_HA_COMMENTBLOCK
Definition: SciLexer.h:1132
#define SCE_CAML_COMMENT2
Definition: SciLexer.h:1116
#define SCE_PO_MSGSTR_TEXT_EOL
Definition: SciLexer.h:1466
#define SCE_SQL_STRING
Definition: SciLexer.h:1197
#define SCE_TXT2TAGS_COMMENT
Definition: SciLexer.h:1570
#define SCE_JULIA_COMMENT
Definition: SciLexer.h:937
#define SCE_D_STRINGR
Definition: SciLexer.h:217
#define SCE_HPA_STRING
Definition: SciLexer.h:335
#define SCLEX_D
Definition: SciLexer.h:94
#define SCLEX_BASH
Definition: SciLexer.h:77
#define SCLEX_CMAKE
Definition: SciLexer.h:95
#define SCE_B_STRING
Definition: SciLexer.h:437
#define SCE_PL_REGEX
Definition: SciLexer.h:371
#define SCE_C_CHARACTER
Definition: SciLexer.h:177
#define SCE_HP_STRING
Definition: SciLexer.h:321
#define SCE_CMAKE_COMMENT
Definition: SciLexer.h:1312
#define SCE_PO_MSGID_TEXT
Definition: SciLexer.h:1456
#define SCE_PAS_STRING
Definition: SciLexer.h:1479
#define SCE_HJA_REGEX
Definition: SciLexer.h:300
#define SCLEX_CPP
Definition: SciLexer.h:20
#define SCE_RB_STRING_QQ
Definition: SciLexer.h:424
#define SCE_C_COMMENTDOC
Definition: SciLexer.h:173
#define SCLEX_BATCH
Definition: SciLexer.h:29
#define SCLEX_RUST
Definition: SciLexer.h:126
#define SCE_FORTH_COMMENT_ML
Definition: SciLexer.h:672
#define SCE_VHDL_STRING
Definition: SciLexer.h:1090
#define SCE_D_COMMENTDOCKEYWORD
Definition: SciLexer.h:214
#define SCE_C_COMMENTDOCKEYWORD
Definition: SciLexer.h:187
#define SCE_PL_XLAT
Definition: SciLexer.h:390
#define SCE_MATLAB_STRING
Definition: SciLexer.h:687
#define SCLEX_PASCAL
Definition: SciLexer.h:35
#define SCLEX_FORTRAN
Definition: SciLexer.h:51
#define SCE_RUST_BYTECHARACTER
Definition: SciLexer.h:1777
#define SCE_MATLAB_DOUBLEQUOTESTRING
Definition: SciLexer.h:690
#define SCE_HPHP_SIMPLESTRING
Definition: SciLexer.h:346
#define SCE_CAML_COMMENT
Definition: SciLexer.h:1114
#define SCE_V_PREPROCESSOR
Definition: SciLexer.h:984
#define SCE_PO_PROGRAMMER_COMMENT
Definition: SciLexer.h:1462
#define SCE_LUA_CHARACTER
Definition: SciLexer.h:482
#define SCE_CMAKE_STRINGRQ
Definition: SciLexer.h:1315
#define SCE_F_COMMENT
Definition: SciLexer.h:732
#define SCE_ERLANG_COMMENT
Definition: SciLexer.h:911
#define SCE_D_COMMENTLINE
Definition: SciLexer.h:200
#define SCE_R_COMMENT
Definition: SciLexer.h:1385
#define SCE_RUST_COMMENTLINE
Definition: SciLexer.h:1756
#define SCE_PL_HERE_QQ
Definition: SciLexer.h:378
#define SCE_LUA_STRING
Definition: SciLexer.h:481
#define SCE_V_COMMENT
Definition: SciLexer.h:976
#define SCE_POWERSHELL_COMMENT
Definition: SciLexer.h:1414
#define SCE_RUST_STRINGR
Definition: SciLexer.h:1768
#define SCE_H_CDATA
Definition: SciLexer.h:260
#define SCE_ABAQUS_COMMENTBLOCK
Definition: SciLexer.h:1361
#define SCLEX_RUBY
Definition: SciLexer.h:39
#define SCE_JULIA_DOCSTRING
Definition: SciLexer.h:950
#define SCE_C_COMMENTLINEDOC
Definition: SciLexer.h:185
#define SCE_COFFEESCRIPT_STRING
Definition: SciLexer.h:1617
#define SCE_HJA_COMMENT
Definition: SciLexer.h:290
#define SCLEX_COBOL
Definition: SciLexer.h:107
#define SCE_PAS_COMMENT2
Definition: SciLexer.h:1472
#define SCLEX_PHPSCRIPT
Definition: SciLexer.h:84
#define SCE_D_STRINGEOL
Definition: SciLexer.h:209
#define SCE_V_COMMENTLINEBANG
Definition: SciLexer.h:978
#define SCE_VHDL_BLOCK_COMMENT
Definition: SciLexer.h:1101
#define SCE_B_COMMENTBLOCK
Definition: SciLexer.h:452
#define SCE_B_DOCBLOCK
Definition: SciLexer.h:454
#define SCE_COFFEESCRIPT_COMMENTBLOCK
Definition: SciLexer.h:1633
#define SCE_ERLANG_COMMENT_DOC
Definition: SciLexer.h:926
#define SCE_ASM_COMMENTBLOCK
Definition: SciLexer.h:726
#define SCLEX_POWERSHELL
Definition: SciLexer.h:103
#define SCE_LUA_COMMENTLINE
Definition: SciLexer.h:477
#define SCE_B_DOCLINE
Definition: SciLexer.h:453
#define SCE_PL_COMMENTLINE
Definition: SciLexer.h:356
#define SCLEX_MAKEFILE
Definition: SciLexer.h:28
#define SCE_MATLAB_COMMENT
Definition: SciLexer.h:683
#define SCE_HA_STRINGEOL
Definition: SciLexer.h:1137
#define SCE_HPA_TRIPLE
Definition: SciLexer.h:338
#define SCE_B_COMMENT
Definition: SciLexer.h:434
#define SCE_D_COMMENTLINEDOC
Definition: SciLexer.h:213
#define SCE_L_COMMENT
Definition: SciLexer.h:466
#define SCE_PO_MSGCTXT_TEXT
Definition: SciLexer.h:1460
#define SCLEX_ASM
Definition: SciLexer.h:49
#define SCE_P_STRINGEOL
Definition: SciLexer.h:163
#define SCE_PO_MSGSTR_TEXT
Definition: SciLexer.h:1458
#define SCI_MARKERSETFORE
Definition: Scintilla.h:162
#define SCI_STYLESETBACK
Definition: Scintilla.h:231
intptr_t sptr_t
Definition: Scintilla.h:35
#define SC_MARKNUM_FOLDEREND
Definition: Scintilla.h:153
#define SCI_MARKERSETBACK
Definition: Scintilla.h:163
#define SC_MARK_EMPTY
Definition: Scintilla.h:124
#define STYLE_BRACELIGHT
Definition: Scintilla.h:199
#define SC_MARK_TCORNERCURVE
Definition: Scintilla.h:136
#define INDIC_SQUIGGLEPIXMAP
Definition: Scintilla.h:300
#define SCI_SETFOLDMARGINCOLOUR
Definition: Scintilla.h:618
#define SCI_SETCARETWIDTH
Definition: Scintilla.h:461
#define SCI_SETWHITESPACECHARS
Definition: Scintilla.h:812
#define SC_MARKNUM_FOLDER
Definition: Scintilla.h:158
#define SCI_SETWRAPVISUALFLAGS
Definition: Scintilla.h:564
#define SC_MARK_TCORNER
Definition: Scintilla.h:130
#define SC_MARKNUM_FOLDERTAIL
Definition: Scintilla.h:156
#define SCI_SETEXTRAASCENT
Definition: Scintilla.h:877
#define CARETSTYLE_BLOCK
Definition: Scintilla.h:850
#define SCI_SETCARETLINEBACKALPHA
Definition: Scintilla.h:846
#define STYLE_BRACEBAD
Definition: Scintilla.h:200
#define SC_MARK_PLUS
Definition: Scintilla.h:127
#define SC_MARK_CIRCLEMINUS
Definition: Scintilla.h:139
#define SC_MARK_ARROWDOWN
Definition: Scintilla.h:125
#define SCI_SETWRAPSTARTINDENT
Definition: Scintilla.h:571
#define SC_MARK_LCORNER
Definition: Scintilla.h:129
#define SC_MARK_CIRCLEMINUSCONNECTED
Definition: Scintilla.h:140
#define SCI_MARKERDEFINE
Definition: Scintilla.h:161
#define SCI_SETSELALPHA
Definition: Scintilla.h:270
#define SC_MARGIN_SYMBOL
Definition: Scintilla.h:176
#define SCI_MARKERSETALPHA
Definition: Scintilla.h:174
#define SCI_STYLESETITALIC
Definition: Scintilla.h:233
#define SCI_SETSELFORE
Definition: Scintilla.h:267
#define SCI_INDICSETSTYLE
Definition: Scintilla.h:317
#define INDIC_ROUNDBOX
Definition: Scintilla.h:294
#define SC_MARK_MINUS
Definition: Scintilla.h:126
uintptr_t uptr_t
Definition: Scintilla.h:33
#define SC_MARKNUM_FOLDERMIDTAIL
Definition: Scintilla.h:155
#define SCI_STYLESETEOLFILLED
Definition: Scintilla.h:236
#define INDIC_DOTBOX
Definition: Scintilla.h:299
#define SCI_CALLTIPSETBACK
Definition: Scintilla.h:486
#define SCI_SETPROPERTY
Definition: Scintilla.h:1029
#define SCI_STYLESETFORE
Definition: Scintilla.h:230
#define SC_MARK_BOXMINUS
Definition: Scintilla.h:133
#define SC_MARKNUM_FOLDEROPEN
Definition: Scintilla.h:159
#define STYLE_DEFAULT
Definition: Scintilla.h:197
#define SC_MARK_SHORTARROW
Definition: Scintilla.h:123
#define SCI_SETMARGINMASKN
Definition: Scintilla.h:187
#define SC_MARK_BOXPLUSCONNECTED
Definition: Scintilla.h:132
#define SCI_SETWHITESPACEFORE
Definition: Scintilla.h:332
#define SCI_INDICSETALPHA
Definition: Scintilla.h:873
#define SCI_SETWRAPVISUALFLAGSLOCATION
Definition: Scintilla.h:569
#define SCI_SETFOLDFLAGS
Definition: Scintilla.h:536
#define SCI_SETWHITESPACEBACK
Definition: Scintilla.h:333
#define SC_MARK_BOXPLUS
Definition: Scintilla.h:131
#define SCI_SETCARETFORE
Definition: Scintilla.h:273
#define SC_MARK_CIRCLEPLUSCONNECTED
Definition: Scintilla.h:138
#define SC_MARK_LCORNERCURVE
Definition: Scintilla.h:135
#define SCI_SETEXTRADESCENT
Definition: Scintilla.h:879
#define SC_MARKNUM_FOLDEROPENMID
Definition: Scintilla.h:154
#define CARETSTYLE_LINE
Definition: Scintilla.h:849
#define SCI_STYLECLEARALL
Definition: Scintilla.h:229
#define SCI_STYLESETBOLD
Definition: Scintilla.h:232
#define SCI_SETCARETLINEBACK
Definition: Scintilla.h:342
#define SC_MASK_FOLDERS
Definition: Scintilla.h:160
#define SC_MARK_CIRCLEPLUS
Definition: Scintilla.h:137
#define SCI_SETWORDCHARS
Definition: Scintilla.h:281
#define SCI_INDICSETFORE
Definition: Scintilla.h:319
#define SC_MARKNUM_FOLDERSUB
Definition: Scintilla.h:157
#define SCI_SETMARGINTYPEN
Definition: Scintilla.h:183
#define SCI_SETSELBACK
Definition: Scintilla.h:268
#define SC_MARK_BOXMINUSCONNECTED
Definition: Scintilla.h:134
#define STYLE_INDENTGUIDE
Definition: Scintilla.h:202
#define SC_MARK_ARROW
Definition: Scintilla.h:121
#define SC_MARK_VLINE
Definition: Scintilla.h:128
#define SCI_SETWRAPINDENTMODE
Definition: Scintilla.h:577
#define SCI_SETFOLDMARGINHICOLOUR
Definition: Scintilla.h:619
#define SCI_SETCARETLINEVISIBLE
Definition: Scintilla.h:340
#define STYLE_LINENUMBER
Definition: Scintilla.h:198
#define SCI_CALLTIPSETFORE
Definition: Scintilla.h:487
#define SCI_SETCARETSTYLE
Definition: Scintilla.h:855
Contains the GeanyApp.
GeanyBuildCommand ** ptr
Definition: build.c:2679
void dialogs_show_msgbox_with_secondary(GtkMessageType type, const gchar *text, const gchar *secondary)
Definition: dialogs.c:753
File related dialogs, miscellaneous dialogs, font dialog.
GeanyDocument * document_get_current(void)
Finds the current document.
Definition: document.c:371
const gchar * name
Definition: document.c:3219
Document related actions: new, save, open, etc.
ScintillaObject * sci
Definition: editor.c:88
gboolean set
Definition: editor.c:84
gint pos
Definition: editor.c:87
GeanyEditorPrefs editor_prefs
Definition: editor.c:77
Editor-related functions for GeanyEditor.
#define GEANY_WORDCHARS
Default character set to define which characters should be treated as part of a word.
Definition: editor.h:40
@ GEANY_INDICATOR_SEARCH
Indicator used to highlight search results in the document.
Definition: editor.h:72
@ GEANY_INDICATOR_SNIPPET
Definition: editor.h:73
@ GEANY_INDICATOR_ERROR
Indicator to highlight errors in the document text.
Definition: editor.h:68
@ GEANY_FILETYPES_NONE
Definition: filetypes.h:46
#define filetypes
Wraps GeanyData::filetypes_array so it can be used with C array syntax.
Definition: filetypes.h:178
#define GEANY_DEFAULT_DIALOG_HEIGHT
Definition: geany.h:50
unsigned int count
tokenInfo * list
static void styleset_default(ScintillaObject *sci, guint ft_id)
Definition: highlighting.c:899
void highlighting_init_styles(guint filetype_idx, GKeyFile *config, GKeyFile *configh)
Definition: highlighting.c:970
#define GEANY_COLORSCHEMES_SUBDIR
Definition: highlighting.c:53
static guint invert(guint icolour)
Definition: highlighting.c:382
static void load_named_styles(GKeyFile *config, GKeyFile *config_home)
Definition: highlighting.c:497
gint fold_marker
Definition: highlighting.c:107
static void parse_color(GKeyFile *kf, const gchar *str, gint *clr)
Definition: highlighting.c:216
const GeanyLexerStyle * highlighting_get_style(gint ft_id, gint style_id)
Retrieves a style style_id for the filetype ft_id.
gboolean highlighting_is_string_style(gint lexer, gint style)
Checks whether the given style is a string for the given lexer.
static gboolean read_named_style(const gchar *named_style, GeanyLexerStyle *style)
Definition: highlighting.c:177
static void get_keyfile_wordchars(GKeyFile *config, GKeyFile *configh, gchar **wordchars, const gchar *default_wordchars)
Definition: highlighting.c:169
static void sci_set_property(ScintillaObject *sci, const gchar *name, const gchar *value)
Definition: highlighting.c:127
static void get_keyfile_int(GKeyFile *config, GKeyFile *configh, const gchar *section, const gchar *key, gint fdefault_val, gint sdefault_val, GeanyLexerStyle *style)
Definition: highlighting.c:333
static void new_styleset(guint file_type_id, gsize styling_count)
Definition: highlighting.c:133
static struct @94 common_style_set
static void set_character_classes(ScintillaObject *sci, guint ft_id)
Definition: highlighting.c:587
static void add_named_style(GKeyFile *config, const gchar *key)
Definition: highlighting.c:443
static gchar * whitespace_chars
Definition: highlighting.c:59
static StyleSet * style_sets
Definition: highlighting.c:73
#define init_styleset_case(LANG_NAME)
Definition: highlighting.c:960
static void free_styleset(guint file_type_id)
Definition: highlighting.c:142
static void parse_keyfile_style(GKeyFile *kf, gchar **list, const GeanyLexerStyle *default_style, GeanyLexerStyle *style)
Definition: highlighting.c:240
gboolean highlighting_is_code_style(gint lexer, gint style)
Checks whether the given style is normal code (not string, comment, preprocessor, etc).
static void styleset_common_init(GKeyFile *config, GKeyFile *config_home)
Definition: highlighting.c:542
gint fold_lines
Definition: highlighting.c:109
static void styleset_common(ScintillaObject *sci, guint ft_id)
Definition: highlighting.c:612
static GeanyLexerStyle gsd_default
Definition: highlighting.c:123
void highlighting_show_color_scheme_dialog(void)
static guint get_lexer_filetype(GeanyFiletype *ft)
Definition: highlighting.c:953
gint fold_draw_line
Definition: highlighting.c:111
static GeanyLexerStyle * get_style(guint ft_id, guint styling_index)
Definition: highlighting.c:391
static void merge_type_keywords(ScintillaObject *sci, guint ft_id, guint keyword_idx)
Definition: highlighting.c:810
static void get_key_values(GKeyFile *config, const gchar *group, gchar **keys, gchar **values)
Definition: highlighting.c:910
static void styleset_init_from_mapping(guint ft_id, GKeyFile *config, GKeyFile *config_home, const HLStyle *styles, gsize n_styles, const HLKeyword *keywords, gsize n_keywords)
Definition: highlighting.c:828
gchar * wordchars
Definition: highlighting.c:113
static gchar * utils_get_setting_locale_string(GKeyFile *keyfile, const gchar *group, const gchar *key, const gchar *default_value)
@ GCS_FOLD_SYMBOL_HIGHLIGHT
Definition: highlighting.c:84
@ GCS_INDENT_GUIDE
Definition: highlighting.c:87
@ GCS_WHITE_SPACE
Definition: highlighting.c:88
@ GCS_LINE_WRAP_VISUALS
Definition: highlighting.c:89
@ GCS_CARET
Definition: highlighting.c:86
@ GCS_MAX
Definition: highlighting.c:99
@ GCS_MARKER_LINE
Definition: highlighting.c:92
@ GCS_SELECTION
Definition: highlighting.c:79
@ GCS_BRACE_GOOD
Definition: highlighting.c:80
@ GCS_INDICATOR_ERROR
Definition: highlighting.c:98
@ GCS_LINE_HEIGHT
Definition: highlighting.c:96
@ GCS_MARGIN_LINENUMBER
Definition: highlighting.c:82
@ GCS_BRACE_BAD
Definition: highlighting.c:81
@ GCS_MARKER_SEARCH
Definition: highlighting.c:93
@ GCS_DEFAULT
Definition: highlighting.c:78
@ GCS_TRANSLUCENCY
Definition: highlighting.c:91
@ GCS_CURRENT_LINE
Definition: highlighting.c:85
@ GCS_MARKER_MARK
Definition: highlighting.c:94
@ GCS_CALLTIPS
Definition: highlighting.c:97
@ GCS_LINE_WRAP_INDENT
Definition: highlighting.c:90
@ GCS_MARKER_TRANSLUCENCY
Definition: highlighting.c:95
@ GCS_MARGIN_FOLDING
Definition: highlighting.c:83
static void on_color_scheme_changed(GtkTreeSelection *treesel, gpointer dummy)
static void set_sci_style(ScintillaObject *sci, guint style, guint ft_id, guint styling_index)
Definition: highlighting.c:410
static void get_keyfile_style(GKeyFile *config, GKeyFile *configh, const gchar *key_name, GeanyLexerStyle *style)
Definition: highlighting.c:298
static void convert_int(const gchar *int_str, gint *val)
Definition: highlighting.c:322
static void read_properties(GeanyFiletype *ft, GKeyFile *config, GKeyFile *configh)
Definition: highlighting.c:925
static void get_keyfile_ints(GKeyFile *config, GKeyFile *configh, const gchar *section, const gchar *key, gint fdefault_val, gint sdefault_val, gint *first, gint *second)
Definition: highlighting.c:367
static GKeyFile * utils_key_file_new(const gchar *filename)
Definition: highlighting.c:488
#define GEANY_WHITESPACE_CHARS
Definition: highlighting.c:56
static void add_color_scheme_file(GtkListStore *store, const gchar *fname, GtkTreeIter *current_iter)
void highlighting_set_styles(ScintillaObject *sci, GeanyFiletype *ft)
Sets up highlighting and other visual settings.
static gchar * get_keyfile_whitespace_chars(GKeyFile *config, GKeyFile *configh)
Definition: highlighting.c:436
static void on_color_scheme_dialog_response(GtkWidget *dialog, gint response, gpointer *dialog_ptr)
static GHashTable * named_style_hash
Definition: highlighting.c:120
static void styleset_from_mapping(ScintillaObject *sci, guint ft_id, guint lexer, const HLStyle *styles, gsize n_styles, const HLKeyword *keywords, gsize n_keywords, const HLProperty *properties, gsize n_properties)
Definition: highlighting.c:857
static void get_keyfile_keywords(GKeyFile *config, GKeyFile *configh, const gchar *key, guint ft_id, guint pos)
Definition: highlighting.c:161
static gboolean add_color_scheme_items(GtkListStore *store, GtkTreeIter *current_iter)
static void add_color_scheme_item(GtkListStore *store, gchar *name, gchar *desc, const gchar *fn, GtkTreeIter *current_iter)
void highlighting_free_styles(void)
Definition: highlighting.c:421
@ SCHEME_MARKUP
@ SCHEME_COLUMNS
@ SCHEME_FILE
#define styleset_case(LANG_NAME)
gboolean highlighting_is_comment_style(gint lexer, gint style)
Checks whether the given style is a comment for the given lexer.
GeanyLexerStyle styling[GCS_MAX]
Definition: highlighting.c:104
static void get_named_styles(GKeyFile *config)
Definition: highlighting.c:462
Syntax highlighting for the different filetypes, using the Scintilla lexers.
static gboolean dummy
Definition: libmain.c:115
GeanyApp * app
Definition: libmain.c:86
void geany_debug(gchar const *format,...)
Definition: log.c:67
#define NULL
Definition: rbtree.h:150
char * strstr(const char *str, const char *substr)
Definition: routines.c:304
void sci_set_keywords(ScintillaObject *sci, guint k, const gchar *text)
Definition: sciwrappers.c:1160
void sci_set_lexer(ScintillaObject *sci, guint lexer_id)
Definition: sciwrappers.c:673
Wrapper functions for the Scintilla editor widget SCI_* messages.
void filetypes_reload(void)
Definition: filetypes.c:1495
GPtrArray * filetypes_array
Definition: filetypes.c:57
void filetypes_load_config(guint ft_id, gboolean reload)
Definition: filetypes.c:1089
StashGroup * group
Definition: stash-example.c:1
const gchar filename[]
Definition: stash-example.c:4
GtkWidget * dialog
gtk_container_add(GTK_CONTAINER(dialog->vbox), check_button)
gtk_widget_show_all(dialog)
gchar * configdir
User configuration directory, usually ~/.config/geany.
Definition: app.h:45
gchar * datadir
Definition: app.h:46
Structure for representing an open tab with all its properties.
Definition: document.h:81
GeanyFiletype * file_type
The filetype for this document, it's only a reference to one of the elements of the global filetypes ...
Definition: document.h:101
gchar * color_scheme
Definition: editor.h:135
Represents a filetype.
Definition: filetypes.h:144
gchar * name
Untranslated short name, such as "C", "None".
Definition: filetypes.h:152
GeanyFiletypeID id
Index in filetypes.
Definition: filetypes.h:145
struct GeanyFiletypePrivate * priv
Definition: filetypes.h:171
struct GeanyFiletype * lexer_filetype
Definition: filetypes.h:163
gboolean highlighting_invert_all
whether highlighting colors are inverted
Definition: ui_utils.h:60
Fields representing the different attributes of a Scintilla lexer style.
Definition: highlighting.h:39
gboolean bold
Bold.
Definition: highlighting.h:42
gint foreground
Foreground text colour, in 0xBBGGRR format.
Definition: highlighting.h:40
gboolean italic
Italic.
Definition: highlighting.h:43
gint background
Background text colour, in 0xBBGGRR format.
Definition: highlighting.h:41
GtkWidget * window
Main window.
Definition: ui_utils.h:80
gsize count
Definition: highlighting.c:64
GeanyLexerStyle * styling
Definition: highlighting.c:65
gchar ** property_keys
Definition: highlighting.c:68
gchar ** property_values
Definition: highlighting.c:69
gchar ** keywords
Definition: highlighting.c:66
gchar * wordchars
Definition: highlighting.c:67
Defines internationalization macros.
#define _(String)
Definition: support.h:42
GString * symbols_find_typenames_as_string(TMParserType lang, gboolean global)
Definition: symbols.c:206
Tag-related functions.
#define FALLBACK(X, Y)
static GPtrArray * merge(GPtrArray *big_array, GPtrArray *small_array, TMSortOptions *sort_options, gboolean unref_duplicates)
Definition: tm_tag.c:380
GtkWidget * ui_dialog_vbox_new(GtkDialog *dialog)
Makes a fixed border for dialogs without increasing the button box border.
Definition: ui_utils.c:1499
GeanyMainWidgets main_widgets
Definition: ui_utils.c:72
void ui_set_statusbar(gboolean log, const gchar *format,...)
Displays text on the statusbar.
Definition: ui_utils.c:168
GeanyInterfacePrefs interface_prefs
Definition: ui_utils.c:71
User Interface general utility functions.
GSList * utils_get_config_files(const gchar *subdir)
Definition: utils.c:1867
gchar * utils_get_utf8_from_locale(const gchar *locale_text)
Converts the given string (in locale encoding) into UTF-8 encoding.
Definition: utils.c:1272
gchar ** utils_strv_join(gchar **first, gchar **second)
Definition: utils.c:2021
gint utils_parse_color_to_bgr(const gchar *spec)
Definition: utils.c:1005
gboolean utils_str_equal(const gchar *a, const gchar *b)
NULL-safe string comparison.
Definition: utils.c:599
gboolean utils_atob(const gchar *str)
Definition: utils.c:421
gchar * utils_get_locale_from_utf8(const gchar *utf8_text)
Converts the given UTF-8 encoded string into locale encoding.
Definition: utils.c:1243
General utility functions, non-GTK related.
#define foreach_slist(node, list)
Iterates all the nodes in list.
Definition: utils.h:121
#define foreach_strv(str_ptr, strv)
Iterates a null-terminated string vector.
Definition: utils.h:152
#define SETPTR(ptr, result)
Assigns result to ptr, then frees the old value.
Definition: utils.h:50
#define EMPTY(ptr)
Returns TRUE if ptr is NULL or *ptr is FALSE.
Definition: utils.h:38
#define utils_strdupa(str)
Duplicates a string on the stack using g_alloca().
Definition: utils.h:72
#define foreach_range(i, size)
Iterates from 0 to size.
Definition: utils.h:159
#define utils_get_setting(type, home, sys, group, key, default_val)
Definition: utils.h:77