mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-15 05:29:51 +00:00
winemac: Use unixlib interface for macdrv_ime_query_char_rect.
Signed-off-by: Jacek Caban <jacek@codeweavers.com>
This commit is contained in:
parent
7fa47e47c9
commit
8bfe37c880
|
@ -29,6 +29,7 @@ HMODULE macdrv_module = 0;
|
|||
typedef NTSTATUS (WINAPI *kernel_callback)(void *params, ULONG size);
|
||||
static const kernel_callback kernel_callbacks[] =
|
||||
{
|
||||
macdrv_ime_query_char_rect,
|
||||
macdrv_ime_set_text,
|
||||
};
|
||||
|
||||
|
|
|
@ -179,6 +179,38 @@ static void macdrv_sent_text_input(const macdrv_event *event)
|
|||
}
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* query_ime_char_rect
|
||||
*/
|
||||
BOOL query_ime_char_rect(macdrv_query* query)
|
||||
{
|
||||
HWND hwnd = macdrv_get_window_hwnd(query->window);
|
||||
void *himc = query->ime_char_rect.data;
|
||||
CFRange *range = &query->ime_char_rect.range;
|
||||
CGRect *rect = &query->ime_char_rect.rect;
|
||||
struct ime_query_char_rect_result result = {0};
|
||||
struct ime_query_char_rect_params params;
|
||||
BOOL ret;
|
||||
|
||||
TRACE_(imm)("win %p/%p himc %p range %ld-%ld\n", hwnd, query->window, himc, range->location,
|
||||
range->length);
|
||||
|
||||
params.hwnd = hwnd;
|
||||
params.data = himc;
|
||||
params.result = &result;
|
||||
params.location = range->location;
|
||||
params.length = range->length;
|
||||
ret = macdrv_client_func(client_func_ime_query_char_rect, ¶ms, sizeof(params));
|
||||
*range = CFRangeMake(result.location, result.length);
|
||||
*rect = cgrect_from_rect(result.rect);
|
||||
|
||||
TRACE_(imm)(" -> %s range %ld-%ld rect %s\n", ret ? "TRUE" : "FALSE", range->location,
|
||||
range->length, wine_dbgstr_cgrect(*rect));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* macdrv_query_event
|
||||
*
|
||||
|
|
|
@ -1438,43 +1438,42 @@ NTSTATUS WINAPI macdrv_ime_set_text(void *arg, ULONG size)
|
|||
}
|
||||
|
||||
/**************************************************************************
|
||||
* query_ime_char_rect
|
||||
* macdrv_ime_query_char_rect
|
||||
*/
|
||||
BOOL query_ime_char_rect(macdrv_query* query)
|
||||
NTSTATUS WINAPI macdrv_ime_query_char_rect(void *arg, ULONG size)
|
||||
{
|
||||
HWND hwnd = macdrv_get_window_hwnd(query->window);
|
||||
void *himc = query->ime_char_rect.data;
|
||||
CFRange* range = &query->ime_char_rect.range;
|
||||
CGRect* rect = &query->ime_char_rect.rect;
|
||||
struct ime_query_char_rect_params *params = arg;
|
||||
struct ime_query_char_rect_result *result = params->result;
|
||||
void *himc = params->data;
|
||||
IMECHARPOSITION charpos;
|
||||
BOOL ret = FALSE;
|
||||
|
||||
TRACE("win %p/%p himc %p range %ld-%ld\n", hwnd, query->window, himc, range->location,
|
||||
range->length);
|
||||
result->location = params->location;
|
||||
result->length = params->length;
|
||||
|
||||
if (!himc) himc = RealIMC(FROM_MACDRV);
|
||||
|
||||
charpos.dwSize = sizeof(charpos);
|
||||
charpos.dwCharPos = range->location;
|
||||
charpos.dwCharPos = params->location;
|
||||
if (ImmRequestMessageW(himc, IMR_QUERYCHARPOSITION, (ULONG_PTR)&charpos))
|
||||
{
|
||||
int i;
|
||||
|
||||
*rect = CGRectMake(charpos.pt.x, charpos.pt.y, 0, charpos.cLineHeight);
|
||||
SetRect(&result->rect, charpos.pt.x, charpos.pt.y, 0, charpos.pt.y + charpos.cLineHeight);
|
||||
|
||||
/* iterate over rest of length to extend rect */
|
||||
for (i = 1; i < range->length; i++)
|
||||
for (i = 1; i < params->length; i++)
|
||||
{
|
||||
charpos.dwSize = sizeof(charpos);
|
||||
charpos.dwCharPos = range->location + i;
|
||||
charpos.dwCharPos = params->location + i;
|
||||
if (!ImmRequestMessageW(himc, IMR_QUERYCHARPOSITION, (ULONG_PTR)&charpos) ||
|
||||
charpos.pt.y != rect->origin.y)
|
||||
charpos.pt.y != result->rect.top)
|
||||
{
|
||||
range->length = i;
|
||||
result->length = i;
|
||||
break;
|
||||
}
|
||||
|
||||
rect->size.width = charpos.pt.x - rect->origin.x;
|
||||
result->rect.right = charpos.pt.x;
|
||||
}
|
||||
|
||||
ret = TRUE;
|
||||
|
@ -1501,15 +1500,15 @@ BOOL query_ime_char_rect(macdrv_query* query)
|
|||
if (private->textfont)
|
||||
oldfont = SelectObject(dc, private->textfont);
|
||||
|
||||
if (range->location > compstr->dwCompStrLen)
|
||||
range->location = compstr->dwCompStrLen;
|
||||
if (range->location + range->length > compstr->dwCompStrLen)
|
||||
range->length = compstr->dwCompStrLen - range->location;
|
||||
if (result->location > compstr->dwCompStrLen)
|
||||
result->location = compstr->dwCompStrLen;
|
||||
if (result->location + result->length > compstr->dwCompStrLen)
|
||||
result->length = compstr->dwCompStrLen - result->location;
|
||||
|
||||
GetTextExtentPoint32W(dc, str, range->location, &size);
|
||||
GetTextExtentPoint32W(dc, str, result->location, &size);
|
||||
charpos.rcDocument.left = size.cx;
|
||||
charpos.rcDocument.top = 0;
|
||||
GetTextExtentPoint32W(dc, str, range->location + range->length, &size);
|
||||
GetTextExtentPoint32W(dc, str, result->location + result->length, &size);
|
||||
charpos.rcDocument.right = size.cx;
|
||||
charpos.rcDocument.bottom = size.cy;
|
||||
|
||||
|
@ -1518,7 +1517,7 @@ BOOL query_ime_char_rect(macdrv_query* query)
|
|||
|
||||
LPtoDP(dc, (POINT*)&charpos.rcDocument, 2);
|
||||
MapWindowPoints(private->hwndDefault, 0, (POINT*)&charpos.rcDocument, 2);
|
||||
*rect = cgrect_from_rect(charpos.rcDocument);
|
||||
result->rect = charpos.rcDocument;
|
||||
ret = TRUE;
|
||||
|
||||
if (oldfont)
|
||||
|
@ -1540,16 +1539,13 @@ BOOL query_ime_char_rect(macdrv_query* query)
|
|||
if (GetGUIThreadInfo(0, >i))
|
||||
{
|
||||
MapWindowPoints(gti.hwndCaret, 0, (POINT*)>i.rcCaret, 2);
|
||||
*rect = cgrect_from_rect(gti.rcCaret);
|
||||
result->rect = gti.rcCaret;
|
||||
ret = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret && range->length && !rect->size.width)
|
||||
rect->size.width = 1;
|
||||
|
||||
TRACE(" -> %s range %ld-%ld rect %s\n", ret ? "TRUE" : "FALSE", range->location,
|
||||
range->length, wine_dbgstr_cgrect(*rect));
|
||||
if (ret && result->length && result->rect.left == result->rect.right)
|
||||
result->rect.right++;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -290,7 +290,7 @@ extern CGImageRef create_cgimage_from_icon_bitmaps(HDC hdc, HANDLE icon, HBITMAP
|
|||
extern NTSTATUS macdrv_ime_process_text_input(void *arg) DECLSPEC_HIDDEN;
|
||||
|
||||
extern NTSTATUS WINAPI macdrv_ime_set_text(void *params, ULONG size) DECLSPEC_HIDDEN;
|
||||
extern BOOL query_ime_char_rect(macdrv_query* query) DECLSPEC_HIDDEN;
|
||||
extern NTSTATUS WINAPI macdrv_ime_query_char_rect(void *params, ULONG size) DECLSPEC_HIDDEN;
|
||||
|
||||
/* unixlib interface */
|
||||
|
||||
|
|
|
@ -66,10 +66,29 @@
|
|||
/* driver client callbacks exposed with KernelCallbackTable interface */
|
||||
enum macdrv_client_funcs
|
||||
{
|
||||
client_func_ime_set_text = NtUserDriverCallbackFirst,
|
||||
client_func_ime_query_char_rect = NtUserDriverCallbackFirst,
|
||||
client_func_ime_set_text,
|
||||
client_func_last
|
||||
};
|
||||
|
||||
/* macdrv_ime_query_char_rect result */
|
||||
struct ime_query_char_rect_result
|
||||
{
|
||||
RECT rect;
|
||||
UINT32 location;
|
||||
UINT32 length;
|
||||
};
|
||||
|
||||
/* macdrv_ime_query_char_rect params */
|
||||
struct ime_query_char_rect_params
|
||||
{
|
||||
HWND hwnd;
|
||||
void *data;
|
||||
UINT32 location;
|
||||
UINT32 length;
|
||||
struct ime_query_char_rect_result *result; /* FIXME: Use NtCallbackReturn instead */
|
||||
};
|
||||
|
||||
/* macdrv_ime_set_text params */
|
||||
struct ime_set_text_params
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue