Aric Stewart : imm32:
Further tweeks to CFS_POINT and CFS_RECT placement of the default ime
window .
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Sep 10 10:17:54 CDT 2007
Module: wine
Branch: master
Commit: 7f83b940b5144f0079601e43280da06663be2159
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7f83b940b5144f0079601e43280da06663be2159
Author: Aric Stewart <aric at codeweavers.com>
Date: Wed Sep 5 13:11:51 2007 +0900
imm32: Further tweeks to CFS_POINT and CFS_RECT placement of the default ime window.
---
dlls/imm32/imm.c | 78 ++++++++++++++++++++++++++++++++++--------------------
1 files changed, 49 insertions(+), 29 deletions(-)
diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c
index 38ba65e..b95b257 100644
--- a/dlls/imm32/imm.c
+++ b/dlls/imm32/imm.c
@@ -1981,6 +1981,7 @@ static void PaintDefaultIMEWnd(HWND hwnd)
LPBYTE compdata = NULL;
HMONITOR monitor;
MONITORINFO mon_info;
+ INT offX=0, offY=0;
GetClientRect(hwnd,&rect);
FillRect(hdc, &rect, (HBRUSH)(COLOR_WINDOW + 1));
@@ -2005,24 +2006,30 @@ static void PaintDefaultIMEWnd(HWND hwnd)
pt.y = size.cy;
LPtoDP(hdc,&pt,1);
- if (root_context->IMC.cfCompForm.dwStyle == CFS_POINT ||
- root_context->IMC.cfCompForm.dwStyle == CFS_FORCE_POSITION)
+ /*
+ * How this works based on tests on windows:
+ * CFS_POINT: then we start our window at the point and grow it as large
+ * as it needs to be for the string.
+ * CFS_RECT: we still use the ptCurrentPos as a starting point and our
+ * window is only as large as we need for the string, but we do not
+ * grow such that our window exceeds the given rect. Wrapping if
+ * needed and possible. If our ptCurrentPos is outside of our rect
+ * then no window is displayed.
+ * CFS_FORCE_POSITION: appears to behave just like CFS_POINT
+ * maybe becase the default MSIME does not do any IME adjusting.
+ */
+ if (root_context->IMC.cfCompForm.dwStyle != CFS_DEFAULT)
{
POINT cpt = root_context->IMC.cfCompForm.ptCurrentPos;
ClientToScreen(root_context->IMC.hWnd,&cpt);
rect.left = cpt.x;
rect.top = cpt.y;
- rect.right = rect.left + pt.x + 20;
- rect.bottom = rect.top + pt.y + 20;
+ rect.right = rect.left + pt.x;
+ rect.bottom = rect.top + pt.y;
+ offX=offY=10;
monitor = MonitorFromPoint(cpt, MONITOR_DEFAULTTOPRIMARY);
}
- else if (root_context->IMC.cfCompForm.dwStyle == CFS_RECT)
- {
- rect = root_context->IMC.cfCompForm.rcArea;
- MapWindowPoints( root_context->IMC.hWnd, 0, (POINT *)&rect, 2 );
- monitor = MonitorFromRect(&rect, MONITOR_DEFAULTTOPRIMARY);
- }
- else
+ else /* CFS_DEFAULT */
{
/* Windows places the default IME window in the bottom left */
HWND target = root_context->IMC.hWnd;
@@ -2032,34 +2039,47 @@ static void PaintDefaultIMEWnd(HWND hwnd)
rect.top = rect.bottom;
rect.right = rect.left + pt.x + 20;
rect.bottom = rect.top + pt.y + 20;
+ offX=offY=10;
monitor = MonitorFromWindow(target, MONITOR_DEFAULTTOPRIMARY);
}
- /* make sure we are on the desktop */
- mon_info.cbSize = sizeof(mon_info);
- GetMonitorInfoW(monitor, &mon_info);
-
- if (rect.bottom > mon_info.rcWork.bottom)
- {
- int shift = rect.bottom - mon_info.rcWork.bottom;
- rect.top -= shift;
- rect.bottom -= shift;
- }
- if (rect.left < 0)
+ if (root_context->IMC.cfCompForm.dwStyle == CFS_RECT)
{
- rect.right -= rect.left;
- rect.left = 0;
+ RECT client;
+ client =root_context->IMC.cfCompForm.rcArea;
+ MapWindowPoints( root_context->IMC.hWnd, 0, (POINT *)&client, 2 );
+ IntersectRect(&rect,&rect,&client);
+ /* TODO: Wrap the input if needed */
}
- if (rect.right > mon_info.rcWork.right)
+
+ if (root_context->IMC.cfCompForm.dwStyle == CFS_DEFAULT)
{
- int shift = rect.right - mon_info.rcWork.right;
- rect.left -= shift;
- rect.right -= shift;
+ /* make sure we are on the desktop */
+ mon_info.cbSize = sizeof(mon_info);
+ GetMonitorInfoW(monitor, &mon_info);
+
+ if (rect.bottom > mon_info.rcWork.bottom)
+ {
+ int shift = rect.bottom - mon_info.rcWork.bottom;
+ rect.top -= shift;
+ rect.bottom -= shift;
+ }
+ if (rect.left < 0)
+ {
+ rect.right -= rect.left;
+ rect.left = 0;
+ }
+ if (rect.right > mon_info.rcWork.right)
+ {
+ int shift = rect.right - mon_info.rcWork.right;
+ rect.left -= shift;
+ rect.right -= shift;
+ }
}
SetWindowPos(hwnd, HWND_TOPMOST, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOACTIVATE);
- TextOutW(hdc, 10,10, CompString, compstr->dwCompStrLen);
+ TextOutW(hdc, offX,offY, CompString, compstr->dwCompStrLen);
if (oldfont)
SelectObject(hdc,oldfont);
More information about the wine-cvs
mailing list