diff options
| author | Colomban Wendling <[email protected]> | 2025-11-05 12:00:07 +0100 |
|---|---|---|
| committer | Colomban Wendling <[email protected]> | 2025-11-05 12:27:30 +0100 |
| commit | ce2aabc1b0349ffe7f20c273d0fcdb18130371c3 (patch) | |
| tree | 1b4e1337bad1805d9fa4867e550f11743a20fea0 | |
| parent | 24d047ed571b71161ebc089d34dcf30d71dc42e4 (diff) | |
| download | mate-utils-ce2aabc1b0349ffe7f20c273d0fcdb18130371c3.tar.bz2 mate-utils-ce2aabc1b0349ffe7f20c273d0fcdb18130371c3.tar.xz | |
mate-screenshot: Create temporary directory asynchronously
While at it, also create the temporary directory asynchronously, rather
than this part being the only synchronous operation.
| -rw-r--r-- | mate-screenshot/src/screenshot-save.c | 96 |
1 files changed, 59 insertions, 37 deletions
diff --git a/mate-screenshot/src/screenshot-save.c b/mate-screenshot/src/screenshot-save.c index e3e04768..b98268ee 100644 --- a/mate-screenshot/src/screenshot-save.c +++ b/mate-screenshot/src/screenshot-save.c @@ -64,26 +64,6 @@ clean_up_temporary_dir (void) parent_dir = NULL; } -static char * -make_temp_directory (void) -{ - gchar *dir_name; - - // mkdtemp uses XXXXXX as a template to create a unique name for the temp dir - dir_name = g_build_filename (g_get_tmp_dir (), - "mate-screenshot.XXXXXX", - NULL); - - if (mkdtemp (dir_name) == NULL) - { - g_warning ("Failed to create temporary directory: %s", g_strerror (errno)); - g_free (dir_name); - return NULL; - } - - return dir_name; -} - static void cleanup_handler (void) { @@ -174,13 +154,69 @@ replace_async_ready (GObject* object, GAsyncResult* res, gpointer user_data) } } +/* gets a #GFile path, setting @err if there is none */ +static gchar * +get_path (GFile *file, GError **err) +{ + gchar *path; + + path = g_file_get_path (file); + if (! path) + { + gchar *uri = g_file_get_uri (file); + + g_set_error (err, G_FILE_ERROR, G_FILE_ERROR_NOENT, + _("Temporary file \"%s\" does not have a path"), uri); + g_free (uri); + } + + return path; +} + +static void +new_tmp_dir_async_ready (GObject* object, GAsyncResult* res, gpointer user_data) +{ + SaveAsyncData *data = user_data; + GError *err = NULL; + + GFile *dir = g_file_new_tmp_dir_finish (res, &err); + if (dir) + { + g_free (parent_dir); + parent_dir = get_path (dir, &err); + if (parent_dir) + { + GFile *file = g_file_get_child (dir, _("Screenshot.png")); + + g_free (tmp_filename); + tmp_filename = get_path (file, &err); + if (tmp_filename) + { + g_file_replace_async (file, NULL, FALSE, G_FILE_CREATE_REPLACE_DESTINATION, + G_PRIORITY_DEFAULT, NULL, replace_async_ready, data); + } + + g_object_unref (file); + } + + g_object_unref (dir); + } + + /* error will be set if anything failed, so we didn't schedule the next + * asynchronous call */ + if (err) + { + save_async_finish_and_free (data, err); + g_error_free (err); + } +} + void screenshot_save_start (GdkPixbuf *pixbuf, SaveFunction callback, gpointer user_data) { SaveAsyncData *data; - GFile *file; static gboolean cleanup_registered = FALSE; if (!cleanup_registered) @@ -191,28 +227,14 @@ screenshot_save_start (GdkPixbuf *pixbuf, clean_up_temporary_dir (); - parent_dir = make_temp_directory (); - if (parent_dir == NULL) - { - if (callback) - callback (user_data); - return; - } - - tmp_filename = g_build_filename (parent_dir, - _("Screenshot.png"), - NULL); - data = g_malloc (sizeof *data); data->pixbuf = g_object_ref (pixbuf); data->stream = NULL; data->callback = callback; data->user_data = user_data; - file = g_file_new_for_path (tmp_filename); - g_file_replace_async (file, NULL, FALSE, G_FILE_CREATE_REPLACE_DESTINATION, - G_PRIORITY_DEFAULT, NULL, replace_async_ready, data); - g_object_unref (file); + g_file_new_tmp_dir_async ("mate-screenshot.XXXXXX", G_PRIORITY_DEFAULT, NULL, + new_tmp_dir_async_ready, data); } const char * |
