Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
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-cw
Commits
37a4639e
Commit
37a4639e
authored
Sep 12, 2001
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Make sure that functions returning an HWND always return a full 32-bit
handle.
parent
ef58632a
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
108 additions
and
71 deletions
+108
-71
message.c
dlls/user/message.c
+2
-2
win.h
include/win.h
+12
-1
clipboard.c
windows/clipboard.c
+8
-11
dce.c
windows/dce.c
+17
-21
dialog.c
windows/dialog.c
+5
-0
focus.c
windows/focus.c
+1
-0
input.c
windows/input.c
+1
-1
win.c
windows/win.c
+57
-33
winpos.c
windows/winpos.c
+5
-2
No files found.
dlls/user/message.c
View file @
37a4639e
...
...
@@ -1091,7 +1091,7 @@ static LRESULT call_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpar
cwp
.
lParam
=
lparam
;
cwp
.
wParam
=
wparam
;
cwp
.
message
=
msg
;
cwp
.
hwnd
=
hwnd
;
cwp
.
hwnd
=
WIN_GetFullHandle
(
hwnd
)
;
if
(
unicode
)
HOOK_CallHooksW
(
WH_CALLWNDPROC
,
HC_ACTION
,
1
,
(
LPARAM
)
&
cwp
);
else
HOOK_CallHooksA
(
WH_CALLWNDPROC
,
HC_ACTION
,
1
,
(
LPARAM
)
&
cwp
);
lparam
=
cwp
.
lParam
;
...
...
@@ -1120,7 +1120,7 @@ static LRESULT call_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpar
cwp
.
lParam
=
lparam
;
cwp
.
wParam
=
wparam
;
cwp
.
message
=
msg
;
cwp
.
hwnd
=
hwnd
;
cwp
.
hwnd
=
WIN_GetFullHandle
(
hwnd
)
;
if
(
unicode
)
HOOK_CallHooksW
(
WH_CALLWNDPROCRET
,
HC_ACTION
,
1
,
(
LPARAM
)
&
cwp
);
else
HOOK_CallHooksA
(
WH_CALLWNDPROCRET
,
HC_ACTION
,
1
,
(
LPARAM
)
&
cwp
);
}
...
...
include/win.h
View file @
37a4639e
...
...
@@ -85,7 +85,7 @@ extern WND* WIN_FindWndPtr( HWND hwnd );
extern
WND
*
WIN_LockWndPtr
(
WND
*
wndPtr
);
extern
void
WIN_ReleaseWndPtr
(
WND
*
wndPtr
);
extern
void
WIN_UpdateWndPtr
(
WND
**
oldPtr
,
WND
*
newPtr
);
extern
HWND
WIN_
GetFullHandle
(
HWND
hwnd
);
extern
HWND
WIN_
Handle32
(
HWND16
hwnd16
);
extern
void
WIN_LinkWindow
(
HWND
hwnd
,
HWND
parent
,
HWND
hwndInsertAfter
);
extern
void
WIN_UnlinkWindow
(
HWND
hwnd
);
extern
HWND
WIN_FindWinToRepaint
(
HWND
hwnd
);
...
...
@@ -96,6 +96,17 @@ extern HWND *WIN_ListParents( HWND hwnd );
extern
HWND
*
WIN_ListChildren
(
HWND
hwnd
);
extern
BOOL
WIN_InternalShowOwnedPopups
(
HWND
owner
,
BOOL
fShow
,
BOOL
unmanagedOnly
);
inline
static
HWND
WIN_GetFullHandle
(
HWND
hwnd
)
{
if
(
!
HIWORD
(
hwnd
)
&&
hwnd
)
hwnd
=
WIN_Handle32
(
LOWORD
(
hwnd
)
);
return
hwnd
;
}
inline
static
HWND16
WIN_Handle16
(
HWND
hwnd
)
{
return
LOWORD
(
hwnd
);
}
extern
HWND
CARET_GetHwnd
(
void
);
extern
void
CARET_GetRect
(
LPRECT
lprc
);
/* windows/caret.c */
...
...
windows/clipboard.c
View file @
37a4639e
...
...
@@ -12,9 +12,6 @@
* The internal implementation talks to a "clipboard driver" to fill or
* expose the cache to the native device. (Currently only the X11 and
* TTY clipboard driver are available)
*
* TODO:
*
*/
#include <stdlib.h>
...
...
@@ -31,6 +28,7 @@
#include "wine/winbase16.h"
#include "heap.h"
#include "user.h"
#include "win.h"
#include "clipboard.h"
#include "debugtools.h"
...
...
@@ -45,10 +43,10 @@ DEFAULT_DEBUG_CHANNEL(clipboard);
static
HANDLE
hClipLock
=
0
;
static
BOOL
bCBHasChanged
=
FALSE
;
HWND
hWndClipWindow
=
0
;
/* window that last opened clipboard */
HWND
hWndClipOwner
=
0
;
/* current clipboard owner */
HANDLE16
hTaskClipOwner
=
0
;
/* clipboard owner's task */
static
HWND
hWndViewer
=
0
;
/* start of viewers chain */
static
HWND
hWndClipWindow
;
/* window that last opened clipboard */
static
HWND
hWndClipOwner
;
/* current clipboard owner */
static
HANDLE16
hTaskClipOwner
;
/* clipboard owner's task */
static
HWND
hWndViewer
;
/* start of viewers chain */
static
WORD
LastRegFormat
=
CF_REGFORMATBASE
;
...
...
@@ -737,7 +735,7 @@ BOOL WINAPI OpenClipboard( HWND hWnd )
hClipLock
=
GetCurrentTask
();
/* Save current user of the clipboard */
hWndClipWindow
=
hWnd
;
hWndClipWindow
=
WIN_GetFullHandle
(
hWnd
)
;
bCBHasChanged
=
FALSE
;
bRet
=
TRUE
;
}
...
...
@@ -1320,7 +1318,7 @@ HWND WINAPI SetClipboardViewer( HWND hWnd )
TRACE
(
"(%04x): returning %04x
\n
"
,
hWnd
,
hwndPrev
);
hWndViewer
=
hWnd
;
hWndViewer
=
WIN_GetFullHandle
(
hWnd
)
;
return
hwndPrev
;
}
...
...
@@ -1368,7 +1366,7 @@ BOOL WINAPI ChangeClipboardChain(HWND hWnd, HWND hWndNext)
else
WARN
(
"hWndViewer is lost
\n
"
);
if
(
hWnd
==
hWndViewer
)
hWndViewer
=
hWndNext
;
if
(
hWnd
==
hWndViewer
)
hWndViewer
=
WIN_GetFullHandle
(
hWndNext
)
;
return
bRet
;
}
...
...
@@ -1474,4 +1472,3 @@ DWORD WINAPI GetClipboardSequenceNumber(VOID)
/* FIXME: Use serial numbers */
return
0
;
}
windows/dce.c
View file @
37a4639e
...
...
@@ -70,7 +70,6 @@ DCE *DCE_AllocDCE( HWND hWnd, DCE_TYPE type )
{
FARPROC16
hookProc
;
DCE
*
dce
;
WND
*
wnd
;
if
(
!
(
dce
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
DCE
)
)))
return
NULL
;
if
(
!
(
dce
->
hDC
=
CreateDCA
(
"DISPLAY"
,
NULL
,
NULL
,
NULL
)))
...
...
@@ -80,32 +79,31 @@ DCE *DCE_AllocDCE( HWND hWnd, DCE_TYPE type )
}
if
(
!
defaultDCstate
)
defaultDCstate
=
GetDCState16
(
dce
->
hDC
);
wnd
=
WIN_FindWndPtr
(
hWnd
);
/* store DCE handle in DC hook data field */
hookProc
=
GetProcAddress16
(
GetModuleHandle16
(
"USER"
),
(
LPCSTR
)
362
);
SetDCHook
(
dce
->
hDC
,
hookProc
,
(
DWORD
)
dce
);
dce
->
hwndCurrent
=
hWnd
;
dce
->
hwndCurrent
=
WIN_GetFullHandle
(
hWnd
)
;
dce
->
hClipRgn
=
0
;
dce
->
next
=
firstDCE
;
firstDCE
=
dce
;
if
(
type
!=
DCE_CACHE_DC
)
/* owned or class DC */
{
dce
->
DCXflags
=
DCX_DCEBUSY
;
if
(
hWnd
)
{
if
(
wnd
->
dwStyle
&
WS_CLIPCHILDREN
)
dce
->
DCXflags
|=
DCX_CLIPCHILDREN
;
if
(
wnd
->
dwStyle
&
WS_CLIPSIBLINGS
)
dce
->
DCXflags
|=
DCX_CLIPSIBLINGS
;
LONG
style
=
GetWindowLongW
(
hWnd
,
GWL_STYLE
);
if
(
style
&
WS_CLIPCHILDREN
)
dce
->
DCXflags
|=
DCX_CLIPCHILDREN
;
if
(
style
&
WS_CLIPSIBLINGS
)
dce
->
DCXflags
|=
DCX_CLIPSIBLINGS
;
}
SetHookFlags16
(
dce
->
hDC
,
DCHF_INVALIDATEVISRGN
);
}
else
dce
->
DCXflags
=
DCX_CACHE
|
DCX_DCEEMPTY
;
WIN_ReleaseWndPtr
(
wnd
);
USER_Lock
();
dce
->
next
=
firstDCE
;
firstDCE
=
dce
;
USER_Unlock
();
return
dce
;
}
...
...
@@ -115,7 +113,7 @@ DCE *DCE_AllocDCE( HWND hWnd, DCE_TYPE type )
*/
DCE
*
DCE_FreeDCE
(
DCE
*
dce
)
{
DCE
**
ppDCE
;
DCE
**
ppDCE
,
*
ret
;
if
(
!
dce
)
return
NULL
;
...
...
@@ -125,6 +123,8 @@ DCE* DCE_FreeDCE( DCE *dce )
while
(
*
ppDCE
&&
(
*
ppDCE
!=
dce
))
ppDCE
=
&
(
*
ppDCE
)
->
next
;
if
(
*
ppDCE
==
dce
)
*
ppDCE
=
dce
->
next
;
ret
=
*
ppDCE
;
USER_Unlock
();
SetDCHook
(
dce
->
hDC
,
NULL
,
0L
);
...
...
@@ -133,9 +133,7 @@ DCE* DCE_FreeDCE( DCE *dce )
DeleteObject
(
dce
->
hClipRgn
);
HeapFree
(
GetProcessHeap
(),
0
,
dce
);
USER_Unlock
();
return
*
ppDCE
;
return
ret
;
}
/***********************************************************************
...
...
@@ -146,22 +144,21 @@ DCE* DCE_FreeDCE( DCE *dce )
void
DCE_FreeWindowDCE
(
HWND
hwnd
)
{
DCE
*
pDCE
;
WND
*
pWnd
=
WIN_FindWndPtr
(
hwnd
);
USER_Lock
();
pDCE
=
firstDCE
;
hwnd
=
pWnd
->
hwndSelf
;
/* make it a full handle */
while
(
pDCE
)
{
if
(
pDCE
->
hwndCurrent
==
hwnd
)
{
WND
*
pWnd
=
WIN_FindWndPtr
(
hwnd
);
if
(
pDCE
==
pWnd
->
dce
)
/* owned or Class DCE*/
{
if
(
pWnd
->
clsStyle
&
CS_OWNDC
)
/* owned DCE*/
{
pDCE
=
DCE_FreeDCE
(
pDCE
);
pWnd
->
dce
=
NULL
;
WIN_ReleaseWndPtr
(
pWnd
);
continue
;
}
else
if
(
pDCE
->
DCXflags
&
(
DCX_INTERSECTRGN
|
DCX_EXCLUDERGN
)
)
/* Class DCE*/
...
...
@@ -181,8 +178,7 @@ void DCE_FreeWindowDCE( HWND hwnd )
* We should change this to WARN when Wine is more stable
* (for 1.0?).
*/
ERR
(
"[%04x] GetDC() without ReleaseDC()!
\n
"
,
pWnd
->
hwndSelf
);
ERR
(
"[%08x] GetDC() without ReleaseDC()!
\n
"
,
hwnd
);
DCE_ReleaseDC
(
pDCE
);
}
...
...
@@ -190,12 +186,11 @@ void DCE_FreeWindowDCE( HWND hwnd )
pDCE
->
DCXflags
|=
DCX_DCEEMPTY
;
pDCE
->
hwndCurrent
=
0
;
}
WIN_ReleaseWndPtr
(
pWnd
);
}
pDCE
=
pDCE
->
next
;
}
USER_Unlock
(
);
WIN_ReleaseWndPtr
(
pWnd
);
}
...
...
@@ -403,6 +398,7 @@ HDC WINAPI GetDCEx( HWND hwnd, HRGN hrgnClip, DWORD flags )
if
(
!
hwnd
)
hwnd
=
GetDesktopWindow
();
if
(
!
(
wndPtr
=
WIN_FindWndPtr
(
hwnd
)))
return
0
;
hwnd
=
wndPtr
->
hwndSelf
;
/* make it a full handle */
/* fixup flags */
...
...
windows/dialog.c
View file @
37a4639e
...
...
@@ -1953,6 +1953,9 @@ HWND WINAPI GetNextDlgGroupItem( HWND hwndDlg, HWND hwndCtrl,
{
HWND
hwnd
,
retvalue
;
hwndDlg
=
WIN_GetFullHandle
(
hwndDlg
);
hwndCtrl
=
WIN_GetFullHandle
(
hwndCtrl
);
if
(
hwndCtrl
)
{
/* if the hwndCtrl is the child of the control in the hwndDlg,
...
...
@@ -2108,6 +2111,8 @@ static HWND DIALOG_GetNextTabItem( HWND hwndMain, HWND hwndDlg, HWND hwndCtrl, B
HWND
WINAPI
GetNextDlgTabItem
(
HWND
hwndDlg
,
HWND
hwndCtrl
,
BOOL
fPrevious
)
{
hwndDlg
=
WIN_GetFullHandle
(
hwndDlg
);
hwndCtrl
=
WIN_GetFullHandle
(
hwndCtrl
);
return
DIALOG_GetNextTabItem
(
hwndDlg
,
hwndDlg
,
hwndCtrl
,
fPrevious
);
}
...
...
windows/focus.c
View file @
37a4639e
...
...
@@ -74,6 +74,7 @@ HWND WINAPI SetFocus( HWND hwnd )
/* Check if we can set the focus to this window */
WND
*
wndPtr
;
hwnd
=
WIN_GetFullHandle
(
hwnd
);
for
(;;)
{
HWND
parent
;
...
...
windows/input.c
View file @
37a4639e
...
...
@@ -493,7 +493,7 @@ HWND EVENT_Capture(HWND hwnd, INT16 ht)
if
(
wndPtr
)
{
TRACE_
(
win
)(
"(0x%04x)
\n
"
,
hwnd
);
captureWnd
=
hwnd
;
captureWnd
=
wndPtr
->
hwndSelf
;
captureHT
=
ht
;
}
}
...
...
windows/win.c
View file @
37a4639e
...
...
@@ -147,17 +147,50 @@ static WND *free_window_handle( HWND hwnd )
/***********************************************************************
*
WIN_GetFullHandle
*
get_wnd_ptr
*
* Get the full 32-bit window handle from a possibly truncated handle.
* Return a pointer to the WND structure if local to the process.
* If ret value is non-NULL, the user lock is held.
*/
HWND
WIN_GetFullHandle
(
HWND
hwnd
)
static
WND
*
get_wnd_ptr
(
HWND
hwnd
)
{
if
(
!
HIWORD
(
hwnd
))
WND
*
ptr
;
if
(
!
hwnd
)
return
NULL
;
USER_Lock
();
if
((
ptr
=
user_handles
[
LOWORD
(
hwnd
)]))
{
if
(
ptr
->
dwMagic
==
WND_MAGIC
&&
(
!
HIWORD
(
hwnd
)
||
hwnd
==
ptr
->
hwndSelf
))
return
ptr
;
}
USER_Unlock
();
return
NULL
;
}
/***********************************************************************
* WIN_Handle32
*
* Convert a 16-bit window handle to a full 32-bit handle.
*/
HWND
WIN_Handle32
(
HWND16
hwnd16
)
{
WND
*
ptr
;
HWND
hwnd
=
(
HWND
)
hwnd16
;
if
(
!
hwnd
||
hwnd
==
HWND_BROADCAST
)
return
hwnd
;
if
((
ptr
=
get_wnd_ptr
(
hwnd
)))
{
hwnd
=
ptr
->
hwndSelf
;
USER_Unlock
();
}
else
/* may belong to another process */
{
SERVER_START_REQ
(
get_window_info
)
{
req
->
handle
=
hwnd
;
req
->
handle
=
(
user_handle_t
)
hwnd16
;
if
(
!
SERVER_CALL_ERR
())
hwnd
=
req
->
full_handle
;
}
SERVER_END_REQ
;
...
...
@@ -177,27 +210,19 @@ WND * WIN_FindWndPtr( HWND hwnd )
if
(
!
hwnd
)
return
NULL
;
USER_Lock
();
if
(
!
(
ptr
=
user_handles
[
LOWORD
(
hwnd
)]))
if
((
ptr
=
get_wnd_ptr
(
hwnd
)))
{
/* check other processes */
if
(
IsWindow
(
hwnd
))
{
ERR
(
"window %04x belongs to other process
\n
"
,
hwnd
);
/* DbgBreakPoint(); */
}
goto
error
;
/* increment destruction monitoring */
ptr
->
irefCount
++
;
return
ptr
;
}
if
(
ptr
->
dwMagic
!=
WND_MAGIC
)
goto
error
;
/* verify that handle highword (if any) matches the window */
if
(
HIWORD
(
hwnd
)
&&
hwnd
!=
ptr
->
hwndSelf
)
goto
error
;
/*and increment destruction monitoring*/
ptr
->
irefCount
++
;
return
ptr
;
error:
/* Unlock all WND structures for thread safeness*/
USER_Unlock
();
/* check other processes */
if
(
IsWindow
(
hwnd
))
{
ERR
(
"window %04x belongs to other process
\n
"
,
hwnd
);
/* DbgBreakPoint(); */
}
SetLastError
(
ERROR_INVALID_WINDOW_HANDLE
);
return
NULL
;
}
...
...
@@ -2078,24 +2103,24 @@ BOOL16 WINAPI IsWindow16( HWND16 hwnd )
BOOL
WINAPI
IsWindow
(
HWND
hwnd
)
{
WND
*
ptr
;
BOOL
ret
=
FALSE
;
BOOL
ret
;
USER_Lock
();
if
((
ptr
=
user_handles
[
LOWORD
(
hwnd
)]))
{
ret
=
((
ptr
->
dwMagic
==
WND_MAGIC
)
&&
(
!
HIWORD
(
hwnd
)
||
hwnd
==
ptr
->
hwndSelf
));
USER_Unlock
();
return
ret
;
}
USER_Unlock
();
if
(
!
ret
)
/* check other processes */
/* check other processes */
SERVER_START_REQ
(
get_window_info
)
{
SERVER_START_REQ
(
get_window_info
)
{
req
->
handle
=
hwnd
;
ret
=
!
SERVER_CALL_ERR
();
}
SERVER_END_REQ
;
req
->
handle
=
hwnd
;
ret
=
!
SERVER_CALL_ERR
();
}
SERVER_END_REQ
;
return
ret
;
}
...
...
@@ -2601,9 +2626,8 @@ HWND WINAPI GetLastActivePopup( HWND hwnd )
WND
*
wndPtr
=
WIN_FindWndPtr
(
hwnd
);
if
(
!
wndPtr
)
return
hwnd
;
retval
=
wndPtr
->
hwndLastActive
;
if
(
!
IsWindow
(
retval
))
retval
=
wndPtr
->
hwndSelf
;
WIN_ReleaseWndPtr
(
wndPtr
);
if
((
retval
!=
hwnd
)
&&
(
!
IsWindow
(
retval
)))
retval
=
hwnd
;
return
retval
;
}
...
...
windows/winpos.c
View file @
37a4639e
...
...
@@ -374,6 +374,7 @@ HWND WINPOS_WindowFromPoint( HWND hwndScope, POINT pt, INT *hittest )
if
(
!
hwndScope
)
hwndScope
=
GetDesktopWindow
();
if
(
!
(
wndScope
=
WIN_FindWndPtr
(
hwndScope
)))
return
0
;
hwndScope
=
wndScope
->
hwndSelf
;
/* make it a full handle */
*
hittest
=
HTERROR
;
wndPtr
=
WIN_LockWndPtr
(
wndScope
->
child
);
...
...
@@ -892,7 +893,7 @@ HWND16 WINAPI GetShellWindow16(void)
HWND
WINAPI
SetShellWindow
(
HWND
hwndshell
)
{
WARN
(
"(hWnd=%08x) semi stub
\n
"
,
hwndshell
);
hGlobalShellWindow
=
hwndshell
;
hGlobalShellWindow
=
WIN_GetFullHandle
(
hwndshell
)
;
return
hGlobalShellWindow
;
}
...
...
@@ -1423,6 +1424,9 @@ BOOL WINPOS_SetActiveWindow( HWND hWnd, BOOL fMouse, BOOL fChangeFocus)
hwndActive
=
PERQDATA_GetActiveWnd
(
pOldActiveQueue
->
pQData
);
}
if
((
wndPtr
=
WIN_FindWndPtr
(
hWnd
)))
hWnd
=
wndPtr
->
hwndSelf
;
/* make it a full handle */
/* paranoid checks */
if
(
hWnd
==
GetDesktopWindow
()
||
(
bRet
=
(
hWnd
==
hwndActive
))
)
goto
CLEANUP_END
;
...
...
@@ -1430,7 +1434,6 @@ BOOL WINPOS_SetActiveWindow( HWND hWnd, BOOL fMouse, BOOL fChangeFocus)
/* if (wndPtr && (GetFastQueue16() != wndPtr->hmemTaskQ))
* return 0;
*/
wndPtr
=
WIN_FindWndPtr
(
hWnd
);
hOldActiveQueue
=
hActiveQueue
;
if
(
(
wndTemp
=
WIN_FindWndPtr
(
hwndActive
))
)
...
...
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