Limit definition of XOPEN_SOURCE to Linux, where it's needed.
[geeqie.git] / src / search.cc
index ee8fdd8..2dde8a3 100644 (file)
@@ -163,6 +163,7 @@ struct SearchData
        gchar *search_name;
        GRegex *search_name_regex;
        gboolean   search_name_match_case;
+       gboolean   search_name_symbolic_link;
        gint64 search_size;
        gint64 search_size_end;
        gint   search_date_y;
@@ -1562,19 +1563,19 @@ static void search_gps_dnd_received_cb(GtkWidget *, GdkDragContext *,
                        longitude = metadata_read_GPS_coord(fd, "Xmp.exif.GPSLongitude", 1000);
                        if (latitude != 1000 && longitude != 1000)
                                {
-                               gtk_entry_set_text(GTK_ENTRY(sd->entry_gps_coord),
+                               gq_gtk_entry_set_text(GTK_ENTRY(sd->entry_gps_coord),
                                                        g_strdup_printf("%lf %lf", latitude, longitude));
                                }
                        else
                                {
-                               gtk_entry_set_text(GTK_ENTRY(sd->entry_gps_coord), "Image is not geocoded");
+                               gq_gtk_entry_set_text(GTK_ENTRY(sd->entry_gps_coord), "Image is not geocoded");
                                }
                        }
                }
 
        if (info == TARGET_TEXT_PLAIN)
                {
-               gtk_entry_set_text(GTK_ENTRY(sd->entry_gps_coord),"");
+               gq_gtk_entry_set_text(GTK_ENTRY(sd->entry_gps_coord),"");
                }
 }
 
@@ -1595,7 +1596,7 @@ static void search_path_entry_dnd_received_cb(GtkWidget *, GdkDragContext *,
                if (list != nullptr)
                        {
                        fd = static_cast<FileData *>(list->data);
-                       gtk_entry_set_text(GTK_ENTRY(sd->path_entry),
+                       gq_gtk_entry_set_text(GTK_ENTRY(sd->path_entry),
                                                g_strdup_printf("%s", fd->path));
                        gtk_widget_set_tooltip_text(GTK_WIDGET(sd->path_entry),g_strdup_printf("%s", fd->path));
                        }
@@ -1603,7 +1604,7 @@ static void search_path_entry_dnd_received_cb(GtkWidget *, GdkDragContext *,
 
        if (info == TARGET_TEXT_PLAIN)
                {
-               gtk_entry_set_text(GTK_ENTRY(sd->path_entry),"");
+               gq_gtk_entry_set_text(GTK_ENTRY(sd->path_entry),"");
                }
 }
 
@@ -1624,7 +1625,7 @@ static void search_image_content_dnd_received_cb(GtkWidget *, GdkDragContext *,
                if (list != nullptr)
                        {
                        fd = static_cast<FileData *>(list->data);
-                       gtk_entry_set_text(GTK_ENTRY(sd->entry_similarity),
+                       gq_gtk_entry_set_text(GTK_ENTRY(sd->entry_similarity),
                                                g_strdup_printf("%s", fd->path));
                        gtk_widget_set_tooltip_text(GTK_WIDGET(sd->entry_similarity),g_strdup_printf("%s", fd->path));
                        }
@@ -1632,7 +1633,7 @@ static void search_image_content_dnd_received_cb(GtkWidget *, GdkDragContext *,
 
        if (info == TARGET_TEXT_PLAIN)
                {
-               gtk_entry_set_text(GTK_ENTRY(sd->entry_similarity),"");
+               gq_gtk_entry_set_text(GTK_ENTRY(sd->entry_similarity),"");
                }
 }
 
@@ -1958,38 +1959,41 @@ static gboolean search_file_next(SearchData *sd)
                tested = TRUE;
                match = FALSE;
 
-               if (sd->match_name == SEARCH_MATCH_NAME_EQUAL)
+               if (!sd->search_name_symbolic_link || (sd->search_name_symbolic_link && islink(fd->path)))
                        {
-                       if (sd->search_name_match_case)
+                       if (sd->match_name == SEARCH_MATCH_NAME_EQUAL)
                                {
-                               match = (strcmp(fd->name, sd->search_name) == 0);
-                               }
-                       else
-                               {
-                               match = (g_ascii_strcasecmp(fd->name, sd->search_name) == 0);
-                               }
-                       }
-               else if (sd->match_name == SEARCH_MATCH_NAME_CONTAINS || sd->match_name == SEARCH_MATCH_PATH_CONTAINS)
-                       {
-                       const gchar *fd_name_or_path;
-                       if (sd->match_name == SEARCH_MATCH_NAME_CONTAINS)
-                               {
-                               fd_name_or_path = fd->name;
-                               }
-                       else
-                               {
-                               fd_name_or_path = fd->path;
-                               }
-                       if (sd->search_name_match_case)
-                               {
-                               match = g_regex_match(sd->search_name_regex, fd_name_or_path, static_cast<GRegexMatchFlags>(0), nullptr);
+                               if (sd->search_name_match_case)
+                                       {
+                                       match = (strcmp(fd->name, sd->search_name) == 0);
+                                       }
+                               else
+                                       {
+                                       match = (g_ascii_strcasecmp(fd->name, sd->search_name) == 0);
+                                       }
                                }
-                       else
+                       else if (sd->match_name == SEARCH_MATCH_NAME_CONTAINS || sd->match_name == SEARCH_MATCH_PATH_CONTAINS)
                                {
-                               /* sd->search_name is converted in search_start() */
-                               gchar *haystack = g_utf8_strdown(fd_name_or_path, -1);
-                               match = g_regex_match(sd->search_name_regex, haystack, static_cast<GRegexMatchFlags>(0), nullptr);
-                               g_free(haystack);
+                               const gchar *fd_name_or_path;
+                               if (sd->match_name == SEARCH_MATCH_NAME_CONTAINS)
+                                       {
+                                       fd_name_or_path = fd->name;
+                                       }
+                               else
+                                       {
+                                       fd_name_or_path = fd->path;
+                                       }
+                               if (sd->search_name_match_case)
+                                       {
+                                       match = g_regex_match(sd->search_name_regex, fd_name_or_path, static_cast<GRegexMatchFlags>(0), nullptr);
+                                       }
+                               else
+                                       {
+                                       /* sd->search_name is converted in search_start() */
+                                       gchar *haystack = g_utf8_strdown(fd_name_or_path, -1);
+                                       match = g_regex_match(sd->search_name_regex, haystack, static_cast<GRegexMatchFlags>(0), nullptr);
+                                       g_free(haystack);
+                                       }
                                }
                        }
                }
@@ -2666,14 +2670,14 @@ static void search_start_cb(GtkWidget *, gpointer data)
 
        if (sd->match_name_enable) history_combo_append_history(sd->entry_name, nullptr);
        g_free(sd->search_name);
-       sd->search_name = g_strdup(gtk_entry_get_text(GTK_ENTRY(sd->entry_name)));
+       sd->search_name = g_strdup(gq_gtk_entry_get_text(GTK_ENTRY(sd->entry_name)));
 
        /* XXX */
        g_free(sd->search_comment);
-       sd->search_comment = g_strdup(gtk_entry_get_text(GTK_ENTRY(sd->entry_comment)));
+       sd->search_comment = g_strdup(gq_gtk_entry_get_text(GTK_ENTRY(sd->entry_comment)));
 
        g_free(sd->search_similarity_path);
-       sd->search_similarity_path = g_strdup(gtk_entry_get_text(GTK_ENTRY(sd->entry_similarity)));
+       sd->search_similarity_path = g_strdup(gq_gtk_entry_get_text(GTK_ENTRY(sd->entry_similarity)));
        if (sd->match_similarity_enable)
                {
                if (!isfile(sd->search_similarity_path))
@@ -2693,7 +2697,7 @@ static void search_start_cb(GtkWidget *, gpointer data)
                {
                if (sd->match_gps != SEARCH_MATCH_NONE)
                        {
-                       entry_text = decode_geo_parameters(gtk_entry_get_text(
+                       entry_text = decode_geo_parameters(gq_gtk_entry_get_text(
                                                                                GTK_ENTRY(sd->entry_gps_coord)));
 
                        sd->search_lat = 1000;
@@ -2750,7 +2754,7 @@ static void search_start_cb(GtkWidget *, gpointer data)
                {
                /* search path */
 
-               path = remove_trailing_slash(gtk_entry_get_text(GTK_ENTRY(sd->path_entry)));
+               path = remove_trailing_slash(gq_gtk_entry_get_text(GTK_ENTRY(sd->path_entry)));
                if (isdir(path))
                        {
                        file_data_unref(sd->search_dir_fd);
@@ -2792,7 +2796,7 @@ static void search_start_cb(GtkWidget *, gpointer data)
                }
        else if (sd->search_type == SEARCH_MATCH_COLLECTION)
                {
-               collection = g_strdup(gtk_entry_get_text(GTK_ENTRY(sd->collection_entry)));
+               collection = g_strdup(gq_gtk_entry_get_text(GTK_ENTRY(sd->collection_entry)));
 
                if (is_collection(collection))
                        {
@@ -3177,7 +3181,7 @@ static void search_window_close(SearchData *sd)
 
        search_window_get_geometry(sd);
 
-       gtk_widget_destroy(sd->window);
+       gq_gtk_widget_destroy(sd->window);
 }
 
 static void search_window_close_cb(GtkWidget *, gpointer data)
@@ -3246,11 +3250,11 @@ static void select_collection_dialog_ok_cb(FileDialog *fdlg, gpointer data)
        gchar *path_noext;
        gchar *collection;
 
-       path = g_strdup(gtk_entry_get_text(GTK_ENTRY(fdlg->entry)));
+       path = g_strdup(gq_gtk_entry_get_text(GTK_ENTRY(fdlg->entry)));
        path_noext = remove_extension_from_path(path);
        collection = g_path_get_basename(path_noext);
 
-       gtk_entry_set_text(GTK_ENTRY(sd->collection_entry), collection);
+       gq_gtk_entry_set_text(GTK_ENTRY(sd->collection_entry), collection);
        file_dialog_close(fdlg);
 
        g_free(path);
@@ -3336,7 +3340,7 @@ void search_new(FileData *dir_fd, FileData *example_file)
                sd->search_similarity_path = g_strdup(example_file->path);
                }
 
-       sd->window = window_new(GTK_WINDOW_TOPLEVEL, "search", nullptr, nullptr, _("Image search"));
+       sd->window = window_new("search", nullptr, nullptr, _("Image search"));
        DEBUG_NAME(sd->window);
 
        gtk_window_set_resizable(GTK_WINDOW(sd->window), TRUE);
@@ -3351,7 +3355,7 @@ void search_new(FileData *dir_fd, FileData *example_file)
        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);
+               gq_gtk_window_move(GTK_WINDOW(sd->window), lw->options.search_window.x, lw->options.search_window.y);
                }
        else
                {
@@ -3368,7 +3372,7 @@ void search_new(FileData *dir_fd, FileData *example_file)
 
        vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
        gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_GAP);
-       gtk_container_add(GTK_CONTAINER(sd->window), vbox);
+       gq_gtk_container_add(GTK_WIDGET(sd->window), vbox);
        gtk_widget_show(vbox);
 
        sd->box_search = pref_box_new(vbox, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
@@ -3394,7 +3398,7 @@ void search_new(FileData *dir_fd, FileData *example_file)
 
        sd->collection = pref_box_new(hbox, TRUE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
        sd->collection_entry = gtk_entry_new();
-       gtk_entry_set_text(GTK_ENTRY(sd->collection_entry), "");
+       gq_gtk_entry_set_text(GTK_ENTRY(sd->collection_entry), "");
        gq_gtk_box_pack_start(GTK_BOX(sd->collection), sd->collection_entry, TRUE, TRUE, 0);
        gtk_widget_show(sd->collection_entry);
 
@@ -3415,6 +3419,7 @@ void search_new(FileData *dir_fd, FileData *example_file)
        gtk_widget_show(combo);
        pref_checkbox_new_int(hbox, _("Match case"),
                              sd->search_name_match_case, &sd->search_name_match_case);
+       pref_checkbox_new_int(hbox, _("Symbolic link"), sd->search_name_symbolic_link, &sd->search_name_symbolic_link);
        gtk_widget_set_tooltip_text(GTK_WIDGET(combo), "When set to \"contains\" or \"path contains\", this field uses Perl Compatible Regular Expressions.\ne.g. use \n.*\\.jpg\n and not \n*.jpg\n\nSee the Help file.");
 
        /* Search for file size */
@@ -3654,7 +3659,7 @@ void search_new(FileData *dir_fd, FileData *example_file)
 
        sd->result_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
        g_object_unref(store);
-       gtk_container_add(GTK_CONTAINER(scrolled), sd->result_view);
+       gq_gtk_container_add(GTK_WIDGET(scrolled), sd->result_view);
        gtk_widget_show(sd->result_view);
 
        selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(sd->result_view));
@@ -3695,7 +3700,7 @@ void search_new(FileData *dir_fd, FileData *example_file)
 
        sd->label_status = gtk_label_new("");
        gtk_widget_set_size_request(sd->label_status, 50, -1);
-       gtk_container_add(GTK_CONTAINER(frame), sd->label_status);
+       gq_gtk_container_add(GTK_WIDGET(frame), sd->label_status);
        gtk_widget_show(sd->label_status);
 
        sd->label_progress = gtk_progress_bar_new();