diff options
Diffstat (limited to 'vcl/os2/source/window/salframe.cxx')
-rw-r--r-- | vcl/os2/source/window/salframe.cxx | 3575 |
1 files changed, 0 insertions, 3575 deletions
diff --git a/vcl/os2/source/window/salframe.cxx b/vcl/os2/source/window/salframe.cxx deleted file mode 100644 index c19093a85e50..000000000000 --- a/vcl/os2/source/window/salframe.cxx +++ /dev/null @@ -1,3575 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include <string.h> - -#define INCL_DOS -#define INCL_PM -#define INCL_WIN -#include <svpm.h> - -// ======================================================================= - -#define _SV_SALFRAME_CXX - -#include <tools/debug.hxx> - -#define private public - -#include <sallang.hxx> -#include <salids.hrc> -#include <saldata.hxx> -#include <salinst.h> -#include <salgdi.h> -#include <salframe.h> -#include <vcl/timer.hxx> -#include <vcl/settings.hxx> -#include <vcl/keycodes.hxx> -#include <saltimer.h> - -#if OSL_DEBUG_LEVEL > 1 -extern "C" int debug_printf(const char *f, ...); - -static BOOL _bCapture; - -#else -#define debug_printf( ...) { 1; } -#endif - -// ======================================================================= - -HPOINTER ImplLoadPointer( ULONG nId ); - -static void SetMaximizedFrameGeometry( HWND hWnd, Os2SalFrame* pFrame ); -static void UpdateFrameGeometry( HWND hWnd, Os2SalFrame* pFrame ); -static void ImplSalCalcFrameSize( HWND hWnd, - LONG& nFrameX, LONG& nFrameY, LONG& nCaptionY ); -static void ImplSalCalcFrameSize( const Os2SalFrame* pFrame, - LONG& nFrameX, LONG& nFrameY, LONG& nCaptionY ); -MRESULT EXPENTRY SalFrameSubClassWndProc( HWND hWnd, ULONG nMsg, - MPARAM nMP1, MPARAM nMP2 ); - -// ======================================================================= - -static LanguageType eImplKeyboardLanguage = LANGUAGE_DONTKNOW; -BOOL Os2SalFrame::mbInReparent = FALSE; -ULONG Os2SalFrame::mnInputLang = 0; - -// ======================================================================= - -// define a new flag -#define SWP_CENTER (SWP_NOAUTOCLOSE<<4) -#define SWP_SHOWMAXIMIZED (SWP_ACTIVATE | SWP_SHOW | SWP_MAXIMIZE) -#define SWP_SHOWMINIMIZED (SWP_ACTIVATE | SWP_SHOW | SWP_MINIMIZE) -#define SWP_SHOWNORMAL (SWP_ACTIVATE | SWP_SHOW | SWP_RESTORE) - -static LONG nScreenHeight = WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN); -static LONG nScreenWidth = WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN ); - -BOOL APIENTRY _WinQueryWindowRect( HWND hwnd, PRECTL prclDest) -{ - BOOL rc = WinQueryWindowRect( hwnd, prclDest); - ULONG tmp = prclDest->yBottom; - prclDest->yBottom = prclDest->yTop; - prclDest->yTop = tmp; - return rc; -} - -BOOL APIENTRY _WinQueryPointerPos (HWND hwndDesktop, PPOINTL pptl) -{ - BOOL rc = WinQueryPointerPos( hwndDesktop, pptl); - pptl->y = nScreenHeight - pptl->y; - return rc; -} - -BOOL APIENTRY _WinQueryWindowPos( Os2SalFrame* pFrame, PSWP pswp) -{ - SWP swpOwner; - BOOL rc = WinQueryWindowPos( pFrame->mhWndFrame, pswp); - -#if OSL_DEBUG_LEVEL > 1 - debug_printf( "> WinQueryWindowPos hwnd %x at %d,%d (%dx%d)\n", - pFrame->mhWndFrame, pswp->x, pswp->y, pswp->cx, pswp->cy); -#endif - - Os2SalFrame* pParentFrame = pFrame->mpParentFrame; - - //YD adjust to owner coordinates - if ( pParentFrame ) - { - POINTL ptlOwner = {0}; - - // coords are relative to screen, map to parent frame client area - ptlOwner.x = pswp->x; - ptlOwner.y = pswp->y; - WinMapWindowPoints( HWND_DESKTOP, pParentFrame->mhWndClient, &ptlOwner, 1); - pswp->x = ptlOwner.x; - pswp->y = ptlOwner.y; - // get parent client area size - WinQueryWindowPos( pParentFrame->mhWndClient, &swpOwner); - } else - { - // no owner info, use DESKTOP???? - swpOwner.cx = nScreenWidth; - swpOwner.cy = nScreenHeight; - } - - // invert Y coordinate - pswp->y = swpOwner.cy - (pswp->y + pswp->cy); - -#if OSL_DEBUG_LEVEL > 1 - debug_printf( "< WinQueryWindowPos hwnd %x at %d,%d (%dx%d)\n", - pFrame->mhWndFrame, pswp->x, pswp->y, pswp->cx, pswp->cy); -#endif - return rc; -} - -BOOL APIENTRY _WinSetWindowPos( Os2SalFrame* pFrame, HWND hwndInsertBehind, LONG x, LONG y, - LONG cx, LONG cy, ULONG fl) -{ - SWP swpOwner = {0}; - POINTL ptlOwner = {0}; - HWND hParent = NULL; - -#if OSL_DEBUG_LEVEL > 1 - debug_printf( ">WinSetWindowPos hwnd %x at %d,%d (%dx%d) fl 0x%08x\n", - pFrame->mhWndFrame, x, y, cx, cy, fl); -#endif - - // first resize window if requested - if ( (fl & SWP_SIZE) ) { - ULONG flag = SWP_SIZE; - LONG nX = 0, nY = 0; - LONG frameFrameX, frameFrameY, frameCaptionY; - - ImplSalCalcFrameSize( pFrame, frameFrameX, frameFrameY, frameCaptionY ); - // if we change y size, we need to move the window down - // because os2 window origin is lower left corner - if (pFrame->maGeometry.nHeight != cy) { - SWP aSWP; - WinQueryWindowPos( pFrame->mhWndFrame, &aSWP); - nX = aSWP.x; - nY = aSWP.y - (cy + 2*frameFrameY + frameCaptionY - aSWP.cy); - flag |= SWP_MOVE; - } - WinSetWindowPos( pFrame->mhWndFrame, NULL, nX, nY, - cx+2*frameFrameX, cy+2*frameFrameY+frameCaptionY, flag); - fl = fl & ~SWP_SIZE; - } - else // otherwise get current size - { - SWP swp = {0}; - WinQueryWindowPos( pFrame->mhWndClient, &swp); - cx = swp.cx; - cy = swp.cy; - } - - // get parent window handle - Os2SalFrame* pParentFrame = pFrame->mpParentFrame; - - // use desktop if parent is not defined - hParent = pParentFrame ? pParentFrame->mhWndClient : HWND_DESKTOP; - // if parent is not visible, use desktop as reference - hParent = WinIsWindowVisible( hParent) ? hParent : HWND_DESKTOP; - - WinQueryWindowPos( hParent, &swpOwner); - - //YD adjust to owner coordinates only when moving and not centering - //if (!(fl & SWP_CENTER) && (fl & SWP_MOVE)) - if ((fl & SWP_MOVE)) - { - - // if SWP_CENTER is specified, change position to parent center - if (fl & SWP_CENTER) { - ptlOwner.x = (swpOwner.cx - cx) / 2; - ptlOwner.y = (swpOwner.cy - cy) / 2; -#if OSL_DEBUG_LEVEL > 1 - debug_printf( "_WinSetWindowPos SWP_CENTER\n"); -#endif - fl = fl & ~SWP_CENTER; - } else { - // coords are relative to parent frame client area, map to screen - // map Y to OS/2 system coordinates - ptlOwner.x = x; - ptlOwner.y = swpOwner.cy - (y + cy); - -#if OSL_DEBUG_LEVEL > 1 - debug_printf( "_WinSetWindowPos owner 0x%x at %d,%d (%dx%d) OS2\n", - hParent, ptlOwner.x, ptlOwner.y, swpOwner.cx, swpOwner.cy); -#endif - } - // map from client area to screen - WinMapWindowPoints( hParent, HWND_DESKTOP, &ptlOwner, 1); - x = ptlOwner.x; - y = ptlOwner.y; - -#if OSL_DEBUG_LEVEL > 1 - debug_printf( "_WinSetWindowPos owner 0x%x at %d,%d (%dx%d) MAPPED OS2\n", - hParent, ptlOwner.x, ptlOwner.y, swpOwner.cx, swpOwner.cy); -#endif - } - -#if OSL_DEBUG_LEVEL > 1 - debug_printf( "<WinSetWindowPos hwnd %x at %d,%d (%dx%d) fl=%x\n", - pFrame->mhWndFrame, x, y, cx, cy, fl); -#endif - return WinSetWindowPos( pFrame->mhWndFrame, hwndInsertBehind, x, y, 0, 0, fl); -} - -// ======================================================================= - -#if OSL_DEBUG_LEVEL > 1 -static void dumpWindowInfo( char* fnc, HWND hwnd) -{ - SWP aSWP; - HWND hwnd2; - char szTitle[256]; -} -#endif - -// ======================================================================= - -#ifdef ENABLE_IME - -struct ImplSalIMEProc -{ - ULONG nOrd; - PFN* pProc; -}; - -#define SAL_IME_PROC_COUNT 12 - -// ----------------------------------------------------------------------- - -static SalIMEData* GetSalIMEData() -{ - SalData* pSalData = GetSalData(); - - if ( !pSalData->mbIMEInit ) - { - pSalData->mbIMEInit = TRUE; - - HMODULE hMod = 0; - if ( 0 == DosLoadModule( NULL, 0, "OS2IM", &hMod ) ) - { - SalIMEData* pIMEData = new SalIMEData; - BOOL bError = FALSE; - ImplSalIMEProc aProcAry[SAL_IME_PROC_COUNT] = - { - { 101, (PFN*)&(pIMEData->mpAssocIME) }, - { 104, (PFN*)&(pIMEData->mpGetIME) }, - { 106, (PFN*)&(pIMEData->mpReleaseIME) }, - { 117, (PFN*)&(pIMEData->mpSetConversionFont) }, - { 144, (PFN*)&(pIMEData->mpSetConversionFontSize) }, - { 118, (PFN*)&(pIMEData->mpGetConversionString) }, - { 122, (PFN*)&(pIMEData->mpGetResultString) }, - { 115, (PFN*)&(pIMEData->mpSetCandidateWin) }, - { 130, (PFN*)&(pIMEData->mpQueryIMEProperty) }, - { 131, (PFN*)&(pIMEData->mpRequestIME) }, - { 128, (PFN*)&(pIMEData->mpSetIMEMode) }, - { 127, (PFN*)&(pIMEData->mpQueryIMEMode) } - }; - - pIMEData->mhModIME = hMod; - for ( USHORT i = 0; i < SAL_IME_PROC_COUNT; i++ ) - { - if ( 0 != DosQueryProcAddr( pIMEData->mhModIME, aProcAry[i].nOrd, 0, aProcAry[i].pProc ) ) - { - bError = TRUE; - break; - } - } - - if ( bError ) - { - DosFreeModule( pIMEData->mhModIME ); - delete pIMEData; - } - else - pSalData->mpIMEData = pIMEData; - } - } - - return pSalData->mpIMEData; -} - -// ----------------------------------------------------------------------- - -void ImplReleaseSALIMEData() -{ - SalData* pSalData = GetSalData(); - - if ( pSalData->mpIMEData ) - { - DosFreeModule( pSalData->mpIMEData->mhModIME ); - delete pSalData->mpIMEData; - } -} - -#endif - -// ======================================================================= - -static void ImplSaveFrameState( Os2SalFrame* pFrame ) -{ - // Position, Groesse und Status fuer GetWindowState() merken - if ( !pFrame->mbFullScreen ) - { - SWP aSWP; - BOOL bVisible = WinIsWindowVisible( pFrame->mhWndFrame); - - // Query actual state (maState uses screen coords) - WinQueryWindowPos( pFrame->mhWndFrame, &aSWP ); - - if ( aSWP.fl & SWP_MINIMIZE ) - { -#if OSL_DEBUG_LEVEL > 1 - debug_printf("Os2SalFrame::GetWindowState %08x SAL_FRAMESTATE_MINIMIZED\n", - pFrame->mhWndFrame); -#endif - pFrame->maState.mnState |= SAL_FRAMESTATE_MINIMIZED; - if ( bVisible ) - pFrame->mnShowState = SWP_SHOWMAXIMIZED; - } - else if ( aSWP.fl & SWP_MAXIMIZE ) - { -#if OSL_DEBUG_LEVEL > 1 - debug_printf("Os2SalFrame::GetWindowState %08x SAL_FRAMESTATE_MAXIMIZED\n", - pFrame->mhWndFrame); -#endif - pFrame->maState.mnState &= ~SAL_FRAMESTATE_MINIMIZED; - pFrame->maState.mnState |= SAL_FRAMESTATE_MAXIMIZED; - if ( bVisible ) - pFrame->mnShowState = SWP_SHOWMINIMIZED; - pFrame->mbRestoreMaximize = TRUE; - } - else - { - LONG nFrameX, nFrameY, nCaptionY; - ImplSalCalcFrameSize( pFrame, nFrameX, nFrameY, nCaptionY ); - // to be consistent with Unix, the frame state is without(!) decoration - long nTopDeco = nFrameY + nCaptionY; - long nLeftDeco = nFrameX; - long nBottomDeco = nFrameY; - long nRightDeco = nFrameX; - - pFrame->maState.mnState &= ~(SAL_FRAMESTATE_MINIMIZED | SAL_FRAMESTATE_MAXIMIZED); - // subtract decoration, store screen coords - pFrame->maState.mnX = aSWP.x+nLeftDeco; - pFrame->maState.mnY = nScreenHeight - (aSWP.y+aSWP.cy)+nTopDeco; - pFrame->maState.mnWidth = aSWP.cx-nLeftDeco-nRightDeco; - pFrame->maState.mnHeight = aSWP.cy-nTopDeco-nBottomDeco; -#if OSL_DEBUG_LEVEL > 1 - debug_printf("Os2SalFrame::GetWindowState %08x (%dx%d) at %d,%d VCL\n", - pFrame->mhWndFrame, - pFrame->maState.mnWidth,pFrame->maState.mnHeight,pFrame->maState.mnX,pFrame->maState.mnY); -#endif - if ( bVisible ) - pFrame->mnShowState = SWP_SHOWNORMAL; - pFrame->mbRestoreMaximize = FALSE; - } - } -} - -// ----------------------------------------------------------------------- - -long ImplSalCallbackDummy( void*, SalFrame*, USHORT, const void* ) -{ - return 0; -} - -// ----------------------------------------------------------------------- - -static void ImplSalCalcFrameSize( HWND hWnd, - LONG& nFrameX, LONG& nFrameY, LONG& nCaptionY ) -{ - Os2SalFrame* pFrame = GetWindowPtr( hWnd ); - if ( !pFrame ) - return; - return ImplSalCalcFrameSize( pFrame, nFrameX, nFrameY, nCaptionY ); -} - -static void ImplSalCalcFrameSize( const Os2SalFrame* pFrame, - LONG& nFrameX, LONG& nFrameY, LONG& nCaptionY ) -{ - if ( pFrame->mbSizeBorder ) - { - nFrameX = WinQuerySysValue( HWND_DESKTOP, SV_CXSIZEBORDER ); - nFrameY = WinQuerySysValue( HWND_DESKTOP, SV_CYSIZEBORDER ); - } - else if ( pFrame->mbFixBorder ) - { - nFrameX = WinQuerySysValue( HWND_DESKTOP, SV_CXDLGFRAME ); - nFrameY = WinQuerySysValue( HWND_DESKTOP, SV_CYDLGFRAME ); - } - else if ( pFrame->mbBorder ) - { - nFrameX = WinQuerySysValue( HWND_DESKTOP, SV_CXBORDER ); - nFrameY = WinQuerySysValue( HWND_DESKTOP, SV_CYBORDER ); - } - else - { - nFrameX = 0; - nFrameY = 0; - } - if ( pFrame->mbCaption ) - nCaptionY = WinQuerySysValue( HWND_DESKTOP, SV_CYTITLEBAR ); - else - nCaptionY = 0; - -#if OSL_DEBUG_LEVEL > 1 - debug_printf("ImplSalCalcFrameSize 0x%08x x=%d y=%d t=%d\n", pFrame->mhWndFrame, nFrameX, nFrameY, nCaptionY); -#endif -} - -// ----------------------------------------------------------------------- - -static void ImplSalCalcFullScreenSize( const Os2SalFrame* pFrame, - LONG& rX, LONG& rY, LONG& rDX, LONG& rDY ) -{ - // set window to screen size - LONG nFrameX, nFrameY, nCaptionY; - LONG rScreenDX = WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN ); - LONG rScreenDY = WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN ); - - // Framegroessen berechnen - ImplSalCalcFrameSize( pFrame, nFrameX, nFrameY, nCaptionY ); - - rX = -nFrameX; - rY = -(nFrameY+nCaptionY); - rDX = rScreenDX+(nFrameX*2); - rDY = rScreenDY+(nFrameY*2)+nCaptionY; -} - -// ----------------------------------------------------------------------- - -static void ImplSalFrameFullScreenPos( Os2SalFrame* pFrame, BOOL bAlways = FALSE ) -{ - SWP aSWP; - _WinQueryWindowPos( pFrame, &aSWP ); - if ( bAlways || !(aSWP.fl & SWP_MINIMIZE) ) - { - // set window to screen size - LONG nX; - LONG nY; - LONG nWidth; - LONG nHeight; - ImplSalCalcFullScreenSize( pFrame, nX, nY, nWidth, nHeight ); - _WinSetWindowPos( pFrame, 0, - nX, nY, nWidth, nHeight, - SWP_MOVE | SWP_SIZE ); - } -} - -// ----------------------------------------------------------------------- - -// Uebersetzungstabelle von System-Keycodes in StarView-Keycodes -#define KEY_TAB_SIZE (VK_ENDDRAG+1) - -static USHORT aImplTranslateKeyTab[KEY_TAB_SIZE] = -{ - // StarView-Code System-Code Index - 0, // 0x00 - 0, // VK_BUTTON1 0x01 - 0, // VK_BUTTON2 0x02 - 0, // VK_BUTTON3 0x03 - 0, // VK_BREAK 0x04 - KEY_BACKSPACE, // VK_BACKSPACE 0x05 - KEY_TAB, // VK_TAB 0x06 - KEY_TAB, // VK_BACKTAB 0x07 - KEY_RETURN, // VK_NEWLINE 0x08 - 0, // VK_SHIFT 0x09 - 0, // VK_CTRL 0x0A - 0, // VK_ALT 0x0B - 0, // VK_ALTGRAF 0x0C - 0, // VK_PAUSE 0x0D - 0, // VK_CAPSLOCK 0x0E - KEY_ESCAPE, // VK_ESC 0x0F - KEY_SPACE, // VK_SPACE 0x10 - KEY_PAGEUP, // VK_PAGEUP 0x11 - KEY_PAGEDOWN, // VK_PAGEDOWN 0x12 - KEY_END, // VK_END 0x13 - KEY_HOME, // VK_HOME 0x14 - KEY_LEFT, // VK_LEFT 0x15 - KEY_UP, // VK_UP 0x16 - KEY_RIGHT, // VK_RIGHT 0x17 - KEY_DOWN, // VK_DOWN 0x18 - 0, // VK_PRINTSCRN 0x19 - KEY_INSERT, // VK_INSERT 0x1A - KEY_DELETE, // VK_DELETE 0x1B - 0, // VK_SCRLLOCK 0x1C - 0, // VK_NUMLOCK 0x1D - KEY_RETURN, // VK_ENTER 0x1E - 0, // VK_SYSRQ 0x1F - KEY_F1, // VK_F1 0x20 - KEY_F2, // VK_F2 0x21 - KEY_F3, // VK_F3 0x22 - KEY_F4, // VK_F4 0x23 - KEY_F5, // VK_F5 0x24 - KEY_F6, // VK_F6 0x25 - KEY_F7, // VK_F7 0x26 - KEY_F8, // VK_F8 0x27 - KEY_F9, // VK_F9 0x28 - KEY_F10, // VK_F10 0x29 - KEY_F11, // VK_F11 0x2A - KEY_F12, // VK_F12 0x2B - KEY_F13, // VK_F13 0x2C - KEY_F14, // VK_F14 0x2D - KEY_F15, // VK_F15 0x2E - KEY_F16, // VK_F16 0x2F - KEY_F17, // VK_F17 0x30 - KEY_F18, // VK_F18 0x31 - KEY_F19, // VK_F19 0x32 - KEY_F20, // VK_F20 0x33 - KEY_F21, // VK_F21 0x34 - KEY_F22, // VK_F22 0x35 - KEY_F23, // VK_F23 0x36 - KEY_F24, // VK_F24 0x37 - 0 // VK_ENDDRAG 0x38 -}; - -// ======================================================================= - -SalFrame* ImplSalCreateFrame( Os2SalInstance* pInst, HWND hWndParent, ULONG nSalFrameStyle ) -{ - SalData* pSalData = GetSalData(); - Os2SalFrame* pFrame = new Os2SalFrame; - HWND hWndFrame; - HWND hWndClient; - ULONG nFrameFlags = FCF_NOBYTEALIGN | FCF_SCREENALIGN; - ULONG nFrameStyle = 0; - ULONG nClientStyle = WS_CLIPSIBLINGS; - BOOL bSubFrame = FALSE; - -#if OSL_DEBUG_LEVEL > 1 - debug_printf(">ImplSalCreateFrame hWndParent 0x%x, nSalFrameStyle 0x%x\n", hWndParent, nSalFrameStyle); -#endif - - if ( hWndParent ) - { - bSubFrame = TRUE; - pFrame->mbNoIcon = TRUE; - } - - // determine creation data (bei Moveable nehmen wir DLG-Border, damit - // es besser aussieht) - if ( nSalFrameStyle & SAL_FRAME_STYLE_CLOSEABLE ) - nFrameFlags |= FCF_CLOSEBUTTON; - - if ( nSalFrameStyle & SAL_FRAME_STYLE_MOVEABLE ) { - pFrame->mbCaption = TRUE; - nFrameStyle = WS_ANIMATE; - nFrameFlags |= FCF_SYSMENU | FCF_TITLEBAR | FCF_DLGBORDER; - if ( !hWndParent ) - nFrameFlags |= FCF_MINBUTTON; - - if ( nSalFrameStyle & SAL_FRAME_STYLE_SIZEABLE ) - { - pFrame->mbSizeBorder = TRUE; - nFrameFlags |= FCF_SIZEBORDER; - if ( !hWndParent ) - nFrameFlags |= FCF_MAXBUTTON; - } - else - pFrame->mbFixBorder = TRUE; - - // add task list style if not a tool window - if ( !(nSalFrameStyle & SAL_FRAME_STYLE_TOOLWINDOW) ) { - nFrameFlags |= FCF_TASKLIST; - } - } - - if( nSalFrameStyle & SAL_FRAME_STYLE_TOOLWINDOW ) - { - pFrame->mbNoIcon = TRUE; - // YD gives small caption -> nExSysStyle |= WS_EX_TOOLWINDOW; - } - - if ( nSalFrameStyle & SAL_FRAME_STYLE_FLOAT ) - { - pFrame->mbFloatWin = TRUE; - } - // init frame data - pFrame->mnStyle = nSalFrameStyle; - - // determine show style - pFrame->mnShowState = SWP_SHOWNORMAL; - - // create frame - //YD FIXME this is a potential bug with multiple threads and cuncurrent - //window creation, because this field is accessed in - //WM_CREATE to get window data, - pSalData->mpCreateFrame = pFrame; - - //YD FIXME if SAL_FRAME_CHILD is specified, use hWndParent as parent handle... - hWndFrame = WinCreateStdWindow( HWND_DESKTOP, nFrameStyle, &nFrameFlags, - (PSZ)(bSubFrame ? SAL_SUBFRAME_CLASSNAME : SAL_FRAME_CLASSNAME), - NULL, - nClientStyle, 0, 0, &hWndClient ); - debug_printf("ImplSalCreateFrame hWndParent 0x%x, hWndFrame 0x%x, hWndClient 0x%x\n", hWndParent, hWndFrame, hWndClient); - if ( !hWndFrame ) - { - delete pFrame; - return NULL; - } - - // Parent setzen (Owner) - if ( hWndParent != 0 && hWndParent != HWND_DESKTOP ) - WinSetOwner( hWndFrame, hWndParent ); - - Os2SalFrame* pParentFrame = GetWindowPtr( hWndParent ); - if ( pParentFrame ) - pFrame->mpParentFrame = pParentFrame; - - // Icon setzen (YD win32 does it in the class registration) - if ( nFrameFlags & FCF_MINBUTTON ) - WinSendMsg( hWndFrame, WM_SETICON, (MPARAM)pInst->mhAppIcon, (MPARAM)0 ); - - // If we have an Window with an Caption Bar and without - // an MaximizeBox, we change the SystemMenu - if ( (nFrameFlags & (FCF_TITLEBAR | FCF_MAXBUTTON)) == (FCF_TITLEBAR) ) - { - HWND hSysMenu = WinWindowFromID( hWndFrame, FID_SYSMENU ); - if ( hSysMenu ) - { - if ( !(nFrameFlags & (FCF_MINBUTTON | FCF_MAXBUTTON)) ) - WinEnableMenuItem(hSysMenu, SC_RESTORE, FALSE); - if ( !(nFrameFlags & FCF_MINBUTTON) ) - WinEnableMenuItem(hSysMenu, SC_MINIMIZE, FALSE); - if ( !(nFrameFlags & FCF_MAXBUTTON) ) - WinEnableMenuItem(hSysMenu, SC_MAXIMIZE, FALSE); - if ( !(nFrameFlags & FCF_SIZEBORDER) ) - WinEnableMenuItem(hSysMenu, SC_SIZE, FALSE); - } - } - if ( (nFrameFlags & FCF_SYSMENU) && !(nSalFrameStyle & SAL_FRAME_STYLE_CLOSEABLE) ) - { - HWND hSysMenu = WinWindowFromID( hWndFrame, FID_SYSMENU ); - if ( hSysMenu ) - { - WinEnableMenuItem(hSysMenu, SC_CLOSE, FALSE); - } - } - - // ticket#124 subclass frame window: we need to intercept TRACK message - aSalShlData.mpFrameProc = WinSubclassWindow( hWndFrame, SalFrameSubClassWndProc); - - // init OS/2 frame data - pFrame->mhAB = pInst->mhAB; - - // YD 18/08 under OS/2, invisible frames have size 0,0 at 0,0, so - // we need to set an initial size/position manually - SWP aSWP; - memset( &aSWP, 0, sizeof( aSWP ) ); - WinQueryTaskSizePos( pInst->mhAB, 0, &aSWP ); - WinSetWindowPos( hWndFrame, NULL, aSWP.x, aSWP.y, aSWP.cx, aSWP.cy, - SWP_MOVE | SWP_SIZE); - -#ifdef ENABLE_IME - // Input-Context einstellen - SalIMEData* pIMEData = GetSalIMEData(); - if ( pIMEData ) - { - pFrame->mhIMEContext = 0; - if ( 0 != pIMEData->mpAssocIME( hWndClient, pFrame->mhIMEContext, &pFrame->mhDefIMEContext ) ) - pFrame->mhDefIMEContext = 0; - } - else - { - pFrame->mhIMEContext = 0; - pFrame->mhDefIMEContext = 0; - } -#endif - - RECTL rectl; - _WinQueryWindowRect( hWndClient, &rectl ); - pFrame->mnWidth = rectl.xRight; - pFrame->mnHeight = rectl.yBottom; - debug_printf( "ImplSalCreateFrame %dx%d\n", pFrame->mnWidth, pFrame->mnHeight); - ImplSaveFrameState( pFrame ); - pFrame->mbDefPos = TRUE; - - UpdateFrameGeometry( hWndFrame, pFrame ); - - if( pFrame->mnShowState == SWP_SHOWMAXIMIZED ) - { - // #96084 set a useful internal window size because - // the window will not be maximized (and the size updated) before show() - SetMaximizedFrameGeometry( hWndFrame, pFrame ); - } - -#if OSL_DEBUG_LEVEL > 1 - dumpWindowInfo( "<ImplSalCreateFrame (exit)", hWndFrame); -#endif - - return pFrame; -} - -// ======================================================================= - -Os2SalFrame::Os2SalFrame() -{ - SalData* pSalData = GetSalData(); - - mbGraphics = NULL; - mhPointer = WinQuerySysPointer( HWND_DESKTOP, SPTR_ARROW, FALSE ); - mpGraphics = NULL; - mpInst = NULL; - mbFullScreen = FALSE; - mbAllwayOnTop = FALSE; - mbVisible = FALSE; - mbMinHide = FALSE; - mbInShow = FALSE; - mbRestoreMaximize = FALSE; - mbInMoveMsg = FALSE; - mbInSizeMsg = FALSE; - mbDefPos = TRUE; - mbOverwriteState = TRUE; - mbHandleIME = FALSE; - mbConversionMode = FALSE; - mbCandidateMode = FALSE; - mbCaption = FALSE; - mpGraphics = NULL; - mnShowState = SWP_SHOWNORMAL; - mnWidth = 0; - mnHeight = 0; - mnMinWidth = 0; - mnMinHeight = 0; - mnMaxWidth = SHRT_MAX; - mnMaxHeight = SHRT_MAX; - mnInputLang = 0; - mnKeyboardHandle = 0; - mbGraphics = FALSE; - mbCaption = FALSE; - mbBorder = FALSE; - mbFixBorder = FALSE; - mbSizeBorder = FALSE; - mbFullScreen = FALSE; - mbInShow = FALSE; - mbRestoreMaximize = FALSE; - mbInMoveMsg = FALSE; - mbInSizeMsg = FALSE; - mbDefPos = TRUE; - mbOverwriteState = TRUE; - mbHandleIME = FALSE; - mbCandidateMode = FALSE; - mbFloatWin = FALSE; - mbNoIcon = FALSE; - mpParentFrame = NULL; - - memset( &maState, 0, sizeof( SalFrameState ) ); - maSysData.nSize = sizeof( SystemEnvData ); - memset( &maGeometry, 0, sizeof( maGeometry ) ); - - // insert frame in framelist - mpNextFrame = pSalData->mpFirstFrame; - pSalData->mpFirstFrame = this; -} - -// ----------------------------------------------------------------------- - -Os2SalFrame::~Os2SalFrame() -{ - SalData* pSalData = GetSalData(); - - // destroy DC - if ( mpGraphics ) - { - ImplSalDeInitGraphics( mpGraphics ); - WinReleasePS( mpGraphics->mhPS ); - delete mpGraphics; - } - - // destroy system frame - WinDestroyWindow( mhWndFrame ); - - // remove frame from framelist - if ( this == pSalData->mpFirstFrame ) - pSalData->mpFirstFrame = mpNextFrame; - else - { - Os2SalFrame* pTempFrame = pSalData->mpFirstFrame; - while ( pTempFrame->mpNextFrame != this ) - pTempFrame = pTempFrame->mpNextFrame; - - pTempFrame->mpNextFrame = mpNextFrame; - } -} - -// ----------------------------------------------------------------------- - -static HDC ImplWinGetDC( HWND hWnd ) -{ - HDC hDC = WinQueryWindowDC( hWnd ); - if ( !hDC ) - hDC = WinOpenWindowDC( hWnd ); - return hDC; -} - -// ----------------------------------------------------------------------- - -SalGraphics* Os2SalFrame::GetGraphics() -{ - if ( mbGraphics ) - return NULL; - - if ( !mpGraphics ) - { - SalData* pSalData = GetSalData(); - mpGraphics = new Os2SalGraphics; - mpGraphics->mhPS = WinGetPS( mhWndClient ); - mpGraphics->mhDC = ImplWinGetDC( mhWndClient ); - mpGraphics->mhWnd = mhWndClient; - mpGraphics->mnHeight = mnHeight; - mpGraphics->mbPrinter = FALSE; - mpGraphics->mbVirDev = FALSE; - mpGraphics->mbWindow = TRUE; - mpGraphics->mbScreen = TRUE; - ImplSalInitGraphics( mpGraphics ); - mbGraphics = TRUE; - } - else - mbGraphics = TRUE; - - return mpGraphics; -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::ReleaseGraphics( SalGraphics* ) -{ - mbGraphics = FALSE; -} - -// ----------------------------------------------------------------------- - -BOOL Os2SalFrame::PostEvent( void* pData ) -{ - return (BOOL)WinPostMsg( mhWndClient, SAL_MSG_USEREVENT, 0, (MPARAM)pData ); -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::SetTitle( const XubString& rTitle ) -{ - // set window title - ByteString title( rTitle, gsl_getSystemTextEncoding() ); - debug_printf("Os2SalFrame::SetTitle %x '%s'\n", mhWndFrame, title.GetBuffer() ); - WinSetWindowText( mhWndFrame, title.GetBuffer() ); -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::SetIcon( USHORT nIcon ) -{ - debug_printf("Os2SalFrame::SetIcon\n"); - - // If we have a window without an Icon (for example a dialog), ignore this call - if ( mbNoIcon ) - return; - - // 0 means default (class) icon - HPOINTER hIcon = NULL; - if ( !nIcon ) - nIcon = 1; - - ImplLoadSalIcon( nIcon, hIcon ); - - DBG_ASSERT( hIcon , "Os2SalFrame::SetIcon(): Could not load icon !" ); - - // Icon setzen - WinSendMsg( mhWndFrame, WM_SETICON, (MPARAM)hIcon, (MPARAM)0 ); -} - -// ----------------------------------------------------------------------- - -SalFrame* Os2SalFrame::GetParent() const -{ - //debug_printf("Os2SalFrame::GetParent\n"); - return GetWindowPtr( WinQueryWindow(mhWndFrame, QW_OWNER) ); -} - -// ----------------------------------------------------------------------- - -static void ImplSalShow( HWND hWnd, ULONG bVisible, ULONG bNoActivate ) -{ - Os2SalFrame* pFrame = GetWindowPtr( hWnd ); - if ( !pFrame ) - return; - - if ( bVisible ) - { - pFrame->mbDefPos = FALSE; - pFrame->mbOverwriteState = TRUE; - pFrame->mbInShow = TRUE; - -#if OSL_DEBUG_LEVEL > 1 - debug_printf( "ImplSalShow hwnd %x visible flag %d, no activate: flag %d\n", hWnd, bVisible, bNoActivate); -#endif - - if( bNoActivate ) - WinSetWindowPos(hWnd, NULL, 0, 0, 0, 0, SWP_SHOW); - else - WinSetWindowPos(hWnd, NULL, 0, 0, 0, 0, pFrame->mnShowState); - - pFrame->mbInShow = FALSE; - - // Direct Paint only, if we get the SolarMutx - if ( ImplSalYieldMutexTryToAcquire() ) - { - WinUpdateWindow( hWnd ); - ImplSalYieldMutexRelease(); - } - } - else - { -#if OSL_DEBUG_LEVEL > 1 - debug_printf( "ImplSalShow hwnd %x HIDE\n"); -#endif - WinSetWindowPos(hWnd, NULL, 0, 0, 0, 0, SWP_HIDE); - } -} - - -// ----------------------------------------------------------------------- - - -void Os2SalFrame::SetExtendedFrameStyle( SalExtStyle nExtStyle ) -{ -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::Show( BOOL bVisible, BOOL bNoActivate ) -{ - // Post this Message to the window, because this only works - // in the thread of the window, which has create this window. - // We post this message to avoid deadlocks - if ( GetSalData()->mnAppThreadId != GetCurrentThreadId() ) - WinPostMsg( mhWndFrame, SAL_MSG_SHOW, (MPARAM)bVisible, (MPARAM)bNoActivate ); - else - ImplSalShow( mhWndFrame, bVisible, bNoActivate ); -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::Enable( BOOL bEnable ) -{ - WinEnableWindow( mhWndFrame, bEnable ); -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::SetMinClientSize( long nWidth, long nHeight ) -{ - debug_printf("Os2SalFrame::SetMinClientSize\n"); - mnMinWidth = nWidth; - mnMinHeight = nHeight; -} - -void Os2SalFrame::SetMaxClientSize( long nWidth, long nHeight ) -{ - debug_printf("Os2SalFrame::SetMaxClientSize\n"); - mnMaxWidth = nWidth; - mnMaxHeight = nHeight; -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::SetPosSize( long nX, long nY, long nWidth, long nHeight, - USHORT nFlags ) -{ - // calculation frame size - USHORT nEvent = 0; - ULONG nPosFlags = 0; - -#if OSL_DEBUG_LEVEL > 1 - debug_printf( ">Os2SalFrame::SetPosSize go to %d,%d (%dx%d) VCL\n",nX,nY,nWidth,nHeight); -#endif - - SWP aSWP; - _WinQueryWindowPos( this, &aSWP ); - BOOL bVisible = WinIsWindowVisible( mhWndFrame ); - if ( !bVisible ) - { - if ( mbFloatWin ) - mnShowState = SWP_SHOW; - else - mnShowState = SWP_SHOWNORMAL; - } - else - { - if ( (aSWP.fl & SWP_MINIMIZE) || (aSWP.fl & SWP_MAXIMIZE) ) - WinSetWindowPos(mhWndFrame, NULL, 0, 0, 0, 0, SWP_RESTORE ); - } - - if ( (nFlags & (SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y)) ) { - nPosFlags |= SWP_MOVE; -#if OSL_DEBUG_LEVEL > 1 - debug_printf( "-Os2SalFrame::SetPosSize MOVE to %d,%d\n", nX, nY); -#endif - nEvent = SALEVENT_MOVE; - } - - if ( (nFlags & (SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT)) ) { - nPosFlags |= SWP_SIZE; -#if OSL_DEBUG_LEVEL > 1 - debug_printf( "-Os2SalFrame::SetPosSize SIZE to %d,%d\n", nWidth,nHeight); -#endif - nEvent = (nEvent == SALEVENT_MOVE) ? SALEVENT_MOVERESIZE : SALEVENT_RESIZE; - } - - // Default-Position, dann zentrieren, ansonsten Position beibehalten - if ( mbDefPos && !(nPosFlags & SWP_MOVE)) - { - // calculate bottom left corner of frame - mbDefPos = FALSE; - nPosFlags |= SWP_MOVE | SWP_CENTER; - nEvent = SALEVENT_MOVERESIZE; -#if OSL_DEBUG_LEVEL > 1 - debug_printf( "-Os2SalFrame::SetPosSize CENTER\n"); - debug_printf( "-Os2SalFrame::SetPosSize default position to %d,%d\n", nX, nY); -#endif - } - - // Adjust Window in the screen - BOOL bCheckOffScreen = TRUE; - - // but don't do this for floaters or ownerdraw windows that are currently moved interactively - if( (mnStyle & SAL_FRAME_STYLE_FLOAT) && !(mnStyle & SAL_FRAME_STYLE_OWNERDRAWDECORATION) ) - bCheckOffScreen = FALSE; - - if( mnStyle & SAL_FRAME_STYLE_OWNERDRAWDECORATION ) - { - // may be the window is currently being moved (mouse is captured), then no check is required - if( mhWndClient == WinQueryCapture( HWND_DESKTOP) ) - bCheckOffScreen = FALSE; - else - bCheckOffScreen = TRUE; - } - - if( bCheckOffScreen ) - { - if ( nX+nWidth > nScreenWidth ) - nX = nScreenWidth - nWidth; - if ( nY+nHeight > nScreenHeight ) - nY = nScreenHeight - nHeight; - if ( nX < 0 ) - nX = 0; - if ( nY < 0 ) - nY = 0; - } - - // set new position - _WinSetWindowPos( this, HWND_TOP, nX, nY, nWidth, nHeight, nPosFlags); // | SWP_RESTORE - - UpdateFrameGeometry( mhWndFrame, this ); - - // Notification -- really ??? - if( nEvent ) - CallCallback( nEvent, NULL ); - -#if OSL_DEBUG_LEVEL > 1 - dumpWindowInfo( "<Os2SalFrame::SetPosSize (exit)", mhWndFrame); -#endif - -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::SetParent( SalFrame* pNewParent ) -{ - APIRET rc; -#if OSL_DEBUG_LEVEL > 1 - debug_printf("Os2SalFrame::SetParent mhWndFrame 0x%08x to 0x%08x\n", - static_cast<Os2SalFrame*>(this)->mhWndFrame, - static_cast<Os2SalFrame*>(pNewParent)->mhWndClient); -#endif - Os2SalFrame::mbInReparent = TRUE; - rc = WinSetOwner(static_cast<Os2SalFrame*>(this)->mhWndFrame, - static_cast<Os2SalFrame*>(pNewParent)->mhWndClient); - mpParentFrame = static_cast<Os2SalFrame*>(pNewParent); - Os2SalFrame::mbInReparent = FALSE; -} - -bool Os2SalFrame::SetPluginParent( SystemParentData* pNewParent ) -{ - APIRET rc; - if ( pNewParent->hWnd == 0 ) - { - pNewParent->hWnd = HWND_DESKTOP; - } - - Os2SalFrame::mbInReparent = TRUE; - rc = WinSetOwner(static_cast<Os2SalFrame*>(this)->mhWndFrame, - pNewParent->hWnd); - Os2SalFrame::mbInReparent = FALSE; - return true; -} - - -// ----------------------------------------------------------------------- - -void Os2SalFrame::GetWorkArea( RECTL &rRect ) -{ - rRect.xLeft = rRect.yTop = 0; - rRect.xRight = WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN )-1; - rRect.yBottom = WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN )-1; -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::GetWorkArea( Rectangle &rRect ) -{ - RECTL aRect; - GetWorkArea( aRect); - rRect.nLeft = aRect.xLeft; - rRect.nRight = aRect.xRight; // win -1; - rRect.nTop = aRect.yTop; - rRect.nBottom = aRect.yBottom; // win -1; -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::GetClientSize( long& rWidth, long& rHeight ) -{ - rWidth = maGeometry.nWidth; - rHeight = maGeometry.nHeight; -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::SetWindowState( const SalFrameState* pState ) -{ - LONG nX; - LONG nY; - LONG nWidth; - LONG nHeight; - ULONG nPosSize = 0; - -#if OSL_DEBUG_LEVEL > 1 - debug_printf("Os2SalFrame::SetWindowState\n"); - debug_printf("Os2SalFrame::SetWindowState %08x (%dx%d) at %d,%d VCL\n", - mhWndFrame, - pState->mnWidth,pState->mnHeight,pState->mnX,pState->mnY); -#endif - - BOOL bVisible = WinIsWindowVisible( mhWndFrame ); - - // get screen coordinates - SWP aSWP; - WinQueryWindowPos( mhWndFrame, &aSWP ); - LONG nFrameX, nFrameY, nCaptionY; - ImplSalCalcFrameSize( this, nFrameX, nFrameY, nCaptionY ); - - long nTopDeco = nFrameY + nCaptionY; - long nLeftDeco = nFrameX; - long nBottomDeco = nFrameY; - long nRightDeco = nFrameX; - - // Fenster-Position/Groesse in den Bildschirm einpassen - if ((pState->mnMask & (SAL_FRAMESTATE_MASK_X | SAL_FRAMESTATE_MASK_Y)) ) - nPosSize |= SWP_MOVE; - if ((pState->mnMask & (SAL_FRAMESTATE_MASK_WIDTH | SAL_FRAMESTATE_MASK_HEIGHT)) ) - nPosSize |= SWP_SIZE; - - if ( pState->mnMask & SAL_FRAMESTATE_MASK_X ) - nX = (int)pState->mnX - nLeftDeco; - else - nX = aSWP.x; - - // keep Y inverted since height is still unknown, will invert later - if ( pState->mnMask & SAL_FRAMESTATE_MASK_Y ) - nY = (int)pState->mnY - nTopDeco; - else - nY = nScreenHeight - (aSWP.y+aSWP.cy); - - if ( pState->mnMask & SAL_FRAMESTATE_MASK_WIDTH ) - nWidth = (int)pState->mnWidth + nLeftDeco + nRightDeco; - else - nWidth = aSWP.cx; - if ( pState->mnMask & SAL_FRAMESTATE_MASK_HEIGHT ) - nHeight = (int)pState->mnHeight + nTopDeco + nBottomDeco; - else - nHeight = aSWP.cy; - -#if OSL_DEBUG_LEVEL > 1 - debug_printf("Os2SalFrame::SetWindowState (%dx%d) at %d,%d\n", nWidth,nHeight,nX,nY); -#endif - - // Adjust Window in the screen: - // if it does not fit into the screen do nothing, ie default pos/size will be used - // if there is an overlap with the screen border move the window while keeping its size - - if ( nX+nWidth > nScreenWidth ) - nX = (nScreenWidth) - nWidth; - if ( nY+nHeight > nScreenHeight ) - nY = (nScreenHeight) - nHeight; - if ( nX < 0 ) - nX = 0; - if ( nY < 0 ) - nY = 0; - - // Restore-Position setzen - SWP aPlacement; - WinQueryWindowPos( mhWndFrame, &aPlacement ); - - // Status setzen - bVisible = WinIsWindowVisible( mhWndFrame); - BOOL bUpdateHiddenFramePos = FALSE; - if ( !bVisible ) - { - aPlacement.fl = SWP_HIDE; - - if ( mbOverwriteState ) - { - if ( pState->mnMask & SAL_FRAMESTATE_MASK_STATE ) - { - if ( pState->mnState & SAL_FRAMESTATE_MINIMIZED ) - mnShowState = SWP_SHOWMINIMIZED; - else if ( pState->mnState & SAL_FRAMESTATE_MAXIMIZED ) - { - mnShowState = SWP_SHOWMAXIMIZED; - bUpdateHiddenFramePos = TRUE; - } - else if ( pState->mnState & SAL_FRAMESTATE_NORMAL ) - mnShowState = SWP_SHOWNORMAL; - } - } - } - else - { - if ( pState->mnMask & SAL_FRAMESTATE_MASK_STATE ) - { - if ( pState->mnState & SAL_FRAMESTATE_MINIMIZED ) - { - aPlacement.fl = SWP_SHOWMINIMIZED; - } - else if ( pState->mnState & SAL_FRAMESTATE_MAXIMIZED ) - aPlacement.fl = SWP_SHOWMAXIMIZED; - else if ( pState->mnState & SAL_FRAMESTATE_NORMAL ) - aPlacement.fl = SWP_RESTORE; - } - } - - // Wenn Fenster nicht minimiert/maximiert ist oder nicht optisch - // umgesetzt werden muss, dann SetWindowPos() benutzen, da - // SetWindowPlacement() die TaskBar mit einrechnet - if ( !(aPlacement.fl & SWP_MINIMIZE) - && !( aPlacement.fl & SWP_MAXIMIZE ) - && (!bVisible || (aPlacement.fl == SWP_RESTORE)) ) - { - if( bUpdateHiddenFramePos ) - { - // #96084 set a useful internal window size because - // the window will not be maximized (and the size updated) before show() - SetMaximizedFrameGeometry( mhWndFrame, this ); - } - else - WinSetWindowPos( mhWndFrame, 0, nX, - nScreenHeight - (nY+nHeight), nWidth, nHeight, nPosSize); - } - else - { - if( (nPosSize & (SWP_MOVE|SWP_SIZE)) ) - { - aPlacement.x = nX; - aPlacement.y = nScreenHeight-(nY+nHeight); - aPlacement.cx = nWidth; - aPlacement.cy = nHeight; - } - WinSetWindowPos( mhWndFrame, 0, aPlacement.x, aPlacement.y, - aPlacement.cx, aPlacement.cy, aPlacement.fl ); - } - -#if OSL_DEBUG_LEVEL > 1 - debug_printf("Os2SalFrame::SetWindowState DONE\n"); -#endif -} - -// ----------------------------------------------------------------------- - -BOOL Os2SalFrame::GetWindowState( SalFrameState* pState ) -{ - if ( maState.mnWidth && maState.mnHeight ) - { - *pState = maState; - if ( !(pState->mnState & (SAL_FRAMESTATE_MINIMIZED | SAL_FRAMESTATE_MAXIMIZED)) ) - pState->mnState |= SAL_FRAMESTATE_NORMAL; - return TRUE; - } - - return FALSE; -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::SetScreenNumber( unsigned int nNewScreen ) -{ -} - -void Os2SalFrame::SetApplicationID( const rtl::OUString &/*rApplicationID*/ ) -{ -} - -// ----------------------------------------------------------------------- - -// native menu implementation - currently empty -void Os2SalFrame::DrawMenuBar() -{ -} - -void Os2SalFrame::SetMenu( SalMenu* pSalMenu ) -{ -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::ShowFullScreen( BOOL bFullScreen, sal_Int32 nDisplay ) -{ - if ( mbFullScreen == bFullScreen ) - return; - - mbFullScreen = bFullScreen; - if ( bFullScreen ) - { - // save old position - memset( &maFullScreenRect, 0, sizeof( SWP ) ); - _WinQueryWindowPos( this, &maFullScreenRect ); - - // set window to screen size - ImplSalFrameFullScreenPos( this, TRUE ); - } - else - { - _WinSetWindowPos( this, - 0, - maFullScreenRect.x, maFullScreenRect.y, - maFullScreenRect.cx, maFullScreenRect.cy, - SWP_MOVE | SWP_SIZE ); - } -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::StartPresentation( BOOL bStart ) -{ -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::SetAlwaysOnTop( BOOL bOnTop ) -{ - mbAllwayOnTop = bOnTop; -} - - -// ----------------------------------------------------------------------- - -static void ImplSalToTop( HWND hWnd, ULONG nFlags ) -{ - Os2SalFrame* pFrame = GetWindowPtr( hWnd ); -#if OSL_DEBUG_LEVEL > 1 - debug_printf("ImplSalToTop hWnd %08x, nFlags %x\n", hWnd, nFlags); -#endif - - // if window is minimized, first restore it - SWP aSWP; - WinQueryWindowPos( hWnd, &aSWP ); - if ( aSWP.fl & SWP_MINIMIZE ) - WinSetWindowPos( hWnd, NULL, 0, 0, 0, 0, SWP_RESTORE ); - - if ( nFlags & SAL_FRAME_TOTOP_FOREGROUNDTASK ) - WinSetWindowPos( pFrame->mhWndFrame, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE | SWP_ZORDER); - - if ( nFlags & SAL_FRAME_TOTOP_RESTOREWHENMIN ) - { - ULONG nStyle; - if ( pFrame->mbRestoreMaximize ) - nStyle = SWP_MAXIMIZE; - else - nStyle = SWP_RESTORE; - - WinSetWindowPos( pFrame->mhWndFrame, NULL, 0, 0, 0, 0, nStyle ); - } - WinSetFocus( HWND_DESKTOP, pFrame->mhWndClient ); -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::ToTop( USHORT nFlags ) -{ - nFlags &= ~SAL_FRAME_TOTOP_GRABFOCUS; // this flag is not needed on win32 - // Post this Message to the window, because this only works - // in the thread of the window, which has create this window. - // We post this message to avoid deadlocks - if ( GetSalData()->mnAppThreadId != GetCurrentThreadId() ) - WinPostMsg( mhWndFrame, SAL_MSG_TOTOP, (MPARAM)nFlags, 0 ); - else - ImplSalToTop( mhWndFrame, nFlags ); -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::SetPointer( PointerStyle ePointerStyle ) -{ - struct ImplPtrData - { - HPOINTER mhPointer; - ULONG mnSysId; - ULONG mnOwnId; - }; - - static ImplPtrData aImplPtrTab[POINTER_COUNT] = - { - { 0, SPTR_ARROW, 0 }, // POINTER_ARROW - { 0, 0, SAL_RESID_POINTER_NULL }, // POINTER_NULL - { 0, SPTR_WAIT, 0 }, // POINTER_WAIT - { 0, SPTR_TEXT, 0 }, // POINTER_BEAM - { 0, 0, SAL_RESID_POINTER_HELP }, // POINTER_HELP - { 0, 0, SAL_RESID_POINTER_CROSS }, // POINTER_CROSS - { 0, 0, SAL_RESID_POINTER_MOVE }, // POINTER_MOVE - { 0, SPTR_SIZENS, 0 }, // POINTER_NSIZE - { 0, SPTR_SIZENS, 0 }, // POINTER_SSIZE - { 0, SPTR_SIZEWE, 0 }, // POINTER_WSIZE - { 0, SPTR_SIZEWE, 0 }, // POINTER_ESIZE - { 0, SPTR_SIZENWSE, 0 }, // POINTER_NWSIZE - { 0, SPTR_SIZENESW, 0 }, // POINTER_NESIZE - { 0, SPTR_SIZENESW, 0 }, // POINTER_SWSIZE - { 0, SPTR_SIZENWSE, 0 }, // POINTER_SESIZE - { 0, SPTR_SIZENS, 0 }, // POINTER_WINDOW_NSIZE - { 0, SPTR_SIZENS, 0 }, // POINTER_WINDOW_SSIZE - { 0, SPTR_SIZEWE, 0 }, // POINTER_WINDOW_WSIZE - { 0, SPTR_SIZEWE, 0 }, // POINTER_WINDOW_ESIZE - { 0, SPTR_SIZENWSE, 0 }, // POINTER_WINDOW_NWSIZE - { 0, SPTR_SIZENESW, 0 }, // POINTER_WINDOW_NESIZE - { 0, SPTR_SIZENESW, 0 }, // POINTER_WINDOW_SWSIZE - { 0, SPTR_SIZENWSE, 0 }, // POINTER_WINDOW_SESIZE - { 0, 0, SAL_RESID_POINTER_HSPLIT }, // POINTER_HSPLIT - { 0, 0, SAL_RESID_POINTER_VSPLIT }, // POINTER_VSPLIT - { 0, 0, SAL_RESID_POINTER_HSIZEBAR }, // POINTER_HSIZEBAR - { 0, 0, SAL_RESID_POINTER_VSIZEBAR }, // POINTER_VSIZEBAR - { 0, 0, SAL_RESID_POINTER_HAND }, // POINTER_HAND - { 0, 0, SAL_RESID_POINTER_REFHAND }, // POINTER_REFHAND - { 0, 0, SAL_RESID_POINTER_PEN }, // POINTER_PEN - { 0, 0, SAL_RESID_POINTER_MAGNIFY }, // POINTER_MAGNIFY - { 0, 0, SAL_RESID_POINTER_FILL }, // POINTER_FILL - { 0, 0, SAL_RESID_POINTER_ROTATE }, // POINTER_ROTATE - { 0, 0, SAL_RESID_POINTER_HSHEAR }, // POINTER_HSHEAR - { 0, 0, SAL_RESID_POINTER_VSHEAR }, // POINTER_VSHEAR - { 0, 0, SAL_RESID_POINTER_MIRROR }, // POINTER_MIRROR - { 0, 0, SAL_RESID_POINTER_CROOK }, // POINTER_CROOK - { 0, 0, SAL_RESID_POINTER_CROP }, // POINTER_CROP - { 0, 0, SAL_RESID_POINTER_MOVEPOINT }, // POINTER_MOVEPOINT - { 0, 0, SAL_RESID_POINTER_MOVEBEZIERWEIGHT }, // POINTER_MOVEBEZIERWEIGHT - { 0, 0, SAL_RESID_POINTER_MOVEDATA }, // POINTER_MOVEDATA - { 0, 0, SAL_RESID_POINTER_COPYDATA }, // POINTER_COPYDATA - { 0, 0, SAL_RESID_POINTER_LINKDATA }, // POINTER_LINKDATA - { 0, 0, SAL_RESID_POINTER_MOVEDATALINK }, // POINTER_MOVEDATALINK - { 0, 0, SAL_RESID_POINTER_COPYDATALINK }, // POINTER_COPYDATALINK - { 0, 0, SAL_RESID_POINTER_MOVEFILE }, // POINTER_MOVEFILE - { 0, 0, SAL_RESID_POINTER_COPYFILE }, // POINTER_COPYFILE - { 0, 0, SAL_RESID_POINTER_LINKFILE }, // POINTER_LINKFILE - { 0, 0, SAL_RESID_POINTER_MOVEFILELINK }, // POINTER_MOVEFILELINK - { 0, 0, SAL_RESID_POINTER_COPYFILELINK }, // POINTER_COPYFILELINK - { 0, 0, SAL_RESID_POINTER_MOVEFILES }, // POINTER_MOVEFILES - { 0, 0, SAL_RESID_POINTER_COPYFILES }, // POINTER_COPYFILES - { 0, SPTR_ILLEGAL, 0 }, // POINTER_NOTALLOWED - { 0, 0, SAL_RESID_POINTER_DRAW_LINE }, // POINTER_DRAW_LINE - { 0, 0, SAL_RESID_POINTER_DRAW_RECT }, // POINTER_DRAW_RECT - { 0, 0, SAL_RESID_POINTER_DRAW_POLYGON }, // POINTER_DRAW_POLYGON - { 0, 0, SAL_RESID_POINTER_DRAW_BEZIER }, // POINTER_DRAW_BEZIER - { 0, 0, SAL_RESID_POINTER_DRAW_ARC }, // POINTER_DRAW_ARC - { 0, 0, SAL_RESID_POINTER_DRAW_PIE }, // POINTER_DRAW_PIE - { 0, 0, SAL_RESID_POINTER_DRAW_CIRCLECUT }, // POINTER_DRAW_CIRCLECUT - { 0, 0, SAL_RESID_POINTER_DRAW_ELLIPSE }, // POINTER_DRAW_ELLIPSE - { 0, 0, SAL_RESID_POINTER_DRAW_FREEHAND }, // POINTER_DRAW_FREEHAND - { 0, 0, SAL_RESID_POINTER_DRAW_CONNECT }, // POINTER_DRAW_CONNECT - { 0, 0, SAL_RESID_POINTER_DRAW_TEXT }, // POINTER_DRAW_TEXT - { 0, 0, SAL_RESID_POINTER_DRAW_CAPTION }, // POINTER_DRAW_CAPTION - { 0, 0, SAL_RESID_POINTER_CHART }, // POINTER_CHART - { 0, 0, SAL_RESID_POINTER_DETECTIVE }, // POINTER_DETECTIVE - { 0, 0, SAL_RESID_POINTER_PIVOT_COL }, // POINTER_PIVOT_COL - { 0, 0, SAL_RESID_POINTER_PIVOT_ROW }, // POINTER_PIVOT_ROW - { 0, 0, SAL_RESID_POINTER_PIVOT_FIELD }, // POINTER_PIVOT_FIELD - { 0, 0, SAL_RESID_POINTER_CHAIN }, // POINTER_CHAIN - { 0, 0, SAL_RESID_POINTER_CHAIN_NOTALLOWED }, // POINTER_CHAIN_NOTALLOWED - { 0, 0, SAL_RESID_POINTER_TIMEEVENT_MOVE }, // POINTER_TIMEEVENT_MOVE - { 0, 0, SAL_RESID_POINTER_TIMEEVENT_SIZE }, // POINTER_TIMEEVENT_SIZE - { 0, 0, SAL_RESID_POINTER_AUTOSCROLL_N }, // POINTER_AUTOSCROLL_N - { 0, 0, SAL_RESID_POINTER_AUTOSCROLL_S }, // POINTER_AUTOSCROLL_S - { 0, 0, SAL_RESID_POINTER_AUTOSCROLL_W }, // POINTER_AUTOSCROLL_W - { 0, 0, SAL_RESID_POINTER_AUTOSCROLL_E }, // POINTER_AUTOSCROLL_E - { 0, 0, SAL_RESID_POINTER_AUTOSCROLL_NW }, // POINTER_AUTOSCROLL_NW - { 0, 0, SAL_RESID_POINTER_AUTOSCROLL_NE }, // POINTER_AUTOSCROLL_NE - { 0, 0, SAL_RESID_POINTER_AUTOSCROLL_SW }, // POINTER_AUTOSCROLL_SW - { 0, 0, SAL_RESID_POINTER_AUTOSCROLL_SE }, // POINTER_AUTOSCROLL_SE - { 0, 0, SAL_RESID_POINTER_AUTOSCROLL_NS }, // POINTER_AUTOSCROLL_NS - { 0, 0, SAL_RESID_POINTER_AUTOSCROLL_WE }, // POINTER_AUTOSCROLL_WE - { 0, 0, SAL_RESID_POINTER_AUTOSCROLL_NSWE }, // POINTER_AUTOSCROLL_NSWE - { 0, 0, SAL_RESID_POINTER_AIRBRUSH }, // POINTER_AIRBRUSH - { 0, 0, SAL_RESID_POINTER_TEXT_VERTICAL }, // POINTER_TEXT_VERTICAL - { 0, 0, SAL_RESID_POINTER_PIVOT_DELETE }, // POINTER_PIVOT_DELETE - - // #i32329# - { 0, 0, SAL_RESID_POINTER_TAB_SELECT_S }, // POINTER_TAB_SELECT_S - { 0, 0, SAL_RESID_POINTER_TAB_SELECT_E }, // POINTER_TAB_SELECT_E - { 0, 0, SAL_RESID_POINTER_TAB_SELECT_SE }, // POINTER_TAB_SELECT_SE - { 0, 0, SAL_RESID_POINTER_TAB_SELECT_W }, // POINTER_TAB_SELECT_W - { 0, 0, SAL_RESID_POINTER_TAB_SELECT_SW }, // POINTER_TAB_SELECT_SW - // <-- - - // #i20119# - { 0, 0, SAL_RESID_POINTER_PAINTBRUSH } // POINTER_PAINTBRUSH - // <-- - }; - -#if POINTER_COUNT != 94 -#error New Pointer must be defined! -#endif - - // Mousepointer loaded ? - if ( !aImplPtrTab[ePointerStyle].mhPointer ) - { - if ( aImplPtrTab[ePointerStyle].mnOwnId ) - aImplPtrTab[ePointerStyle].mhPointer = ImplLoadSalCursor( (ULONG)aImplPtrTab[ePointerStyle].mnOwnId ); - else - aImplPtrTab[ePointerStyle].mhPointer = WinQuerySysPointer( HWND_DESKTOP, aImplPtrTab[ePointerStyle].mnSysId, FALSE ); - } - if (aImplPtrTab[ePointerStyle].mhPointer == 0) { - debug_printf( "SetPointer ePointerStyle %d unknown\n", ePointerStyle); - aImplPtrTab[ePointerStyle].mhPointer = SPTR_ICONERROR; - } - - // Unterscheidet sich der Mauspointer, dann den neuen setzen - if ( mhPointer != aImplPtrTab[ePointerStyle].mhPointer ) - { - mhPointer = aImplPtrTab[ePointerStyle].mhPointer; - WinSetPointer( HWND_DESKTOP, mhPointer ); - } -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::CaptureMouse( BOOL bCapture ) -{ -#if OSL_DEBUG_LEVEL > 1 - _bCapture=bCapture; - debug_printf("Os2SalFrame::CaptureMouse bCapture %d\n", bCapture); -#endif - if ( bCapture ) - WinSetCapture( HWND_DESKTOP, mhWndClient ); - else - WinSetCapture( HWND_DESKTOP, 0 ); -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::SetPointerPos( long nX, long nY ) -{ - POINTL aPt; - aPt.x = nX; - aPt.y = mnHeight - nY - 1; // convert sal coords to sys - WinMapWindowPoints( mhWndClient, HWND_DESKTOP, &aPt, 1 ); - WinSetPointerPos( HWND_DESKTOP, aPt.x, aPt.y ); -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::Flush() -{ -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::Sync() -{ -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::SetInputContext( SalInputContext* pContext ) -{ -#ifdef ENABLE_IME - SalIMEData* pIMEData = GetSalIMEData(); - if ( pIMEData ) - { - HWND hWnd = mhWndClient; - HIMI hIMI = 0; - pIMEData->mpGetIME( hWnd, &hIMI ); - if ( hIMI ) - { - ULONG nInputMode; - ULONG nConversionMode; - if ( 0 == pIMEData->mpQueryIMEMode( hIMI, &nInputMode, &nConversionMode ) ) - { - if ( pContext->mnOptions & SAL_INPUTCONTEXT_TEXT ) - { - nInputMode &= ~IMI_IM_IME_DISABLE; - if ( pContext->mnOptions & SAL_INPUTCONTEXT_EXTTEXTINPUT_OFF ) - nInputMode &= ~IMI_IM_IME_ON; - nInputMode |= IMI_IM_IME_ON; - } - else - nInputMode |= IMI_IM_IME_DISABLE; - pIMEData->mpSetIMEMode( hIMI, nInputMode, nConversionMode ); - } - - pIMEData->mpReleaseIME( hWnd, hIMI ); - } - } -#endif -} - -// ----------------------------------------------------------------------- - -// ----------------------------------------------------------------------- - -void Os2SalFrame::EndExtTextInput( USHORT nFlags ) -{ -#ifdef ENABLE_IME - SalIMEData* pIMEData = GetSalIMEData(); - if ( pIMEData ) - { - HWND hWnd = mhWndClient; - HIMI hIMI = 0; - pIMEData->mpGetIME( hWnd, &hIMI ); - if ( hIMI ) - { - ULONG nIndex; - if ( nFlags & SAL_FRAME_ENDEXTTEXTINPUT_COMPLETE ) - nIndex = CNV_COMPLETE; - else - nIndex = CNV_CANCEL; - - pIMEData->mpRequestIME( hIMI, REQ_CONVERSIONSTRING, nIndex, 0 ); - pIMEData->mpReleaseIME( hWnd, hIMI ); - } - } -#endif -} - -// ----------------------------------------------------------------------- - -XubString Os2SalFrame::GetKeyName( USHORT nCode ) -{ - if ( eImplKeyboardLanguage == LANGUAGE_DONTKNOW ) - eImplKeyboardLanguage = MsLangId::getSystemLanguage(); - - XubString aKeyCode; - XubString aCode; - const sal_Unicode** pLangTab = ImplGetLangTab( eImplKeyboardLanguage ); - - if ( nCode & KEY_SHIFT ) - aKeyCode = pLangTab[LSTR_KEY_SHIFT]; - - if ( nCode & KEY_MOD1 ) - { - if ( aKeyCode.Len() == 0 ) - aKeyCode = pLangTab[LSTR_KEY_CTRL]; - else - { - aKeyCode += '+'; - aKeyCode += pLangTab[LSTR_KEY_CTRL]; - } - } - - if ( nCode & KEY_MOD2 ) - { - if ( aKeyCode.Len() == 0 ) - aKeyCode = pLangTab[LSTR_KEY_ALT]; - else - { - aKeyCode += '+'; - aKeyCode += pLangTab[LSTR_KEY_ALT]; - } - } - - USHORT nKeyCode = nCode & 0x0FFF; - if ( (nKeyCode >= KEY_0) && (nKeyCode <= KEY_9) ) - aCode = sal::static_int_cast<sal_Char>('0' + (nKeyCode - KEY_0)); - else if ( (nKeyCode >= KEY_A) && (nKeyCode <= KEY_Z) ) - aCode = sal::static_int_cast<sal_Char>('A' + (nKeyCode - KEY_A)); - else if ( (nKeyCode >= KEY_F1) && (nKeyCode <= KEY_F26) ) - { - aCode += 'F'; - if ( (nKeyCode >= KEY_F1) && (nKeyCode <= KEY_F9) ) - { - aCode += sal::static_int_cast<sal_Char>('1' + (nKeyCode - KEY_F1)); - } - else if ( (nKeyCode >= KEY_F10) && (nKeyCode <= KEY_F19) ) - { - aCode += '1'; - aCode += sal::static_int_cast<sal_Char>('0' + (nKeyCode - KEY_F10)); - } - else - { - aCode += '2'; - aCode += sal::static_int_cast<sal_Char>('0' + (nKeyCode - KEY_F20)); - } - } - else - { - switch ( nKeyCode ) - { - case KEY_DOWN: - aCode = pLangTab[LSTR_KEY_DOWN]; - break; - case KEY_UP: - aCode = pLangTab[LSTR_KEY_UP]; - break; - case KEY_LEFT: - aCode = pLangTab[LSTR_KEY_LEFT]; - break; - case KEY_RIGHT: - aCode = pLangTab[LSTR_KEY_RIGHT]; - break; - case KEY_HOME: - aCode = pLangTab[LSTR_KEY_HOME]; - break; - case KEY_END: - aCode = pLangTab[LSTR_KEY_END]; - break; - case KEY_PAGEUP: - aCode = pLangTab[LSTR_KEY_PAGEUP]; - break; - case KEY_PAGEDOWN: - aCode = pLangTab[LSTR_KEY_PAGEDOWN]; - break; - case KEY_RETURN: - aCode = pLangTab[LSTR_KEY_RETURN]; - break; - case KEY_ESCAPE: - aCode = pLangTab[LSTR_KEY_ESC]; - break; - case KEY_TAB: - aCode = pLangTab[LSTR_KEY_TAB]; - break; - case KEY_BACKSPACE: - aCode = pLangTab[LSTR_KEY_BACKSPACE]; - break; - case KEY_SPACE: - aCode = pLangTab[LSTR_KEY_SPACE]; - break; - case KEY_INSERT: - aCode = pLangTab[LSTR_KEY_INSERT]; - break; - case KEY_DELETE: - aCode = pLangTab[LSTR_KEY_DELETE]; - break; - - case KEY_ADD: - aCode += '+'; - break; - case KEY_SUBTRACT: - aCode += '-'; - break; - case KEY_MULTIPLY: - aCode += '*'; - break; - case KEY_DIVIDE: - aCode += '/'; - break; - case KEY_POINT: - aCode += '.'; - break; - case KEY_COMMA: - aCode += ','; - break; - case KEY_LESS: - aCode += '<'; - break; - case KEY_GREATER: - aCode += '>'; - break; - case KEY_EQUAL: - aCode += '='; - break; - } - } - - if ( aCode.Len() ) - { - if ( aKeyCode.Len() == 0 ) - aKeyCode = aCode; - else - { - aKeyCode += '+'; - aKeyCode += aCode; - } - } - - return aKeyCode; -} - -// ----------------------------------------------------------------------- - -XubString Os2SalFrame::GetSymbolKeyName( const XubString&, USHORT nKeyCode ) -{ - return GetKeyName( nKeyCode ); -} - -// ----------------------------------------------------------------------- - -inline long ImplOS2ColorToSal( long nOS2Color ) -{ - return MAKE_SALCOLOR( (BYTE)( nOS2Color>>16), (BYTE)(nOS2Color>>8), (BYTE)nOS2Color ); -} - -// ----------------------------------------------------------------------- - -static USHORT ImplMouseSysValueToSAL( int iSysValue, USHORT& rCode, USHORT& rClicks, BOOL& rDown ) -{ - LONG lValue = WinQuerySysValue( HWND_DESKTOP, iSysValue ); - - rCode = 0; - rClicks = 1; - rDown = TRUE; - - switch ( lValue & 0xFFFF ) - { - case WM_BUTTON1UP: - case WM_BUTTON1CLICK: - rCode = MOUSE_LEFT; - rDown = FALSE; - break; - case WM_BUTTON1DOWN: - case WM_BUTTON1MOTIONSTART: - rCode = MOUSE_LEFT; - break; - case WM_BUTTON1DBLCLK: - rCode = MOUSE_LEFT; - rClicks = 2; - break; - - case WM_BUTTON2UP: - case WM_BUTTON2CLICK: - rCode = MOUSE_RIGHT; - rDown = FALSE; - break; - case WM_BUTTON2DOWN: - case WM_BUTTON2MOTIONSTART: - rCode = MOUSE_RIGHT; - break; - case WM_BUTTON2DBLCLK: - rCode = MOUSE_RIGHT; - rClicks = 2; - break; - - case WM_BUTTON3UP: - case WM_BUTTON3CLICK: - rCode = MOUSE_MIDDLE; - rDown = FALSE; - break; - case WM_BUTTON3DOWN: - case WM_BUTTON3MOTIONSTART: - rCode = MOUSE_MIDDLE; - break; - case WM_BUTTON3DBLCLK: - rCode = MOUSE_MIDDLE; - rClicks = 2; - break; - } - - if ( !rCode ) - return FALSE; - - lValue = (lValue & 0xFFFF0000) >> 16; - if ( lValue != 0xFFFF ) - { - if ( lValue & KC_SHIFT ) - rCode |= KEY_SHIFT; - if ( lValue & KC_CTRL ) - rCode |= KEY_MOD1; - if ( lValue & KC_ALT ) - rCode |= KEY_MOD2; - } - - return TRUE; -} - -// ----------------------------------------------------------------------- - -static BOOL ImplSalIsSameColor( const Color& rColor1, const Color& rColor2 ) -{ - ULONG nWrong = 0; - nWrong += Abs( (short)rColor1.GetRed()-(short)rColor2.GetRed() ); - nWrong += Abs( (short)rColor1.GetGreen()-(short)rColor2.GetGreen() ); - nWrong += Abs( (short)rColor1.GetBlue()-(short)rColor2.GetBlue() ); - return (nWrong < 30); -} - -// ----------------------------------------------------------------------- - -static BOOL ImplOS2NameFontToVCLFont( const char* pFontName, Font& rFont ) -{ - char aNumBuf[10]; - int nNumBufLen = 0; - - while ( *pFontName && (*pFontName != '.') && - (nNumBufLen < sizeof(aNumBuf)-1) ) - { - aNumBuf[nNumBufLen] = *pFontName; - nNumBufLen++; - pFontName++; - } - aNumBuf[nNumBufLen] = '\0'; - - pFontName++; - while ( *pFontName == ' ' ) - pFontName++; - - int nFontHeight = atoi( aNumBuf ); - int nFontNameLen = strlen( pFontName ); - if ( nFontHeight && nFontNameLen ) - { - rFont.SetFamily( FAMILY_DONTKNOW ); - rFont.SetWeight( WEIGHT_NORMAL ); - rFont.SetItalic( ITALIC_NONE ); - // search for a style embedded in the name, e.g. 'WarpSans Bold' - // because we need to split the style from the family name - if (strstr( pFontName, " Bold") - || strstr( pFontName, " Italic") - || strstr( pFontName, "-Normal")) - { - char* fontName = strdup( pFontName); - char* style = strstr( fontName, " Bold"); - if (style) - rFont.SetWeight( WEIGHT_BOLD ); - - if (!style) - style = strstr( fontName, " Italic"); - if (style) - rFont.SetItalic( ITALIC_NORMAL ); - - if (!style) - style = strstr( fontName, "-Normal"); - // store style, skip whitespace char - rFont.SetStyleName( ::rtl::OStringToOUString ( style+1, gsl_getSystemTextEncoding()) ); - // truncate name - *style = 0; - // store family name - rFont.SetName( ::rtl::OStringToOUString ( fontName, gsl_getSystemTextEncoding()) ); - free( fontName); - } - else - { - rFont.SetName( ::rtl::OStringToOUString (pFontName, gsl_getSystemTextEncoding()) ); - rFont.SetStyleName( ::rtl::OStringToOUString ("", gsl_getSystemTextEncoding()) ); - } - - rFont.SetSize( Size( 0, nFontHeight ) ); - return TRUE; - } - else - return FALSE; -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::UpdateSettings( AllSettings& rSettings ) -{ - static char aControlPanel[] = "PM_ControlPanel"; - static char aSystemFonts[] = "PM_SystemFonts"; - char aDummyStr[] = ""; - - // --- Mouse setting --- - USHORT nCode; - USHORT nClicks; - BOOL bDown; - MouseSettings aMouseSettings = rSettings.GetMouseSettings(); - aMouseSettings.SetDoubleClickTime( WinQuerySysValue( HWND_DESKTOP, SV_DBLCLKTIME ) ); - if ( ImplMouseSysValueToSAL( SV_BEGINDRAG, nCode, nClicks, bDown ) ) - aMouseSettings.SetStartDragCode( nCode ); - if ( ImplMouseSysValueToSAL( SV_CONTEXTMENU, nCode, nClicks, bDown ) ) - { - aMouseSettings.SetContextMenuCode( nCode ); - aMouseSettings.SetContextMenuClicks( nClicks ); - aMouseSettings.SetContextMenuDown( bDown ); - } - aMouseSettings.SetButtonStartRepeat( WinQuerySysValue( HWND_DESKTOP, SV_FIRSTSCROLLRATE ) ); - aMouseSettings.SetButtonRepeat( WinQuerySysValue( HWND_DESKTOP, SV_SCROLLRATE ) ); - rSettings.SetMouseSettings( aMouseSettings ); - - // --- Style settings --- - StyleSettings aStyleSettings = rSettings.GetStyleSettings(); - // General settings - LONG nDisplayTime = PrfQueryProfileInt( HINI_PROFILE, (PSZ)aControlPanel, (PSZ)"LogoDisplayTime", -1 ); - ULONG nSalDisplayTime; - if ( nDisplayTime < 0 ) - nSalDisplayTime = LOGO_DISPLAYTIME_STARTTIME; - else if ( !nDisplayTime ) - nSalDisplayTime = LOGO_DISPLAYTIME_NOLOGO; - else - nSalDisplayTime = (ULONG)nDisplayTime; - aStyleSettings.SetLogoDisplayTime( nSalDisplayTime ); - - aStyleSettings.SetCursorBlinkTime( WinQuerySysValue( HWND_DESKTOP, SV_CURSORRATE ) ); - ULONG nDragFullOptions = aStyleSettings.GetDragFullOptions(); - if ( WinQuerySysValue( HWND_DESKTOP, SV_DYNAMICDRAG ) ) - nDragFullOptions |= DRAGFULL_OPTION_WINDOWMOVE | DRAGFULL_OPTION_WINDOWSIZE | DRAGFULL_OPTION_DOCKING | DRAGFULL_OPTION_SPLIT; - else - nDragFullOptions &= ~(DRAGFULL_OPTION_WINDOWMOVE | DRAGFULL_OPTION_WINDOWSIZE | DRAGFULL_OPTION_DOCKING | DRAGFULL_OPTION_SPLIT); - aStyleSettings.SetDragFullOptions( nDragFullOptions ); - - // Size settings - aStyleSettings.SetScrollBarSize( WinQuerySysValue( HWND_DESKTOP, SV_CYHSCROLL ) ); - aStyleSettings.SetTitleHeight( WinQuerySysValue( HWND_DESKTOP, SV_CYTITLEBAR ) ); - - // Color settings - aStyleSettings.SetFaceColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_BUTTONMIDDLE, 0 ) ) ); - aStyleSettings.SetInactiveTabColor( aStyleSettings.GetFaceColor() ); - aStyleSettings.SetLightColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_BUTTONLIGHT, 0 ) ) ); - aStyleSettings.SetLightBorderColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_BUTTONMIDDLE, 0 ) ) ); - aStyleSettings.SetShadowColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_BUTTONDARK, 0 ) ) ); - aStyleSettings.SetDarkShadowColor( Color( COL_BLACK ) ); - aStyleSettings.SetDialogColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_DIALOGBACKGROUND, 0 ) ) ); - aStyleSettings.SetButtonTextColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_MENUTEXT, 0 ) ) ); - aStyleSettings.SetActiveColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_ACTIVETITLE, 0 ) ) ); - aStyleSettings.SetActiveTextColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_ACTIVETITLETEXT, 0 ) ) ); - aStyleSettings.SetActiveBorderColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_ACTIVEBORDER, 0 ) ) ); - aStyleSettings.SetDeactiveColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_INACTIVETITLE, 0 ) ) ); - aStyleSettings.SetDeactiveTextColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_INACTIVETITLETEXT, 0 ) ) ); - aStyleSettings.SetDeactiveBorderColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_INACTIVEBORDER, 0 ) ) ); - aStyleSettings.SetMenuColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_MENU, 0 ) ) ); - aStyleSettings.SetMenuTextColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_MENUTEXT, 0 ) ) ); - aStyleSettings.SetMenuBarTextColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_MENUTEXT, 0 ) ) ); - aStyleSettings.SetDialogTextColor( aStyleSettings.GetButtonTextColor() ); - aStyleSettings.SetRadioCheckTextColor( aStyleSettings.GetButtonTextColor() ); - aStyleSettings.SetGroupTextColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_WINDOWSTATICTEXT, 0 ) ) ); - aStyleSettings.SetLabelTextColor( aStyleSettings.GetGroupTextColor() ); - aStyleSettings.SetInfoTextColor( aStyleSettings.GetGroupTextColor() ); - aStyleSettings.SetWindowColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_WINDOW, 0 ) ) ); - aStyleSettings.SetActiveTabColor( aStyleSettings.GetWindowColor() ); - aStyleSettings.SetWindowTextColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_WINDOWTEXT, 0 ) ) ); - aStyleSettings.SetFieldColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_ENTRYFIELD, 0 ) ) ); - aStyleSettings.SetFieldTextColor( aStyleSettings.GetWindowTextColor() ); - aStyleSettings.SetDisableColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_MENUDISABLEDTEXT, 0 ) ) ); - aStyleSettings.SetHighlightColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_HILITEBACKGROUND, 0 ) ) ); - aStyleSettings.SetHighlightTextColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_HILITEFOREGROUND, 0 ) ) ); - Color aMenuHighColor = ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_MENUHILITEBGND, 0 ) ); - if ( ImplSalIsSameColor( aMenuHighColor, aStyleSettings.GetMenuColor() ) ) - { - aStyleSettings.SetMenuHighlightColor( Color( COL_BLUE ) ); - aStyleSettings.SetMenuHighlightTextColor( Color( COL_WHITE ) ); - } - else - { - aStyleSettings.SetMenuHighlightColor( aMenuHighColor ); - aStyleSettings.SetMenuHighlightTextColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_MENUHILITE, 0 ) ) ); - } - // Checked-Color berechnen - Color aColor1 = aStyleSettings.GetFaceColor(); - Color aColor2 = aStyleSettings.GetLightColor(); - BYTE nRed = (BYTE)(((USHORT)aColor1.GetRed() + (USHORT)aColor2.GetRed())/2); - BYTE nGreen = (BYTE)(((USHORT)aColor1.GetGreen() + (USHORT)aColor2.GetGreen())/2); - BYTE nBlue = (BYTE)(((USHORT)aColor1.GetBlue() + (USHORT)aColor2.GetBlue())/2); - aStyleSettings.SetCheckedColor( Color( nRed, nGreen, nBlue ) ); - - // Fonts updaten - Font aFont; - char aFontNameBuf[255]; - aFont = aStyleSettings.GetMenuFont(); - if ( PrfQueryProfileString( HINI_PROFILE, (PSZ)aSystemFonts, (PSZ)"Menus", aDummyStr, aFontNameBuf, sizeof( aFontNameBuf ) ) > 5 ) - { - if ( ImplOS2NameFontToVCLFont( aFontNameBuf, aFont ) ) { - aStyleSettings.SetMenuFont( aFont ); - } - } - aFont = aStyleSettings.GetIconFont(); - if ( PrfQueryProfileString( HINI_PROFILE, (PSZ)aSystemFonts, (PSZ)"IconText", aDummyStr, aFontNameBuf, sizeof( aFontNameBuf ) ) > 5 ) - { - if ( ImplOS2NameFontToVCLFont( aFontNameBuf, aFont ) ) - aStyleSettings.SetIconFont( aFont ); - } - aFont = aStyleSettings.GetTitleFont(); - if ( PrfQueryProfileString( HINI_PROFILE, (PSZ)aSystemFonts, (PSZ)"WindowTitles", aDummyStr, aFontNameBuf, sizeof( aFontNameBuf ) ) > 5 ) - { - if ( ImplOS2NameFontToVCLFont( aFontNameBuf, aFont ) ) - { - // Add Workplace Sans if not already listed - if ( aFont.GetName().Search( (sal_Unicode*)L"WorkPlace Sans" ) == STRING_NOTFOUND ) - { - XubString aFontName = aFont.GetName(); - aFontName.Insert( (sal_Unicode*)L"WorkPlace Sans;", 0 ); - aFont.SetName( aFontName ); - aFont.SetSize( Size( 0, 9 ) ); - aFont.SetWeight( WEIGHT_BOLD ); - aFont.SetItalic( ITALIC_NONE ); - } - aStyleSettings.SetTitleFont( aFont ); - aStyleSettings.SetFloatTitleFont( aFont ); - } - } - aFont = aStyleSettings.GetAppFont(); - if ( PrfQueryProfileString( HINI_PROFILE, (PSZ)aSystemFonts, (PSZ)"WindowText", aDummyStr, aFontNameBuf, sizeof( aFontNameBuf ) ) > 5 ) - { - if ( ImplOS2NameFontToVCLFont( aFontNameBuf, aFont ) ) - { - Font aHelpFont = aFont; - aHelpFont.SetName( (sal_Unicode*)L"Helv;WarpSans" ); - aHelpFont.SetSize( Size( 0, 8 ) ); - aHelpFont.SetWeight( WEIGHT_NORMAL ); - aHelpFont.SetItalic( ITALIC_NONE ); - aStyleSettings.SetHelpFont( aHelpFont ); - - // Add Workplace Sans if not already listed - if ( aFont.GetName().Search( (sal_Unicode*)L"WorkPlace Sans" ) == STRING_NOTFOUND ) - { - XubString aFontName = aFont.GetName(); - aFontName.Insert( (sal_Unicode*)L"WorkPlace Sans;", 0 ); - aFont.SetName( aFontName ); - aFont.SetSize( Size( 0, 9 ) ); - } - aStyleSettings.SetAppFont( aFont ); - aStyleSettings.SetToolFont( aFont ); - aStyleSettings.SetLabelFont( aFont ); - aStyleSettings.SetInfoFont( aFont ); - aStyleSettings.SetRadioCheckFont( aFont ); - aStyleSettings.SetPushButtonFont( aFont ); - aStyleSettings.SetFieldFont( aFont ); - aStyleSettings.SetGroupFont( aFont ); - } - } - - rSettings.SetStyleSettings( aStyleSettings ); -} - -// ----------------------------------------------------------------------- - -SalBitmap* Os2SalFrame::SnapShot() -{ -debug_printf("Os2SalFrame::SnapShot\n"); -return NULL; -} - -// ----------------------------------------------------------------------- - -const SystemEnvData* Os2SalFrame::GetSystemData() const -{ - return &maSysData; -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::Beep( SoundType eSoundType ) -{ - static ULONG aImplSoundTab[5] = - { - WA_NOTE, // SOUND_DEFAULT - WA_NOTE, // SOUND_INFO - WA_WARNING, // SOUND_WARNING - WA_ERROR, // SOUND_ERROR - WA_NOTE // SOUND_QUERY - }; - - debug_printf("Os2SalFrame::Beep %d\n", eSoundType); - WinAlarm( HWND_DESKTOP, aImplSoundTab[eSoundType] ); -} - -// ----------------------------------------------------------------------- - -SalFrame::SalPointerState Os2SalFrame::GetPointerState() -{ - SalPointerState aState; - aState.mnState = 0; - - // MausModus feststellen und setzen - if ( WinGetKeyState( HWND_DESKTOP, VK_BUTTON1 ) & 0x8000 ) - aState.mnState |= MOUSE_LEFT; - if ( WinGetKeyState( HWND_DESKTOP, VK_BUTTON2 ) & 0x8000 ) - aState.mnState |= MOUSE_RIGHT; - if ( WinGetKeyState( HWND_DESKTOP, VK_BUTTON3 ) & 0x8000 ) - aState.mnState |= MOUSE_MIDDLE; - // Modifier-Tasten setzen - if ( WinGetKeyState( HWND_DESKTOP, VK_SHIFT ) & 0x8000 ) - aState.mnState |= KEY_SHIFT; - if ( WinGetKeyState( HWND_DESKTOP, VK_CTRL ) & 0x8000 ) - aState.mnState |= KEY_MOD1; - if ( WinGetKeyState( HWND_DESKTOP, VK_ALT ) & 0x8000 ) - aState.mnState |= KEY_MOD2; - - POINTL pt; - _WinQueryPointerPos( HWND_DESKTOP, &pt ); - - aState.maPos = Point( pt.x - maGeometry.nX, pt.y - maGeometry.nY ); - return aState; -} - -// ----------------------------------------------------------------------- - -SalFrame::SalIndicatorState Os2SalFrame::GetIndicatorState() -{ - SalIndicatorState aState; - aState.mnState = 0; - return aState; -} - -void Os2SalFrame::SimulateKeyPress( USHORT /*nKeyCode*/ ) -{ -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::SetBackgroundBitmap( SalBitmap* ) -{ -} - -// ----------------------------------------------------------------------- - -void SalTestMouseLeave() -{ - SalData* pSalData = GetSalData(); - - if ( pSalData->mhWantLeaveMsg && !::WinQueryCapture( HWND_DESKTOP ) ) - { - POINTL aPt; - WinQueryPointerPos( HWND_DESKTOP, &aPt ); - if ( pSalData->mhWantLeaveMsg != WinWindowFromPoint( HWND_DESKTOP, &aPt, TRUE ) ) - WinSendMsg( pSalData->mhWantLeaveMsg, SAL_MSG_MOUSELEAVE, 0, MPFROM2SHORT( aPt.x, aPt.y ) ); - } -} - -// ----------------------------------------------------------------------- - -static long ImplHandleMouseMsg( HWND hWnd, - UINT nMsg, MPARAM nMP1, MPARAM nMP2 ) -{ - SalMouseEvent aMouseEvt; - long nRet; - USHORT nEvent; - BOOL bCall = TRUE; - USHORT nFlags = SHORT2FROMMP( nMP2 ); - Os2SalFrame* pFrame = GetWindowPtr( hWnd ); - if ( !pFrame ) - return 0; - - aMouseEvt.mnX = (short)SHORT1FROMMP( nMP1 ); - aMouseEvt.mnY = pFrame->mnHeight - (short)SHORT2FROMMP( nMP1 ) - 1; - aMouseEvt.mnCode = 0; - aMouseEvt.mnTime = WinQueryMsgTime( pFrame->mhAB ); - - // MausModus feststellen und setzen - if ( WinGetKeyState( HWND_DESKTOP, VK_BUTTON1 ) & 0x8000 ) - aMouseEvt.mnCode |= MOUSE_LEFT; - if ( WinGetKeyState( HWND_DESKTOP, VK_BUTTON2 ) & 0x8000 ) - aMouseEvt.mnCode |= MOUSE_RIGHT; - if ( WinGetKeyState( HWND_DESKTOP, VK_BUTTON3 ) & 0x8000 ) - aMouseEvt.mnCode |= MOUSE_MIDDLE; - // Modifier-Tasten setzen - if ( WinGetKeyState( HWND_DESKTOP, VK_SHIFT ) & 0x8000 ) - aMouseEvt.mnCode |= KEY_SHIFT; - if ( WinGetKeyState( HWND_DESKTOP, VK_CTRL ) & 0x8000 ) - aMouseEvt.mnCode |= KEY_MOD1; - if ( WinGetKeyState( HWND_DESKTOP, VK_ALT ) & 0x8000 ) - aMouseEvt.mnCode |= KEY_MOD2; - - switch ( nMsg ) - { - case WM_MOUSEMOVE: - { - SalData* pSalData = GetSalData(); - - // Da bei Druecken von Modifier-Tasten die MouseEvents - // nicht zusammengefast werden (da diese durch KeyEvents - // unterbrochen werden), machen wir dieses hier selber - if ( aMouseEvt.mnCode & (KEY_SHIFT | KEY_MOD1 | KEY_MOD2) ) - { - QMSG aTempMsg; - if ( WinPeekMsg( pSalData->mhAB, &aTempMsg, - pFrame->mhWndClient, - WM_MOUSEFIRST, WM_MOUSELAST, PM_NOREMOVE ) ) - { - if ( (aTempMsg.msg == WM_MOUSEMOVE) && - (aTempMsg.mp2 == nMP2) ) - return 1; - } - } - - // Test for MouseLeave - if ( pSalData->mhWantLeaveMsg && - (pSalData->mhWantLeaveMsg != pFrame->mhWndClient) ) - { - POINTL aMousePoint; - WinQueryMsgPos( pFrame->mhAB, &aMousePoint ); - WinSendMsg( pSalData->mhWantLeaveMsg, - SAL_MSG_MOUSELEAVE, - 0, MPFROM2SHORT( aMousePoint.x, aMousePoint.y ) ); - } - pSalData->mhWantLeaveMsg = pFrame->mhWndClient; - // Start MouseLeave-Timer - if ( !pSalData->mpMouseLeaveTimer ) - { - pSalData->mpMouseLeaveTimer = new AutoTimer; - pSalData->mpMouseLeaveTimer->SetTimeout( SAL_MOUSELEAVE_TIMEOUT ); - pSalData->mpMouseLeaveTimer->Start(); - // We dont need to set a timeout handler, because we test - // for mouseleave in the timeout callback - } - aMouseEvt.mnButton = 0; - nEvent = SALEVENT_MOUSEMOVE; - } - break; - - case SAL_MSG_MOUSELEAVE: - { - SalData* pSalData = GetSalData(); - if ( pSalData->mhWantLeaveMsg == pFrame->mhWndClient ) - { - pSalData->mhWantLeaveMsg = 0; - if ( pSalData->mpMouseLeaveTimer ) - { - delete pSalData->mpMouseLeaveTimer; - pSalData->mpMouseLeaveTimer = NULL; - } - - // Mouse-Coordinaates are relativ to the screen - POINTL aPt; - aPt.x = (short)SHORT1FROMMP( nMP2 ); - aPt.y = (short)SHORT2FROMMP( nMP2 ); - WinMapWindowPoints( HWND_DESKTOP, pFrame->mhWndClient, &aPt, 1 ); - aPt.y = pFrame->mnHeight - aPt.y - 1; - aMouseEvt.mnX = aPt.x; - aMouseEvt.mnY = aPt.y; - aMouseEvt.mnButton = 0; - nEvent = SALEVENT_MOUSELEAVE; - } - else - bCall = FALSE; - } - break; - - case WM_BUTTON1DBLCLK: - case WM_BUTTON1DOWN: - aMouseEvt.mnButton = MOUSE_LEFT; - nEvent = SALEVENT_MOUSEBUTTONDOWN; - break; - - case WM_BUTTON2DBLCLK: - case WM_BUTTON2DOWN: - aMouseEvt.mnButton = MOUSE_RIGHT; - nEvent = SALEVENT_MOUSEBUTTONDOWN; - break; - - case WM_BUTTON3DBLCLK: - case WM_BUTTON3DOWN: - aMouseEvt.mnButton = MOUSE_MIDDLE; - nEvent = SALEVENT_MOUSEBUTTONDOWN; - break; - - case WM_BUTTON1UP: - aMouseEvt.mnButton = MOUSE_LEFT; - nEvent = SALEVENT_MOUSEBUTTONUP; - break; - - case WM_BUTTON2UP: - aMouseEvt.mnButton = MOUSE_RIGHT; - nEvent = SALEVENT_MOUSEBUTTONUP; - break; - - case WM_BUTTON3UP: - aMouseEvt.mnButton = MOUSE_MIDDLE; - nEvent = SALEVENT_MOUSEBUTTONUP; - break; - } - - // check if this window was destroyed - this might happen if we are the help window - // and sent a mouse leave message to the application which killed the help window, ie ourself - if( !WinIsWindow( pFrame->mhAB, hWnd ) ) - return 0; - -#if OSL_DEBUG_LEVEL > 1 - debug_printf("ImplHandleMouseMsg mouse %d,%d\n",aMouseEvt.mnX,aMouseEvt.mnY); -#endif - - if ( bCall ) - { - if ( nEvent == SALEVENT_MOUSEBUTTONDOWN ) - WinUpdateWindow( pFrame->mhWndClient ); - - nRet = pFrame->CallCallback( nEvent, &aMouseEvt ); - if ( nMsg == WM_MOUSEMOVE ) - { - WinSetPointer( HWND_DESKTOP, pFrame->mhPointer ); - nRet = TRUE; - } - } - else - nRet = 0; - - return nRet; -} - -// ----------------------------------------------------------------------- - -static long ImplHandleWheelMsg( HWND hWnd, UINT nMsg, MPARAM nMP1, MPARAM nMP2 ) -{ - - ImplSalYieldMutexAcquireWithWait(); - - long nRet = 0; - Os2SalFrame* pFrame = GetWindowPtr( hWnd ); - if ( pFrame ) - { - - // Mouse-Coordinaates are relativ to the screen - POINTL aPt; - WinQueryMsgPos( pFrame->mhAB, &aPt ); - WinMapWindowPoints( HWND_DESKTOP, pFrame->mhWndClient, &aPt, 1 ); - aPt.y = pFrame->mnHeight - aPt.y - 1; - - SalWheelMouseEvent aWheelEvt; - aWheelEvt.mnTime = WinQueryMsgTime( pFrame->mhAB ); - aWheelEvt.mnX = aPt.x; - aWheelEvt.mnY = aPt.y; - aWheelEvt.mnCode = 0; - bool bNeg = (SHORT2FROMMP(nMP2) == SB_LINEDOWN || SHORT2FROMMP(nMP2) == SB_PAGEDOWN ); - aWheelEvt.mnDelta = bNeg ? -120 : 120; - aWheelEvt.mnNotchDelta = bNeg ? -1 : 1; - if (SHORT2FROMMP(nMP2) == SB_PAGEUP || SHORT2FROMMP(nMP2) == SB_PAGEDOWN) - aWheelEvt.mnScrollLines = SAL_WHEELMOUSE_EVENT_PAGESCROLL; - else - aWheelEvt.mnScrollLines = 1; - - if( nMsg == WM_HSCROLL ) - aWheelEvt.mbHorz = TRUE; - - // Modifier-Tasten setzen - if ( WinGetKeyState( HWND_DESKTOP, VK_SHIFT ) & 0x8000 ) - aWheelEvt.mnCode |= KEY_SHIFT; - if ( WinGetKeyState( HWND_DESKTOP, VK_CTRL ) & 0x8000 ) - aWheelEvt.mnCode |= KEY_MOD1; - if ( WinGetKeyState( HWND_DESKTOP, VK_ALT ) & 0x8000 ) - aWheelEvt.mnCode |= KEY_MOD2; - - nRet = pFrame->CallCallback( SALEVENT_WHEELMOUSE, &aWheelEvt ); - } - - ImplSalYieldMutexRelease(); - - return nRet; -} - - -// ----------------------------------------------------------------------- - -static USHORT ImplSalGetKeyCode( Os2SalFrame* pFrame, MPARAM aMP1, MPARAM aMP2 ) -{ - USHORT nKeyFlags = SHORT1FROMMP( aMP1 ); - UCHAR nCharCode = (UCHAR)SHORT1FROMMP( aMP2 ); - USHORT nKeyCode = (UCHAR)SHORT2FROMMP( aMP2 ); - UCHAR nScanCode = (UCHAR)CHAR4FROMMP( aMP1 ); - USHORT rSVCode = 0; - - // Ist virtueller KeyCode gesetzt und befindet sich der KeyCode in der - // Tabelle, dann mappen - if ( (nKeyFlags & KC_VIRTUALKEY) && (nKeyCode < KEY_TAB_SIZE) ) - rSVCode = aImplTranslateKeyTab[nKeyCode]; - - // Wenn kein KeyCode ermittelt werden konnte, versuchen wir aus dem - // CharCode einen zu erzeugen - if ( !rSVCode && nCharCode ) - { - // Bei 0-9, a-z und A-Z auch KeyCode setzen - if ( (nCharCode >= '0') && (nCharCode <= '9') && (!rSVCode || !(nKeyFlags & KC_SHIFT)) ) - rSVCode = KEYGROUP_NUM + (nCharCode-'0'); - else if ( (nCharCode >= 'a') && (nCharCode <= 'z') ) - rSVCode = KEYGROUP_ALPHA + (nCharCode-'a'); - else if ( (nCharCode >= 'A') && (nCharCode <= 'Z') ) - rSVCode = KEYGROUP_ALPHA + (nCharCode-'A'); - else - { - switch ( nCharCode ) - { - case '+': - rSVCode = KEY_ADD; - break; - case '-': - rSVCode = KEY_SUBTRACT; - break; - case '*': - rSVCode = KEY_MULTIPLY; - break; - case '/': - rSVCode = KEY_DIVIDE; - break; - case '.': - rSVCode = KEY_POINT; - break; - case ',': - rSVCode = KEY_COMMA; - break; - case '<': - rSVCode = KEY_LESS; - break; - case '>': - rSVCode = KEY_GREATER; - break; - case '=': - rSVCode = KEY_EQUAL; - break; - } - } - } - - // "Numlock-Hack": we want to get correct keycodes from the numpad - if ( (nCharCode >= '0') && (nCharCode <= '9') && !(nKeyFlags & KC_SHIFT) ) - rSVCode = KEYGROUP_NUM + (nCharCode-'0'); - if ( nCharCode == ',' ) - rSVCode = KEY_COMMA; - if ( nCharCode == '.' ) - rSVCode = KEY_POINT; - - return rSVCode; -} - -// ----------------------------------------------------------------------- - -static void ImplUpdateInputLang( Os2SalFrame* pFrame ) -{ - BOOL bLanguageChange = FALSE; - ULONG nLang = 0; - APIRET rc; - UconvObject uconv_object = NULL; - LocaleObject locale_object = NULL; - UniChar *pinfo_item; - - // we do not support change of input language while working, - // so exit if already defined (mnInputLang is a static class field) - if (pFrame->mnInputLang) - return; - - // get current locale - rc = UniCreateLocaleObject(UNI_UCS_STRING_POINTER, (UniChar *)L"", &locale_object); - // get Win32 locale id and sublanguage (hex uni string) - rc = UniQueryLocaleItem(locale_object, LOCI_xWinLocale, &pinfo_item); - // convert uni string to integer - rc = UniStrtoul(locale_object, pinfo_item, &pinfo_item, 16, &nLang); - rc = UniFreeMem(pinfo_item); -#if OSL_DEBUG_LEVEL > 1 - debug_printf("ImplUpdateInputLang nLang %04x\n", nLang); - char char_buffer[256]; - rc = UniCreateUconvObject((UniChar *)L"", &uconv_object); - rc = UniQueryLocaleItem(locale_object, LOCI_sKeyboard, &pinfo_item); - rc = UniStrFromUcs(uconv_object, char_buffer, pinfo_item, sizeof(char_buffer)); - debug_printf("Keyboard name is: %s\n", char_buffer ); - rc = UniFreeMem(pinfo_item); -#endif - rc = UniFreeLocaleObject(locale_object); - - // keep input lang up-to-date -#if OSL_DEBUG_LEVEL > 1 - debug_printf("ImplUpdateInputLang pFrame %08x lang changed from %d to %d\n", - pFrame, pFrame->mnInputLang, nLang); -#endif - pFrame->mnInputLang = nLang; -} - - -static sal_Unicode ImplGetCharCode( Os2SalFrame* pFrame, USHORT nKeyFlags, - sal_Char nCharCode, UCHAR nScanCode ) -{ - ImplUpdateInputLang( pFrame ); -#if OSL_DEBUG_LEVEL > 1 - debug_printf("ImplGetCharCode nCharCode %c, %04x\n", nCharCode, nCharCode); -#endif - return OUString( &nCharCode, 1, gsl_getSystemTextEncoding()).toChar(); -} - -// ----------------------------------------------------------------------- - -LanguageType Os2SalFrame::GetInputLanguage() -{ - if( !mnInputLang ) - ImplUpdateInputLang( this ); - - if( !mnInputLang ) - return LANGUAGE_DONTKNOW; - else - return (LanguageType) mnInputLang; -} - -// ----------------------------------------------------------------------- - -BOOL Os2SalFrame::MapUnicodeToKeyCode( sal_Unicode , LanguageType , KeyCode& ) -{ - // not supported yet - return FALSE; -} - -// ----------------------------------------------------------------------- - -static sal_Unicode ImplConvertKey( Os2SalFrame* pFrame, MPARAM aMP1, MPARAM aMP2 ) -{ - USHORT nKeyFlags = SHORT1FROMMP( aMP1 ); - UCHAR nCharCode = (UCHAR)SHORT1FROMMP( aMP2 ); - USHORT nKeyCode = (UCHAR)SHORT2FROMMP( aMP2 ); - UCHAR nScanCode = (UCHAR)CHAR4FROMMP( aMP1 ); - sal_Unicode rSVCharCode = 0; - - // Ist Character-Code gesetzt - // !!! Bei CTRL/ALT ist KC_CHAR nicht gesetzt, jedoch moechten wir - // !!! dann auch einen CharCode und machen die Behandlung deshalb - // !!! selber - if ( (nKeyFlags & KC_CHAR) || (nKeyFlags & KC_CTRL) || (nKeyFlags & KC_ALT) ) - rSVCharCode = ImplGetCharCode( pFrame, nKeyFlags, nCharCode, nScanCode); - - // ret unicode - return rSVCharCode; -} - -// ----------------------------------------------------------------------- - -static long ImplHandleKeyMsg( HWND hWnd, - UINT nMsg, MPARAM nMP1, MPARAM nMP2 ) -{ - static USHORT nLastOS2KeyChar = 0; - static sal_Unicode nLastChar = 0; - USHORT nRepeat = CHAR3FROMMP( nMP1 ) - 1; - SHORT nFlags = SHORT1FROMMP( nMP1 ); - USHORT nModCode = 0; - USHORT nSVCode = 0; - USHORT nOS2KeyCode = (UCHAR)SHORT2FROMMP( nMP2 ); - sal_Unicode nSVCharCode = 0; - long nRet = 0; - - Os2SalFrame* pFrame = GetWindowPtr( hWnd ); - if ( !pFrame ) - return 0; - - // determine modifiers - if ( nFlags & KC_SHIFT ) - nModCode |= KEY_SHIFT; - if ( nFlags & KC_CTRL ) - nModCode |= KEY_MOD1; - if ( nFlags & KC_ALT ) - nModCode |= KEY_MOD2; - - // Bei Shift, Control und Alt schicken wir einen KeyModChange-Event - if ( (nOS2KeyCode == VK_SHIFT) || (nOS2KeyCode == VK_CTRL) || - (nOS2KeyCode == VK_ALT) || (nOS2KeyCode == VK_ALTGRAF) ) - { - SalKeyModEvent aModEvt; - aModEvt.mnTime = WinQueryMsgTime( pFrame->mhAB ); - aModEvt.mnCode = nModCode; -#if OSL_DEBUG_LEVEL > 1 - debug_printf("SALEVENT_KEYMODCHANGE\n"); -#endif - nRet = pFrame->CallCallback( SALEVENT_KEYMODCHANGE, &aModEvt ); - } - else - { - nSVCode = ImplSalGetKeyCode( pFrame, nMP1, nMP2 ); - nSVCharCode = ImplConvertKey( pFrame, nMP1, nMP2 ); -#if OSL_DEBUG_LEVEL > 1 - debug_printf("nSVCode %04x nSVCharCode %04x\n",nSVCode,nSVCharCode ); -#endif - - // Fuer Java muessen wir bei KeyUp einen CharCode liefern - if ( nFlags & KC_KEYUP ) - { - if ( !nSVCharCode ) - { - if ( nLastOS2KeyChar == nOS2KeyCode ) - { - nSVCharCode = nLastChar; - nLastOS2KeyChar = 0; - nLastChar = 0; - } - } - else - { - nLastOS2KeyChar = 0; - nLastChar = 0; - } - } - else - { - nLastOS2KeyChar = nOS2KeyCode; - nLastChar = nSVCharCode; - } - - if ( nSVCode || nSVCharCode ) - { - SalKeyEvent aKeyEvt; - aKeyEvt.mnCode = nSVCode; - aKeyEvt.mnTime = WinQueryMsgTime( pFrame->mhAB ); - aKeyEvt.mnCode |= nModCode; - aKeyEvt.mnCharCode = nSVCharCode; - aKeyEvt.mnRepeat = nRepeat; - -#if OSL_DEBUG_LEVEL > 1 - debug_printf( (nFlags & KC_KEYUP) ? "SALEVENT_KEYUP\n" : "SALEVENT_KEYINPUT\n"); -#endif - nRet = pFrame->CallCallback( (nFlags & KC_KEYUP) ? SALEVENT_KEYUP : SALEVENT_KEYINPUT, - &aKeyEvt ); - } - } - - return nRet; -} - -// ----------------------------------------------------------------------- - -static bool ImplHandlePaintMsg( HWND hWnd ) -{ - BOOL bMutex = FALSE; - - if ( ImplSalYieldMutexTryToAcquire() ) - bMutex = TRUE; - - // if we don't get the mutex, we can also change the clip region, - // because other threads doesn't use the mutex from the main - // thread --> see GetGraphics() - - Os2SalFrame* pFrame = GetWindowPtr( hWnd ); - if ( pFrame ) - { - // Laut Window-Doku soll man erst abfragen, ob ueberhaupt eine - // Paint-Region anliegt - if ( WinQueryUpdateRect( hWnd, NULL ) ) - { - // Call BeginPaint/EndPaint to query the rect and send - // this Notofication to rect - HPS hPS; - RECTL aUpdateRect; - hPS = WinBeginPaint( hWnd, NULLHANDLE, &aUpdateRect ); - WinEndPaint( hPS ); - - // Paint - if ( bMutex ) - { - SalPaintEvent aPEvt( aUpdateRect.xLeft, pFrame->mnHeight - aUpdateRect.yTop, aUpdateRect.xRight- aUpdateRect.xLeft, aUpdateRect.yTop - aUpdateRect.yBottom ); - - pFrame->CallCallback( SALEVENT_PAINT, &aPEvt ); - } - else - { - RECTL* pRect = new RECTL; - WinCopyRect( pFrame->mhAB, pRect, &aUpdateRect ); - WinPostMsg( hWnd, SAL_MSG_POSTPAINT, (MPARAM)pRect, 0 ); - } - } - } - - if ( bMutex ) - ImplSalYieldMutexRelease(); - - return bMutex ? true : false; -} - -// ----------------------------------------------------------------------- - -static void ImplHandlePaintMsg2( HWND hWnd, RECTL* pRect ) -{ - // Paint - if ( ImplSalYieldMutexTryToAcquire() ) - { - Os2SalFrame* pFrame = GetWindowPtr( hWnd ); - if ( pFrame ) - { - SalPaintEvent aPEvt( pRect->xLeft, pFrame->mnHeight - pRect->yTop, pRect->xRight - pRect->xLeft, pRect->yTop - pRect->yBottom ); - pFrame->CallCallback( SALEVENT_PAINT, &aPEvt ); - } - ImplSalYieldMutexRelease(); - delete pRect; - } - else - WinPostMsg( hWnd, SAL_MSG_POSTPAINT, (MPARAM)pRect, 0 ); -} - -// ----------------------------------------------------------------------- - -static void SetMaximizedFrameGeometry( HWND hWnd, Os2SalFrame* pFrame ) -{ - // calculate and set frame geometry of a maximized window - useful if the window is still hidden - - RECTL aRect; - pFrame->GetWorkArea( aRect); - - // a maximized window has no other borders than the caption - pFrame->maGeometry.nLeftDecoration = pFrame->maGeometry.nRightDecoration = pFrame->maGeometry.nBottomDecoration = 0; - pFrame->maGeometry.nTopDecoration = pFrame->mbCaption ? WinQuerySysValue( HWND_DESKTOP, SV_CYTITLEBAR ) : 0; - - aRect.yTop += pFrame->maGeometry.nTopDecoration; - pFrame->maGeometry.nX = aRect.xLeft; - pFrame->maGeometry.nY = aRect.yBottom; - pFrame->maGeometry.nWidth = aRect.xRight - aRect.xLeft + 1; - pFrame->maGeometry.nHeight = aRect.yBottom - aRect.yTop + 1; -} - -static void UpdateFrameGeometry( HWND hWnd, Os2SalFrame* pFrame ) -{ - if( !pFrame ) - return; - - //SalFrame has a - //maGeometry member that holds absolute screen positions (and needs to be - //updated if the window is moved by the way). - - // reset data - memset(&pFrame->maGeometry, 0, sizeof(SalFrameGeometry) ); - - SWP swp; - LONG nFrameX, nFrameY, nCaptionY; - - // get frame size - WinQueryWindowPos(pFrame->mhWndFrame, &swp); - if (swp.fl & SWP_MINIMIZE) - return; - - // map from client area to screen - ImplSalCalcFrameSize( pFrame, nFrameX, nFrameY, nCaptionY); - pFrame->maGeometry.nTopDecoration = nFrameY + nCaptionY; - pFrame->maGeometry.nLeftDecoration = nFrameX; - pFrame->maGeometry.nRightDecoration = nFrameX; - pFrame->maGeometry.nBottomDecoration = nFrameY; - - // position of client area, not of frame corner! - pFrame->maGeometry.nX = swp.x + nFrameX; - pFrame->maGeometry.nY = nScreenHeight - (swp.y + swp.cy) + nFrameY + nCaptionY; - - int nWidth = swp.cx - pFrame->maGeometry.nRightDecoration - pFrame->maGeometry.nLeftDecoration; - int nHeight = swp.cy - pFrame->maGeometry.nBottomDecoration - pFrame->maGeometry.nTopDecoration; - - // clamp to zero - pFrame->maGeometry.nHeight = nHeight < 0 ? 0 : nHeight; - pFrame->maGeometry.nWidth = nWidth < 0 ? 0 : nWidth; -#if OSL_DEBUG_LEVEL > 1 - debug_printf( "UpdateFrameGeometry: hwnd %x, frame %x at %d,%d (%dx%d)\n", - hWnd, pFrame->mhWndFrame, - pFrame->maGeometry.nX, pFrame->maGeometry.nY, - pFrame->maGeometry.nWidth,pFrame->maGeometry.nHeight); -#endif -} - -// ----------------------------------------------------------------------- - -static void ImplHandleMoveMsg( HWND hWnd) -{ - if ( ImplSalYieldMutexTryToAcquire() ) - { - Os2SalFrame* pFrame = GetWindowPtr( hWnd ); - if ( pFrame ) - { - UpdateFrameGeometry( hWnd, pFrame ); - - if ( WinIsWindowVisible( hWnd )) - pFrame->mbDefPos = FALSE; - - // Gegen moegliche Rekursionen sichern - if ( !pFrame->mbInMoveMsg ) - { - // Fenster im FullScreenModus wieder einpassen - pFrame->mbInMoveMsg = TRUE; - if ( pFrame->mbFullScreen ) - ImplSalFrameFullScreenPos( pFrame ); - pFrame->mbInMoveMsg = FALSE; - } - - // Status merken - ImplSaveFrameState( pFrame ); - - // Call Hdl - //#93851 if we call this handler, VCL floating windows are not updated correctly - //ImplCallMoveHdl( hWnd ); - - } - - ImplSalYieldMutexRelease(); - } - else - WinPostMsg( hWnd, SAL_MSG_POSTMOVE, 0, 0 ); -} - -// ----------------------------------------------------------------------- - -static void ImplHandleSizeMsg( HWND hWnd, MPARAM nMP2 ) -{ - Os2SalFrame* pFrame = GetWindowPtr( hWnd ); - if ( pFrame ) - { - UpdateFrameGeometry( hWnd, pFrame ); - pFrame->mbDefPos = FALSE; - pFrame->mnWidth = (short)SHORT1FROMMP( nMP2 ); - pFrame->mnHeight = (short)SHORT2FROMMP( nMP2 ); - if ( pFrame->mpGraphics ) - pFrame->mpGraphics->mnHeight = (int)SHORT2FROMMP(nMP2); - // Status merken - ImplSaveFrameState( pFrame ); - pFrame->CallCallback( SALEVENT_RESIZE, 0 ); - if ( WinIsWindowVisible( pFrame->mhWndFrame ) && !pFrame->mbInShow ) - WinUpdateWindow( pFrame->mhWndClient ); - } -} - -// ----------------------------------------------------------------------- - -static long ImplHandleFocusMsg( Os2SalFrame* pFrame, MPARAM nMP2 ) -{ -if ( pFrame && !Os2SalFrame::mbInReparent ) -{ - if ( SHORT1FROMMP( nMP2 ) ) - { - if ( WinIsWindowVisible( pFrame->mhWndFrame ) && !pFrame->mbInShow ) - WinUpdateWindow( pFrame->mhWndClient ); - return pFrame->CallCallback( SALEVENT_GETFOCUS, 0 ); - } - else - { - return pFrame->CallCallback( SALEVENT_LOSEFOCUS, 0 ); - } -} -} - -// ----------------------------------------------------------------------- - -static void ImplHandleCloseMsg( HWND hWnd ) -{ - if ( ImplSalYieldMutexTryToAcquire() ) - { - Os2SalFrame* pFrame = GetWindowPtr( hWnd ); - if ( pFrame ) - { - pFrame->CallCallback( SALEVENT_CLOSE, 0 ); - } - - ImplSalYieldMutexRelease(); - } - else - WinPostMsg( hWnd, WM_CLOSE, 0, 0 ); -} - -// ----------------------------------------------------------------------- - -inline void ImplHandleUserEvent( HWND hWnd, MPARAM nMP2 ) -{ - ImplSalYieldMutexAcquireWithWait(); - Os2SalFrame* pFrame = GetWindowPtr( hWnd ); - if ( pFrame ) - { - pFrame->CallCallback( SALEVENT_USEREVENT, (void*)nMP2 ); - } - ImplSalYieldMutexRelease(); -} - -// ----------------------------------------------------------------------- - -static int SalImplHandleProcessMenu( Os2SalFrame* pFrame, ULONG nMsg, MPARAM nMP1, MPARAM nMP2) -{ - long nRet = 0; -debug_printf("SalImplHandleProcessMenu\n"); - return (nRet == 0); -} - -// ----------------------------------------------------------------------- - -static void ImplHandleInputLangChange( HWND hWnd ) -{ - ImplSalYieldMutexAcquireWithWait(); - - // Feststellen, ob wir IME unterstuetzen - Os2SalFrame* pFrame = GetWindowPtr( hWnd ); - - // trigger input language and codepage update - UINT nLang = pFrame->mnInputLang; - ImplUpdateInputLang( pFrame ); - debug_printf("ImplHandleInputLangChange new language 0x%04x\n",pFrame->mnInputLang); - - // notify change - if( nLang != pFrame->mnInputLang ) - pFrame->CallCallback( SALEVENT_INPUTLANGUAGECHANGE, 0 ); - - ImplSalYieldMutexRelease(); -} - -// ----------------------------------------------------------------------- - -#ifdef ENABLE_IME - -static long ImplHandleIMEStartConversion( Os2SalFrame* pFrame ) -{ - long nRet = FALSE; - SalIMEData* pIMEData = GetSalIMEData(); - if ( pIMEData ) - { - HWND hWnd = pFrame->mhWndClient; - HIMI hIMI = 0; - pIMEData->mpGetIME( hWnd, &hIMI ); - if ( hIMI ) - { - ULONG nProp; - if ( 0 != pIMEData->mpQueryIMEProperty( hIMI, QIP_PROPERTY, &nProp ) ) - pFrame->mbHandleIME = FALSE; - else - { - pFrame->mbHandleIME = !(nProp & PRP_SPECIALUI); - - } - if ( pFrame->mbHandleIME ) - { - pFrame->mbConversionMode = TRUE; - pFrame->CallCallback( SALEVENT_STARTEXTTEXTINPUT, (void*)NULL ); - nRet = TRUE; - } - - pIMEData->mpReleaseIME( hWnd, hIMI ); - } - } - - return nRet; -} - -// ----------------------------------------------------------------------- - -static long ImplHandleIMEConversion( Os2SalFrame* pFrame, MPARAM nMP2Param ) -{ - long nRet = FALSE; - SalIMEData* pIMEData = GetSalIMEData(); - if ( pIMEData ) - { - HWND hWnd = pFrame->mhWndClient; - HIMI hIMI = 0; - ULONG nMP2 = (ULONG)nMP2Param; - pIMEData->mpGetIME( hWnd, &hIMI ); - if ( hIMI ) - { - if ( nMP2 & (IMR_RESULT_RESULTSTRING | - IMR_CONV_CONVERSIONSTRING | IMR_CONV_CONVERSIONATTR | - IMR_CONV_CURSORPOS | IMR_CONV_CURSORATTR) ) - { - SalExtTextInputEvent aEvt; - aEvt.mnTime = WinQueryMsgTime( pFrame->mhAB ); - aEvt.mpTextAttr = NULL; - aEvt.mnCursorPos = 0; - aEvt.mnDeltaStart = 0; - aEvt.mbOnlyCursor = FALSE; - aEvt.mbCursorVisible = TRUE; - - ULONG nBufLen = 0; - xub_Unicode* pBuf = NULL; - ULONG nAttrBufLen = 0; - PM_BYTE* pAttrBuf = NULL; - BOOL bLastCursor = FALSE; - if ( nMP2 & IMR_RESULT_RESULTSTRING ) - { - pIMEData->mpGetResultString( hIMI, IMR_RESULT_RESULTSTRING, 0, &nBufLen ); - if ( nBufLen > 0 ) - { - pBuf = new xub_Unicode[nBufLen]; - pIMEData->mpGetResultString( hIMI, IMR_RESULT_RESULTSTRING, pBuf, &nBufLen ); - } - - bLastCursor = TRUE; - aEvt.mbCursorVisible = TRUE; - } - else if ( nMP2 & (IMR_CONV_CONVERSIONSTRING | IMR_CONV_CONVERSIONATTR | - IMR_CONV_CURSORPOS | IMR_CONV_CURSORATTR) ) - { - pIMEData->mpGetConversionString( hIMI, IMR_CONV_CONVERSIONSTRING, 0, &nBufLen ); - if ( nBufLen > 0 ) - { - pBuf = new xub_Unicode[nBufLen]; - pIMEData->mpGetConversionString( hIMI, IMR_CONV_CONVERSIONSTRING, pBuf, &nBufLen ); - } - - pIMEData->mpGetConversionString( hIMI, IMR_CONV_CONVERSIONATTR, 0, &nAttrBufLen ); - if ( nAttrBufLen > 0 ) - { - pAttrBuf = new PM_BYTE[nAttrBufLen]; - pIMEData->mpGetConversionString( hIMI, IMR_CONV_CONVERSIONATTR, pAttrBuf, &nAttrBufLen ); - } - - aEvt.mnCursorPos = 0; - aEvt.mnDeltaStart = 0; - aEvt.mbCursorVisible = FALSE; - - if ( (nMP2 == IMR_CONV_CURSORPOS) || - (nMP2 == IMR_CONV_CURSORATTR) ) - aEvt.mbOnlyCursor = TRUE; - } - - USHORT* pSalAttrAry = NULL; - if ( pBuf ) - { - aEvt.maText = XubString( pBuf, (USHORT)nBufLen ); - delete [] pBuf; - if ( pAttrBuf ) - { - USHORT nTextLen = aEvt.maText.Len(); - if ( nTextLen ) - { - pSalAttrAry = new USHORT[nTextLen]; - memset( pSalAttrAry, 0, nTextLen*sizeof( USHORT ) ); - for ( USHORT i = 0; (i < nTextLen) && (i < nAttrBufLen); i++ ) - { - PM_BYTE nOS2Attr = pAttrBuf[i]; - USHORT nSalAttr; - if ( nOS2Attr == CP_ATTR_TARGET_CONVERTED ) - nSalAttr = SAL_EXTTEXTINPUT_ATTR_TARGETCONVERTED | SAL_EXTTEXTINPUT_ATTR_UNDERLINE | SAL_EXTTEXTINPUT_ATTR_HIGHLIGHT; - else if ( nOS2Attr == CP_ATTR_CONVERTED ) - nSalAttr = SAL_EXTTEXTINPUT_ATTR_CONVERTED | SAL_EXTTEXTINPUT_ATTR_DASHDOTUNDERLINE; - else if ( nOS2Attr == CP_ATTR_TARGET_NOTCONVERTED ) - nSalAttr = SAL_EXTTEXTINPUT_ATTR_TARGETNOTCONVERTED | SAL_EXTTEXTINPUT_ATTR_DOTTEDUNDERLINE; - else if ( nOS2Attr == CP_ATTR_INPUT_ERROR ) - nSalAttr = SAL_EXTTEXTINPUT_ATTR_INPUTERROR | SAL_EXTTEXTINPUT_ATTR_REDTEXT | SAL_EXTTEXTINPUT_ATTR_DOTTEDUNDERLINE; - else /* ( nOS2Attr == CP_ATTR_INPUT ) */ - nSalAttr = SAL_EXTTEXTINPUT_ATTR_INPUT | SAL_EXTTEXTINPUT_ATTR_DOTTEDUNDERLINE; - pSalAttrAry[i] = nSalAttr; - } - aEvt.mpTextAttr = pSalAttrAry; - } - delete [] pAttrBuf; - } - if ( bLastCursor ) - aEvt.mnCursorPos = aEvt.maText.Len(); - } - - pIMEData->mpReleaseIME( hWnd, hIMI ); - - // Handler rufen und wenn wir ein Attribute-Array haben, danach - // wieder zerstoeren - pFrame->CallCallback( SALEVENT_EXTTEXTINPUT, (void*)&aEvt ); - if ( pSalAttrAry ) - delete [] pSalAttrAry; - } - else - pIMEData->mpReleaseIME( hWnd, hIMI ); - } - - nRet = TRUE; - } - - return nRet; -} - -// ----------------------------------------------------------------------- - -inline long ImplHandleIMEEndConversion( Os2SalFrame* pFrame ) -{ - pFrame->mbConversionMode = FALSE; - pFrame->CallCallback( SALEVENT_ENDEXTTEXTINPUT, (void*)NULL ); - return TRUE; -} - -// ----------------------------------------------------------------------- - -static void ImplHandleIMEOpenCandidate( Os2SalFrame* pFrame ) -{ - pFrame->mbCandidateMode = TRUE; - - long nRet = FALSE; - SalIMEData* pIMEData = GetSalIMEData(); - if ( pIMEData ) - { - HWND hWnd = pFrame->mhWndClient; - HIMI hIMI = 0; - pIMEData->mpGetIME( hWnd, &hIMI ); - if ( hIMI ) - { - ULONG nBufLen = 0; - pIMEData->mpGetConversionString( hIMI, IMR_CONV_CONVERSIONSTRING, 0, &nBufLen ); - if ( nBufLen > 0 ) - { - ULONG nCursorPos = 0; - - SalExtTextInputPosEvent aEvt; - aEvt.mnTime = WinQueryMsgTime( pFrame->mhAB ); - aEvt.mnFirstPos = nCursorPos; - aEvt.mnChars = nBufLen-nCursorPos; - aEvt.mpPosAry = new SalExtCharPos[aEvt.mnChars]; - memset( aEvt.mpPosAry, 0, aEvt.mnChars*sizeof(SalExtCharPos) ); - - pFrame->CallCallback( SALEVENT_EXTTEXTINPUTPOS, (void*)&aEvt ); - - long nMinLeft = aEvt.mpPosAry[0].mnX; - long nMinTop = aEvt.mpPosAry[0].mnY; - long nMaxBottom = aEvt.mpPosAry[0].mnY+aEvt.mpPosAry[0].mnHeight; - long nMaxRight = nMinLeft; - USHORT i = 0; - while ( i < aEvt.mnChars ) - { - // Solange wir uns auf der gleichen Zeile bewegen, - // ermitteln wir die Rechteck-Grenzen - if ( !aEvt.mpPosAry[i].mnHeight || - (aEvt.mpPosAry[i].mnY < nMaxBottom-1) ) - { - if ( aEvt.mpPosAry[i].mnX < nMinLeft ) - nMinLeft = aEvt.mpPosAry[i].mnX; - if ( aEvt.mpPosAry[i].mnX+aEvt.mpPosAry[0].mnWidth > nMaxRight ) - nMaxRight = aEvt.mpPosAry[i].mnX+aEvt.mpPosAry[0].mnWidth; - if ( aEvt.mpPosAry[i].mnY < nMinTop ) - nMinTop = aEvt.mpPosAry[i].mnY; - i++; - } - else - break; - } - - CANDIDATEPOS aForm; - aForm.ulIndex = 0; - aForm.ulStyle = CPS_EXCLUDE; - aForm.ptCurrentPos.x = aEvt.mpPosAry[0].mnX; - aForm.ptCurrentPos.y = pFrame->mnHeight - (nMaxBottom+1) - 1; - aForm.rcArea.xLeft = nMinLeft; - aForm.rcArea.yBottom = pFrame->mnHeight - nMaxBottom - 1; - aForm.rcArea.xRight = nMaxRight+1; - aForm.rcArea.yTop = pFrame->mnHeight - nMinTop - 1; - pIMEData->mpSetCandidateWin( hIMI, &aForm ); - - delete aEvt.mpPosAry; - } - - pIMEData->mpReleaseIME( hWnd, hIMI ); - } - } -} - -// ----------------------------------------------------------------------- - -inline void ImplHandleIMECloseCandidate( Os2SalFrame* pFrame ) -{ - pFrame->mbCandidateMode = FALSE; -} - -#endif - -// ----------------------------------------------------------------------- - -MRESULT EXPENTRY SalFrameWndProc( HWND hWnd, ULONG nMsg, - MPARAM nMP1, MPARAM nMP2 ) -{ - Os2SalFrame* pFrame = (Os2SalFrame*)GetWindowPtr( hWnd ); - MRESULT nRet = (MRESULT)0; - BOOL bDef = TRUE; - bool bCheckTimers= false; - -#if OSL_DEBUG_LEVEL > 1 - if (nMsg!=WM_TIMER && nMsg!=WM_MOUSEMOVE) - debug_printf( "SalFrameWndProc hWnd 0x%x nMsg 0x%x\n", hWnd, nMsg); -#endif - - switch( nMsg ) - { - case WM_MOUSEMOVE: - case WM_BUTTON1DOWN: - case WM_BUTTON2DOWN: - case WM_BUTTON3DOWN: - case WM_BUTTON1DBLCLK: - case WM_BUTTON2DBLCLK: - case WM_BUTTON3DBLCLK: - case WM_BUTTON1UP: - case WM_BUTTON2UP: - case WM_BUTTON3UP: - case SAL_MSG_MOUSELEAVE: - // ButtonUp/Down nie an die WinDefWindowProc weiterleiten, weil sonst - // die Message an den Owner weitergeleitet wird - ImplSalYieldMutexAcquireWithWait(); - bDef = !ImplHandleMouseMsg( hWnd, nMsg, nMP1, nMP2 ); - ImplSalYieldMutexRelease(); - break; - - case WM_CHAR: - if ( pFrame->mbConversionMode ) - bDef = FALSE; - else - bDef = !ImplHandleKeyMsg( hWnd, nMsg, nMP1, nMP2 ); - break; - - case WM_ERASEBACKGROUND: - nRet = (MRESULT)FALSE; - bDef = FALSE; - break; - - case WM_PAINT: - bCheckTimers = ImplHandlePaintMsg( hWnd ); - bDef = FALSE; - break; - case SAL_MSG_POSTPAINT: - ImplHandlePaintMsg2( hWnd, (RECTL*)nMP1 ); - bCheckTimers = true; - bDef = FALSE; - break; - - case WM_MOVE: - case SAL_MSG_POSTMOVE: - ImplHandleMoveMsg( hWnd ); - bDef = FALSE; - break; - - case WM_SIZE: - if ( ImplSalYieldMutexTryToAcquire() ) - { - ImplHandleSizeMsg( hWnd, nMP2 ); - ImplSalYieldMutexRelease(); - } - else - WinPostMsg( hWnd, SAL_MSG_POSTSIZE, nMP1, nMP2 ); - break; - case SAL_MSG_POSTSIZE: - ImplHandleSizeMsg( hWnd, nMP2 ); - break; - case WM_MINMAXFRAME: - if ( ImplSalYieldMutexTryToAcquire() ) - { - PSWP pswp = (PSWP) nMP1; - ImplHandleSizeMsg( hWnd, MPFROM2SHORT( pswp->cx, pswp->cy) ); - ImplSalYieldMutexRelease(); - } - else - WinPostMsg( hWnd, SAL_MSG_POSTSIZE, 0, nMP2 ); - break; - - case WM_CALCVALIDRECTS: - return (MRESULT)(CVR_ALIGNLEFT | CVR_ALIGNTOP); - - case WM_SETFOCUS: - if ( ImplSalYieldMutexTryToAcquire() ) - { - ImplHandleFocusMsg( pFrame, nMP2 ); - ImplSalYieldMutexRelease(); - } - else - WinPostMsg( hWnd, SAL_MSG_POSTFOCUS, 0, nMP2 ); - break; - case SAL_MSG_POSTFOCUS: - ImplHandleFocusMsg( pFrame, nMP2 ); - break; - - case WM_TRANSLATEACCEL: - { - // Da uns OS/2 zu viele Tasten abfaegnt, unternehmen wir etwas, - // damit wir Shift+F1, Shift+F10 und Shift+Enter bekommen - PQMSG pMsg = (PQMSG)nMP1; - USHORT nKeyFlags = SHORT1FROMMP( pMsg->mp1 ); - USHORT nKeyCode = (UCHAR)SHORT2FROMMP( pMsg->mp2 ); - - if ( !(nKeyFlags & KC_KEYUP) && (nKeyFlags & KC_VIRTUALKEY) && - (nKeyFlags & KC_SHIFT) && (nKeyCode != VK_ESC) ) - return (MRESULT)FALSE; - - if ( nKeyCode == VK_F1 ) - return (MRESULT)FALSE; - } - break; - - case WM_CREATE: - { - HWND hWndFrame = WinQueryWindow(hWnd, QW_PARENT); - if (hWndFrame == 0) - debug_printf(" WARNING NULL FRAME!!\n"); - SalData* pSalData = GetSalData(); - // Window-Instanz am Windowhandle speichern - pFrame = pSalData->mpCreateFrame; - pSalData->mpCreateFrame = NULL; - SetWindowPtr( hWnd, pFrame ); - SetWindowPtr( hWndFrame, pFrame); - // HWND schon hier setzen, da schon auf den Instanzdaten - // gearbeitet werden kann, wenn Messages waehrend - // CreateWindow() gesendet werden - pFrame->mhWndClient = hWnd; - pFrame->mhWndFrame = hWndFrame; - pFrame->maSysData.hWnd = hWnd; - } - break; - - case WM_CLOSE: - ImplHandleCloseMsg( hWnd ); - bDef = FALSE; - break; - - case WM_SYSVALUECHANGED: - if ( pFrame->mbFullScreen ) - ImplSalFrameFullScreenPos( pFrame ); - // kein break, da der Rest auch noch verarbeitet werden soll - case PL_ALTERED: - case WM_SYSCOLORCHANGE: - ImplSalYieldMutexAcquire(); - pFrame->CallCallback( SALEVENT_SETTINGSCHANGED, 0 ); - ImplSalYieldMutexRelease(); - break; - - case SAL_MSG_USEREVENT: - ImplHandleUserEvent( hWnd, nMP2 ); - bDef = FALSE; - break; - case SAL_MSG_TOTOP: - ImplSalToTop( hWnd, (ULONG)nMP1 ); - bDef = FALSE; - break; - case SAL_MSG_SHOW: - ImplSalShow( hWnd, (ULONG)nMP1, (ULONG)nMP2 ); - bDef = FALSE; - break; - - case WM_KBDLAYERCHANGED: - debug_printf("hWnd 0x%08x WM_KBDLAYERCHANGED\n", hWnd); - ImplHandleInputLangChange( hWnd ); - break; - - case WM_HSCROLL: - case WM_VSCROLL: - ImplHandleWheelMsg( hWnd, nMsg, nMP1, nMP2 ); - bDef = FALSE; - break; - - case WM_COMMAND: - case SAL_MSG_SYSPROCESSMENU: - if ( SalImplHandleProcessMenu( pFrame, nMsg, nMP1, nMP2 ) ) - { - bDef = FALSE; - nRet = (MRESULT)1; - } - break; - -#ifdef ENABLE_IME - case WM_IMEREQUEST: - if ( (ULONG)nMP1 == IMR_CONVRESULT ) - { - if ( pFrame->mbHandleIME ) - { - // Nur im Conversionmodus akzeptieren wir den IME-Input - if ( pFrame->mbConversionMode ) - { - ImplSalYieldMutexAcquire(); - if ( ImplHandleIMEConversion( pFrame, nMP2 ) ) - { - bDef = FALSE; - nRet = (MRESULT)TRUE; - } - ImplSalYieldMutexRelease(); - } - } - } - else if ( (ULONG)nMP1 == IMR_CANDIDATE ) - { - if ( pFrame->mbHandleIME ) - { - ImplSalYieldMutexAcquire(); - if ( (ULONG)nMP2 & IMR_CANDIDATE_SHOW ) - ImplHandleIMEOpenCandidate( pFrame ); - else if ( (ULONG)nMP2 & IMR_CANDIDATE_HIDE ) - ImplHandleIMECloseCandidate( pFrame ); - ImplSalYieldMutexRelease(); - } - } - break; - - case WM_IMENOTIFY: - if ( (ULONG)nMP1 == IMN_STARTCONVERSION ) - { - ImplSalYieldMutexAcquire(); - if ( ImplHandleIMEStartConversion( pFrame ) ) - { - bDef = FALSE; - nRet = (MRESULT)TRUE; - } - ImplSalYieldMutexRelease(); - } - else if ( (ULONG)nMP1 == IMN_ENDCONVERSION ) - { - if ( pFrame->mbHandleIME ) - { - ImplSalYieldMutexAcquire(); - if ( ImplHandleIMEEndConversion( pFrame ) ) - { - bDef = FALSE; - nRet = (MRESULT)TRUE; - } - ImplSalYieldMutexRelease(); - } - } - break; -#endif - } - - if( bCheckTimers ) - { - SalData* pSalData = GetSalData(); - if( pSalData->mnNextTimerTime ) - { - ULONG nCurTime; - DosQuerySysInfo( QSV_MS_COUNT, QSV_MS_COUNT, (PVOID)&nCurTime, sizeof(ULONG)); - if( pSalData->mnNextTimerTime < nCurTime ) - { - QMSG aMsg; - if (!WinPeekMsg( pFrame->mhAB, &aMsg, 0, WM_PAINT, WM_PAINT, PM_NOREMOVE ) ) - WinPostMsg( pSalData->mpFirstInstance->mhComWnd, SAL_MSG_POSTTIMER, 0, (MPARAM)nCurTime ); - } - } - } - - if ( bDef ) - nRet = WinDefWindowProc( hWnd, nMsg, nMP1, nMP2 ); - - return nRet; -} - -// ----------------------------------------------------------------------- - -void Os2SalFrame::ResetClipRegion() -{ -} - -void Os2SalFrame::BeginSetClipRegion( ULONG ) -{ -} - -void Os2SalFrame::UnionClipRegion( long, long, long, long ) -{ -} - -void Os2SalFrame::EndSetClipRegion() -{ -} - -// ----------------------------------------------------------------------- - -MRESULT EXPENTRY SalFrameSubClassWndProc( HWND hWnd, ULONG nMsg, - MPARAM nMP1, MPARAM nMP2 ) -{ - MRESULT mReturn = 0L; - - // ticket#124 min size of 132 px is too much - if (nMsg == WM_QUERYTRACKINFO) { - PTRACKINFO pti; - // first, let PM initialize TRACKINFO - mReturn = aSalShlData.mpFrameProc( hWnd, nMsg, nMP1, nMP2 ); - // now change default min size - pti = (PTRACKINFO) nMP2; - pti->ptlMinTrackSize.x = 64L; - // now return to PM - return mReturn; - } - - return aSalShlData.mpFrameProc( hWnd, nMsg, nMP1, nMP2 ); -} - -// ----------------------------------------------------------------------- - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |