You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
libreoffice/libreoffice-xdg632229.gnome...

428 lines
17 KiB

diff -ru framework/inc/helper/titlebarupdate.hxx framework/inc/helper/titlebarupdate.hxx
--- framework/inc/helper/titlebarupdate.hxx 2010-10-14 21:54:22.000000000 +0100
+++ framework/inc/helper/titlebarupdate.hxx 2010-10-22 12:52:13.000000000 +0100
@@ -212,6 +212,7 @@
*/
void impl_updateTitle(const css::uno::Reference< css::frame::XFrame >& xFrame);
+ void impl_updateWM_CLASSS(const css::uno::Reference< css::frame::XFrame >& xFrame);
}; // class TitleBarUpdate
} // namespace framework
diff -ru framework/source/helper/titlebarupdate.cxx framework/source/helper/titlebarupdate.cxx
--- framework/source/helper/titlebarupdate.cxx 2010-10-14 21:54:22.000000000 +0100
+++ framework/source/helper/titlebarupdate.cxx 2010-10-22 15:00:16.000000000 +0100
@@ -199,6 +201,88 @@
// nothing todo here - because we hold the frame as weak reference only
}
+//http://live.gnome.org/GnomeShell/ApplicationBased
+void TitleBarUpdate::impl_updateWM_CLASSS(const css::uno::Reference< css::frame::XFrame >& xFrame)
+{
+ css::uno::Reference< css::awt::XWindow > xWindow = xFrame->getContainerWindow ();
+ if ( ! xWindow.is() )
+ return;
+
+ ::rtl::OUString sWM_CLASS;
+ try
+ {
+ ::rtl::OUString aProductName;
+ ::utl::ConfigManager::GetDirectConfigProperty(::utl::ConfigManager::PRODUCTNAME) >>= aProductName;
+
+ // SYNCHRONIZED ->
+ ReadGuard aReadLock(m_aLock);
+ css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xSMGR;
+ aReadLock.unlock();
+ // <- SYNCHRONIZED
+
+ css::uno::Reference< css::frame::XModuleManager > xModuleManager(
+ xSMGR->createInstance(SERVICENAME_MODULEMANAGER),
+ css::uno::UNO_QUERY_THROW);
+
+ css::uno::Reference< css::container::XNameAccess > xConfig(
+ xModuleManager,
+ css::uno::UNO_QUERY_THROW);
+
+ rtl::OUString aModuleId = xModuleManager->identify(xFrame);
+ rtl::OUString sDesktopName;
+
+ if ( aModuleId.equalsAscii( "com.sun.star.text.TextDocument" ) ||
+ aModuleId.equalsAscii( "com.sun.star.text.GlobalDocument" ) ||
+ aModuleId.equalsAscii( "com.sun.star.text.WebDocument" ) ||
+ aModuleId.equalsAscii( "com.sun.star.xforms.XMLFormDocument" ) )
+ sDesktopName = ::rtl::OUString::createFromAscii("writer");
+ else if ( aModuleId.equalsAscii( "com.sun.star.sheet.SpreadsheetDocument" ) )
+ sDesktopName = ::rtl::OUString::createFromAscii("calc");
+ else if ( aModuleId.equalsAscii( "com.sun.star.presentation.PresentationDocument" ) )
+ sDesktopName = ::rtl::OUString::createFromAscii("impress");
+ else if ( aModuleId.equalsAscii( "com.sun.star.drawing.DrawingDocument" ) )
+ sDesktopName = ::rtl::OUString::createFromAscii("draw");
+ else if ( aModuleId.equalsAscii( "com.sun.star.formula.FormulaProperties" ) )
+ sDesktopName = ::rtl::OUString::createFromAscii("math");
+ else if ( aModuleId.equalsAscii( "com.sun.star.sdb.DatabaseDocument" ) ||
+ aModuleId.equalsAscii( "com.sun.star.sdb.OfficeDatabaseDocument" ) ||
+ aModuleId.equalsAscii( "com.sun.star.sdb.RelationDesign" ) ||
+ aModuleId.equalsAscii( "com.sun.star.sdb.QueryDesign" ) ||
+ aModuleId.equalsAscii( "com.sun.star.sdb.TableDesign" ) ||
+ aModuleId.equalsAscii( "com.sun.star.sdb.DataSourceBrowser" ) )
+ sDesktopName = ::rtl::OUString::createFromAscii("base");
+ else if ( aModuleId.equalsAscii( "com.sun.star.frame.StartModule" ) )
+ sDesktopName = ::rtl::OUString::createFromAscii("startcenter");
+ else
+ sDesktopName = ::rtl::OUString::createFromAscii("startcenter");
+ sWM_CLASS = aProductName.toAsciiLowerCase();
+ sWM_CLASS += ::rtl::OUString(sal_Unicode('-'));
+ sWM_CLASS += sDesktopName;
+ }
+ catch(const css::uno::Exception&)
+ {
+ }
+
+ // VCL SYNCHRONIZED ->
+ ::vos::OClearableGuard aSolarLock( Application::GetSolarMutex() );
+
+ Window* pWindow = (VCLUnoHelper::GetWindow( xWindow ));
+ if (
+ ( pWindow ) &&
+ ( pWindow->GetType() == WINDOW_WORKWINDOW )
+ )
+ {
+ WorkWindow* pWorkWindow = (WorkWindow*)pWindow;
+#ifdef COPY_TO_TITLE_FOR_DEBUG
+ pWorkWindow->SetText( sWM_CLASS );
+#endif
+ pWorkWindow->SetWMClass( sWM_CLASS );
+ }
+
+ aSolarLock.clear();
+}
+
+
//*****************************************************************************************************************
::sal_Bool TitleBarUpdate::implst_getModuleInfo(const css::uno::Reference< css::frame::XFrame >& xFrame,
TModuleInfo& rInfo )
@@ -260,6 +347,9 @@
impl_updateIcon (xFrame);
impl_updateTitle (xFrame);
+#if defined(UNX) && !defined(MACOSX)
+ impl_updateWM_CLASSS (xFrame);
+#endif
}
//*****************************************************************************************************************
diff -ru vcl/aqua/inc/salframe.h vcl/aqua/inc/salframe.h
--- vcl/aqua/inc/salframe.h 2010-10-14 21:43:20.000000000 +0100
+++ vcl/aqua/inc/salframe.h 2010-10-22 13:26:26.000000000 +0100
@@ -159,6 +159,7 @@
virtual void SetExtendedFrameStyle( SalExtStyle );
virtual void SetBackgroundBitmap( SalBitmap* );
virtual void SetScreenNumber(unsigned int);
+ virtual void SetWMClass( const rtl::OUString &rWMClass );
// shaped system windows
// set clip region to none (-> rectangular windows, normal state)
diff -ru vcl/aqua/source/window/salframe.cxx vcl/aqua/source/window/salframe.cxx
--- vcl/aqua/source/window/salframe.cxx 2010-10-18 17:01:44.000000000 +0100
+++ vcl/aqua/source/window/salframe.cxx 2010-10-22 13:17:50.000000000 +0100
@@ -664,6 +664,10 @@
}
}
+void AquaSalFrame::SetWMClass( const rtl::OUString &/*rWMClass*/ )
+{
+}
+
// -----------------------------------------------------------------------
void AquaSalFrame::ShowFullScreen( BOOL bFullScreen, sal_Int32 nDisplay )
diff -ru vcl/inc/vcl/salframe.hxx vcl/inc/vcl/salframe.hxx
--- vcl/inc/vcl/salframe.hxx 2010-10-14 21:43:20.000000000 +0100
+++ vcl/inc/vcl/salframe.hxx 2010-10-22 13:26:05.000000000 +0100
@@ -266,6 +266,8 @@
// move the frame to a new screen
virtual void SetScreenNumber( unsigned int nScreen ) = 0;
+ virtual void SetWMClass( const rtl::OUString &rWMClass ) = 0;
+
// shaped system windows
// set clip region to none (-> rectangular windows, normal state)
virtual void ResetClipRegion() = 0;
diff -ru vcl/inc/vcl/syswin.hxx vcl/inc/vcl/syswin.hxx
--- vcl/inc/vcl/syswin.hxx 2010-10-14 21:43:20.000000000 +0100
+++ vcl/inc/vcl/syswin.hxx 2010-10-22 13:14:48.000000000 +0100
@@ -277,6 +277,8 @@
@see GetScreenNumber
*/
void SetScreenNumber( unsigned int nNewScreen );
+
+ void SetWMClass( const rtl::OUString &rWMClass );
};
#endif // _SV_SYSWIN_HXX
diff -ru vcl/os2/inc/salframe.h vcl/os2/inc/salframe.h
--- vcl/os2/inc/salframe.h 2010-10-14 21:43:20.000000000 +0100
+++ vcl/os2/inc/salframe.h 2010-10-22 13:26:15.000000000 +0100
@@ -158,6 +158,7 @@
virtual bool SetPluginParent( SystemParentData* pNewParent );
virtual void SetBackgroundBitmap( SalBitmap* );
virtual void SetScreenNumber( unsigned int );
+ virtual void SetWMClass( const rtl::OUString &rWMClass );
virtual void ResetClipRegion();
virtual void BeginSetClipRegion( ULONG nRects );
virtual void UnionClipRegion( long nX, long nY, long nWidth, long nHeight );
diff -ru vcl/os2/source/window/salframe.cxx vcl/os2/source/window/salframe.cxx
--- vcl/os2/source/window/salframe.cxx 2010-10-18 17:01:44.000000000 +0100
+++ vcl/os2/source/window/salframe.cxx 2010-10-22 13:18:17.000000000 +0100
@@ -1366,6 +1366,10 @@
{
}
+void Os2SalFrame::SetWMClass( const rtl::OUString &/*rWMClass*/ )
+{
+}
+
// -----------------------------------------------------------------------
// native menu implementation - currently empty
diff -ru vcl/source/window/syswin.cxx vcl/source/window/syswin.cxx
--- vcl/source/window/syswin.cxx 2010-10-14 21:43:20.000000000 +0100
+++ vcl/source/window/syswin.cxx 2010-10-22 13:29:21.000000000 +0100
@@ -1084,4 +1084,9 @@
mpWindowImpl->mpFrame->SetScreenNumber( nScreen );
}
+void SystemWindow::SetWMClass( const rtl::OUString &rWMClass )
+{
+ mpWindowImpl->mpFrame->SetWMClass( rWMClass );
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff -ru vcl/unx/gtk/window/gtkframe.cxx vcl/unx/gtk/window/gtkframe.cxx
--- vcl/unx/gtk/window/gtkframe.cxx 2010-10-22 08:55:43.000000000 +0100
+++ vcl/unx/gtk/window/gtkframe.cxx 2010-10-22 14:12:08.000000000 +0100
@@ -981,25 +981,10 @@
if( nStyle != m_nExtStyle && ! isChild() )
{
m_nExtStyle = nStyle;
- if( GTK_WIDGET_REALIZED( m_pWindow ) )
- {
- XClassHint* pClass = XAllocClassHint();
- rtl::OString aResHint = X11SalData::getFrameResName( m_nExtStyle );
- pClass->res_name = const_cast<char*>(aResHint.getStr());
- pClass->res_class = const_cast<char*>(X11SalData::getFrameClassName());
- XSetClassHint( getDisplay()->GetDisplay(),
- GDK_WINDOW_XWINDOW(m_pWindow->window),
- pClass );
- XFree( pClass );
- }
- else
- gtk_window_set_wmclass( GTK_WINDOW(m_pWindow),
- X11SalData::getFrameResName( m_nExtStyle ),
- X11SalData::getFrameClassName() );
+ updateWMClass();
}
}
-
SalGraphics* GtkSalFrame::GetGraphics()
{
if( m_pWindow )
@@ -1792,6 +1777,39 @@
}
}
+void GtkSalFrame::updateWMClass()
+{
+ fprintf(stderr, "%p GtkSalFrame::SetWMClass with %s\n", this, rtl::OUStringToOString(m_sWMClass, RTL_TEXTENCODING_UTF8).getStr());
+
+ rtl::OString aResClass = rtl::OUStringToOString(m_sWMClass, RTL_TEXTENCODING_ASCII_US);
+ const char *pResClass = aResClass.getLength() ? aResClass.getStr() : X11SalData::getFrameClassName();
+
+ if( GTK_WIDGET_REALIZED( m_pWindow ) )
+ {
+ XClassHint* pClass = XAllocClassHint();
+ rtl::OString aResName = X11SalData::getFrameResName( m_nExtStyle );
+ pClass->res_name = const_cast<char*>(aResName.getStr());
+ pClass->res_class = const_cast<char*>(pResClass);
+ XSetClassHint( getDisplay()->GetDisplay(),
+ GDK_WINDOW_XWINDOW(m_pWindow->window),
+ pClass );
+ XFree( pClass );
+ }
+ else
+ gtk_window_set_wmclass( GTK_WINDOW(m_pWindow),
+ X11SalData::getFrameResName( m_nExtStyle ),
+ pResClass );
+}
+
+void GtkSalFrame::SetWMClass( const rtl::OUString &rWMClass )
+{
+ if( rWMClass != m_sWMClass && ! isChild() )
+ {
+ m_sWMClass = rWMClass;
+ updateWMClass();
+ }
+}
+
void GtkSalFrame::ShowFullScreen( BOOL bFullScreen, sal_Int32 nScreen )
{
if( m_pWindow && ! isChild() )
diff -ru vcl/unx/headless/svpframe.hxx vcl/unx/headless/svpframe.hxx
--- vcl/unx/headless/svpframe.hxx 2010-10-14 21:43:20.000000000 +0100
+++ vcl/unx/headless/svpframe.hxx 2010-10-22 13:27:19.000000000 +0100
@@ -125,6 +125,7 @@
/*TODO: functional implementation */
virtual void SetScreenNumber( unsigned int nScreen ) { (void)nScreen; }
+ virtual void SetWMClass( const rtl::OUString &rWMClass ) { (void) rWMClass; }
};
#endif // _SVP_SVPFRAME_HXX
diff -ru vcl/unx/inc/plugins/gtk/gtkframe.hxx vcl/unx/inc/plugins/gtk/gtkframe.hxx
--- vcl/unx/inc/plugins/gtk/gtkframe.hxx 2010-10-22 08:55:43.000000000 +0100
+++ vcl/unx/inc/plugins/gtk/gtkframe.hxx 2010-10-22 14:10:08.000000000 +0100
@@ -192,6 +192,7 @@
bool m_bWindowIsGtkPlug;
bool m_bSetFocusOnMap;
String m_aTitle;
+ rtl::OUString m_sWMClass;
IMHandler* m_pIMHandler;
@@ -269,6 +270,8 @@
void setMinMaxSize();
void createNewWindow( XLIB_Window aParent, bool bXEmbed, int nScreen );
void askForXEmbedFocus( sal_Int32 nTimecode );
+
+ void updateWMClass();
DECL_LINK( ImplDelayedFullScreenHdl, void* );
public:
@@ -387,6 +390,7 @@
virtual void SetBackgroundBitmap( SalBitmap* );
virtual void SetScreenNumber( unsigned int );
+ virtual void SetWMClass( const rtl::OUString &rWMClass );
// shaped system windows
// set clip region to none (-> rectangular windows, normal state)
diff -ru vcl/unx/inc/salframe.h vcl/unx/inc/salframe.h
--- vcl/unx/inc/salframe.h 2010-10-14 21:43:20.000000000 +0100
+++ vcl/unx/inc/salframe.h 2010-10-22 14:22:35.000000000 +0100
@@ -128,6 +128,8 @@
int mnIconID;
String m_aTitle;
+
+ rtl::OUString m_sWMClass;
SystemChildData maSystemChildData;
@@ -171,6 +173,8 @@
void setXEmbedInfo();
void askForXEmbedFocus( sal_Int32 i_nTimeCode );
+
+ void updateWMClass();
public:
X11SalFrame( SalFrame* pParent, ULONG nSalFrameStyle, SystemParentData* pSystemParent = NULL );
virtual ~X11SalFrame();
@@ -261,6 +265,7 @@
virtual void SetBackgroundBitmap( SalBitmap* pBitmap );
virtual void SetScreenNumber( unsigned int );
+ virtual void SetWMClass( const rtl::OUString &rWMClass );
// shaped system windows
// set clip region to none (-> rectangular windows, normal state)
diff -ru vcl/unx/source/window/salframe.cxx vcl/unx/source/window/salframe.cxx
--- vcl/unx/source/window/salframe.cxx 2010-10-18 12:39:42.000000000 +0100
+++ vcl/unx/source/window/salframe.cxx 2010-10-22 14:23:44.000000000 +0100
@@ -542,11 +542,9 @@
a[n++] = pDisplay_->getWMAdaptor()->getAtom( WMAdaptor::WM_TAKE_FOCUS );
XSetWMProtocols( GetXDisplay(), GetShellWindow(), a, n );
- XClassHint* pClass = XAllocClassHint();
- pClass->res_name = const_cast<char*>(X11SalData::getFrameResName());
- pClass->res_class = const_cast<char*>(X11SalData::getFrameClassName());
- XSetClassHint( GetXDisplay(), GetShellWindow(), pClass );
- XFree( pClass );
+ // force wm class hint
+ mnExtStyle = ~0;
+ SetExtendedFrameStyle( 0 );
XSizeHints* pHints = XAllocSizeHints();
pHints->flags = PWinGravity | PPosition;
@@ -849,13 +847,7 @@
if( nStyle != mnExtStyle && ! IsChildWindow() )
{
mnExtStyle = nStyle;
-
- XClassHint* pClass = XAllocClassHint();
- rtl::OString aResHint = X11SalData::getFrameResName( mnExtStyle );
- pClass->res_name = const_cast<char*>(aResHint.getStr());
- pClass->res_class = const_cast<char*>(X11SalData::getFrameClassName());
- XSetClassHint( GetXDisplay(), GetShellWindow(), pClass );
- XFree( pClass );
+ updateWMClass();
}
}
@@ -2192,6 +2184,30 @@
}
}
+void X11SalFrame::SetWMClass( const rtl::OUString &rWMClass )
+{
+ if( rWMClass != m_sWMClass && ! IsChildWindow() )
+ {
+ m_sWMClass = rWMClass;
+ updateWMClass();
+ }
+}
+
+void X11SalFrame::updateWMClass()
+{
+ XClassHint* pClass = XAllocClassHint();
+ rtl::OString aResName = X11SalData::getFrameResName( mnExtStyle );
+ pClass->res_name = const_cast<char*>(aResName.getStr());
+
+ rtl::OString aResClass = rtl::OUStringToOString(m_sWMClass, RTL_TEXTENCODING_ASCII_US);
+ const char *pResClass = aResClass.getLength() ? aResClass.getStr() : X11SalData::getFrameClassName();
+
+ pClass->res_class = const_cast<char*>(pResClass);
+ XSetClassHint( GetXDisplay(), GetShellWindow(), pClass );
+ XFree( pClass );
+}
+
+
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void X11SalFrame::ShowFullScreen( BOOL bFullScreen, sal_Int32 nScreen )
diff -ru vcl/win/inc/salframe.h vcl/win/inc/salframe.h
--- vcl/win/inc/salframe.h 2010-10-14 21:43:21.000000000 +0100
+++ vcl/win/inc/salframe.h 2010-10-22 13:26:23.000000000 +0100
@@ -141,6 +141,7 @@
virtual bool SetPluginParent( SystemParentData* pNewParent );
virtual void SetBackgroundBitmap( SalBitmap* );
virtual void SetScreenNumber( unsigned int );
+ virtual void SetWMClass( const rtl::OUString &rWMClass );
virtual void ResetClipRegion();
virtual void BeginSetClipRegion( ULONG nRects );
virtual void UnionClipRegion( long nX, long nY, long nWidth, long nHeight );
diff -ru vcl/win/source/window/salframe.cxx vcl/win/source/window/salframe.cxx
--- vcl/win/source/window/salframe.cxx 2010-10-14 21:43:21.000000000 +0100
+++ vcl/win/source/window/salframe.cxx 2010-10-22 13:18:05.000000000 +0100
@@ -2036,6 +2036,10 @@
}
}
+void WinSalFrame::SetWMClass( const rtl::OUString &/*rWMClass*/ )
+{
+}
+
// -----------------------------------------------------------------------
void WinSalFrame::ShowFullScreen( BOOL bFullScreen, sal_Int32 nDisplay )