Fix bug 139692 - Some characters cannot be given as the theme name

2006-04-26  Thomas Wood  <thos@gnome.org>

	* gnome-theme-save.c: (str_remove_slash),
	(setup_directory_structure), (write_theme_to_disk),
	(gnome_theme_save_show_dialog):

	Fix bug 139692 - Some characters cannot be given as the theme name
This commit is contained in:
Thomas Wood 2006-04-26 20:21:46 +00:00 committed by Thomas Wood
parent ea5a631565
commit a2609c1513
2 changed files with 51 additions and 34 deletions

View file

@ -1,3 +1,11 @@
2006-04-26 Thomas Wood <thos@gnome.org>
* gnome-theme-save.c: (str_remove_slash),
(setup_directory_structure), (write_theme_to_disk),
(gnome_theme_save_show_dialog):
Fix bug 139692 - Some characters cannot be given as the theme name
2006-04-25 Thomas Wood <thos@gnome.org>
* Makefile.am:

View file

@ -75,13 +75,48 @@ check_theme_name (const gchar *theme_name,
return TRUE;
}
static gchar*
str_remove_slash (const gchar *src)
{
const gchar *i;
gchar *rtn;
gint len = 0;
i = src;
while (*i)
{
if (*i != '/')
len++;
i++;
}
rtn = (gchar *) g_malloc (len + 1);
while (*src)
{
if (*src != '/')
{
*rtn = *src;
rtn++;
}
src++;
}
rtn++;
*rtn = '\0';
return rtn - len - 1;
}
static gboolean
setup_directory_structure (const gchar *theme_name,
GError **error)
{
gchar *dir;
gchar *dir, *theme_name_dir;
GnomeVFSURI *uri;
theme_name_dir = str_remove_slash (theme_name);
dir = g_build_filename (g_get_home_dir (), ".themes", NULL);
uri = gnome_vfs_uri_new (dir);
if (!gnome_vfs_uri_exists (uri))
@ -89,7 +124,7 @@ setup_directory_structure (const gchar *theme_name,
gnome_vfs_uri_unref (uri);
g_free (dir);
dir = g_build_filename (g_get_home_dir (), ".themes", theme_name, NULL);
dir = g_build_filename (g_get_home_dir (), ".themes", theme_name_dir, NULL);
uri = gnome_vfs_uri_new (dir);
if (!gnome_vfs_uri_exists (uri))
gnome_vfs_make_directory_for_uri (uri, 0775);
@ -110,6 +145,7 @@ setup_directory_structure (const gchar *theme_name,
gnome_vfs_uri_unref (uri);
g_free (dir);
g_free (theme_name_dir);
return TRUE;
}
@ -120,14 +156,17 @@ write_theme_to_disk (GnomeThemeMetaInfo *meta_theme_info,
const gchar *theme_description,
GError **error)
{
gchar *dir;
gchar *dir, *theme_name_dir;
GnomeVFSURI *uri;
GnomeVFSURI *target_uri;
GnomeVFSHandle *handle = NULL;
GnomeVFSFileSize bytes_written;
gchar *str;
dir = g_build_filename (g_get_home_dir (), ".themes", theme_name, "index.theme~", NULL);
theme_name_dir = str_remove_slash (theme_name);
dir = g_build_filename (g_get_home_dir (), ".themes", theme_name_dir, "index.theme~", NULL);
g_free (theme_name_dir);
uri = gnome_vfs_uri_new (dir);
dir [strlen (dir) - 1] = '\000';
target_uri = gnome_vfs_uri_new (dir);
@ -226,35 +265,6 @@ save_dialog_response (GtkWidget *save_dialog,
g_free (theme_description);
}
static inline gboolean
is_valid_theme_char (char c)
{
static const gchar *invalid_chars = "/?'\"\\|*.";
const char *p;
for (p = invalid_chars; *p != '\000'; p++)
if (c == *p) return FALSE;
return TRUE;
}
static void
entry_text_filter (GtkEditable *editable,
const gchar *text,
gint length,
gint *position,
gpointer data)
{
gint i;
for (i = 0; i < length; i ++)
{
if (! is_valid_theme_char (text[i]))
{
g_signal_stop_emission_by_name (editable, "insert_text");
return;
}
}
}
static void
entry_text_changed (GtkEditable *editable,
@ -292,7 +302,6 @@ gnome_theme_save_show_dialog (GtkWidget *parent,
g_signal_connect (G_OBJECT (save_dialog), "response", G_CALLBACK (save_dialog_response), NULL);
g_signal_connect (G_OBJECT (save_dialog), "delete-event", G_CALLBACK (gtk_true), NULL);
g_signal_connect (G_OBJECT (entry), "insert_text", G_CALLBACK (entry_text_filter), NULL);
g_signal_connect (G_OBJECT (entry), "changed", G_CALLBACK (entry_text_changed), dialog);
error_quark = g_quark_from_string ("gnome-theme-save");