Remember layout of Search and Dupe windows
authorColin Clark <colin.clark@cclark.uk>
Sun, 12 Apr 2020 16:38:46 +0000 (17:38 +0100)
committerColin Clark <colin.clark@cclark.uk>
Sun, 12 Apr 2020 16:38:46 +0000 (17:38 +0100)
src/dupe.c
src/layout.c
src/options.c
src/search.c
src/typedefs.h

index edca01f..f74206e 100644 (file)
@@ -3231,10 +3231,27 @@ void dupe_window_clear(DupeWindow *dw)
        dupe_window_update_progress(dw, NULL, 0.0, FALSE);
 }
 
+static void dupe_window_get_geometry(DupeWindow *dw)
+{
+       GdkWindow *window;
+       LayoutWindow *lw = NULL;
+
+       layout_valid(&lw);
+
+       if (!dw || !lw) return;
+
+       window = gtk_widget_get_window(dw->window);
+       gdk_window_get_position(window, &lw->options.dupe_window.x, &lw->options.dupe_window.y);
+       lw->options.dupe_window.w = gdk_window_get_width(window);
+       lw->options.dupe_window.h = gdk_window_get_height(window);
+}
+
 void dupe_window_close(DupeWindow *dw)
 {
        dupe_check_stop(dw);
 
+       dupe_window_get_geometry(dw);
+
        dupe_window_list = g_list_remove(dupe_window_list, dw);
        gtk_widget_destroy(dw->window);
 
@@ -3269,6 +3286,9 @@ DupeWindow *dupe_window_new()
        GtkListStore *store;
        GtkTreeSelection *selection;
        GdkGeometry geometry;
+       LayoutWindow *lw = NULL;
+
+       layout_valid(&lw);
 
        dw = g_new0(DupeWindow, 1);
 
@@ -3295,7 +3315,15 @@ DupeWindow *dupe_window_new()
        gtk_window_set_geometry_hints(GTK_WINDOW(dw->window), NULL, &geometry,
                                      GDK_HINT_MIN_SIZE | GDK_HINT_BASE_SIZE);
 
-       gtk_window_set_default_size(GTK_WINDOW(dw->window), DUPE_DEF_WIDTH, DUPE_DEF_HEIGHT);
+       if (lw && options->save_window_positions)
+               {
+               gtk_window_set_default_size(GTK_WINDOW(dw->window), lw->options.dupe_window.w, lw->options.dupe_window.h);
+               gtk_window_move(GTK_WINDOW(dw->window), lw->options.dupe_window.x, lw->options.dupe_window.y);
+               }
+       else
+               {
+               gtk_window_set_default_size(GTK_WINDOW(dw->window), DUPE_DEF_WIDTH, DUPE_DEF_HEIGHT);
+               }
 
        gtk_window_set_resizable(GTK_WINDOW(dw->window), TRUE);
        gtk_container_set_border_width(GTK_CONTAINER(dw->window), 0);
index 87b82cc..3be2130 100644 (file)
@@ -2684,6 +2684,16 @@ void layout_write_attributes(LayoutOptions *layout, GString *outstr, gint indent
        WRITE_NL(); WRITE_INT(*layout, log_window.y);
        WRITE_NL(); WRITE_INT(*layout, log_window.w);
        WRITE_NL(); WRITE_INT(*layout, log_window.h);
+
+       WRITE_NL(); WRITE_INT(*layout, search_window.x);
+       WRITE_NL(); WRITE_INT(*layout, search_window.y);
+       WRITE_NL(); WRITE_INT(*layout, search_window.w);
+       WRITE_NL(); WRITE_INT(*layout, search_window.h);
+
+       WRITE_NL(); WRITE_INT(*layout, dupe_window.x);
+       WRITE_NL(); WRITE_INT(*layout, dupe_window.y);
+       WRITE_NL(); WRITE_INT(*layout, dupe_window.w);
+       WRITE_NL(); WRITE_INT(*layout, dupe_window.h);
        WRITE_SEPARATOR();
 
        WRITE_NL(); WRITE_BOOL(*layout, animate);
@@ -2778,6 +2788,16 @@ void layout_load_attributes(LayoutOptions *layout, const gchar **attribute_names
                if (READ_INT(*layout, log_window.w)) continue;
                if (READ_INT(*layout, log_window.h)) continue;
 
+               if (READ_INT(*layout, search_window.x)) continue;
+               if (READ_INT(*layout, search_window.y)) continue;
+               if (READ_INT(*layout, search_window.w)) continue;
+               if (READ_INT(*layout, search_window.h)) continue;
+
+               if (READ_INT(*layout, dupe_window.x)) continue;
+               if (READ_INT(*layout, dupe_window.y)) continue;
+               if (READ_INT(*layout, dupe_window.w)) continue;
+               if (READ_INT(*layout, dupe_window.h)) continue;
+
                if (READ_BOOL(*layout, animate)) continue;
 
                log_printf("unknown attribute %s = %s\n", option, value);
index ccdefe1..758de74 100644 (file)
@@ -296,6 +296,14 @@ LayoutOptions *init_layout_options(LayoutOptions *options)
        options->main_window.w = 720;
        options->main_window.x = 0;
        options->main_window.y = 0;
+       options->dupe_window.w = 800;
+       options->dupe_window.h = 400;
+       options->dupe_window.x = 100;
+       options->dupe_window.y = 100;
+       options->search_window.w = 700;
+       options->search_window.h = 650;
+       options->search_window.x = 100;
+       options->search_window.y = 100;
        options->folder_window.vdivider_pos = 100;
        options->order = g_strdup("123");
        options->show_directory_date = FALSE;
index c929440..0c593a3 100644 (file)
@@ -3043,8 +3043,26 @@ static GtkWidget *menu_choice(GtkWidget *box, GtkWidget **check, GtkWidget **men
        return hbox;
 }
 
+static void search_window_get_geometry(SearchData *sd)
+{
+       GdkWindow *window;
+       LayoutWindow *lw = NULL;
+
+       layout_valid(&lw);
+
+       if (!sd || !lw) return;
+
+       window = gtk_widget_get_window(sd->window);
+       gdk_window_get_position(window, &lw->options.search_window.x, &lw->options.search_window.y);
+       lw->options.search_window.w = gdk_window_get_width(window);
+       lw->options.search_window.h = gdk_window_get_height(window);
+}
+
 static void search_window_close(SearchData *sd)
 {
+
+       search_window_get_geometry(sd);
+
        gtk_widget_destroy(sd->window);
 }
 
@@ -3106,6 +3124,9 @@ void search_new(FileData *dir_fd, FileData *example_file)
        GdkGeometry geometry;
        gint i;
        gchar *marks_string;
+       LayoutWindow *lw = NULL;
+
+       layout_valid(&lw);
 
        sd = g_new0(SearchData, 1);
 
@@ -3153,7 +3174,15 @@ void search_new(FileData *dir_fd, FileData *example_file)
        gtk_window_set_geometry_hints(GTK_WINDOW(sd->window), NULL, &geometry,
                                      GDK_HINT_MIN_SIZE | GDK_HINT_BASE_SIZE);
 
-       gtk_window_set_default_size(GTK_WINDOW(sd->window), DEF_SEARCH_WIDTH, DEF_SEARCH_HEIGHT);
+       if (lw && options->save_window_positions)
+               {
+               gtk_window_set_default_size(GTK_WINDOW(sd->window), lw->options.search_window.w, lw->options.search_window.h);
+               gtk_window_move(GTK_WINDOW(sd->window), lw->options.search_window.x, lw->options.search_window.y);
+               }
+       else
+               {
+               gtk_window_set_default_size(GTK_WINDOW(sd->window), DEF_SEARCH_WIDTH, DEF_SEARCH_HEIGHT);
+               }
 
        g_signal_connect(G_OBJECT(sd->window), "delete_event",
                         G_CALLBACK(search_window_delete_cb), sd);
index fcc6817..596421f 100644 (file)
@@ -704,6 +704,20 @@ struct _LayoutOptions
                gint y;
        } log_window;
 
+       struct {
+               gint w;
+               gint h;
+               gint x;
+               gint y;
+       } search_window;
+
+       struct {
+               gint w;
+               gint h;
+               gint x;
+               gint y;
+       } dupe_window;
+
        gboolean tools_float;
        gboolean tools_hidden;
        gboolean toolbar_hidden;