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
8544242f
Commit
8544242f
authored
Mar 16, 2021
by
Huw Davies
Committed by
Alexandre Julliard
Mar 16, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
riched20: Handle the read-only property setting in the host.
Signed-off-by:
Huw Davies
<
huw@codeweavers.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
23ffd0a7
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
83 additions
and
43 deletions
+83
-43
editor.c
dlls/riched20/editor.c
+21
-28
editstr.h
dlls/riched20/editstr.h
+1
-0
txthost.c
dlls/riched20/txthost.c
+55
-12
txtsrv.c
dlls/riched20/txtsrv.c
+6
-3
No files found.
dlls/riched20/editor.c
View file @
8544242f
...
...
@@ -2279,10 +2279,9 @@ static BOOL paste_special(ME_TextEditor *editor, UINT cf, REPASTESPECIAL *ps, BO
IDataObject
*
data
;
/* Protect read-only edit control from modification */
if
(
editor
->
styleFlags
&
ES
_READONLY
)
if
(
editor
->
props
&
TXTBIT
_READONLY
)
{
if
(
!
check_only
)
MessageBeep
(
MB_ICONERROR
);
if
(
!
check_only
)
MessageBeep
(
MB_ICONERROR
);
return
FALSE
;
}
...
...
@@ -2354,7 +2353,7 @@ HRESULT editor_copy_or_cut( ME_TextEditor *editor, BOOL cut, ME_Cursor *start, i
{
HRESULT
hr
;
if
(
cut
&&
(
editor
->
styleFlags
&
ES
_READONLY
))
if
(
cut
&&
(
editor
->
props
&
TXTBIT
_READONLY
))
{
return
E_ACCESSDENIED
;
}
...
...
@@ -2469,7 +2468,7 @@ static BOOL handle_enter(ME_TextEditor *editor)
int
from
,
to
;
ME_Style
*
style
,
*
eop_style
;
if
(
editor
->
styleFlags
&
ES
_READONLY
)
if
(
editor
->
props
&
TXTBIT
_READONLY
)
{
MessageBeep
(
MB_ICONERROR
);
return
TRUE
;
...
...
@@ -2631,7 +2630,7 @@ ME_KeyDown(ME_TextEditor *editor, WORD nKey)
case
VK_DELETE
:
editor
->
nUDArrowX
=
-
1
;
/* FIXME backspace and delete aren't the same, they act different wrt paragraph style of the merged paragraph */
if
(
editor
->
styleFlags
&
ES
_READONLY
)
if
(
editor
->
props
&
TXTBIT
_READONLY
)
return
FALSE
;
if
(
ME_IsSelection
(
editor
))
{
...
...
@@ -2738,7 +2737,7 @@ static LRESULT handle_wm_char( ME_TextEditor *editor, WCHAR wstr, LPARAM flags )
if
(
editor
->
bMouseCaptured
)
return
0
;
if
(
editor
->
styleFlags
&
ES
_READONLY
)
if
(
editor
->
props
&
TXTBIT
_READONLY
)
{
MessageBeep
(
MB_ICONERROR
);
return
0
;
/* FIXME really 0 ? */
...
...
@@ -3035,7 +3034,6 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
{
ME_TextEditor
*
ed
=
heap_alloc
(
sizeof
(
*
ed
));
int
i
;
DWORD
props
;
LONG
selbarwidth
;
ed
->
hWnd
=
NULL
;
...
...
@@ -3047,13 +3045,10 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
ed
->
styleFlags
=
0
;
ed
->
exStyleFlags
=
0
;
ed
->
total_rows
=
0
;
ITextHost_TxGetPropertyBits
(
texthost
,
(
TXTBIT_RICHTEXT
|
TXTBIT_MULTILINE
|
TXTBIT_READONLY
|
TXTBIT_USEPASSWORD
|
TXTBIT_HIDESELECTION
|
TXTBIT_SAVESELECTION
|
TXTBIT_AUTOWORDSEL
|
TXTBIT_VERTICAL
|
TXTBIT_WORDWRAP
|
TXTBIT_DISABLEDRAG
),
&
props
);
ITextHost_TxGetPropertyBits
(
texthost
,
TXTBIT_RICHTEXT
|
TXTBIT_MULTILINE
|
TXTBIT_READONLY
|
TXTBIT_USEPASSWORD
|
TXTBIT_HIDESELECTION
|
TXTBIT_SAVESELECTION
|
TXTBIT_AUTOWORDSEL
|
TXTBIT_VERTICAL
|
TXTBIT_WORDWRAP
|
TXTBIT_DISABLEDRAG
,
&
ed
->
props
);
ITextHost_TxGetScrollBars
(
texthost
,
&
ed
->
styleFlags
);
ed
->
styleFlags
&=
(
WS_VSCROLL
|
WS_HSCROLL
|
ES_AUTOVSCROLL
|
ES_AUTOHSCROLL
|
ES_DISABLENOSCROLL
);
...
...
@@ -3094,7 +3089,7 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
ed
->
pfnWordBreak
=
NULL
;
ed
->
lpOleCallback
=
NULL
;
ed
->
mode
=
TM_MULTILEVELUNDO
|
TM_MULTICODEPAGE
;
ed
->
mode
|=
(
props
&
TXTBIT_RICHTEXT
)
?
TM_RICHTEXT
:
TM_PLAINTEXT
;
ed
->
mode
|=
(
ed
->
props
&
TXTBIT_RICHTEXT
)
?
TM_RICHTEXT
:
TM_PLAINTEXT
;
ed
->
AutoURLDetect_bEnable
=
FALSE
;
ed
->
bHaveFocus
=
FALSE
;
ed
->
bDialogMode
=
FALSE
;
...
...
@@ -3122,26 +3117,24 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
ed
->
nSelectionType
=
stPosition
;
ed
->
cPasswordMask
=
0
;
if
(
props
&
TXTBIT_USEPASSWORD
)
if
(
ed
->
props
&
TXTBIT_USEPASSWORD
)
ITextHost_TxGetPasswordChar
(
texthost
,
&
ed
->
cPasswordMask
);
if
(
props
&
TXTBIT_AUTOWORDSEL
)
if
(
ed
->
props
&
TXTBIT_AUTOWORDSEL
)
ed
->
styleFlags
|=
ECO_AUTOWORDSELECTION
;
if
(
props
&
TXTBIT_MULTILINE
)
{
if
(
ed
->
props
&
TXTBIT_MULTILINE
)
{
ed
->
styleFlags
|=
ES_MULTILINE
;
ed
->
bWordWrap
=
(
props
&
TXTBIT_WORDWRAP
)
!=
0
;
ed
->
bWordWrap
=
(
ed
->
props
&
TXTBIT_WORDWRAP
)
!=
0
;
}
else
{
ed
->
bWordWrap
=
FALSE
;
}
if
(
props
&
TXTBIT_READONLY
)
ed
->
styleFlags
|=
ES_READONLY
;
if
(
!
(
props
&
TXTBIT_HIDESELECTION
))
if
(
!
(
ed
->
props
&
TXTBIT_HIDESELECTION
))
ed
->
styleFlags
|=
ES_NOHIDESEL
;
if
(
props
&
TXTBIT_SAVESELECTION
)
if
(
ed
->
props
&
TXTBIT_SAVESELECTION
)
ed
->
styleFlags
|=
ES_SAVESEL
;
if
(
props
&
TXTBIT_VERTICAL
)
if
(
ed
->
props
&
TXTBIT_VERTICAL
)
ed
->
styleFlags
|=
ES_VERTICAL
;
if
(
props
&
TXTBIT_DISABLEDRAG
)
if
(
ed
->
props
&
TXTBIT_DISABLEDRAG
)
ed
->
styleFlags
|=
ES_NOOLEDRAGDROP
;
ed
->
notified_cr
.
cpMin
=
ed
->
notified_cr
.
cpMax
=
0
;
...
...
@@ -3502,7 +3495,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
{
/* these flags are equivalent to the ES_* counterparts */
DWORD
mask
=
ECO_VERTICAL
|
ECO_AUTOHSCROLL
|
ECO_AUTOVSCROLL
|
ECO_NOHIDESEL
|
ECO_
READONLY
|
ECO_
WANTRETURN
|
ECO_SELECTIONBAR
;
ECO_NOHIDESEL
|
ECO_WANTRETURN
|
ECO_SELECTIONBAR
;
DWORD
settings
=
editor
->
styleFlags
&
mask
;
return
settings
;
...
...
@@ -3554,7 +3547,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
* ECO_AUTOWORDSELECTION that doesn't have an ES_* counterpart,
* but is still stored in editor->styleFlags. */
const
DWORD
mask
=
ECO_VERTICAL
|
ECO_AUTOHSCROLL
|
ECO_AUTOVSCROLL
|
ECO_NOHIDESEL
|
ECO_
READONLY
|
ECO_
WANTRETURN
|
ECO_NOHIDESEL
|
ECO_WANTRETURN
|
ECO_SELECTIONBAR
|
ECO_AUTOWORDSELECTION
;
DWORD
settings
=
mask
&
editor
->
styleFlags
;
DWORD
oldSettings
=
settings
;
...
...
dlls/riched20/editstr.h
View file @
8544242f
...
...
@@ -385,6 +385,7 @@ typedef struct tagME_TextEditor
ME_Cursor
*
pCursors
;
DWORD
styleFlags
;
DWORD
exStyleFlags
;
DWORD
props
;
int
nCursors
;
SIZE
sizeWindow
;
int
nTotalLength
,
nLastTotalLength
;
...
...
dlls/riched20/txthost.c
View file @
8544242f
...
...
@@ -775,12 +775,59 @@ static HRESULT get_text_rangeA( struct host *host, TEXTRANGEA *rangeA, LRESULT *
return
hr
;
}
static
HRESULT
set_options
(
struct
host
*
host
,
DWORD
op
,
DWORD
value
,
LRESULT
*
res
)
{
DWORD
style
,
old_options
,
new_options
,
change
,
props_mask
=
0
;
const
DWORD
mask
=
ECO_AUTOVSCROLL
|
ECO_AUTOHSCROLL
|
ECO_NOHIDESEL
|
ECO_READONLY
|
ECO_WANTRETURN
|
ECO_SELECTIONBAR
|
ECO_VERTICAL
;
const
DWORD
host_mask
=
ECO_READONLY
;
HRESULT
hr
=
S_OK
;
new_options
=
old_options
=
SendMessageW
(
host
->
window
,
EM_GETOPTIONS
,
0
,
0
);
switch
(
op
)
{
case
ECOOP_SET
:
new_options
=
value
;
break
;
case
ECOOP_OR
:
new_options
|=
value
;
break
;
case
ECOOP_AND
:
new_options
&=
value
;
break
;
case
ECOOP_XOR
:
new_options
^=
value
;
}
new_options
&=
mask
;
change
=
(
new_options
^
old_options
);
if
(
change
&
ECO_READONLY
)
{
host
->
props
^=
TXTBIT_READONLY
;
props_mask
|=
TXTBIT_READONLY
;
}
if
(
props_mask
)
ITextServices_OnTxPropertyBitsChange
(
host
->
text_srv
,
props_mask
,
host
->
props
&
props_mask
);
/* Handle the rest in the editor for now */
hr
=
ITextServices_TxSendMessage
(
host
->
text_srv
,
EM_SETOPTIONS
,
op
,
value
,
res
);
*
res
=
(
*
res
&
~
host_mask
)
|
(
new_options
&
host_mask
);
style
=
GetWindowLongW
(
host
->
window
,
GWL_STYLE
);
style
=
(
style
&
~
mask
)
|
(
*
res
&
mask
);
SetWindowLongW
(
host
->
window
,
GWL_STYLE
,
style
);
return
hr
;
}
static
LRESULT
RichEditWndProc_common
(
HWND
hwnd
,
UINT
msg
,
WPARAM
wparam
,
LPARAM
lparam
,
BOOL
unicode
)
{
struct
host
*
host
;
ME_TextEditor
*
editor
;
HRESULT
hr
;
HRESULT
hr
=
S_OK
;
LRESULT
res
=
0
;
TRACE
(
"enter hwnd %p msg %04x (%s) %lx %lx, unicode %d
\n
"
,
...
...
@@ -879,6 +926,11 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam,
}
break
;
}
case
EM_GETOPTIONS
:
hr
=
ITextServices_TxSendMessage
(
host
->
text_srv
,
EM_GETOPTIONS
,
0
,
0
,
&
res
);
if
(
host
->
props
&
TXTBIT_READONLY
)
res
|=
ECO_READONLY
;
break
;
case
WM_GETTEXT
:
{
GETTEXTEX
params
;
...
...
@@ -965,18 +1017,9 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam,
break
;
}
case
EM_SETOPTIONS
:
{
DWORD
style
;
const
DWORD
mask
=
ECO_VERTICAL
|
ECO_AUTOHSCROLL
|
ECO_AUTOVSCROLL
|
ECO_NOHIDESEL
|
ECO_READONLY
|
ECO_WANTRETURN
|
ECO_SELECTIONBAR
;
hr
=
set_options
(
host
,
wparam
,
lparam
,
&
res
);
break
;
res
=
ME_HandleMessage
(
editor
,
msg
,
wparam
,
lparam
,
unicode
,
&
hr
);
style
=
GetWindowLongW
(
hwnd
,
GWL_STYLE
);
style
=
(
style
&
~
mask
)
|
(
res
&
mask
);
SetWindowLongW
(
hwnd
,
GWL_STYLE
,
style
);
return
res
;
}
case
EM_SETREADONLY
:
{
DWORD
op
=
wparam
?
ECOOP_OR
:
ECOOP_AND
;
...
...
dlls/riched20/txtsrv.c
View file @
8544242f
...
...
@@ -322,12 +322,15 @@ DECLSPEC_HIDDEN HRESULT __thiscall fnTextSrv_TxGetDropTarget(ITextServices *ifac
}
DEFINE_THISCALL_WRAPPER
(
fnTextSrv_OnTxPropertyBitsChange
,
12
)
DECLSPEC_HIDDEN
HRESULT
__thiscall
fnTextSrv_OnTxPropertyBitsChange
(
ITextServices
*
iface
,
DWORD
dwMask
,
DWORD
dwBits
)
DECLSPEC_HIDDEN
HRESULT
__thiscall
fnTextSrv_OnTxPropertyBitsChange
(
ITextServices
*
iface
,
DWORD
mask
,
DWORD
bits
)
{
struct
text_services
*
services
=
impl_from_ITextServices
(
iface
);
FIXME
(
"%p: STUB
\n
"
,
services
);
return
E_NOTIMPL
;
TRACE
(
"%p, mask %08x, bits %08x
\n
"
,
services
,
mask
,
bits
);
services
->
editor
->
props
=
(
services
->
editor
->
props
&
~
mask
)
|
(
bits
&
mask
);
return
S_OK
;
}
DEFINE_THISCALL_WRAPPER
(
fnTextSrv_TxGetCachedSize
,
12
)
...
...
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