LINUX.ORG.RU

#include <stdlib.h> 
#include <gtk/gtk.h>

static GdkPixmap *pixmap = NULL;

void draw(GtkWidget *widget, GdkEvent *event, gpointer data){
  if (pixmap) g_object_unref (pixmap);
  pixmap = gdk_pixmap_new (data->window,data->allocation.width,data->allocation.height,-1);
  gdk_draw_rectangle (pixmap,data->style->white_gc,TRUE,0, 0,data->allocation.width,data->allocation.height);
  gtk_widget_queue_draw(data);
  gdk_draw_line(pixmap, data->style->black_gc, 0,0,100,100);
}

gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data){
  return FALSE;
}

void destroy(GtkWidget *widget, GdkEvent *event, gpointer data){
  gtk_main_quit();
}

static gboolean configure_event(GtkWidget *widget, GdkEventConfigure *event){
  if (pixmap) g_object_unref (pixmap);
  pixmap = gdk_pixmap_new (widget->window,widget->allocation.width,widget->allocation.height,-1);

  gdk_draw_rectangle (pixmap,widget->style->white_gc,TRUE,0, 0,widget->allocation.width,widget->allocation.height);
  return TRUE;
}

/* Redraw the screen from the backing pixmap */
static gboolean expose_event(GtkWidget *widget, GdkEventExpose *event){
  gdk_draw_drawable (widget->window,widget->style->fg_gc[GTK_WIDGET_STATE (widget)],pixmap,event->area.x, event->area.y,event->area.x, event->area.y,event->area.width, event->area.height);
  return FALSE;
}

int main(int argc, char *argv[]){
  gtk_set_locale ();
  gtk_init (&argc, &argv);
  GtkWidget *window;
  GtkWidget *vbox;
  GtkWidget *drawingarea;
  GtkWidget *button;

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_object_set_data (GTK_OBJECT (window), "window", window);
  gtk_window_set_title (GTK_WINDOW (window), "gtk_tmp");
  gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);

  vbox = gtk_vbox_new (FALSE, 0);
  gtk_widget_ref (vbox);
  gtk_object_set_data_full (GTK_OBJECT (window), "vbox", vbox,
                            (GtkDestroyNotify) gtk_widget_unref);
  gtk_widget_show (vbox);
  gtk_container_add (GTK_CONTAINER (window), vbox);

  drawingarea = gtk_drawing_area_new ();
  gtk_widget_ref (drawingarea);
  gtk_object_set_data_full (GTK_OBJECT (window), "drawingarea", drawingarea, (GtkDestroyNotify) gtk_widget_unref);
  gtk_widget_set_size_request(drawingarea, 100, 60);
  gtk_widget_show (drawingarea);
  gtk_box_pack_start (GTK_BOX (vbox), drawingarea, TRUE, TRUE, 0);

  button = gtk_button_new_with_label ("Start");
  gtk_widget_ref (button);
  gtk_object_set_data_full (GTK_OBJECT (window), "button", button,
                            (GtkDestroyNotify) gtk_widget_unref);
  gtk_widget_show (button);
  gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);

  gtk_signal_connect(GTK_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL);
  gtk_signal_connect(GTK_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL);
  g_signal_connect (G_OBJECT (drawingarea), "expose_event",G_CALLBACK (expose_event), NULL);
  g_signal_connect (G_OBJECT (drawingarea),"configure_event",G_CALLBACK (configure_event), NULL);
  g_signal_connect (G_OBJECT (button), "activate", G_CALLBACK(draw), drawingarea);

  gtk_widget_show (window);

  gtk_main ();
  return 0;
}

ugoday ★★★★★
() автор топика
Ответ на: комментарий от ugoday

И попытаться его  скомпилировать командой 

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));
пробовал. Не помогает ;(

ugoday ★★★★★
() автор топика
Ответ на: комментарий от ugoday

насколько я помню, gpointer это то же, что и void *
и ошибка тут:
data->window (не приведен к нужному типу)

Chumka ★★★
()
Ответ на: комментарий от ugoday

8я строка, пишы

GtkWidget * da = GTK_WIDGET (data); pixmap = gdk_pixmap_new (da->window,da->allocation.width,da->allocation.height,-1);

и так далее по всем еррорам пройдись. Трабла в том, что юзаеш ненадлежащий тип указателя, надобно привести.

bugmaker ★★★★☆
()
Ответ на: комментарий от bugmaker

Спасибо, эта проблема решена. Но если вместо "модельной" задачи использовать настоящую, то ничего не получается. 

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);

Но ведь в предыдущем случае она работала :(

ugoday ★★★★★
() автор топика
Ответ на: комментарий от ugoday

У тебя тип scroll_callback неправильный


           void        user_function      (GtkAdjustment *adjustment,
                                            gpointer       user_data)       
 
Следовательно должно быть 

void scroll_callback(GtkWidget *widget, gpointer data)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.