Search code examples
cgtk3glade

gtk 3 GtkBuilder, GtkEntryCompletion, How do I get this tree for the completion data?


I've been scouring every documentation source I can find, checking source examples, but I still have no idea how to use the GtkEntryCompletion for my GtkEntry.

know how to do it manually, without glade, source examples are abundant, but they are only applicable once I get the tree object.

main.glade

<interface>
  <requires lib="gtk+" version="3.12"/>
  <object class="GtkListStore" id="liststore1"/>
  <object class="GtkEntryCompletion" id="entrycompletion1">
    <property name="model">liststore1</property>
  </object>
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <property name="title" translatable="yes">Run Command</property>
    <property name="resizable">False</property>
    <property name="window_position">center</property>
    <property name="type_hint">dialog</property>
    <property name="decorated">False</property>
    <signal name="destroy" handler="gtk_main_quit" swapped="no"/>
    <child>
      <object class="GtkBox" id="box1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkLabel" id="label1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="margin_top">2</property>
            <property name="margin_bottom">2</property>
            <property name="label" translatable="yes">Run Command:</property>
            <property name="single_line_mode">True</property>
            <property name="max_width_chars">70</property>
            <property name="track_visited_links">False</property>
            <property name="xalign">0.039999999105930328</property>
            <property name="yalign">0</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkEntry" id="entry1">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="margin_left">5</property>
            <property name="margin_right">5</property>
            <property name="margin_bottom">5</property>
            <property name="width_chars">70</property>
            <property name="caps_lock_warning">False</property>
            <property name="primary_icon_activatable">False</property>
            <property name="secondary_icon_activatable">False</property>
            <property name="primary_icon_sensitive">False</property>
            <property name="secondary_icon_sensitive">False</property>
            <property name="completion">entrycompletion1</property>
            <signal name="activate" handler="cb_activated" swapped="no"/>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

main.c

#include <stdlib.h>
#include <glib.h>
#include <gtk/gtk.h>


struct widgets {
    GtkWidget *window1;
    GtkWidget *entry1;
    GtkWidget *label1;
};


static void get_widgets(struct widgets *widgets, GtkBuilder *builder) {
    widgets->window1 = GTK_WIDGET(gtk_builder_get_object(builder, "window1"));
    widgets->entry1 = GTK_WIDGET(gtk_builder_get_object(builder, "entry1"));
    widgets->label1 = GTK_WIDGET(gtk_builder_get_object(builder, "label1"));
}

G_MODULE_EXPORT gboolean cb_activated(GtkWidget *entry, gpointer data) {
    GError *err = NULL;

    const gchar *entry1_text;
    entry1_text = gtk_entry_get_text(GTK_ENTRY(entry));

    if (g_spawn_command_line_async(entry1_text, &err))
    {
        gtk_main_quit();
    }
    else
    {
        g_printerr("ERROR: %s\n", err->message);
        g_error_free(err);
        return FALSE;
    }
    return TRUE;
}


int main(int argc, char **argv) {
    GtkBuilder *builder;
    GError *err = NULL;
    struct widgets *widgets;

    gtk_init(&argc, &argv);

    builder = gtk_builder_new();
    if (!gtk_builder_add_from_file(builder, "main.glade", &err))
    {
        g_warning("%s", err->message);
        exit(EXIT_FAILURE);
    }

    widgets = g_slice_new(struct widgets);
    get_widgets(widgets, builder);
    gtk_builder_connect_signals(builder, widgets);
    g_object_unref(G_OBJECT(builder));

    gtk_widget_show(widgets->window1);
    gtk_main();


    g_slice_free(struct widgets, widgets);

    return EXIT_SUCCESS;
}

I believe I'm supposed to get liststore1, and then I can populate it, but all the ways I tried I was failing GTK's assertions.


Solution

  • I figured it out in my github repository,

    https://github.com/techzilla/gtk3run.git

    Turns out you just gtk_builder_get_object the liststore.