| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #define INCL_DOS |
| #define INCL_PM |
| #define INCL_WIN |
| #include <svpm.h> |
| |
| #include <string.h> |
| |
| #include <tools/svwin.h> |
| |
| // ======================================================================= |
| |
| #define _SV_SALFRAME_CXX |
| |
| #ifndef DEBUG_HXX |
| #include <tools/debug.hxx> |
| #endif |
| |
| #define private public |
| |
| #include "os2/sallang.hxx" |
| #include "os2/salids.hrc" |
| #include "os2/saldata.hxx" |
| #include "os2/salinst.h" |
| #include "os2/salgdi.h" |
| #include "os2/salframe.h" |
| #include "os2/saltimer.h" |
| |
| #include <vcl/timer.hxx> |
| #include <vcl/settings.hxx> |
| #include <vcl/keycodes.hxx> |
| |
| #if OSL_DEBUG_LEVEL>10 |
| extern "C" int debug_printf(const char *f, ...); |
| |
| static sal_Bool _bCapture; |
| |
| #else |
| #define debug_printf( ...) { 1; } |
| #endif |
| |
| // ======================================================================= |
| |
| #undef WinEnableMenuItem |
| #define WinEnableMenuItem(hwndMenu,id,fEnable) \ |
| ((PM_BOOL)WinSendMsg (hwndMenu, MM_SETITEMATTR, MPFROM2SHORT (id, TRUE), \ |
| MPFROM2SHORT (MIA_DISABLED, \ |
| ((USHORT)(fEnable) ? 0 : MIA_DISABLED)))) |
| |
| // ======================================================================= |
| |
| 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; |
| sal_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 ); |
| |
| sal_Bool APIENTRY _WinQueryWindowRect( HWND hwnd, PRECTL prclDest) |
| { |
| sal_Bool rc = WinQueryWindowRect( hwnd, prclDest); |
| ULONG tmp = prclDest->yBottom; |
| prclDest->yBottom = prclDest->yTop; |
| prclDest->yTop = tmp; |
| return rc; |
| } |
| |
| sal_Bool APIENTRY _WinQueryPointerPos (HWND hwndDesktop, PPOINTL pptl) |
| { |
| sal_Bool rc = WinQueryPointerPos( hwndDesktop, pptl); |
| pptl->y = nScreenHeight - pptl->y; |
| return rc; |
| } |
| |
| sal_Bool APIENTRY _WinQueryWindowPos( Os2SalFrame* pFrame, PSWP pswp) |
| { |
| SWP swpOwner; |
| sal_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; |
| } |
| |
| sal_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>0 |
| 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>0 |
| 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>0 |
| 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>0 |
| 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 > 0 |
| static void dumpWindowInfo( char* fnc, HWND hwnd) |
| { |
| SWP aSWP; |
| HWND hwnd2; |
| char szTitle[256]; |
| |
| #if 0 |
| _WinQueryWindowPos( hwnd, &aSWP ); |
| strcpy(szTitle,""); |
| WinQueryWindowText(hwnd, sizeof(szTitle), szTitle); |
| debug_printf( "%s: window %08x at %d,%d (size %dx%d) '%s'\n", fnc, hwnd, |
| aSWP.x, aSWP.y, aSWP.cx, aSWP.cy, szTitle); |
| hwnd2 = WinQueryWindow(hwnd, QW_PARENT); |
| _WinQueryWindowPos( hwnd2, &aSWP ); |
| strcpy(szTitle,""); |
| WinQueryWindowText(hwnd2, sizeof(szTitle), szTitle); |
| debug_printf( "%s: parent %08x at %d,%d (size %dx%d) '%s'\n", fnc, hwnd2, |
| aSWP.x, aSWP.y, aSWP.cx, aSWP.cy, szTitle); |
| hwnd2 = WinQueryWindow(hwnd, QW_OWNER); |
| _WinQueryWindowPos( hwnd2, &aSWP ); |
| strcpy(szTitle,""); |
| WinQueryWindowText(hwnd2, sizeof(szTitle), szTitle); |
| debug_printf( "%s: owner %08x at %d,%d (size %dx%d) '%s'\n", fnc, hwnd2, |
| aSWP.x, aSWP.y, aSWP.cx, aSWP.cy, szTitle); |
| #endif |
| } |
| #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; |
| sal_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; |
| sal_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>0 |
| 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>0 |
| 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>0 |
| 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; |
| //debug_printf( "ImplSaveFrameState: window %08x at %d,%d (size %dx%d)\n", |
| // pFrame->mhWndFrame, |
| // pFrame->maState.mnX, pFrame->maState.mnY, pFrame->maState.mnWidth, pFrame->maState.mnHeight); |
| } |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| 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>0 |
| //if (_bCapture) |
| 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, sal_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; |
| sal_Bool bSubFrame = FALSE; |
| |
| #if OSL_DEBUG_LEVEL>0 |
| 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 ) |
| { |
| //nExSysStyle |= WS_EX_TOOLWINDOW; |
| pFrame->mbFloatWin = TRUE; |
| } |
| //if( nSalFrameStyle & SAL_FRAME_STYLE_TOOLTIP ) |
| // nExSysStyle |= WS_EX_TOPMOST; |
| |
| // 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; |
| //mhDefIMEContext = 0; |
| 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; |
| //mbPresentation = FALSE; |
| mbInShow = FALSE; |
| mbRestoreMaximize = FALSE; |
| mbInMoveMsg = FALSE; |
| mbInSizeMsg = FALSE; |
| //mbFullScreenToolWin = FALSE; |
| mbDefPos = TRUE; |
| mbOverwriteState = TRUE; |
| //mbIME = FALSE; |
| mbHandleIME = FALSE; |
| //mbSpezIME = FALSE; |
| //mbAtCursorIME = FALSE; |
| mbCandidateMode = FALSE; |
| mbFloatWin = FALSE; |
| mbNoIcon = FALSE; |
| //mSelectedhMenu = 0; |
| //mLastActivatedhMenu = 0; |
| 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; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| sal_Bool Os2SalFrame::PostEvent( void* pData ) |
| { |
| return (sal_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 > 0 |
| 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 > 0 |
| 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( sal_Bool bVisible, sal_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( sal_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 > 0 |
| //dumpWindowInfo( "-Os2SalFrame::SetPosSize", mhWndFrame); |
| debug_printf( ">Os2SalFrame::SetPosSize go to %d,%d (%dx%d) VCL\n",nX,nY,nWidth,nHeight); |
| #endif |
| |
| SWP aSWP; |
| _WinQueryWindowPos( this, &aSWP ); |
| sal_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 > 0 |
| debug_printf( "-Os2SalFrame::SetPosSize MOVE to %d,%d\n", nX, nY); |
| #endif |
| //DBG_ASSERT( nX && nY, " Windowposition of (0,0) requested!" ); |
| nEvent = SALEVENT_MOVE; |
| } |
| |
| if ( (nFlags & (SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT)) ) { |
| nPosFlags |= SWP_SIZE; |
| #if OSL_DEBUG_LEVEL > 0 |
| 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 > 10 |
| debug_printf( "-Os2SalFrame::SetPosSize CENTER\n"); |
| debug_printf( "-Os2SalFrame::SetPosSize default position to %d,%d\n", nX, nY); |
| #endif |
| } |
| |
| // Adjust Window in the screen |
| sal_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; |
| } |
| |
| // bring floating windows always to top |
| // do not change zorder, otherwise tooltips will bring main window to top (ticket:14) |
| //if( (mnStyle & SAL_FRAME_STYLE_FLOAT) ) |
| // nPosFlags |= SWP_ZORDER; // do not change z-order |
| |
| // 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 > 0 |
| dumpWindowInfo( "<Os2SalFrame::SetPosSize (exit)", mhWndFrame); |
| #endif |
| |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void Os2SalFrame::SetParent( SalFrame* pNewParent ) |
| { |
| APIRET rc; |
| #if OSL_DEBUG_LEVEL>0 |
| 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 = WinSetParent(static_cast<Os2SalFrame*>(this)->mhWndFrame, |
| // static_cast<Os2SalFrame*>(pNewParent)->mhWndClient, 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>0 |
| 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 |
| |
| sal_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>0 |
| 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( nWidth > nScreenWidth || nHeight > nScreenHeight ) |
| // nPosSize |= (SWP_NOMOVE | SWP_NOSIZE); |
| |
| 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); |
| sal_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 ) |
| { |
| //if ( pState->mnState & SAL_FRAMESTATE_MAXIMIZED ) |
| // aPlacement.flags |= WPF_RESTORETOMAXIMIZED; |
| 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>0 |
| debug_printf("Os2SalFrame::SetWindowState DONE\n"); |
| #endif |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| sal_Bool Os2SalFrame::GetWindowState( SalFrameState* pState ) |
| { |
| if ( maState.mnWidth && maState.mnHeight ) |
| { |
| *pState = maState; |
| // #94144# allow Minimize again, should be masked out when read from configuration |
| // 91625 - Don't save minimize |
| //if ( !(pState->mnState & SAL_FRAMESTATE_MAXIMIZED) ) |
| if ( !(pState->mnState & (SAL_FRAMESTATE_MINIMIZED | SAL_FRAMESTATE_MAXIMIZED)) ) |
| pState->mnState |= SAL_FRAMESTATE_NORMAL; |
| return TRUE; |
| } |
| |
| return FALSE; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void Os2SalFrame::SetScreenNumber( unsigned int nNewScreen ) |
| { |
| #if 0 |
| WinSalSystem* pSys = static_cast<WinSalSystem*>(ImplGetSalSystem()); |
| if( pSys ) |
| { |
| const std::vector<WinSalSystem::DisplayMonitor>& rMonitors = |
| pSys->getMonitors(); |
| size_t nMon = rMonitors.size(); |
| if( nNewScreen < nMon ) |
| { |
| Point aOldMonPos, aNewMonPos( rMonitors[nNewScreen].m_aArea.TopLeft() ); |
| Point aCurPos( maGeometry.nX, maGeometry.nY ); |
| for( size_t i = 0; i < nMon; i++ ) |
| { |
| if( rMonitors[i].m_aArea.IsInside( aCurPos ) ) |
| { |
| aOldMonPos = rMonitors[i].m_aArea.TopLeft(); |
| break; |
| } |
| } |
| mnDisplay = nNewScreen; |
| maGeometry.nScreenNumber = nNewScreen; |
| SetPosSize( aNewMonPos.X() + (maGeometry.nX - aOldMonPos.X()), |
| aNewMonPos.Y() + (maGeometry.nY - aOldMonPos.Y()), |
| 0, 0, |
| SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y ); |
| } |
| } |
| #endif |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| // native menu implementation - currently empty |
| void Os2SalFrame::DrawMenuBar() |
| { |
| } |
| |
| void Os2SalFrame::SetMenu( SalMenu* pSalMenu ) |
| { |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void Os2SalFrame::ShowFullScreen( sal_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( sal_Bool bStart ) |
| { |
| // SysSetObjectData("<WP_DESKTOP>","Autolockup=no"); oder OS2.INI: PM_Lockup |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void Os2SalFrame::SetAlwaysOnTop( sal_Bool bOnTop ) |
| { |
| mbAllwayOnTop = bOnTop; |
| #if 0 |
| HWND hWnd; |
| if ( bOnTop ) |
| hWnd = HWND_TOPMOST; |
| else |
| hWnd = HWND_NOTOPMOST; |
| SetWindowPos( mhWnd, hWnd, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE ); |
| #endif |
| } |
| |
| |
| // ----------------------------------------------------------------------- |
| |
| static void ImplSalToTop( HWND hWnd, ULONG nFlags ) |
| { |
| Os2SalFrame* pFrame = GetWindowPtr( hWnd ); |
| #if OSL_DEBUG_LEVEL>0 |
| 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 |
| |
| // --> FME 2004-07-30 #i32329# Enhanced table selection |
| { 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 |
| // <-- |
| |
| // --> FME 2004-08-16 #i20119# Paintbrush tool |
| { 0, 0, SAL_RESID_POINTER_PAINTBRUSH } // POINTER_PAINTBRUSH |
| // <-- |
| }; |
| |
| #if POINTER_COUNT != 94 |
| #error New Pointer must be defined! |
| #endif |
| |
| //debug_printf("Os2SalFrame::SetPointer\n"); |
| |
| // 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( sal_Bool bCapture ) |
| { |
| #if OSL_DEBUG_LEVEL>10 |
| _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; |
| // !!! Da derzeit ueber das OS2-IME-UI der IME-Mode nicht einschaltbar ist !!! |
| // if ( SAL_INPUTCONTEXT_EXTTEXTINPUT_ON ) |
| nInputMode |= IMI_IM_IME_ON; |
| } |
| else |
| nInputMode |= IMI_IM_IME_DISABLE; |
| pIMEData->mpSetIMEMode( hIMI, nInputMode, nConversionMode ); |
| } |
| |
| pIMEData->mpReleaseIME( hWnd, hIMI ); |
| } |
| } |
| #endif |
| } |
| |
| // ----------------------------------------------------------------------- |
| #if 0 |
| void Os2SalFrame::UpdateExtTextInputArea() |
| { |
| #ifdef ENABLE_IME |
| #endif |
| } |
| #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( (PM_BYTE)( nOS2Color>>16), (PM_BYTE)(nOS2Color>>8), (PM_BYTE)nOS2Color ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| static USHORT ImplMouseSysValueToSAL( int iSysValue, USHORT& rCode, USHORT& rClicks, sal_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 sal_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 sal_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; |
| sal_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(); |
| PM_BYTE nRed = (PM_BYTE)(((USHORT)aColor1.GetRed() + (USHORT)aColor2.GetRed())/2); |
| PM_BYTE nGreen = (PM_BYTE)(((USHORT)aColor1.GetGreen() + (USHORT)aColor2.GetGreen())/2); |
| PM_BYTE nBlue = (PM_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 ) ) { |
| #if 0 |
| // 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 ) ); |
| } |
| #endif |
| 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 |
| }; |
| |
| #if 0 |
| #if SOUND_COUNT != 5 |
| #error New Sound must be defined! |
| #endif |
| #endif |
| |
| 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; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| 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; |
| sal_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>10 |
| //if (_bCapture) |
| debug_printf("ImplHandleMouseMsg mouse %d,%d\n",aMouseEvt.mnX,aMouseEvt.mnY); |
| #endif |
| |
| if ( bCall ) |
| { |
| if ( nEvent == SALEVENT_MOUSEBUTTONDOWN ) |
| WinUpdateWindow( pFrame->mhWndClient ); |
| |
| // --- RTL --- (mirror mouse pos) |
| //if( Application::GetSettings().GetLayoutRTL() ) |
| // aMouseEvt.mnX = pFrame->maGeometry.nWidth-1-aMouseEvt.mnX; |
| |
| 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 ) |
| { |
| sal_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>10 |
| 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>10 |
| 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>10 |
| 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; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| sal_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>10 |
| 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>10 |
| 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>10 |
| 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 ) |
| { |
| sal_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>0 |
| 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"); |
| #if 0 |
| DWORD err=0; |
| if( !HIWORD(wParam) ) |
| { |
| // Menu command |
| WORD nId = LOWORD(wParam); |
| if( nId ) // zero for separators |
| { |
| SalMenuEvent aMenuEvt; |
| aMenuEvt.mnId = nId; |
| WinSalMenuItem *pSalMenuItem = ImplGetSalMenuItem( pFrame->mSelectedhMenu, nId, FALSE ); |
| if( pSalMenuItem ) |
| aMenuEvt.mpMenu = pSalMenuItem->mpMenu; |
| else |
| aMenuEvt.mpMenu = NULL; |
| |
| nRet = pFrame->CallCallback( SALEVENT_MENUCOMMAND, &aMenuEvt ); |
| } |
| } |
| #endif |
| //return (nRet != 0); |
| return (nRet == 0); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| static void ImplHandleInputLangChange( HWND hWnd ) |
| { |
| ImplSalYieldMutexAcquireWithWait(); |
| |
| // Feststellen, ob wir IME unterstuetzen |
| Os2SalFrame* pFrame = GetWindowPtr( hWnd ); |
| #if 0 |
| if ( pFrame && pFrame->mbIME && pFrame->mhDefIMEContext ) |
| { |
| HWND hWnd = pFrame->mhWnd; |
| HKL hKL = (HKL)lParam; |
| UINT nImeProps = ImmGetProperty( hKL, IGP_PROPERTY ); |
| |
| pFrame->mbSpezIME = (nImeProps & IME_PROP_SPECIAL_UI) != 0; |
| pFrame->mbAtCursorIME = (nImeProps & IME_PROP_AT_CARET) != 0; |
| pFrame->mbHandleIME = !pFrame->mbSpezIME; |
| } |
| #endif |
| |
| // 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 ) |
| { |
| /* Windows-Code, der noch nicht angepasst wurde !!! |
| // Cursor-Position ermitteln und aus der die Default-Position fuer |
| // das Composition-Fenster berechnen |
| SalCursorPosEvent aCursorPosEvt; |
| pFrame->CallCallback( pFrame->mpInst, pFrame, |
| SALEVENT_CURSORPOS, (void*)&aCursorPosEvt ); |
| COMPOSITIONFORM aForm; |
| memset( &aForm, 0, sizeof( aForm ) ); |
| if ( !aCursorPosEvt.mnWidth || !aCursorPosEvt.mnHeight ) |
| aForm.dwStyle |= CFS_DEFAULT; |
| else |
| { |
| aForm.dwStyle |= CFS_POINT; |
| aForm.ptCurrentPos.x = aCursorPosEvt.mnX; |
| aForm.ptCurrentPos.y = aCursorPosEvt.mnY; |
| } |
| ImmSetCompositionWindow( hIMC, &aForm ); |
| |
| // Den InputContect-Font ermitteln und diesem dem Composition-Fenster |
| // bekannt machen |
| */ |
| |
| 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; |
| sal_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 ); |
| } |
| |
| /* !!! Wir bekommen derzeit nur falsche Daten, deshalb zeigen wir derzeit |
| !!! auch keine Cursor an |
| ULONG nTempBufLen; |
| ULONG nCursorPos = 0; |
| ULONG nCursorAttr = 0; |
| ULONG nChangePos = 0; |
| nTempBufLen = sizeof( ULONG ); |
| pIMEData->mpGetConversionString( hIMI, IMR_CONV_CURSORPOS, &nCursorPos, &nTempBufLen ); |
| nTempBufLen = sizeof( ULONG ); |
| pIMEData->mpGetConversionString( hIMI, IMR_CONV_CURSORATTR, &nCursorAttr, &nTempBufLen ); |
| nTempBufLen = sizeof( ULONG ); |
| pIMEData->mpGetConversionString( hIMI, IMR_CONV_CHANGESTART, &nChangePos, &nTempBufLen ); |
| |
| aEvt.mnCursorPos = nCursorPos; |
| aEvt.mnDeltaStart = nChangePos; |
| if ( nCursorAttr & CP_CURSORATTR_INVISIBLE ) |
| aEvt.mbCursorVisible = FALSE; |
| */ |
| 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 ) |
| { |
| /* !!! Wir bekommen derzeit nur falsche Daten steht der Cursor immer bei 0 |
| ULONG nTempBufLen = sizeof( ULONG ); |
| ULONG nCursorPos = 0; |
| pIMEData->mpGetConversionString( hIMI, IMR_CONV_CURSORPOS, &nCursorPos, &nTempBufLen ); |
| */ |
| 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; |
| sal_Bool bDef = TRUE; |
| bool bCheckTimers= false; |
| |
| #if OSL_DEBUG_LEVEL>10 |
| 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 ); |
| } |
| |
| // ----------------------------------------------------------------------- |