0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Inside Wine; HWND と直接結びついているデータ

Last updated at Posted at 2018-02-27

[目次] (https://qiita.com/Yutaka_Aoki/items/9d38ea98406f4096435b)

Inside Wine; HWND と直接結びついているデータ

HWND と直接結びついているデータ

今分かっているだけで、大きく分けて 2種類ある。

1. typedef struct tagWND WND;
2. struct x11drv_win_data;

1. は、X Window に依存しないデータ。2. は X Window に依存するデータらしい。なお、WND が x11drv_win_data の基底クラス、というわけではなく、(完全に)独立したデータになっているらしい

struct x11drv_win_data

~/wine/dlls/winex11.drv/x11drv.h
/* x11drv private window data */
struct x11drv_win_data {
    Display    *display;        /* display connection for the thread owning the window */
    XVisualInfo vis;            /* X visual used by this window */
    Colormap    colormap;       /* colormap if non-default visual */
    HWND        hwnd;           /* hwnd that this private data belongs to */
    Window      whole_window;   /* X window for the complete window */
    Window      client_window;  /* X window for the client area */
    RECT        window_rect;    /* USER window rectangle relative to parent */
    RECT        whole_rect;     /* X window rectangle for the whole window relative to parent */
    RECT        client_rect;    /* client area relative to parent */
    XIC         xic;            /* X input context */
    BOOL        managed : 1;    /* is window managed? */
    BOOL        mapped : 1;     /* is window mapped? (in either normal or iconic state) */
    BOOL        iconic : 1;     /* is window in iconic state? */
    BOOL        embedded : 1;   /* is window an XEMBED client? */
    BOOL        shaped : 1;     /* is window using a custom region shape? */
    BOOL        layered : 1;    /* is window layered and with valid attributes? */
    BOOL        use_alpha : 1;  /* does window use an alpha channel? */
    int         wm_state;       /* current value of the WM_STATE property */
    DWORD       net_wm_state;   /* bit mask of active x11drv_net_wm_state values */
    Window      embedder;       /* window id of embedder */
    unsigned long configure_serial; /* serial number of last configure request */
    struct window_surface *surface;
    Pixmap         icon_pixmap;
    Pixmap         icon_mask;
    unsigned long *icon_bits;
    unsigned int   icon_size;
};
~/wine/dlls/user32.win.h
typedef struct tagWND
{
    struct user_object obj;       /* object header */
    HWND           parent;        /* Window parent */
    HWND           owner;         /* Window owner */
    struct tagCLASS *class;       /* Window class */
    struct dce    *dce;           /* DCE pointer */
    WNDPROC        winproc;       /* Window procedure */
    DWORD          tid;           /* Owner thread id */
    HINSTANCE      hInstance;     /* Window hInstance (from CreateWindow) */
    RECT           rectClient;    /* Client area rel. to parent client area */
    RECT           rectWindow;    /* Whole window rel. to parent client area */
    RECT           visible_rect;  /* Visible part of the whole rect, rel. to parent client area */
    RECT           normal_rect;   /* Normal window rect saved when maximized/minimized */
    POINT          min_pos;       /* Position for minimized window */
    POINT          max_pos;       /* Position for maximized window */
    HWND           icon_title;    /* Icon title window */
    LPWSTR         text;          /* Window text */
    void          *pScroll;       /* Scroll-bar info */
    DWORD          dwStyle;       /* Window style (from CreateWindow) */
    DWORD          dwExStyle;     /* Extended style (from CreateWindowEx) */
    UINT_PTR       wIDmenu;       /* ID or hmenu (from CreateWindow) */
    DWORD          helpContext;   /* Help context ID */
    UINT           flags;         /* Misc. flags (see below) */
    HMENU          hSysMenu;      /* window's copy of System Menu */
    HICON          hIcon;         /* window's icon */
    HICON          hIconSmall;    /* window's small icon */
    HICON          hIconSmall2;   /* window's secondary small icon, derived from hIcon */
    struct window_surface *surface; /* Window surface if any */
    struct tagDIALOGINFO *dlgInfo;/* Dialog additional info (dialogs only) */
    int            pixel_format;  /* Pixel format set by the graphics driver */
    int            cbWndExtra;    /* class cbWndExtra at window creation */
    DWORD_PTR      userdata;      /* User private data */
    DWORD          wExtra[1];     /* Window extra bytes */
} WND;


#define WND_OTHER_PROCESS ((WND *)1)  /* returned by WIN_GetPtr on unknown window handles */
#define WND_DESKTOP       ((WND *)2)  /* returned by WIN_GetPtr on the desktop window */
~/wine/dlls/user32/user_private.h
enum user_obj_type {
    USER_WINDOW = 1,  /* window */
    USER_MENU,        /* menu */
    USER_ACCEL,       /* accelerator */
    USER_ICON,        /* icon or cursor */
    USER_DWP          /* DeferWindowPos structure */
};

struct user_object {
    HANDLE             handle;
    enum user_obj_type type;
};

HWND から struct x11drv_win_data * の取得法

struct x11drv_win_data *data = get_win_data( hwnd );

HWND から WND * の取得法

WND   *win  = WIN_GetPtr( hwnd );

struct x11drv_win_data *get_win_data( HWND hwnd )

~/wine/dlls/winex11.drv/window.c
// Lock and return the X11 data structure associated with a window.
struct x11drv_win_data *get_win_data( HWND hwnd )
{
	char *data;

	if (!hwnd) return NULL;
	EnterCriticalSection( &win_data_section );
	if (!XFindContext( gdi_display, (XID)hwnd, win_data_context, &data ))
		return (struct x11drv_win_data *)data;
	LeaveCriticalSection( &win_data_section );
	return NULL;
}

WND *WIN_GetPtr( HWND hwnd )

~/wine/dlls/user32/win.c
/***********************************************************************
 *           WIN_GetPtr
 *
 * Return a pointer to the WND structure if local to the process,
 * or WND_OTHER_PROCESS if handle may be valid in other process.
 * If ret value is a valid pointer, it must be released with WIN_ReleasePtr.
 */
WND *WIN_GetPtr( HWND hwnd )
{
	WND *ptr;

	if ((ptr = get_user_handle_ptr( hwnd, USER_WINDOW )) == WND_OTHER_PROCESS)
	{
		if (is_desktop_window( hwnd )) ptr = WND_DESKTOP;
	}
	return ptr;
}

struct x11drv_win_data を作成する関数

struct x11drv_win_data *X11DRV_create_win_data( HWND hwnd, const RECT *window_rect,
                                                const RECT *client_rect )
{
    ・・・
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?