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
c4b44245
Commit
c4b44245
authored
Mar 22, 2006
by
Huw Davies
Committed by
Alexandre Julliard
Mar 22, 2006
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
user32: Only adjust the margins if the edit control is above a certain size.
parent
15a2169e
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
130 additions
and
8 deletions
+130
-8
edit.c
dlls/user/edit.c
+29
-6
edit.c
dlls/user/tests/edit.c
+101
-2
No files found.
dlls/user/edit.c
View file @
c4b44245
...
...
@@ -246,7 +246,7 @@ static void EDIT_EM_ScrollCaret(EDITSTATE *es);
static
void
EDIT_EM_SetHandle
(
EDITSTATE
*
es
,
HLOCAL
hloc
);
static
void
EDIT_EM_SetHandle16
(
EDITSTATE
*
es
,
HLOCAL16
hloc
);
static
void
EDIT_EM_SetLimitText
(
EDITSTATE
*
es
,
INT
limit
);
static
void
EDIT_EM_SetMargins
(
EDITSTATE
*
es
,
INT
action
,
INT
left
,
INT
right
,
BOOL
repaint
);
static
void
EDIT_EM_SetMargins
(
EDITSTATE
*
es
,
INT
action
,
WORD
left
,
WORD
right
,
BOOL
repaint
);
static
void
EDIT_EM_SetPasswordChar
(
EDITSTATE
*
es
,
WCHAR
c
);
static
void
EDIT_EM_SetSel
(
EDITSTATE
*
es
,
UINT
start
,
UINT
end
,
BOOL
after_wrap
);
static
BOOL
EDIT_EM_SetTabStops
(
EDITSTATE
*
es
,
INT
count
,
LPINT
tabs
);
...
...
@@ -747,7 +747,7 @@ static LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg,
/* The following EM_xxx are new to win95 and don't exist for 16 bit */
case
EM_SETMARGINS
:
EDIT_EM_SetMargins
(
es
,
(
INT
)
wParam
,
(
short
)
LOWORD
(
lParam
),
(
short
)
HIWORD
(
lParam
),
TRUE
);
EDIT_EM_SetMargins
(
es
,
(
INT
)
wParam
,
LOWORD
(
lParam
),
HIWORD
(
lParam
),
TRUE
);
break
;
case
EM_GETMARGINS
:
...
...
@@ -2326,7 +2326,7 @@ static void EDIT_SetCaretPos(EDITSTATE *es, INT pos,
static
void
EDIT_AdjustFormatRect
(
EDITSTATE
*
es
)
{
RECT
ClientRect
;
es
->
format_rect
.
right
=
max
(
es
->
format_rect
.
right
,
es
->
format_rect
.
left
+
es
->
char_width
);
if
(
es
->
style
&
ES_MULTILINE
)
{
...
...
@@ -3660,9 +3660,24 @@ static void EDIT_EM_SetLimitText(EDITSTATE *es, INT limit)
* of the char's width as the margin, but this is not how Windows handles this.
* For all other fonts Windows sets the margins to zero.
*
* FIXME - When EC_USEFONTINFO is used the margins only change if the
* edit control is equal to or larger than a certain size.
* Interestingly if one subtracts both the left and right margins from
* this size one always seems to get an even number. The extents of
* the (four character) string "'**'" match this quite closely, so
* we'll use this until we come up with a better idea.
*/
static
int
calc_min_set_margin_size
(
HDC
dc
,
INT
left
,
INT
right
)
{
WCHAR
magic_string
[]
=
{
'\''
,
'*'
,
'*'
,
'\''
,
0
};
SIZE
sz
;
GetTextExtentPointW
(
dc
,
magic_string
,
sizeof
(
magic_string
)
/
sizeof
(
WCHAR
)
-
1
,
&
sz
);
return
sz
.
cx
+
left
+
right
;
}
static
void
EDIT_EM_SetMargins
(
EDITSTATE
*
es
,
INT
action
,
INT
left
,
INT
right
,
BOOL
repaint
)
WORD
left
,
WORD
right
,
BOOL
repaint
)
{
TEXTMETRICW
tm
;
INT
default_left_margin
=
0
;
/* in pixels */
...
...
@@ -3675,9 +3690,17 @@ static void EDIT_EM_SetMargins(EDITSTATE *es, INT action,
GetTextMetricsW
(
dc
,
&
tm
);
/* The default margins are only non zero for TrueType or Vector fonts */
if
(
tm
.
tmPitchAndFamily
&
(
TMPF_VECTOR
|
TMPF_TRUETYPE
))
{
int
min_size
;
RECT
rc
;
/* This must be calculated more exactly! But how? */
default_left_margin
=
tm
.
tmAveCharWidth
/
3
;
default_right_margin
=
tm
.
tmAveCharWidth
/
3
;
default_left_margin
=
tm
.
tmAveCharWidth
/
2
;
default_right_margin
=
tm
.
tmAveCharWidth
/
2
;
min_size
=
calc_min_set_margin_size
(
dc
,
default_left_margin
,
default_right_margin
);
GetClientRect
(
es
->
hwndSelf
,
&
rc
);
if
(
rc
.
right
-
rc
.
left
<
min_size
)
{
default_left_margin
=
es
->
left_margin
;
default_right_margin
=
es
->
right_margin
;
}
}
SelectObject
(
dc
,
old_font
);
ReleaseDC
(
es
->
hwndSelf
,
dc
);
...
...
dlls/user/tests/edit.c
View file @
c4b44245
...
...
@@ -760,10 +760,108 @@ static void test_margins(void)
ok
(
new_rect
.
right
==
old_rect
.
right
,
"The right border of the rectangle has changed
\n
"
);
ok
(
new_rect
.
top
==
old_rect
.
top
,
"The top border of the rectangle has changed
\n
"
);
ok
(
new_rect
.
bottom
==
old_rect
.
bottom
,
"The bottom border of the rectangle has changed
\n
"
);
DestroyWindow
(
hwEdit
);
}
static
INT
CALLBACK
find_font_proc
(
const
LOGFONT
*
elf
,
const
TEXTMETRIC
*
ntm
,
DWORD
type
,
LPARAM
lParam
)
{
return
0
;
}
static
void
test_margins_font_change
(
void
)
{
HWND
hwEdit
;
DWORD
margins
,
font_margins
;
LOGFONT
lf
;
HFONT
hfont
,
hfont2
;
HDC
hdc
=
GetDC
(
0
);
if
(
EnumFontFamiliesA
(
hdc
,
"Arial"
,
find_font_proc
,
0
))
{
trace
(
"Arial not found - skipping font change margin tests
\n
"
);
ReleaseDC
(
0
,
hdc
);
return
;
}
ReleaseDC
(
0
,
hdc
);
hwEdit
=
create_child_editcontrol
(
0
,
0
);
SetWindowPos
(
hwEdit
,
NULL
,
10
,
10
,
1000
,
100
,
SWP_NOZORDER
|
SWP_NOACTIVATE
);
memset
(
&
lf
,
0
,
sizeof
(
lf
));
strcpy
(
lf
.
lfFaceName
,
"Arial"
);
lf
.
lfHeight
=
16
;
lf
.
lfCharSet
=
DEFAULT_CHARSET
;
hfont
=
CreateFontIndirectA
(
&
lf
);
lf
.
lfHeight
=
30
;
hfont2
=
CreateFontIndirectA
(
&
lf
);
SendMessageA
(
hwEdit
,
WM_SETFONT
,
(
WPARAM
)
hfont
,
0
);
font_margins
=
SendMessage
(
hwEdit
,
EM_GETMARGINS
,
0
,
0
);
ok
(
LOWORD
(
font_margins
)
!=
0
,
"got %d
\n
"
,
LOWORD
(
font_margins
));
ok
(
HIWORD
(
font_margins
)
!=
0
,
"got %d
\n
"
,
HIWORD
(
font_margins
));
/* With 'small' edit controls, test that the margin doesn't get set */
SetWindowPos
(
hwEdit
,
NULL
,
10
,
10
,
16
,
100
,
SWP_NOZORDER
|
SWP_NOACTIVATE
);
SendMessageA
(
hwEdit
,
EM_SETMARGINS
,
EC_LEFTMARGIN
|
EC_RIGHTMARGIN
,
MAKELONG
(
0
,
0
));
SendMessageA
(
hwEdit
,
WM_SETFONT
,
(
WPARAM
)
hfont
,
0
);
margins
=
SendMessage
(
hwEdit
,
EM_GETMARGINS
,
0
,
0
);
ok
(
LOWORD
(
margins
)
==
0
,
"got %d
\n
"
,
LOWORD
(
margins
));
ok
(
HIWORD
(
margins
)
==
0
,
"got %d
\n
"
,
HIWORD
(
margins
));
SendMessageA
(
hwEdit
,
EM_SETMARGINS
,
EC_LEFTMARGIN
|
EC_RIGHTMARGIN
,
MAKELONG
(
1
,
0
));
SendMessageA
(
hwEdit
,
WM_SETFONT
,
(
WPARAM
)
hfont
,
0
);
margins
=
SendMessage
(
hwEdit
,
EM_GETMARGINS
,
0
,
0
);
ok
(
LOWORD
(
margins
)
==
1
,
"got %d
\n
"
,
LOWORD
(
margins
));
ok
(
HIWORD
(
margins
)
==
0
,
"got %d
\n
"
,
HIWORD
(
margins
));
SendMessageA
(
hwEdit
,
EM_SETMARGINS
,
EC_LEFTMARGIN
|
EC_RIGHTMARGIN
,
MAKELONG
(
1
,
1
));
SendMessageA
(
hwEdit
,
WM_SETFONT
,
(
WPARAM
)
hfont
,
0
);
margins
=
SendMessage
(
hwEdit
,
EM_GETMARGINS
,
0
,
0
);
ok
(
LOWORD
(
margins
)
==
1
,
"got %d
\n
"
,
LOWORD
(
margins
));
ok
(
HIWORD
(
margins
)
==
1
,
"got %d
\n
"
,
HIWORD
(
margins
));
SendMessageA
(
hwEdit
,
EM_SETMARGINS
,
EC_LEFTMARGIN
|
EC_RIGHTMARGIN
,
MAKELONG
(
EC_USEFONTINFO
,
EC_USEFONTINFO
));
margins
=
SendMessage
(
hwEdit
,
EM_GETMARGINS
,
0
,
0
);
ok
(
LOWORD
(
margins
)
==
1
,
"got %d
\n
"
,
LOWORD
(
margins
));
ok
(
HIWORD
(
margins
)
==
1
,
"got %d
\n
"
,
HIWORD
(
margins
));
SendMessageA
(
hwEdit
,
WM_SETFONT
,
(
WPARAM
)
hfont2
,
0
);
margins
=
SendMessage
(
hwEdit
,
EM_GETMARGINS
,
0
,
0
);
ok
(
LOWORD
(
margins
)
==
1
,
"got %d
\n
"
,
LOWORD
(
margins
));
ok
(
HIWORD
(
margins
)
==
1
,
"got %d
\n
"
,
HIWORD
(
margins
));
/* Above a certain size threshold then the margin is updated */
SetWindowPos
(
hwEdit
,
NULL
,
10
,
10
,
1000
,
100
,
SWP_NOZORDER
|
SWP_NOACTIVATE
);
SendMessageA
(
hwEdit
,
EM_SETMARGINS
,
EC_LEFTMARGIN
|
EC_RIGHTMARGIN
,
MAKELONG
(
1
,
0
));
SendMessageA
(
hwEdit
,
WM_SETFONT
,
(
WPARAM
)
hfont
,
0
);
margins
=
SendMessage
(
hwEdit
,
EM_GETMARGINS
,
0
,
0
);
ok
(
LOWORD
(
margins
)
==
LOWORD
(
font_margins
),
"got %d
\n
"
,
LOWORD
(
margins
));
ok
(
HIWORD
(
margins
)
==
HIWORD
(
font_margins
),
"got %d
\n
"
,
HIWORD
(
margins
));
SendMessageA
(
hwEdit
,
EM_SETMARGINS
,
EC_LEFTMARGIN
|
EC_RIGHTMARGIN
,
MAKELONG
(
1
,
1
));
SendMessageA
(
hwEdit
,
WM_SETFONT
,
(
WPARAM
)
hfont
,
0
);
margins
=
SendMessage
(
hwEdit
,
EM_GETMARGINS
,
0
,
0
);
ok
(
LOWORD
(
margins
)
==
LOWORD
(
font_margins
),
"got %d
\n
"
,
LOWORD
(
margins
));
ok
(
HIWORD
(
margins
)
==
HIWORD
(
font_margins
),
"got %d
\n
"
,
HIWORD
(
margins
));
SendMessageA
(
hwEdit
,
EM_SETMARGINS
,
EC_LEFTMARGIN
|
EC_RIGHTMARGIN
,
MAKELONG
(
EC_USEFONTINFO
,
EC_USEFONTINFO
));
margins
=
SendMessage
(
hwEdit
,
EM_GETMARGINS
,
0
,
0
);
ok
(
LOWORD
(
margins
)
==
LOWORD
(
font_margins
),
"got %d
\n
"
,
LOWORD
(
margins
));
ok
(
HIWORD
(
margins
)
==
HIWORD
(
font_margins
),
"got %d
\n
"
,
HIWORD
(
margins
));
SendMessageA
(
hwEdit
,
WM_SETFONT
,
(
WPARAM
)
hfont2
,
0
);
margins
=
SendMessage
(
hwEdit
,
EM_GETMARGINS
,
0
,
0
);
ok
(
LOWORD
(
margins
)
!=
LOWORD
(
font_margins
),
"got %d
\n
"
,
LOWORD
(
margins
));
ok
(
HIWORD
(
margins
)
!=
HIWORD
(
font_margins
),
"got %d
\n
"
,
HIWORD
(
margins
));
SendMessageA
(
hwEdit
,
WM_SETFONT
,
0
,
0
);
DeleteObject
(
hfont2
);
DeleteObject
(
hfont
);
destroy_child_editcontrol
(
hwEdit
);
}
#define edit_pos_ok(exp, got, txt) \
ok(exp == got, "wrong " #txt " expected %d got %ld\n", exp, got);
...
...
@@ -968,7 +1066,8 @@ START_TEST(edit)
test_edit_control_4
();
test_edit_control_5
();
test_margins
();
test_margins_font_change
();
test_text_position
();
UnregisterWindowClasses
();
}
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