二、GTK4核心对象——GdkSurface
1 GdkSurface
-
GdkSurface创建窗口。比如GdkX11Surface中的
gdk_x11_surface_create_window
函数,调用XCreateWindow
来创建窗口。 -
GdkSurface管理窗口属性,
x11_surface_resize ()
函数,调用XResizeWindow()
来修改窗口的大小size -
GdkSurface显示窗口,
gdk_x11_surface_show ()
函数,调用XMapWindow()
来显示窗口。 -
GdkSurface中含有
egl_surface
成员。
1.1 GdkSurface有那些成员
1.1.1 成员GdkGLContext和EGLSurface
gl_paint_context
一般都是通过默认显示里面的glx_contxt,通过 gdk_surface_create_gl_context
创建一个共享的 gl_paint_context。
1.1.2 成员GdkFrameClock
1.2 X11实现GdkSurface
-
GdkX11DragSurface:默认显示GdkX11Display会创建该surface(这个surface也就是一个X窗口),该窗口是在拖拽的时候是使用。
参考: gtk4-demo 中的 Clipboard 示例。拖拽浮动的颜色控件其实就是DragSurface窗口。
-
GdkX11Toplevel:GtkWindow会创建该surface,这就是程序的主窗口(可以创建多个)。
-
GdkX11Popup:右击窗口、菜单弹出窗口、工具窗口、下拉弹出窗口等都是popup类的surface窗口。
1.2.1 GdkX11DragSurface
默认显示 GdkX11Display
中创建了一个 GdkX11DragSurface
。也就是拖拽Widget的时候被拖拽的那个窗口。
1.2.2 GdkX11Toplevel
GtkWindow
中创建了一个 GdkX11Toplevel
。也就是GtkWindow那个窗口。
1.2.3 GdkX11Popup
GtkPopover
、 GtkTextHandle
、 GtkTooltipWindow
都会创建该surface,其实就是那个下拉、菜单或者右击的弹出窗口。
2 GdkSurface程序分析
GdkSurface中的egl_surface,还有其中GdkGLContext的egl_context,是在渲染阶段才会创建