diff options
author | Jens-Heiner Rechtien <hr@openoffice.org> | 2010-01-28 19:19:29 +0000 |
---|---|---|
committer | Jens-Heiner Rechtien <hr@openoffice.org> | 2010-01-28 19:19:29 +0000 |
commit | 5ae66b1fbadf8b2682f3f3716e298398d141826e (patch) | |
tree | 7e73c7540920a63da451c59f9766b000e11be0ba | |
parent | fd5ee55b7b9ca4ce23c88b66c75d04b178a21891 (diff) | |
parent | c0f197f920974f3fdaf8278dad16dc5ecb994d52 (diff) |
koheidatapilot03: merge with DEV300_m63
35 files changed, 419 insertions, 113 deletions
diff --git a/canvas/source/cairo/cairo_textlayout.cxx b/canvas/source/cairo/cairo_textlayout.cxx index f822749cab20..08a4e7a70fa1 100644 --- a/canvas/source/cairo/cairo_textlayout.cxx +++ b/canvas/source/cairo/cairo_textlayout.cxx @@ -44,6 +44,12 @@ #include <tools/prewin.h> #include <windows.h> #include <tools/postwin.h> +#ifdef max +#undef max +#endif +#ifdef min +#undef min +#endif #endif #include <vcl/sysdata.hxx> diff --git a/canvas/source/directx/dx_9rm.cxx b/canvas/source/directx/dx_9rm.cxx index 932a15e1f5c1..acef323ddc1b 100755 --- a/canvas/source/directx/dx_9rm.cxx +++ b/canvas/source/directx/dx_9rm.cxx @@ -956,11 +956,43 @@ namespace dxcanvas { if(hr != D3DERR_DEVICELOST) return false; - hr = mpDevice->Reset(&mad3dpp); - if(SUCCEEDED(hr)) - return true; - if(hr == D3DERR_DEVICELOST) - return true; + + // interestingly enough, sometimes the Reset() below + // *still* causes DeviceLost errors. So, cycle until + // DX was kind enough to really reset the device... + do + { + mpVertexBuffer.reset(); + hr = mpDevice->Reset(&mad3dpp); + if(SUCCEEDED(hr)) + { + IDirect3DVertexBuffer9 *pVB(NULL); + DWORD aFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1); + if( FAILED(mpDevice->CreateVertexBuffer(sizeof(dxvertex)*maNumVertices, + D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY, + aFVF, + D3DPOOL_DEFAULT, + &pVB, + NULL)) ) + { + throw lang::NoSupportException( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( + "Could not create DirectX device - out of memory!")),NULL); + } + mpVertexBuffer=COMReference<IDirect3DVertexBuffer9>(pVB); + + // retry after the restore + if(SUCCEEDED(mpSwapChain->Present(&aRect,&aRect,NULL,NULL,0))) + return true; + } + + TimeValue aTimeout; + aTimeout.Seconds=1; + aTimeout.Nanosec=0; + osl_waitThread(&aTimeout); + } + while(hr == D3DERR_DEVICELOST); + return false; } diff --git a/canvas/source/directx/dx_surfacegraphics.cxx b/canvas/source/directx/dx_surfacegraphics.cxx index 128095c1315d..8b9af6be6827 100755 --- a/canvas/source/directx/dx_surfacegraphics.cxx +++ b/canvas/source/directx/dx_surfacegraphics.cxx @@ -34,6 +34,8 @@ #include "dx_surfacegraphics.hxx" #include "dx_impltools.hxx" +using namespace ::com::sun::star; + namespace dxcanvas { namespace @@ -75,11 +77,12 @@ namespace dxcanvas tools::setupGraphics( *pGraphics ); pRet.reset(pGraphics, GraphicsDeleter(rSurface, aHDC)); + return pRet; } else rSurface->ReleaseDC( aHDC ); } - return pRet; + throw uno::RuntimeException(); } } diff --git a/i18npool/source/calendar/calendar_gregorian.cxx b/i18npool/source/calendar/calendar_gregorian.cxx index 50b61eae5cf1..e52cd4938f2a 100644 --- a/i18npool/source/calendar/calendar_gregorian.cxx +++ b/i18npool/source/calendar/calendar_gregorian.cxx @@ -531,8 +531,8 @@ void Calendar_gregorian::setValue() throw(RuntimeException) bool bNeedZone = !(fieldSet & (1 << CalendarFieldIndex::ZONE_OFFSET)); bool bNeedDST = !(fieldSet & (1 << CalendarFieldIndex::DST_OFFSET)); - sal_Int32 nZone1, nDST1, nYear, nMonth, nDay, nHour, nMinute, nSecond, nMilliSecond, nZone, nDST; - nZone1 = nDST1 = nZone = nDST = 0; + sal_Int32 nZone1, nDST1, nYear, nMonth, nDay, nHour, nMinute, nSecond, nMilliSecond, nZone0, nDST0; + nZone1 = nDST1 = nZone0 = nDST0 = 0; nYear = nMonth = nDay = nHour = nMinute = nSecond = nMilliSecond = -1; if ( bNeedZone || bNeedDST ) { @@ -581,19 +581,19 @@ void Calendar_gregorian::setValue() throw(RuntimeException) } if ( !(fieldSet & (1 << CalendarFieldIndex::ZONE_OFFSET)) ) { - nZone = body->get( UCAL_ZONE_OFFSET, status = U_ZERO_ERROR); + nZone0 = body->get( UCAL_ZONE_OFFSET, status = U_ZERO_ERROR); if ( !U_SUCCESS(status) ) - nZone = 0; + nZone0 = 0; } if ( !(fieldSet & (1 << CalendarFieldIndex::DST_OFFSET)) ) { - nDST = body->get( UCAL_DST_OFFSET, status = U_ZERO_ERROR); + nDST0 = body->get( UCAL_DST_OFFSET, status = U_ZERO_ERROR); if ( !U_SUCCESS(status) ) - nDST = 0; + nDST0 = 0; } // Submit values to obtain a time zone and DST corresponding to the date/time. - submitValues( nYear, nMonth, nDay, nHour, nMinute, nSecond, nMilliSecond, nZone, nDST); + submitValues( nYear, nMonth, nDay, nHour, nMinute, nSecond, nMilliSecond, nZone0, nDST0); DUMP_ICU_CAL_MSG(("%s\n","setValue() in bNeedZone||bNeedDST after submitValues()")); DUMP_I18N_CAL_MSG(("%s\n","setValue() in bNeedZone||bNeedDST after submitValues()")); @@ -605,7 +605,8 @@ void Calendar_gregorian::setValue() throw(RuntimeException) nDST1 = 0; } - // The original submission, may lead to a different zone/DST. + // The original submission, may lead to a different zone/DST and + // different date. submitFields(); DUMP_ICU_CAL_MSG(("%s\n","setValue() after original submission")); DUMP_I18N_CAL_MSG(("%s\n","setValue() after original submission")); @@ -619,7 +620,7 @@ void Calendar_gregorian::setValue() throw(RuntimeException) sal_Int32 nDST2 = body->get( UCAL_DST_OFFSET, status = U_ZERO_ERROR); if ( !U_SUCCESS(status) ) nDST2 = nDST1; - if ( nZone2 != nZone1 || nDST2 != nDST1 ) + if ( nZone0 != nZone1 || nZone2 != nZone1 || nDST0 != nDST1 || nDST2 != nDST1 ) { // Due to different DSTs, resulting date values may differ if // DST is onset at 00:00 and the very onsetRule date was @@ -627,6 +628,12 @@ void Calendar_gregorian::setValue() throw(RuntimeException) // is not what we want. // Resubmit all values, this time including DST => date 01:00 // Similar for zone differences. + // If already the first full submission with nZone0 and nDST0 + // lead to date-1 23:00, the original submission was based on + // that date if it wasn't a full date (nDST0 set, nDST1 not + // set, nDST2==nDST1). If it was January 1st without year we're + // even off by one year now. Resubmit all values including new + // DST => date 00:00. // Set field values accordingly in case they were used. if (!bNeedZone) diff --git a/rsc/inc/rscerror.h b/rsc/inc/rscerror.h index 0e81066cbca8..a957e2c7b202 100644 --- a/rsc/inc/rscerror.h +++ b/rsc/inc/rscerror.h @@ -120,9 +120,17 @@ public: class RscId; class RscTop; +enum RscVerbosity +{ + RscVerbositySilent = 0, + RscVerbosityNormal = 1, + RscVerbosityVerbose = 2 +}; + class RscError { FILE * fListing; + RscVerbosity m_verbosity; void WriteError( const ERRTYPE& rError, const char * pMessage ); void StdLstOut( const char * pStr ); @@ -131,9 +139,10 @@ class RscError const RscId & aId ); public: sal_uInt32 nErrors;// Anzahl der Fehler - RscError(){ + RscError( RscVerbosity _verbosity ) { fListing = NULL; nErrors = 0; + m_verbosity = _verbosity; }; void SetListFile( FILE * fList ){ fListing = fList; @@ -141,7 +150,8 @@ public: FILE * GetListFile(){ return fListing; }; - virtual void StdOut( const char * ); + RscVerbosity GetVerbosity() const { return m_verbosity; } + virtual void StdOut( const char *, const RscVerbosity _verbosityLevel = RscVerbosityNormal ); virtual void StdErr( const char * ); virtual void LstOut( const char * ); virtual void Error( const ERRTYPE& rError, RscTop* pClass, const RscId &aId, diff --git a/rsc/source/parser/erscerr.cxx b/rsc/source/parser/erscerr.cxx index c889001735fe..818e2066c221 100644 --- a/rsc/source/parser/erscerr.cxx +++ b/rsc/source/parser/erscerr.cxx @@ -69,14 +69,15 @@ ERRTYPE& ERRTYPE::operator = ( const ERRTYPE & rError ) |* Letzte Aenderung MM 06.05.91 |* *************************************************************************/ -void RscError::StdOut( const char * pStr ) +void RscError::StdOut( const char * pStr, const RscVerbosity _verbosityLevel ) { -#ifndef WIN - if( pStr ){ - printf( "%s", pStr ); - fflush( stdout ); + if ( m_verbosity >= _verbosityLevel ) + { + if( pStr ){ + printf( "%s", pStr ); + fflush( stdout ); + } } -#endif } /************************************************************************* diff --git a/rsc/source/parser/rscyacc.cxx b/rsc/source/parser/rscyacc.cxx index 93628f381bec..8da3de9bf2b3 100644 --- a/rsc/source/parser/rscyacc.cxx +++ b/rsc/source/parser/rscyacc.cxx @@ -190,7 +190,7 @@ BOOL DoClassHeader( RSCHEADER * pHeader, BOOL bMember ) ObjNode * pNode = new ObjNode( aName1, S.Top().pData, pFI->GetFileIndex() ); - pTC->pEH->StdOut( "." ); + pTC->pEH->StdOut( ".", RscVerbosityVerbose ); if( !aName1.IsId() ) pTC->pEH->Error( ERR_IDEXPECTED, pHeader->pClass, aName1 ); diff --git a/rsc/source/prj/gui.cxx b/rsc/source/prj/gui.cxx index 036494c3bb9d..6bf466348d1b 100644 --- a/rsc/source/prj/gui.cxx +++ b/rsc/source/prj/gui.cxx @@ -57,6 +57,20 @@ static RscCompiler * pRscCompiler = NULL; delete pRscCompiler; } +RscVerbosity lcl_determineVerbosity( int argc, char ** argv ) +{ + for ( int i = 0; i < argc; ++i ) + { + if ( argv[i] == NULL ) + continue; + if ( rsc_stricmp( argv[i], "-verbose" ) == 0 ) + return RscVerbosityVerbose; + if ( rsc_stricmp( argv[i], "-quiet" ) == 0 ) + return RscVerbositySilent; + } + return RscVerbosityNormal; +} + #if defined( UNX ) || ( defined( OS2 ) && ( defined( CSET ) || defined ( GCC ))) || defined (WTC) || defined(ICC) || defined(__MINGW32__) int main ( int argc, char ** argv) { #else @@ -80,7 +94,7 @@ int cdecl main ( int argc, char ** argv) { ERRTYPE aError; InitRscCompiler(); - RscError* pErrHdl = new RscError(); + RscError* pErrHdl = new RscError( lcl_determineVerbosity( argc, argv ) ); #ifdef MTW RscCmdLine* pCmdLine = new RscCmdLine( argc, (char **)argv, pErrHdl ); #else diff --git a/rsc/source/prj/start.cxx b/rsc/source/prj/start.cxx index c43879020a8e..df4ce12200c5 100644 --- a/rsc/source/prj/start.cxx +++ b/rsc/source/prj/start.cxx @@ -56,6 +56,7 @@ #endif // UNX #include <rsctools.hxx> +#include <rscerror.h> #include <tools/fsys.hxx> /*************** C O D E ************************************************/ @@ -111,25 +112,38 @@ static BOOL CallPrePro( const ByteString& rPrePro, if( !fRspFile ) aNewCmdL.Append( rsc_strdup( rPrePro.GetBuffer() ) ); - for( i = 1; i < int(pCmdLine->GetCount() -1); i++ ){ - if( !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-u", 2 ) - || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-i", 2 ) - || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-d", 2 ) ) + + bool bVerbose = false; + for( i = 1; i < int(pCmdLine->GetCount() -1); i++ ) + { + if ( 0 == rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-verbose" ) ) + { + bVerbose = true; + continue; + } + if ( !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-u", 2 ) + || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-i", 2 ) + || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-d", 2 ) + ) { aNewCmdL.Append( rsc_strdup( (char *)pCmdLine->GetEntry( i ) ) ); } - }; + } + aNewCmdL.Append( rsc_strdup( rInput.GetBuffer() ) ); aNewCmdL.Append( rsc_strdup( rOutput.GetBuffer() ) ); aNewCmdL.Append( (void *)0 ); - printf( "Preprocessor commandline: " ); - for( i = 0; i < (int)(pCmdL->GetCount() -1); i++ ) + if ( bVerbose ) { - printf( " " ); - printf( "%s", (const char *)pCmdL->GetEntry( i ) ); + printf( "Preprocessor commandline: " ); + for( i = 0; i < (int)(pCmdL->GetCount() -1); i++ ) + { + printf( " " ); + printf( "%s", (const char *)pCmdL->GetEntry( i ) ); + } + printf( "\n" ); } - printf( "\n" ); if( fRspFile ) { @@ -150,13 +164,16 @@ static BOOL CallPrePro( const ByteString& rPrePro, } fclose( fRspFile ); - printf( "Preprocessor startline: " ); - for( i = 0; i < (int)(pCmdL->GetCount() -1); i++ ) + if ( bVerbose ) { - printf( " " ); - printf( "%s", (const char *)pCmdL->GetEntry( i ) ); + printf( "Preprocessor startline: " ); + for( i = 0; i < (int)(pCmdL->GetCount() -1); i++ ) + { + printf( " " ); + printf( "%s", (const char *)pCmdL->GetEntry( i ) ); + } + printf( "\n" ); } - printf( "\n" ); } #if ((defined OS2 || defined WNT) && (defined TCPP || defined tcpp)) || defined UNX || defined OS2 @@ -194,7 +211,6 @@ static BOOL CallRsc2( ByteString aRsc2Name, ByteString aSrsName, RscPtrPtr * pCmdLine ) { - RscPtrPtr aNewCmdL; // Kommandozeile int i, nExit; ByteString* pString; ByteString aRspFileName; // Response-Datei @@ -203,21 +219,21 @@ static BOOL CallRsc2( ByteString aRsc2Name, aRspFileName = ::GetTmpFileName(); fRspFile = fopen( aRspFileName.GetBuffer(), "w" ); - printf( "Rsc2 commandline: " ); - aNewCmdL.Append( rsc_strdup( aRsc2Name.GetBuffer() ) ); - printf( "%s", (const char *)aNewCmdL.GetEntry( aNewCmdL.GetCount() -1 ) ); - printf( " " ); - ByteString aTmpStr( '@' ); - aTmpStr += aRspFileName; - aNewCmdL.Append( rsc_strdup( aTmpStr.GetBuffer() ) ); - printf( "%s", (const char *)aNewCmdL.GetEntry( aNewCmdL.GetCount() -1 ) ); - aNewCmdL.Append( (void *)0 ); - printf( "\n" ); - + RscVerbosity eVerbosity = RscVerbosityNormal; if( fRspFile ) { for( i = 1; i < (int)(pCmdLine->GetCount() -1); i++ ) { + if ( !rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-verbose" ) ) + { + eVerbosity = RscVerbosityVerbose; + continue; + } + if ( !rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-quiet" ) ) + { + eVerbosity = RscVerbositySilent; + continue; + } if( !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-fp=", 4 ) || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-fo=", 4 ) || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-pp=", 4 ) @@ -261,6 +277,22 @@ static BOOL CallRsc2( ByteString aRsc2Name, fclose( fRspFile ); }; + RscPtrPtr aNewCmdL; // Kommandozeile + aNewCmdL.Append( rsc_strdup( aRsc2Name.GetBuffer() ) ); + ByteString aTmpStr( '@' ); + aTmpStr += aRspFileName; + aNewCmdL.Append( rsc_strdup( aTmpStr.GetBuffer() ) ); + aNewCmdL.Append( (void *)0 ); + + if ( eVerbosity >= RscVerbosityVerbose ) + { + printf( "Rsc2 commandline: " ); + printf( "%s", (const char *)aNewCmdL.GetEntry( 0 ) ); + printf( " " ); + printf( "%s", (const char *)aNewCmdL.GetEntry( 1 ) ); + printf( "\n" ); + } + #if ((defined OS2 || defined WNT) && (defined TCPP || defined tcpp)) || defined UNX || defined OS2 nExit = spawnvp( P_WAIT, aRsc2Name.GetBuffer(), (char* const*)aNewCmdL.GetBlock() ); #elif defined CSET @@ -328,8 +360,6 @@ int cdecl main ( int argc, char ** argv) aRsc2Name += aDelim; aRsc2Name += ByteString("rsc2"); - printf( "VCL Resource Compiler 3.0\n" ); - pStr = ::ResponseFile( &aCmdLine, argv, argc ); if( pStr ) { diff --git a/rsc/source/rsc/rsc.cxx b/rsc/source/rsc/rsc.cxx index 953b837055de..934c41d5e9a9 100644 --- a/rsc/source/rsc/rsc.cxx +++ b/rsc/source/rsc/rsc.cxx @@ -520,15 +520,18 @@ printf( "khg\n" ); } }; - pTC->pEH->StdOut( "Files: " ); - pFName = pTC->aFileTab.First(); - while( pFName ) + if ( pTC->pEH->GetVerbosity() >= RscVerbosityVerbose ) { - pTC->pEH->StdOut( pFName->aFileName.GetBuffer() ); - pTC->pEH->StdOut( " " ); - pFName = pTC->aFileTab.Next(); - }; - pTC->pEH->StdOut( "\n" ); + pTC->pEH->StdOut( "Files: " ); + pFName = pTC->aFileTab.First(); + while( pFName ) + { + pTC->pEH->StdOut( pFName->aFileName.GetBuffer() ); + pTC->pEH->StdOut( " " ); + pFName = pTC->aFileTab.Next(); + }; + pTC->pEH->StdOut( "\n" ); + } if( aError.IsOk() ) aError = Link(); @@ -554,9 +557,9 @@ void RscCompiler::EndCompile() { if( pCL->aOutputSrs.Len() && (pCL->nCommands & NOLINK_FLAG) ) { - pTC->pEH->StdOut( "Writing file " ); - pTC->pEH->StdOut( pCL->aOutputSrs.GetBuffer() ); - pTC->pEH->StdOut( ".\n" ); + pTC->pEH->StdOut( "Writing file ", RscVerbosityVerbose ); + pTC->pEH->StdOut( pCL->aOutputSrs.GetBuffer(), RscVerbosityVerbose ); + pTC->pEH->StdOut( ".\n", RscVerbosityVerbose ); // kopiere von TMP auf richtigen Namen unlink( pCL->aOutputSrs.GetBuffer() ); // Zieldatei loeschen @@ -588,9 +591,9 @@ void RscCompiler::EndCompile() if ( aTmpOutputHxx.Len() ) { - pTC->pEH->StdOut( "Writing file " ); - pTC->pEH->StdOut( pCL->aOutputHxx.GetBuffer() ); - pTC->pEH->StdOut( ".\n" ); + pTC->pEH->StdOut( "Writing file ", RscVerbosityVerbose ); + pTC->pEH->StdOut( pCL->aOutputHxx.GetBuffer(), RscVerbosityVerbose ); + pTC->pEH->StdOut( ".\n", RscVerbosityVerbose ); // kopiere von TMP auf richtigen Namen unlink( pCL->aOutputHxx.GetBuffer() ); // Zieldatei loeschen @@ -601,9 +604,9 @@ void RscCompiler::EndCompile() if( aTmpOutputCxx.Len() ) { - pTC->pEH->StdOut( "Writing file " ); - pTC->pEH->StdOut( pCL->aOutputCxx.GetBuffer() ); - pTC->pEH->StdOut( ".\n" ); + pTC->pEH->StdOut( "Writing file ", RscVerbosityVerbose ); + pTC->pEH->StdOut( pCL->aOutputCxx.GetBuffer(), RscVerbosityVerbose ); + pTC->pEH->StdOut( ".\n", RscVerbosityVerbose ); // kopiere von TMP auf richtigen Namen unlink( pCL->aOutputCxx.GetBuffer() ); // Zieldatei loeschen @@ -614,9 +617,9 @@ void RscCompiler::EndCompile() if( aTmpOutputRcCtor.Len() ) { - pTC->pEH->StdOut( "Writing file " ); - pTC->pEH->StdOut( pCL->aOutputRcCtor.GetBuffer() ); - pTC->pEH->StdOut( ".\n" ); + pTC->pEH->StdOut( "Writing file ", RscVerbosityVerbose ); + pTC->pEH->StdOut( pCL->aOutputRcCtor.GetBuffer(), RscVerbosityVerbose ); + pTC->pEH->StdOut( ".\n", RscVerbosityVerbose ); // kopiere von TMP auf richtigen Namen unlink( pCL->aOutputRcCtor.GetBuffer() ); // Zieldatei loeschen @@ -776,14 +779,14 @@ ERRTYPE RscCompiler :: ParseOneFile( ULONG lFileKey, { RscFileInst aFileInst( pTC, lFileKey, lFileKey, finput ); - pTC->pEH->StdOut( "reading file " ); - pTC->pEH->StdOut( aParseFile.GetBuffer() ); - pTC->pEH->StdOut( " " ); + pTC->pEH->StdOut( "reading file ", RscVerbosityVerbose ); + pTC->pEH->StdOut( aParseFile.GetBuffer(), RscVerbosityVerbose ); + pTC->pEH->StdOut( " ", RscVerbosityVerbose ); aError = ::parser( &aFileInst ); if( aError.IsError() ) pTC->Delete( lFileKey );//Resourceobjekte loeschen - pTC->pEH->StdOut( "\n" ); + pTC->pEH->StdOut( "\n", RscVerbosityVerbose ); fclose( finput ); }; diff --git a/toolkit/source/awt/vclxwindow.cxx b/toolkit/source/awt/vclxwindow.cxx index a8c0912a583e..9ca21c5fb36b 100644 --- a/toolkit/source/awt/vclxwindow.cxx +++ b/toolkit/source/awt/vclxwindow.cxx @@ -2506,7 +2506,14 @@ void VCLXWindow::setZoom( float fZoomX, float /*fZoomY*/ ) throw(::com::sun::sta ::vos::OGuard aGuard( GetMutex() ); if ( GetWindow() ) - GetWindow()->SetZoom( Fraction( fZoomX ) ); + { + // Fraction::Fraction takes a double, but we have a float only. + // The implicit conversion from float to double can result in a precision loss, i.e. 1.2 is converted to + // 1.200000000047something. To prevent this, we convert explicitly to double, and round it. + double nZoom( fZoomX ); + nZoom = ::rtl::math::round( nZoom, 4 ); + GetWindow()->SetZoom( Fraction( nZoom ) ); + } } // ::com::sun::star::lang::XEventListener diff --git a/transex3/prj/build.lst b/transex3/prj/build.lst index 1ba0a50ff41c..0017471af134 100644 --- a/transex3/prj/build.lst +++ b/transex3/prj/build.lst @@ -1,4 +1,4 @@ -tr transex3 : tools libxslt berkeleydb lucene NULL +tr transex3 : tools libxslt berkeleydb LUCENE:lucene NULL tr transex3 usr1 - all tr_mkout NULL tr transex3\inc nmake - all tr_inc NULL tr transex3\source nmake - all tr_src tr_inc NULL diff --git a/transex3/source/help/makefile.mk b/transex3/source/help/makefile.mk index f010e256368e..edf68d906133 100644 --- a/transex3/source/help/makefile.mk +++ b/transex3/source/help/makefile.mk @@ -112,7 +112,7 @@ JAVACLASSFILES = \ #JARFILES = ridl.jar jurt.jar unoil.jar juh.jar .IF "$(SYSTEM_LUCENE)" == "YES" -XCLASSPATH!:=$(XCLASSPATH)$(PATH_SEPERATOR)$(LUCENE_CORE_JAR)$(PATH_SEPERATOR)$(LUCENE_ANALYZERS_JAR) +CLASSPATH!:=$(CLASSPATH)$(PATH_SEPERATOR)$(LUCENE_CORE_JAR)$(PATH_SEPERATOR)$(LUCENE_ANALYZERS_JAR) COMP=fix_system_lucene .ELSE JARFILES += lucene-core-2.3.jar lucene-analyzers-2.3.jar @@ -136,4 +136,4 @@ $(JARTARGETN) : $(COMP) fix_system_lucene: @echo "Fix Java Class-Path entry for Lucene libraries from system." @$(SED) -r -e "s#^(Class-Path:).*#\1 file://$(LUCENE_CORE_JAR) file://$(LUCENE_ANALYZERS_JAR)#" \ - -i ../../../../../$(INPATH)/class/HelpLinker/META-INF/MANIFEST.MF + -i ../../$(INPATH)/class/HelpLinker/META-INF/MANIFEST.MF diff --git a/unotools/inc/unotools/idhelper.hxx b/unotools/inc/unotools/idhelper.hxx index 2fcac8550af5..a2aa28d26c1b 100644 --- a/unotools/inc/unotools/idhelper.hxx +++ b/unotools/inc/unotools/idhelper.hxx @@ -125,9 +125,6 @@ public: \ static void release(); \ \ static ::com::sun::star::uno::Sequence< sal_Int8 > getImplementationId( \ - const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XTypeProvider >& _rxProvider); \ - \ - static ::com::sun::star::uno::Sequence< sal_Int8 > getImplementationId( \ const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type >& _rTypes); \ \ private: \ @@ -182,16 +179,6 @@ void classname::release() \ \ /*-----------------------------------------------------------------------*/ \ ::com::sun::star::uno::Sequence< sal_Int8 > classname::getImplementationId( \ - const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XTypeProvider >& _rxProvider) \ -{ \ - ::osl::MutexGuard aGuard(s_aMutex); \ - if (_rxProvider.is()) \ - return getImplementationId(_rxProvider->getTypes()); \ - return ::com::sun::star::uno::Sequence< sal_Int8 >(); \ -} \ - \ -/*-----------------------------------------------------------------------*/ \ -::com::sun::star::uno::Sequence< sal_Int8 > classname::getImplementationId( \ const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type >& _rTypes) \ { \ ::osl::MutexGuard aGuard(s_aMutex); \ diff --git a/vcl/aqua/inc/salinst.h b/vcl/aqua/inc/salinst.h index 82ac5b6f4ffd..5b1cf0d84562 100644 --- a/vcl/aqua/inc/salinst.h +++ b/vcl/aqua/inc/salinst.h @@ -143,6 +143,7 @@ public: virtual void DestroyMenuItem( SalMenuItem* ); virtual SalSession* CreateSalSession(); virtual void* GetConnectionIdentifier( ConnectionIdentifierType& rReturnedType, int& rReturnedBytes ); + virtual void AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType); virtual void SetEventCallback( void* pInstance, bool(*pCallback)(void*,void*,int) ); virtual void SetErrorEventCallback( void* pInstance, bool(*pCallback)(void*,void*,int) ); diff --git a/vcl/aqua/source/app/salinst.cxx b/vcl/aqua/source/app/salinst.cxx index 56bf1a612b40..e4037df0c4aa 100644 --- a/vcl/aqua/source/app/salinst.cxx +++ b/vcl/aqua/source/app/salinst.cxx @@ -55,6 +55,14 @@ #include "saltimer.h" #include "vclnsapp.h" +#include <comphelper/processfactory.hxx> + +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/uri/XExternalUriReferenceTranslator.hpp> +#include <com/sun/star/uri/ExternalUriReferenceTranslator.hpp> +#include <com/sun/star/uno/XComponentContext.hpp> + #include "premac.h" #include <Foundation/Foundation.h> #include <ApplicationServices/ApplicationServices.h> @@ -64,6 +72,7 @@ using namespace std; +using namespace ::com::sun::star; extern BOOL ImplSVMain(); @@ -1029,6 +1038,83 @@ void* AquaSalInstance::GetConnectionIdentifier( ConnectionIdentifierType& rRetur return (void*)""; } +// We need to re-encode file urls because osl_getFileURLFromSystemPath converts +// to UTF-8 before encoding non ascii characters, which is not what other apps expect. +static rtl::OUString translateToExternalUrl(const rtl::OUString& internalUrl) +{ + rtl::OUString extUrl; + + uno::Reference< lang::XMultiServiceFactory > sm = comphelper::getProcessServiceFactory(); + if (sm.is()) + { + uno::Reference< beans::XPropertySet > pset; + sm->queryInterface( getCppuType( &pset )) >>= pset; + if (pset.is()) + { + uno::Reference< uno::XComponentContext > context; + static const rtl::OUString DEFAULT_CONTEXT( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ) ); + pset->getPropertyValue(DEFAULT_CONTEXT) >>= context; + if (context.is()) + extUrl = uri::ExternalUriReferenceTranslator::create(context)->translateToExternal(internalUrl); + } + } + return extUrl; +} + +// #i104525# many versions of OSX have problems with some URLs: +// when an app requests OSX to add one of these URLs to the "Recent Items" list +// then this app gets killed (TextEdit, Preview, etc. and also OOo) +static bool isDangerousUrl( const rtl::OUString& rUrl ) +{ + // use a heuristic that detects all known cases since there is no official comment + // on the exact impact and root cause of the OSX bug + const int nLen = rUrl.getLength(); + const sal_Unicode* p = rUrl.getStr(); + for( int i = 0; i < nLen-3; ++i, ++p ) { + if( p[0] != '%' ) + continue; + // escaped percent? + if( (p[1] == '2') && (p[2] == '5') ) + return true; + // escapes are considered to be UTF-8 encoded + // => check for invalid UTF-8 leading byte + if( (p[1] != 'f') && (p[1] != 'F') ) + continue; + int cLowNibble = p[2]; + if( (cLowNibble >= '0' ) && (cLowNibble <= '9')) + return false; + if( cLowNibble >= 'a' ) + cLowNibble -= 'a' - 'A'; + if( (cLowNibble < 'A') || (cLowNibble >= 'C')) + return true; + } + + return false; +} + +void AquaSalInstance::AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& /*rMimeType*/) +{ + // Convert file URL for external use (see above) + rtl::OUString externalUrl = translateToExternalUrl(rFileUrl); + if( 0 == externalUrl.getLength() ) + externalUrl = rFileUrl; + + if( externalUrl.getLength() && !isDangerousUrl( externalUrl ) ) + { + NSString* pString = CreateNSString( externalUrl ); + NSURL* pURL = [NSURL URLWithString: pString]; + + if( pURL ) + { + NSDocumentController* pCtrl = [NSDocumentController sharedDocumentController]; + [pCtrl noteNewRecentDocumentURL: pURL]; + } + if( pString ) + [pString release]; + } +} + + // ----------------------------------------------------------------------- SalTimer* AquaSalInstance::CreateSalTimer() diff --git a/vcl/inc/vcl/salinst.hxx b/vcl/inc/vcl/salinst.hxx index 650e57cdccc4..f8c148859516 100644 --- a/vcl/inc/vcl/salinst.hxx +++ b/vcl/inc/vcl/salinst.hxx @@ -184,6 +184,7 @@ public: CreateClipboard( const com::sun::star::uno::Sequence< com::sun::star::uno::Any >& i_rArguments ); virtual com::sun::star::uno::Reference< com::sun::star::uno::XInterface > CreateDragSource(); virtual com::sun::star::uno::Reference< com::sun::star::uno::XInterface > CreateDropTarget(); + virtual void AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType) = 0; }; // called from SVMain diff --git a/vcl/inc/vcl/svapp.hxx b/vcl/inc/vcl/svapp.hxx index f853fae6c268..1e0c5218d1c5 100644 --- a/vcl/inc/vcl/svapp.hxx +++ b/vcl/inc/vcl/svapp.hxx @@ -479,6 +479,20 @@ public: */ static const ::rtl::OUString& GetDesktopEnvironment(); + /** Add a file to the system shells recent document list if there is any. + This function may have no effect under Unix because there is no + standard API among the different desktop managers. + + @param rFileUrl + The file url of the document. + + @param rMimeType + The mime content type of the document specified by aFileUrl. + If an empty string will be provided "application/octet-stream" + will be used. + */ + static void AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType); + private: DECL_STATIC_LINK( Application, PostEventHandler, void* ); diff --git a/vcl/inc/vcl/window.hxx b/vcl/inc/vcl/window.hxx index 8c42ebd5dd21..1a6104b36f91 100644 --- a/vcl/inc/vcl/window.hxx +++ b/vcl/inc/vcl/window.hxx @@ -165,6 +165,7 @@ namespace vcl { struct ControlLayoutData; } #define SHOW_NOPARENTUPDATE ((USHORT)0x0001) #define SHOW_NOFOCUSCHANGE ((USHORT)0x0002) #define SHOW_NOACTIVATE ((USHORT)0x0004) +#define SHOW_FOREGROUNDTASK ((USHORT)0x0008) // Flags for SetZOrder() #define WINDOW_ZORDER_BEFOR ((USHORT)0x0001) diff --git a/vcl/os2/inc/salinst.h b/vcl/os2/inc/salinst.h index 119324c1acd6..ba8dc7ddc43f 100644 --- a/vcl/os2/inc/salinst.h +++ b/vcl/os2/inc/salinst.h @@ -96,6 +96,7 @@ public: virtual void DestroyMenuItem( SalMenuItem* ); virtual SalSession* CreateSalSession(); virtual void* GetConnectionIdentifier( ConnectionIdentifierType& rReturnedType, int& rReturnedBytes ); + virtual void AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType); }; SalFrame* ImplSalCreateFrame( Os2SalInstance* pInst, HWND hWndParent, ULONG nSalFrameStyle ); diff --git a/vcl/os2/source/app/salinst.cxx b/vcl/os2/source/app/salinst.cxx index a14881c253ee..d4d324ad469c 100644 --- a/vcl/os2/source/app/salinst.cxx +++ b/vcl/os2/source/app/salinst.cxx @@ -811,6 +811,10 @@ void* Os2SalInstance::GetConnectionIdentifier( ConnectionIdentifierType& rReturn return (void*) ""; } +void Os2SalInstance::AddToRecentDocumentList(const rtl::OUString& /*rFileUrl*/, const rtl::OUString& /*rMimeType*/) +{ +} + // ----------------------------------------------------------------------- SalTimer* Os2SalInstance::CreateSalTimer() diff --git a/vcl/source/app/svapp.cxx b/vcl/source/app/svapp.cxx index b53ceceeb757..6057409baa14 100644 --- a/vcl/source/app/svapp.cxx +++ b/vcl/source/app/svapp.cxx @@ -1989,6 +1989,12 @@ const ::rtl::OUString& Application::GetDesktopEnvironment() return SalGetDesktopEnvironment(); } +void Application::AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType) +{ + ImplSVData* pSVData = ImplGetSVData(); + pSVData->mpDefInst->AddToRecentDocumentList(rFileUrl, rMimeType); +} + BOOL Application::IsAccessibilityEnabled() { return FALSE; diff --git a/vcl/source/gdi/region.cxx b/vcl/source/gdi/region.cxx index b98712419cf1..43bb224aaa94 100644 --- a/vcl/source/gdi/region.cxx +++ b/vcl/source/gdi/region.cxx @@ -153,7 +153,8 @@ void ImplAddMissingBands ( // We still have to cover two cases: // 1. The region does not yet contain any bands. // 2. The intervall nTop->nBottom extends past the bottom most band. - if (nCurrentTop < nBottom && (pBand==NULL || nBottom>pBand->mnYBottom)) + if (nCurrentTop <= nBottom + && (pBand==NULL || nBottom>pBand->mnYBottom)) { // When there is no previous band then the new one will be the // first. Otherwise the new band is inserted behind the last band. @@ -232,8 +233,9 @@ ImplRegion* ImplRectilinearPolygonToBands (const PolyPolygon& rPolyPoly) ImplRegionBand* pTopBand = pBand; // If necessary split the band at nTop so that nTop is contained // in the lower band. - if ( // Prevent the current band from becoming 0 pixel high - pBand->mnYTop<nTop + if (pBand!=NULL + // Prevent the current band from becoming 0 pixel high + && pBand->mnYTop<nTop // this allows the lowest pixel of the band to be split off && pBand->mnYBottom>=nTop // do not split a band that is just one pixel high @@ -248,8 +250,9 @@ ImplRegion* ImplRectilinearPolygonToBands (const PolyPolygon& rPolyPoly) pBand = pBand->mpNextBand; // The lowest band may have to be split at nBottom so that // nBottom itself remains in the upper band. - if ( // allow the current band becoming 1 pixel high - pBand->mnYTop<=nBottom + if (pBand!=NULL + // allow the current band becoming 1 pixel high + && pBand->mnYTop<=nBottom // prevent splitting off a band that is 0 pixel high && pBand->mnYBottom>nBottom // do not split a band that is just one pixel high diff --git a/vcl/source/window/makefile.mk b/vcl/source/window/makefile.mk index a518ce124b74..ace5a59e9bbd 100644 --- a/vcl/source/window/makefile.mk +++ b/vcl/source/window/makefile.mk @@ -97,10 +97,10 @@ SLOFILES= \ $(INCCOM)$/cuilib.hxx: makefile.mk .IF "$(GUI)"=="UNX" - $(RM) $@ - echo \#define DLL_NAME \"libcui$(DLLPOSTFIX)$(DLLPOST)\" >$@ + @$(RM) $@ + @echo \#define DLL_NAME \"libcui$(DLLPOSTFIX)$(DLLPOST)\" >$@ .ELSE - echo $(EMQ)#define DLL_NAME $(EMQ)"cui$(DLLPOSTFIX)$(DLLPOST)$(EMQ)" >$@ + @echo $(EMQ)#define DLL_NAME $(EMQ)"cui$(DLLPOSTFIX)$(DLLPOST)$(EMQ)" >$@ .ENDIF $(SLO)$/abstdlg.obj : $(INCCOM)$/cuilib.hxx diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx index a011dfbc7551..c353771c8fde 100644 --- a/vcl/source/window/window.cxx +++ b/vcl/source/window/window.cxx @@ -6532,7 +6532,7 @@ void Window::Show( BOOL bVisible, USHORT nFlags ) // nach vorne, wenn es gewuenscht ist if ( ImplIsOverlapWindow() && !(nFlags & SHOW_NOACTIVATE) ) { - ImplStartToTop( 0 ); + ImplStartToTop(( nFlags & SHOW_FOREGROUNDTASK ) ? TOTOP_FOREGROUNDTASK : 0 ); ImplFocusToTop( 0, FALSE ); } diff --git a/vcl/unx/gtk/app/gtkinst.cxx b/vcl/unx/gtk/app/gtkinst.cxx index 8bed40fa539f..af3a1df97a8c 100644 --- a/vcl/unx/gtk/app/gtkinst.cxx +++ b/vcl/unx/gtk/app/gtkinst.cxx @@ -216,6 +216,34 @@ SalObject* GtkInstance::CreateObject( SalFrame* pParent, SystemWindowData* pWind return new GtkSalObject( static_cast<GtkSalFrame*>(pParent), bShow ); } +extern "C" +{ + typedef void*(* getDefaultFnc)(); + typedef void(* addItemFnc)(void *, const char *); +} + +void GtkInstance::AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType) +{ +#if GTK_CHECK_VERSION(2,10,0) + GtkRecentManager *manager = gtk_recent_manager_get_default (); + gtk_recent_manager_add_item (manager, rtl::OUStringToOString(rFileUrl, RTL_TEXTENCODING_UTF8).getStr()); + (void)rMimeType; +#else + static getDefaultFnc sym_gtk_recent_manager_get_default = + (getDefaultFnc)osl_getAsciiFunctionSymbol( GetSalData()->m_pPlugin, "gtk_recent_manager_get_default" ); + + static addItemFnc sym_gtk_recent_manager_add_item = + (addItemFnc)osl_getAsciiFunctionSymbol( GetSalData()->m_pPlugin, "gtk_recent_manager_add_item"); + if (sym_gtk_recent_manager_get_default && sym_gtk_recent_manager_add_item) + { + sym_gtk_recent_manager_add_item(sym_gtk_recent_manager_get_default(), + rtl::OUStringToOString(rFileUrl, RTL_TEXTENCODING_UTF8).getStr()); + } + else + X11SalInstance::AddToRecentDocumentList(rFileUrl, rMimeType); +#endif +} + GtkYieldMutex::GtkYieldMutex() { } diff --git a/vcl/unx/headless/svpinst.cxx b/vcl/unx/headless/svpinst.cxx index 87d0e4662f29..7b93e59b6acd 100644 --- a/vcl/unx/headless/svpinst.cxx +++ b/vcl/unx/headless/svpinst.cxx @@ -504,6 +504,10 @@ void SvpSalInstance::StartTimer( ULONG nMS ) } } +void SvpSalInstance::AddToRecentDocumentList(const rtl::OUString&, const rtl::OUString&) +{ +} + SvpSalTimer::~SvpSalTimer() { } diff --git a/vcl/unx/headless/svpinst.hxx b/vcl/unx/headless/svpinst.hxx index 71c463f071a9..e77debb53f1d 100644 --- a/vcl/unx/headless/svpinst.hxx +++ b/vcl/unx/headless/svpinst.hxx @@ -193,6 +193,8 @@ public: virtual SalSession* CreateSalSession(); virtual void* GetConnectionIdentifier( ConnectionIdentifierType& rReturnedType, int& rReturnedBytes ); + + virtual void AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType); }; #endif // _SV_SALINST_HXX diff --git a/vcl/unx/inc/plugins/gtk/gtkinst.hxx b/vcl/unx/inc/plugins/gtk/gtkinst.hxx index 22c50f627e0c..16dce4688ede 100644 --- a/vcl/unx/inc/plugins/gtk/gtkinst.hxx +++ b/vcl/unx/inc/plugins/gtk/gtkinst.hxx @@ -91,6 +91,7 @@ public: virtual SalFrame* CreateChildFrame( SystemParentData* pParent, ULONG nStyle ); virtual SalObject* CreateObject( SalFrame* pParent, SystemWindowData* pWindowData, BOOL bShow = TRUE ); virtual SalSystem* CreateSalSystem(); + virtual void AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType); }; class GtkSalSystem : public X11SalSystem diff --git a/vcl/unx/inc/salinst.h b/vcl/unx/inc/salinst.h index bef5cfd5e9b4..399326c44f27 100644 --- a/vcl/unx/inc/salinst.h +++ b/vcl/unx/inc/salinst.h @@ -121,6 +121,8 @@ public: CreateClipboard( const com::sun::star::uno::Sequence< com::sun::star::uno::Any >& i_rArguments ); virtual com::sun::star::uno::Reference< com::sun::star::uno::XInterface > CreateDragSource(); virtual com::sun::star::uno::Reference< com::sun::star::uno::XInterface > CreateDropTarget(); + virtual void AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType); + bool isPrinterInit() const { diff --git a/vcl/unx/source/app/salinst.cxx b/vcl/unx/source/app/salinst.cxx index d84b7fa5df6d..1dc2d1404009 100644 --- a/vcl/unx/source/app/salinst.cxx +++ b/vcl/unx/source/app/salinst.cxx @@ -35,6 +35,8 @@ #include <stdio.h> #include <stdlib.h> +#include <osl/module.hxx> + #include "salunx.h" #include "saldata.hxx" @@ -413,3 +415,20 @@ void X11SalInstance::FillFontPathList( std::list< rtl::OString >& o_rFontPaths ) #endif /* SOLARIS */ } +extern "C" { static void SAL_CALL thisModule() {} } + +void X11SalInstance::AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType) +{ + const rtl::OUString SYM_ADD_TO_RECENTLY_USED_FILE_LIST(RTL_CONSTASCII_USTRINGPARAM("add_to_recently_used_file_list")); + const rtl::OUString LIB_RECENT_FILE(RTL_CONSTASCII_USTRINGPARAM("librecentfile.so")); + typedef void (*PFUNC_ADD_TO_RECENTLY_USED_LIST)(const rtl::OUString&, const rtl::OUString&); + + PFUNC_ADD_TO_RECENTLY_USED_LIST add_to_recently_used_file_list = 0; + + osl::Module module; + module.loadRelative( &thisModule, LIB_RECENT_FILE ); + if (module.is()) + add_to_recently_used_file_list = (PFUNC_ADD_TO_RECENTLY_USED_LIST)module.getFunctionSymbol(SYM_ADD_TO_RECENTLY_USED_FILE_LIST); + if (add_to_recently_used_file_list) + add_to_recently_used_file_list(rFileUrl, rMimeType); +} diff --git a/vcl/unx/source/gdi/makefile.mk b/vcl/unx/source/gdi/makefile.mk index bdd400baa8ad..fb513a66a841 100644 --- a/vcl/unx/source/gdi/makefile.mk +++ b/vcl/unx/source/gdi/makefile.mk @@ -107,8 +107,8 @@ ALLTAR : $(MACOSXRC) XSALSETLIBNAME=$(DLLPRE)spa$(DLLPOSTFIX)$(DLLPOST) $(INCCOM)$/rtsname.hxx: - rm -f $(INCCOM)$/rtsname.hxx ; \ - echo "#define _XSALSET_LIBNAME "\"$(XSALSETLIBNAME)\" > $(INCCOM)$/rtsname.hxx + @rm -f $(INCCOM)$/rtsname.hxx ; \ + echo "#define _XSALSET_LIBNAME "\"$(XSALSETLIBNAME)\" > $(INCCOM)$/rtsname.hxx $(SLO)$/salpimpl.obj : $(INCCOM)$/rtsname.hxx $(SLO)$/salprnpsp.obj : $(INCCOM)$/rtsname.hxx diff --git a/vcl/win/inc/salinst.h b/vcl/win/inc/salinst.h index 26afe892b9a3..33a1a941ed49 100644 --- a/vcl/win/inc/salinst.h +++ b/vcl/win/inc/salinst.h @@ -88,6 +88,7 @@ public: virtual void DestroyMenuItem( SalMenuItem* ); virtual SalSession* CreateSalSession(); virtual void* GetConnectionIdentifier( ConnectionIdentifierType& rReturnedType, int& rReturnedBytes ); + virtual void AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType); static int WorkaroundExceptionHandlingInUSER32Lib(int nExcept, LPEXCEPTION_POINTERS pExceptionInfo); }; diff --git a/vcl/win/source/app/salinst.cxx b/vcl/win/source/app/salinst.cxx index d57cdd48eed2..2b5ac6d3162d 100644 --- a/vcl/win/source/app/salinst.cxx +++ b/vcl/win/source/app/salinst.cxx @@ -39,7 +39,7 @@ #ifdef __MINGW32__ #include <excpt.h> #endif - +#include <osl/file.hxx> #include <vos/mutex.hxx> #include <tools/debug.hxx> #include <wincomp.hxx> @@ -65,11 +65,13 @@ #if defined _MSC_VER #pragma warning(push, 1) +#pragma warning( disable: 4917 ) #endif #include <GdiPlus.h> #include <GdiPlusEnums.h> #include <GdiPlusColor.h> +#include <Shlobj.h> #if defined _MSC_VER #pragma warning(pop) @@ -456,10 +458,10 @@ void InitSalData() { SalData* pSalData = new SalData; CoInitialize(0); -
- // init GDIPlus
- static Gdiplus::GdiplusStartupInput gdiplusStartupInput;
- Gdiplus::GdiplusStartup(&pSalData->gdiplusToken, &gdiplusStartupInput, NULL);
+ + // init GDIPlus + static Gdiplus::GdiplusStartupInput gdiplusStartupInput; + Gdiplus::GdiplusStartup(&pSalData->gdiplusToken, &gdiplusStartupInput, NULL); } @@ -471,7 +473,7 @@ void DeInitSalData() // deinit GDIPlus if(pSalData) { - Gdiplus::GdiplusShutdown(pSalData->gdiplusToken);
+ Gdiplus::GdiplusShutdown(pSalData->gdiplusToken); } delete pSalData; @@ -1089,6 +1091,26 @@ void* WinSalInstance::GetConnectionIdentifier( ConnectionIdentifierType& rReturn // ----------------------------------------------------------------------- +/** Add a file to the system shells recent document list if there is any. + This function may have no effect under Unix because there is no + standard API among the different desktop managers. + + @param aFileUrl + The file url of the document. +*/ +void WinSalInstance::AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& /*rMimeType*/) +{ + rtl::OUString system_path; + osl::FileBase::RC rc = osl::FileBase::getSystemPathFromFileURL(rFileUrl, system_path); + + OSL_ENSURE(osl::FileBase::E_None == rc, "Invalid file url"); + + if (osl::FileBase::E_None == rc) + SHAddToRecentDocs(SHARD_PATHW, system_path.getStr()); +} + +// ----------------------------------------------------------------------- + SalTimer* WinSalInstance::CreateSalTimer() { return new WinSalTimer(); diff --git a/vcl/win/source/window/salframe.cxx b/vcl/win/source/window/salframe.cxx index 4a49d83918da..78c4e4e6ddcc 100644 --- a/vcl/win/source/window/salframe.cxx +++ b/vcl/win/source/window/salframe.cxx @@ -2157,7 +2157,17 @@ static void ImplSalToTop( HWND hWnd, USHORT nFlags ) BringWindowToTop( hWnd ); if ( nFlags & SAL_FRAME_TOTOP_FOREGROUNDTASK ) - SetForegroundWindow( hWnd ); + { + // This magic code is necessary to connect the input focus of the
+ // current window thread and the thread which owns the window that
+ // should be the new foreground window.
+ HWND hCurrWnd = GetForegroundWindow();
+ DWORD myThreadID = GetCurrentThreadId();
+ DWORD currThreadID = GetWindowThreadProcessId(hCurrWnd,NULL);
+ AttachThreadInput(myThreadID, currThreadID,TRUE);
+ SetForegroundWindow(hWnd);
+ AttachThreadInput(myThreadID,currThreadID,FALSE);
+ } if ( nFlags & SAL_FRAME_TOTOP_RESTOREWHENMIN ) { |