Как передать cairo_surface_t в качестве параметра в g_signal_connect? - PullRequest
0 голосов
/ 13 октября 2019

Я намереваюсь создать универсальную функцию обратного вызова для всех configure-event и g_signal_connect. Выглядит это так:

int
generic_configure_event(
    GtkWidget *widget,
    GdkEventConfigure *event,
    void *gData)
{
    cairo_surface_t *surface = static_cast<cairo_surface_t *>(gData);
    ...
    if (*surface)
        cairo_surface_destroy(*surface);

    *surface  = gdk_window_create_similar_surface(
        gtk_widget_get_window(widget), CAIRO_CONTENT_COLOR,
        save_w, save_h);

    cairo_t *cr = cairo_create(*surface);

    return TRUE;
}

int
main(){
    g_signal_connect(widget1,"configure-event",G_CALLBACK(generic_configure_event),&surface1);
    g_signal_connect(widget2,"configure-event",G_CALLBACK(generic_configure_event),&surface2);
    g_signal_connect(widget3,"configure-event",G_CALLBACK(generic_configure_event),&surface3);
    ...
}

Более сложным является то, что кроме передачи cairo_surface_t в качестве аргумента, мы также получили возможность обновить эту конкретную поверхность в generic_configure_event. Использование вышеизложенного дает мне ошибку, какой правильный способ это сделать?

...