mirror of https://github.com/GNOME/gimp.git
app: config folder migration update for GIMP 3.
Fix the search for previous folders, which was broken as it was specifically expecting 1-digit numbers so far. The differences of the GIMP 3 config import are: - update sizes and positions in the sessionrc according to the scale factor, because GTK2 doesn't have scale support. It means that, e.g. with a 2× display, all sizes and positions in GIMP 2.x must be divided by 2 (otherwise the first thing many people will get when testing GIMP 3 for the first time is an off-screen window). Of course, I even wondered if it would not be nice to just drop the sessionrc altogether and start with a nice blank slate, but then you also lose the opened dock and their organization and some settings (such as whether you chose single or multi window mode, etc.). - scripts/ and plug-ins/ are not imported. Probably makes no sense so far as they would end up broken (but maybe it's not true for all script-fu scripts?).
This commit is contained in:
parent
fadda1b8db
commit
c43de62e99
|
@ -272,10 +272,10 @@ app_run (const gchar *full_prog_name,
|
|||
be_verbose);
|
||||
|
||||
#ifdef GIMP_CONSOLE_COMPILATION
|
||||
gimp_user_install_run (install);
|
||||
gimp_user_install_run (install, 1);
|
||||
#else
|
||||
if (! (no_interface ?
|
||||
gimp_user_install_run (install) :
|
||||
gimp_user_install_run (install, 1) :
|
||||
user_install_dialog_run (install)))
|
||||
exit (EXIT_FAILURE);
|
||||
#endif
|
||||
|
|
|
@ -45,6 +45,7 @@ gimp_config_file_copy (const gchar *source,
|
|||
const gchar *dest,
|
||||
const gchar *old_options_pattern,
|
||||
GRegexEvalCallback update_callback,
|
||||
gpointer user_data,
|
||||
GError **error)
|
||||
{
|
||||
gchar buffer[8192];
|
||||
|
@ -129,7 +130,7 @@ gimp_config_file_copy (const gchar *source,
|
|||
|
||||
write_bytes = g_regex_replace_eval (old_options_regexp, buffer,
|
||||
read_len, 0, 0, update_callback,
|
||||
NULL, error);
|
||||
user_data, error);
|
||||
if (write_bytes == NULL)
|
||||
{
|
||||
/* error already set. */
|
||||
|
@ -226,7 +227,7 @@ gimp_config_file_backup_on_error (GFile *file,
|
|||
path = g_file_get_path (file);
|
||||
backup = g_strconcat (path, "~", NULL);
|
||||
|
||||
success = gimp_config_file_copy (path, backup, NULL, NULL, error);
|
||||
success = gimp_config_file_copy (path, backup, NULL, NULL, NULL, error);
|
||||
|
||||
if (success)
|
||||
g_message (_("There was an error parsing your '%s' file. "
|
||||
|
|
|
@ -26,6 +26,7 @@ gboolean gimp_config_file_copy (const gchar *source,
|
|||
const gchar *dest,
|
||||
const gchar *old_options_regexp,
|
||||
GRegexEvalCallback update_callback,
|
||||
gpointer user_data,
|
||||
GError **error);
|
||||
|
||||
gboolean gimp_config_file_backup_on_error (GFile *file,
|
||||
|
|
|
@ -69,6 +69,8 @@ struct _GimpUserInstall
|
|||
gint old_major;
|
||||
gint old_minor;
|
||||
|
||||
gint scale_factor;
|
||||
|
||||
const gchar *migrate;
|
||||
|
||||
GimpUserInstallLogFunc log;
|
||||
|
@ -202,12 +204,14 @@ gimp_user_install_new (GObject *gimp,
|
|||
}
|
||||
|
||||
gboolean
|
||||
gimp_user_install_run (GimpUserInstall *install)
|
||||
gimp_user_install_run (GimpUserInstall *install,
|
||||
gint scale_factor)
|
||||
{
|
||||
gchar *dirname;
|
||||
|
||||
g_return_val_if_fail (install != NULL, FALSE);
|
||||
|
||||
install->scale_factor = scale_factor;
|
||||
dirname = g_filename_display_name (gimp_directory ());
|
||||
|
||||
if (install->migrate)
|
||||
|
@ -269,6 +273,7 @@ user_install_detect_old (GimpUserInstall *install,
|
|||
gboolean migrate = FALSE;
|
||||
|
||||
version = strstr (dir, GIMP_APP_VERSION);
|
||||
g_snprintf (version, 5, "%d.XY", 2);
|
||||
|
||||
if (version)
|
||||
{
|
||||
|
@ -277,7 +282,7 @@ user_install_detect_old (GimpUserInstall *install,
|
|||
for (i = (GIMP_MINOR_VERSION & ~1); i >= 0; i -= 2)
|
||||
{
|
||||
/* we assume that GIMP_APP_VERSION is in the form '2.x' */
|
||||
g_snprintf (version + 2, 2, "%d", i);
|
||||
g_snprintf (version + 2, 3, "%d", i);
|
||||
|
||||
migrate = g_file_test (dir, G_FILE_TEST_IS_DIR);
|
||||
|
||||
|
@ -420,7 +425,7 @@ user_install_file_copy (GimpUserInstall *install,
|
|||
gimp_filename_to_utf8 (dest),
|
||||
gimp_filename_to_utf8 (source));
|
||||
|
||||
success = gimp_config_file_copy (source, dest, old_options_regexp, update_callback, &error);
|
||||
success = gimp_config_file_copy (source, dest, old_options_regexp, update_callback, install, &error);
|
||||
|
||||
user_install_log_error (install, &error);
|
||||
|
||||
|
@ -612,6 +617,79 @@ user_update_controllerrc (const GMatchInfo *matched_value,
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
#define SESSIONRC_UPDATE_PATTERN \
|
||||
"\\(position [0-9]* [0-9]*\\)" "|" \
|
||||
"\\(size [0-9]* [0-9]*\\)"
|
||||
|
||||
static gboolean
|
||||
user_update_sessionrc (const GMatchInfo *matched_value,
|
||||
GString *new_value,
|
||||
gpointer data)
|
||||
{
|
||||
GimpUserInstall *install = (GimpUserInstall *) data;
|
||||
gchar *original;
|
||||
|
||||
original = g_match_info_fetch (matched_value, 0);
|
||||
|
||||
if (install->scale_factor != 1 && install->scale_factor > 0)
|
||||
{
|
||||
/* GTK < 3.0 didn't have scale factor support. It means that any
|
||||
* size and position back then would be in real pixel size. Now
|
||||
* with GTK3 and over, we need to think of position and size in
|
||||
* virtual/application pixels.
|
||||
* In particular it means that if we were to just copy the numbers
|
||||
* from GTK2 to GTK3 on a display with scale factor of 2, every
|
||||
* width, height and position would be 2 times too big (a full
|
||||
* screen window would end up off-screen).
|
||||
*/
|
||||
GRegex *regexp;
|
||||
GMatchInfo *match_info;
|
||||
gchar *match;
|
||||
|
||||
/* First copy the pattern title. */
|
||||
regexp = g_regex_new ("\\((position|size) ", 0, 0, NULL);
|
||||
g_regex_match (regexp, original, 0, &match_info);
|
||||
match = g_match_info_fetch (match_info, 0);
|
||||
g_string_append (new_value, match);
|
||||
|
||||
g_match_info_free (match_info);
|
||||
g_regex_unref (regexp);
|
||||
g_free (match);
|
||||
|
||||
/* Now copy the numbers. */
|
||||
regexp = g_regex_new ("[0-9]+", 0, 0, NULL);
|
||||
g_regex_match (regexp, original, 0, &match_info);
|
||||
|
||||
while (g_match_info_matches (match_info))
|
||||
{
|
||||
gint num;
|
||||
|
||||
match = g_match_info_fetch (match_info, 0);
|
||||
num = g_ascii_strtoll (match, NULL, 10);
|
||||
num /= install->scale_factor;
|
||||
|
||||
g_string_append_printf (new_value, " %d", num);
|
||||
|
||||
g_free (match);
|
||||
g_match_info_next (match_info, NULL);
|
||||
}
|
||||
|
||||
g_match_info_free (match_info);
|
||||
g_regex_unref (regexp);
|
||||
|
||||
g_string_append (new_value, ")");
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Just copy as-is. */
|
||||
g_string_append (new_value, original);
|
||||
}
|
||||
|
||||
g_free (original);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#define GIMPRC_UPDATE_PATTERN \
|
||||
"\\(theme [^)]*\\)" "|" \
|
||||
"\\(.*-path [^)]*\\)"
|
||||
|
@ -891,6 +969,15 @@ user_install_migrate_files (GimpUserInstall *install)
|
|||
{
|
||||
goto next_file;
|
||||
}
|
||||
else if (install->old_major < 3 &&
|
||||
strcmp (basename, "sessionrc") == 0)
|
||||
{
|
||||
/* We need to update size and positions because of scale
|
||||
* factor support.
|
||||
*/
|
||||
update_pattern = SESSIONRC_UPDATE_PATTERN;
|
||||
update_callback = user_update_sessionrc;
|
||||
}
|
||||
else if (strcmp (basename, "menurc") == 0)
|
||||
{
|
||||
switch (install->old_minor)
|
||||
|
@ -940,6 +1027,13 @@ user_install_migrate_files (GimpUserInstall *install)
|
|||
{
|
||||
goto next_file;
|
||||
}
|
||||
else if (install->old_major < 3 &&
|
||||
(strcmp (basename, "plug-ins") == 0 ||
|
||||
strcmp (basename, "scripts") == 0))
|
||||
{
|
||||
/* Major API update. */
|
||||
goto next_file;
|
||||
}
|
||||
|
||||
if (strcmp (basename, "gimpressionist") == 0)
|
||||
{
|
||||
|
|
|
@ -28,7 +28,8 @@ typedef void (* GimpUserInstallLogFunc) (const gchar *message,
|
|||
|
||||
GimpUserInstall * gimp_user_install_new (GObject *gimp,
|
||||
gboolean verbose);
|
||||
gboolean gimp_user_install_run (GimpUserInstall *install);
|
||||
gboolean gimp_user_install_run (GimpUserInstall *install,
|
||||
gint scale_factor);
|
||||
void gimp_user_install_free (GimpUserInstall *install);
|
||||
|
||||
void gimp_user_install_set_log_handler (GimpUserInstall *install,
|
||||
|
|
|
@ -53,7 +53,8 @@ user_install_dialog_run (GimpUserInstall *install)
|
|||
|
||||
dialog = user_install_dialog_new (install);
|
||||
|
||||
success = gimp_user_install_run (install);
|
||||
success = gimp_user_install_run (install,
|
||||
gtk_widget_get_scale_factor (dialog));
|
||||
|
||||
if (! success)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue