wineserver 主要实现了以下功能:
- 消息路由
- 处理注册表
- 调试接口
- 同步原语
- 窗口管理
- 线程跟踪
- 区域操纵
应用在创建/销毁/设置/获取窗口时,均需要与server 进行通信,调用其提供的窗口管理函数。
其使用自定义协议,协议内容参考 protocol.def 文件,跟窗体管理等相关的接口如下:
/server/request.h
DECL_HANDLER(create_window);
DECL_HANDLER(destroy_window);
DECL_HANDLER(get_desktop_window);
DECL_HANDLER(set_window_owner);
DECL_HANDLER(get_window_info);
DECL_HANDLER(set_window_info);
DECL_HANDLER(set_parent);
DECL_HANDLER(get_window_parents);
DECL_HANDLER(get_window_children);
DECL_HANDLER(get_window_children_from_point);
DECL_HANDLER(get_window_tree);
DECL_HANDLER(set_window_pos);
DECL_HANDLER(get_window_rectangles);
DECL_HANDLER(get_window_text);
DECL_HANDLER(set_window_text);
DECL_HANDLER(get_windows_offset);
DECL_HANDLER(get_visible_region);
DECL_HANDLER(get_surface_region);
DECL_HANDLER(get_window_region);
DECL_HANDLER(set_window_region);
DECL_HANDLER(get_update_region);
DECL_HANDLER(update_window_zorder);
DECL_HANDLER(redraw_window);
DECL_HANDLER(set_window_property);
DECL_HANDLER(remove_window_property);
DECL_HANDLER(get_window_property);
DECL_HANDLER(get_window_properties);
其实际由server/window.c 去处理。
以创建窗口为例,查看完整的调用流程如下。
窗口创建时调用
1、CreateWindowEx
2、调用create_window (user32.dll win.c)
user32.dll 在初始化时,将create_window 函数定向到WIN_CreateWindowEx;
3、调用 WIN_CreateWindowEx (user32.dll win.c)
4、跳转到 NtUserCreateWindowEx (win32u.so windows.c)
其会与wineserver 通信,调用如下函数
create_window
set_window_pos
set_window_info
set_window_text
代码执行靠后有一句
if (!user_driver->pCreateWindow( hwnd )) goto failed;
查看路径,user_driver 在初始化时会定向到X11DRV_CreateWindow(winex11drv.so 中) 函数,最终会调用到xlib 的 XCreateWindow;