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
751a09e9
Commit
751a09e9
authored
Oct 11, 2010
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
user32: Store the module and resource name information for icons.
parent
0df47126
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
40 additions
and
22 deletions
+40
-22
cursoricon.c
dlls/user32/cursoricon.c
+40
-22
No files found.
dlls/user32/cursoricon.c
View file @
751a09e9
...
...
@@ -39,6 +39,7 @@
#include "controls.h"
#include "user_private.h"
#include "wine/list.h"
#include "wine/unicode.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL
(
cursor
);
...
...
@@ -114,6 +115,8 @@ struct cursoricon_object
{
struct
user_object
obj
;
/* object header */
ULONG_PTR
param
;
/* opaque param used by 16-bit code */
HMODULE
module
;
/* module for icons loaded from resources */
LPWSTR
resname
;
/* resource name for icons loaded from resources */
BOOL
is_icon
;
/* whether icon or cursor */
UINT
width
;
UINT
height
;
...
...
@@ -165,6 +168,7 @@ static BOOL free_icon_handle( HICON handle )
if
(
obj
->
frames
[
i
].
color
)
DeleteObject
(
obj
->
frames
[
i
].
color
);
DeleteObject
(
obj
->
frames
[
i
].
mask
);
}
if
(
!
IS_INTRESOURCE
(
obj
->
resname
))
HeapFree
(
GetProcessHeap
(),
0
,
obj
->
resname
);
HeapFree
(
GetProcessHeap
(),
0
,
obj
);
if
(
wow_handlers
.
free_icon_param
&&
param
)
wow_handlers
.
free_icon_param
(
param
);
USER_Driver
->
pDestroyCursorIcon
(
handle
);
...
...
@@ -845,22 +849,13 @@ done:
return
ret
;
}
static
HICON
CURSORICON_CreateIconFromBMI
(
BITMAPINFO
*
bmi
,
POINT
hotspot
,
BOOL
bIcon
,
DWORD
dwVersion
,
INT
width
,
INT
height
,
UINT
cFlag
)
static
HICON
CURSORICON_CreateIconFromBMI
(
BITMAPINFO
*
bmi
,
HMODULE
module
,
LPCWSTR
resname
,
POINT
hotspot
,
BOOL
bIcon
,
INT
width
,
INT
height
,
UINT
cFlag
)
{
HICON
hObj
;
HBITMAP
color
=
0
,
mask
=
0
,
alpha
=
0
;
BOOL
do_stretch
;
if
(
dwVersion
==
0x00020000
)
{
FIXME_
(
cursor
)(
"
\t
2.xx resources are not supported
\n
"
);
return
0
;
}
/* Check bitmap header */
if
(
(
bmi
->
bmiHeader
.
biSize
!=
sizeof
(
BITMAPCOREHEADER
))
&&
...
...
@@ -899,13 +894,22 @@ static HICON CURSORICON_CreateIconFromBMI( BITMAPINFO *bmi,
struct
cursoricon_object
*
info
=
get_icon_ptr
(
hObj
);
info
->
is_icon
=
bIcon
;
info
->
module
=
module
;
info
->
hotspot
=
hotspot
;
info
->
width
=
width
;
info
->
height
=
height
;
info
->
frames
[
0
].
color
=
color
;
info
->
frames
[
0
].
mask
=
mask
;
info
->
frames
[
0
].
alpha
=
alpha
;
if
(
!
IS_INTRESOURCE
(
resname
))
{
info
->
resname
=
HeapAlloc
(
GetProcessHeap
(),
0
,
(
strlenW
(
resname
)
+
1
)
*
sizeof
(
WCHAR
)
);
if
(
info
->
resname
)
strcpyW
(
info
->
resname
,
resname
);
}
else
info
->
resname
=
MAKEINTRESOURCEW
(
LOWORD
(
resname
)
);
release_icon_ptr
(
hObj
,
info
);
USER_Driver
->
pCreateCursorIcon
(
hObj
);
}
else
{
...
...
@@ -1149,7 +1153,6 @@ HICON WINAPI CreateIconFromResourceEx( LPBYTE bits, UINT cbSize,
{
POINT
hotspot
;
BITMAPINFO
*
bmi
;
HICON
icon
;
TRACE_
(
cursor
)(
"%p (%u bytes), ver %08x, %ix%i %s %s
\n
"
,
bits
,
cbSize
,
dwVersion
,
width
,
height
,
...
...
@@ -1157,6 +1160,12 @@ HICON WINAPI CreateIconFromResourceEx( LPBYTE bits, UINT cbSize,
if
(
!
bits
)
return
0
;
if
(
dwVersion
==
0x00020000
)
{
FIXME_
(
cursor
)(
"
\t
2.xx resources are not supported
\n
"
);
return
0
;
}
if
(
bIcon
)
{
hotspot
.
x
=
width
/
2
;
...
...
@@ -1171,10 +1180,7 @@ HICON WINAPI CreateIconFromResourceEx( LPBYTE bits, UINT cbSize,
bmi
=
(
BITMAPINFO
*
)(
pt
+
2
);
}
icon
=
CURSORICON_CreateIconFromBMI
(
bmi
,
hotspot
,
bIcon
,
dwVersion
,
width
,
height
,
cFlag
);
if
(
icon
)
USER_Driver
->
pCreateCursorIcon
(
icon
);
return
icon
;
return
CURSORICON_CreateIconFromBMI
(
bmi
,
NULL
,
NULL
,
hotspot
,
bIcon
,
width
,
height
,
cFlag
);
}
...
...
@@ -1236,13 +1242,11 @@ static HICON CURSORICON_LoadFromFile( LPCWSTR filename,
hotspot
.
x
=
entry
->
xHotspot
;
hotspot
.
y
=
entry
->
yHotspot
;
hIcon
=
CURSORICON_CreateIconFromBMI
(
(
BITMAPINFO
*
)
&
bits
[
entry
->
dwDIBOffset
],
hotspot
,
!
fCursor
,
0x00030000
,
width
,
height
,
loadflags
);
hIcon
=
CURSORICON_CreateIconFromBMI
(
(
BITMAPINFO
*
)
&
bits
[
entry
->
dwDIBOffset
],
NULL
,
NULL
,
hotspot
,
!
fCursor
,
width
,
height
,
loadflags
);
end:
TRACE
(
"loaded %s -> %p
\n
"
,
debugstr_w
(
filename
),
hIcon
);
UnmapViewOfFile
(
bits
);
if
(
hIcon
)
USER_Driver
->
pCreateCursorIcon
(
hIcon
);
return
hIcon
;
}
...
...
@@ -1263,6 +1267,7 @@ static HICON CURSORICON_Load(HINSTANCE hInstance, LPCWSTR name,
LPBYTE
bits
;
WORD
wResId
;
DWORD
dwBytesInRes
;
POINT
hotspot
;
TRACE
(
"%p, %s, %dx%d, depth %d, fCursor %d, flags 0x%04x
\n
"
,
hInstance
,
debugstr_w
(
name
),
width
,
height
,
depth
,
fCursor
,
loadflags
);
...
...
@@ -1307,8 +1312,21 @@ static HICON CURSORICON_Load(HINSTANCE hInstance, LPCWSTR name,
if
(
!
(
handle
=
LoadResource
(
hInstance
,
hRsrc
)))
return
0
;
bits
=
LockResource
(
handle
);
hIcon
=
CreateIconFromResourceEx
(
bits
,
dwBytesInRes
,
!
fCursor
,
0x00030000
,
width
,
height
,
loadflags
);
if
(
!
fCursor
)
{
hotspot
.
x
=
width
/
2
;
hotspot
.
y
=
height
/
2
;
}
else
/* get the hotspot */
{
SHORT
*
pt
=
(
SHORT
*
)
bits
;
hotspot
.
x
=
pt
[
0
];
hotspot
.
y
=
pt
[
1
];
bits
+=
2
*
sizeof
(
SHORT
);
}
hIcon
=
CURSORICON_CreateIconFromBMI
(
(
BITMAPINFO
*
)
bits
,
hInstance
,
name
,
hotspot
,
!
fCursor
,
width
,
height
,
loadflags
);
FreeResource
(
handle
);
/* If shared icon, add to icon cache */
...
...
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