Move open_archive() to separate module
[geeqie.git] / src / bar.cc
index 97e3d48..bba0d9e 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#include "main.h"
 #include "bar.h"
 
-#include "bar-histogram.h"
+#include <cstring>
+
+#include <glib-object.h>
+#include <pango/pango.h>
+
+#include <config.h>
+
+#include "compat.h"
+#include "debug.h"
 #include "filedata.h"
+#include "intl.h"
 #include "layout.h"
+#include "main-defines.h"
 #include "metadata.h"
 #include "rcfile.h"
+#include "typedefs.h"
 #include "ui-menu.h"
 #include "ui-misc.h"
 
+
+namespace
+{
+
+void remove_child_from_parent(gpointer data)
+{
+       gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(GTK_WIDGET(data))), GTK_WIDGET(data));
+}
+
+}
+
 struct KnownPanes
 {
        PaneType type;
@@ -167,8 +188,8 @@ static const gchar default_config_copyright[] =
 "    </layout>"
 "</gq>";
 
-#ifdef HAVE_LIBCHAMPLAIN
-#ifdef HAVE_LIBCHAMPLAIN_GTK
+#if HAVE_LIBCHAMPLAIN
+#if HAVE_LIBCHAMPLAIN_GTK
 static const gchar default_config_gps[] =
 "<gq>"
 "    <layout id = '_current_'>"
@@ -197,8 +218,8 @@ static const KnownPanes known_panes[] = {
        {PANE_EXIF,             "file_info",    N_("File info"),        default_config_file_info},
        {PANE_EXIF,             "location",     N_("Location and GPS"), default_config_location},
        {PANE_EXIF,             "copyright",    N_("Copyright"),        default_config_copyright},
-#ifdef HAVE_LIBCHAMPLAIN
-#ifdef HAVE_LIBCHAMPLAIN_GTK
+#if HAVE_LIBCHAMPLAIN
+#if HAVE_LIBCHAMPLAIN_GTK
        {PANE_GPS,              "gps",  N_("GPS Map"),  default_config_gps},
 #endif
 #endif
@@ -275,10 +296,15 @@ static void height_spin_key_press_cb(GtkEventControllerKey *, gint keyval, guint
 {
        if ((keyval == GDK_KEY_Return || keyval == GDK_KEY_Escape))
                {
-               g_object_unref(GTK_WIDGET(data));
+               gq_gtk_widget_destroy(GTK_WIDGET(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);
@@ -286,8 +312,10 @@ static void bar_expander_height_cb(GtkWidget *, gpointer data)
        GtkWidget *window;
        GtkWidget *data_box;
        GList *list;
-       gint x, y;
-       gint w, h;
+       gint x;
+       gint y;
+       gint w;
+       gint h;
        GdkDisplay *display;
        GdkSeat *seat;
        GdkDevice *device;
@@ -301,13 +329,19 @@ static void bar_expander_height_cb(GtkWidget *, gpointer data)
        list = gtk_container_get_children(GTK_CONTAINER(expander));
        data_box = static_cast<GtkWidget *>(list->data);
 
-       window = gtk_window_new(GTK_WINDOW_POPUP);
+#if 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_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);
@@ -328,7 +362,7 @@ static void bar_expander_height_cb(GtkWidget *, gpointer data)
 static void bar_expander_delete_cb(GtkWidget *, gpointer data)
 {
        auto expander = static_cast<GtkWidget *>(data);
-       g_object_unref(expander);
+       gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(expander)), expander);
 }
 
 static void bar_expander_add_cb(GtkWidget *widget, gpointer)
@@ -507,7 +541,8 @@ void bar_notify_selection(GtkWidget *bar, gint count)
 gboolean bar_event(GtkWidget *bar, GdkEvent *event)
 {
        BarData *bd;
-       GList *list, *work;
+       GList *list;
+       GList *work;
        gboolean ret = FALSE;
 
        bd = static_cast<BarData *>(g_object_get_data(G_OBJECT(bar), "bar_data"));
@@ -536,7 +571,8 @@ gboolean bar_event(GtkWidget *bar, GdkEvent *event)
 GtkWidget *bar_find_pane_by_id(GtkWidget *bar, PaneType type, const gchar *id)
 {
        BarData *bd;
-       GList *list, *work;
+       GList *list;
+       GList *work;
        GtkWidget *ret = nullptr;
 
        if (!id || !id[0]) return nullptr;
@@ -574,13 +610,14 @@ void bar_clear(GtkWidget *bar)
 
        list = gtk_container_get_children(GTK_CONTAINER(bd->vbox));
 
-       g_list_free_full(list, reinterpret_cast<GDestroyNotify>(g_object_unref));
+       g_list_free_full(list, reinterpret_cast<GDestroyNotify>(remove_child_from_parent));
 }
 
 void bar_write_config(GtkWidget *bar, GString *outstr, gint indent)
 {
        BarData *bd;
-       GList *list, *work;
+       GList *list;
+       GList *work;
 
        if (!bar) return;
 
@@ -714,7 +751,7 @@ static void bar_destroy(GtkWidget *, gpointer data)
        g_free(bd);
 }
 
-#ifdef HAVE_LIBCHAMPLAIN_GTK
+#if HAVE_LIBCHAMPLAIN_GTK
 /**
    @FIXME this is an ugly hack that works around this bug:
    https://bugzilla.gnome.org/show_bug.cgi?id=590692
@@ -784,12 +821,12 @@ GtkWidget *bar_new(LayoutWindow *lw)
        add_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
        DEBUG_NAME(add_box);
        gq_gtk_box_pack_end(GTK_BOX(bd->widget), add_box, FALSE, FALSE, 0);
-       tbar = pref_toolbar_new(add_box, GTK_TOOLBAR_ICONS);
+       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
+#if 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
 
@@ -843,9 +880,7 @@ GtkWidget *bar_pane_expander_title(const gchar *title)
        GtkWidget *widget = gtk_label_new(title);
 
        pref_label_bold(widget, TRUE, FALSE);
-       /** @FIXME do not work
-        * gtk_label_set_ellipsize(GTK_LABEL(widget), PANGO_ELLIPSIZE_END);
-       */
+       gtk_label_set_ellipsize(GTK_LABEL(widget), PANGO_ELLIPSIZE_END);
 
        return widget;
 }