libadwaita:AdwComboRow 的不稳定行为——我的错还是错误?
libadwaita: erratic behaviour from AdwComboRow -- my fault or bug?
我正在尝试在 libadwaita
中创建一个 AdwComboRow
,但是在我多次更改所选条目后,它会突然选择一个与我单击的条目不同的条目。这通常需要一段时间才能开始发生(大约 20 次更改),但似乎我对所选条目的了解越多,这种情况就越常见。
#include <gtk/gtk.h>
#include <adwaita.h>
GtkApplication *app;
GtkWidget *window;
GtkWidget *listbox;
GtkWidget *combo;
GtkStringList *slist;
const char *entries[] = {
"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten"
};
const size_t n_entries = 10;
void app_startup(void)
{
adw_init();
}
void app_activate(void)
{
window = adw_application_window_new(app);
listbox = gtk_list_box_new();
combo = adw_combo_row_new();
adw_preferences_row_set_title(ADW_PREFERENCES_ROW(combo), "Test");
slist = gtk_string_list_new(NULL);
for (size_t i = 0; i < n_entries; i++)
gtk_string_list_append(slist, entries[i]);
adw_combo_row_set_model(ADW_COMBO_ROW(combo), G_LIST_MODEL(slist));
gtk_list_box_append(GTK_LIST_BOX(listbox), combo);
adw_application_window_set_content(ADW_APPLICATION_WINDOW(window),
listbox);
gtk_widget_show(window);
}
int main(int argc, char **argv)
{
app = gtk_application_new("org.null.null", G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "startup", G_CALLBACK(app_startup), NULL);
g_signal_connect(app, "activate", G_CALLBACK(app_activate), NULL);
g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return 0;
}
此行为可在 Gentoo amd64(gui-libs/gtk-4.6.0
和 gui-libs/libadwaita-1.0.1
,以及 gui-libs/gtk-4.6.1
和 gui-libs/libadwaita-1.0.2
)上重现,同一系统上的 Debian Bookworm chroot( libgtk-4-dev/testing,now 4.6.1+ds-1 amd64
和 libadwaita-1-dev/testing,now 1.1~rc-1 amd64
),以及 PinePhone 上的 Mobian Bookworm(与 chroot 相同的包版本,但 arm64 构建),这让我担心这可能是我的错误而不是 libadwaita 中的错误。我在这里遗漏了什么吗?
进行了更多挖掘,发现我可以使用 gtk_drop_down_new_from_strings
创建的简单 GtkDropDown
重现它;根本不需要 libadwaita!从那里,很快就发现这实际上是 GTK bug #2877。不幸的是,这个错误在这一点上似乎非常陈旧,但至少我知道这毕竟不是我的错。
我正在尝试在 libadwaita
中创建一个 AdwComboRow
,但是在我多次更改所选条目后,它会突然选择一个与我单击的条目不同的条目。这通常需要一段时间才能开始发生(大约 20 次更改),但似乎我对所选条目的了解越多,这种情况就越常见。
#include <gtk/gtk.h>
#include <adwaita.h>
GtkApplication *app;
GtkWidget *window;
GtkWidget *listbox;
GtkWidget *combo;
GtkStringList *slist;
const char *entries[] = {
"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten"
};
const size_t n_entries = 10;
void app_startup(void)
{
adw_init();
}
void app_activate(void)
{
window = adw_application_window_new(app);
listbox = gtk_list_box_new();
combo = adw_combo_row_new();
adw_preferences_row_set_title(ADW_PREFERENCES_ROW(combo), "Test");
slist = gtk_string_list_new(NULL);
for (size_t i = 0; i < n_entries; i++)
gtk_string_list_append(slist, entries[i]);
adw_combo_row_set_model(ADW_COMBO_ROW(combo), G_LIST_MODEL(slist));
gtk_list_box_append(GTK_LIST_BOX(listbox), combo);
adw_application_window_set_content(ADW_APPLICATION_WINDOW(window),
listbox);
gtk_widget_show(window);
}
int main(int argc, char **argv)
{
app = gtk_application_new("org.null.null", G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "startup", G_CALLBACK(app_startup), NULL);
g_signal_connect(app, "activate", G_CALLBACK(app_activate), NULL);
g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return 0;
}
此行为可在 Gentoo amd64(gui-libs/gtk-4.6.0
和 gui-libs/libadwaita-1.0.1
,以及 gui-libs/gtk-4.6.1
和 gui-libs/libadwaita-1.0.2
)上重现,同一系统上的 Debian Bookworm chroot( libgtk-4-dev/testing,now 4.6.1+ds-1 amd64
和 libadwaita-1-dev/testing,now 1.1~rc-1 amd64
),以及 PinePhone 上的 Mobian Bookworm(与 chroot 相同的包版本,但 arm64 构建),这让我担心这可能是我的错误而不是 libadwaita 中的错误。我在这里遗漏了什么吗?
进行了更多挖掘,发现我可以使用 gtk_drop_down_new_from_strings
创建的简单 GtkDropDown
重现它;根本不需要 libadwaita!从那里,很快就发现这实际上是 GTK bug #2877。不幸的是,这个错误在这一点上似乎非常陈旧,但至少我知道这毕竟不是我的错。