У меня есть шкала gtk с диапазоном, и моя цель - зафиксировать, когда пользователь отпускает щелчок по шкале. (value-changed
вызывается даже тогда, когда ползунок еще меняется, поэтому в моем случае бесполезен).
поэтому я использовал сигнал это.
Обратный вызов сигнала работает правильно, он вызывается при отпускании щелчка мыши, проблема в том, что указатель пользователя является случайным. и меняется при каждом звонке.
Вот мой код:
static gboolean callback(GtkWidget *widget, GdkEventButton event, gpointer data) {
int *n = (int *)data;
printf("Pointer: %p\n", n);
printf("Value: %d\n", *n);
return FALSE;
}
static void activate(GtkApplication *app, gpointer user_data) {
GtkWidget *window;
GtkWidget *button_box;
GtkWidget *slider;
int *n = malloc(sizeof(int));
*n = 1000;
printf("Initialized pointer: %p\n", n);
window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "Window");
gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
button_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
gtk_container_add(GTK_CONTAINER(window), button_box);
gtk_widget_add_events(window, GDK_BUTTON_RELEASE_MASK);
slider = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, 0, 100, 1);
g_signal_connect(slider, "button-release-event", G_CALLBACK(callback), n);
gtk_container_add(GTK_CONTAINER(button_box), slider);
gtk_widget_show_all(window);
}
Результат:
Initialized pointer: 0x5594c31e5de0
Pointer: 0x5594c30a3e40
Value: 7
Pointer: 0x5594c30a3e40
Value: 7
Pointer: 0x5594c30a3da0
Value: 7
Pointer: 0x5594c30a3b20
Value: 7
Pointer: 0x5594c30a3bc0
Value: 7
Pointer: 0x5594c30a3bc0
Value: 7
Pointer: 0x5594c30a3bc0
Value: 7
Pointer: 0x5594c30a3c60
Value: 7
то же самое произойдет, если я заменю n
на NULL
следующим образом:
g_signal_connect(slider, "button-release-event", G_CALLBACK(callback), NULL);
все еще передает случайные указатели, когда это должно было быть (nil)
это не имеет никакого смысла.
Редактировать: единственная функция обмена сообщениями - основная, это весь код:
int main(int argc, char **argv) {
GtkApplication *app;
int status;
app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}
@StianSkjelstad нет, единственная функция обмена сообщениями - это main, и это весь код, я обновил свой вопрос с ее помощью.
Мой главный подозрение в том, что GdkEventButton event
должно было быть GdkEventButton *event
Очень редко вы передаете полные структуры в качестве параметров в C (и в Gtk).
Вау, я занимался этой проблемой около 5 часов. очевидно, в документации gtk отсутствует *
. Я постараюсь сообщить об ошибке или что-то в этом роде. Спасибо.
Вы случайно подключаете «обратный вызов» к другому сигналу где-то еще в своем коде?