/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Pix * * Copyright (C) 2009 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include "actions.h" #include "gth-media-viewer-page.h" #include "preferences.h" #define MAX_ATTEMPTS 1024 /* -- gth_browser_activate_video_screenshot -- */ typedef struct { GthBrowser *browser; GSettings *settings; GthMediaViewerPage *page; gboolean playing_before_screenshot; GthImage *image; GthFileData *file_data; } SaveData; static void save_date_free (SaveData *save_data) { _g_object_unref (save_data->file_data); _g_object_unref (save_data->image); _g_object_unref (save_data->settings); g_free (save_data); } static void save_screenshot_task_completed_cb (GthTask *task, GError *error, gpointer user_data) { SaveData *save_data = user_data; GthMediaViewerPage *page = save_data->page; char *filename; char *text; if (error != NULL) _gtk_error_dialog_from_gerror_show (GTK_WINDOW (save_data->browser), _("Could not save the file"), error); else if (save_data->playing_before_screenshot) gst_element_set_state (gth_media_viewer_page_get_playbin (page), GST_STATE_PLAYING); filename = g_file_get_parse_name (save_data->file_data->file); /* Translators: %s is a filename */ text = g_strdup_printf (_("Image saved as %s"), filename); gth_statusbar_set_secondary_text_temp (GTH_STATUSBAR (gth_browser_get_statusbar (save_data->browser)), text); g_free (text); g_free (filename); save_date_free (save_data); g_object_unref (task); } static GFile * get_screenshot_file (SaveData *save_data, GError **error) { GFile *file = NULL; char *uri; GFile *folder; GthFileData *file_data; char *prefix; int attempt; uri = _g_settings_get_uri_or_special_dir (save_data->settings, PREF_GSTREAMER_TOOLS_SCREESHOT_LOCATION, G_USER_DIRECTORY_PICTURES); folder = g_file_new_for_uri (uri); file_data = gth_media_viewer_page_get_file_data (save_data->page); prefix = _g_path_remove_extension (g_file_info_get_display_name (file_data->info)); if (prefix == NULL) prefix = g_strdup (C_("Filename", "Screenshot")); for (attempt = 1; (file == NULL) && (attempt < MAX_ATTEMPTS); attempt++) { char *display_name; GFile *proposed_file; display_name = g_strdup_printf ("%s-%02d.jpeg", prefix, attempt); proposed_file = g_file_get_child_for_display_name (folder, display_name, NULL); if ((proposed_file != NULL) && ! g_file_query_exists (proposed_file, NULL)) file = g_object_ref (proposed_file); _g_object_unref (proposed_file); g_free (display_name); } if (file == NULL) g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_FILENAME, "Invalid filename"); g_free (prefix); _g_object_unref (folder); g_free (uri); return file; } static void screenshot_ready_cb (GdkPixbuf *pixbuf, gpointer user_data) { SaveData *save_data = user_data; GFile *file; GError *error = NULL; GthTask *task; if (pixbuf == NULL) { _gtk_error_dialog_from_gerror_show (GTK_WINDOW (save_data->browser), _("Could not take a screenshot"), NULL); save_date_free (save_data); return; } save_data->image = gth_image_new_for_pixbuf (pixbuf); /* save the image */ file = get_screenshot_file (save_data, &error); if (file == NULL) { _gtk_error_dialog_from_gerror_show (GTK_WINDOW (save_data->browser), _("Could not take a screenshot"), error); save_date_free (save_data); g_clear_error (&error); return; } save_data->file_data = gth_file_data_new (file, NULL); gth_file_data_set_mime_type (save_data->file_data, "image/jpeg"); task = gth_save_image_task_new (save_data->image, "image/jpeg", save_data->file_data, GTH_OVERWRITE_RESPONSE_YES); g_signal_connect (task, "completed", G_CALLBACK (save_screenshot_task_completed_cb), save_data); gth_browser_exec_task (GTH_BROWSER (save_data->browser), task, GTH_TASK_FLAGS_IGNORE_ERROR); } void gth_browser_activate_video_screenshot (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GthBrowser *browser = GTH_BROWSER (user_data); GthMediaViewerPage *page; GstElement *playbin; SaveData *save_data; page = GTH_MEDIA_VIEWER_PAGE (gth_browser_get_viewer_page (browser)); playbin = gth_media_viewer_page_get_playbin (page); if (playbin == NULL) return; save_data = g_new0 (SaveData, 1); save_data->browser = gth_media_viewer_page_get_browser (page); save_data->settings = g_settings_new (PIX_GSTREAMER_TOOLS_SCHEMA); save_data->page = page; save_data->playing_before_screenshot = gth_media_viewer_page_is_playing (page); if (save_data->playing_before_screenshot) gst_element_set_state (playbin, GST_STATE_PAUSED); _gst_playbin_get_current_frame (playbin, screenshot_ready_cb, save_data); } void gth_browser_activate_toggle_play (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GthBrowser *browser = GTH_BROWSER (user_data); GthMediaViewerPage *page; page = GTH_MEDIA_VIEWER_PAGE (gth_browser_get_viewer_page (browser)); gth_media_viewer_page_toggle_play (page); } void gth_browser_activate_toggle_mute (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GthBrowser *browser = GTH_BROWSER (user_data); GthMediaViewerPage *page; page = GTH_MEDIA_VIEWER_PAGE (gth_browser_get_viewer_page (browser)); gth_media_viewer_page_toggle_mute (page); } void gth_browser_activate_play_faster (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GthBrowser *browser = GTH_BROWSER (user_data); GthMediaViewerPage *page; page = GTH_MEDIA_VIEWER_PAGE (gth_browser_get_viewer_page (browser)); gth_media_viewer_page_play_faster (page); } void gth_browser_activate_play_slower (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GthBrowser *browser = GTH_BROWSER (user_data); GthMediaViewerPage *page; page = GTH_MEDIA_VIEWER_PAGE (gth_browser_get_viewer_page (browser)); gth_media_viewer_page_play_slower (page); } void gth_browser_activate_video_zoom_fit (GSimpleAction *action, GVariant *state, gpointer user_data) { GthBrowser *browser = GTH_BROWSER (user_data); GthMediaViewerPage *page = GTH_MEDIA_VIEWER_PAGE (gth_browser_get_viewer_page (browser));; g_simple_action_set_state (action, state); gth_media_viewer_page_set_fit_if_larger (page, g_variant_get_boolean (state)); } void gth_browser_activate_next_video_frame (GSimpleAction *action, GVariant *state, gpointer user_data) { GthBrowser *browser = GTH_BROWSER (user_data); GthMediaViewerPage *page = GTH_MEDIA_VIEWER_PAGE (gth_browser_get_viewer_page (browser));; gth_media_viewer_page_next_frame (page); } void gth_browser_activate_skip_forward_smallest (GSimpleAction *action, GVariant *state, gpointer user_data) { GthBrowser *browser = GTH_BROWSER (user_data); GthMediaViewerPage *page = GTH_MEDIA_VIEWER_PAGE (gth_browser_get_viewer_page (browser));; gth_media_viewer_page_skip (page, 1); } void gth_browser_activate_skip_forward_smaller (GSimpleAction *action, GVariant *state, gpointer user_data) { GthBrowser *browser = GTH_BROWSER (user_data); GthMediaViewerPage *page = GTH_MEDIA_VIEWER_PAGE (gth_browser_get_viewer_page (browser));; gth_media_viewer_page_skip (page, 5); } void gth_browser_activate_skip_forward_small (GSimpleAction *action, GVariant *state, gpointer user_data) { GthBrowser *browser = GTH_BROWSER (user_data); GthMediaViewerPage *page = GTH_MEDIA_VIEWER_PAGE (gth_browser_get_viewer_page (browser));; gth_media_viewer_page_skip (page, 10); } void gth_browser_activate_skip_forward_big (GSimpleAction *action, GVariant *state, gpointer user_data) { GthBrowser *browser = GTH_BROWSER (user_data); GthMediaViewerPage *page = GTH_MEDIA_VIEWER_PAGE (gth_browser_get_viewer_page (browser));; gth_media_viewer_page_skip (page, 60); } void gth_browser_activate_skip_forward_bigger (GSimpleAction *action, GVariant *state, gpointer user_data) { GthBrowser *browser = GTH_BROWSER (user_data); GthMediaViewerPage *page = GTH_MEDIA_VIEWER_PAGE (gth_browser_get_viewer_page (browser));; gth_media_viewer_page_skip (page, 60 * 5); } void gth_browser_activate_skip_back_smallest (GSimpleAction *action, GVariant *state, gpointer user_data) { GthBrowser *browser = GTH_BROWSER (user_data); GthMediaViewerPage *page = GTH_MEDIA_VIEWER_PAGE (gth_browser_get_viewer_page (browser));; gth_media_viewer_page_skip (page, -1); } void gth_browser_activate_skip_back_smaller (GSimpleAction *action, GVariant *state, gpointer user_data) { GthBrowser *browser = GTH_BROWSER (user_data); GthMediaViewerPage *page = GTH_MEDIA_VIEWER_PAGE (gth_browser_get_viewer_page (browser));; gth_media_viewer_page_skip (page, -5); } void gth_browser_activate_skip_back_small (GSimpleAction *action, GVariant *state, gpointer user_data) { GthBrowser *browser = GTH_BROWSER (user_data); GthMediaViewerPage *page = GTH_MEDIA_VIEWER_PAGE (gth_browser_get_viewer_page (browser));; gth_media_viewer_page_skip (page, -10); } void gth_browser_activate_skip_back_big (GSimpleAction *action, GVariant *state, gpointer user_data) { GthBrowser *browser = GTH_BROWSER (user_data); GthMediaViewerPage *page = GTH_MEDIA_VIEWER_PAGE (gth_browser_get_viewer_page (browser));; gth_media_viewer_page_skip (page, -60); } void gth_browser_activate_skip_back_bigger (GSimpleAction *action, GVariant *state, gpointer user_data) { GthBrowser *browser = GTH_BROWSER (user_data); GthMediaViewerPage *page = GTH_MEDIA_VIEWER_PAGE (gth_browser_get_viewer_page (browser));; gth_media_viewer_page_skip (page, -60 * 5); }