[libreoffice: 1/2] Resolves: xdg632229 gnomeshell app tracking
Caolan McNamara
caolanm at fedoraproject.org
Fri Oct 22 14:56:45 UTC 2010
commit c741ed29a8348ef59f7e4e2ed2fa109d556e1f3a
Author: Caolán McNamara <caolanm at redhat.com>
Date: Fri Oct 22 15:54:48 2010 +0100
Resolves: xdg632229 gnomeshell app tracking
libreoffice-xdg632229.gnomeshell.patch | 427 ++++++++++++++++++++++++++++++++
libreoffice.spec | 7 +-
2 files changed, 433 insertions(+), 1 deletions(-)
---
diff --git a/libreoffice-xdg632229.gnomeshell.patch b/libreoffice-xdg632229.gnomeshell.patch
new file mode 100644
index 0000000..a9121ca
--- /dev/null
+++ b/libreoffice-xdg632229.gnomeshell.patch
@@ -0,0 +1,427 @@
+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 )
diff --git a/libreoffice.spec b/libreoffice.spec
index bb2a676..70f87ec 100644
--- a/libreoffice.spec
+++ b/libreoffice.spec
@@ -28,7 +28,7 @@
Summary: Free Software Productivity Suite
Name: libreoffice
Version: 3.2.99.2
-Release: 1%{?dist}
+Release: 2%{?dist}
License: LGPLv3 and LGPLv2+ and BSD and (MPLv1.1 or GPLv2 or LGPLv2 or Netscape) and (CDDL or GPLv2) and Public Domain
Group: Applications/Productivity
URL: http://www.documentfoundation.org/develop
@@ -100,6 +100,7 @@ Patch13: openoffice.org-3.2.0.ooo108846.sfx2.qstartfixes.patch
Patch14: openoffice.org-3.3.0.ooo107490.cppu.lifecycle.patch
Patch15: openoffice.org-3.3.0.ooo113273.desktop.resolvelinks.patch
Patch16: libreoffice-buildfix.patch
+Patch17: libreoffice-xdg632229.gnomeshell.patch
%{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
%define instdir %{_libdir}
@@ -1396,6 +1397,7 @@ cp -p %{SOURCE20} external/unowinreg/unowinreg.dll
%patch14 -p0 -b .ooo107490.cppu.lifecycle.patch
%patch15 -p0 -b .ooo113273.desktop.resolvelinks.patch
%patch16 -p1 -b .libreoffice-buildfix.patch
+%patch17 -p0 -b .xdg632229.gnomeshell.patch
%build
echo build start time is `date`, diskspace: `df -h . | tail -n 1`
@@ -3127,6 +3129,9 @@ update-desktop-database %{_datadir}/applications &> /dev/null || :
%endif
%changelog
+* Fri Oct 22 2010 Caolán McNamara <caolanm at redhat.com> 3.2.99.2-2
+- Resolves: xdg632229 gnomeshell app tracking
+
* Mon Oct 11 2010 Caolán McNamara <caolanm at redhat.com> 3.2.99.2-1
- next LibreOffice milestone
- drop integrated openoffice.org-2.3.0.ooo76649.httpencoding.patch
More information about the scm-commits
mailing list