From 7c60af6847dedfcef1105fb83dd6033e902d1a13 Mon Sep 17 00:00:00 2001 From: Brad Lassey Date: Thu, 6 Aug 2009 15:07:13 -0400 Subject: [PATCH] bug 508210 - Gap between fennec window and soft keyboard r=vlad --- widget/src/windows/nsWindow.cpp | 6 ---- widget/src/windows/nsWindowCE.cpp | 55 +++++++++++++++++++++---------- widget/src/windows/nsWindowCE.h | 2 +- 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/widget/src/windows/nsWindow.cpp b/widget/src/windows/nsWindow.cpp index 8952bdef06f0..3a59866dec9a 100644 --- a/widget/src/windows/nsWindow.cpp +++ b/widget/src/windows/nsWindow.cpp @@ -5606,12 +5606,6 @@ PRBool nsWindow::OnHotKey(WPARAM wParam, LPARAM lParam) void nsWindow::OnSettingsChange(WPARAM wParam, LPARAM lParam) { -#if defined(WINCE_WINDOWS_MOBILE) - if (wParam == SPI_SETSIPINFO) { - nsWindowCE::NotifySoftKbObservers(); - } -#endif - nsWindowGfx::OnSettingsChangeGfx(wParam); } diff --git a/widget/src/windows/nsWindowCE.cpp b/widget/src/windows/nsWindowCE.cpp index 58a3146cc2de..36db779f23e4 100644 --- a/widget/src/windows/nsWindowCE.cpp +++ b/widget/src/windows/nsWindowCE.cpp @@ -78,23 +78,26 @@ TriStateBool nsWindowCE::sShowSIPButton = TRI_UNKNOWN; **************************************************************/ #ifdef WINCE_HAVE_SOFTKB -void nsWindowCE::NotifySoftKbObservers() +void nsWindowCE::NotifySoftKbObservers(LPRECT visRect) { - nsCOMPtr observerService = do_GetService("@mozilla.org/observer-service;1"); - if (observerService) { + if (!visRect) { SIPINFO sipInfo; - wchar_t rectBuf[256]; memset(&sipInfo, 0, sizeof(SIPINFO)); sipInfo.cbSize = sizeof(SIPINFO); - if (SipGetInfo(&sipInfo)) { - _snwprintf(rectBuf, 256, L"{\"left\": %d, \"top\": %d," - L" \"right\": %d, \"bottom\": %d}", - sipInfo.rcVisibleDesktop.left, - sipInfo.rcVisibleDesktop.top, - sipInfo.rcVisibleDesktop.right, - sipInfo.rcVisibleDesktop.bottom); - observerService->NotifyObservers(nsnull, "softkb-change", rectBuf); - } + if (SipGetInfo(&sipInfo)) + visRect = &(sipInfo.rcVisibleDesktop); + else + return; + } + + + nsCOMPtr observerService = do_GetService("@mozilla.org/observer-service;1"); + if (observerService) { + wchar_t rectBuf[256]; + _snwprintf(rectBuf, 256, L"{\"left\": %d, \"top\": %d," + L" \"right\": %d, \"bottom\": %d}", + visRect->left, visRect->top, visRect->right, visRect->bottom); + observerService->NotifyObservers(nsnull, "softkb-change", rectBuf); } } @@ -131,10 +134,28 @@ void nsWindowCE::ToggleSoftKB(PRBool show) GetWindowRect(hWndSIP, &sipRect); int sipH = sipRect.bottom - sipRect.top; int sipW = sipRect.right - sipRect.left; - MoveWindow(hWndSIP, (sX - sipW)/2, sY - sipH, sX, sY, TRUE); - } - - NotifySoftKbObservers(); + sipRect.left = (sX - sipW)/2; + sipRect.top = sY - sipH; + sipRect.bottom = sY; + sipRect.right = sipRect.left + sipW; + MoveWindow(hWndSIP, (sX - sipW)/2, sY - sipH, sipW, sipH, TRUE); + SIPINFO sipInfo; + RECT visRect; + visRect.top = 0; + visRect.left = 0; + visRect.bottom = show ? sipRect.top : sY; + visRect.right = sX; + sipInfo.cbSize = sizeof(SIPINFO); + sipInfo.fdwFlags = SIPF_DOCKED | SIPF_LOCKED | (show ? SIPF_ON : SIPF_OFF); + sipInfo.rcSipRect = sipRect; + sipInfo.rcVisibleDesktop = visRect; + sipInfo.dwImDataSize = 0; + sipInfo.pvImData = NULL; + SipSetInfo(&sipInfo); + NotifySoftKbObservers(&visRect); + } else { + NotifySoftKbObservers(); + } } void nsWindowCE::CreateSoftKeyMenuBar(HWND wnd) diff --git a/widget/src/windows/nsWindowCE.h b/widget/src/windows/nsWindowCE.h index aff3630e697a..42bf92923dcf 100644 --- a/widget/src/windows/nsWindowCE.h +++ b/widget/src/windows/nsWindowCE.h @@ -86,7 +86,7 @@ public: #if defined(WINCE_HAVE_SOFTKB) static void ToggleSoftKB(PRBool show); static void CreateSoftKeyMenuBar(HWND wnd); - static void NotifySoftKbObservers(); + static void NotifySoftKbObservers(LPRECT = NULL); static TriStateBool sShowSIPButton; #endif };