56#ifdef HAVE_SYS_TYPES_H
57# include <sys/types.h>
60#include <glib/gstdio.h>
78 g_return_if_fail(uri !=
NULL);
79 win32_open_browser(uri);
81 gchar *argv[2] = { (gchar *) uri,
NULL };
83 g_return_if_fail(uri !=
NULL);
88 _(
"Failed to spawn the configured browser command. "
89 "Please correct it or enter another one."),
105 guint cr, lf, crlf, max_mode;
110 for (i = 0; i < size ; i++)
112 if (buffer[i] == 0x0a)
117 else if (buffer[i] == 0x0d)
126 if (buffer[i + 1] != 0x0a)
165 return include_angles;
172 case ']':
return TRUE;
173 default:
return FALSE;
183 return include_angles;
187 case '[':
return TRUE;
188 default:
return FALSE;
212 g_return_val_if_fail(
text !=
NULL, EINVAL);
227 gsize bytes_written, len;
228 gboolean fail = FALSE;
240 bytes_written = fwrite(
text,
sizeof(gchar), len, fp);
242 if (len != bytes_written)
246 "utils_write_file(): written only %"G_GSIZE_FORMAT
" bytes, had to write %"G_GSIZE_FORMAT
" bytes to %s",
254 geany_debug(
"utils_write_file(): could not write to file %s (%s)",
271 const gchar *cur, *begin;
280 while (strchr(
":_-.", *cur) || isalnum(*cur))
283 len = (gsize)(cur - begin);
284 return len ? g_strndup(begin, len) :
NULL;
297 const gchar *begin, *cur;
299 if (G_UNLIKELY(size < 3))
304 cur = &sel[size - 1];
315 while (cur > begin && isspace(*cur))
324 else if (*cur ==
'>')
330 if (*cur ==
'<' && *(cur + 1) !=
'/' && *(cur + 1) !=
'>')
340 const gchar names[][20] = {
363 if (bsearch(tag_name, names, G_N_ELEMENTS(names), 20,
364 (GCompareFunc)g_ascii_strcasecmp))
376 case SC_EOL_CR:
return _(
"Classic Mac (CR)");
break;
377 default:
return _(
"Unix (LF)");
break;
388 default:
return _(
"LF");
break;
399 default:
return "\n";
break;
423 if (G_UNLIKELY(str ==
NULL))
425 else if (strcmp(str,
"TRUE") == 0 || strcmp(str,
"true") == 0)
434 if (G_UNLIKELY(
EMPTY(path)))
437 return g_path_is_absolute(path);
446 const gchar *path_relative;
448 path_relative = g_path_skip_root(path);
450 return (path_relative !=
NULL) ? path_relative : path;
461 val = floor(val * factor + 0.5);
463 val = MIN(val, factor);
475 if (g_utf8_validate(str, -1,
NULL))
476 down = g_utf8_strdown(str, -1);
481 SETPTR(down, g_utf8_strdown(down, -1));
511 g_return_val_if_fail(s1 !=
NULL, 1);
512 g_return_val_if_fail(s2 !=
NULL, -1);
526 result = strcmp(tmp1, tmp2);
554 guint num_left_chars;
556 guint delimiter_length;
557 const gchar *delimiter =
"\342\200\246";
559 g_return_val_if_fail(
string !=
NULL,
NULL);
561 length = strlen(
string);
563 g_return_val_if_fail(g_utf8_validate(
string, length,
NULL),
NULL);
567 delimiter_length = g_utf8_strlen(delimiter, -1);
568 if (truncate_length < (delimiter_length + 2))
569 return g_strdup(
string);
571 n_chars = g_utf8_strlen(
string, length);
574 if (n_chars <= truncate_length)
575 return g_strdup (
string);
578 num_left_chars = (truncate_length - delimiter_length) / 2;
579 right_offset = n_chars - truncate_length + num_left_chars + delimiter_length;
581 truncated = g_string_new_len(
string, g_utf8_offset_to_pointer(
string, num_left_chars) -
string);
582 g_string_append(truncated, delimiter);
583 g_string_append(truncated, g_utf8_offset_to_pointer(
string, right_offset));
585 return g_string_free(truncated, FALSE);
602 if (a ==
NULL && b ==
NULL)
return TRUE;
603 else if (a ==
NULL || b ==
NULL)
return FALSE;
605 return strcmp(a, b) == 0;
629 len = (gsize) (last_dot -
filename);
630 result = g_malloc(len + 1);
642 case '(':
return ')';
643 case ')':
return '(';
644 case '[':
return ']';
645 case ']':
return '[';
646 case '{':
return '}';
647 case '}':
return '{';
648 case '<':
return '>';
649 case '>':
return '<';
650 default:
return '\0';
662 if (! g_file_test(locale_filename, G_FILE_TEST_EXISTS) &&
663 ! g_file_test(locale_filename, G_FILE_TEST_IS_DIR))
665 file = g_path_get_dirname(locale_filename);
667 file = g_strdup(locale_filename);
671 ret = win32_check_write_permission(file);
676 if (
access(file, R_OK | W_OK) != 0)
696 g_return_if_fail(*haystack !=
NULL);
698 str = g_string_new(*haystack);
703 *haystack = g_string_free(str, FALSE);
714 sub =
strstr(haystack, needle);
718 return sub - haystack;
739 static gchar date[1024];
740 gchar *locale_format;
748 if (locale_format ==
NULL)
752 locale_format = g_strdup(
format);
754 if (time_to_use !=
NULL)
755 tm = localtime(time_to_use);
758 time_t tp = time(
NULL);
762 len = strftime(date, 1024, locale_format, tm);
763 g_free(locale_format);
767 if (! g_utf8_validate(date, len,
NULL))
770 return g_strdup(date);
777 gchar *initials = g_malloc0(5);
779 initials[0] =
name[0];
780 while (
name[i] !=
'\0' && j < 4)
782 if (
name[i] ==
' ' &&
name[i + 1] !=
' ')
784 initials[j++] =
name[i + 1];
806 const gint default_value)
811 g_return_val_if_fail(config, default_value);
813 tmp = g_key_file_get_integer(config, section, key, &
error);
817 return default_value;
837 const gboolean default_value)
842 g_return_val_if_fail(config, default_value);
844 tmp = g_key_file_get_boolean(config, section, key, &
error);
848 return default_value;
868 const gchar *default_value)
872 g_return_val_if_fail(config, g_strdup(default_value));
874 tmp = g_key_file_get_string(config, section, key,
NULL);
877 return g_strdup(default_value);
887 return g_strdup_printf(
"#%02X%02X%02X",
906 if (cur_fname !=
NULL)
909 return g_path_get_dirname(cur_fname);
930 static const gchar zero_and_units[] = {
'0', 0,
'K',
'M',
'G',
'T' };
931 static const gchar fmt[] =
"%Lu %c%c";
932 static const gchar fmt_tenths[] =
"%Lu.%d %c%c";
943 val = size * block_size;
949 val += display_unit/2;
955 while ((val >= 1024) && (u < zero_and_units +
sizeof(zero_and_units) - 1))
959 frac = ((((gint)(val % 1024)) * 10) + (1024 / 2)) / 1024;
970 return g_strdup_printf(f, val, frac, *u,
'b');
980 g_return_val_if_fail(spec !=
NULL, -1);
982 if (spec[0] ==
'0' && (spec[1] ==
'x' || spec[1] ==
'X'))
986 strncpy(buf + 1, spec + 2,
sizeof(buf) - 2);
990 return gdk_color_parse(spec,
color);
998 g_return_val_if_fail(c !=
NULL, -1);
999 return (c->red / 256) | ((c->green / 256) << 8) | ((c->blue / 256) << 16);
1021 GDateTime *now = g_date_time_new_now_local();
1022 const gchar *
format = include_microseconds ?
"%H:%M:%S.%f" :
"%H:%M:%S";
1023 gchar *time_string = g_date_time_format(now,
format);
1024 g_date_time_unref(now);
1030 gint fd, GIOCondition cond, gboolean nblock, GIOFunc func, gpointer data)
1036 ioc = g_io_channel_win32_new_fd(fd);
1038 ioc = g_io_channel_unix_new(fd);
1042 g_io_channel_set_flags(ioc, G_IO_FLAG_NONBLOCK,
NULL);
1044 g_io_channel_set_encoding(ioc,
NULL,
NULL);
1059 g_io_channel_set_close_on_unref(ioc, TRUE);
1061 g_io_add_watch(ioc, cond, func, data);
1062 g_io_channel_unref(ioc);
1076 g_return_val_if_fail(
string !=
NULL, FALSE);
1079 len = strlen(
string);
1080 for (i = 0; i < len; i++)
1082 if (
string[i]==
'\\')
1084 if (i++ >= strlen(
string))
1107 if (i >= strlen(
string))
1111 if (isdigit(
string[i - 1]))
string[j] =
string[i - 1] - 48;
1112 else if (isxdigit(
string[i - 1]))
string[j] = tolower(
string[i - 1])-87;
1115 if (isdigit(
string[i]))
string[j] |=
string[i] - 48;
1116 else if (isxdigit(
string[i]))
string[j] |= tolower(
string[i])-87;
1123 if (i >= strlen(
string))
1127 if (isdigit(
string[i - 1])) unicodechar =
string[i - 1] - 48;
1128 else if (isxdigit(
string[i - 1])) unicodechar = tolower(
string[i - 1])-87;
1131 if (isdigit(
string[i])) unicodechar |=
string[i] - 48;
1132 else if (isxdigit(
string[i])) unicodechar |= tolower(
string[i])-87;
1134 if (((i + 2) < strlen(
string)) && (isdigit(
string[i + 1]) || isxdigit(
string[i + 1]))
1135 && (isdigit(
string[i + 2]) || isxdigit(
string[i + 2])))
1139 if (isdigit(
string[i - 1])) unicodechar |= ((
string[i - 1] - 48) << 4);
1140 else unicodechar |= ((tolower(
string[i - 1])-87) << 4);
1141 if (isdigit(
string[i])) unicodechar |=
string[i] - 48;
1142 else unicodechar |= tolower(
string[i])-87;
1144 if (((i + 2) < strlen(
string)) && (isdigit(
string[i + 1]) || isxdigit(
string[i + 1]))
1145 && (isdigit(
string[i + 2]) || isxdigit(
string[i + 2])))
1149 if (isdigit(
string[i - 1])) unicodechar |= ((
string[i - 1] - 48) << 4);
1150 else unicodechar |= ((tolower(
string[i - 1])-87) << 4);
1151 if (isdigit(
string[i])) unicodechar |=
string[i] - 48;
1152 else unicodechar |= tolower(
string[i])-87;
1154 if (unicodechar < 0x80)
1156 string[j] = unicodechar;
1158 else if (unicodechar < 0x800)
1160 string[j] = (
unsigned char) ((unicodechar >> 6) | 0xC0);
1162 string[j] = (
unsigned char) ((unicodechar & 0x3F) | 0x80);
1164 else if (unicodechar < 0x10000)
1166 string[j] = (
unsigned char) ((unicodechar >> 12) | 0xE0);
1168 string[j] = (
unsigned char) (((unicodechar >> 6) & 0x3F) | 0x80);
1170 string[j] = (
unsigned char) ((unicodechar & 0x3F) | 0x80);
1172 else if (unicodechar < 0x110000)
1174 string[j] = (
unsigned char) ((unicodechar >> 18) | 0xF0);
1176 string[j] = (
unsigned char) (((unicodechar >> 12) & 0x3F) | 0x80);
1178 string[j] = (
unsigned char) (((unicodechar >> 6) & 0x3F) | 0x80);
1180 string[j] = (
unsigned char) ((unicodechar & 0x3F) | 0x80);
1192 string[j] =
string[i];
1197 string[j] =
string[i];
1214 gchar *
pos, *linestart;
1215 gboolean ret = FALSE;
1220 for (
pos = linestart =
string; *
pos !=
'\0';
pos++)
1222 if (
pos - linestart >= wrapstart && *
pos ==
' ')
1248 return g_strdup(utf8_text);
1254 locale_text = g_locale_from_utf8(utf8_text, -1,
NULL,
NULL,
NULL);
1255 if (locale_text ==
NULL)
1256 locale_text = g_strdup(utf8_text);
1277 return g_strdup(locale_text);
1283 utf8_text = g_locale_to_utf8(locale_text, -1,
NULL,
NULL,
NULL);
1284 if (utf8_text ==
NULL)
1285 utf8_text = g_strdup(locale_text);
1299 va_start(a, arg_count);
1300 for (i = 0; i < arg_count; i++)
1302 ptr = va_arg(a, gpointer);
1305 ptr = va_arg(a, gpointer);
1307 g_warning(
"Wrong arg_count!");
1323 g_return_val_if_fail(first !=
NULL,
NULL);
1328 va_start(args, first);
1329 for (; va_arg(args, gchar*) !=
NULL; strvlen++);
1332 strv = g_new(gchar*, strvlen + 1);
1333 strv[0] = g_strdup(first);
1335 va_start(args, first);
1336 for (i = 1; str = va_arg(args, gchar*), str !=
NULL; i++)
1338 strv[i] = g_strdup(str);
1364 if (path ==
NULL || strlen(path) == 0)
1367 result = (create_parent_dirs) ? g_mkdir_with_parents(path, mode) : g_mkdir(path, mode);
1404 g_return_val_if_fail(path !=
NULL,
NULL);
1406 dir = g_dir_open(path, 0,
error);
1412 list = g_slist_prepend(
list, full_path ?
1446 *length = g_slist_length(
list);
1456 if (
EMPTY(str) || ! g_utf8_validate(str, -1,
NULL))
1459 while (*str !=
'\0')
1461 c = g_utf8_get_char(str);
1463 if (g_unichar_isalpha(c) && g_unichar_isupper(c))
1466 str = g_utf8_next_char(str);
1478 g_return_val_if_fail(haystack !=
NULL, -1);
1479 if (haystack->len == 0)
1482 g_return_val_if_fail(start >= 0, -1);
1483 if (start >= (gint)haystack->len)
1486 g_return_val_if_fail(!
EMPTY(needle), -1);
1489 end = haystack->len;
1507 g_string_erase(str,
pos, len);
1510 g_string_insert(str,
pos, replace);
1511 pos += strlen(replace);
1533 gsize needle_length = strlen(needle);
1581 guint match_num,
const gchar *replace, gboolean literal)
1588 g_return_val_if_fail(replace, 0);
1591 if (haystack->len == 0)
1595 while (g_regex_match_full(regex, haystack->str, -1, start, 0, &minfo,
NULL))
1599 g_match_info_fetch_pos(minfo, match_num, &start, &end);
1605 g_match_info_fetch_pos(minfo, 0,
NULL, &end);
1606 start = end - len + strlen(replace);
1607 g_match_info_free(minfo);
1609 g_match_info_free(minfo);
1648 GSpawnChildSetupFunc child_setup, gpointer user_data, gchar **std_out,
1649 gchar **std_err, gint *exit_status, GError **
error)
1651 GString *output = std_out ? g_string_new(
NULL) :
NULL;
1652 GString *errors = std_err ? g_string_new(
NULL) :
NULL;
1656 *std_out = g_string_free(output, !result);
1659 *std_err = g_string_free(errors, !result);
1681 GSpawnChildSetupFunc child_setup, gpointer user_data, GPid *child_pid,
1706 gchar *locale_filename;
1708 g_return_val_if_fail(uri !=
NULL,
NULL);
1711 return g_strdup(uri);
1714 locale_filename = g_filename_from_uri(uri,
NULL,
NULL);
1716 if (locale_filename ==
NULL)
1718 GFile *file = g_file_new_for_uri(uri);
1719 locale_filename = g_file_get_path(file);
1720 g_object_unref(file);
1721 if (locale_filename ==
NULL)
1723 geany_debug(
"The URI '%s' could not be resolved to a local path. This means "
1724 "that the URI is invalid or that you don't have gvfs-fuse installed.", uri);
1728 return locale_filename;
1734 g_return_val_if_fail(uri !=
NULL, FALSE);
1743 g_return_val_if_fail(path !=
NULL, FALSE);
1746 if (
utils_is_uri(path) && strncmp(path,
"file:", 5) != 0)
1751 static gchar *fuse_path =
NULL;
1752 static gsize len = 0;
1754 if (G_UNLIKELY(fuse_path ==
NULL))
1756 fuse_path = g_build_filename(g_get_home_dir(),
".gvfs",
NULL);
1757 len = strlen(fuse_path);
1763 return (strncmp(path, fuse_path, len) == 0);
1777 const gchar *needle;
1778 gboolean preserve_double_backslash = FALSE;
1780 g_return_if_fail(g_path_is_absolute(
filename));
1784 if (str->len >= 2 && strncmp(str->str,
"\\\\", 2) == 0)
1785 preserve_double_backslash = TRUE;
1795 if (preserve_double_backslash)
1796 g_string_prepend(str,
"\\");
1799 needle = G_DIR_SEPARATOR_S
".." G_DIR_SEPARATOR_S;
1802 const gchar *c =
strstr(str->str, needle);
1807 gssize
pos, sub_len;
1814 g_string_erase(str,
pos, strlen(needle));
1815 g_string_insert_c(str,
pos, G_DIR_SEPARATOR);
1818 c = g_strrstr_len(str->str,
pos, G_DIR_SEPARATOR_S);
1819 sub_len =
pos - (c - str->str);
1824 g_string_erase(str,
pos, sub_len);
1828 memcpy(
filename, str->str, str->len + 1);
1830 g_warn_if_reached();
1831 g_string_free(str, TRUE);
1852 g_return_val_if_fail(
string,
NULL);
1858 if (!strchr(
chars, *r))
1869 gchar *path = g_build_path(G_DIR_SEPARATOR_S,
app->
configdir, subdir,
NULL);
1871 GSList *syslist, *node;
1880 list = g_slist_concat(
list, syslist);
1888 GSList *old = node->next;
1891 node->next = old->next;
1906 gint skip = strlen(uri_file_prefix);
1908 uri = g_strconcat(uri_file_prefix,
app->
docdir,
"/index.html",
NULL);
1910 g_strdelimit(uri,
"\\",
'/');
1913 if (! g_file_test(uri + skip, G_FILE_TEST_IS_REGULAR))
1932 for (p = haystack; *p !=
NULL; ++p)
1962 const gchar *key, *value;
1966 va_start(args, first_varname);
1967 for (o = 1; va_arg(args, gchar*) !=
NULL; o++);
1970 g_return_val_if_fail(o % 2 == 0,
NULL);
1978 n = g_strv_length(env);
1980 result = g_new(gchar *, n + o + 1);
1983 for (n = 0, p = env; *p !=
NULL; ++p)
1986 value = g_getenv(*p);
1987 if (G_LIKELY(value !=
NULL))
1993 result[n++] = g_strconcat(*p,
"=", value,
NULL);
1999 va_start(args, first_varname);
2000 key = first_varname;
2001 value = va_arg(args, gchar*);
2004 result[n++] = g_strconcat(key,
"=", value,
NULL);
2006 key = va_arg(args, gchar*);
2009 value = va_arg(args, gchar*);
2024 gchar **rptr, **wptr;
2031 strv = g_new0(gchar*, g_strv_length(first) + g_strv_length(second) + 1);
2062 num = (strv_len == -1) ? g_strv_length(strv) : (gsize) strv_len;
2064 for (gsize i = 0; strv[0][i]; i++)
2066 for (gsize j = 1; j < num; j++)
2068 if (strv[j][i] != strv[0][i])
2071 return g_strndup(strv[0], i);
2076 return g_strdup(strv[0]);
2092 gchar *first, *_sub, *sub;
2103 num = (strv_len == -1) ? g_strv_length(strv) : (gsize) strv_len;
2106 len = strlen(first);
2109 sub = g_malloc(len+1);
2113 gsize chars_left = len - (_sub - first);
2115 if (
max > chars_left)
2119 if (
NZV(delim) && (strchr(delim, _sub[0]) ==
NULL))
2121 for (n_chars = 1; n_chars <= chars_left; n_chars++)
2125 if (!_sub[n_chars] || strchr(delim, _sub[n_chars]) ==
NULL)
2129 g_strlcpy(sub, _sub, n_chars+1);
2131 for (gsize i = 1; i < num; i++)
2137 if (found == num && n_chars >
max)
2140 SETPTR(lcs, g_strdup(sub));
2173 gchar *prefix, *lcs, *end;
2175 gsize prefix_len = 0, lcs_len = 0;
2177 if (file_names_len == 0)
2178 return g_new0(gchar *, 1);
2180 g_return_val_if_fail(file_names !=
NULL,
NULL);
2182 num = (file_names_len == -1) ? g_strv_length(file_names) : (gsize) file_names_len;
2187 names = g_new(gchar *, num + 1);
2188 memcpy(names, file_names, num *
sizeof(gchar *));
2197 end = strrchr(prefix, G_DIR_SEPARATOR);
2198 if (end && end > prefix)
2200 prefix_len = end - prefix + 1;
2201 for (i = 0; i < num; i++)
2202 names[i] += prefix_len;
2212 lcs_len = strlen(lcs);
2222 for (i = 0; i < num; i++)
2226 names[i] = g_strdup(names[i]);
2230 const gchar *lcs_start =
strstr(names[i], lcs);
2231 const gchar *lcs_end = lcs_start + lcs_len;
2233 names[i] = g_strdup_printf(
"%.*s...%s", (
int)(lcs_start - names[i] + 1), names[i], lcs_end - 1);
2249 GDate *date = g_date_new();
2251 g_date_set_parse(date, input);
2253 if (g_date_valid(date))
2263 gchar date_buf[255];
2268 g_date_strftime(date_buf,
sizeof(date_buf), GEANY_TEMPLATES_FORMAT_DATE, date);
2270 return g_strdup(date_buf);
2273 return g_strdup(input);
2280 return win32_get_user_config_dir();
2282 return g_build_filename(g_get_user_config_dir(),
"geany",
NULL);
2289#ifdef MAC_INTEGRATION
2290 gchar *bundle_id = gtkosx_application_get_bundle_id();
2303 static const gchar *resdirs[RESOURCE_DIR_COUNT] = {
NULL};
2305 if (!resdirs[RESOURCE_DIR_DATA])
2308 gchar *prefix = win32_get_installation_dir();
2310 resdirs[RESOURCE_DIR_DATA] = g_build_filename(prefix,
"data",
NULL);
2311 resdirs[RESOURCE_DIR_ICON] = g_build_filename(prefix,
"share",
"icons",
NULL);
2312 resdirs[RESOURCE_DIR_DOC] = g_build_filename(prefix,
"share",
"doc",
"geany",
"html",
NULL);
2313 resdirs[RESOURCE_DIR_LOCALE] = g_build_filename(prefix,
"share",
"locale",
NULL);
2314 resdirs[RESOURCE_DIR_PLUGIN] = g_build_filename(prefix,
"lib",
"geany",
NULL);
2315 resdirs[RESOURCE_DIR_LIBEXEC] = g_build_filename(prefix,
"libexec",
"geany",
NULL);
2320# ifdef MAC_INTEGRATION
2321 gchar *prefix = gtkosx_application_get_resource_path();
2323 resdirs[RESOURCE_DIR_DATA] = g_build_filename(prefix,
"share",
"geany",
NULL);
2324 resdirs[RESOURCE_DIR_ICON] = g_build_filename(prefix,
"share",
"icons",
NULL);
2325 resdirs[RESOURCE_DIR_DOC] = g_build_filename(prefix,
"share",
"doc",
"geany",
"html",
NULL);
2326 resdirs[RESOURCE_DIR_LOCALE] = g_build_filename(prefix,
"share",
"locale",
NULL);
2327 resdirs[RESOURCE_DIR_PLUGIN] = g_build_filename(prefix,
"lib",
"geany",
NULL);
2328 resdirs[RESOURCE_DIR_LIBEXEC] = g_build_filename(prefix,
"libexec",
"geany",
NULL);
2334 resdirs[RESOURCE_DIR_DATA] = g_build_filename(GEANY_DATADIR,
"geany",
NULL);
2335 resdirs[RESOURCE_DIR_ICON] = g_build_filename(GEANY_DATADIR,
"icons",
NULL);
2336 resdirs[RESOURCE_DIR_DOC] = g_build_filename(GEANY_DOCDIR,
"html",
NULL);
2337 resdirs[RESOURCE_DIR_LOCALE] = g_build_filename(GEANY_LOCALEDIR,
NULL);
2338 resdirs[RESOURCE_DIR_PLUGIN] = g_build_filename(GEANY_LIBDIR,
"geany",
NULL);
2339 resdirs[RESOURCE_DIR_LIBEXEC] = g_build_filename(GEANY_LIBEXECDIR,
"geany",
NULL);
2344 return resdirs[type];
2351 gchar *exec_path = g_find_program_in_path(
command);
2356 const gchar *argv[6];
2359 argv[argc++] = exec_path;
2362 argv[argc++] =
"-n";
2363 argv[argc++] =
"-a";
2364 argv[argc++] =
"Geany";
2365 argv[argc++] = doc_path;
2369 argv[argc++] =
"-i";
2370 argv[argc++] = doc_path;
2376 g_printerr(
"Unable to open new window: %s\n", err->message);
2382 g_printerr(
"Unable to find 'geany'\n");
2428 gchar *os_info =
NULL;
2430#if GLIB_CHECK_VERSION(2, 64, 0)
2431# if ! defined(__APPLE__)
2438 pretty_name = g_get_os_info(G_OS_INFO_KEY_PRETTY_NAME);
2439 if (pretty_name ==
NULL)
2442 os_str = g_string_new(pretty_name);
2443 g_free(pretty_name);
2445 code_name = g_get_os_info(G_OS_INFO_KEY_VERSION_CODENAME);
2446 if (code_name !=
NULL)
2448 g_string_append_printf(os_str,
" (%s)", code_name);
2452 os_info = g_string_free(os_str, FALSE);
2457 os_info = g_get_os_info(G_OS_INFO_KEY_NAME);
2462 os_info = g_strdup(
"Microsoft Windows (64-bit)");
2463# elif defined(_WIN32)
2464 os_info = g_strdup(
"Microsoft Windows");
2465# elif defined(__APPLE__)
2466 os_info = g_strdup(
"Apple macOS");
2467# elif defined(__linux__)
2468 os_info = g_strdup(
"Linux");
2469# elif defined(__FreeBSD__)
2470 os_info = g_strdup(
"FreeBSD");
2471# elif defined(__ANDROID__)
2472 os_info = g_strdup(
"Android");
gchar * dialogs_show_input(const gchar *title, GtkWindow *parent, const gchar *label_text, const gchar *default_text)
Asks the user for text input.
File related dialogs, miscellaneous dialogs, font dialog.
GeanyDocument * document_get_current(void)
Finds the current document.
GeanyFilePrefs file_prefs
Document related actions: new, save, open, etc.
void error(const errorSelection selection, const char *const format,...)
void geany_debug(gchar const *format,...)
GeanyToolPrefs tool_prefs
char * strstr(const char *str, const char *substr)
Wrapper functions for the Scintilla editor widget SCI_* messages.
gboolean spawn_async(const gchar *working_directory, const gchar *command_line, gchar **argv, gchar **envp, GPid *child_pid, GError **error)
Executes a child asynchronously.
gboolean spawn_sync(const gchar *working_directory, const gchar *command_line, gchar **argv, gchar **envp, SpawnWriteData *stdin_data, GString *stdout_data, GString *stderr_data, gint *exit_status, GError **error)
Executes a child synchronously.
Portable and convenient process spawning and communication.
struct GeanyProject * project
Currently active project or NULL if none is open.
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.
gboolean use_safe_file_saving
GtkWidget * window
Main window.
gchar * default_open_path
Default path to look for files when no other path is appropriate.
gchar * base_path
Base path of the project directory (in UTF-8, maybe relative).
Defines internationalization macros.
gchar * tm_get_real_path(const gchar *file_name)
Given a file name, returns a newly allocated string containing the realpath() of the file.
The TMSourceFile structure and associated functions are used to maintain tags for individual files.
GeanyMainWidgets main_widgets
User Interface general utility functions.
gchar * utils_make_human_readable_str(guint64 size, gulong block_size, gulong display_unit)
gchar * utils_get_path_from_uri(const gchar *uri)
void utils_open_browser(const gchar *uri)
Tries to open the given URI in a browser.
gchar ** utils_copy_environment(const gchar **exclude_vars, const gchar *first_varname,...)
Copies the current environment into a new array.
gboolean utils_parse_color(const gchar *spec, GdkColor *color)
gchar * utils_str_middle_truncate(const gchar *string, guint truncate_length)
Truncates the input string to a given length.
GEANY_EXPORT_SYMBOL gchar * utils_strv_find_lcs(gchar **strv, gssize strv_len, const gchar *delim)
gboolean utils_spawn_sync(const gchar *dir, gchar **argv, gchar **env, GSpawnFlags flags, GSpawnChildSetupFunc child_setup, gpointer user_data, gchar **std_out, gchar **std_err, gint *exit_status, GError **error)
Wraps spawn_sync(), which see.
GEANY_EXPORT_SYMBOL gchar * utils_strv_find_common_prefix(gchar **strv, gssize strv_len)
gboolean utils_is_short_html_tag(const gchar *tag_name)
gchar * utils_get_help_url(const gchar *suffix)
gboolean utils_str_has_upper(const gchar *str)
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.
guint utils_string_replace_all(GString *haystack, const gchar *needle, const gchar *replace)
Replaces all occurrences of needle in haystack with replace.
gchar * utils_get_os_info_string(void)
gint utils_color_to_bgr(const GdkColor *c)
static gchar * utf8_strdown(const gchar *str)
gchar * utils_parse_and_format_build_date(const gchar *input)
gint utils_get_setting_integer(GKeyFile *config, const gchar *section, const gchar *key, const gint default_value)
Wraps g_key_file_get_integer() to add a default value argument.
gboolean utils_get_setting_boolean(GKeyFile *config, const gchar *section, const gchar *key, const gboolean default_value)
Wraps g_key_file_get_boolean() to add a default value argument.
gint utils_strpos(const gchar *haystack, const gchar *needle)
GEANY_EXPORT_SYMBOL gchar ** utils_strv_new(const gchar *first,...)
GSList * utils_get_config_files(const gchar *subdir)
gchar * utils_get_utf8_from_locale(const gchar *locale_text)
Converts the given string (in locale encoding) into UTF-8 encoding.
gchar ** utils_strv_join(gchar **first, gchar **second)
const gchar * utils_path_skip_root(const gchar *path)
gchar * utils_get_current_file_dir_utf8(void)
GSList * utils_get_file_list(const gchar *path, guint *length, GError **error)
Gets a sorted list of files from the specified directory.
GSList * utils_get_file_list_full(const gchar *path, gboolean full_path, gboolean sort, GError **error)
Gets a list of files from the specified directory.
void utils_tidy_path(gchar *filename)
gchar * utils_get_date_time(const gchar *format, time_t *time_to_use)
Retrieves a formatted date/time string from strftime().
gchar * utils_get_initials(const gchar *name)
gchar * utils_get_current_time_string(gboolean include_microseconds)
gboolean utils_is_absolute_path(const gchar *path)
gchar * utils_find_open_xml_tag(const gchar sel[], gint size)
Searches backward through size bytes looking for a '<'.
const gchar * utils_find_open_xml_tag_pos(const gchar sel[], gint size)
Searches backward through size bytes looking for a '<'.
const gchar * utils_resource_dir(GeanyResourceDirType type)
gboolean utils_str_replace_escape(gchar *string, gboolean keep_backslash)
guint utils_string_regex_replace_all(GString *haystack, GRegex *regex, guint match_num, const gchar *replace, gboolean literal)
static gboolean is_osx_bundle(void)
GIOChannel * utils_set_up_io_channel(gint fd, GIOCondition cond, gboolean nblock, GIOFunc func, gpointer data)
void utils_ensure_same_eol_characters(GString *string, gint target_eol_mode)
gint utils_string_find(GString *haystack, gint start, gint end, const gchar *needle)
gdouble utils_scale_round(gdouble val, gdouble factor)
GDate * utils_parse_date(const gchar *input)
gint utils_mkdir(const gchar *path, gboolean create_parent_dirs)
Creates a directory if it doesn't already exist.
gint utils_string_replace(GString *str, gint pos, gint len, const gchar *replace)
gint utils_get_line_endings(const gchar *buffer, gsize size)
gint utils_parse_color_to_bgr(const gchar *spec)
gboolean utils_wrap_string(gchar *string, gint wrapstart)
gboolean utils_is_uri(const gchar *uri)
void utils_str_replace_all(gchar **haystack, const gchar *needle, const gchar *replacement)
gchar utils_brace_opposite(gchar ch)
const gchar * utils_get_uri_file_prefix(void)
gchar * utils_str_remove_chars(gchar *string, const gchar *chars)
Removes characters from a string, in place.
const gchar * utils_get_eol_char(gint eol_mode)
gboolean utils_str_equal(const gchar *a, const gchar *b)
NULL-safe string comparison.
gboolean utils_isbrace(gchar c, gboolean include_angles)
gboolean utils_is_opening_brace(gchar c, gboolean include_angles)
gchar ** utils_strv_shorten_file_list(gchar **file_names, gssize file_names_len)
Transform file names in a list to be shorter.
const gchar * utils_get_eol_short_name(gint eol_mode)
void utils_start_new_geany_instance(const gchar *doc_path)
const gchar * utils_get_default_dir_utf8(void)
gchar * utils_remove_ext_from_filename(const gchar *filename)
Removes the extension from filename and return the result in a newly allocated string.
gchar * utils_get_setting_string(GKeyFile *config, const gchar *section, const gchar *key, const gchar *default_value)
Wraps g_key_file_get_string() to add a default value argument.
gboolean utils_is_remote_path(const gchar *path)
gchar * utils_get_user_config_dir(void)
void utils_free_pointers(gsize arg_count,...)
gint utils_is_file_writable(const gchar *locale_filename)
gboolean utils_atob(const gchar *str)
gchar * utils_get_hex_from_color(GdkColor *color)
gchar * utils_get_real_path(const gchar *file_name)
Get a link-dereferenced, absolute version of a file name.
static gboolean str_in_array(const gchar **haystack, const gchar *needle)
gchar * utils_get_locale_from_utf8(const gchar *utf8_text)
Converts the given UTF-8 encoded string into locale encoding.
const gchar * utils_get_eol_name(gint eol_mode)
gboolean utils_spawn_async(const gchar *dir, gchar **argv, gchar **env, GSpawnFlags flags, GSpawnChildSetupFunc child_setup, gpointer user_data, GPid *child_pid, GError **error)
Wraps spawn_async(), which see.
guint utils_string_replace_first(GString *haystack, const gchar *needle, const gchar *replace)
Replaces only the first occurrence of needle in haystack with replace.
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 foreach_str(char_ptr, string)
Iterates through each character in string.
#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.