diff --git a/src/common/outbound.c b/src/common/outbound.c index aae7c830..3a4d6a10 100644 --- a/src/common/outbound.c +++ b/src/common/outbound.c @@ -3783,9 +3783,19 @@ cmd_url (struct session *sess, char *tbuf, char *word[], char *word_eol[]) if (zoitechat_import_theme (theme_path, &error)) { - message = g_strdup_printf (_("Theme \"%s\" imported."), basename); - fe_message (message, FE_MSG_INFO); - g_free (message); + if (zoitechat_apply_theme (basename, &error)) + { + message = g_strdup_printf (_("Theme \"%s\" imported and applied."), basename); + fe_message (message, FE_MSG_INFO); + handle_command (sess, "gui apply", FALSE); + g_free (message); + } + else + { + fe_message (error ? error->message : _("Theme imported, but failed to apply."), + FE_MSG_ERROR); + g_clear_error (&error); + } } else { diff --git a/src/common/zoitechat.c b/src/common/zoitechat.c index d1b962b8..dbb6e749 100644 --- a/src/common/zoitechat.c +++ b/src/common/zoitechat.c @@ -247,6 +247,85 @@ zoitechat_remote_win32 (void) } #endif + +static gboolean +zoitechat_copy_theme_file (const char *src, const char *dest, GError **error) +{ + char *data = NULL; + gsize len = 0; + + if (!g_file_get_contents (src, &data, &len, error)) + return FALSE; + + if (!g_file_set_contents (dest, data, len, error)) + { + g_free (data); + return FALSE; + } + + g_free (data); + return TRUE; +} + +gboolean +zoitechat_apply_theme (const char *theme_name, GError **error) +{ + char *theme_dir; + char *colors_src; + char *colors_dest; + char *events_src; + char *events_dest; + gboolean ok = FALSE; + + if (!theme_name || !*theme_name) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("No theme name specified.")); + return FALSE; + } + + theme_dir = g_build_filename (get_xdir (), "themes", theme_name, NULL); + colors_src = g_build_filename (theme_dir, "colors.conf", NULL); + colors_dest = g_build_filename (get_xdir (), "colors.conf", NULL); + events_src = g_build_filename (theme_dir, "pevents.conf", NULL); + events_dest = g_build_filename (get_xdir (), "pevents.conf", NULL); + + if (!g_file_test (colors_src, G_FILE_TEST_IS_REGULAR)) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, + _("This theme is missing a colors.conf file.")); + goto cleanup; + } + + if (!zoitechat_copy_theme_file (colors_src, colors_dest, error)) + goto cleanup; + + if (g_file_test (events_src, G_FILE_TEST_IS_REGULAR)) + { + if (!zoitechat_copy_theme_file (events_src, events_dest, error)) + goto cleanup; + } + else if (g_file_test (events_dest, G_FILE_TEST_EXISTS)) + { + if (g_unlink (events_dest) != 0) + { + g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (errno), + _("Failed to remove existing event settings.")); + goto cleanup; + } + } + + ok = TRUE; + +cleanup: + g_free (events_dest); + g_free (events_src); + g_free (colors_dest); + g_free (colors_src); + g_free (theme_dir); + return ok; +} + gboolean zoitechat_import_theme (const char *path, GError **error) { @@ -754,9 +833,19 @@ irc_init (session *sess) if (zoitechat_import_theme (theme_path, &error)) { - message = g_strdup_printf (_("Theme \"%s\" imported."), basename); - fe_message (message, FE_MSG_INFO); - g_free (message); + if (zoitechat_apply_theme (basename, &error)) + { + message = g_strdup_printf (_("Theme \"%s\" imported and applied."), basename); + fe_message (message, FE_MSG_INFO); + handle_command (sess, "gui apply", FALSE); + g_free (message); + } + else + { + fe_message (error ? error->message : _("Theme imported, but failed to apply."), + FE_MSG_ERROR); + g_clear_error (&error); + } } else { @@ -796,9 +885,19 @@ irc_init (session *sess) if (zoitechat_import_theme (theme_path, &error)) { - message = g_strdup_printf (_("Theme \"%s\" imported."), basename); - fe_message (message, FE_MSG_INFO); - g_free (message); + if (zoitechat_apply_theme (basename, &error)) + { + message = g_strdup_printf (_("Theme \"%s\" imported and applied."), basename); + fe_message (message, FE_MSG_INFO); + handle_command (sess, "gui apply", FALSE); + g_free (message); + } + else + { + fe_message (error ? error->message : _("Theme imported, but failed to apply."), + FE_MSG_ERROR); + g_clear_error (&error); + } } else { diff --git a/src/common/zoitechat.h b/src/common/zoitechat.h index 810394d6..64e08bde 100644 --- a/src/common/zoitechat.h +++ b/src/common/zoitechat.h @@ -31,6 +31,7 @@ gboolean zoitechat_theme_path_from_arg (const char *arg, char **path_out); gboolean zoitechat_import_theme (const char *path, GError **error); +gboolean zoitechat_apply_theme (const char *theme_name, GError **error); #ifdef USE_OPENSSL #ifdef __APPLE__ diff --git a/src/fe-gtk/setup.c b/src/fe-gtk/setup.c index 84eff508..0825bc35 100644 --- a/src/fe-gtk/setup.c +++ b/src/fe-gtk/setup.c @@ -2045,22 +2045,6 @@ setup_theme_show_message (GtkMessageType message_type, const char *primary) gtk_widget_destroy (dialog); } -static gboolean -setup_theme_copy_file (const char *src, const char *dest, GError **error) -{ - GFile *src_file; - GFile *dest_file; - gboolean success; - - src_file = g_file_new_for_path (src); - dest_file = g_file_new_for_path (dest); - success = g_file_copy (src_file, dest_file, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, error); - g_object_unref (src_file); - g_object_unref (dest_file); - - return success; -} - static void setup_theme_populate (setup_theme_ui *ui) { @@ -2138,11 +2122,6 @@ setup_theme_apply_cb (GtkWidget *button, gpointer user_data) GtkWidget *dialog; gint response; char *theme; - char *theme_dir = NULL; - char *colors_src = NULL; - char *colors_dest = NULL; - char *events_src = NULL; - char *events_dest = NULL; GError *error = NULL; theme = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (ui->combo)); @@ -2161,40 +2140,13 @@ setup_theme_apply_cb (GtkWidget *button, gpointer user_data) return; } - theme_dir = g_build_filename (get_xdir (), "themes", theme, NULL); - colors_src = g_build_filename (theme_dir, "colors.conf", NULL); - colors_dest = g_build_filename (get_xdir (), "colors.conf", NULL); - - if (!g_file_test (colors_src, G_FILE_TEST_IS_REGULAR)) - { - setup_theme_show_message (GTK_MESSAGE_ERROR, _("This theme is missing a colors.conf file.")); - goto cleanup; - } - - if (!setup_theme_copy_file (colors_src, colors_dest, &error)) + if (!zoitechat_apply_theme (theme, &error)) { setup_theme_show_message (GTK_MESSAGE_ERROR, error ? error->message : _("Failed to apply theme.")); g_clear_error (&error); goto cleanup; } - events_src = g_build_filename (theme_dir, "pevents.conf", NULL); - events_dest = g_build_filename (get_xdir (), "pevents.conf", NULL); - - if (g_file_test (events_src, G_FILE_TEST_IS_REGULAR)) - { - if (!setup_theme_copy_file (events_src, events_dest, &error)) - { - setup_theme_show_message (GTK_MESSAGE_ERROR, error ? error->message : _("Failed to apply event settings.")); - g_clear_error (&error); - goto cleanup; - } - } - else if (g_file_test (events_dest, G_FILE_TEST_EXISTS)) - { - g_unlink (events_dest); - } - palette_load (); palette_apply_dark_mode (fe_dark_mode_is_enabled ()); color_change = TRUE; @@ -2203,11 +2155,6 @@ setup_theme_apply_cb (GtkWidget *button, gpointer user_data) setup_theme_show_message (GTK_MESSAGE_INFO, _("Theme applied. Some changes may require a restart to take full effect.")); cleanup: - g_free (events_dest); - g_free (events_src); - g_free (colors_dest); - g_free (colors_src); - g_free (theme_dir); g_free (theme); }