summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens-Heiner Rechtien <hr@openoffice.org>2010-01-28 19:19:29 +0000
committerJens-Heiner Rechtien <hr@openoffice.org>2010-01-28 19:19:29 +0000
commit5ae66b1fbadf8b2682f3f3716e298398d141826e (patch)
tree7e73c7540920a63da451c59f9766b000e11be0ba
parentfd5ee55b7b9ca4ce23c88b66c75d04b178a21891 (diff)
parentc0f197f920974f3fdaf8278dad16dc5ecb994d52 (diff)
koheidatapilot03: merge with DEV300_m63
-rw-r--r--canvas/source/cairo/cairo_textlayout.cxx6
-rwxr-xr-xcanvas/source/directx/dx_9rm.cxx42
-rwxr-xr-xcanvas/source/directx/dx_surfacegraphics.cxx5
-rw-r--r--i18npool/source/calendar/calendar_gregorian.cxx25
-rw-r--r--rsc/inc/rscerror.h14
-rw-r--r--rsc/source/parser/erscerr.cxx13
-rw-r--r--rsc/source/parser/rscyacc.cxx2
-rw-r--r--rsc/source/prj/gui.cxx16
-rw-r--r--rsc/source/prj/start.cxx88
-rw-r--r--rsc/source/rsc/rsc.cxx51
-rw-r--r--toolkit/source/awt/vclxwindow.cxx9
-rw-r--r--transex3/prj/build.lst2
-rw-r--r--transex3/source/help/makefile.mk4
-rw-r--r--unotools/inc/unotools/idhelper.hxx13
-rw-r--r--vcl/aqua/inc/salinst.h1
-rw-r--r--vcl/aqua/source/app/salinst.cxx86
-rw-r--r--vcl/inc/vcl/salinst.hxx1
-rw-r--r--vcl/inc/vcl/svapp.hxx14
-rw-r--r--vcl/inc/vcl/window.hxx1
-rw-r--r--vcl/os2/inc/salinst.h1
-rw-r--r--vcl/os2/source/app/salinst.cxx4
-rw-r--r--vcl/source/app/svapp.cxx6
-rw-r--r--vcl/source/gdi/region.cxx13
-rw-r--r--vcl/source/window/makefile.mk6
-rw-r--r--vcl/source/window/window.cxx2
-rw-r--r--vcl/unx/gtk/app/gtkinst.cxx28
-rw-r--r--vcl/unx/headless/svpinst.cxx4
-rw-r--r--vcl/unx/headless/svpinst.hxx2
-rw-r--r--vcl/unx/inc/plugins/gtk/gtkinst.hxx1
-rw-r--r--vcl/unx/inc/salinst.h2
-rw-r--r--vcl/unx/source/app/salinst.cxx19
-rw-r--r--vcl/unx/source/gdi/makefile.mk4
-rw-r--r--vcl/win/inc/salinst.h1
-rw-r--r--vcl/win/source/app/salinst.cxx34
-rw-r--r--vcl/win/source/window/salframe.cxx12
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 )
{