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
5e557d83
Commit
5e557d83
authored
Apr 16, 2009
by
Huw Davies
Committed by
Alexandre Julliard
Apr 16, 2009
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ole32: Rewrite the clipboard window's wndproc to use the cached enum data.
parent
b958dfdc
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
41 additions
and
113 deletions
+41
-113
clipboard.c
dlls/ole32/clipboard.c
+41
-113
No files found.
dlls/ole32/clipboard.c
View file @
5e557d83
...
...
@@ -103,9 +103,13 @@ typedef struct
/* then follows any DVTARGETDEVICE structures referenced in the FORMATETCs */
}
ole_priv_data
;
/* Create an empty data structure. The only thing that really matters
here is setting count and size members. This is used by the enumerator as a
convenience when there's an empty list. */
/*****************************************************************************
* create_empty_priv_data
*
* Create an empty data structure. The only thing that really matters
* here is setting count and size members. This is used by the enumerator as a
* convenience when there's an empty list.
*/
static
HRESULT
create_empty_priv_data
(
ole_priv_data
**
data
)
{
ole_priv_data
*
ptr
;
...
...
@@ -592,138 +596,62 @@ end:
/***********************************************************************
* OLEClipbrd_WndProc(HWND, unsigned, WORD, LONG)
* Processes messages sent to the OLE clipboard window.
* Note that we will intercept messages in our WndProc only when data
* has been placed in the clipboard via OleSetClipboard().
* i.e. Only when OLE owns the windows clipboard.
* clipbrd_wndproc
*/
static
LRESULT
CALLBACK
OLEClipbrd_WndProc
(
HWND
hWnd
,
UINT
message
,
WPARAM
wParam
,
LPARAM
lParam
)
static
LRESULT
CALLBACK
clipbrd_wndproc
(
HWND
hwnd
,
UINT
message
,
WPARAM
wparam
,
LPARAM
lparam
)
{
switch
(
message
)
{
/*
* WM_RENDERFORMAT
* We receive this message to allow us to handle delayed rendering of
* a specific clipboard format when an application requests data in
* that format by calling GetClipboardData.
* (Recall that in OleSetClipboard, we used SetClipboardData to
* make all HGLOBAL formats supported by the source IDataObject
* available using delayed rendering)
* On receiving this message we must actually render the data in the
* specified format and place it on the clipboard by calling the
* SetClipboardData function.
*/
ole_clipbrd
*
clipbrd
=
theOleClipboard
;
switch
(
message
)
{
case
WM_RENDERFORMAT
:
{
FORMATETC
rgelt
;
ZeroMemory
(
&
rgelt
,
sizeof
(
FORMATETC
));
UINT
cf
=
wparam
;
ole_priv_data_entry
*
entry
;
/*
* Initialize FORMATETC to a Windows clipboard friendly format
*/
rgelt
.
cfFormat
=
(
UINT
)
wParam
;
rgelt
.
dwAspect
=
DVASPECT_CONTENT
;
rgelt
.
lindex
=
-
1
;
rgelt
.
tymed
=
TYMED_HGLOBAL
;
TRACE
(
"(): WM_RENDERFORMAT(cfFormat=%x)
\n
"
,
cf
);
entry
=
find_format_in_list
(
clipbrd
->
cached_enum
->
entries
,
clipbrd
->
cached_enum
->
count
,
cf
);
TRACE
(
"(): WM_RENDERFORMAT(cfFormat=%d)
\n
"
,
rgelt
.
cfFormat
);
if
(
entry
)
render_format
(
clipbrd
->
pIDataObjectSrc
,
&
entry
->
fmtetc
);
/*
* Render the clipboard data.
* (We must have a source data object or we wouldn't be in this WndProc)
*/
render_format
(
(
IDataObject
*
)
&
(
theOleClipboard
->
lpvtbl
),
&
rgelt
);
break
;
break
;
}
/*
* WM_RENDERALLFORMATS
* Sent before the clipboard owner window is destroyed.
* We should receive this message only when OleUninitialize is called
* while we have an IDataObject in the clipboard.
* For the content of the clipboard to remain available to other
* applications, we must render data in all the formats the source IDataObject
* is capable of generating, and place the data on the clipboard by calling
* SetClipboardData.
*/
case
WM_RENDERALLFORMATS
:
{
IEnumFORMATETC
*
penumFormatetc
=
NULL
;
FORMATETC
rgelt
;
TRACE
(
"(): WM_RENDERALLFORMATS
\n
"
);
DWORD
i
;
ole_priv_data_entry
*
entries
=
clipbrd
->
cached_enum
->
entries
;
/*
* Render all HGLOBAL formats supported by the source into
* the windows clipboard.
*/
if
(
FAILED
(
IDataObject_EnumFormatEtc
(
(
IDataObject
*
)
&
(
theOleClipboard
->
lpvtbl
),
DATADIR_GET
,
&
penumFormatetc
)
)
)
{
WARN
(
"(): WM_RENDERALLFORMATS failed to retrieve EnumFormatEtc!
\n
"
);
return
0
;
}
TRACE
(
"(): WM_RENDERALLFORMATS
\n
"
);
while
(
S_OK
==
IEnumFORMATETC_Next
(
penumFormatetc
,
1
,
&
rgelt
,
NULL
)
)
{
if
(
rgelt
.
tymed
==
TYMED_HGLOBAL
)
for
(
i
=
0
;
i
<
clipbrd
->
cached_enum
->
count
;
i
++
)
{
/*
* Render the clipboard data.
*/
if
(
FAILED
(
render_format
(
(
IDataObject
*
)
&
(
theOleClipboard
->
lpvtbl
),
&
rgelt
))
)
continue
;
TRACE
(
"(): WM_RENDERALLFORMATS(cfFormat=%d)
\n
"
,
rgelt
.
cfFormat
);
if
(
entries
[
i
].
first_use
)
render_format
(
clipbrd
->
pIDataObjectSrc
,
&
entries
[
i
].
fmtetc
);
}
}
IEnumFORMATETC_Release
(
penumFormatetc
);
break
;
break
;
}
/*
* WM_DESTROYCLIPBOARD
* This is sent by EmptyClipboard before the clipboard is emptied.
* We should release any IDataObject we are holding onto when we receive
* this message, since it indicates that the OLE clipboard should be empty
* from this point on.
*/
case
WM_DESTROYCLIPBOARD
:
{
TRACE
(
"(): WM_DESTROYCLIPBOARD
\n
"
);
/*
* Release the data object we are holding on to
*/
if
(
theOleClipboard
->
pIDataObjectSrc
)
{
IDataObject_Release
(
theOleClipboard
->
pIDataObjectSrc
);
theOleClipboard
->
pIDataObjectSrc
=
NULL
;
HeapFree
(
GetProcessHeap
(),
0
,
theOleClipboard
->
cached_enum
);
theOleClipboard
->
cached_enum
=
NULL
;
}
break
;
TRACE
(
"(): WM_DESTROYCLIPBOARD
\n
"
);
if
(
clipbrd
->
pIDataObjectSrc
)
{
IDataObject_Release
(
clipbrd
->
pIDataObjectSrc
);
clipbrd
->
pIDataObjectSrc
=
NULL
;
HeapFree
(
GetProcessHeap
(),
0
,
clipbrd
->
cached_enum
);
clipbrd
->
cached_enum
=
NULL
;
}
break
;
}
/*
case WM_ASKCBFORMATNAME:
case WM_CHANGECBCHAIN:
case WM_DRAWCLIPBOARD:
case WM_SIZECLIPBOARD:
case WM_HSCROLLCLIPBOARD:
case WM_VSCROLLCLIPBOARD:
case WM_PAINTCLIPBOARD:
*/
default:
return
DefWindowProcA
(
hWnd
,
message
,
wParam
,
lP
aram
);
}
return
DefWindowProcA
(
hwnd
,
message
,
wparam
,
lp
aram
);
}
return
0
;
return
0
;
}
...
...
@@ -1196,7 +1124,7 @@ static HWND OLEClipbrd_CreateWindow(void)
* We don't bother doing this since the FindClassByAtom code
* would have to be changed to deal with this idiosyncrasy. */
wcex
.
style
=
CS_GLOBALCLASS
;
wcex
.
lpfnWndProc
=
OLEClipbrd_WndP
roc
;
wcex
.
lpfnWndProc
=
clipbrd_wndp
roc
;
wcex
.
hInstance
=
0
;
wcex
.
lpszClassName
=
OLEClipbrd_WNDCLASS
;
...
...
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