Построение в GTK 3 Fortran в области рисования при нажатии кнопки - PullRequest
0 голосов
/ 13 марта 2020

Как новичок, я за короткое время создал код GTK 3 Fortran Code, близкий к примерам для построения линий в области рисования, запускаемой кнопкой. Построение графика осуществляется через g_signal_connect в функции draw. К сожалению, это работает с моим Кодом только для сигнала "рисовать" из области рисования. Сигнал, «нажатый» от кнопки, приводит к недействительной ссылке на память. Как я могу преодолеть эту проблему? Спасибо за помощь и извините за банальный вопрос. Я нашел разные темы для похожих вопросов, но не нашел решения в Фортране.

! GtkWidget event:
  function draw (widget, my_cairo_context, gdata) result(ret)  bind(c)
    use iso_c_binding, only: c_ptr, c_int
    implicit none
    integer(c_int)     :: ret
    type(c_ptr), value :: widget, my_cairo_context, gdata
    call cairo_set_source_rgb(my_cairo_context, 1d0, 0d0, 0d0)
    call cairo_set_line_width(my_cairo_context, 0.5d0)
    call cairo_move_to(my_cairo_context, 50d0, 5d0)
    call cairo_line_to(my_cairo_context, 150d0, 150d0)
    call cairo_stroke(my_cairo_context)
    ret = FALSE
  end function draw

program gtkFortran
  call gtk_init ()

! Create a window:
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL)
  call gtk_window_set_default_size(window, 500, 500)
  call gtk_window_set_title(window, "Press Start For Plotting"//c_null_char)
  call g_signal_connect (window, "destroy"//c_null_char, c_funloc(destroy))

! Create a grid:
  table = gtk_grid_new ()
  call gtk_grid_set_column_homogeneous(table, TRUE)
  call gtk_grid_set_row_homogeneous(table, TRUE)
  call gtk_widget_set_margin_start (table, 10_c_int)
  call gtk_widget_set_margin_end (table, 10_c_int)
  call gtk_widget_set_margin_top (table, 10_c_int)
  call gtk_widget_set_margin_bottom (table, 10_c_int)  
  call gtk_container_add (window, table)

! Create a drawing-area:
  area = gtk_drawing_area_new()
  call gtk_grid_attach(table, area, 0_c_int, 6_c_int, 3_c_int, 6_c_int)
  call g_signal_connect (area, "draw"//c_null_char, c_funloc(draw))
  call gtk_widget_queue_draw_area (area, 0_c_int, 6_c_int, 3_c_int, 6_c_int)

! Create a button:
  button = gtk_button_new_with_label ("Start"//c_null_char)
  call gtk_grid_attach(table, button, 0_c_int, 0_c_int, 1_c_int, 1_c_int)
  call g_signal_connect (button, "clicked"//c_null_char, c_funloc(draw))

  call gtk_widget_show_all (window)
  call gtk_main ()
end program gtkFortran
...