[gthumb] update the window size earlier when the shrink_wrap mode is active



commit 288920fb6e737e33d30332929eeebff951d4aca5
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Sun Nov 6 18:05:17 2011 +0100

    update the window size earlier when the shrink_wrap mode is active

 extensions/gstreamer_tools/gth-media-viewer-page.c |   90 +++++++++++++++----
 extensions/image_viewer/gth-image-viewer-page.c    |    7 ++
 gthumb/gth-browser.c                               |   21 ++++-
 gthumb/gth-browser.h                               |    1 +
 4 files changed, 97 insertions(+), 22 deletions(-)
---
diff --git a/extensions/gstreamer_tools/gth-media-viewer-page.c b/extensions/gstreamer_tools/gth-media-viewer-page.c
index aed998c..3558441 100644
--- a/extensions/gstreamer_tools/gth-media-viewer-page.c
+++ b/extensions/gstreamer_tools/gth-media-viewer-page.c
@@ -67,6 +67,7 @@ struct _GthMediaViewerPagePrivate {
 	gdouble         rate;
 	GtkWidget      *mediabar;
 	GtkWidget      *fullscreen_toolbar;
+	gulong          video_window_xid;
 	gboolean        xwin_assigned;
 	GdkPixbuf      *icon;
 	PangoLayout    *caption_layout;
@@ -145,6 +146,7 @@ video_area_realize_cb (GtkWidget *widget,
 {
 	GthMediaViewerPage *self = user_data;
 
+	self->priv->video_window_xid = GDK_WINDOW_XID (gtk_widget_get_window (widget));
 	self->priv->cursor = gdk_cursor_new (GDK_LEFT_PTR);
 	self->priv->cursor_void = gdk_cursor_new_for_display (gtk_widget_get_display (self->priv->area), GDK_BLANK_CURSOR);
 	if (self->priv->cursor_visible)
@@ -164,6 +166,9 @@ video_area_unrealize_cb (GtkWidget *widget,
 {
 	GthMediaViewerPage *self = user_data;
 
+	self->priv->video_window_xid = 0;
+	self->priv->xwin_assigned = FALSE;
+
 	if (self->priv->cursor) {
 		g_object_unref (self->priv->cursor);
 		self->priv->cursor = NULL;
@@ -761,16 +766,46 @@ gth_media_viewer_page_real_activate (GthViewerPage *base,
 	self->priv->mediabar = GET_WIDGET ("mediabar");
 	gtk_widget_show (self->priv->mediabar);
 
-	g_signal_connect (GET_WIDGET ("volume_adjustment"), "value-changed", G_CALLBACK (volume_value_changed_cb), self);
-	g_signal_connect (GET_WIDGET ("position_adjustment"), "value-changed", G_CALLBACK (position_value_changed_cb), self);
-	g_signal_connect (GET_WIDGET ("volume_scale"), "format-value", G_CALLBACK (volume_scale_format_value_cb), self);
-	g_signal_connect (GET_WIDGET ("position_scale"), "change-value", G_CALLBACK (position_scale_change_value_cb), self);
-	g_signal_connect (GET_WIDGET ("position_scale"), "button-press-event", G_CALLBACK (position_scale_button_press_event_cb), self);
-	g_signal_connect (GET_WIDGET ("position_scale"), "button-release-event", G_CALLBACK (position_scale_button_release_event_cb), self);
-	g_signal_connect (GET_WIDGET ("play_button"), "clicked", G_CALLBACK (play_button_clicked_cb), self);
-	g_signal_connect (GET_WIDGET ("volume_togglebutton"), "toggled", G_CALLBACK (volume_togglebutton_toggled_cb), self);
-	g_signal_connect (GET_WIDGET ("play_slower_button"), "clicked", G_CALLBACK (play_slower_button_clicked_cb), self);
-	g_signal_connect (GET_WIDGET ("play_faster_button"), "clicked", G_CALLBACK (play_faster_button_clicked_cb), self);
+	g_signal_connect (GET_WIDGET ("volume_adjustment"),
+			  "value-changed",
+			  G_CALLBACK (volume_value_changed_cb),
+			  self);
+	g_signal_connect (GET_WIDGET ("position_adjustment"),
+			  "value-changed",
+			  G_CALLBACK (position_value_changed_cb),
+			  self);
+	g_signal_connect (GET_WIDGET ("volume_scale"),
+			  "format-value",
+			  G_CALLBACK (volume_scale_format_value_cb),
+			  self);
+	g_signal_connect (GET_WIDGET ("position_scale"),
+			  "change-value",
+			  G_CALLBACK (position_scale_change_value_cb),
+			  self);
+	g_signal_connect (GET_WIDGET ("position_scale"),
+			  "button-press-event",
+			  G_CALLBACK (position_scale_button_press_event_cb),
+			  self);
+	g_signal_connect (GET_WIDGET ("position_scale"),
+			  "button-release-event",
+			  G_CALLBACK (position_scale_button_release_event_cb),
+			  self);
+	g_signal_connect (GET_WIDGET ("play_button"),
+			  "clicked",
+			  G_CALLBACK (play_button_clicked_cb),
+			  self);
+	g_signal_connect (GET_WIDGET ("volume_togglebutton"),
+			  "toggled",
+			  G_CALLBACK (volume_togglebutton_toggled_cb),
+			  self);
+	g_signal_connect (GET_WIDGET ("play_slower_button"),
+			  "clicked",
+			  G_CALLBACK (play_slower_button_clicked_cb),
+			  self);
+	g_signal_connect (GET_WIDGET ("play_faster_button"),
+			  "clicked",
+			  G_CALLBACK (play_faster_button_clicked_cb),
+			  self);
 
 	self->priv->area_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
 	gtk_box_pack_start (GTK_BOX (self->priv->area_box), self->priv->area, TRUE, TRUE, 0);
@@ -778,8 +813,8 @@ gth_media_viewer_page_real_activate (GthViewerPage *base,
 	gtk_widget_show (self->priv->area_box);
 	gth_browser_set_viewer_widget (browser, self->priv->area_box);
 
-	gtk_widget_realize (self->priv->area);
-	gdk_window_ensure_native (gtk_widget_get_window (self->priv->area));
+	gtk_widget_realize (self->priv->area_box);
+
 	gth_viewer_page_focus (GTH_VIEWER_PAGE (self));
 }
 
@@ -841,8 +876,6 @@ set_playbin_window (GstBus             *bus,
 		    GstMessage         *message,
 		    GthMediaViewerPage *self)
 {
-	GstXOverlay *image_sink;
-
 	/* ignore anything but 'prepare-xwindow-id' element messages */
 
 	if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT)
@@ -850,10 +883,17 @@ set_playbin_window (GstBus             *bus,
 	if (! gst_structure_has_name (message->structure, "prepare-xwindow-id"))
 		return GST_BUS_PASS;
 
-	image_sink = GST_X_OVERLAY (GST_MESSAGE_SRC (message));
-	gst_x_overlay_set_xwindow_id (image_sink, GDK_WINDOW_XID (gtk_widget_get_window (self->priv->area)));
-	g_object_set (image_sink, "force-aspect-ratio", TRUE, NULL);
-	self->priv->xwin_assigned = TRUE;
+	if (self->priv->video_window_xid != 0) {
+		GstXOverlay *xoverlay;
+
+		xoverlay = GST_X_OVERLAY (GST_MESSAGE_SRC (message));
+		gst_x_overlay_set_window_handle (xoverlay, self->priv->video_window_xid);
+		self->priv->xwin_assigned = TRUE;
+
+		g_object_set (xoverlay, "force-aspect-ratio", TRUE, NULL);
+	}
+	else
+		g_warning ("Should have obtained video_window_xid by now!");
 
 	gst_message_unref (message);
 
@@ -919,9 +959,16 @@ update_stream_info (GthMediaViewerPage *self)
 
 		if ((caps = gst_pad_get_negotiated_caps (videopad)) != NULL) {
 			GstStructure *structure;
+			int           video_width;
+			int           video_height;
 
 			structure = gst_caps_get_structure (caps, 0);
 			gst_structure_get_fraction (structure, "framerate", &self->priv->video_fps_n, &self->priv->video_fps_d);
+			gst_structure_get_int (structure, "width", &video_width);
+			gst_structure_get_int (structure, "height", &video_height);
+
+			g_file_info_set_attribute_int32 (self->priv->file_data->info, "frame::width", video_width);
+			g_file_info_set_attribute_int32 (self->priv->file_data->info, "frame::height", video_height);
 
 			gst_caps_unref (caps);
 		}
@@ -960,6 +1007,7 @@ bus_message_cb (GstBus     *bus,
 		if ((old_state == GST_STATE_READY) && (new_state == GST_STATE_PAUSED)) {
 			update_stream_info (self);
 			gth_viewer_page_update_sensitivity (GTH_VIEWER_PAGE (self));
+			gth_viewer_page_file_loaded (GTH_VIEWER_PAGE (self), self->priv->file_data, TRUE);
 		}
 		if ((old_state == GST_STATE_READY) || (new_state == GST_STATE_PAUSED))
 			update_volume_from_playbin (self);
@@ -986,6 +1034,10 @@ bus_message_cb (GstBus     *bus,
 		gst_message_parse_buffering (message, &percent);
 		/* g_print ("Buffering (%%%u percent done)", percent); */
 		break;
+
+	case GST_MESSAGE_ERROR:
+		gth_viewer_page_file_loaded (GTH_VIEWER_PAGE (self), self->priv->file_data, FALSE);
+		break;
 	}
 
 	default:
@@ -1125,7 +1177,6 @@ gth_media_viewer_page_real_view (GthViewerPage *base,
 
 	/**/
 
-	gth_viewer_page_file_loaded (GTH_VIEWER_PAGE (self), self->priv->file_data, TRUE);
 	g_signal_handlers_block_by_func(GET_WIDGET ("position_adjustment"), position_value_changed_cb, self);
 	gtk_adjustment_set_value (GTK_ADJUSTMENT (GET_WIDGET ("position_adjustment")), 0.0);
 	g_signal_handlers_unblock_by_func(GET_WIDGET ("position_adjustment"), position_value_changed_cb, self);
@@ -1372,6 +1423,7 @@ gth_media_viewer_page_init (GthMediaViewerPage *self)
 	self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_MEDIA_VIEWER_PAGE, GthMediaViewerPagePrivate);
 	self->priv->update_progress_id = 0;
 	self->priv->set_to_pause_id = 0;
+	self->priv->video_window_xid = 0;
 	self->priv->xwin_assigned = FALSE;
 	self->priv->has_video = FALSE;
 	self->priv->has_audio = FALSE;
diff --git a/extensions/image_viewer/gth-image-viewer-page.c b/extensions/image_viewer/gth-image-viewer-page.c
index 26b120f..bcb278c 100644
--- a/extensions/image_viewer/gth-image-viewer-page.c
+++ b/extensions/image_viewer/gth-image-viewer-page.c
@@ -416,6 +416,13 @@ image_preloader_requested_ready_cb (GthImagePreloader  *preloader,
 	gth_image_history_add_image (self->priv->history,
 				     gth_image_viewer_get_current_image (GTH_IMAGE_VIEWER (self->priv->viewer)),
 				     FALSE);
+
+	g_file_info_set_attribute_int32 (self->priv->file_data->info,
+					 "frame::width",
+					 gth_image_viewer_get_image_width (GTH_IMAGE_VIEWER (self->priv->viewer)));
+	g_file_info_set_attribute_int32 (self->priv->file_data->info,
+					 "frame::height",
+					 gth_image_viewer_get_image_height (GTH_IMAGE_VIEWER (self->priv->viewer)));
 	gth_image_viewer_page_file_loaded (self, TRUE);
 }
 
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index 563bd23..c9ffe06 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -5498,9 +5498,6 @@ file_metadata_ready_cb (GList    *files,
 	g_file_info_copy_into (file_data->info, browser->priv->current_file->info);
 	g_file_info_set_attribute_boolean (browser->priv->current_file->info, "gth::file::is-modified", FALSE);
 
-	if (browser->priv->shrink_wrap_viewer)
-		gth_browser_set_shrink_wrap_viewer (browser, TRUE);
-
 	if ((gth_window_get_current_page (GTH_WINDOW (browser)) == GTH_BROWSER_PAGE_BROWSER)
 	    && ! gtk_widget_get_visible (browser->priv->file_properties))
 	{
@@ -5588,6 +5585,17 @@ gth_viewer_page_file_loaded_cb (GthViewerPage *viewer_page,
 
 	g_file_info_set_attribute_boolean (browser->priv->current_file->info, "gth::file::is-modified", FALSE);
 
+	if (browser->priv->shrink_wrap_viewer) {
+		/* the frame::[width|height] properties have been set by the
+		 * viewer, copy them in the current file. */
+
+		g_file_info_set_attribute_int32 (browser->priv->current_file->info, "frame::width",
+						 g_file_info_get_attribute_int32 (file_data->info, "frame::width"));
+		g_file_info_set_attribute_int32 (browser->priv->current_file->info, "frame::height",
+						 g_file_info_get_attribute_int32 (file_data->info, "frame::height"));
+		gth_browser_set_shrink_wrap_viewer (browser, TRUE);
+	}
+
 	data = load_file_data_new (browser, browser->priv->current_file, FALSE);
 	files = g_list_prepend (NULL, browser->priv->current_file->file);
 	_g_query_all_metadata_async (files,
@@ -5861,6 +5869,13 @@ gth_browser_set_shrink_wrap_viewer (GthBrowser *browser,
 }
 
 
+gboolean
+gth_browser_get_shrink_wrap_viewer (GthBrowser *browser)
+{
+	return browser->priv->shrink_wrap_viewer;
+}
+
+
 /* -- gth_browser_load_location -- */
 
 
diff --git a/gthumb/gth-browser.h b/gthumb/gth-browser.h
index 3a7b758..6b622bb 100644
--- a/gthumb/gth-browser.h
+++ b/gthumb/gth-browser.h
@@ -166,6 +166,7 @@ void             gth_browser_show_viewer_tools      (GthBrowser       *browser,
 						     gboolean          show);
 void             gth_browser_set_shrink_wrap_viewer (GthBrowser       *browser,
 						     gboolean          value);
+gboolean         gth_browser_get_shrink_wrap_viewer (GthBrowser       *browser);
 void             gth_browser_load_location          (GthBrowser       *browser,
 						     GFile            *location);
 void             gth_browser_enable_thumbnails      (GthBrowser       *browser,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]