]> granicus.if.org Git - transmission/commitdiff
(gtk) remember window size & location between sessions
authorCharles Kerr <charles@transmissionbt.com>
Mon, 21 Apr 2008 20:58:39 +0000 (20:58 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Mon, 21 Apr 2008 20:58:39 +0000 (20:58 +0000)
gtk/main.c
gtk/tr-prefs.c
gtk/tr-prefs.h
gtk/tr-window.c
gtk/util.c
gtk/util.h

index f59a1ca3bf0d8d4a5bb833334e650c67f0fd398e..d1872729fb7bd7618c2b2de3c1802ac3da93d7a3 100644 (file)
@@ -221,6 +221,26 @@ selectionChangedCB( GtkTreeSelection * s, gpointer unused UNUSED )
     refreshTorrentActions( s );
 }
 
+static void
+onMainWindowSizeAllocated( GtkWidget      * window,
+                           GtkAllocation  * alloc UNUSED,
+                           gpointer         gdata UNUSED )
+{
+    const gboolean isMaximized = window->window
+        && ( gdk_window_get_state( window->window ) & GDK_WINDOW_STATE_MAXIMIZED );
+
+    if( !isMaximized )
+    {
+        int x, y, w, h;
+        gtk_window_get_position( GTK_WINDOW( window ), &x, &y );
+        gtk_window_get_size( GTK_WINDOW( window ), &w, &h );
+        pref_int_set( PREF_KEY_MAIN_WINDOW_X, x );
+        pref_int_set( PREF_KEY_MAIN_WINDOW_Y, y );
+        pref_int_set( PREF_KEY_MAIN_WINDOW_WIDTH, w );
+        pref_int_set( PREF_KEY_MAIN_WINDOW_HEIGHT, h );
+    }
+}
+
 static void
 windowStateChanged( GtkWidget * widget UNUSED, GdkEventWindowState * event, gpointer gdata )
 {
@@ -349,10 +369,11 @@ main( int argc, char ** argv )
         cbdata->core = tr_core_new( h );
 
         /* create main window now to be a parent to any error dialogs */
-        GtkWindow * mainwind = GTK_WINDOW( tr_window_new( myUIManager, cbdata->core ) );
-        g_signal_connect( mainwind, "window-state-event", G_CALLBACK(windowStateChanged), cbdata );
+        GtkWindow * win = GTK_WINDOW( tr_window_new( myUIManager, cbdata->core ) );
+        g_signal_connect( win, "window-state-event", G_CALLBACK(windowStateChanged), cbdata );
+        g_signal_connect( win, "size-allocate", G_CALLBACK(onMainWindowSizeAllocated), cbdata );
 
-        appsetup( mainwind, argfiles, cbdata, startpaused, startminimized );
+        appsetup( win, argfiles, cbdata, startpaused, startminimized );
     }
     else
     {
index 208d4fc782f82d3f19e7ff274909554908876de2..1c21906083e5c20933cba5b19c382e64c060749d 100644 (file)
@@ -62,6 +62,11 @@ tr_prefs_init_global( void )
     pref_int_set_default    ( PREF_KEY_UL_LIMIT, 50 );
     pref_flag_set_default   ( PREF_KEY_OPTIONS_PROMPT, TRUE );
 
+    pref_int_set_default    ( PREF_KEY_MAIN_WINDOW_HEIGHT, 500 );
+    pref_int_set_default    ( PREF_KEY_MAIN_WINDOW_WIDTH, 300 );
+    pref_int_set_default    ( PREF_KEY_MAIN_WINDOW_X, 50 );
+    pref_int_set_default    ( PREF_KEY_MAIN_WINDOW_Y, 50 );
+
     str = NULL;
 #if GLIB_CHECK_VERSION(2,14,0)
     if( !str ) str = g_get_user_special_dir( G_USER_DIRECTORY_DOWNLOAD );
index 1e9a841134b3e5c111c23e58c8d725fccc56ffbb..8b7f4302409fbd86619904cb82f873d36aebdbd8 100644 (file)
@@ -49,6 +49,10 @@ GtkWidget * tr_prefs_dialog_new( GObject * core, GtkWindow * parent );
 #define PREF_KEY_MAX_PEERS_GLOBAL       "max-peers-global"
 #define PREF_KEY_MAX_PEERS_PER_TORRENT  "max-peers-per-torrent"
 #define PREF_KEY_BLOCKLIST_ENABLED      "blocklist-enabled"
+#define PREF_KEY_MAIN_WINDOW_HEIGHT     "main-window-height"
+#define PREF_KEY_MAIN_WINDOW_WIDTH      "main-window-width"
+#define PREF_KEY_MAIN_WINDOW_X          "main-window-x"
+#define PREF_KEY_MAIN_WINDOW_Y          "main-window-y"
 
 
 void tr_prefs_init_global( void );
index cbd6b08fb4b5067f6e0a226cbd7480b975278ed8..b02102205212479e667638854c342694cba39227 100644 (file)
@@ -179,16 +179,6 @@ makeview( PrivateData * p, TrCore * core )
     return view;
 }
 
-static void
-realized_cb ( GtkWidget * wind, gpointer unused UNUSED )
-{
-    PrivateData * p = get_private_data( GTK_WINDOW( wind ) );
-    sizingmagic( GTK_WINDOW(wind),
-                 GTK_SCROLLED_WINDOW( p->scroll ),
-                 GTK_POLICY_NEVER,
-                 GTK_POLICY_AUTOMATIC );
-}
-
 static void
 prefsChanged( TrCore * core UNUSED, const char * key, gpointer wind )
 {
@@ -426,6 +416,7 @@ tr_window_new( GtkUIManager * ui_manager, TrCore * core )
     char * pch;
     PrivateData * p;
     GtkWidget *vbox, *w, *self, *h, *c, *s, *image, *menu;
+    GtkWindow *win;
     GSList * l;
     GSList * toggles;
     const char * filter_names[FILTER_MODE_QTY] = {
@@ -452,11 +443,14 @@ tr_window_new( GtkUIManager * ui_manager, TrCore * core )
     /* make the window */
     self = gtk_window_new (GTK_WINDOW_TOPLEVEL);
     g_object_set_data_full(G_OBJECT(self), PRIVATE_DATA_KEY, p, privateFree );
-    gtk_window_set_title( GTK_WINDOW( self ), g_get_application_name());
-    gtk_window_set_role( GTK_WINDOW( self ), "tr-main" );
-    gtk_window_add_accel_group (GTK_WINDOW(self),
-                                gtk_ui_manager_get_accel_group (ui_manager));
-    g_signal_connect( self, "realize", G_CALLBACK(realized_cb), NULL);
+    win = GTK_WINDOW( self );
+    gtk_window_set_title( win, g_get_application_name());
+    gtk_window_set_role( win, "tr-main" );
+    gtk_window_set_default_size( win, pref_int_get( PREF_KEY_MAIN_WINDOW_WIDTH ),
+                                      pref_int_get( PREF_KEY_MAIN_WINDOW_HEIGHT ) );
+    gtk_window_move( win, pref_int_get( PREF_KEY_MAIN_WINDOW_X ),
+                          pref_int_get( PREF_KEY_MAIN_WINDOW_Y ) );
+    gtk_window_add_accel_group( win, gtk_ui_manager_get_accel_group( ui_manager ) );
 
     /* window's main container */
     vbox = gtk_vbox_new (FALSE, 0);
@@ -564,6 +558,7 @@ tr_window_new( GtkUIManager * ui_manager, TrCore * core )
     /* workarea */
     p->view = makeview( p, core );
     w = p->scroll = gtk_scrolled_window_new( NULL, NULL );
+    gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(w), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC );
     gtk_container_add( GTK_CONTAINER(w), p->view );
     gtk_box_pack_start_defaults( GTK_BOX(vbox), w );
     gtk_container_set_focus_child( GTK_CONTAINER( vbox ), w );
index ba3a95dd8b36c674a58322f5202897e4ea5bb1f6..1ed52f767ead839b5f9926f42352a5fcefb158f6 100644 (file)
@@ -265,38 +265,6 @@ getdownloaddir( void )
     return dir;
 }
 
-/**
- * don't use more than 50% the height of the screen, nor 80% the width.
- * but don't be too small, either -- set the minimums to 500 x 300
- */
-void
-sizingmagic( GtkWindow         * wind,
-             GtkScrolledWindow * scroll,
-             GtkPolicyType       hscroll,
-             GtkPolicyType       vscroll )
-{
-    int width;
-    int height;
-    GtkRequisition req;
-
-    GdkScreen * screen = gtk_widget_get_screen( GTK_WIDGET( wind ) );
-
-    gtk_scrolled_window_set_policy( scroll, GTK_POLICY_NEVER,
-                                            GTK_POLICY_NEVER );
-
-    gtk_widget_size_request( GTK_WIDGET( wind ), &req );
-    req.height = MAX( req.height, 300 );
-    height = MIN( req.height, gdk_screen_get_height( screen ) / 5 * 4 );
-
-    gtk_scrolled_window_set_policy( scroll, GTK_POLICY_NEVER, vscroll );
-    gtk_widget_size_request( GTK_WIDGET( wind ), &req );
-    req.width = MAX( req.width, 500 );
-    width = MIN( req.width, gdk_screen_get_width( screen ) / 2 );
-
-    gtk_window_set_default_size( wind, width, height );
-    gtk_scrolled_window_set_policy( scroll, hscroll, vscroll );
-}
-
 static void
 onErrorResponse(GtkWidget * dialog, int resp UNUSED, gpointer glist)
 {
index 0518b24c51b0049b317de3af2ba436708445c9ba..c7cd03829d528ae93797d48eb79bed64206e117c 100644 (file)
@@ -91,11 +91,6 @@ void gtr_uninhibit_hibernation( guint );
 
 #ifdef GTK_MAJOR_VERSION
 
-/* here there be dragons */
-void
-sizingmagic( GtkWindow * wind, GtkScrolledWindow * scroll,
-             GtkPolicyType hscroll, GtkPolicyType vscroll );
-
 /* create an error dialog, if wind is NULL or mapped then show dialog now,
    otherwise show it when wind becomes mapped */
 void