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.