GtkEntry и сигнал "edit_done"

У меня есть функция, чтобы установить DEVICE в поле ввода GTK:

gboolean device_entry_activate_cb (GtkWidget *widget, gpointer data)
{
    const gchar *text;

    text = gtk_entry_get_text (GTK_ENTRY (entry));

    if (!strcmp( DEVICE, text )
        return FALSE;

    if ( DEVICE )
        g_free( DEVICE );

    DEVICE = g_strdup( text );

    if (0 == strcmp(DEVICE, "auto"))

    /* do something: start printer for example */

    return FALSE;
}

void device_entry_auto_activate_cb(GtkEntry* entry, const gchar* text, gpointer data)
{
    GtkEditable *editable = GTK_EDITABLE (entry);

    text = gtk_entry_get_text (GTK_ENTRY ( entry));

    if (0 == strcmp(text, ""))
        g_signal_emit_by_name(G_OBJECT (editable), "activate");

}

и связанные с сигналами "скрыть" и "активировать"

Я хочу автоматически активировать без нажатия клавиши ввода после того, как я набрал "авто" текст в поле ввода. Активировать после того, как последний символ "o" набирается в записи. Теперь я делаю активным сигнал Gtk "edit_done" на виджете. Но, похоже, это не работает, я никогда не вызываю свою функцию обратного вызова.

    g_signal_connect(G_OBJECT(entry), "hide", G_CALLBACK(device_entry_activate_cb), app);
    g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(device_entry_activate_cb), NULL);
    g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(device_entry_auto_activate_cb), NULL);

Я не хочу требовать "вводить", чтобы "активировать", если gtk_entry содержит текст: авто

ОБНОВЛЕНИЕ кода, который я использую.

1 ответ

Решение

Вам необходимо подключиться к сигналу GtkEditable:change, а когда текст в записи автоматический, используйте g_signal_emit_by_name для фальшивой отправки сигнала GtkEntry:activ.

Другие вопросы по тегам