[geany/geany-plugins] bbbb76: projectorganizer: fix (?) locale/utf8-ness

Jiří Techet git-noreply at xxxxx
Tue Jun 30 11:18:16 UTC 2015


Branch:      refs/heads/master
Author:      Jiří Techet <techet at gmail.com>
Committer:   Jiří Techet <techet at gmail.com>
Date:        Tue, 30 Jun 2015 11:18:16 UTC
Commit:      bbbb769a3e7aa8cc00d76dde45fb21506efc5616
             https://github.com/geany/geany-plugins/commit/bbbb769a3e7aa8cc00d76dde45fb21506efc5616

Log Message:
-----------
projectorganizer: fix (?) locale/utf8-ness

Hopefully fix all (?) utf8/locale issues. Not really tested because I
realized I don't know how to properly test this...

Also fix some memory leaks on the way.


Modified Paths:
--------------
    projectorganizer/src/prjorg-menu.c
    projectorganizer/src/prjorg-project.c
    projectorganizer/src/prjorg-project.h
    projectorganizer/src/prjorg-sidebar.c
    projectorganizer/src/prjorg-utils.c
    projectorganizer/src/prjorg-utils.h

Modified: projectorganizer/src/prjorg-menu.c
88 lines changed, 51 insertions(+), 37 deletions(-)
===================================================================
@@ -50,14 +50,14 @@ enum
 static GtkWidget *s_fif_item, *s_ff_item, *s_ft_item, *s_shs_item, *s_sep_item, *s_context_osf_item, *s_context_sep_item;
 
 
-static gboolean try_swap_header_source(gchar *file_name, gboolean is_header, GSList *file_list, GSList *header_patterns, GSList *source_patterns)
+static gboolean try_swap_header_source(gchar *utf8_file_name, gboolean is_header, GSList *file_list, GSList *header_patterns, GSList *source_patterns)
 {
 	gchar *name_pattern;
 	GSList *elem;
 	GPatternSpec *pattern;
 	gboolean found = FALSE;
 
-	name_pattern = g_path_get_basename(file_name);
+	name_pattern = g_path_get_basename(utf8_file_name);
 	SETPTR(name_pattern, utils_remove_ext_from_filename(name_pattern));
 	SETPTR(name_pattern, g_strconcat(name_pattern, ".*", NULL));
 	pattern = g_pattern_spec_new(name_pattern);
@@ -132,24 +132,26 @@ static void on_swap_header_source(G_GNUC_UNUSED GtkMenuItem * menuitem, G_GNUC_U
 
 		if (!swapped)
 		{
-			gchar *doc_dir;
+			gchar *utf8_doc_dir;
+			gchar *locale_doc_dir;
 
-			doc_dir = g_path_get_dirname(doc->file_name);
-			SETPTR(doc_dir, utils_get_locale_from_utf8(doc_dir));
+			utf8_doc_dir = g_path_get_dirname(doc->file_name);
+			locale_doc_dir = utils_get_locale_from_utf8(utf8_doc_dir);
 
-			list = utils_get_file_list(doc_dir, NULL, NULL);
+			list = utils_get_file_list(locale_doc_dir, NULL, NULL);
 			foreach_list (elem, list)
 			{
 				gchar *full_name;
 
-				full_name = g_build_filename(doc_dir, elem->data, NULL);
+				full_name = g_build_filename(locale_doc_dir, elem->data, NULL);
 				SETPTR(full_name, utils_get_utf8_from_locale(full_name));
 				SETPTR(elem->data, full_name);
 			}
 			swapped = try_swap_header_source(doc->file_name, is_header, list, header_patterns, source_patterns);
 			g_slist_foreach(list, (GFunc) g_free, NULL);
 			g_slist_free(list);
-			g_free(doc_dir);
+			g_free(utf8_doc_dir);
+			g_free(locale_doc_dir);
 			list = NULL;
 		}
 
@@ -185,7 +187,12 @@ static void on_swap_header_source(G_GNUC_UNUSED GtkMenuItem * menuitem, G_GNUC_U
 static void on_find_in_project(G_GNUC_UNUSED GtkMenuItem * menuitem, G_GNUC_UNUSED gpointer user_data)
 {
 	if (geany_data->app->project)
-		search_show_find_in_files_dialog(get_project_base_path());
+	{
+		gchar *utf8_base_path = get_project_base_path();
+
+		search_show_find_in_files_dialog(utf8_base_path);
+		g_free(utf8_base_path);
+	}
 }
 
 
@@ -227,22 +234,21 @@ static gboolean kb_callback(guint key_id)
 static void on_open_selected_file(GtkMenuItem *menuitem, gpointer user_data)
 {
 	GeanyDocument *doc = document_get_current();
-	gchar *sel = NULL;
-	gchar *filename = NULL;
-	gchar *path = NULL;
+	gchar *utf8_sel, *locale_sel;
+	gchar *filename = NULL;  /* locale */
 
 	g_return_if_fail(doc != NULL);
 
-	sel = get_selection();
+	utf8_sel = get_selection();
 
-	if (!sel)
+	if (!utf8_sel)
 		return;
 
-	SETPTR(sel, utils_get_locale_from_utf8(sel));
+	locale_sel = utils_get_locale_from_utf8(utf8_sel);
 
-	if (g_path_is_absolute(sel))
+	if (g_path_is_absolute(locale_sel))
 	{
-		filename = g_strdup(sel);
+		filename = g_strdup(locale_sel);
 		if (!g_file_test(filename, G_FILE_TEST_EXISTS))
 		{
 			g_free(filename);
@@ -252,44 +258,47 @@ static void on_open_selected_file(GtkMenuItem *menuitem, gpointer user_data)
 
 	if (!filename)
 	{
+		gchar *locale_path = NULL;
+
 		if (doc->file_name)
 		{
-			path = g_path_get_dirname(doc->file_name);
-			SETPTR(path, utils_get_locale_from_utf8(path));
+			locale_path = g_path_get_dirname(doc->file_name);
+			SETPTR(locale_path, utils_get_locale_from_utf8(locale_path));
 		}
 
-		if (!path)
-			path = g_get_current_dir();
+		if (!locale_path)
+			locale_path = g_get_current_dir();
 
-		filename = g_build_path(G_DIR_SEPARATOR_S, path, sel, NULL);
+		filename = g_build_path(G_DIR_SEPARATOR_S, locale_path, locale_sel, NULL);
 		if (!g_file_test(filename, G_FILE_TEST_EXISTS))
 		{
 			g_free(filename);
 			filename = NULL;
 		}
 
-		g_free(path);
+		g_free(locale_path);
 	}
 
 	if (!filename && geany_data->app->project != NULL)
 	{
+		gchar *utf8_path;
 		gchar **pathv;
 		gint i;
 
-		path = g_strdup("");
-		pathv = g_strsplit_set(sel, "/\\", -1);
+		utf8_path = g_strdup("");
+		pathv = g_strsplit_set(utf8_sel, "/\\", -1);
 		for (i = g_strv_length(pathv) - 1; i >= 0; i--)
 		{
 			if (g_strcmp0(pathv[i], "..") == 0)
 				break;
-			SETPTR(path, g_build_filename(G_DIR_SEPARATOR_S, pathv[i], path, NULL));
+			SETPTR(utf8_path, g_build_filename(G_DIR_SEPARATOR_S, pathv[i], utf8_path, NULL));
 		}
 		g_strfreev(pathv);
 
-		if (g_strcmp0(path, "") != 0)
+		if (g_strcmp0(utf8_path, "") != 0)
 		{
 			GSList *elem;
-			gchar *found_path = NULL;
+			const gchar *found_path = NULL;
 
 			foreach_slist (elem, prj_org->roots)
 			{
@@ -301,9 +310,9 @@ static void on_open_selected_file(GtkMenuItem *menuitem, gpointer user_data)
 				while (g_hash_table_iter_next(&iter, &key, &value))
 				{
 					gchar *file_name = key;
-					gchar *pos = g_strrstr(file_name, path);
+					gchar *pos = g_strrstr(file_name, utf8_path);
 					
-					if (pos && (pos - file_name + strlen(path) == strlen(file_name)))
+					if (pos && (pos - file_name + strlen(utf8_path) == strlen(file_name)))
 					{
 						found_path = file_name;
 						break;
@@ -316,8 +325,7 @@ static void on_open_selected_file(GtkMenuItem *menuitem, gpointer user_data)
 
 			if (found_path)
 			{
-				filename = g_strdup(found_path);
-				SETPTR(filename, utils_get_locale_from_utf8(filename));
+				filename = utils_get_locale_from_utf8(found_path);
 				if (!g_file_test(filename, G_FILE_TEST_EXISTS))
 				{
 					g_free(filename);
@@ -325,13 +333,13 @@ static void on_open_selected_file(GtkMenuItem *menuitem, gpointer user_data)
 				}
 			}
 		}
-		g_free(path);
+		g_free(utf8_path);
 	}
 
 #ifdef G_OS_UNIX
 	if (!filename)
 	{
-		filename = g_build_path(G_DIR_SEPARATOR_S, "/usr/local/include", sel, NULL);
+		filename = g_build_path(G_DIR_SEPARATOR_S, "/usr/local/include", locale_sel, NULL);
 		if (!g_file_test(filename, G_FILE_TEST_EXISTS))
 		{
 			g_free(filename);
@@ -341,7 +349,7 @@ static void on_open_selected_file(GtkMenuItem *menuitem, gpointer user_data)
 
 	if (!filename)
 	{
-		filename = g_build_path(G_DIR_SEPARATOR_S, "/usr/include", sel, NULL);
+		filename = g_build_path(G_DIR_SEPARATOR_S, "/usr/include", locale_sel, NULL);
 		if (!g_file_test(filename, G_FILE_TEST_EXISTS))
 		{
 			g_free(filename);
@@ -351,10 +359,16 @@ static void on_open_selected_file(GtkMenuItem *menuitem, gpointer user_data)
 #endif
 
 	if (filename)
-		open_file(filename);
+	{
+		gchar *utf8_filename = utils_get_utf8_from_locale(filename);
+
+		open_file(utf8_filename);
+		g_free(utf8_filename);
+	}
 
 	g_free(filename);
-	g_free(sel);
+	g_free(utf8_sel);
+	g_free(locale_sel);
 }
 
 


Modified: projectorganizer/src/prjorg-project.c
192 lines changed, 112 insertions(+), 80 deletions(-)
===================================================================
@@ -70,64 +70,76 @@ static void collect_source_files(gchar *filename, TMSourceFile *sf, gpointer use
 
 
 /* path - absolute path in locale, returned list in locale */
-static GSList *get_file_list(const gchar * path, GSList *patterns, GSList *ignored_dirs_patterns, GSList *ignored_file_patterns)
+static GSList *get_file_list(const gchar *utf8_path, GSList *patterns, GSList *ignored_dirs_patterns, GSList *ignored_file_patterns)
 {
 	GSList *list = NULL;
 	GDir *dir;
+	gchar *locale_path = utils_get_locale_from_utf8(utf8_path);
 
-	dir = g_dir_open(path, 0, NULL);
+	dir = g_dir_open(locale_path, 0, NULL);
 	if (!dir)
+	{
+		g_free(locale_path);
 		return NULL;
+	}
 
 	while (TRUE)
 	{
-		const gchar *name;
-		gchar *filename;
+		const gchar *locale_name;
+		gchar *locale_filename, *utf8_filename, *utf8_name;
 
-		name = g_dir_read_name(dir);
-		if (!name)
+		locale_name = g_dir_read_name(dir);
+		if (!locale_name)
 			break;
 
-		filename = g_build_filename(path, name, NULL);
+		utf8_name = utils_get_utf8_from_locale(locale_name);
+		locale_filename = g_build_filename(locale_path, locale_name, NULL);
+		utf8_filename = utils_get_utf8_from_locale(locale_filename);
 
-		if (g_file_test(filename, G_FILE_TEST_IS_DIR))
+		if (g_file_test(locale_filename, G_FILE_TEST_IS_DIR))
 		{
 			GSList *lst;
-			gchar *parent_realpath, *child_realpath, *relative;
+			gchar *relative, *locale_parent_realpath, *locale_child_realpath,
+				*utf8_parent_realpath, *utf8_child_realpath;
 
 			/* symlink cycle avoidance - test if directory within parent directory */
-			parent_realpath = tm_get_real_path(path);
-			child_realpath = tm_get_real_path(filename);
-			relative = get_relative_path(parent_realpath, child_realpath);
-			g_free(parent_realpath);
-			g_free(child_realpath);
+			locale_parent_realpath = tm_get_real_path(locale_path);
+			locale_child_realpath = tm_get_real_path(locale_filename);
+			utf8_parent_realpath = utils_get_utf8_from_locale(locale_parent_realpath);
+			utf8_child_realpath = utils_get_utf8_from_locale(locale_child_realpath);
 
-			if (!relative)
-				continue;
+			relative = get_relative_path(utf8_parent_realpath, utf8_child_realpath);
 
-			g_free(relative);
+			g_free(locale_parent_realpath);
+			g_free(locale_child_realpath);
+			g_free(utf8_parent_realpath);
+			g_free(utf8_child_realpath);
 
-			if (patterns_match(ignored_dirs_patterns, name))
+			if (relative)
 			{
-				g_free(filename);
-				continue;
+				g_free(relative);
+
+				if (!patterns_match(ignored_dirs_patterns, utf8_name))
+				{
+					lst = get_file_list(utf8_filename, patterns, ignored_dirs_patterns, ignored_file_patterns);
+					if (lst)
+						list = g_slist_concat(list, lst);
+				}
 			}
-
-			lst = get_file_list(filename, patterns, ignored_dirs_patterns, ignored_file_patterns);
-			if (lst)
-				list = g_slist_concat(list, lst);
-			g_free(filename);
 		}
-		else if (g_file_test(filename, G_FILE_TEST_IS_REGULAR))
+		else if (g_file_test(locale_filename, G_FILE_TEST_IS_REGULAR))
 		{
-			if (patterns_match(patterns, name) && !patterns_match(ignored_file_patterns, name))
-				list = g_slist_prepend(list, filename);
-			else
-				g_free(filename);
+			if (patterns_match(patterns, utf8_name) && !patterns_match(ignored_file_patterns, utf8_name))
+				list = g_slist_prepend(list, g_strdup(utf8_filename));
 		}
+
+		g_free(utf8_filename);
+		g_free(locale_filename);
+		g_free(utf8_name);
 	}
 
 	g_dir_close(dir);
+	g_free(locale_path);
 
 	return list;
 }
@@ -165,12 +177,11 @@ static gint prjorg_project_rescan_root(PrjOrgRoot *root)
 	
 	foreach_slist(elem, lst)
 	{
-		char *path = g_strdup(elem->data);
+		char *path = elem->data;
 
 		if (path)
 		{
-			SETPTR(path, utils_get_utf8_from_locale(path));
-			g_hash_table_insert(root->file_table, path, NULL);
+			g_hash_table_insert(root->file_table, g_strdup(path), NULL);
 			filenum++;
 		}
 	}
@@ -191,7 +202,7 @@ static gint prjorg_project_rescan_root(PrjOrgRoot *root)
 static gboolean match_basename(gconstpointer pft, gconstpointer user_data)
 {
 	const GeanyFiletype *ft = pft;
-	const gchar *base_filename = user_data;
+	const gchar *utf8_base_filename = user_data;
 	gint j;
 	gboolean ret = FALSE;
 
@@ -202,7 +213,7 @@ static gboolean match_basename(gconstpointer pft, gconstpointer user_data)
 	{
 		GPatternSpec *pattern = g_pattern_spec_new(ft->pattern[j]);
 
-		if (g_pattern_match_string(pattern, base_filename))
+		if (g_pattern_match_string(pattern, utf8_base_filename))
 		{
 			ret = TRUE;
 			g_pattern_spec_free(pattern);
@@ -220,36 +231,44 @@ static gboolean match_basename(gconstpointer pft, gconstpointer user_data)
  * extension and only if this fails, look at the shebang */
 static GeanyFiletype *filetypes_detect(const gchar *utf8_filename)
 {
-	guint i;
 	struct stat s;
-	gchar *base_filename;
 	GeanyFiletype *ft = NULL;
+	gchar *locale_filename;
 
-	if (g_stat(utf8_filename, &s) != 0 || s.st_size > 10*1024*1024)
-		return filetypes[GEANY_FILETYPES_NONE];
+	locale_filename = utils_get_locale_from_utf8(utf8_filename);
+	if (g_stat(locale_filename, &s) != 0 || s.st_size > 10*1024*1024)
+		ft = filetypes[GEANY_FILETYPES_NONE];
+	else
+	{
+		guint i;
+		gchar *utf8_base_filename;
 
-	/* to match against the basename of the file (because of Makefile*) */
-	base_filename = g_path_get_basename(utf8_filename);
+		/* to match against the basename of the file (because of Makefile*) */
+		utf8_base_filename = g_path_get_basename(utf8_filename);
 #ifdef G_OS_WIN32
-	/* use lower case basename */
-	SETPTR(base_filename, g_utf8_strdown(base_filename, -1));
+		/* use lower case basename */
+		SETPTR(utf8_base_filename, g_utf8_strdown(utf8_base_filename, -1));
 #endif
 
-	for (i = 0; i < geany_data->filetypes_array->len; i++)
-	{
-		GeanyFiletype *ftype = filetypes[i];
-
-		if (match_basename(ftype, base_filename))
+		for (i = 0; i < geany_data->filetypes_array->len; i++)
 		{
-			ft = ftype;
-			break;
+			GeanyFiletype *ftype = filetypes[i];
+
+			if (match_basename(ftype, utf8_base_filename))
+			{
+				ft = ftype;
+				break;
+			}
 		}
+
+		if (ft == NULL)
+			ft = filetypes_detect_from_file(utf8_filename);
+
+		g_free(utf8_base_filename);
 	}
-	
-	if (ft == NULL)
-		ft = filetypes_detect_from_file(utf8_filename);
 
-	g_free(base_filename);
+	g_free(locale_filename);
+
 	return ft;
 }
 
@@ -267,13 +286,15 @@ static void regenerate_tags(PrjOrgRoot *root, gpointer user_data)
 	while (g_hash_table_iter_next(&iter, &key, &value))
 	{
 		TMSourceFile *sf;
-		gchar *path = key;
+		gchar *utf8_path = key;
+		gchar *locale_path = utils_get_locale_from_utf8(utf8_path);
 		
-		sf = tm_source_file_new(path, filetypes_detect(path)->name);
-		if (sf && !document_find_by_filename(path))
+		sf = tm_source_file_new(locale_path, filetypes_detect(utf8_path)->name);
+		if (sf && !document_find_by_filename(utf8_path))
 			g_ptr_array_add(source_files, sf);
 		
-		g_hash_table_insert(file_table, g_strdup(path), sf);
+		g_hash_table_insert(file_table, g_strdup(utf8_path), sf);
+		g_free(locale_path);
 	}
 	g_hash_table_destroy(root->file_table);
 	root->file_table = file_table;
@@ -361,10 +382,10 @@ void prjorg_project_save(GKeyFile * key_file)
 }
 
 
-static PrjOrgRoot *create_root(const gchar *base_dir)
+static PrjOrgRoot *create_root(const gchar *utf8_base_dir)
 {
 	PrjOrgRoot *root = (PrjOrgRoot *) g_new0(PrjOrgRoot, 1);
-	root->base_dir = g_strdup(base_dir);
+	root->base_dir = g_strdup(utf8_base_dir);
 	root->file_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GFreeFunc)tm_source_file_free);
 	return root;
 }
@@ -387,21 +408,28 @@ static void close_root(PrjOrgRoot *root, gpointer user_data)
 
 static gint root_comparator(PrjOrgRoot *a, PrjOrgRoot *b)
 {
-	gchar *a_realpath, *b_realpath;
+	gchar *a_realpath, *b_realpath, *a_locale_base_dir, *b_locale_base_dir;
 	gint res;
 
-	a_realpath = tm_get_real_path(a->base_dir);
-	b_realpath = tm_get_real_path(b->base_dir);
+	a_locale_base_dir = utils_get_locale_from_utf8(a->base_dir);
+	b_locale_base_dir = utils_get_locale_from_utf8(b->base_dir);
+	a_realpath = tm_get_real_path(a_locale_base_dir);
+	b_realpath = tm_get_real_path(b_locale_base_dir);
+
 	res = g_strcmp0(a_realpath, b_realpath);
+
 	g_free(a_realpath);
 	g_free(b_realpath);
+	g_free(a_locale_base_dir);
+	g_free(b_locale_base_dir);
+
 	return res;
 }
 
 
-void prjorg_project_add_external_dir(const gchar *dirname)
+void prjorg_project_add_external_dir(const gchar *utf8_dirname)
 {
-	PrjOrgRoot *new_root = create_root(dirname);
+	PrjOrgRoot *new_root = create_root(utf8_dirname);
 	if (g_slist_find_custom (prj_org->roots, new_root, (GCompareFunc)root_comparator) != NULL)
 	{
 		close_root(new_root, NULL);
@@ -417,9 +445,9 @@ void prjorg_project_add_external_dir(const gchar *dirname)
 }
 
 
-void prjorg_project_remove_external_dir(const gchar *dirname)
+void prjorg_project_remove_external_dir(const gchar *utf8_dirname)
 {
-	PrjOrgRoot *test_root = create_root(dirname);
+	PrjOrgRoot *test_root = create_root(utf8_dirname);
 	GSList *found = g_slist_find_custom (prj_org->roots, test_root, (GCompareFunc)root_comparator);
 	if (found != NULL)
 	{
@@ -438,6 +466,7 @@ void prjorg_project_open(GKeyFile * key_file)
 	gchar **source_patterns, **header_patterns, **ignored_dirs_patterns, **ignored_file_patterns, **external_dirs, **dir_ptr, *last_name;
 	gint generate_tag_prefs;
 	GSList *elem, *ext_list = NULL;
+	gchar *utf8_base_path;
 
 	if (prj_org != NULL)
 		prjorg_project_close();
@@ -476,8 +505,11 @@ void prjorg_project_open(GKeyFile * key_file)
 		last_name = elem->data;
 	}
 	g_slist_free(ext_list);
+
 	/* the project directory is always first */
-	prj_org->roots = g_slist_prepend(prj_org->roots, create_root(get_project_base_path()));
+	utf8_base_path = get_project_base_path();
+	prj_org->roots = g_slist_prepend(prj_org->roots, create_root(utf8_base_path));
+	g_free(utf8_base_path);
 
 	update_project(
 		source_patterns,
@@ -650,17 +682,17 @@ void prjorg_project_close(void)
 }
 
 
-gboolean prjorg_project_is_in_project(const gchar * filename)
+gboolean prjorg_project_is_in_project(const gchar *utf8_filename)
 {
 	GSList *elem;
 	
-	if (!filename || !prj_org || !geany_data->app->project || !prj_org->roots)
+	if (!utf8_filename || !prj_org || !geany_data->app->project || !prj_org->roots)
 		return FALSE;
 	
 	foreach_slist (elem, prj_org->roots)
 	{
 		PrjOrgRoot *root = elem->data;
-		if (g_hash_table_lookup_extended (root->file_table, filename, NULL, NULL))
+		if (g_hash_table_lookup_extended (root->file_table, utf8_filename, NULL, NULL))
 			return TRUE;
 	}
 
@@ -678,14 +710,14 @@ static gboolean add_tm_idle(gpointer foo)
 	foreach_slist (elem2, s_idle_add_funcs)
 	{
 		GSList *elem;
-		gchar *fname = elem2->data;
+		gchar *utf8_fname = elem2->data;
 		
 		foreach_slist (elem, prj_org->roots)
 		{
 			PrjOrgRoot *root = elem->data;
-			TMSourceFile *sf = g_hash_table_lookup(root->file_table, fname);
+			TMSourceFile *sf = g_hash_table_lookup(root->file_table, utf8_fname);
 			
-			if (sf != NULL && !document_find_by_filename(fname))
+			if (sf != NULL && !document_find_by_filename(utf8_fname))
 			{
 				tm_workspace_add_source_file(sf);
 				break;  /* single file representation in TM is enough */
@@ -706,12 +738,12 @@ static gboolean add_tm_idle(gpointer foo)
  * Additional problem: The tag removal in Geany happens after this function is called. 
  * To be sure, perform on idle after this happens (even though from my knowledge of TM
  * this shouldn't probably matter). */
-void prjorg_project_add_single_tm_file(gchar *filename)
+void prjorg_project_add_single_tm_file(gchar *utf8_filename)
 {
 	if (s_idle_add_funcs == NULL)
 		plugin_idle_add(geany_plugin, (GSourceFunc)add_tm_idle, NULL);
 	
-	s_idle_add_funcs = g_slist_prepend(s_idle_add_funcs, g_strdup(filename));
+	s_idle_add_funcs = g_slist_prepend(s_idle_add_funcs, g_strdup(utf8_filename));
 }
 
 
@@ -725,12 +757,12 @@ static gboolean remove_tm_idle(gpointer foo)
 	foreach_slist (elem2, s_idle_remove_funcs)
 	{
 		GSList *elem;
-		gchar *fname = elem2->data;
+		gchar *utf8_fname = elem2->data;
 
 		foreach_slist (elem, prj_org->roots)
 		{
 			PrjOrgRoot *root = elem->data;
-			TMSourceFile *sf = g_hash_table_lookup(root->file_table, fname);
+			TMSourceFile *sf = g_hash_table_lookup(root->file_table, utf8_fname);
 			
 			if (sf != NULL)
 				tm_workspace_remove_source_file(sf);
@@ -755,10 +787,10 @@ static gboolean remove_tm_idle(gpointer foo)
  * when this function is called and if we remove the TmSourceFile now, line
  * number for the searched tag won't be found. For this reason delay the tag
  * TmSourceFile removal until idle */
-void prjorg_project_remove_single_tm_file(gchar *filename)
+void prjorg_project_remove_single_tm_file(gchar *utf8_filename)
 {
 	if (s_idle_remove_funcs == NULL)
 		plugin_idle_add(geany_plugin, (GSourceFunc)remove_tm_idle, NULL);
 	
-	s_idle_remove_funcs = g_slist_prepend(s_idle_remove_funcs, g_strdup(filename));
+	s_idle_remove_funcs = g_slist_prepend(s_idle_remove_funcs, g_strdup(utf8_filename));
 }


Modified: projectorganizer/src/prjorg-project.h
10 lines changed, 5 insertions(+), 5 deletions(-)
===================================================================
@@ -55,12 +55,12 @@ void prjorg_project_save(GKeyFile * key_file);
 void prjorg_project_read_properties_tab(void);
 void prjorg_project_rescan(void);
 
-void prjorg_project_add_external_dir(const gchar *dirname);
-void prjorg_project_remove_external_dir(const gchar *dirname);
+void prjorg_project_add_external_dir(const gchar *utf8_dirname);
+void prjorg_project_remove_external_dir(const gchar *utf8_dirname);
 
-void prjorg_project_add_single_tm_file(gchar *filename);
-void prjorg_project_remove_single_tm_file(gchar *filename);
+void prjorg_project_add_single_tm_file(gchar *utf8_filename);
+void prjorg_project_remove_single_tm_file(gchar *utf8_filename);
 
-gboolean prjorg_project_is_in_project(const gchar * filename);
+gboolean prjorg_project_is_in_project(const gchar *utf8_filename);
 
 #endif


Modified: projectorganizer/src/prjorg-sidebar.c
151 lines changed, 89 insertions(+), 62 deletions(-)
===================================================================
@@ -102,7 +102,7 @@ static struct
 } s_popup_menu;
 
 
-static gint show_dialog_find_file(gchar *path, gchar **pattern, gboolean *case_sensitive, gboolean *full_path)
+static gint show_dialog_find_file(gchar *utf8_path, gchar **pattern, gboolean *case_sensitive, gboolean *is_full_path)
 {
 	gint res;
 	GtkWidget *entry;
@@ -164,8 +164,8 @@ static gint show_dialog_find_file(gchar *path, gchar **pattern, gboolean *case_s
 		gtk_widget_show_all(vbox);
 	}
 
-	if (path)
-		gtk_label_set_text(GTK_LABEL(s_fif_dialog.dir_label), path);
+	if (utf8_path)
+		gtk_label_set_text(GTK_LABEL(s_fif_dialog.dir_label), utf8_path);
 	else
 		gtk_label_set_text(GTK_LABEL(s_fif_dialog.dir_label), _("project or external directory"));
 	entry = gtk_bin_get_child(GTK_BIN(s_fif_dialog.combo));
@@ -184,7 +184,7 @@ static gint show_dialog_find_file(gchar *path, gchar **pattern, gboolean *case_s
 		str = gtk_entry_get_text(GTK_ENTRY(entry));
 		*pattern = g_strconcat("*", str, "*", NULL);
 		*case_sensitive = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(s_fif_dialog.case_sensitive));
-		*full_path = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(s_fif_dialog.full_path));
+		*is_full_path = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(s_fif_dialog.full_path));
 		ui_combo_box_add_to_history(GTK_COMBO_BOX_TEXT(s_fif_dialog.combo), str, 0);
 	}
 
@@ -210,6 +210,7 @@ static gboolean topmost_selected(GtkTreeModel *model, GtkTreeIter *iter, gboolea
 }
 
 
+/* utf8 */
 static gchar *build_path(GtkTreeIter *iter)
 {
 	GtkTreeIter node;
@@ -219,7 +220,7 @@ static gchar *build_path(GtkTreeIter *iter)
 	gchar *name;
 
 	if (!iter)
-		return g_strdup(get_project_base_path());
+		return get_project_base_path();
 
 	node = *iter;
 	model = GTK_TREE_MODEL(s_file_store);
@@ -237,7 +238,12 @@ static gchar *build_path(GtkTreeIter *iter)
 	}
 
 	if (topmost_selected(model, &node, TRUE))
-		SETPTR(path, g_build_filename(get_project_base_path(), path, NULL));
+	{
+		gchar *utf8_base_path = get_project_base_path();
+
+		SETPTR(path, g_build_filename(utf8_base_path, path, NULL));
+		g_free(utf8_base_path);
+	}
 	else
 	{
 		gtk_tree_model_get(model, &node, FILEVIEW_COLUMN_NAME, &name, -1);
@@ -285,26 +291,33 @@ static void on_follow_active(GtkToggleToolButton *button, G_GNUC_UNUSED gpointer
 
 static void on_add_external(G_GNUC_UNUSED GtkMenuItem * menuitem, G_GNUC_UNUSED gpointer user_data)
 {
+	gchar *utf8_base_path = get_project_base_path();
+	gchar *locale_path = utils_get_locale_from_utf8(utf8_base_path);
 	GtkWidget *dialog;
 
 	dialog = gtk_file_chooser_dialog_new(_("Add External Directory"),
 		GTK_WINDOW(geany->main_widgets->window), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
 		_("_Cancel"), GTK_RESPONSE_CANCEL,
 		_("Add"), GTK_RESPONSE_ACCEPT, NULL);
-	gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), get_project_base_path());
+	gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), locale_path);
 
 	if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
 	{
-		gchar *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
+		gchar *locale_filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
+		gchar *utf8_filename = utils_get_utf8_from_locale(locale_filename);
 		
-		prjorg_project_add_external_dir(filename);
+		prjorg_project_add_external_dir(utf8_filename);
 		prjorg_sidebar_update(TRUE);
 		project_write_config();
 		
-		g_free (filename);
+		g_free(utf8_filename);
+		g_free(locale_filename);
 	}
 
 	gtk_widget_destroy(dialog);
+
+	g_free(utf8_base_path);
+	g_free(locale_path);
 }
 
 
@@ -348,37 +361,41 @@ static void find_file_recursive(GtkTreeIter *iter, gboolean case_sensitive, gboo
 	}
 	else
 	{
-		gchar *name;
+		gchar *utf8_name;
 
 		if (iter == NULL)
 			return;
 
 		if (full_path)
 		{
-			gchar *path;
+			gchar *utf8_path, *utf8_base_path;
 
-			path = build_path(iter);
-			name = get_relative_path(get_project_base_path(), path);
-			g_free(path);
+			utf8_path = build_path(iter);
+			utf8_base_path = get_project_base_path();
+			utf8_name = get_relative_path(utf8_base_path, utf8_path);
+			g_free(utf8_path);
+			g_free(utf8_base_path);
 		}
 		else
-			gtk_tree_model_get(GTK_TREE_MODEL(model), iter, FILEVIEW_COLUMN_NAME, &name, -1);
+			gtk_tree_model_get(GTK_TREE_MODEL(model), iter, FILEVIEW_COLUMN_NAME, &utf8_name, -1);
 
 		if (!case_sensitive)
-			SETPTR(name, g_utf8_strdown(name, -1));
+			SETPTR(utf8_name, g_utf8_strdown(utf8_name, -1));
 
-		if (g_pattern_match_string(pattern, name))
+		if (g_pattern_match_string(pattern, utf8_name))
 		{
-			gchar *path, *rel_path;
+			gchar *utf8_base_path = get_project_base_path();
+			gchar *utf8_path, *rel_path;
 
-			path = build_path(iter);
-			rel_path = get_relative_path(get_project_base_path(), path);
-			msgwin_msg_add(COLOR_BLACK, -1, NULL, "%s", rel_path ? rel_path : path);
-			g_free(path);
+			utf8_path = build_path(iter);
+			rel_path = get_relative_path(utf8_base_path, utf8_path);
+			msgwin_msg_add(COLOR_BLACK, -1, NULL, "%s", rel_path ? rel_path : utf8_path);
+			g_free(utf8_path);
 			g_free(rel_path);
+			g_free(utf8_base_path);
 		}
 
-		g_free(name);
+		g_free(utf8_name);
 	}
 }
 
@@ -386,13 +403,13 @@ static void find_file_recursive(GtkTreeIter *iter, gboolean case_sensitive, gboo
 static void find_file(GtkTreeIter *iter)
 {
 	gchar *pattern_str = NULL;
-	gboolean case_sensitive, full_path;
-	gchar *path;
+	gboolean case_sensitive, is_full_path;
+	gchar *utf8_path = build_path(iter);
 
-	path = build_path(iter);
-
-	if (show_dialog_find_file(iter ? path : NULL, &pattern_str, &case_sensitive, &full_path) == GTK_RESPONSE_ACCEPT)
+	if (show_dialog_find_file(iter ? utf8_path : NULL, &pattern_str, &case_sensitive, &is_full_path) == GTK_RESPONSE_ACCEPT)
 	{
+		gchar *utf8_base_path = get_project_base_path();
+		gchar *locale_base_path = utils_get_locale_from_utf8(utf8_base_path);
 		GPatternSpec *pattern;
 
 		if (!case_sensitive)
@@ -401,13 +418,15 @@ static void find_file(GtkTreeIter *iter)
 		pattern = g_pattern_spec_new(pattern_str);
 
 		msgwin_clear_tab(MSG_MESSAGE);
-		msgwin_set_messages_dir(get_project_base_path());
-		find_file_recursive(iter, case_sensitive, full_path, pattern);
+		msgwin_set_messages_dir(locale_base_path);
+		find_file_recursive(iter, case_sensitive, is_full_path, pattern);
 		msgwin_switch_tab(MSG_MESSAGE, TRUE);
+		g_free(utf8_base_path);
+		g_free(locale_base_path);
 	}
 
 	g_free(pattern_str);
-	g_free(path);
+	g_free(utf8_path);
 }
 
 
@@ -521,7 +540,7 @@ static const char *tm_tag_type_name(const TMTag *tag)
 
 
 static gboolean match(TMTag *tag, const gchar *name, gboolean declaration, gboolean case_sensitive, 
-	MatchType match_type, GPatternSpec *pspec, gchar *path)
+	MatchType match_type, GPatternSpec *pspec, gchar *utf8_path)
 {
 	const gint forward_types = tm_tag_prototype_t | tm_tag_externvar_t;
 	gboolean matches = FALSE;
@@ -554,21 +573,25 @@ static gboolean match(TMTag *tag, const gchar *name, gboolean declaration, gbool
 		g_free(name_case);
 	}
 		
-	if (matches && path)
+	if (matches && utf8_path)
 	{
+		gchar *utf8_file_name = utils_get_utf8_from_locale(tag->file->file_name);
 		gchar *relpath;
 		
-		relpath = get_relative_path(path, tag->file->file_name);
+		relpath = get_relative_path(utf8_path, utf8_file_name);
 		matches = relpath != NULL;
 		g_free(relpath);
+		g_free(utf8_file_name);
 	}
 	
 	return matches;
 }
 
 
-static void find_tags(const gchar *name, gboolean declaration, gboolean case_sensitive, MatchType match_type, gchar *path)
+static void find_tags(const gchar *name, gboolean declaration, gboolean case_sensitive, MatchType match_type, gchar *utf8_path)
 {
+	gchar *utf8_base_path = get_project_base_path();
+	gchar *locale_base_path = utils_get_locale_from_utf8(utf8_base_path);
 	GPtrArray *tags_array = geany_data->app->tm_workspace->tags_array;
 	guint i;
 	gchar *name_case;
@@ -581,44 +604,48 @@ static void find_tags(const gchar *name, gboolean declaration, gboolean case_sen
 		
 	pspec = g_pattern_spec_new(name_case);
 
-	msgwin_set_messages_dir(get_project_base_path());
+	msgwin_set_messages_dir(locale_base_path);
 	msgwin_clear_tab(MSG_MESSAGE);
 	for (i = 0; i < tags_array->len; i++) /* TODO: binary search */
 	{
 		TMTag *tag = tags_array->pdata[i];
 
-		if (match(tag, name_case, declaration, case_sensitive, match_type, pspec, path))
+		if (match(tag, name_case, declaration, case_sensitive, match_type, pspec, utf8_path))
 		{
 			gchar *scopestr = tag->scope ? g_strconcat(tag->scope, "::", NULL) : g_strdup("");
+			gchar *utf8_fname = utils_get_utf8_from_locale(tag->file->file_name);
 			gchar *relpath;
 			
-			relpath = get_relative_path(get_project_base_path(), tag->file->file_name);
+			relpath = get_relative_path(utf8_base_path, utf8_fname);
 			msgwin_msg_add(COLOR_BLACK, -1, NULL, "%s:%lu:\n\t[%s]\t %s%s%s", relpath,
 				tag->line, tm_tag_type_name(tag), scopestr, tag->name, tag->arglist ? tag->arglist : "");
 			g_free(scopestr);
 			g_free(relpath);
+			g_free(utf8_fname);
 		}
 	}
 	msgwin_switch_tab(MSG_MESSAGE, TRUE);
 	
 	g_free(name_case);
 	g_free(pspec);
+	g_free(utf8_base_path);
+	g_free(locale_base_path);
 }
 
 
 static void find_tag(GtkTreeIter *iter)
 {
 	gchar *selection;
-	gchar *path;
+	gchar *utf8_path;
 	GtkWidget *entry;
 
 	create_dialog_find_tag();
 
 	entry = gtk_bin_get_child(GTK_BIN(s_ft_dialog.combo));
 
-	path = build_path(iter);
+	utf8_path = build_path(iter);
 	if (iter)
-		gtk_label_set_text(GTK_LABEL(s_ft_dialog.dir_label), path);
+		gtk_label_set_text(GTK_LABEL(s_ft_dialog.dir_label), utf8_path);
 	else
 		gtk_label_set_text(GTK_LABEL(s_ft_dialog.dir_label), _("project or external directory"));
 
@@ -642,10 +669,10 @@ static void find_tag(GtkTreeIter *iter)
 
 		ui_combo_box_add_to_history(GTK_COMBO_BOX_TEXT(s_ft_dialog.combo), name, 0);
 
-		find_tags(name, declaration, case_sensitive, match_type, iter?path:NULL);
+		find_tags(name, declaration, case_sensitive, match_type, iter ? utf8_path : NULL);
 	}
 	
-	g_free(path);
+	g_free(utf8_path);
 	gtk_widget_hide(s_ft_dialog.widget);
 }
 
@@ -727,7 +754,7 @@ static void on_open_clicked(void)
 		}
 		else
 		{
-			gchar *name;
+			gchar *utf8_path;
 			GIcon *icon;
 
 			gtk_tree_model_get(model, &iter, FILEVIEW_COLUMN_ICON, &icon, -1);
@@ -738,9 +765,9 @@ static void on_open_clicked(void)
 				return;
 			}
 
-			name = build_path(&iter);
-			open_file(name);
-			g_free(name);
+			utf8_path = build_path(&iter);
+			open_file(utf8_path);
+			g_free(utf8_path);
 			g_object_unref(icon);
 		}
 	}
@@ -822,7 +849,7 @@ static void on_find_in_files(G_GNUC_UNUSED GtkMenuItem *menuitem, G_GNUC_UNUSED
 	GtkTreeSelection *treesel;
 	GtkTreeIter iter, parent;
 	GtkTreeModel *model;
-	gchar *path;
+	gchar *utf8_path;
 
 	treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(s_file_view));
 
@@ -832,15 +859,15 @@ static void on_find_in_files(G_GNUC_UNUSED GtkMenuItem *menuitem, G_GNUC_UNUSED
 	if (!gtk_tree_model_iter_has_child(model, &iter))
 	{
 		if (gtk_tree_model_iter_parent(model, &parent, &iter))
-			path = build_path(&parent);
+			utf8_path = build_path(&parent);
 		else
-			path = build_path(NULL);
+			utf8_path = build_path(NULL);
 	}
 	else
-		path = build_path(&iter);
+		utf8_path = build_path(&iter);
 
-	search_show_find_in_files_dialog(path);
-	g_free(path);
+	search_show_find_in_files_dialog(utf8_path);
+	g_free(utf8_path);
 }
 
 
@@ -1132,7 +1159,7 @@ static gboolean find_in_tree(GtkTreeIter *parent, gchar **path_split, gint level
 static gboolean follow_editor_on_idle(gpointer foo)
 {
 	GtkTreeIter root_iter, found_iter;
-	gchar *path = NULL;
+	gchar *utf8_path = NULL;
 	gchar **path_split;
 	GeanyDocument *doc;
 	GSList *elem;
@@ -1149,20 +1176,20 @@ static gboolean follow_editor_on_idle(gpointer foo)
 	{
 		PrjOrgRoot *root = elem->data;
 		
-		path = get_relative_path(root->base_dir, doc->file_name);
-		if (path)
+		utf8_path = get_relative_path(root->base_dir, doc->file_name);
+		if (utf8_path)
 			break;
 			
-		g_free(path);
-		path = NULL;
+		g_free(utf8_path);
+		utf8_path = NULL;
 		if (!gtk_tree_model_iter_next(model, &root_iter))
 			break;
 	}
 	
-	if (!path)
+	if (!utf8_path)
 		return FALSE;
 
-	path_split = g_strsplit_set(path, "/\\", 0);
+	path_split = g_strsplit_set(utf8_path, "/\\", 0);
 
 	if (find_in_tree(&root_iter, path_split, 0, &found_iter))
 	{
@@ -1180,7 +1207,7 @@ static gboolean follow_editor_on_idle(gpointer foo)
 		gtk_tree_path_free(tree_path);
 	}
 	
-	g_free(path);
+	g_free(utf8_path);
 	g_strfreev(path_split);
 	
 	return FALSE;


Modified: projectorganizer/src/prjorg-utils.c
21 lines changed, 15 insertions(+), 6 deletions(-)
===================================================================
@@ -27,20 +27,28 @@ extern GeanyData *geany_data;
 extern GeanyFunctions *geany_functions;
 
 
-gchar *get_relative_path(const gchar *parent, const gchar *descendant)
+/* utf8 */
+gchar *get_relative_path(const gchar *utf8_parent, const gchar *utf8_descendant)
 {
 	GFile *gf_parent, *gf_descendant;
-	gchar *ret;
+	gchar *locale_parent, *locale_descendant;
+	gchar *locale_ret, *utf8_ret;
 
-	gf_parent = g_file_new_for_path(parent);
-	gf_descendant = g_file_new_for_path(descendant);
+	locale_parent = utils_get_locale_from_utf8(utf8_parent);
+	locale_descendant = utils_get_locale_from_utf8(utf8_descendant);
+	gf_parent = g_file_new_for_path(locale_parent);
+	gf_descendant = g_file_new_for_path(locale_descendant);
 
-	ret = g_file_get_relative_path(gf_parent, gf_descendant);
+	locale_ret = g_file_get_relative_path(gf_parent, gf_descendant);
+	utf8_ret = utils_get_utf8_from_locale(locale_ret);
 
 	g_object_unref(gf_parent);
 	g_object_unref(gf_descendant);
+	g_free(locale_parent);
+	g_free(locale_descendant);
+	g_free(locale_ret);
 
-	return ret;
+	return utf8_ret;
 }
 
 
@@ -118,6 +126,7 @@ gchar *get_selection(void)
 }
 
 
+/* utf8 */
 gchar *get_project_base_path(void)
 {
 	GeanyProject *project = geany_data->app->project;


Modified: projectorganizer/src/prjorg-utils.h
2 lines changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -19,7 +19,7 @@
 #ifndef __PRJORG_UTILS_H__
 #define __PRJORG_UTILS_H__
 
-gchar *get_relative_path(const gchar *parent, const gchar *descendant);
+gchar *get_relative_path(const gchar *utf8_parent, const gchar *utf8_descendant);
 
 gboolean patterns_match(GSList *patterns, const gchar *str);
 GSList *get_precompiled_patterns(gchar **patterns);



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Plugins-Commits mailing list