admin管理员组文章数量:1401819
I have a sample GTK4 application where a list of entries is arranged vertically in a scrolled window. When I test the application using a mouse by continuously scrolling the window, the app does not crash. However, when I test it on a touch device and click on an entry, a text field cursor appears. This cursor remains visible even while scrolling the window, eventually causing the application to crash with a segmentation fault.
I tried disabling events for the entries using
gtk_widget_set_sensitive(entry, FALSE),
which made the application stable. However, this also disables all interactions with the entries, which is not ideal since I need to enter and retrieve data from them.
Could anyone suggest a way to resolve this issue?
#include <gtk/gtk.h>
GtkWidget *entry[15];
GtkEntryBuffer *buffer[15];
// Focus change handler
static void on_entry_focus_change(GtkWidget *widget, GParamSpec *pspec, gpointer user_data) {
if (gtk_widget_has_focus(widget)) {
g_print("Entry gained focus\n");
} else {
g_print("Entry lost focus\n");
}
}
// Scroll handling
void on_scroll(GtkAdjustment *adjustment) {
double value = gtk_adjustment_get_value(adjustment);
g_print("Scrolled to: %.2f\n", value);
}
// Create multiple entries
static void activate(GtkApplication *app, gpointer user_data) {
GtkWidget *window = gtk_application_window_new(app);
gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
gtk_window_set_default_size(GTK_WINDOW(window), 500, 800);
GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
gtk_window_set_child(GTK_WINDOW(window), box);
GtkWidget *scrolled_window = gtk_scrolled_window_new();
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_EXTERNAL);
gtk_scrolled_window_set_kinetic_scrolling(GTK_SCROLLED_WINDOW(scrolled_window), TRUE);
gtk_widget_set_size_request(scrolled_window, 400, 750);
gtk_widget_set_margin_start(scrolled_window, 40);
gtk_widget_set_margin_end(scrolled_window, 40);
gtk_box_append(GTK_BOX(box), scrolled_window);
GtkAdjustment *vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrolled_window));
GtkAdjustment *hadj = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(scrolled_window));
g_signal_connect(vadj, "value-changed", G_CALLBACK(on_scroll), NULL);
g_signal_connect(hadj, "value-changed", G_CALLBACK(on_scroll), NULL);
GtkWidget *s_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(scrolled_window), s_vbox);
// Create entries
for (int i = 0; i < 15; i++) {
buffer[i] = gtk_entry_buffer_new("Initial Text", -1);
if (buffer[i] == NULL) {
g_print("Failed to create buffer for entry %d\n", i);
continue;
}
entry[i] = gtk_entry_new_with_buffer(buffer[i]);
if (entry[i] == NULL) {
g_print("Failed to create entry %d\n", i);
continue;
}
gtk_widget_set_size_request(entry[i], 396, 60);
gtk_entry_set_input_hints(GTK_ENTRY(entry[i]), GTK_INPUT_HINT_NO_EMOJI);
char *placeholder_text = g_strdup_printf("Entry %d", i + 1);
gtk_entry_set_placeholder_text(GTK_ENTRY(entry[i]), placeholder_text);
g_free(placeholder_text);
// Connect focus change signal
g_signal_connect(entry[i], "notify::has-focus", G_CALLBACK(on_entry_focus_change), NULL);
gtk_box_append(GTK_BOX(s_vbox), entry[i]);
g_print("Created entry %d\n", i);
}
gtk_window_present(GTK_WINDOW(window));
}
int main(int argc, char *argv[]) {
GtkApplication *app = gtk_application_new("com.example.GtkMultipleEntries", G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
int status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}
本文标签:
版权声明:本文标题:gtk - Touch scrolling causes persistent text field cursor and segmentation fault in entry widgets - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744255764a2597474.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论