Мне кажется, вам нужно позвонить gtk_entry_completion_complete после установки текста.
EDIT
К сожалению @Tylter, но ничего себе, это способ сложнее, чем я себе представляла. Единственный способ, которым я могу понять, как это сделать, - фактически отправить событие нажатия клавиши в окно.
gtk_widget_grab_focus(entry);
GdkEvent new_event;
new_event.key.type = GDK_KEY_PRESS;
new_event.key.window = gtk_widget_get_parent_window(entry);
new_event.key.send_event = TRUE;
new_event.key.time = GDK_CURRENT_TIME;
new_event.key.keyval = 0x053; // capital S
new_event.key.state = GDK_KEY_PRESS_MASK;
new_event.key.length = 0;
new_event.key.string = 0;
new_event.key.hardware_keycode = 0;
new_event.key.group = 0;
gdk_event_put((gpointer)&new_event);
EDIT 2
Вы используете GtkDialog для всплывающего окна? Я закодировал это очень быстро и, похоже, работает. Здесь вы будете создавать диалог в случае нажатия кнопки:
static void click_event(GtkWidget *widget,
gpointer data)
{
GtkWidget* window = gtk_dialog_new();
completion = create_completion();
entry = gtk_entry_new();
gtk_entry_set_completion(GTK_ENTRY(entry), completion);
// add entry to dialog
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
entry, TRUE, TRUE, 0);
gtk_widget_show(entry);
gtk_widget_show(window); // you must show the window before sending the keypress event
gtk_widget_grab_focus(entry);
GdkEvent new_event;
new_event.key.type = GDK_KEY_PRESS;
new_event.key.window = gtk_widget_get_parent_window(entry);
new_event.key.send_event = TRUE;
new_event.key.time = GDK_CURRENT_TIME;
new_event.key.keyval = 0x053; // capital S
new_event.key.state = GDK_KEY_PRESS_MASK;
new_event.key.length = 0;
new_event.key.string = 0;
new_event.key.hardware_keycode = 0;
new_event.key.group = 0;
gdk_event_put((gpointer)&new_event);
}
Единственный глюк я видел в том, что ваш должен показать диалоговое окно перед отправкой события нажатия клавиши.
Нет кубиков. Я попробовал gtk_entry_set_text (...); затем gtk_entry_completion_complete (...); и ничего. – Tyler
@ Тайлер, см. Правки. – Mark
Спасибо @Mark, который отлично работает. К сожалению, он все равно не будет работать так, как мне нужно. Я использую GtkEntry во всплывающем окне, и по какой-то причине вышеуказанный код не вызывает его. Если я изменил окно на TopLevel, он работает. Любая идея, почему это так? Полагаю, я мог бы подделывать всплывающее окно с использованием верхнего уровня, но это все еще кажется ошибкой для меня. – Tyler