53#include <glib/gstdio.h>
55#define GEANY_FILETYPE_SEARCH_LINES 2
91 default:
return g_strdup(
name);
99 const char *title_name,
enum TitleType title_type,
106 ft->
group = group_id;
110#define FT_INIT(ft_id, parser_id, name, title_name, title_type, group_id) \
111 ft_init(GEANY_FILETYPES_##ft_id, TM_PARSER_##parser_id, name, title_name, \
112 TITLE_##title_type, GEANY_FILETYPE_GROUP_##group_id)
129 FT_INIT( CPP, CPP,
"C++",
NULL, SOURCE_FILE, COMPILED );
130 FT_INIT( OBJECTIVEC, OBJC,
"Objective-C",
NULL, SOURCE_FILE, COMPILED );
131 FT_INIT( CS, CSHARP,
"C#",
NULL, SOURCE_FILE, COMPILED );
132 FT_INIT( VALA, VALA,
"Vala",
NULL, SOURCE_FILE, COMPILED );
134 FT_INIT( JAVA, JAVA,
"Java",
NULL, SOURCE_FILE, COMPILED );
135 FT_INIT( PASCAL, PASCAL,
"Pascal",
NULL, SOURCE_FILE, COMPILED );
136 FT_INIT( ASM, ASM,
"ASM",
"Assembler", SOURCE_FILE, COMPILED );
137 FT_INIT( BASIC, FREEBASIC,
"FreeBasic",
NULL, SOURCE_FILE, COMPILED );
138 FT_INIT( FORTRAN, FORTRAN,
"Fortran",
"Fortran (F90)", SOURCE_FILE, COMPILED );
139 FT_INIT( F77, F77,
"F77",
"Fortran (F77)", SOURCE_FILE, COMPILED );
140 FT_INIT( GLSL, GLSL,
"GLSL",
NULL, SOURCE_FILE, COMPILED );
141 FT_INIT( CAML,
NONE,
"CAML",
"(O)Caml", SOURCE_FILE, COMPILED );
142 FT_INIT( PERL, PERL,
"Perl",
NULL, SOURCE_FILE, SCRIPT );
143 FT_INIT( PHP, PHP,
"PHP",
NULL, SOURCE_FILE, SCRIPT );
144 FT_INIT( JS, JAVASCRIPT,
"Javascript",
NULL, SOURCE_FILE, SCRIPT );
145 FT_INIT( PYTHON, PYTHON,
"Python",
NULL, SOURCE_FILE, SCRIPT );
146 FT_INIT( RUBY, RUBY,
"Ruby",
NULL, SOURCE_FILE, SCRIPT );
147 FT_INIT( TCL, TCL,
"Tcl",
NULL, SOURCE_FILE, SCRIPT );
148 FT_INIT( LUA, LUA,
"Lua",
NULL, SOURCE_FILE, SCRIPT );
149 FT_INIT( FERITE, FERITE,
"Ferite",
NULL, SOURCE_FILE, SCRIPT );
150 FT_INIT( HASKELL, HASKELL,
"Haskell",
NULL, SOURCE_FILE, COMPILED );
151 FT_INIT( MARKDOWN, MARKDOWN,
"Markdown",
NULL, SOURCE_FILE, MARKUP );
152 FT_INIT( TXT2TAGS, TXT2TAGS,
"Txt2tags",
NULL, SOURCE_FILE, MARKUP );
154 FT_INIT( SH, SH,
"Sh",
_(
"Shell"), SCRIPT, SCRIPT );
155 FT_INIT( MAKE, MAKEFILE,
"Make",
_(
"Makefile"),
NONE, SCRIPT );
157 FT_INIT( DOCBOOK, DOCBOOK,
"Docbook",
NULL, DOCUMENT, MARKUP );
158 FT_INIT( HTML, HTML,
"HTML",
NULL, DOCUMENT, MARKUP );
159 FT_INIT( CSS, CSS,
"CSS",
_(
"Cascading Stylesheet"),
NONE, MARKUP );
161 FT_INIT( COBOL, COBOL,
"COBOL",
NULL, SOURCE_FILE, COMPILED );
162 FT_INIT( LATEX, LATEX,
"LaTeX",
NULL, SOURCE_FILE, MARKUP );
163 FT_INIT( BIBTEX, BIBTEX,
"BibTeX",
NULL, SOURCE_FILE, MARKUP );
164 FT_INIT( VHDL, VHDL,
"VHDL",
NULL, SOURCE_FILE, COMPILED );
165 FT_INIT( VERILOG, VERILOG,
"Verilog",
NULL, SOURCE_FILE, COMPILED );
168 FT_INIT( ERLANG, ERLANG,
"Erlang",
NULL, SOURCE_FILE, COMPILED );
169 FT_INIT( CONF, CONF,
"Conf",
_(
"Config"), FILE, MISC );
170 FT_INIT( PO,
NONE,
"Po",
_(
"Gettext translation"), FILE, MISC );
171 FT_INIT( HAXE, HAXE,
"Haxe",
NULL, SOURCE_FILE, COMPILED );
172 FT_INIT( AS, ACTIONSCRIPT,
"ActionScript",
NULL, SOURCE_FILE, SCRIPT );
174 FT_INIT( REST, REST,
"reStructuredText",
NULL, SOURCE_FILE, MARKUP );
175 FT_INIT( MATLAB, MATLAB,
"Matlab/Octave",
NULL, SOURCE_FILE, SCRIPT );
178 FT_INIT( NSIS, NSIS,
"NSIS",
NULL, SOURCE_FILE, SCRIPT );
181 FT_INIT( ASCIIDOC, ASCIIDOC,
"Asciidoc",
NULL, SOURCE_FILE, MARKUP );
182 FT_INIT( ABAQUS, ABAQUS,
"Abaqus",
NULL, SOURCE_FILE, SCRIPT );
184 FT_INIT( POWERSHELL, POWERSHELL,
"PowerShell",
NULL, SOURCE_FILE, SCRIPT );
185 FT_INIT( RUST, RUST,
"Rust",
NULL, SOURCE_FILE, COMPILED );
186 FT_INIT( COFFEESCRIPT,
NONE,
"CoffeeScript",
NULL, SOURCE_FILE, SCRIPT );
187 FT_INIT( GO, GO,
"Go",
NULL, SOURCE_FILE, COMPILED );
188 FT_INIT( ZEPHIR, ZEPHIR,
"Zephir",
NULL, SOURCE_FILE, COMPILED );
190 FT_INIT( JULIA, JULIA,
"Julia",
NULL, SOURCE_FILE, SCRIPT );
200 ft->
lang = TM_PARSER_NONE;
202 ft->
pattern = g_new0(gchar*, 1);
213static gint
cmp_filetype(gconstpointer pft1, gconstpointer pft2, gpointer data)
215 gboolean by_name = GPOINTER_TO_INT(data);
253 g_return_if_fail(ft);
254 g_return_if_fail(ft->
name);
268 gchar *dot = g_strrstr(fn,
".conf");
271 g_return_if_fail(dot);
279 ft->
name = g_strdup(fn);
292 g_return_if_fail(path);
294 dir = g_dir_open(path, 0,
NULL);
300 const gchar prefix[] =
"filetypes.";
302 if (g_str_has_prefix(
filename, prefix) &&
303 g_str_has_suffix(
filename + strlen(prefix),
".conf"))
363 basename = g_path_get_basename(doc->
real_path);
364 if (g_str_has_prefix(basename,
"filetypes."))
412 GtkWidget *menu, *item;
414 menu = gtk_menu_new();
415 item = gtk_menu_item_new_with_mnemonic((title));
416 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), menu);
418 gtk_widget_show(item);
430 menu = config ?
ui_widgets.config_files_filetype_menu :
478 if (g_pattern_match_simple(pat, base_filename))
491 gboolean found = FALSE;
495 lfn = g_utf8_strdown(utf8_filename, -1);
497 lfn = g_strdup(utf8_filename);
502 if (g_str_has_prefix(lfn, path))
506 if (g_str_has_prefix(lfn, path))
519 gchar *base_filename;
528 base_filename = g_path_get_basename(utf8_filename);
531 SETPTR(base_filename, g_utf8_strdown(base_filename, -1));
552 g_free(base_filename);
565 gboolean result = FALSE;
572 va_start(args, first);
579 if (ft->
id == (guint) test)
584 test = va_arg(args, gint);
596 if (strlen(
line) > 2 &&
line[0] ==
'#' &&
line[1] ==
'!')
598 static const struct {
601 } intepreter_map[] = {
622 gchar *tmp = g_path_get_basename(
line + 2);
623 gchar *basename_interpreter = tmp;
626 if (g_str_has_prefix(tmp,
"env "))
628 basename_interpreter += 4;
631 for (i = 0; ! ft && i < G_N_ELEMENTS(intepreter_map); i++)
633 if (g_str_has_prefix(basename_interpreter, intepreter_map[i].
name))
634 ft =
filetypes[intepreter_map[i].filetype];
639 if (g_str_has_prefix(
line,
"<!DOCTYPE html") || g_str_has_prefix(
line,
"<html"))
650 else if (utf8_filename && g_str_has_prefix(
line,
"<?xml"))
662 else if (g_str_has_prefix(
line,
"<?php"))
679 GError *regex_error =
NULL;
689 G_REGEX_RAW | G_REGEX_MULTILINE, 0, ®ex_error);
690 if (ft_regex !=
NULL)
694 if (g_regex_match(ft_regex,
lines[i], 0, &
match))
696 gchar *capture = g_match_info_fetch(
match, 1);
703 g_match_info_free(
match);
705 g_regex_unref(ft_regex);
707 else if (regex_error !=
NULL)
709 geany_debug(
"Filetype extract regex ignored: %s", regex_error->message);
710 g_error_free(regex_error);
715 if (utf8_filename ==
NULL)
766 f = g_fopen(locale_name,
"r");
792 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(ft->
priv->
menu_item), TRUE);
812 tmp = gtk_radio_menu_item_new_with_label(
group, ftype->
title);
813 group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(tmp));
815 gtk_widget_show(tmp);
825 g_return_if_fail(ft !=
NULL);
840 g_object_unref(ft->
icon);
879 g_warning(
"Invalid indent type %d in file type %s", ft->
indent_type, ft->
name);
899 result =
utils_get_setting(
string, configh, config,
"settings",
"mime_type",
"text/plain");
928 "settings",
"comment_use_indent", FALSE);
941 if (ft->
lang == TM_PARSER_NONE)
942 geany_debug(
"Cannot find tags parser '%s' for custom filetype '%s'.", result, ft->
name);
951 geany_debug(
"Cannot find lexer filetype '%s' for custom filetype '%s'.", result, ft->
name);
956 "symbol_list_sort_mode", SYMBOLS_SORT_USE_PREVIOUS);
958 "xml_indent_tags", FALSE);
969static void copy_keys(GKeyFile *dest,
const gchar *dest_group,
970 GKeyFile *src,
const gchar *src_group)
972 gchar **keys = g_key_file_get_keys(src, src_group,
NULL,
NULL);
978 gchar *value = g_key_file_get_value(src, src_group, key,
NULL);
980 g_key_file_set_value(dest, dest_group, key, value);
990 gchar *base_name = g_strconcat(
"filetypes.", ext,
NULL);
1014 for (i = 0; i < G_N_ELEMENTS(
files); i++)
1016 GKeyFile *src = g_key_file_new();
1018 if (g_key_file_load_from_file(src,
files[i], G_KEY_FILE_NONE,
NULL))
1023 g_key_file_free(src);
1036 gchar **
groups = g_key_file_get_groups(kf,
NULL);
1043 gchar *
name = strchr(*
ptr,
'=');
1049 old_group = g_strdup(
group);
1073 gboolean done = g_key_file_load_from_file(key_file, file, flags, &
error);
1080 g_error_free(
error);
1091 GKeyFile *config, *config_home;
1095 g_return_if_fail(ft_id < filetypes_array->len);
1109 config = g_key_file_new();
1110 config_home = g_key_file_new();
1119 g_key_file_load_from_file(config_home, f, G_KEY_FILE_KEEP_COMMENTS,
NULL);
1130 g_object_unref(ft->
icon);
1133 g_key_file_free(config);
1134 g_key_file_free(config_home);
1143 return g_strconcat(ft->
name,
".conf",
NULL);
1157 result = g_ascii_strdown(ft->
name, -1);
1166 GKeyFile *config_home;
1167 gchar *fname, *data;
1170 config_home = g_key_file_new();
1171 g_key_file_load_from_file(config_home, fname, G_KEY_FILE_KEEP_COMMENTS,
NULL);
1173 data = g_key_file_to_data(config_home,
NULL,
NULL);
1176 g_key_file_free(config_home);
1184 GtkFileFilter *new_filter;
1187 new_filter = gtk_file_filter_new();
1188 gtk_file_filter_set_name(new_filter,
_(
"All Source"));
1195 for (j = 0;
filetypes[i]->pattern[j]; j++)
1197 gtk_file_filter_add_pattern(new_filter,
filetypes[i]->pattern[j]);
1206 GtkFileFilter *new_filter;
1210 g_return_val_if_fail(ft !=
NULL,
NULL);
1212 new_filter = gtk_file_filter_new();
1214 gtk_file_filter_set_name(new_filter, title);
1216 for (i = 0; ft->
pattern[i]; i++)
1218 gtk_file_filter_add_pattern(new_filter, ft->
pattern[i]);
1229 g_return_val_if_fail(ft !=
NULL, FALSE);
1231 return ft->
lang != TM_PARSER_NONE;
1249 if (G_UNLIKELY(ft ==
NULL))
1258 GRegex *regex = g_regex_new(regstr, 0, 0, &
error);
1264 g_error_free(
error);
1279 gint i, n_match_groups;
1280 gchar *first, *second;
1296 if (G_UNLIKELY(
EMPTY(regstr)))
1309 g_match_info_free(minfo);
1313 n_match_groups = g_match_info_get_match_count(minfo);
1314 first = second =
NULL;
1316 for (i = 1; i < n_match_groups; i++)
1320 g_match_info_fetch_pos(minfo, i, &start_pos,
NULL);
1321 if (start_pos != -1)
1324 first = g_match_info_fetch(minfo, i);
1327 second = g_match_info_fetch(minfo, i);
1338 l = strtol(first, &end, 10);
1347 l = strtol(second, &end, 10);
1364 g_match_info_free(minfo);
1370static void convert_filetype_extensions_to_lower_case(gchar **patterns, gsize len)
1373 for (i = 0; i < len; i++)
1375 SETPTR(patterns[i], g_ascii_strdown(patterns[i], -1));
1391 gchar **
list = g_key_file_get_string_list(
1392 (userset) ? userconfig : sysconfig,
"Extensions",
filetypes[i]->
name, &len,
NULL);
1394 filetypes[i]->priv->user_extensions = userset;
1398 list = g_new0(gchar*, 1);
1402 convert_filetype_extensions_to_lower_case(
filetypes[i]->pattern, len);
1410 gchar **names = g_key_file_get_string_list(config,
"Groups", group_name,
NULL,
NULL);
1419 ft->
group = group_id;
1427 geany_debug(
"Filetype '%s' not found for group '%s'!", *
name, group_name);
1445 gchar *sysconfigfile = g_build_filename(
app->
datadir,
"filetype_extensions.conf",
NULL);
1446 gchar *userconfigfile = g_build_filename(
app->
configdir,
"filetype_extensions.conf",
NULL);
1447 GKeyFile *sysconfig = g_key_file_new();
1448 GKeyFile *userconfig = g_key_file_new();
1450 g_key_file_load_from_file(sysconfig, sysconfigfile, G_KEY_FILE_NONE,
NULL);
1451 g_key_file_load_from_file(userconfig, userconfigfile, G_KEY_FILE_NONE,
NULL);
1457 g_free(sysconfigfile);
1458 g_free(userconfigfile);
1459 g_key_file_free(sysconfig);
1460 g_key_file_free(userconfig);
1537 const gchar **co,
const gchar **cc)
1539 g_return_val_if_fail(ft !=
NULL, FALSE);
1540 g_return_val_if_fail(co !=
NULL, FALSE);
1541 g_return_val_if_fail(cc !=
NULL, FALSE);
1569static void *
copy_(
void *src) {
return src; }
GeanyBuildInfo build_info
void build_save_menu(GKeyFile *config, gpointer ptr, GeanyBuildSource src)
void build_load_menu(GKeyFile *config, GeanyBuildSource src, gpointer p)
static const gchar * groups[GEANY_GBG_COUNT]
gchar ** build_get_regex(GeanyBuildGroup grp, GeanyFiletype *ft, guint *from)
@ GEANY_BCS_FT
System filetype values.
@ GEANY_BCS_HOME_FT
Filetypes in ~/.config/geany/filedefs.
GeanyDocument * document_get_current(void)
Finds the current document.
void document_set_filetype(GeanyDocument *doc, GeanyFiletype *type)
Sets the filetype of the document (which controls syntax highlighting and tags)
GeanyFilePrefs file_prefs
void document_reload_config(GeanyDocument *doc)
Document related actions: new, save, open, etc.
#define documents
Wraps GeanyData::documents_array so it can be used with C array syntax.
#define foreach_document(i)
Iterates all valid document indexes.
@ GEANY_INDENT_TYPE_BOTH
Both.
@ GEANY_INDENT_TYPE_TABS
Tabs.
@ GEANY_INDENT_TYPE_SPACES
Spaces.
void error(const errorSelection selection, const char *const format,...)
currently not working see documentation comment_single
Filetype detection, file extensions and filetype menu items.
GeanyFiletypeID
IDs of known filetypes.
@ GEANY_MAX_BUILT_IN_FILETYPES
@ GEANY_FILETYPES_DOCBOOK
@ GEANY_FILETYPES_OBJECTIVEC
#define filetypes
Wraps GeanyData::filetypes_array so it can be used with C array syntax.
@ GEANY_FILETYPE_GROUP_MISC
@ GEANY_FILETYPE_GROUP_COUNT
@ GEANY_FILETYPE_GROUP_MARKUP
@ GEANY_FILETYPE_GROUP_SCRIPT
@ GEANY_FILETYPE_GROUP_NONE
@ GEANY_FILETYPE_GROUP_COMPILED
#define GEANY_FILEDEFS_SUBDIR
static bool match(const unsigned char *line, const char *word)
void highlighting_init_styles(guint filetype_idx, GKeyFile *config, GKeyFile *configh)
Syntax highlighting for the different filetypes, using the Scintilla lexers.
void geany_debug(gchar const *format,...)
char * strstr(const char *str, const char *substr)
gchar * sci_get_line(ScintillaObject *sci, gint line_num)
Gets line contents.
Wrapper functions for the Scintilla editor widget SCI_* messages.
static void create_radio_menu_item(GtkWidget *menu, GeanyFiletype *ftype)
GeanyFiletype * filetypes_detect_from_file(const gchar *utf8_filename)
Detects filetype based on a shebang line in the file or the filename extension.
void filetypes_reload(void)
const GSList * filetypes_get_sorted_by_name(void)
Gets a list of filetype pointers sorted by name.
static GeanyFiletype * filetype_new(void)
static void filetype_add(GeanyFiletype *ft)
static GeanyFiletype * detect_filetype_conf_file(const gchar *utf8_filename)
#define FT_INIT(ft_id, parser_id, name, title_name, title_type, group_id)
static void init_builtin_filetypes(void)
void filetypes_select_radio_item(const GeanyFiletype *ft)
GeanyFiletype * filetypes_index(gint idx)
Accessor function for GeanyData::filetypes_array items.
static void create_set_filetype_menu(gboolean config)
static void load_settings(guint ft_id, GKeyFile *config, GKeyFile *configh)
gboolean filetypes_parse_error_message(GeanyFiletype *ft, const gchar *message, gchar **filename, gint *line)
G_DEFINE_BOXED_TYPE(GeanyFiletype, filetype, copy_, free_)
static gchar * filetypes_get_conf_extension(const GeanyFiletype *ft)
void filetypes_init_types(void)
void filetypes_reload_extensions(void)
static void compile_regex(GeanyFiletype *ft, gchar *regstr)
static guint match_basename(const GeanyFiletype *ft, const gchar *base_filename)
static gboolean shebang_find_and_match_filetype(const gchar *utf8_filename, gint first,...)
static GeanyFiletype * filetypes_detect_from_file_internal(const gchar *utf8_filename, gchar **lines)
void filetypes_init(void)
static void on_document_save(G_GNUC_UNUSED GObject *object, GeanyDocument *doc)
static void * copy_(void *src)
static void free_(void *doc)
static void copy_ft_groups(GKeyFile *kf)
static void load_system_keyfile(GKeyFile *key_file, const gchar *file, GKeyFileFlags flags, GeanyFiletype *ft)
GSList * filetypes_by_title
void filetypes_save_commands(GeanyFiletype *ft)
static void filetype_free(gpointer data, G_GNUC_UNUSED gpointer user_data)
GeanyFiletype * filetypes_detect_from_extension(const gchar *utf8_filename)
static void read_filetype_config(void)
#define GEANY_FILETYPE_SEARCH_LINES
GPtrArray * filetypes_array
static void read_groups(GKeyFile *config)
static void setup_config_file_menus(void)
static GtkWidget * create_sub_menu(GtkWidget *parent, const gchar *title)
static void load_indent_settings(GeanyFiletype *ft, GKeyFile *config, GKeyFile *configh)
static void ft_init(GeanyFiletypeID ft_id, TMParserType lang, const char *name, const char *title_name, enum TitleType title_type, GeanyFiletypeGroupID group_id)
static void copy_keys(GKeyFile *dest, const gchar *dest_group, GKeyFile *src, const gchar *src_group)
GtkFileFilter * filetypes_create_file_filter(const GeanyFiletype *ft)
void filetypes_free_types(void)
const gchar * filetypes_get_display_name(GeanyFiletype *ft)
Gets ft->name or a translation for filetype None.
static gint cmp_filetype(gconstpointer pft1, gconstpointer pft2, gpointer data)
static void on_filetype_change(GtkCheckMenuItem *menuitem, gpointer user_data)
static void init_custom_filetypes(const gchar *path)
static gchar * filetype_make_title(const char *name, enum TitleType type)
GtkFileFilter * filetypes_create_file_filter_all_source(void)
static void add_custom_filetype(const gchar *filename)
static GHashTable * filetypes_hash
static void read_extensions(GKeyFile *sysconfig, GKeyFile *userconfig)
gboolean filetype_has_tags(GeanyFiletype *ft)
void filetypes_load_config(guint ft_id, gboolean reload)
GType filetype_get_type(void)
static void read_group(GKeyFile *config, const gchar *group_name, GeanyFiletypeGroupID group_id)
GeanyFiletype * filetypes_lookup_by_name(const gchar *name)
Finds a filetype pointer from its name field.
static gchar * filetypes_get_filename(GeanyFiletype *ft, gboolean user)
static GeanyFiletype * find_shebang(const gchar *utf8_filename, const gchar *line)
gboolean filetype_get_comment_open_close(const GeanyFiletype *ft, gboolean single_first, const gchar **co, const gchar **cc)
GeanyFiletype * filetypes_detect_from_document(GeanyDocument *doc)
static void add_group_keys(GKeyFile *kf, const gchar *group, GeanyFiletype *ft)
if(!stash_group_load_from_file(group, filename)) g_warning(_("Could not load keyfile %s!")
gtk_container_add(GTK_CONTAINER(dialog->vbox), check_button)
gchar * configdir
User configuration directory, usually ~/.config/geany.
Structure for representing an open tab with all its properties.
gchar * file_name
The UTF-8 encoded file name.
GeanyFiletype * file_type
The filetype for this document, it's only a reference to one of the elements of the global filetypes ...
gchar * real_path
The link-dereferenced, locale-encoded file name.
gboolean is_valid
Flag used to check if this document is valid when iterating GeanyData::documents_array.
GeanyEditor * editor
The editor associated with the document.
ScintillaObject * sci
The Scintilla editor GtkWidget.
gchar * extract_filetype_regex
gchar * last_error_pattern
GeanyBuildCommand * ftdefcmds
gint symbol_list_sort_mode
GeanyBuildCommand * filecmds
GeanyBuildCommand * execcmds
gchar * name
Untranslated short name, such as "C", "None".
GeanyFiletypeID id
Index in filetypes.
GeanyFiletypeGroupID group
gchar * context_action_cmd
gchar * error_regex_string
gchar * title
Shown in the file open dialog, such as "C source file".
struct GeanyFiletypePrivate * priv
struct GeanyFiletype * lexer_filetype
gchar * extension
Default file extension for new files, or NULL.
gchar ** pattern
Array of filename-matching wildcard strings.
GtkWidget * window
Main window.
Defines internationalization macros.
TMParserType tm_source_file_get_named_lang(const gchar *name)
GIcon * ui_get_mime_icon(const gchar *mime_type)
GeanyMainWidgets main_widgets
void ui_set_statusbar(gboolean log, const gchar *format,...)
Displays text on the statusbar.
void ui_add_config_file_menu_item(const gchar *real_path, const gchar *label, GtkContainer *parent)
GtkWidget * ui_lookup_widget(GtkWidget *widget, const gchar *widget_name)
Returns a widget from a name in a component, usually created by Glade.
User Interface general utility functions.
gint utils_write_file(const gchar *filename, const gchar *text)
Writes text into a file named filename.
gint utils_str_casecmp(const gchar *s1, const gchar *s2)
A replacement function for g_strncasecmp() to compare strings case-insensitive.
gboolean utils_str_equal(const gchar *a, const gchar *b)
NULL-safe string comparison.
gchar * utils_get_locale_from_utf8(const gchar *utf8_text)
Converts the given UTF-8 encoded string into locale encoding.
General utility functions, non-GTK related.
#define foreach_slist(node, list)
Iterates all the nodes in list.
#define foreach_strv(str_ptr, strv)
Iterates a null-terminated string vector.
#define SETPTR(ptr, result)
Assigns result to ptr, then frees the old value.
#define foreach_dir(filename, dir)
Iterates through each unsorted filename in a GDir.
#define EMPTY(ptr)
Returns TRUE if ptr is NULL or *ptr is FALSE.
#define utils_strdupa(str)
Duplicates a string on the stack using g_alloca().
#define utils_get_setting(type, home, sys, group, key, default_val)