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
08c4de06
Commit
08c4de06
authored
Mar 30, 2021
by
Huw Davies
Committed by
Alexandre Julliard
Mar 30, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
riched20: Add support for EN_[HV]SCROLL notifications.
Signed-off-by:
Huw Davies
<
huw@codeweavers.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
db516804
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
99 additions
and
40 deletions
+99
-40
editor.c
dlls/riched20/editor.c
+9
-11
editor.h
dlls/riched20/editor.h
+3
-3
paint.c
dlls/riched20/paint.c
+25
-22
richole.c
dlls/riched20/richole.c
+1
-1
txtsrv.c
dlls/riched20/tests/txtsrv.c
+61
-3
No files found.
dlls/riched20/editor.c
View file @
08c4de06
...
...
@@ -3377,7 +3377,7 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam,
case
EM_SETSCROLLPOS
:
{
POINT
*
point
=
(
POINT
*
)
lParam
;
ME_ScrollAbs
(
editor
,
point
->
x
,
point
->
y
);
scroll_abs
(
editor
,
point
->
x
,
point
->
y
,
TRUE
);
return
0
;
}
case
EM_AUTOURLDETECT
:
...
...
@@ -3986,12 +3986,11 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam,
switch
(
LOWORD
(
wParam
))
{
case
SB_LEFT
:
ME_ScrollAbs
(
editor
,
0
,
0
);
scroll_abs
(
editor
,
0
,
0
,
TRUE
);
break
;
case
SB_RIGHT
:
ME_ScrollAbs
(
editor
,
editor
->
horz_si
.
nMax
-
(
int
)
editor
->
horz_si
.
nPage
,
editor
->
vert_si
.
nMax
-
(
int
)
editor
->
vert_si
.
nPage
);
scroll_abs
(
editor
,
editor
->
horz_si
.
nMax
-
(
int
)
editor
->
horz_si
.
nPage
,
editor
->
vert_si
.
nMax
-
(
int
)
editor
->
vert_si
.
nPage
,
TRUE
);
break
;
case
SB_LINELEFT
:
ME_ScrollLeft
(
editor
,
scrollUnit
);
...
...
@@ -4011,7 +4010,7 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam,
int
pos
=
HIWORD
(
wParam
);
if
(
editor
->
horz_si
.
nMax
>
0xffff
)
pos
=
MulDiv
(
pos
,
editor
->
horz_si
.
nMax
,
0xffff
);
ME_HScrollAbs
(
editor
,
pos
);
scroll_h_abs
(
editor
,
pos
,
FALSE
);
break
;
}
}
...
...
@@ -4028,12 +4027,11 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam,
switch
(
LOWORD
(
wParam
))
{
case
SB_TOP
:
ME_ScrollAbs
(
editor
,
0
,
0
);
scroll_abs
(
editor
,
0
,
0
,
TRUE
);
break
;
case
SB_BOTTOM
:
ME_ScrollAbs
(
editor
,
editor
->
horz_si
.
nMax
-
(
int
)
editor
->
horz_si
.
nPage
,
editor
->
vert_si
.
nMax
-
(
int
)
editor
->
vert_si
.
nPage
);
scroll_abs
(
editor
,
editor
->
horz_si
.
nMax
-
(
int
)
editor
->
horz_si
.
nPage
,
editor
->
vert_si
.
nMax
-
(
int
)
editor
->
vert_si
.
nPage
,
TRUE
);
break
;
case
SB_LINEUP
:
ME_ScrollUp
(
editor
,
lineHeight
);
...
...
@@ -4053,7 +4051,7 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam,
int
pos
=
HIWORD
(
wParam
);
if
(
editor
->
vert_si
.
nMax
>
0xffff
)
pos
=
MulDiv
(
pos
,
editor
->
vert_si
.
nMax
,
0xffff
);
ME_VScrollAbs
(
editor
,
pos
);
scroll_v_abs
(
editor
,
pos
,
FALSE
);
break
;
}
}
...
...
dlls/riched20/editor.h
View file @
08c4de06
...
...
@@ -250,9 +250,9 @@ int ME_twips2pointsY(const ME_Context *c, int y) DECLSPEC_HIDDEN;
/* scroll functions in paint.c */
void
ME_ScrollAbs
(
ME_TextEditor
*
editor
,
int
x
,
int
y
)
DECLSPEC_HIDDEN
;
void
ME_HScrollAbs
(
ME_TextEditor
*
editor
,
int
x
)
DECLSPEC_HIDDEN
;
void
ME_VScrollAbs
(
ME_TextEditor
*
editor
,
int
y
)
DECLSPEC_HIDDEN
;
void
scroll_abs
(
ME_TextEditor
*
editor
,
int
x
,
int
y
,
BOOL
notify
)
DECLSPEC_HIDDEN
;
void
scroll_h_abs
(
ME_TextEditor
*
editor
,
int
x
,
BOOL
notify
)
DECLSPEC_HIDDEN
;
void
scroll_v_abs
(
ME_TextEditor
*
editor
,
int
y
,
BOOL
notify
)
DECLSPEC_HIDDEN
;
void
ME_ScrollUp
(
ME_TextEditor
*
editor
,
int
cy
)
DECLSPEC_HIDDEN
;
void
ME_ScrollDown
(
ME_TextEditor
*
editor
,
int
cy
)
DECLSPEC_HIDDEN
;
void
ME_ScrollLeft
(
ME_TextEditor
*
editor
,
int
cx
)
DECLSPEC_HIDDEN
;
...
...
dlls/riched20/paint.c
View file @
08c4de06
...
...
@@ -1070,7 +1070,7 @@ static void enable_show_scrollbar( ME_TextEditor *editor, INT bar, BOOL enable )
ITextHost_TxShowScrollBar
(
editor
->
texthost
,
bar
,
enable
);
}
static
void
set_scroll_range_pos
(
ITextHost2
*
host
,
INT
bar
,
SCROLLINFO
*
info
,
BOOL
set_range
)
static
void
set_scroll_range_pos
(
ME_TextEditor
*
editor
,
INT
bar
,
SCROLLINFO
*
info
,
BOOL
set_range
,
BOOL
notify
)
{
LONG
max_pos
=
info
->
nMax
,
pos
=
info
->
nPos
;
...
...
@@ -1080,11 +1080,14 @@ static void set_scroll_range_pos( ITextHost2 *host, INT bar, SCROLLINFO *info, B
pos
=
MulDiv
(
pos
,
0xffff
,
max_pos
);
max_pos
=
0xffff
;
}
if
(
set_range
)
ITextHost_TxSetScrollRange
(
host
,
bar
,
0
,
max_pos
,
FALSE
);
ITextHost_TxSetScrollPos
(
host
,
bar
,
pos
,
TRUE
);
if
(
set_range
)
ITextHost_TxSetScrollRange
(
editor
->
texthost
,
bar
,
0
,
max_pos
,
FALSE
);
ITextHost_TxSetScrollPos
(
editor
->
texthost
,
bar
,
pos
,
TRUE
);
if
(
notify
&&
editor
->
nEventMask
&
ENM_SCROLL
)
ITextHost_TxNotify
(
editor
->
texthost
,
bar
==
SB_VERT
?
EN_VSCROLL
:
EN_HSCROLL
,
NULL
);
}
void
ME_ScrollAbs
(
ME_TextEditor
*
editor
,
int
x
,
int
y
)
void
scroll_abs
(
ME_TextEditor
*
editor
,
int
x
,
int
y
,
BOOL
notify
)
{
int
scrollX
=
0
,
scrollY
=
0
;
...
...
@@ -1093,7 +1096,7 @@ void ME_ScrollAbs(ME_TextEditor *editor, int x, int y)
x
=
max
(
x
,
editor
->
horz_si
.
nMin
);
scrollX
=
editor
->
horz_si
.
nPos
-
x
;
editor
->
horz_si
.
nPos
=
x
;
set_scroll_range_pos
(
editor
->
texthost
,
SB_HORZ
,
&
editor
->
horz_si
,
FALSE
);
set_scroll_range_pos
(
editor
,
SB_HORZ
,
&
editor
->
horz_si
,
FALSE
,
notify
);
}
if
(
editor
->
vert_si
.
nPos
!=
y
)
{
...
...
@@ -1101,7 +1104,7 @@ void ME_ScrollAbs(ME_TextEditor *editor, int x, int y)
y
=
max
(
y
,
editor
->
vert_si
.
nMin
);
scrollY
=
editor
->
vert_si
.
nPos
-
y
;
editor
->
vert_si
.
nPos
=
y
;
set_scroll_range_pos
(
editor
->
texthost
,
SB_VERT
,
&
editor
->
vert_si
,
FALSE
);
set_scroll_range_pos
(
editor
,
SB_VERT
,
&
editor
->
vert_si
,
FALSE
,
notify
);
}
if
(
abs
(
scrollX
)
>
editor
->
sizeWindow
.
cx
||
abs
(
scrollY
)
>
editor
->
sizeWindow
.
cy
)
...
...
@@ -1114,34 +1117,34 @@ void ME_ScrollAbs(ME_TextEditor *editor, int x, int y)
ME_Repaint
(
editor
);
}
void
ME_HScrollAbs
(
ME_TextEditor
*
editor
,
int
x
)
void
scroll_h_abs
(
ME_TextEditor
*
editor
,
int
x
,
BOOL
notify
)
{
ME_ScrollAbs
(
editor
,
x
,
editor
->
vert_si
.
nPos
);
scroll_abs
(
editor
,
x
,
editor
->
vert_si
.
nPos
,
notify
);
}
void
ME_VScrollAbs
(
ME_TextEditor
*
editor
,
int
y
)
void
scroll_v_abs
(
ME_TextEditor
*
editor
,
int
y
,
BOOL
notify
)
{
ME_ScrollAbs
(
editor
,
editor
->
horz_si
.
nPos
,
y
);
scroll_abs
(
editor
,
editor
->
horz_si
.
nPos
,
y
,
notify
);
}
void
ME_ScrollUp
(
ME_TextEditor
*
editor
,
int
cy
)
{
ME_VScrollAbs
(
editor
,
editor
->
vert_si
.
nPos
-
cy
);
scroll_v_abs
(
editor
,
editor
->
vert_si
.
nPos
-
cy
,
TRUE
);
}
void
ME_ScrollDown
(
ME_TextEditor
*
editor
,
int
cy
)
{
ME_VScrollAbs
(
editor
,
editor
->
vert_si
.
nPos
+
cy
);
scroll_v_abs
(
editor
,
editor
->
vert_si
.
nPos
+
cy
,
TRUE
);
}
void
ME_ScrollLeft
(
ME_TextEditor
*
editor
,
int
cx
)
{
ME_HScrollAbs
(
editor
,
editor
->
horz_si
.
nPos
-
cx
);
scroll_h_abs
(
editor
,
editor
->
horz_si
.
nPos
-
cx
,
TRUE
);
}
void
ME_ScrollRight
(
ME_TextEditor
*
editor
,
int
cx
)
{
ME_HScrollAbs
(
editor
,
editor
->
horz_si
.
nPos
+
cx
);
scroll_h_abs
(
editor
,
editor
->
horz_si
.
nPos
+
cx
,
TRUE
);
}
void
ME_UpdateScrollBar
(
ME_TextEditor
*
editor
)
...
...
@@ -1157,7 +1160,7 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
enable
=
editor
->
nTotalWidth
>
editor
->
sizeWindow
.
cx
;
if
(
editor
->
horz_si
.
nPos
&&
!
enable
)
{
ME_HScrollAbs
(
editor
,
0
);
scroll_h_abs
(
editor
,
0
,
TRUE
);
/* ME_HScrollAbs will call this function, so nothing else needs to be done here. */
return
;
}
...
...
@@ -1174,7 +1177,7 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
editor
->
horz_si
.
nPage
=
editor
->
sizeWindow
.
cx
;
TRACE
(
"min = %d max = %d page = %d
\n
"
,
editor
->
horz_si
.
nMin
,
editor
->
horz_si
.
nMax
,
editor
->
horz_si
.
nPage
);
if
((
enable
||
editor
->
horz_sb_enabled
)
&&
editor
->
scrollbars
&
WS_HSCROLL
)
set_scroll_range_pos
(
editor
->
texthost
,
SB_HORZ
,
&
editor
->
horz_si
,
TRUE
);
set_scroll_range_pos
(
editor
,
SB_HORZ
,
&
editor
->
horz_si
,
TRUE
,
TRUE
);
}
/* Update vertical scrollbar */
...
...
@@ -1182,7 +1185,7 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
if
(
editor
->
vert_si
.
nPos
&&
!
enable
)
{
ME_VScrollAbs
(
editor
,
0
);
scroll_v_abs
(
editor
,
0
,
TRUE
);
/* ME_VScrollAbs will call this function, so nothing else needs to be done here. */
return
;
}
...
...
@@ -1199,7 +1202,7 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
editor
->
vert_si
.
nPage
=
editor
->
sizeWindow
.
cy
;
TRACE
(
"min = %d max = %d page = %d
\n
"
,
editor
->
vert_si
.
nMin
,
editor
->
vert_si
.
nMax
,
editor
->
vert_si
.
nPage
);
if
((
enable
||
editor
->
vert_sb_enabled
)
&&
editor
->
scrollbars
&
WS_VSCROLL
)
set_scroll_range_pos
(
editor
->
texthost
,
SB_VERT
,
&
editor
->
vert_si
,
TRUE
);
set_scroll_range_pos
(
editor
,
SB_VERT
,
&
editor
->
vert_si
,
TRUE
,
TRUE
);
}
}
...
...
@@ -1221,7 +1224,7 @@ void editor_ensure_visible( ME_TextEditor *editor, ME_Cursor *cursor )
if
(
~
editor
->
scrollbars
&
ES_AUTOVSCROLL
)
{
ME_HScrollAbs
(
editor
,
x
);
scroll_h_abs
(
editor
,
x
,
TRUE
);
return
;
}
}
...
...
@@ -1235,11 +1238,11 @@ void editor_ensure_visible( ME_TextEditor *editor, ME_Cursor *cursor )
yheight
=
row
->
nHeight
;
if
(
y
<
editor
->
vert_si
.
nPos
)
ME_ScrollAbs
(
editor
,
x
,
y
);
scroll_abs
(
editor
,
x
,
y
,
TRUE
);
else
if
(
y
+
yheight
>
editor
->
vert_si
.
nPos
+
editor
->
sizeWindow
.
cy
)
ME_ScrollAbs
(
editor
,
x
,
y
+
yheight
-
editor
->
sizeWindow
.
cy
);
scroll_abs
(
editor
,
x
,
y
+
yheight
-
editor
->
sizeWindow
.
cy
,
TRUE
);
else
if
(
x
!=
editor
->
horz_si
.
nPos
)
ME_ScrollAbs
(
editor
,
x
,
editor
->
vert_si
.
nPos
);
scroll_abs
(
editor
,
x
,
editor
->
vert_si
.
nPos
,
TRUE
);
}
...
...
dlls/riched20/richole.c
View file @
08c4de06
...
...
@@ -2743,7 +2743,7 @@ static HRESULT WINAPI ITextRange_fnScrollIntoView(ITextRange *me, LONG value)
FIXME
(
"bStart value %d not handled
\n
"
,
value
);
return
E_NOTIMPL
;
}
ME_ScrollAbs
(
editor
,
x
,
y
);
scroll_abs
(
editor
,
x
,
y
,
TRUE
);
return
S_OK
;
}
...
...
dlls/riched20/tests/txtsrv.c
View file @
08c4de06
...
...
@@ -398,11 +398,19 @@ static HRESULT __thiscall ITextHostImpl_TxGetPropertyBits(ITextHost *iface, DWOR
return
S_OK
;
}
static
HRESULT
__thiscall
ITextHostImpl_TxNotify
(
ITextHost
*
iface
,
DWORD
iNotify
,
void
*
pv
)
static
int
en_vscroll_sent
;
static
HRESULT
__thiscall
ITextHostImpl_TxNotify
(
ITextHost
*
iface
,
DWORD
code
,
void
*
data
)
{
ITextHostTestImpl
*
This
=
impl_from_ITextHost
(
iface
);
TRACECALL
(
"Call to TxNotify(%p, iNotify=%d, pv=%p)
\n
"
,
This
,
iNotify
,
pv
);
return
E_NOTIMPL
;
TRACECALL
(
"Call to TxNotify(%p, code = %#x, data = %p)
\n
"
,
This
,
code
,
data
);
switch
(
code
)
{
case
EN_VSCROLL
:
en_vscroll_sent
++
;
ok
(
!
data
,
"got %p
\n
"
,
data
);
break
;
}
return
S_OK
;
}
static
HIMC
__thiscall
ITextHostImpl_TxImmGetContext
(
ITextHost
*
iface
)
...
...
@@ -1100,6 +1108,55 @@ todo_wine
ITextHost_Release
(
host
);
}
static
void
test_notifications
(
void
)
{
ITextServices
*
txtserv
;
ITextHost
*
host
;
LRESULT
res
;
HRESULT
hr
;
RECT
client
=
{
0
,
0
,
100
,
100
};
ITextHostTestImpl
*
host_impl
;
init_texthost
(
&
txtserv
,
&
host
);
host_impl
=
impl_from_ITextHost
(
host
);
host_impl
->
scrollbars
=
WS_VSCROLL
;
host_impl
->
props
=
TXTBIT_MULTILINE
|
TXTBIT_RICHTEXT
|
TXTBIT_WORDWRAP
;
ITextServices_OnTxPropertyBitsChange
(
txtserv
,
TXTBIT_SCROLLBARCHANGE
|
TXTBIT_MULTILINE
|
TXTBIT_RICHTEXT
|
TXTBIT_WORDWRAP
,
host_impl
->
props
);
ITextServices_TxSetText
(
txtserv
,
lorem
);
host_impl
->
window
=
CreateWindowExA
(
0
,
"static"
,
NULL
,
WS_POPUP
|
WS_VISIBLE
,
0
,
0
,
400
,
400
,
0
,
0
,
0
,
NULL
);
host_impl
->
client_rect
=
client
;
hr
=
ITextServices_OnTxInPlaceActivate
(
txtserv
,
&
client
);
ok
(
hr
==
S_OK
,
"got 0x%08x.
\n
"
,
hr
);
hr
=
ITextServices_TxSendMessage
(
txtserv
,
EM_SETEVENTMASK
,
0
,
ENM_SCROLL
,
&
res
);
ok
(
hr
==
S_OK
,
"got %08x
\n
"
,
hr
);
/* check EN_VSCROLL notification is sent */
en_vscroll_sent
=
0
;
hr
=
ITextServices_TxSendMessage
(
txtserv
,
WM_VSCROLL
,
SB_LINEDOWN
,
0
,
&
res
);
ok
(
hr
==
S_OK
,
"got %08x
\n
"
,
hr
);
ok
(
en_vscroll_sent
==
1
,
"got %d
\n
"
,
en_vscroll_sent
);
hr
=
ITextServices_TxSendMessage
(
txtserv
,
WM_VSCROLL
,
SB_BOTTOM
,
0
,
&
res
);
ok
(
hr
==
S_OK
,
"got %08x
\n
"
,
hr
);
ok
(
en_vscroll_sent
==
2
,
"got %d
\n
"
,
en_vscroll_sent
);
/* but not when the thumb is moved */
hr
=
ITextServices_TxSendMessage
(
txtserv
,
WM_VSCROLL
,
MAKEWPARAM
(
SB_THUMBTRACK
,
0
),
0
,
&
res
);
ok
(
hr
==
S_OK
,
"got %08x
\n
"
,
hr
);
hr
=
ITextServices_TxSendMessage
(
txtserv
,
WM_VSCROLL
,
MAKEWPARAM
(
SB_THUMBPOSITION
,
0
),
0
,
&
res
);
ok
(
hr
==
S_OK
,
"got %08x
\n
"
,
hr
);
ok
(
en_vscroll_sent
==
2
,
"got %d
\n
"
,
en_vscroll_sent
);
DestroyWindow
(
host_impl
->
window
);
ITextServices_Release
(
txtserv
);
ITextHost_Release
(
host
);
}
START_TEST
(
txtsrv
)
{
ITextServices
*
txtserv
;
...
...
@@ -1132,6 +1189,7 @@ START_TEST( txtsrv )
test_QueryInterface
();
test_default_format
();
test_TxGetScroll
();
test_notifications
();
}
if
(
wrapperCodeMem
)
VirtualFree
(
wrapperCodeMem
,
0
,
MEM_RELEASE
);
}
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