Задача: нарисовать линию в виджете drawingarea по щелчку на кнопке. Для этого надо передать виджет в обработчик сигнала для кнопки. Как это сделать? Если использовать код
И попытаться его скомпилировать командой
gcc -Wall -g gtk_tmp.c -o gtk_tmp `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`
то получатся сообщения об ошибке
gtk_tmp.c: In function `draw':
gtk_tmp.c:8: warning: dereferencing `void *' pointer
gtk_tmp.c:8: error: request for member `window' in something not a structure or union
gtk_tmp.c:8: warning: dereferencing `void *' pointer
gtk_tmp.c:8: error: request for member `allocation' in something not a structure or union
gtk_tmp.c:8: warning: dereferencing `void *' pointer
gtk_tmp.c:8: error: request for member `allocation' in something not a structure or union
gtk_tmp.c:9: warning: dereferencing `void *' pointer
gtk_tmp.c:9: error: request for member `style' in something not a structure or union
gtk_tmp.c:9: warning: dereferencing `void *' pointer
gtk_tmp.c:9: error: request for member `allocation' in something not a structure or union
gtk_tmp.c:9: warning: dereferencing `void *' pointer
gtk_tmp.c:9: error: request for member `allocation' in something not a structure or union
gtk_tmp.c:11: warning: dereferencing `void *' pointer
gtk_tmp.c:11: error: request for member `style' in something not a structure or union
строчку
g_signal_connect (G_OBJECT (button), "activate", G_CALLBACK(draw), GTK_DRAWING_AREA (drawingarea));
пробовал. Не помогает ;(
Спасибо, эта проблема решена. Но если вместо "модельной" задачи использовать настоящую, то ничего не получается.
void draw_points(GtkWidget *widget);
void scroll_callback(GtkWidget *widget, GdkEvent *event, gpointer data){
printf("scroll_callback\n");
GtkWidget *da = GTK_WIDGET (data);
printf("1\n");
double value = gtk_adjustment_get_value(widget);
GtkAdjustment *adjustment = widget;
double upper = adjustment->upper;
scroll = value / upper;
printf("value=%f, upper=%f, scroll=%f\n", value, upper, scroll);
draw_points(da);
}
g_signal_connect(G_OBJECT(adjustment), "value_changed", G_CALLBACK (scroll_callback), drawingarea2);
если пошевелить scrollbar, то приложение выводит scroll_callback и
сегфолтится. Тоесть скорее всего проблема в строке
GtkWidget *da = GTK_WIDGET (data);
Но ведь в предыдущем случае она работала :(
У тебя тип scroll_callback неправильный
void user_function (GtkAdjustment *adjustment,
gpointer user_data)
Следовательно должно быть
void scroll_callback(GtkWidget *widget, gpointer data)