Indeed, you were right regarding gtk_comb_box_set_entry_text_column().

For the record, below find a translation into C of your python program.
Here are some enhancements that I thought of, though I highly doubt that
they will be adapted because they are too specialized.

   - Turn it into a widget, that takes a receives of strings in its
   constructor.
   - Add keybindings for the following functionality:
      - Restore the last string input into the entry widget before
      selecting a match i the combo-box. E.g. [Meta-Up], [Ctrl-/]
      - Select next entry matching the last string input. [Ctrl-Up]
      - Select previous entry matching the last string input. [Ctrl-Down]
      - Toggle mathing method between Regular expressions, and partial
      string matches. [Ctrl-=]
   - The special keybindings should also be shown when doing rightclick in
   the enty widget, that should allow the above functionality.

Based on the code below, I have now also created a pull request for
gucharmap: https://github.com/GNOME/gucharmap/pull/2 .

Thanks again!

#include <stdlib.h>

#include <gtk/gtk.h>


enum {

      COL_FONT = 0

};


void populate_store(GtkListStore *store)

{

    int i;


    for (i=0; i<100; i++) {

        char buf[100];

        GtkTreeIter iter;

        sprintf(buf, "Font %d", i);

        gtk_list_store_insert_with_values(store,

                                          &iter,

                                          -1,

                                          COL_FONT, buf,

                                          -1);

    }

}


static gboolean

match_function (GtkEntryCompletion *completion,

                const gchar *key,

                GtkTreeIter *iter,

                gpointer user_data)

{

    GtkTreeModel *model = GTK_TREE_MODEL(user_data);

    char *family, *family_fold;

    gchar **sub_match, **p;

    gboolean all_matches = TRUE;


    gtk_tree_model_get (model,

                        iter,

                        COL_FONT, &family,

                        -1);

    family_fold = g_utf8_casefold (family, -1);


    /* Match by all space separated substrings are part of family string */

    sub_match = g_strsplit(key, " ", -1);

    p = sub_match;

    while (*p) {

        gchar *match_fold = g_utf8_casefold (*p++, -1);

        if (!g_strstr_len (family_fold, -1, match_fold)) {

            all_matches = FALSE;

            break;

        }

    }


    g_free (family);

    g_free (family_fold);

    g_strfreev (sub_match);


    return all_matches;

}



static gboolean

completion_match_selected(GtkEntryCompletion *widget,

                          GtkTreeModel       *model,

                          GtkTreeIter        *iter,

                          gpointer           *user_data)

{

    char *font;


    gtk_tree_model_get (model,

                        iter,

                        COL_FONT, &font,

                        -1);

    printf("selected %s\n", font);

    g_free (font);


    return FALSE;

}


static void

combo_changed (GtkComboBox *combo,

               gpointer user_data)

{

    GtkTreeModel *model = GTK_TREE_MODEL (user_data);

    GtkTreeIter iter;

    char *font;


    if (!gtk_combo_box_get_active_iter (combo, &iter))

        return;


    gtk_tree_model_get (model,

                        &iter,

                        COL_FONT, &font,

                        -1);

    if (!font)

        return;


    printf("Choosen %s\n", font);

    g_free (font);

}



int main(int argc, char **argv)

{

    gtk_init(&argc, &argv);

    GtkWidget *w_mw = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    g_signal_connect(w_mw,"destroy",gtk_main_quit, NULL);


    GtkListStore *store = gtk_list_store_new (1, G_TYPE_STRING);

    populate_store(store);

    GtkWidget *w_combo = gtk_combo_box_new_with_model_and_entry
(GTK_TREE_MODEL (store));

    gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX(w_combo), COL_FONT);

    g_signal_connect (w_combo, "changed",

                      G_CALLBACK (combo_changed), store);

      GtkEntryCompletion *completion = gtk_entry_completion_new();

    gtk_entry_completion_set_model (completion, GTK_TREE_MODEL (store));

    gtk_entry_completion_set_text_column (completion, COL_FONT);

    gtk_entry_completion_set_match_func(completion, match_function,
GTK_TREE_MODEL(store), NULL);

    g_signal_connect (G_OBJECT (completion), "match-selected",

                      G_CALLBACK (completion_match_selected), NULL);


    gtk_entry_set_completion (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (w_combo))),

                              completion);


    gtk_container_add(GTK_CONTAINER(w_mw), w_combo);

    gtk_widget_show_all(w_mw);

    gtk_main();


    exit(0);

}



On Sat, Jul 28, 2018 at 2:34 PM Reuben Rissler <sil...@emypeople.net> wrote:

>
>
> (gucharmap:30880): Gtk-CRITICAL **: 17:41:07.804: gtk_entry_set_text:
> assertion 'text != NULL' failed
>
> This happens e.g. when I'm using the up down arrows within the text entry.
> Btw, this happens also if I only replace (without setting up all the
> connections), gtk_combo_box_new() with gtk_combo_box_new_with_entry(). I'm
> still trying to figure out what went wrong.
>
> I will hazard a guess that you didn't set the text column with
> gtk_combo_box_set_entry_text_column ()
>
> Reuben
>
>
_______________________________________________
gtk-devel-list mailing list
gtk-devel-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-devel-list

Reply via email to