diff options
author | Caolán McNamara <caolanm@redhat.com> | 2010-10-27 23:05:06 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2010-10-27 23:09:46 +0100 |
commit | 2aee1633048bcb732a5c1917580d305afa54e5ef (patch) | |
tree | bdd5a625779818e2404d95c2fe0e4c0fcddc63e2 | |
parent | 9701dc30610792e63e589f5fa6f8f2eb1866c97f (diff) |
fdo#632229# provide some support for a per-windowframe ApplicationID/WM_CLASS
-rw-r--r-- | vcl/aqua/inc/salframe.h | 1 | ||||
-rw-r--r-- | vcl/aqua/source/window/salframe.cxx | 4 | ||||
-rw-r--r-- | vcl/inc/vcl/salframe.hxx | 2 | ||||
-rw-r--r-- | vcl/inc/vcl/syswin.hxx | 2 | ||||
-rw-r--r-- | vcl/os2/inc/salframe.h | 1 | ||||
-rw-r--r-- | vcl/os2/source/window/salframe.cxx | 4 | ||||
-rw-r--r-- | vcl/source/window/syswin.cxx | 7 | ||||
-rw-r--r-- | vcl/unx/gtk/window/gtkframe.cxx | 53 | ||||
-rw-r--r-- | vcl/unx/headless/svpframe.hxx | 1 | ||||
-rw-r--r-- | vcl/unx/inc/plugins/gtk/gtkframe.hxx | 4 | ||||
-rw-r--r-- | vcl/unx/inc/salframe.h | 5 | ||||
-rw-r--r-- | vcl/unx/source/window/salframe.cxx | 45 | ||||
-rw-r--r-- | vcl/win/inc/salframe.h | 1 | ||||
-rw-r--r-- | vcl/win/source/window/salframe.cxx | 4 |
14 files changed, 105 insertions, 29 deletions
diff --git a/vcl/aqua/inc/salframe.h b/vcl/aqua/inc/salframe.h index ee4d0373b2cc..bc16c38dafe5 100644 --- a/vcl/aqua/inc/salframe.h +++ b/vcl/aqua/inc/salframe.h @@ -159,6 +159,7 @@ public: virtual void SetExtendedFrameStyle( SalExtStyle ); virtual void SetBackgroundBitmap( SalBitmap* ); virtual void SetScreenNumber(unsigned int); + virtual void SetApplicationID( const rtl::OUString &rApplicationID ); // shaped system windows // set clip region to none (-> rectangular windows, normal state) diff --git a/vcl/aqua/source/window/salframe.cxx b/vcl/aqua/source/window/salframe.cxx index a8a9e2fb45cd..27573318228c 100644 --- a/vcl/aqua/source/window/salframe.cxx +++ b/vcl/aqua/source/window/salframe.cxx @@ -664,6 +664,10 @@ void AquaSalFrame::SetScreenNumber(unsigned int nScreen) } } +void AquaSalFrame::SetApplicationID( const rtl::OUString &/*rApplicationID*/ ) +{ +} + // ----------------------------------------------------------------------- void AquaSalFrame::ShowFullScreen( BOOL bFullScreen, sal_Int32 nDisplay ) diff --git a/vcl/inc/vcl/salframe.hxx b/vcl/inc/vcl/salframe.hxx index 2b771ea0a8e8..9e7a1ab0e007 100644 --- a/vcl/inc/vcl/salframe.hxx +++ b/vcl/inc/vcl/salframe.hxx @@ -266,6 +266,8 @@ public: // move the frame to a new screen virtual void SetScreenNumber( unsigned int nScreen ) = 0; + virtual void SetApplicationID( const rtl::OUString &rApplicationID) = 0; + // shaped system windows // set clip region to none (-> rectangular windows, normal state) virtual void ResetClipRegion() = 0; diff --git a/vcl/inc/vcl/syswin.hxx b/vcl/inc/vcl/syswin.hxx index 4afe47b91e20..dcc287a4e2cc 100644 --- a/vcl/inc/vcl/syswin.hxx +++ b/vcl/inc/vcl/syswin.hxx @@ -277,6 +277,8 @@ public: @see GetScreenNumber */ void SetScreenNumber( unsigned int nNewScreen ); + + void SetApplicationID( const rtl::OUString &rApplicationID ); }; #endif // _SV_SYSWIN_HXX diff --git a/vcl/os2/inc/salframe.h b/vcl/os2/inc/salframe.h index ca16fbebc54a..53933e30b55a 100644 --- a/vcl/os2/inc/salframe.h +++ b/vcl/os2/inc/salframe.h @@ -158,6 +158,7 @@ public: virtual bool SetPluginParent( SystemParentData* pNewParent ); virtual void SetBackgroundBitmap( SalBitmap* ); virtual void SetScreenNumber( unsigned int ); + virtual void SetApplicationID( const rtl::OUString &rApplicationID ); virtual void ResetClipRegion(); virtual void BeginSetClipRegion( ULONG nRects ); virtual void UnionClipRegion( long nX, long nY, long nWidth, long nHeight ); diff --git a/vcl/os2/source/window/salframe.cxx b/vcl/os2/source/window/salframe.cxx index 7ffc335d5528..743bdce64802 100644 --- a/vcl/os2/source/window/salframe.cxx +++ b/vcl/os2/source/window/salframe.cxx @@ -1366,6 +1366,10 @@ void Os2SalFrame::SetScreenNumber( unsigned int nNewScreen ) { } +void Os2SalFrame::SetApplicationID( const rtl::OUString &/*rApplicationID*/ ) +{ +} + // ----------------------------------------------------------------------- // native menu implementation - currently empty diff --git a/vcl/source/window/syswin.cxx b/vcl/source/window/syswin.cxx index ebad6722aa7d..fe3b6f5a585b 100644 --- a/vcl/source/window/syswin.cxx +++ b/vcl/source/window/syswin.cxx @@ -1079,9 +1079,14 @@ unsigned int SystemWindow::GetScreenNumber() const // ----------------------------------------------------------------------- -void SystemWindow::SetScreenNumber( unsigned int nScreen) +void SystemWindow::SetScreenNumber(unsigned int nScreen) { mpWindowImpl->mpFrame->SetScreenNumber( nScreen ); } +void SystemWindow::SetApplicationID(const rtl::OUString &rApplicationID) +{ + mpWindowImpl->mpFrame->SetApplicationID(rApplicationID); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/gtk/window/gtkframe.cxx b/vcl/unx/gtk/window/gtkframe.cxx index 37c22bcbf705..860bf980df19 100644 --- a/vcl/unx/gtk/window/gtkframe.cxx +++ b/vcl/unx/gtk/window/gtkframe.cxx @@ -798,6 +798,8 @@ void GtkSalFrame::Init( SalFrame* pParent, ULONG nStyle ) // force wm class hint m_nExtStyle = ~0; + if (m_pParent) + m_sWMClass = m_pParent->m_sWMClass; SetExtendedFrameStyle( 0 ); if( m_pParent && m_pParent->m_pWindow && ! isChild() ) @@ -981,25 +983,10 @@ void GtkSalFrame::SetExtendedFrameStyle( SalExtStyle nStyle ) 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 +1779,40 @@ void GtkSalFrame::SetScreenNumber( unsigned int nNewScreen ) } } +void GtkSalFrame::updateWMClass() +{ + 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::SetApplicationID( const rtl::OUString &rWMClass ) +{ + if( rWMClass != m_sWMClass && ! isChild() ) + { + m_sWMClass = rWMClass; + updateWMClass(); + + for( std::list< GtkSalFrame* >::iterator it = m_aChildren.begin(); it != m_aChildren.end(); ++it ) + (*it)->SetApplicationID(rWMClass); + } +} + void GtkSalFrame::ShowFullScreen( BOOL bFullScreen, sal_Int32 nScreen ) { if( m_pWindow && ! isChild() ) diff --git a/vcl/unx/headless/svpframe.hxx b/vcl/unx/headless/svpframe.hxx index fb2c38f38f26..a552eff871b4 100644 --- a/vcl/unx/headless/svpframe.hxx +++ b/vcl/unx/headless/svpframe.hxx @@ -125,6 +125,7 @@ public: /*TODO: functional implementation */ virtual void SetScreenNumber( unsigned int nScreen ) { (void)nScreen; } + virtual void SetApplicationID(const rtl::OUString &rApplicationID) { (void) rApplicationID; } }; #endif // _SVP_SVPFRAME_HXX diff --git a/vcl/unx/inc/plugins/gtk/gtkframe.hxx b/vcl/unx/inc/plugins/gtk/gtkframe.hxx index 6cd370733ce2..0621699b1c11 100644 --- a/vcl/unx/inc/plugins/gtk/gtkframe.hxx +++ b/vcl/unx/inc/plugins/gtk/gtkframe.hxx @@ -192,6 +192,7 @@ class GtkSalFrame : public SalFrame bool m_bWindowIsGtkPlug; bool m_bSetFocusOnMap; String m_aTitle; + rtl::OUString m_sWMClass; IMHandler* m_pIMHandler; @@ -270,6 +271,8 @@ class GtkSalFrame : public SalFrame void createNewWindow( XLIB_Window aParent, bool bXEmbed, int nScreen ); void askForXEmbedFocus( sal_Int32 nTimecode ); + void updateWMClass(); + DECL_LINK( ImplDelayedFullScreenHdl, void* ); public: GtkSalFrame( SalFrame* pParent, ULONG nStyle ); @@ -387,6 +390,7 @@ public: virtual void SetBackgroundBitmap( SalBitmap* ); virtual void SetScreenNumber( unsigned int ); + virtual void SetApplicationID( const rtl::OUString &rWMClass ); // shaped system windows // set clip region to none (-> rectangular windows, normal state) diff --git a/vcl/unx/inc/salframe.h b/vcl/unx/inc/salframe.h index 954cf8f5bd2d..90d7c2e7a3dd 100644 --- a/vcl/unx/inc/salframe.h +++ b/vcl/unx/inc/salframe.h @@ -129,6 +129,8 @@ class VCL_DLLPUBLIC X11SalFrame : public SalFrame String m_aTitle; + rtl::OUString m_sWMClass; + SystemChildData maSystemChildData; SalI18N_InputContext *mpInputContext; @@ -171,6 +173,8 @@ class VCL_DLLPUBLIC X11SalFrame : public SalFrame 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 @@ public: virtual void SetBackgroundBitmap( SalBitmap* pBitmap ); virtual void SetScreenNumber( unsigned int ); + virtual void SetApplicationID( const rtl::OUString &rWMClass ); // shaped system windows // set clip region to none (-> rectangular windows, normal state) diff --git a/vcl/unx/source/window/salframe.cxx b/vcl/unx/source/window/salframe.cxx index 05b2b13220b3..0324f24e03a4 100644 --- a/vcl/unx/source/window/salframe.cxx +++ b/vcl/unx/source/window/salframe.cxx @@ -542,11 +542,11 @@ void X11SalFrame::Init( ULONG nSalFrameStyle, int nScreen, SystemParentData* pPa 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; + if (mpParent) + m_sWMClass = mpParent->m_sWMClass; + SetExtendedFrameStyle( 0 ); XSizeHints* pHints = XAllocSizeHints(); pHints->flags = PWinGravity | PPosition; @@ -849,13 +849,7 @@ void X11SalFrame::SetExtendedFrameStyle( SalExtStyle nStyle ) 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 +2186,33 @@ void X11SalFrame::SetScreenNumber( unsigned int nNewScreen ) } } +void X11SalFrame::SetApplicationID( const rtl::OUString &rWMClass ) +{ + if( rWMClass != m_sWMClass && ! IsChildWindow() ) + { + m_sWMClass = rWMClass; + updateWMClass(); + std::list< X11SalFrame* >::const_iterator it; + for( it = maChildren.begin(); it != maChildren.end(); ++it ) + (*it)->SetApplicationID(rWMClass); + } +} + +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 --git a/vcl/win/inc/salframe.h b/vcl/win/inc/salframe.h index b2092943f5ef..989b4fc41c26 100644 --- a/vcl/win/inc/salframe.h +++ b/vcl/win/inc/salframe.h @@ -141,6 +141,7 @@ public: virtual bool SetPluginParent( SystemParentData* pNewParent ); virtual void SetBackgroundBitmap( SalBitmap* ); virtual void SetScreenNumber( unsigned int ); + virtual void SetApplicationID( const rtl::OUString &rApplicationID ); virtual void ResetClipRegion(); virtual void BeginSetClipRegion( ULONG nRects ); virtual void UnionClipRegion( long nX, long nY, long nWidth, long nHeight ); diff --git a/vcl/win/source/window/salframe.cxx b/vcl/win/source/window/salframe.cxx index 340d2919bf30..6c002b673165 100644 --- a/vcl/win/source/window/salframe.cxx +++ b/vcl/win/source/window/salframe.cxx @@ -2036,6 +2036,10 @@ void WinSalFrame::SetScreenNumber( unsigned int nNewScreen ) } } +void WinSalFrame::SetApplicationID( const rtl::OUString &/*rApplicationID*/ ) +{ +} + // ----------------------------------------------------------------------- void WinSalFrame::ShowFullScreen( BOOL bFullScreen, sal_Int32 nDisplay ) |