Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
d56ccaa7
Commit
d56ccaa7
authored
Jan 28, 2005
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use an X context to associated the x11drv private window data to a
window handle instead of accessing the WND structure directly.
parent
6db71654
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
49 additions
and
53 deletions
+49
-53
desktop.c
dlls/x11drv/desktop.c
+1
-1
event.c
dlls/x11drv/event.c
+0
-3
window.c
dlls/x11drv/window.c
+30
-42
winpos.c
dlls/x11drv/winpos.c
+15
-5
x11drv.h
dlls/x11drv/x11drv.h
+3
-1
win.h
include/win.h
+0
-1
No files found.
dlls/x11drv/desktop.c
View file @
d56ccaa7
...
...
@@ -76,11 +76,11 @@ static DWORD CALLBACK desktop_thread( LPVOID driver_data )
/* patch the desktop window queue to point to our queue */
win
=
WIN_GetPtr
(
hwnd
);
win
->
tid
=
GetCurrentThreadId
();
X11DRV_register_window
(
display
,
hwnd
,
win
->
pDriverData
);
WIN_ReleasePtr
(
win
);
SetWindowLongPtrW
(
hwnd
,
GWLP_WNDPROC
,
(
LONG_PTR
)
desktop_winproc
);
wine_tsx11_lock
();
XSaveContext
(
display
,
root_window
,
winContext
,
(
char
*
)
hwnd
);
XChangeProperty
(
display
,
root_window
,
x11drv_atom
(
WM_PROTOCOLS
),
XA_ATOM
,
32
,
PropModeReplace
,
(
char
*
)
&
atom
,
1
);
XMapWindow
(
display
,
root_window
);
...
...
dlls/x11drv/event.c
View file @
d56ccaa7
...
...
@@ -50,9 +50,6 @@
WINE_DEFAULT_DEBUG_CHANNEL
(
event
);
WINE_DECLARE_DEBUG_CHANNEL
(
clipboard
);
/* X context to associate a hwnd to an X window */
extern
XContext
winContext
;
extern
BOOL
ximInComposeMode
;
#define DndNotDnd -1
/* OffiX drag&drop */
...
...
dlls/x11drv/window.c
View file @
d56ccaa7
...
...
@@ -50,6 +50,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(x11drv);
/* X context to associate a hwnd to an X window */
XContext
winContext
=
0
;
/* X context to associate a struct x11drv_win_data to an hwnd */
static
XContext
win_data_context
;
Atom
X11DRV_Atoms
[
NB_XATOMS
-
FIRST_XATOM
];
static
const
char
*
const
atom_names
[
NB_XATOMS
-
FIRST_XATOM
]
=
...
...
@@ -743,20 +746,6 @@ int X11DRV_sync_client_window_position( Display *display, struct x11drv_win_data
}
/***********************************************************************
* X11DRV_register_window
*
* Associate an X window to a HWND.
*/
void
X11DRV_register_window
(
Display
*
display
,
HWND
hwnd
,
struct
x11drv_win_data
*
data
)
{
wine_tsx11_lock
();
XSaveContext
(
display
,
data
->
whole_window
,
winContext
,
(
char
*
)
hwnd
);
XSaveContext
(
display
,
data
->
client_window
,
winContext
,
(
char
*
)
hwnd
);
wine_tsx11_unlock
();
}
/**********************************************************************
* create_desktop
*/
...
...
@@ -828,6 +817,7 @@ static Window create_whole_window( Display *display, struct x11drv_win_data *dat
wine_tsx11_unlock
();
return
0
;
}
XSaveContext
(
display
,
data
->
whole_window
,
winContext
,
(
char
*
)
data
->
hwnd
);
/* non-maximized child must be at bottom of Z order */
if
((
style
&
(
WS_CHILD
|
WS_MAXIMIZE
))
==
WS_CHILD
)
...
...
@@ -878,6 +868,7 @@ static Window create_client_window( Display *display, struct x11drv_win_data *da
0
,
screen_depth
,
InputOutput
,
visual
,
CWEventMask
|
CWBitGravity
|
CWBackingStore
,
&
attr
);
XSaveContext
(
display
,
data
->
client_window
,
winContext
,
(
char
*
)
data
->
hwnd
);
if
(
data
->
client_window
&&
is_mapped
)
XMapWindow
(
display
,
data
->
client_window
);
wine_tsx11_unlock
();
return
data
->
client_window
;
...
...
@@ -947,9 +938,9 @@ BOOL X11DRV_DestroyWindow( HWND hwnd )
struct
x11drv_thread_data
*
thread_data
=
x11drv_thread_data
();
Display
*
display
=
thread_data
->
display
;
WND
*
wndPtr
=
WIN_GetPtr
(
hwnd
);
struct
x11drv_win_data
*
data
=
wndPtr
->
pDriverData
;
struct
x11drv_win_data
*
data
;
if
(
!
data
)
goto
done
;
if
(
!
(
data
=
X11DRV_get_win_data
(
hwnd
))
)
goto
done
;
if
(
data
->
whole_window
)
{
...
...
@@ -972,8 +963,11 @@ BOOL X11DRV_DestroyWindow( HWND hwnd )
if
(
data
->
hWMIconBitmap
)
DeleteObject
(
data
->
hWMIconBitmap
);
if
(
data
->
hWMIconMask
)
DeleteObject
(
data
->
hWMIconMask
);
wine_tsx11_lock
();
XDeleteContext
(
gdi_display
,
(
XID
)
hwnd
,
win_data_context
);
wine_tsx11_unlock
();
HeapFree
(
GetProcessHeap
(),
0
,
data
);
wndPtr
->
pDriverData
=
NULL
;
done:
WIN_ReleasePtr
(
wndPtr
);
return
TRUE
;
...
...
@@ -988,7 +982,7 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode )
Display
*
display
=
thread_display
();
WND
*
wndPtr
;
struct
x11drv_win_data
*
data
;
HWND
insert_after
;
HWND
parent
,
insert_after
;
RECT
rect
;
DWORD
style
;
CBT_CREATEWNDA
cbtc
;
...
...
@@ -1024,20 +1018,22 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode )
data
->
hWMIconBitmap
=
0
;
data
->
hWMIconMask
=
0
;
wndPtr
=
WIN_GetPtr
(
hwnd
);
wndPtr
->
pDriverData
=
data
;
/* use gdi_display so that it's available from all threads (FIXME) */
wine_tsx11_lock
();
if
(
!
win_data_context
)
win_data_context
=
XUniqueContext
();
XSaveContext
(
gdi_display
,
(
XID
)
hwnd
,
win_data_context
,
(
char
*
)
data
);
wine_tsx11_unlock
();
/* initialize the dimensions before sending WM_GETMINMAXINFO */
SetRect
(
&
rect
,
cs
->
x
,
cs
->
y
,
cs
->
x
+
cs
->
cx
,
cs
->
y
+
cs
->
cy
);
X11DRV_set_window_pos
(
hwnd
,
0
,
&
rect
,
&
rect
,
SWP_NOZORDER
,
0
);
if
(
!
wndPtr
->
parent
)
parent
=
GetAncestor
(
hwnd
,
GA_PARENT
);
if
(
!
parent
)
{
create_desktop
(
display
,
data
);
WIN_ReleasePtr
(
wndPtr
);
return
TRUE
;
}
WIN_ReleasePtr
(
wndPtr
);
if
(
!
create_whole_window
(
display
,
data
,
cs
->
style
))
goto
failed
;
if
(
!
create_client_window
(
display
,
data
))
goto
failed
;
...
...
@@ -1103,7 +1099,6 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode )
insert_after
=
((
wndPtr
->
dwStyle
&
(
WS_CHILD
|
WS_MAXIMIZE
))
==
WS_CHILD
)
?
HWND_BOTTOM
:
HWND_TOP
;
X11DRV_set_window_pos
(
hwnd
,
insert_after
,
&
wndPtr
->
rectWindow
,
&
rect
,
0
,
0
);
X11DRV_register_window
(
display
,
hwnd
,
data
);
TRACE
(
"win %p window %ld,%ld,%ld,%ld client %ld,%ld,%ld,%ld whole %ld,%ld,%ld,%ld X client %ld,%ld,%ld,%ld xwin %x/%x
\n
"
,
hwnd
,
wndPtr
->
rectWindow
.
left
,
wndPtr
->
rectWindow
.
top
,
...
...
@@ -1179,15 +1174,9 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode )
*/
struct
x11drv_win_data
*
X11DRV_get_win_data
(
HWND
hwnd
)
{
struct
x11drv_win_data
*
ret
=
NULL
;
WND
*
win
=
WIN_GetPtr
(
hwnd
);
if
(
win
&&
win
!=
WND_OTHER_PROCESS
)
{
ret
=
win
->
pDriverData
;
WIN_ReleasePtr
(
win
);
}
return
ret
;
char
*
data
;
if
(
XFindContext
(
gdi_display
,
(
XID
)
hwnd
,
win_data_context
,
&
data
))
data
=
NULL
;
return
(
struct
x11drv_win_data
*
)
data
;
}
...
...
@@ -1239,27 +1228,27 @@ XIC X11DRV_get_ic( HWND hwnd )
HWND
X11DRV_SetParent
(
HWND
hwnd
,
HWND
parent
)
{
Display
*
display
=
thread_display
();
WND
*
wndPtr
;
HWND
retvalue
;
HWND
old_parent
;
/* Windows hides the window first, then shows it again
* including the WM_SHOWWINDOW messages and all */
BOOL
was_visible
=
ShowWindow
(
hwnd
,
SW_HIDE
);
if
(
!
IsWindow
(
parent
))
return
0
;
if
(
!
(
wndPtr
=
WIN_GetPtr
(
hwnd
))
||
wndPtr
==
WND_OTHER_PROCESS
)
return
0
;
retvalue
=
wndPtr
->
parent
;
/* old parent */
if
(
parent
!=
retvalue
)
old_parent
=
GetAncestor
(
hwnd
,
GA_PARENT
);
if
(
parent
!=
old_parent
)
{
struct
x11drv_win_data
*
data
=
wndPtr
->
pDriverData
;
struct
x11drv_win_data
*
data
;
Window
new_parent
=
X11DRV_get_client_window
(
parent
);
if
(
!
(
data
=
X11DRV_get_win_data
(
hwnd
)))
return
0
;
WIN_LinkWindow
(
hwnd
,
parent
,
HWND_TOP
);
if
(
parent
!=
GetDesktopWindow
())
/* a child window */
{
if
(
!
(
wndPtr
->
dwStyle
&
WS_CHILD
))
if
(
!
(
GetWindowLongW
(
hwnd
,
GWL_STYLE
)
&
WS_CHILD
))
{
HMENU
menu
=
(
HMENU
)
SetWindowLongPtrW
(
hwnd
,
GWLP_ID
,
0
);
if
(
menu
)
DestroyMenu
(
menu
);
...
...
@@ -1273,7 +1262,6 @@ HWND X11DRV_SetParent( HWND hwnd, HWND parent )
data
->
whole_rect
.
left
,
data
->
whole_rect
.
top
);
wine_tsx11_unlock
();
}
WIN_ReleasePtr
(
wndPtr
);
/* SetParent additionally needs to make hwnd the topmost window
in the x-order and send the expected WM_WINDOWPOSCHANGING and
...
...
@@ -1284,7 +1272,7 @@ HWND X11DRV_SetParent( HWND hwnd, HWND parent )
/* FIXME: a WM_MOVE is also generated (in the DefWindowProc handler
* for WM_WINDOWPOSCHANGED) in Windows, should probably remove SWP_NOMOVE */
return
retvalue
;
return
old_parent
;
}
...
...
dlls/x11drv/winpos.c
View file @
d56ccaa7
...
...
@@ -240,7 +240,6 @@ BOOL X11DRV_GetDC( HWND hwnd, HDC hdc, HRGN hrgn, DWORD flags )
{
HWND
top
=
get_top_clipping_window
(
hwnd
);
WND
*
win
=
WIN_GetPtr
(
hwnd
);
struct
x11drv_win_data
*
data
=
win
->
pDriverData
;
struct
x11drv_escape_set_drawable
escape
;
escape
.
mode
=
IncludeInferiors
;
...
...
@@ -282,6 +281,14 @@ BOOL X11DRV_GetDC( HWND hwnd, HDC hdc, HRGN hrgn, DWORD flags )
}
else
{
struct
x11drv_win_data
*
data
;
if
(
!
(
data
=
X11DRV_get_win_data
(
hwnd
)))
{
WIN_ReleasePtr
(
win
);
return
FALSE
;
}
if
(
IsIconic
(
hwnd
))
{
escape
.
drawable
=
data
->
icon_window
?
data
->
icon_window
:
data
->
whole_window
;
...
...
@@ -683,12 +690,14 @@ void X11DRV_SetWindowStyle( HWND hwnd, DWORD old_style )
BOOL
X11DRV_set_window_pos
(
HWND
hwnd
,
HWND
insert_after
,
const
RECT
*
rectWindow
,
const
RECT
*
rectClient
,
UINT
swp_flags
,
UINT
wvr_flags
)
{
struct
x11drv_win_data
*
data
;
HWND
top
=
get_top_clipping_window
(
hwnd
);
WND
*
win
=
WIN_GetPtr
(
hwnd
)
;
WND
*
win
;
DWORD
old_style
,
new_style
;
BOOL
ret
;
if
(
!
win
)
return
FALSE
;
if
(
!
(
data
=
X11DRV_get_win_data
(
hwnd
)))
return
FALSE
;
if
(
!
(
win
=
WIN_GetPtr
(
hwnd
)))
return
FALSE
;
if
(
win
==
WND_OTHER_PROCESS
)
{
if
(
IsWindow
(
hwnd
))
ERR
(
"cannot set rectangles of other process window %p
\n
"
,
hwnd
);
...
...
@@ -717,7 +726,6 @@ BOOL X11DRV_set_window_pos( HWND hwnd, HWND insert_after, const RECT *rectWindow
if
(
ret
)
{
struct
x11drv_win_data
*
data
=
win
->
pDriverData
;
Display
*
display
=
thread_display
();
/* invalidate DCEs */
...
...
@@ -1188,16 +1196,18 @@ END:
*/
void
X11DRV_MapNotify
(
HWND
hwnd
,
XMapEvent
*
event
)
{
struct
x11drv_win_data
*
data
;
HWND
hwndFocus
=
GetFocus
();
WND
*
win
;
if
(
!
(
data
=
X11DRV_get_win_data
(
hwnd
)))
return
;
if
(
!
(
win
=
WIN_GetPtr
(
hwnd
)))
return
;
if
((
win
->
dwStyle
&
WS_VISIBLE
)
&&
(
win
->
dwStyle
&
WS_MINIMIZE
)
&&
(
win
->
dwExStyle
&
WS_EX_MANAGED
))
{
struct
x11drv_win_data
*
data
=
win
->
pDriverData
;
int
x
,
y
;
unsigned
int
width
,
height
,
border
,
depth
;
Window
root
,
top
;
...
...
dlls/x11drv/x11drv.h
View file @
d56ccaa7
...
...
@@ -553,6 +553,9 @@ inline static BOOL is_window_top_level( HWND hwnd )
GetAncestor
(
hwnd
,
GA_PARENT
)
==
GetDesktopWindow
());
}
/* X context to associate a hwnd to an X window */
extern
XContext
winContext
;
extern
void
X11DRV_SetFocus
(
HWND
hwnd
);
extern
Cursor
X11DRV_GetCursor
(
Display
*
display
,
struct
tagCURSORICONINFO
*
ptr
);
...
...
@@ -560,7 +563,6 @@ typedef int (*x11drv_error_callback)( Display *display, XErrorEvent *event, void
extern
void
X11DRV_expect_error
(
Display
*
display
,
x11drv_error_callback
callback
,
void
*
arg
);
extern
int
X11DRV_check_error
(
void
);
extern
void
X11DRV_register_window
(
Display
*
display
,
HWND
hwnd
,
struct
x11drv_win_data
*
data
);
extern
void
X11DRV_set_iconic_state
(
HWND
hwnd
);
extern
void
X11DRV_window_to_X_rect
(
HWND
hwnd
,
RECT
*
rect
);
extern
void
X11DRV_X_to_window_rect
(
HWND
hwnd
,
RECT
*
rect
);
...
...
include/win.h
View file @
d56ccaa7
...
...
@@ -62,7 +62,6 @@ typedef struct tagWND
int
cbWndExtra
;
/* class cbWndExtra at window creation */
int
irefCount
;
/* window's reference count*/
DWORD
userdata
;
/* User private data */
void
*
pDriverData
;
/* Window driver data */
DWORD
wExtra
[
1
];
/* Window extra bytes */
}
WND
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment