Use std::swap instead of temporary values
[geeqie.git] / src / layout.cc
index c2ec03b..f955399 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#include "main.h"
 #include "layout.h"
 
-#include "bar.h"
+#include <unistd.h>
+
+#include <cstring>
+#include <utility>
+
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <gdk/gdk.h>
+#ifdef GDK_WINDOWING_X11
+#  include <gdk/gdkx.h>
+#endif
+#include <glib-object.h>
+#include <pango/pango.h>
+
 #include "bar-sort.h"
+#include "bar.h"
+#include "compat.h"
+#include "debug.h"
 #include "filedata.h"
 #include "histogram.h"
 #include "history-list.h"
-#include "image.h"
 #include "image-overlay.h"
+#include "image.h"
+#include "intl.h"
 #include "layout-config.h"
 #include "layout-image.h"
 #include "layout-util.h"
 #include "logwindow.h"
+#include "main-defines.h"
+#include "main.h"
 #include "menu.h"
 #include "metadata.h"
 #include "misc.h"
 #include "ui-menu.h"
 #include "ui-misc.h"
 #include "ui-tabcomp.h"
-#include "utilops.h"
+#include "ui-utildlg.h"
 #include "view-dir.h"
 #include "view-file.h"
 #include "window.h"
 
-#ifdef GDK_WINDOWING_X11
-#include <gdk/gdkx.h>
-#endif
+namespace
+{
 
-#define MAINWINDOW_DEF_WIDTH 700
-#define MAINWINDOW_DEF_HEIGHT 500
+constexpr gint MAINWINDOW_DEF_WIDTH = 700;
+constexpr gint MAINWINDOW_DEF_HEIGHT = 500;
 
-#define MAIN_WINDOW_DIV_HPOS (MAINWINDOW_DEF_WIDTH / 2)
-#define MAIN_WINDOW_DIV_VPOS (MAINWINDOW_DEF_HEIGHT / 2)
+constexpr gint MAIN_WINDOW_DIV_HPOS = MAINWINDOW_DEF_WIDTH / 2;
+constexpr gint MAIN_WINDOW_DIV_VPOS = MAINWINDOW_DEF_HEIGHT / 2;
 
-#define TOOLWINDOW_DEF_WIDTH 260
-#define TOOLWINDOW_DEF_HEIGHT 450
+constexpr gint TOOLWINDOW_DEF_WIDTH = 260;
+constexpr gint TOOLWINDOW_DEF_HEIGHT = 450;
 
-#define PROGRESS_WIDTH 150
-#define ZOOM_LABEL_WIDTH 120
+constexpr gint PROGRESS_WIDTH = 150;
 
-#define PANE_DIVIDER_SIZE 10
+constexpr gint ZOOM_LABEL_WIDTH = 120;
 
+constexpr gint CONFIG_WINDOW_DEF_WIDTH = 600;
+constexpr gint CONFIG_WINDOW_DEF_HEIGHT = 400;
+
+struct LayoutConfig
+{
+       LayoutWindow *lw;
+
+       GtkWidget *configwindow;
+       GtkWidget *home_path_entry;
+       GtkWidget *layout_widget;
+
+       LayoutOptions options;
+};
+
+} // namespace
 
 GList *layout_window_list = nullptr;
 LayoutWindow *current_lw = nullptr;
@@ -323,29 +353,37 @@ static GtkWidget *layout_tool_setup(LayoutWindow *lw)
 {
        GtkWidget *box;
        GtkWidget *box_folders;
-       GtkWidget *scd;
+       GtkWidget *box_menu_tabcomp;
+       GtkWidget *menu_bar;
        GtkWidget *menu_tool_bar;
+       GtkWidget *menu_toolbar_box;
+       GtkWidget *open_menu;
+       GtkWidget *scd;
+       GtkWidget *scroll_window;
        GtkWidget *tabcomp;
-       GtkWidget *menu_bar;
        GtkWidget *toolbar;
-       GtkWidget *scroll_window;
 
        box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
 
        if (!options->expand_menu_toolbar)
                {
-               menu_bar = layout_actions_menu_bar(lw);
-
-               toolbar = layout_actions_toolbar(lw, TOOLBAR_MAIN);
+               menu_toolbar_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
                scroll_window = gq_gtk_scrolled_window_new(nullptr, nullptr);
-               gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_window), GTK_POLICY_AUTOMATIC,GTK_POLICY_NEVER);
-               gq_gtk_container_add(GTK_WIDGET(scroll_window), menu_bar);
+               gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER);
+
+               if (!options->hamburger_menu)
+                       {
+                       menu_bar = layout_actions_menu_bar(lw);
+                       gq_gtk_box_pack_start(GTK_BOX(menu_toolbar_box), menu_bar, FALSE, FALSE, 0);
+                       }
 
-               gtk_widget_show(scroll_window);
-               gtk_widget_show(menu_bar);
+               toolbar = layout_actions_toolbar(lw, TOOLBAR_MAIN);
 
+               gq_gtk_box_pack_start(GTK_BOX(menu_toolbar_box), toolbar, FALSE, FALSE, 0);
+               gq_gtk_container_add(GTK_WIDGET(scroll_window), menu_toolbar_box);
                gq_gtk_box_pack_start(GTK_BOX(box), scroll_window, FALSE, FALSE, 0);
-               gq_gtk_box_pack_start(GTK_BOX(box), toolbar, FALSE, FALSE, 0);
+
+               gtk_widget_show_all(scroll_window);
                }
        else
                {
@@ -355,18 +393,32 @@ static GtkWidget *layout_tool_setup(LayoutWindow *lw)
                gq_gtk_box_pack_start(GTK_BOX(lw->main_box), lw->menu_tool_bar, FALSE, FALSE, 0);
                }
 
-       tabcomp = tab_completion_new_with_history(&lw->path_entry, nullptr, "path_list", -1,
-                                                 layout_path_entry_cb, lw);
+       tabcomp = tab_completion_new_with_history(&lw->path_entry, nullptr, "path_list", -1, layout_path_entry_cb, lw);
        DEBUG_NAME(tabcomp);
        tab_completion_add_tab_func(lw->path_entry, layout_path_entry_tab_cb, lw);
        tab_completion_add_append_func(lw->path_entry, layout_path_entry_tab_append_cb, lw);
-       gq_gtk_box_pack_start(GTK_BOX(box), tabcomp, FALSE, FALSE, 0);
+
+       if (options->hamburger_menu)
+               {
+               box_menu_tabcomp = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+               gtk_widget_show(box_menu_tabcomp);
+
+               open_menu = layout_actions_menu_bar(lw);
+               gtk_widget_set_tooltip_text(open_menu, _("Open application menu"));
+               gq_gtk_box_pack_start(GTK_BOX(box_menu_tabcomp), open_menu, FALSE, FALSE, 0);
+               gq_gtk_box_pack_start(GTK_BOX(box_menu_tabcomp), tabcomp, TRUE, TRUE, 0);
+               gq_gtk_box_pack_start(GTK_BOX(box), box_menu_tabcomp, FALSE, FALSE, 0);
+               }
+       else
+               {
+               gq_gtk_box_pack_start(GTK_BOX(box), tabcomp, FALSE, FALSE, 0);
+               }
+
        gtk_widget_show(tabcomp);
        gtk_widget_set_has_tooltip(GTK_WIDGET(tabcomp), TRUE);
        g_signal_connect(G_OBJECT(tabcomp), "query_tooltip", G_CALLBACK(path_entry_tooltip_cb), lw);
 
-       g_signal_connect(G_OBJECT(gtk_widget_get_parent(gtk_widget_get_parent(lw->path_entry))), "changed",
-                        G_CALLBACK(layout_path_entry_changed_cb), lw);
+       g_signal_connect(G_OBJECT(gtk_widget_get_parent(gtk_widget_get_parent(lw->path_entry))), "changed", G_CALLBACK(layout_path_entry_changed_cb), lw);
 
        box_folders = GTK_WIDGET(gtk_paned_new(GTK_ORIENTATION_HORIZONTAL));
        DEBUG_NAME(box_folders);
@@ -388,8 +440,7 @@ static GtkWidget *layout_tool_setup(LayoutWindow *lw)
 
        gtk_widget_show(box_folders);
 
-       g_signal_connect(G_OBJECT(box_folders), "notify::position",
-                        G_CALLBACK(layout_box_folders_changed_cb), lw);
+       g_signal_connect(G_OBJECT(box_folders), "notify::position", G_CALLBACK(layout_box_folders_changed_cb), lw);
 
        gtk_widget_show(box);
 
@@ -760,7 +811,8 @@ void layout_status_update_image(LayoutWindow *lw)
                        }
                else
                        {
-                       gint width, height;
+                       gint width;
+                       gint height;
                        fd = image_get_fd(lw->image);
                        page_total = fd->page_total;
                        page_num = fd->page_num + 1;
@@ -794,7 +846,7 @@ void layout_status_update_all(LayoutWindow *lw)
        layout_util_status_update_write(lw);
 }
 
-static GtkWidget *layout_status_label(gchar *text, GtkWidget *box, gboolean start, gint size, gboolean expand)
+static GtkWidget *layout_status_label(const gchar *text, GtkWidget *box, gboolean start, gint size, gboolean expand)
 {
        GtkWidget *label;
        GtkWidget *frame;
@@ -1534,8 +1586,7 @@ gboolean layout_geometry_get_tools(LayoutWindow *lw, gint *x, gint *y, gint *w,
        return TRUE;
 }
 
-gboolean layout_geometry_get_log_window(LayoutWindow *lw, gint *x, gint *y,
-                                                                                                               gint *w, gint *h)
+static gboolean layout_geometry_get_log_window(LayoutWindow *lw, GdkRectangle &log_window)
 {
        GdkWindow *window;
 
@@ -1547,9 +1598,9 @@ gboolean layout_geometry_get_log_window(LayoutWindow *lw, gint *x, gint *y,
                }
 
        window = gtk_widget_get_window(lw->log_window);
-       gdk_window_get_root_origin(window, x, y);
-       *w = gdk_window_get_width(window);
-       *h = gdk_window_get_height(window);
+       gdk_window_get_root_origin(window, &log_window.x, &log_window.y);
+       log_window.width = gdk_window_get_width(window);
+       log_window.height = gdk_window_get_height(window);
 
        return TRUE;
 }
@@ -1596,7 +1647,8 @@ static gboolean layout_tools_delete_cb(GtkWidget *, GdkEventAny *, gpointer data
 static void layout_tools_setup(LayoutWindow *lw, GtkWidget *tools, GtkWidget *files)
 {
        GtkWidget *vbox;
-       GtkWidget *w1, *w2;
+       GtkWidget *w1;
+       GtkWidget *w2;
        gboolean vertical;
        gboolean new_window = FALSE;
 
@@ -1673,7 +1725,7 @@ static void layout_tools_setup(LayoutWindow *lw, GtkWidget *tools, GtkWidget *fi
                if (options->save_window_positions)
                        {
                        gtk_window_set_default_size(GTK_WINDOW(lw->tools), lw->options.float_window.w, lw->options.float_window.h);
-                       gtk_window_move(GTK_WINDOW(lw->tools), lw->options.float_window.x, lw->options.float_window.y);
+                       gq_gtk_window_move(GTK_WINDOW(lw->tools), lw->options.float_window.x, lw->options.float_window.y);
                        }
                else
                        {
@@ -1787,13 +1839,16 @@ static void layout_grid_setup(LayoutWindow *lw)
        gint priority_location;
        GtkWidget *h;
        GtkWidget *v;
-       GtkWidget *w1, *w2, *w3;
+       GtkWidget *w1;
+       GtkWidget *w2;
+       GtkWidget *w3;
 
        GtkWidget *image_sb; /* image together with sidebars in utility box */
        GtkWidget *tools;
        GtkWidget *files;
 
        layout_actions_setup(lw);
+       create_toolbars(lw);
 
        lw->group_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
        DEBUG_NAME(lw->group_box);
@@ -1840,7 +1895,8 @@ static void layout_grid_setup(LayoutWindow *lw)
 
                return;
                }
-       else if (lw->tools)
+
+       if (lw->tools)
                {
                layout_tools_geometry_sync(lw);
                gq_gtk_widget_destroy(lw->tools);
@@ -1860,11 +1916,7 @@ static void layout_grid_setup(LayoutWindow *lw)
 
        if (!layout_location_vertical(static_cast<LayoutLocation>(priority_location)))
                {
-               GtkWidget *tmp;
-
-               tmp = v;
-               v = h;
-               h = tmp;
+               std::swap(v, h);
                }
 
        gq_gtk_box_pack_start(GTK_BOX(lw->group_box), v, TRUE, TRUE, 0);
@@ -1917,7 +1969,9 @@ void layout_style_set(LayoutWindow *lw, gint style, const gchar *order)
 
        if (style != -1)
                {
-               LayoutLocation d, f, i;
+               LayoutLocation d;
+               LayoutLocation f;
+               LayoutLocation i;
 
                layout_config_parse(style, order, &d,  &f, &i);
 
@@ -2203,20 +2257,6 @@ void layout_info_pixel_set(LayoutWindow *lw, gboolean show)
  *-----------------------------------------------------------------------------
  */
 
-#define CONFIG_WINDOW_DEF_WIDTH                600
-#define CONFIG_WINDOW_DEF_HEIGHT       400
-
-struct LayoutConfig
-{
-       LayoutWindow *lw;
-
-       GtkWidget *configwindow;
-       GtkWidget *home_path_entry;
-       GtkWidget *layout_widget;
-
-       LayoutOptions options;
-};
-
 static gint layout_config_delete_cb(GtkWidget *w, GdkEventAny *event, gpointer data);
 
 static void layout_config_close_cb(GtkWidget *, gpointer data)
@@ -2464,8 +2504,7 @@ void layout_sync_options_with_current_state(LayoutWindow *lw)
        g_free(lw->options.last_path);
        lw->options.last_path = g_strdup(layout_get_path(lw));
 
-       layout_geometry_get_log_window(lw, &lw->options.log_window.x, &lw->options.log_window.y,
-                                        &lw->options.log_window.w, &lw->options.log_window.h);
+       layout_geometry_get_log_window(lw, lw->options.log_window);
 
 #ifdef GDK_WINDOWING_X11
        GdkDisplay *display;
@@ -2667,7 +2706,7 @@ LayoutWindow *layout_new_with_geometry(FileData *dir_fd, LayoutOptions *lop,
        if (options->save_window_positions || isfile(default_path))
                {
                gtk_window_set_default_size(GTK_WINDOW(lw->window), lw->options.main_window.w, lw->options.main_window.h);
-               gtk_window_move(GTK_WINDOW(lw->window), lw->options.main_window.x, lw->options.main_window.y);
+               gq_gtk_window_move(GTK_WINDOW(lw->window), lw->options.main_window.x, lw->options.main_window.y);
                if (lw->options.main_window.maximized) gtk_window_maximize(GTK_WINDOW(lw->window));
 
                g_idle_add(move_window_to_workspace_cb, lw);
@@ -2708,7 +2747,7 @@ LayoutWindow *layout_new_with_geometry(FileData *dir_fd, LayoutOptions *lop,
                pixbuf = pixbuf_inline(PIXBUF_INLINE_LOGO);
 
                /** @FIXME the zoom value set here is the value, which is then copied again and again
-                  in "Leave Zoom at previous setting" mode. This is not ideal.  */
+                  in 'Leave Zoom at previous setting' mode. This is not ideal.  */
                image_change_pixbuf(lw->image, pixbuf, 0.0, FALSE);
                g_object_unref(pixbuf);
                }
@@ -2808,8 +2847,8 @@ void layout_write_attributes(LayoutOptions *layout, GString *outstr, gint indent
 
        WRITE_NL(); WRITE_INT(*layout, log_window.x);
        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, log_window.width);
+       WRITE_NL(); WRITE_INT(*layout, log_window.height);
 
        WRITE_NL(); WRITE_INT(*layout, preferences_window.x);
        WRITE_NL(); WRITE_INT(*layout, preferences_window.y);
@@ -2925,8 +2964,8 @@ void layout_load_attributes(LayoutOptions *layout, const gchar **attribute_names
 
                if (READ_INT(*layout, log_window.x)) continue;
                if (READ_INT(*layout, log_window.y)) continue;
-               if (READ_INT(*layout, log_window.w)) continue;
-               if (READ_INT(*layout, log_window.h)) continue;
+               if (READ_INT(*layout, log_window.width)) continue;
+               if (READ_INT(*layout, log_window.height)) continue;
 
                if (READ_INT(*layout, preferences_window.x)) continue;
                if (READ_INT(*layout, preferences_window.y)) continue;
@@ -3101,5 +3140,4 @@ LayoutWindow *layout_new_from_default()
        return lw;
 }
 
-
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */