Blame gtk/gtkfilechoosersettings.c

Packit Service fb6fa5
/* GTK - The GIMP Toolkit
Packit Service fb6fa5
 * gtkfilechoosersettings.c: Internal settings for the GtkFileChooser widget
Packit Service fb6fa5
 * Copyright (C) 2006, Novell, Inc.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Authors: Federico Mena-Quintero <federico@novell.com>
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is free software; you can redistribute it and/or
Packit Service fb6fa5
 * modify it under the terms of the GNU Lesser General Public
Packit Service fb6fa5
 * License as published by the Free Software Foundation; either
Packit Service fb6fa5
 * version 2 of the License, or (at your option) any later version.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service fb6fa5
 * Lesser General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Lesser General Public
Packit Service fb6fa5
 * License along with this library; if not, write to the
Packit Service fb6fa5
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service fb6fa5
 * Boston, MA 02111-1307, USA.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
/* TODO:
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * - Persist these:
Packit Service fb6fa5
 *   - hpaned position
Packit Service fb6fa5
 *   - browse_for_other_folders?
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * - Do we want lockdown?
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include "config.h"
Packit Service fb6fa5
#include <errno.h>
Packit Service fb6fa5
#include <string.h>
Packit Service fb6fa5
#include <glib.h>
Packit Service fb6fa5
#include <glib/gi18n-lib.h>
Packit Service fb6fa5
#include "gtkfilechoosersettings.h"
Packit Service fb6fa5
#include "gtkalias.h"
Packit Service fb6fa5
Packit Service fb6fa5
#define SETTINGS_GROUP		"Filechooser Settings"
Packit Service fb6fa5
#define LOCATION_MODE_KEY	"LocationMode"
Packit Service fb6fa5
#define SHOW_HIDDEN_KEY		"ShowHidden"
Packit Service fb6fa5
#define SHOW_SIZE_COLUMN_KEY    "ShowSizeColumn"
Packit Service fb6fa5
#define GEOMETRY_X_KEY		"GeometryX"
Packit Service fb6fa5
#define GEOMETRY_Y_KEY		"GeometryY"
Packit Service fb6fa5
#define GEOMETRY_WIDTH_KEY	"GeometryWidth"
Packit Service fb6fa5
#define GEOMETRY_HEIGHT_KEY	"GeometryHeight"
Packit Service fb6fa5
#define SORT_COLUMN_KEY         "SortColumn"
Packit Service fb6fa5
#define SORT_ORDER_KEY          "SortOrder"
Packit Service fb6fa5
#define STARTUP_MODE_KEY        "StartupMode"
Packit Service fb6fa5
Packit Service fb6fa5
#define COLUMN_NAME_STRING      "name"
Packit Service fb6fa5
#define COLUMN_MTIME_STRING     "modified"
Packit Service fb6fa5
#define COLUMN_SIZE_STRING      "size"
Packit Service fb6fa5
#define SORT_ASCENDING_STRING   "ascending"
Packit Service fb6fa5
#define SORT_DESCENDING_STRING  "descending"
Packit Service fb6fa5
Packit Service fb6fa5
#define STARTUP_MODE_RECENT_STRING "recent"
Packit Service fb6fa5
#define STARTUP_MODE_CWD_STRING    "cwd"
Packit Service fb6fa5
Packit Service fb6fa5
#define MODE_PATH_BAR          "path-bar"
Packit Service fb6fa5
#define MODE_FILENAME_ENTRY    "filename-entry"
Packit Service fb6fa5
Packit Service fb6fa5
#define EQ(a, b) (g_ascii_strcasecmp ((a), (b)) == 0)
Packit Service fb6fa5
Packit Service fb6fa5
static char *
Packit Service fb6fa5
get_config_dirname (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return g_build_filename (g_get_user_config_dir (), "gtk-2.0", NULL);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static char *
Packit Service fb6fa5
get_config_filename (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return g_build_filename (g_get_user_config_dir (), "gtk-2.0", "gtkfilechooser.ini", NULL);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
warn_if_invalid_key_and_clear_error (const gchar  *key,
Packit Service fb6fa5
                                     GError      **error)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (error && *error)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if ((*error)->domain == G_KEY_FILE_ERROR &&
Packit Service fb6fa5
          (*error)->code != G_KEY_FILE_ERROR_KEY_NOT_FOUND)
Packit Service fb6fa5
        g_warning ("Failed to read '%s' setting in filechooser settings: %s",
Packit Service fb6fa5
                   key,
Packit Service fb6fa5
                   (*error)->message);
Packit Service fb6fa5
Packit Service fb6fa5
      g_clear_error (error);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
get_int_key (GKeyFile *key_file, const char *group, const char *key, int *out_value)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GError *error;
Packit Service fb6fa5
  int val;
Packit Service fb6fa5
Packit Service fb6fa5
  error = NULL;
Packit Service fb6fa5
  val = g_key_file_get_integer (key_file, group, key, &error);
Packit Service fb6fa5
Packit Service fb6fa5
  if (val == 0 && error != NULL)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      *out_value = -1;
Packit Service fb6fa5
      g_error_free (error);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    *out_value = val;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
ensure_settings_read (GtkFileChooserSettings *settings)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GError *error;
Packit Service fb6fa5
  GKeyFile *key_file;
Packit Service fb6fa5
  gchar *location_mode_str, *filename;
Packit Service fb6fa5
  gchar *sort_column, *sort_order;
Packit Service fb6fa5
  gchar *startup_mode;
Packit Service fb6fa5
  gboolean value;
Packit Service fb6fa5
Packit Service fb6fa5
  if (settings->settings_read)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  key_file = g_key_file_new ();
Packit Service fb6fa5
Packit Service fb6fa5
  filename = get_config_filename ();
Packit Service fb6fa5
Packit Service fb6fa5
  error = NULL;
Packit Service fb6fa5
  if (!g_key_file_load_from_file (key_file, filename, 0, &error))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* Don't warn on non-existent file */
Packit Service fb6fa5
      if (error->domain != G_FILE_ERROR ||
Packit Service fb6fa5
	  error->code != G_FILE_ERROR_NOENT)
Packit Service fb6fa5
        g_warning ("Failed to read filechooser settings from \"%s\": %s",
Packit Service fb6fa5
                   filename, error->message);
Packit Service fb6fa5
Packit Service fb6fa5
      g_error_free (error);
Packit Service fb6fa5
      goto out;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (!g_key_file_has_group (key_file, SETTINGS_GROUP))
Packit Service fb6fa5
    goto out;
Packit Service fb6fa5
Packit Service fb6fa5
  /* Location mode */
Packit Service fb6fa5
Packit Service fb6fa5
  location_mode_str = g_key_file_get_string (key_file, SETTINGS_GROUP,
Packit Service fb6fa5
					     LOCATION_MODE_KEY, NULL);
Packit Service fb6fa5
  if (location_mode_str)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (EQ (location_mode_str, MODE_PATH_BAR))
Packit Service fb6fa5
        settings->location_mode = LOCATION_MODE_PATH_BAR;
Packit Service fb6fa5
      else if (EQ (location_mode_str, MODE_FILENAME_ENTRY))
Packit Service fb6fa5
        settings->location_mode = LOCATION_MODE_FILENAME_ENTRY;
Packit Service fb6fa5
      else
Packit Service fb6fa5
        g_warning ("Unknown location mode '%s' encountered in filechooser settings",
Packit Service fb6fa5
		   location_mode_str);
Packit Service fb6fa5
Packit Service fb6fa5
      g_free (location_mode_str);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* Show hidden */
Packit Service fb6fa5
Packit Service fb6fa5
  value = g_key_file_get_boolean (key_file, SETTINGS_GROUP,
Packit Service fb6fa5
				  SHOW_HIDDEN_KEY, &error);
Packit Service fb6fa5
  if (error)
Packit Service fb6fa5
    warn_if_invalid_key_and_clear_error (SHOW_HIDDEN_KEY, &error);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    settings->show_hidden = value != FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  /* Show size column */
Packit Service fb6fa5
Packit Service fb6fa5
  value = g_key_file_get_boolean (key_file, SETTINGS_GROUP,
Packit Service fb6fa5
				  SHOW_SIZE_COLUMN_KEY, &error);
Packit Service fb6fa5
  if (error)
Packit Service fb6fa5
    warn_if_invalid_key_and_clear_error (SHOW_SIZE_COLUMN_KEY, &error);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    settings->show_size_column = value != FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  /* Geometry */
Packit Service fb6fa5
Packit Service fb6fa5
  get_int_key (key_file, SETTINGS_GROUP, GEOMETRY_X_KEY, &settings->geometry_x);
Packit Service fb6fa5
  get_int_key (key_file, SETTINGS_GROUP, GEOMETRY_Y_KEY, &settings->geometry_y);
Packit Service fb6fa5
  get_int_key (key_file, SETTINGS_GROUP, GEOMETRY_WIDTH_KEY, &settings->geometry_width);
Packit Service fb6fa5
  get_int_key (key_file, SETTINGS_GROUP, GEOMETRY_HEIGHT_KEY, &settings->geometry_height);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Sort column */
Packit Service fb6fa5
Packit Service fb6fa5
  sort_column = g_key_file_get_string (key_file, SETTINGS_GROUP,
Packit Service fb6fa5
				       SORT_COLUMN_KEY, NULL);
Packit Service fb6fa5
  if (sort_column)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (EQ (COLUMN_NAME_STRING, sort_column))
Packit Service fb6fa5
	settings->sort_column = FILE_LIST_COL_NAME;
Packit Service fb6fa5
      else if (EQ (COLUMN_MTIME_STRING, sort_column))
Packit Service fb6fa5
	settings->sort_column = FILE_LIST_COL_MTIME;
Packit Service fb6fa5
      else if (EQ (COLUMN_SIZE_STRING, sort_column))
Packit Service fb6fa5
	settings->sort_column = FILE_LIST_COL_SIZE;
Packit Service fb6fa5
      else
Packit Service fb6fa5
	g_warning ("Unknown sort column name '%s' encountered in filechooser settings",
Packit Service fb6fa5
		   sort_column);
Packit Service fb6fa5
Packit Service fb6fa5
      g_free (sort_column);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* Sort order */
Packit Service fb6fa5
Packit Service fb6fa5
  sort_order = g_key_file_get_string (key_file, SETTINGS_GROUP,
Packit Service fb6fa5
				      SORT_ORDER_KEY, NULL);
Packit Service fb6fa5
  if (sort_order)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (EQ (SORT_ASCENDING_STRING, sort_order))
Packit Service fb6fa5
	settings->sort_order = GTK_SORT_ASCENDING;
Packit Service fb6fa5
      else if (EQ (SORT_DESCENDING_STRING, sort_order))
Packit Service fb6fa5
	settings->sort_order = GTK_SORT_DESCENDING;
Packit Service fb6fa5
      else
Packit Service fb6fa5
	g_warning ("Unknown sort column order '%s' encountered in filechooser settings",
Packit Service fb6fa5
		   sort_order);
Packit Service fb6fa5
Packit Service fb6fa5
      g_free (sort_order);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* Startup mode */
Packit Service fb6fa5
Packit Service fb6fa5
  startup_mode = g_key_file_get_string (key_file, SETTINGS_GROUP,
Packit Service fb6fa5
					STARTUP_MODE_KEY, NULL);
Packit Service fb6fa5
  if (startup_mode)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (EQ (STARTUP_MODE_RECENT_STRING, startup_mode))
Packit Service fb6fa5
	settings->startup_mode = STARTUP_MODE_RECENT;
Packit Service fb6fa5
      else if (EQ (STARTUP_MODE_CWD_STRING, startup_mode))
Packit Service fb6fa5
	settings->startup_mode = STARTUP_MODE_CWD;
Packit Service fb6fa5
      else
Packit Service fb6fa5
	g_warning ("Unknown startup mode '%s' encountered in filechooser settings",
Packit Service fb6fa5
		   startup_mode);
Packit Service fb6fa5
Packit Service fb6fa5
      g_free (startup_mode);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
 out:
Packit Service fb6fa5
Packit Service fb6fa5
  g_key_file_free (key_file);
Packit Service fb6fa5
  g_free (filename);
Packit Service fb6fa5
Packit Service fb6fa5
  settings->settings_read = TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
G_DEFINE_TYPE (GtkFileChooserSettings, _gtk_file_chooser_settings, G_TYPE_OBJECT)
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
_gtk_file_chooser_settings_class_init (GtkFileChooserSettingsClass *class)
Packit Service fb6fa5
{
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
_gtk_file_chooser_settings_init (GtkFileChooserSettings *settings)
Packit Service fb6fa5
{
Packit Service fb6fa5
  settings->location_mode = LOCATION_MODE_PATH_BAR;
Packit Service fb6fa5
  settings->sort_order = GTK_SORT_ASCENDING;
Packit Service fb6fa5
  settings->sort_column = FILE_LIST_COL_NAME;
Packit Service fb6fa5
  settings->show_hidden = FALSE;
Packit Service fb6fa5
  settings->show_size_column = TRUE;
Packit Service fb6fa5
  settings->geometry_x	    = -1;
Packit Service fb6fa5
  settings->geometry_y	    = -1;
Packit Service fb6fa5
  settings->geometry_width  = -1;
Packit Service fb6fa5
  settings->geometry_height = -1;
Packit Service fb6fa5
  settings->startup_mode = STARTUP_MODE_RECENT;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GtkFileChooserSettings *
Packit Service fb6fa5
_gtk_file_chooser_settings_new (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return g_object_new (GTK_FILE_CHOOSER_SETTINGS_TYPE, NULL);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
LocationMode
Packit Service fb6fa5
_gtk_file_chooser_settings_get_location_mode (GtkFileChooserSettings *settings)
Packit Service fb6fa5
{
Packit Service fb6fa5
  ensure_settings_read (settings);
Packit Service fb6fa5
  return settings->location_mode;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_file_chooser_settings_set_location_mode (GtkFileChooserSettings *settings,
Packit Service fb6fa5
					      LocationMode location_mode)
Packit Service fb6fa5
{
Packit Service fb6fa5
  settings->location_mode = location_mode;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
_gtk_file_chooser_settings_get_show_hidden (GtkFileChooserSettings *settings)
Packit Service fb6fa5
{
Packit Service fb6fa5
  ensure_settings_read (settings);
Packit Service fb6fa5
  return settings->show_hidden;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_file_chooser_settings_set_show_hidden (GtkFileChooserSettings *settings,
Packit Service fb6fa5
					    gboolean show_hidden)
Packit Service fb6fa5
{
Packit Service fb6fa5
  settings->show_hidden = show_hidden != FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_file_chooser_settings_set_show_size_column (GtkFileChooserSettings *settings,
Packit Service fb6fa5
					         gboolean show_column)
Packit Service fb6fa5
{
Packit Service fb6fa5
  settings->show_size_column = show_column != FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
_gtk_file_chooser_settings_get_show_size_column (GtkFileChooserSettings *settings)
Packit Service fb6fa5
{
Packit Service fb6fa5
  ensure_settings_read (settings);
Packit Service fb6fa5
  return settings->show_size_column;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_file_chooser_settings_get_geometry (GtkFileChooserSettings *settings,
Packit Service fb6fa5
					 int                    *out_x,
Packit Service fb6fa5
					 int                    *out_y,
Packit Service fb6fa5
					 int                    *out_width,
Packit Service fb6fa5
					 int                    *out_height)
Packit Service fb6fa5
{
Packit Service fb6fa5
  ensure_settings_read (settings);
Packit Service fb6fa5
Packit Service fb6fa5
  *out_x      = settings->geometry_x;
Packit Service fb6fa5
  *out_y      = settings->geometry_y;
Packit Service fb6fa5
  *out_width  = settings->geometry_width;
Packit Service fb6fa5
  *out_height = settings->geometry_height;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_file_chooser_settings_set_geometry (GtkFileChooserSettings *settings,
Packit Service fb6fa5
					 int                     x,
Packit Service fb6fa5
					 int                     y,
Packit Service fb6fa5
					 int                     width,
Packit Service fb6fa5
					 int                     height)
Packit Service fb6fa5
{
Packit Service fb6fa5
  settings->geometry_x	    = x;
Packit Service fb6fa5
  settings->geometry_y	    = y;
Packit Service fb6fa5
  settings->geometry_width  = width;
Packit Service fb6fa5
  settings->geometry_height = height;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gint
Packit Service fb6fa5
_gtk_file_chooser_settings_get_sort_column (GtkFileChooserSettings *settings)
Packit Service fb6fa5
{
Packit Service fb6fa5
  ensure_settings_read (settings);
Packit Service fb6fa5
  return settings->sort_column;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_file_chooser_settings_set_sort_column (GtkFileChooserSettings *settings,
Packit Service fb6fa5
					    gint sort_column)
Packit Service fb6fa5
{
Packit Service fb6fa5
  settings->sort_column = sort_column;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GtkSortType
Packit Service fb6fa5
_gtk_file_chooser_settings_get_sort_order (GtkFileChooserSettings *settings)
Packit Service fb6fa5
{
Packit Service fb6fa5
  ensure_settings_read (settings);
Packit Service fb6fa5
  return settings->sort_order;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_file_chooser_settings_set_sort_order (GtkFileChooserSettings *settings,
Packit Service fb6fa5
					   GtkSortType sort_order)
Packit Service fb6fa5
{
Packit Service fb6fa5
  settings->sort_order = sort_order;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_file_chooser_settings_set_startup_mode (GtkFileChooserSettings *settings,
Packit Service fb6fa5
					     StartupMode             startup_mode)
Packit Service fb6fa5
{
Packit Service fb6fa5
  settings->startup_mode = startup_mode;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
StartupMode
Packit Service fb6fa5
_gtk_file_chooser_settings_get_startup_mode (GtkFileChooserSettings *settings)
Packit Service fb6fa5
{
Packit Service fb6fa5
  ensure_settings_read (settings);
Packit Service fb6fa5
  return settings->startup_mode;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
_gtk_file_chooser_settings_save (GtkFileChooserSettings *settings,
Packit Service fb6fa5
				 GError                **error)
Packit Service fb6fa5
{
Packit Service fb6fa5
  const gchar *location_mode_str;
Packit Service fb6fa5
  gchar *filename;
Packit Service fb6fa5
  gchar *dirname;
Packit Service fb6fa5
  gchar *contents;
Packit Service fb6fa5
  gchar *sort_column;
Packit Service fb6fa5
  gchar *sort_order;
Packit Service fb6fa5
  gchar *startup_mode;
Packit Service fb6fa5
  gsize len;
Packit Service fb6fa5
  gboolean retval;
Packit Service fb6fa5
  GKeyFile *key_file;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  filename = get_config_filename ();
Packit Service fb6fa5
  dirname = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  retval = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (settings->location_mode == LOCATION_MODE_PATH_BAR)
Packit Service fb6fa5
    location_mode_str = MODE_PATH_BAR;
Packit Service fb6fa5
  else if (settings->location_mode == LOCATION_MODE_FILENAME_ENTRY)
Packit Service fb6fa5
    location_mode_str = MODE_FILENAME_ENTRY;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_assert_not_reached ();
Packit Service fb6fa5
      return FALSE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  switch (settings->sort_column)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case FILE_LIST_COL_NAME:
Packit Service fb6fa5
      sort_column = COLUMN_NAME_STRING;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case FILE_LIST_COL_MTIME:
Packit Service fb6fa5
      sort_column = COLUMN_MTIME_STRING;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case FILE_LIST_COL_SIZE:
Packit Service fb6fa5
      sort_column = COLUMN_SIZE_STRING;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      g_assert_not_reached ();
Packit Service fb6fa5
      sort_column = NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  switch (settings->sort_order)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case GTK_SORT_ASCENDING:
Packit Service fb6fa5
      sort_order = SORT_ASCENDING_STRING;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case GTK_SORT_DESCENDING:
Packit Service fb6fa5
      sort_order = SORT_DESCENDING_STRING;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      g_assert_not_reached ();
Packit Service fb6fa5
      sort_order = NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  switch (settings->startup_mode)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case STARTUP_MODE_RECENT:
Packit Service fb6fa5
      startup_mode = STARTUP_MODE_RECENT_STRING;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case STARTUP_MODE_CWD:
Packit Service fb6fa5
      startup_mode = STARTUP_MODE_CWD_STRING;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      g_assert_not_reached ();
Packit Service fb6fa5
      startup_mode = NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  key_file = g_key_file_new ();
Packit Service fb6fa5
Packit Service fb6fa5
  /* Initialise with the on-disk keyfile, so we keep unknown options */
Packit Service fb6fa5
  g_key_file_load_from_file (key_file, filename, 0, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  g_key_file_set_string (key_file, SETTINGS_GROUP,
Packit Service fb6fa5
			 LOCATION_MODE_KEY, location_mode_str);
Packit Service fb6fa5
  g_key_file_set_boolean (key_file, SETTINGS_GROUP,
Packit Service fb6fa5
			  SHOW_HIDDEN_KEY, settings->show_hidden);
Packit Service fb6fa5
  g_key_file_set_boolean (key_file, SETTINGS_GROUP,
Packit Service fb6fa5
			  SHOW_SIZE_COLUMN_KEY, settings->show_size_column);
Packit Service fb6fa5
  g_key_file_set_integer (key_file, SETTINGS_GROUP,
Packit Service fb6fa5
			  GEOMETRY_X_KEY, settings->geometry_x);
Packit Service fb6fa5
  g_key_file_set_integer (key_file, SETTINGS_GROUP,
Packit Service fb6fa5
			  GEOMETRY_Y_KEY, settings->geometry_y);
Packit Service fb6fa5
  g_key_file_set_integer (key_file, SETTINGS_GROUP,
Packit Service fb6fa5
			  GEOMETRY_WIDTH_KEY, settings->geometry_width);
Packit Service fb6fa5
  g_key_file_set_integer (key_file, SETTINGS_GROUP,
Packit Service fb6fa5
			  GEOMETRY_HEIGHT_KEY, settings->geometry_height);
Packit Service fb6fa5
  g_key_file_set_string (key_file, SETTINGS_GROUP,
Packit Service fb6fa5
			 SORT_COLUMN_KEY, sort_column);
Packit Service fb6fa5
  g_key_file_set_string (key_file, SETTINGS_GROUP,
Packit Service fb6fa5
			 SORT_ORDER_KEY, sort_order);
Packit Service fb6fa5
  g_key_file_set_string (key_file, SETTINGS_GROUP,
Packit Service fb6fa5
			 STARTUP_MODE_KEY, startup_mode);
Packit Service fb6fa5
Packit Service fb6fa5
  contents = g_key_file_to_data (key_file, &len, error);
Packit Service fb6fa5
  g_key_file_free (key_file);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!contents)
Packit Service fb6fa5
    goto out;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!g_file_set_contents (filename, contents, len, NULL))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      char *dirname;
Packit Service fb6fa5
      int saved_errno;
Packit Service fb6fa5
Packit Service fb6fa5
      /* Directory is not there? */
Packit Service fb6fa5
Packit Service fb6fa5
      dirname = get_config_dirname ();
Packit Service fb6fa5
      if (g_mkdir_with_parents (dirname, 0700) != 0) /* 0700 per the XDG basedir spec */
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  saved_errno = errno;
Packit Service fb6fa5
	  g_set_error (error,
Packit Service fb6fa5
		       G_FILE_ERROR,
Packit Service fb6fa5
		       g_file_error_from_errno (saved_errno),
Packit Service fb6fa5
		       _("Error creating folder '%s': %s"),
Packit Service fb6fa5
		       dirname, g_strerror (saved_errno));
Packit Service fb6fa5
	  goto out;
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      if (!g_file_set_contents (filename, contents, len, error))
Packit Service fb6fa5
	goto out;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  retval = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
 out:
Packit Service fb6fa5
Packit Service fb6fa5
  g_free (contents);
Packit Service fb6fa5
  g_free (dirname);
Packit Service fb6fa5
  g_free (filename);
Packit Service fb6fa5
Packit Service fb6fa5
  return retval;
Packit Service fb6fa5
}