summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColomban Wendling <[email protected]>2025-11-05 12:00:07 +0100
committerColomban Wendling <[email protected]>2025-11-05 12:27:30 +0100
commitce2aabc1b0349ffe7f20c273d0fcdb18130371c3 (patch)
tree1b4e1337bad1805d9fa4867e550f11743a20fea0
parent24d047ed571b71161ebc089d34dcf30d71dc42e4 (diff)
downloadmate-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.c96
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 *