Здесь уже часто задавались вопросы об ошибках incomplete type, но все предложенные там решения не помогают в моем случае. Добавление прямого объявления не имеет смысла, поскольку GdkSurface уже объявлен в заголовках Gdk. Включение соответствующих заголовков уже сделано. После ошибки, создающей код, часть + включает.

#include <gdkmm/display.h>
#include <gdkmm/surface.h>

extern "C" {
#include <gdk/x11/gdkx.h>
#include <gdk/gdk.h>
}

extern "C" {
    void surface_move(Gdk::Surface* psurface, int x, int y) {
        #ifdef GDK_WINDOWING_X11
        GdkSurface* surface = psurface->gobj();
        GdkSurface *impl = GDK_X11_SURFACE(surface);
        XMoveWindow(GDK_SURFACE_XDISPLAY (surface), GDK_SURFACE_XID (surface), x * impl->surface_scale, y * impl->surface_scale);
        #endif
    }
}

Вот полные ошибки:

src/utils.cpp: In function ‘void Gdk::surface_move(Gdk::Surface*, int, int)’:
src/utils.cpp:9:83: error: invalid use of incomplete type ‘GdkSurface {aka struct _GdkSurface}’
 (GDK_SURFACE_XDISPLAY (surface), GDK_SURFACE_XID (surface), x * impl->surface_scale, y * impl->surface_scale);
                                                                     ^~
In file included from /home/user/.local/built/include/gtk-4.0/gdk/gdkapplaunchcontext.h:29:0,
                 from /home/user/.local/built/include/gtk-4.0/gdk/gdk.h:30,
                 from /home/user/.local/built/include/gtkmm-4.0/gdkmm/enums.h:29,
                 from /home/user/.local/built/include/gtkmm-4.0/gdkmm/event.h:29,
                 from /home/user/.local/built/include/gtkmm-4.0/gdkmm/display.h:30,
                 from ./include/libgdp/utils.hpp:3,
                 from src/utils.cpp:1:
/home/user/.local/built/include/gtk-4.0/gdk/gdktypes.h:97:16: note: forward declaration of ‘GdkSurface {aka struct _GdkSurface}’
 typedef struct _GdkSurface             GdkSurface;
                ^~~~~~~~~~~
src/utils.cpp:9:108: error: invalid use of incomplete type ‘GdkSurface {aka struct _GdkSurface}’
 rface), GDK_SURFACE_XID (surface), x * impl->surface_scale, y * impl->surface_scale);
                                                                     ^~
In file included from /home/user/.local/built/include/gtk-4.0/gdk/gdkapplaunchcontext.h:29:0,
                 from /home/user/.local/built/include/gtk-4.0/gdk/gdk.h:30,
                 from /home/user/.local/built/include/gtkmm-4.0/gdkmm/enums.h:29,
                 from /home/user/.local/built/include/gtkmm-4.0/gdkmm/event.h:29,
                 from /home/user/.local/built/include/gtkmm-4.0/gdkmm/display.h:30,
                 from ./include/libgdp/utils.hpp:3,
                 from src/utils.cpp:1:
/home/user/.local/built/include/gtk-4.0/gdk/gdktypes.h:97:16: note: forward declaration of ‘GdkSurface {aka struct _GdkSurface}’
 typedef struct _GdkSurface             GdkSurface;
                ^~~~~~~~~~~

Я построил Gdk, Gtk, Gdkmm и Gtkmm с помощью JHbuild.

1
Programmer 22 Фев 2021 в 00:44

1 ответ

Лучший ответ

Кажется, что этот тип является частным для GDK по замыслу (предоставляется только предварительное объявление). Из документации GDK4:

GdkSurface struct содержит только частные поля и не должен получить доступ напрямую.

Заголовок, в котором он определено (которое не распространяется). Вот почему вы получаете эти ошибки, все, что у вас есть, - это предварительное объявление для передачи указателей и ссылок. Любой доступ к элементам данных запрещен.

Чтобы решить эту проблему, вы должны использовать функции, которые работают на поверхностях (которые являются общедоступными), например gdk_surface_get_scale_factor или что-то подобное вместо попытки прямого доступа к элементам данных.

1
BobMorane 22 Фев 2021 в 02:56