[gthumb] allow to have different window sizes for browser and viewer mode



commit fdbe31882d0d3a3c159f36291bbeb6def536f247
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Sat Aug 7 11:48:37 2010 +0200

    allow to have different window sizes for browser and viewer mode

 gthumb/gth-browser.c |   31 +++++++++++++++--
 gthumb/gth-window.c  |   90 ++++++++++++++++++++++++++++++++++++++++++++-----
 gthumb/gth-window.h  |   16 +++++++++
 3 files changed, 124 insertions(+), 13 deletions(-)
---
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index 9c69f09..b4c15f4 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -1969,10 +1969,22 @@ _gth_browser_close_final_step (gpointer user_data)
 		maximized = (state & GDK_WINDOW_STATE_MAXIMIZED) != 0;
 		if (! maximized && gtk_widget_get_visible (GTK_WIDGET (browser))) {
 			int width, height;
+			int size_set = FALSE;
 
-			gdk_drawable_get_size (gtk_widget_get_window (GTK_WIDGET (browser)), &width, &height);
-			eel_gconf_set_integer (PREF_UI_WINDOW_WIDTH, width);
-			eel_gconf_set_integer (PREF_UI_WINDOW_HEIGHT, height);
+			if (gth_window_get_current_page (GTH_WINDOW (browser)) == GTH_BROWSER_PAGE_BROWSER) {
+				gtk_window_get_size (GTK_WINDOW (browser), &width, &height);
+				size_set = TRUE;
+			}
+			else
+				size_set = gth_window_get_page_size (GTH_WINDOW (browser),
+								     GTH_BROWSER_PAGE_BROWSER,
+								     &width,
+								     &height);
+
+			if (size_set) {
+				eel_gconf_set_integer (PREF_UI_WINDOW_WIDTH, width);
+				eel_gconf_set_integer (PREF_UI_WINDOW_HEIGHT, height);
+			}
 		}
 
 		gtk_widget_get_allocation (browser->priv->browser_sidebar, &allocation);
@@ -2164,6 +2176,13 @@ _gth_browser_real_set_current_page (GthWindow *window,
 				    int        page)
 {
 	GthBrowser *browser = (GthBrowser *) window;
+	int         prev_page;
+	int         width;
+	int         height;
+
+	prev_page = gth_window_get_current_page (window);
+	if (page == prev_page)
+		return;
 
 	GTH_WINDOW_CLASS (parent_class)->set_current_page (window, page);
 
@@ -2175,6 +2194,12 @@ _gth_browser_real_set_current_page (GthWindow *window,
 		_gth_browser_make_file_visible (browser, browser->priv->current_file);
 	_gth_browser_hide_infobar (browser);
 
+	if (prev_page >= 0) {
+		gtk_window_get_size (GTK_WINDOW (window), &width, &height);
+		gth_window_save_page_size (GTH_WINDOW (window), prev_page, width, height);
+	}
+	gth_window_apply_saved_size (GTH_WINDOW (window), page);
+
 	gth_hook_invoke ("gth-browser-set-current-page", browser);
 
 	gth_browser_update_title (browser);
diff --git a/gthumb/gth-window.c b/gthumb/gth-window.c
index dd9570b..c759f03 100644
--- a/gthumb/gth-window.c
+++ b/gthumb/gth-window.c
@@ -39,16 +39,17 @@ static GList *window_list = NULL;
 
 
 struct _GthWindowPrivate {
-	int         n_pages;
-	int         current_page;
-	GtkWidget  *table;
-	GtkWidget  *notebook;
-	GtkWidget  *menubar;
-	GtkWidget  *toolbar;
-	GtkWidget  *infobar;
-	GtkWidget  *statusbar;
-	GtkWidget **toolbars;
-	GtkWidget **contents;
+	int             n_pages;
+	int             current_page;
+	GtkWidget      *table;
+	GtkWidget      *notebook;
+	GtkWidget      *menubar;
+	GtkWidget      *toolbar;
+	GtkWidget      *infobar;
+	GtkWidget      *statusbar;
+	GtkWidget     **toolbars;
+	GtkWidget     **contents;
+	GthWindowSize  *window_size;
 };
 
 
@@ -98,6 +99,10 @@ gth_window_set_n_pages (GthWindow *self,
 		gtk_widget_show (self->priv->contents[i]);
 		gtk_box_pack_start (GTK_BOX (page), self->priv->contents[i], TRUE, TRUE, 0);
 	}
+
+	self->priv->window_size = g_new0 (GthWindowSize, n_pages);
+	for (i = 0; i < n_pages; i++)
+		self->priv->window_size[i].saved = FALSE;
 }
 
 
@@ -129,6 +134,7 @@ gth_window_finalize (GObject *object)
 
 	g_free (window->priv->toolbars);
 	g_free (window->priv->contents);
+	g_free (window->priv->window_size);
 
 	window_list = g_list_remove (window_list, window);
 
@@ -159,10 +165,19 @@ static void
 gth_window_real_set_current_page (GthWindow *window,
 				  int        page)
 {
+	int i;
+
 	if (window->priv->current_page == page)
 		return;
+
 	window->priv->current_page = page;
 	gtk_notebook_set_current_page (GTK_NOTEBOOK (window->priv->notebook), page);
+
+	for (i = 0; i < window->priv->n_pages; i++)
+		if (i == page)
+			gtk_widget_show (window->priv->contents[i]);
+		else
+			gtk_widget_hide (window->priv->contents[i]);
 }
 
 
@@ -403,6 +418,61 @@ gth_window_get_area (GthWindow     *window,
 }
 
 
+void
+gth_window_save_page_size (GthWindow *window,
+			   int        page,
+			   int        width,
+			   int        height)
+{
+	g_return_if_fail (window != NULL);
+	g_return_if_fail (GTH_IS_WINDOW (window));
+	g_return_if_fail (page >= 0 && page < window->priv->n_pages);
+
+	window->priv->window_size[page].width = width;
+	window->priv->window_size[page].height = height;
+	window->priv->window_size[page].saved = TRUE;
+}
+
+
+void
+gth_window_apply_saved_size (GthWindow *window,
+			     int        page)
+{
+	g_return_if_fail (window != NULL);
+	g_return_if_fail (GTH_IS_WINDOW (window));
+	g_return_if_fail (page >= 0 && page < window->priv->n_pages);
+
+	if (! window->priv->window_size[page].saved)
+		return;
+
+	gtk_window_resize (GTK_WINDOW (window),
+			   window->priv->window_size[page].width,
+			   window->priv->window_size[page].height);
+}
+
+
+gboolean
+gth_window_get_page_size (GthWindow *window,
+			  int        page,
+			  int       *width,
+			  int       *height)
+{
+	g_return_val_if_fail (window != NULL, FALSE);
+	g_return_val_if_fail (GTH_IS_WINDOW (window), FALSE);
+	g_return_val_if_fail (page >= 0 && page < window->priv->n_pages, FALSE);
+
+	if (! window->priv->window_size[page].saved)
+		return FALSE;
+
+	if (width != NULL)
+		*width = window->priv->window_size[page].width;
+	if (height != NULL)
+		*height = window->priv->window_size[page].height;
+
+	return TRUE;
+}
+
+
 int
 gth_window_get_n_windows (void)
 {
diff --git a/gthumb/gth-window.h b/gthumb/gth-window.h
index de6c560..d8a6d2d 100644
--- a/gthumb/gth-window.h
+++ b/gthumb/gth-window.h
@@ -34,6 +34,12 @@ typedef enum { /*< skip >*/
 	GTH_WINDOW_STATUSBAR,
 } GthWindowArea;
 
+typedef struct { /*< skip >*/
+	gboolean saved;
+	int      width;
+	int      height;
+} GthWindowSize;
+
 #define GTH_TYPE_WINDOW              (gth_window_get_type ())
 #define GTH_WINDOW(obj)              (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTH_TYPE_WINDOW, GthWindow))
 #define GTH_WINDOW_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), GTH_TYPE_WINDOW, GthWindowClass))
@@ -80,6 +86,16 @@ void           gth_window_show_only_content  (GthWindow     *window,
 					      gboolean       only_content);
 GtkWidget *    gth_window_get_area           (GthWindow     *window,
 					      GthWindowArea  area);
+void           gth_window_save_page_size     (GthWindow     *window,
+					      int            page,
+					      int            width,
+					      int            height);
+void           gth_window_apply_saved_size   (GthWindow     *window,
+					      int            page);
+gboolean       gth_window_get_page_size      (GthWindow     *window,
+		      	      	      	      int            page,
+		      	      	      	      int           *width,
+		      	      	      	      int           *height);
 
 /**/
 



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