/* gdict-common.h - shared code between application and applet * * This file is part of GNOME Dictionary * * Copyright (C) 2005 Emmanuele Bassi * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include #include "gdict-common.h" gchar * gdict_get_data_dir (void) { gchar *retval; retval = g_build_filename (g_get_user_data_dir (), g_get_prgname (), NULL); return retval; } /* legacy data dir. pre 3.3.4 */ gchar * gdict_get_old_data_dir (void) { gchar *retval; retval = g_build_filename (g_get_home_dir (), ".gnome2", "gnome-dictionary", NULL); return retval; } gchar * gdict_get_config_dir (void) { gchar *retval; retval = g_build_filename (g_get_user_config_dir (), g_get_prgname (), NULL); return retval; } gboolean gdict_migrate_configs (void) { gchar *old_data_dir_name; // this one was used for configs only gchar *config_dir_name; gboolean res = TRUE; old_data_dir_name = gdict_get_old_data_dir (); config_dir_name = gdict_get_config_dir (); /* move configs from pre-XDG directory to right place */ if (g_file_test (old_data_dir_name, G_FILE_TEST_IS_DIR)) { g_message ("Migrating old configs to XDG directory layout..."); if (g_rename (old_data_dir_name, config_dir_name) == -1) { g_critical ("Unable to rename file '%s' to '%s': %s", old_data_dir_name, config_dir_name, g_strerror (errno)); res = FALSE; } } g_free (config_dir_name); g_free (old_data_dir_name); return res; } gboolean gdict_create_config_dir (void) { gchar *config_dir_name; gboolean res = TRUE; config_dir_name = gdict_get_config_dir (); gdict_migrate_configs (); if (!g_file_test (config_dir_name, G_FILE_TEST_IS_DIR)) { if (!g_file_test (config_dir_name, G_FILE_TEST_IS_DIR)) { g_message ("Creating XDG config direcotry: %s", config_dir_name); if (g_mkdir (config_dir_name, 0700) == -1) { g_critical ("Unable to create directory '%s': %s", config_dir_name, g_strerror (errno)); res = FALSE; } } } g_free (config_dir_name); return res; } /* create the data directory inside $HOME, if it doesn't exist yet */ gboolean gdict_create_data_dir (void) { gchar *data_dir_name; data_dir_name = gdict_get_data_dir (); if (g_mkdir (data_dir_name, 0700) == -1) { /* this is weird, but sometimes there's a "gnome-dictionary" file * inside $HOME/.gnome2; see bug #329126. */ if ((errno == EEXIST) && (g_file_test (data_dir_name, G_FILE_TEST_IS_REGULAR))) { gchar *backup = g_strdup_printf ("%s.pre-2-14", data_dir_name); if (g_rename (data_dir_name, backup) == -1) { g_critical ("Unable to rename file '%s' to '%s': %s", data_dir_name, backup, g_strerror (errno)); g_free (backup); goto error; } g_free (backup); if (g_mkdir (data_dir_name, 0700) == -1) { g_critical ("Unable to create the data directory '%s': %s", data_dir_name, g_strerror (errno)); goto error; } goto success; } if (errno != EEXIST) { g_critical ("Unable to create the data directory '%s': %s", data_dir_name, g_strerror (errno)); goto error; } } success: g_free (data_dir_name); return TRUE; error: g_free (data_dir_name); return FALSE; } /* shows an error dialog making it transient for @parent */ void gdict_show_error_dialog (GtkWindow *parent, const gchar *message, const gchar *detail) { GtkWidget *dialog; g_return_if_fail ((parent == NULL) || (GTK_IS_WINDOW (parent))); g_return_if_fail (message != NULL); dialog = gtk_message_dialog_new (parent, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", message); gtk_window_set_title (GTK_WINDOW (dialog), ""); if (detail) gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s", detail); if (parent && gtk_window_get_group (parent)) gtk_window_group_add_window (gtk_window_get_group (parent), GTK_WINDOW (dialog)); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); } void gdict_show_gerror_dialog (GtkWindow *parent, const gchar *message, GError *error) { g_return_if_fail ((parent == NULL) || (GTK_IS_WINDOW (parent))); g_return_if_fail (message != NULL); g_return_if_fail (error != NULL); gdict_show_error_dialog (parent, message, error->message); g_error_free (error); error = NULL; }