Fix #1223: "Confirm move files to trash" not working
[geeqie.git] / src / bar.cc
index 8aad11e..2a1dfe7 100644 (file)
 
 #include "bar-histogram.h"
 #include "filedata.h"
+#include "layout.h"
 #include "metadata.h"
 #include "rcfile.h"
 #include "ui-menu.h"
 #include "ui-misc.h"
 
-typedef struct _KnownPanes KnownPanes;
-struct _KnownPanes
+struct KnownPanes
 {
        PaneType type;
        const gchar *id;
@@ -202,11 +202,10 @@ static const KnownPanes known_panes[] = {
        {PANE_GPS,              "gps",  N_("GPS Map"),  default_config_gps},
 #endif
 #endif
-       {PANE_UNDEF,            NULL,           NULL,                   NULL}
+       {PANE_UNDEF,            nullptr,                nullptr,                        nullptr}
 };
 
-typedef struct _BarData BarData;
-struct _BarData
+struct BarData
 {
        GtkWidget *widget;
        GtkWidget *vbox;
@@ -218,7 +217,9 @@ struct _BarData
        gint width;
 };
 
-static void bar_expander_move(GtkWidget *UNUSED(widget), gpointer data, gboolean up, gboolean single_step)
+static const gchar *bar_pane_get_default_config(const gchar *id);
+
+static void bar_expander_move(GtkWidget *, gpointer data, gboolean up, gboolean single_step)
 {
        auto expander = static_cast<GtkWidget *>(data);
        GtkWidget *box;
@@ -270,15 +271,20 @@ static void height_spin_changed_cb(GtkSpinButton *spin, gpointer data)
        gtk_widget_set_size_request(GTK_WIDGET(data), -1, gtk_spin_button_get_value_as_int(spin));
 }
 
-static void height_spin_key_press_cb(GtkEventControllerKey *UNUSED(controller), gint keyval, guint UNUSED(keycode), GdkModifierType UNUSED(state), gpointer data)
+static void height_spin_key_press_cb(GtkEventControllerKey *, gint keyval, guint, GdkModifierType, gpointer data)
 {
        if ((keyval == GDK_KEY_Return || keyval == GDK_KEY_Escape))
                {
-               gtk_widget_destroy(GTK_WIDGET(data));
+               g_object_unref(GTK_WIDGET(data));
                }
 }
 
-static void bar_expander_height_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void expander_height_cb(GtkWindow *widget, GdkEvent *, gpointer)
+{
+       gq_gtk_widget_destroy(GTK_WIDGET(widget));
+}
+
+static void bar_expander_height_cb(GtkWidget *, gpointer data)
 {
        auto expander = static_cast<GtkWidget *>(data);
        GtkWidget *spin;
@@ -295,18 +301,24 @@ static void bar_expander_height_cb(GtkWidget *UNUSED(widget), gpointer data)
        display = gdk_display_get_default();
        seat = gdk_display_get_default_seat(display);
        device = gdk_seat_get_pointer(seat);
-       gdk_device_get_position(device, NULL, &x, &y);
+       gdk_device_get_position(device, nullptr, &x, &y);
 
        list = gtk_container_get_children(GTK_CONTAINER(expander));
        data_box = static_cast<GtkWidget *>(list->data);
 
-       window = gtk_window_new(GTK_WINDOW_POPUP);
+#ifdef HAVE_GTK4
+       window = gtk_window_new();
+#else
+       window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+#endif
 
        gtk_window_set_modal(GTK_WINDOW(window), TRUE);
-       gtk_window_set_keep_above(GTK_WINDOW(window), TRUE);
+       gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
+       gq_gtk_window_set_keep_above(GTK_WINDOW(window), TRUE);
        gtk_window_set_default_size(GTK_WINDOW(window), 50, 30); //** @FIXME set these values in a more sensible way */
+       g_signal_connect(window, "key-press-event", G_CALLBACK(expander_height_cb), nullptr);
 
-       gtk_window_move(GTK_WINDOW(window), x, y);
+       gq_gtk_window_move(GTK_WINDOW(window), x, y);
        gtk_widget_show(window);
 
        gtk_widget_get_size_request(GTK_WIDGET(data_box), &w, &h);
@@ -317,22 +329,21 @@ static void bar_expander_height_cb(GtkWidget *UNUSED(widget), gpointer data)
        g_signal_connect(controller, "key-pressed", G_CALLBACK(height_spin_key_press_cb), window);
 
        gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), h);
-       gtk_container_add(GTK_CONTAINER(window), spin);
+       gq_gtk_container_add(GTK_WIDGET(window), spin);
        gtk_widget_show(spin);
        gtk_widget_grab_focus(GTK_WIDGET(spin));
 
        g_list_free(list);
 }
 
-static void bar_expander_delete_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void bar_expander_delete_cb(GtkWidget *, gpointer data)
 {
        auto expander = static_cast<GtkWidget *>(data);
-       gtk_widget_destroy(expander);
+       g_object_unref(expander);
 }
 
-static void bar_expander_add_cb(GtkWidget *widget, gpointer UNUSED(data))
+static void bar_expander_add_cb(GtkWidget *widget, gpointer)
 {
-       //GtkWidget *bar = static_cast<//GtkWidget *>(data);
        const KnownPanes *pane = known_panes;
        auto id = static_cast<const gchar *>(g_object_get_data(G_OBJECT(widget), "pane_add_id"));
        const gchar *config;
@@ -372,7 +383,7 @@ static void bar_menu_popup(GtkWidget *widget)
        bd = static_cast<BarData *>(g_object_get_data(G_OBJECT(widget), "bar_data"));
        if (bd)
                {
-               expander = NULL;
+               expander = nullptr;
                bar = widget;
                }
        else
@@ -388,23 +399,23 @@ static void bar_menu_popup(GtkWidget *widget)
 
        if (expander)
                {
-               menu_item_add_stock(menu, _("Move to _top"), GTK_STOCK_GOTO_TOP, G_CALLBACK(bar_expander_move_top_cb), expander);
-               menu_item_add_stock(menu, _("Move _up"), GTK_STOCK_GO_UP, G_CALLBACK(bar_expander_move_up_cb), expander);
-               menu_item_add_stock(menu, _("Move _down"), GTK_STOCK_GO_DOWN, G_CALLBACK(bar_expander_move_down_cb), expander);
-               menu_item_add_stock(menu, _("Move to _bottom"), GTK_STOCK_GOTO_BOTTOM, G_CALLBACK(bar_expander_move_bottom_cb), expander);
+               menu_item_add_icon(menu, _("Move to _top"), GQ_ICON_GO_TOP, G_CALLBACK(bar_expander_move_top_cb), expander);
+               menu_item_add_icon(menu, _("Move _up"), GQ_ICON_GO_UP, G_CALLBACK(bar_expander_move_up_cb), expander);
+               menu_item_add_icon(menu, _("Move _down"), GQ_ICON_GO_DOWN, G_CALLBACK(bar_expander_move_down_cb), expander);
+               menu_item_add_icon(menu, _("Move to _bottom"), GQ_ICON_GO_BOTTOM, G_CALLBACK(bar_expander_move_bottom_cb), expander);
                menu_item_add_divider(menu);
 
                if (gtk_expander_get_expanded(GTK_EXPANDER(expander)) && display_height_option)
                        {
-                       menu_item_add_stock(menu, _("Height..."), GTK_STOCK_PREFERENCES, G_CALLBACK(bar_expander_height_cb), expander);
+                       menu_item_add_icon(menu, _("Height..."), GQ_ICON_PREFERENCES, G_CALLBACK(bar_expander_height_cb), expander);
                        menu_item_add_divider(menu);
                        }
 
-               menu_item_add_stock(menu, _("Remove"), GTK_STOCK_DELETE, G_CALLBACK(bar_expander_delete_cb), expander);
+               menu_item_add_icon(menu, _("Remove"), GQ_ICON_DELETE, G_CALLBACK(bar_expander_delete_cb), expander);
                menu_item_add_divider(menu);
                }
 
-       gtk_menu_popup_at_pointer(GTK_MENU(menu), NULL);
+       gtk_menu_popup_at_pointer(GTK_MENU(menu), nullptr);
 }
 
 static void bar_menu_add_popup(GtkWidget *widget)
@@ -420,16 +431,16 @@ static void bar_menu_add_popup(GtkWidget *widget)
        while (pane->id)
                {
                GtkWidget *item;
-               item = menu_item_add_stock(menu, _(pane->title), GTK_STOCK_ADD, G_CALLBACK(bar_expander_add_cb), bar);
+               item = menu_item_add_icon(menu, _(pane->title), GQ_ICON_ADD, G_CALLBACK(bar_expander_add_cb), bar);
                g_object_set_data(G_OBJECT(item), "pane_add_id", const_cast<gchar *>(pane->id));
                pane++;
                }
 
-       gtk_menu_popup_at_pointer(GTK_MENU(menu), NULL);
+       gtk_menu_popup_at_pointer(GTK_MENU(menu), nullptr);
 }
 
 
-static gboolean bar_menu_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer UNUSED(data))
+static gboolean bar_menu_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer)
 {
        if (bevent->button == MOUSE_BUTTON_RIGHT)
                {
@@ -439,7 +450,7 @@ static gboolean bar_menu_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer
        return FALSE;
 }
 
-static void bar_expander_cb(GObject *object, GParamSpec *UNUSED(param_spec), gpointer UNUSED(data))
+static void bar_expander_cb(GObject *object, GParamSpec *, gpointer)
 {
        GtkExpander *expander;
        GtkWidget *child;
@@ -449,7 +460,7 @@ static void bar_expander_cb(GObject *object, GParamSpec *UNUSED(param_spec), gpo
 
        if (gtk_expander_get_expanded(expander))
                {
-               gtk_widget_show_all(child);
+               gq_gtk_widget_show_all(child);
                }
        else
                {
@@ -457,7 +468,7 @@ static void bar_expander_cb(GObject *object, GParamSpec *UNUSED(param_spec), gpo
                }
 }
 
-static gboolean bar_menu_add_cb(GtkWidget *widget, GdkEventButton *UNUSED(bevent), gpointer UNUSED(data))
+static gboolean bar_menu_add_cb(GtkWidget *widget, GdkEventButton *, gpointer)
 {
        bar_menu_add_popup(widget);
        return TRUE;
@@ -537,12 +548,12 @@ GtkWidget *bar_find_pane_by_id(GtkWidget *bar, PaneType type, const gchar *id)
 {
        BarData *bd;
        GList *list, *work;
-       GtkWidget *ret = NULL;
+       GtkWidget *ret = nullptr;
 
-       if (!id || !id[0]) return NULL;
+       if (!id || !id[0]) return nullptr;
 
        bd = static_cast<BarData *>(g_object_get_data(G_OBJECT(bar), "bar_data"));
-       if (!bd) return NULL;
+       if (!bd) return nullptr;
 
        list = gtk_container_get_children(GTK_CONTAINER(bd->vbox));
 
@@ -567,21 +578,14 @@ GtkWidget *bar_find_pane_by_id(GtkWidget *bar, PaneType type, const gchar *id)
 void bar_clear(GtkWidget *bar)
 {
        BarData *bd;
-       GList *list, *work;
+       GList *list;
 
        bd = static_cast<BarData *>(g_object_get_data(G_OBJECT(bar), "bar_data"));
        if (!bd) return;
 
        list = gtk_container_get_children(GTK_CONTAINER(bd->vbox));
 
-       work = list;
-       while (work)
-               {
-               auto widget = static_cast<GtkWidget *>(work->data);
-               gtk_widget_destroy(widget);
-               work = work->next;
-               }
-       g_list_free(list);
+       g_list_free_full(list, reinterpret_cast<GDestroyNotify>(g_object_unref));
 }
 
 void bar_write_config(GtkWidget *bar, GString *outstr, gint indent)
@@ -646,7 +650,7 @@ void bar_add(GtkWidget *bar, GtkWidget *pane)
        pd->lw = bd->lw;
        pd->bar = bar;
 
-       expander = gtk_expander_new(NULL);
+       expander = gtk_expander_new(nullptr);
        DEBUG_NAME(expander);
        if (pd && pd->title)
                {
@@ -654,12 +658,12 @@ void bar_add(GtkWidget *bar, GtkWidget *pane)
                gtk_widget_show(pd->title);
                }
 
-       gtk_box_pack_start(GTK_BOX(bd->vbox), expander, FALSE, TRUE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(bd->vbox), expander, FALSE, TRUE, 0);
 
        g_signal_connect(expander, "button_release_event", G_CALLBACK(bar_menu_cb), bd);
        g_signal_connect(expander, "notify::expanded", G_CALLBACK(bar_expander_cb), pd);
 
-       gtk_container_add(GTK_CONTAINER(expander), pane);
+       gq_gtk_container_add(GTK_WIDGET(expander), pane);
 
        gtk_expander_set_expanded(GTK_EXPANDER(expander), pd->expanded);
 
@@ -669,9 +673,9 @@ void bar_add(GtkWidget *bar, GtkWidget *pane)
 
 }
 
-void bar_populate_default(GtkWidget *UNUSED(bar))
+void bar_populate_default(GtkWidget *)
 {
-       const gchar *populate_id[] = {"histogram", "title", "keywords", "comment", "rating", "exif", NULL};
+       const gchar *populate_id[] = {"histogram", "title", "keywords", "comment", "rating", "exif", nullptr};
        const gchar **id = populate_id;
 
        while (*id)
@@ -682,22 +686,25 @@ void bar_populate_default(GtkWidget *UNUSED(bar))
                }
 }
 
-static void bar_size_allocate(GtkWidget *UNUSED(widget), GtkAllocation *UNUSED(allocation), gpointer data)
+static void bar_size_allocate(GtkWidget *, GtkAllocation *, gpointer data)
 {
        auto bd = static_cast<BarData *>(data);
 
        bd->width = gtk_paned_get_position(GTK_PANED(bd->lw->utility_paned));
 }
 
-//gint bar_get_width(GtkWidget *bar)
-//{
-       //BarData *bd;
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-function"
+gint bar_get_width_unused(GtkWidget *bar)
+{
+       BarData *bd;
 
-       //bd = g_object_get_data(G_OBJECT(bar), "bar_data");
-       //if (!bd) return 0;
+       bd = static_cast<BarData *>(g_object_get_data(G_OBJECT(bar), "bar_data"));
+       if (!bd) return 0;
 
-       //return bd->width;
-//}
+       return bd->width;
+}
+#pragma GCC diagnostic pop
 
 void bar_close(GtkWidget *bar)
 {
@@ -706,10 +713,11 @@ void bar_close(GtkWidget *bar)
        bd = static_cast<BarData *>(g_object_get_data(G_OBJECT(bar), "bar_data"));
        if (!bd) return;
 
-       gtk_widget_destroy(bd->widget);
+       /* @FIXME This causes a g_object_unref failed error on exit */
+       gq_gtk_widget_destroy(bd->widget);
 }
 
-static void bar_destroy(GtkWidget *UNUSED(widget), gpointer data)
+static void bar_destroy(GtkWidget *, gpointer data)
 {
        auto bd = static_cast<BarData *>(data);
 
@@ -725,7 +733,7 @@ static void bar_destroy(GtkWidget *UNUSED(widget), gpointer data)
    it should be removed as soon as a better solution exists
 */
 
-static void bar_unrealize_clutter_fix_cb(GtkWidget *widget, gpointer UNUSED(data))
+static void bar_unrealize_clutter_fix_cb(GtkWidget *widget, gpointer)
 {
        GtkWidget *child = gtk_bin_get_child(GTK_BIN(widget));
        if (child) gtk_widget_unrealize(child);
@@ -766,38 +774,37 @@ GtkWidget *bar_new(LayoutWindow *lw)
        gtk_label_set_xalign(GTK_LABEL(bd->label_file_name), 0.5);
        gtk_label_set_yalign(GTK_LABEL(bd->label_file_name), 0.5);
 
-       gtk_box_pack_start(GTK_BOX(box), bd->label_file_name, TRUE, TRUE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(box), bd->label_file_name, TRUE, TRUE, 0);
        gtk_widget_show(bd->label_file_name);
 
-       gtk_box_pack_start(GTK_BOX(bd->widget), box, FALSE, FALSE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(bd->widget), box, FALSE, FALSE, 0);
        gtk_widget_show(box);
 
-       scrolled = gtk_scrolled_window_new(NULL, NULL);
+       scrolled = gq_gtk_scrolled_window_new(nullptr, nullptr);
        DEBUG_NAME(scrolled);
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
                GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
-       gtk_box_pack_start(GTK_BOX(bd->widget), scrolled, TRUE, TRUE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(bd->widget), scrolled, TRUE, TRUE, 0);
        gtk_widget_show(scrolled);
 
 
        bd->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
-       gtk_container_add(GTK_CONTAINER(scrolled), bd->vbox);
+       gq_gtk_container_add(GTK_WIDGET(scrolled), bd->vbox);
        gtk_viewport_set_shadow_type(GTK_VIEWPORT(gtk_bin_get_child(GTK_BIN(scrolled))), GTK_SHADOW_NONE);
 
        add_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
        DEBUG_NAME(add_box);
-       gtk_box_pack_end(GTK_BOX(bd->widget), add_box, FALSE, FALSE, 0);
-       tbar = pref_toolbar_new(add_box, GTK_TOOLBAR_ICONS);
-       bd->add_button = pref_toolbar_button(tbar, GTK_STOCK_ADD, NULL, FALSE,
-                                            _("Add Pane"),
-                                            G_CALLBACK(bar_menu_add_cb), bd);
+       gq_gtk_box_pack_end(GTK_BOX(bd->widget), add_box, FALSE, FALSE, 0);
+       tbar = pref_toolbar_new(add_box);
+       bd->add_button = pref_toolbar_button(tbar, GQ_ICON_ADD, _("Add"), FALSE,
+                                            _("Add Pane"), G_CALLBACK(bar_menu_add_cb), bd);
        gtk_widget_show(add_box);
 
 #ifdef HAVE_LIBCHAMPLAIN_GTK
        g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN(scrolled))), "unrealize", G_CALLBACK(bar_unrealize_clutter_fix_cb), NULL);
 #endif
 
-       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_NONE);
+       gq_gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_NONE);
        gtk_widget_show(bd->vbox);
        return bd->widget;
 }
@@ -847,8 +854,7 @@ GtkWidget *bar_pane_expander_title(const gchar *title)
        GtkWidget *widget = gtk_label_new(title);
 
        pref_label_bold(widget, TRUE, FALSE);
-       //gtk_label_set_ellipsize(GTK_LABEL(widget), PANGO_ELLIPSIZE_END);
-       /** @FIXME do not work */
+       gtk_label_set_ellipsize(GTK_LABEL(widget), PANGO_ELLIPSIZE_END);
 
        return widget;
 }
@@ -872,7 +878,7 @@ gboolean bar_pane_translate_title(PaneType type, const gchar *id, gchar **title)
        return TRUE;
 }
 
-const gchar *bar_pane_get_default_config(const gchar *id)
+static const gchar *bar_pane_get_default_config(const gchar *id)
 {
        const KnownPanes *pane = known_panes;
 
@@ -881,7 +887,7 @@ const gchar *bar_pane_get_default_config(const gchar *id)
                if (strcmp(pane->id, id) == 0) break;
                pane++;
                }
-       if (!pane->id) return NULL;
+       if (!pane->id) return nullptr;
        return pane->config;
 }