0%

【Linux技术分享】将x11窗口创建与window句柄关联

将x11窗口创建与window句柄关联

问题概述

wine下窗口创建是通过window下的createwindow创建->调用x11的xcreatewindow流程,在linux下有很多观察窗口的工具,如何将x11下的window id与wine下窗口进行关联?

步骤

  1. wine启动一个notepad窗口,通过xwininfo获取到窗口的id
    图1
  2. 学习wine源码发现wine中窗口创建是在winex11.drv模块下,准确来说是在该模块的window.c函数中
1
2
3
4
5
6
7
8
9
10
11
12
13
if (!(cx = data->whole_rect.right - data->whole_rect.left)) cx = 1;
else if (cx > 65535) cx = 65535;
if (!(cy = data->whole_rect.bottom - data->whole_rect.top)) cy = 1;
else if (cy > 65535) cy = 65535;

pos = virtual_screen_to_root( data->whole_rect.left, data->whole_rect.top );
data->whole_window = XCreateWindow( data->display, root_window, pos.x, pos.y,
cx, cy, 0, data->vis.depth, InputOutput,
data->vis.visual, mask, &attr );
if (!data->whole_window) goto done;

set_initial_wm_hints( data->display, data->whole_window );
set_wm_hints( data );
  1. XCreateWindow窗口创建返回data->whole_window的值为窗口创建后的窗口id,通过第一步会发现与该值一致。

  2. 通过源码学习该函数下面使用XSaveContext( data->display, data->whole_window, winContext, (char *)data->hwnd );函数,将窗口x11创建的id与window下的hwnd进行关联

  3. 通过打印WIN_CreateWindowEx函数创建的句柄,发现就是该窗口