summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2010-10-27 23:05:06 +0100
committerCaolán McNamara <caolanm@redhat.com>2010-10-27 23:09:46 +0100
commit2aee1633048bcb732a5c1917580d305afa54e5ef (patch)
treebdd5a625779818e2404d95c2fe0e4c0fcddc63e2
parent9701dc30610792e63e589f5fa6f8f2eb1866c97f (diff)
fdo#632229# provide some support for a per-windowframe ApplicationID/WM_CLASS
-rw-r--r--vcl/aqua/inc/salframe.h1
-rw-r--r--vcl/aqua/source/window/salframe.cxx4
-rw-r--r--vcl/inc/vcl/salframe.hxx2
-rw-r--r--vcl/inc/vcl/syswin.hxx2
-rw-r--r--vcl/os2/inc/salframe.h1
-rw-r--r--vcl/os2/source/window/salframe.cxx4
-rw-r--r--vcl/source/window/syswin.cxx7
-rw-r--r--vcl/unx/gtk/window/gtkframe.cxx53
-rw-r--r--vcl/unx/headless/svpframe.hxx1
-rw-r--r--vcl/unx/inc/plugins/gtk/gtkframe.hxx4
-rw-r--r--vcl/unx/inc/salframe.h5
-rw-r--r--vcl/unx/source/window/salframe.cxx45
-rw-r--r--vcl/win/inc/salframe.h1
-rw-r--r--vcl/win/source/window/salframe.cxx4
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 )