xref: /aoo42x/main/vcl/unx/generic/app/salsys.cxx (revision c82f2877)
1*c82f2877SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*c82f2877SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*c82f2877SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*c82f2877SAndrew Rist  * distributed with this work for additional information
6*c82f2877SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*c82f2877SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*c82f2877SAndrew Rist  * "License"); you may not use this file except in compliance
9*c82f2877SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*c82f2877SAndrew Rist  *
11*c82f2877SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*c82f2877SAndrew Rist  *
13*c82f2877SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*c82f2877SAndrew Rist  * software distributed under the License is distributed on an
15*c82f2877SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*c82f2877SAndrew Rist  * KIND, either express or implied.  See the License for the
17*c82f2877SAndrew Rist  * specific language governing permissions and limitations
18*c82f2877SAndrew Rist  * under the License.
19*c82f2877SAndrew Rist  *
20*c82f2877SAndrew Rist  *************************************************************/
21*c82f2877SAndrew Rist 
22*c82f2877SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_vcl.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <unx/salunx.h>
28cdf0e10cSrcweir #include <unx/dtint.hxx>
29cdf0e10cSrcweir #include <unx/saldata.hxx>
30cdf0e10cSrcweir #include <unx/salinst.h>
31cdf0e10cSrcweir #include <unx/saldisp.hxx>
32cdf0e10cSrcweir #include <unx/salsys.h>
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include <vcl/msgbox.hxx>
35cdf0e10cSrcweir #include <vcl/button.hxx>
36cdf0e10cSrcweir 
37cdf0e10cSrcweir #include <svdata.hxx>
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #include <rtl/ustrbuf.hxx>
40cdf0e10cSrcweir #include <osl/thread.h>
41cdf0e10cSrcweir 
42cdf0e10cSrcweir 
CreateSalSystem()43cdf0e10cSrcweir SalSystem* X11SalInstance::CreateSalSystem()
44cdf0e10cSrcweir {
45cdf0e10cSrcweir     return new X11SalSystem();
46cdf0e10cSrcweir }
47cdf0e10cSrcweir 
48cdf0e10cSrcweir // -----------------------------------------------------------------------
49cdf0e10cSrcweir 
~X11SalSystem()50cdf0e10cSrcweir X11SalSystem::~X11SalSystem()
51cdf0e10cSrcweir {
52cdf0e10cSrcweir }
53cdf0e10cSrcweir 
54cdf0e10cSrcweir // for the moment only handle xinerama case
GetDisplayScreenCount()55cdf0e10cSrcweir unsigned int X11SalSystem::GetDisplayScreenCount()
56cdf0e10cSrcweir {
57cdf0e10cSrcweir     SalDisplay* pSalDisp = GetX11SalData()->GetDisplay();
58cdf0e10cSrcweir     return pSalDisp->IsXinerama() ? pSalDisp->GetXineramaScreens().size() : pSalDisp->GetScreenCount();
59cdf0e10cSrcweir }
60cdf0e10cSrcweir 
IsMultiDisplay()61cdf0e10cSrcweir bool X11SalSystem::IsMultiDisplay()
62cdf0e10cSrcweir {
63cdf0e10cSrcweir     SalDisplay* pSalDisp = GetX11SalData()->GetDisplay();
64cdf0e10cSrcweir     unsigned int nScreenCount = pSalDisp->GetScreenCount();
65cdf0e10cSrcweir     return pSalDisp->IsXinerama() ? false : (nScreenCount > 1);
66cdf0e10cSrcweir }
67cdf0e10cSrcweir 
GetDefaultDisplayNumber()68cdf0e10cSrcweir unsigned int X11SalSystem::GetDefaultDisplayNumber()
69cdf0e10cSrcweir {
70cdf0e10cSrcweir     SalDisplay* pSalDisp = GetX11SalData()->GetDisplay();
71cdf0e10cSrcweir     return pSalDisp->IsXinerama() ? pSalDisp->GetDefaultMonitorNumber() : pSalDisp->GetDefaultScreenNumber();
72cdf0e10cSrcweir }
73cdf0e10cSrcweir 
GetDisplayScreenPosSizePixel(unsigned int nScreen)74cdf0e10cSrcweir Rectangle X11SalSystem::GetDisplayScreenPosSizePixel( unsigned int nScreen )
75cdf0e10cSrcweir {
76cdf0e10cSrcweir     Rectangle aRet;
77cdf0e10cSrcweir     SalDisplay* pSalDisp = GetX11SalData()->GetDisplay();
78cdf0e10cSrcweir     if( pSalDisp->IsXinerama() )
79cdf0e10cSrcweir     {
80cdf0e10cSrcweir         const std::vector< Rectangle >& rScreens = pSalDisp->GetXineramaScreens();
81cdf0e10cSrcweir         if( nScreen < rScreens.size() )
82cdf0e10cSrcweir             aRet = rScreens[nScreen];
83cdf0e10cSrcweir     }
84cdf0e10cSrcweir     else
85cdf0e10cSrcweir     {
86cdf0e10cSrcweir         const SalDisplay::ScreenData& rScreen = pSalDisp->getDataForScreen( nScreen );
87cdf0e10cSrcweir         aRet = Rectangle( Point( 0, 0 ), rScreen.m_aSize );
88cdf0e10cSrcweir     }
89cdf0e10cSrcweir 
90cdf0e10cSrcweir     return aRet;
91cdf0e10cSrcweir }
92cdf0e10cSrcweir 
GetDisplayWorkAreaPosSizePixel(unsigned int nScreen)93cdf0e10cSrcweir Rectangle X11SalSystem::GetDisplayWorkAreaPosSizePixel( unsigned int nScreen )
94cdf0e10cSrcweir {
95cdf0e10cSrcweir     // FIXME: workareas
96cdf0e10cSrcweir     return GetDisplayScreenPosSizePixel( nScreen );
97cdf0e10cSrcweir }
98cdf0e10cSrcweir 
GetScreenName(unsigned int nScreen)99cdf0e10cSrcweir rtl::OUString X11SalSystem::GetScreenName( unsigned int nScreen )
100cdf0e10cSrcweir {
101cdf0e10cSrcweir     rtl::OUString aScreenName;
102cdf0e10cSrcweir     SalDisplay* pSalDisp = GetX11SalData()->GetDisplay();
103cdf0e10cSrcweir     if( pSalDisp->IsXinerama() )
104cdf0e10cSrcweir     {
105cdf0e10cSrcweir         const std::vector< Rectangle >& rScreens = pSalDisp->GetXineramaScreens();
106cdf0e10cSrcweir         if( nScreen >= rScreens.size() )
107cdf0e10cSrcweir             nScreen = 0;
108cdf0e10cSrcweir         rtl::OUStringBuffer aBuf( 256 );
109cdf0e10cSrcweir         aBuf.append( rtl::OStringToOUString( rtl::OString( DisplayString( pSalDisp->GetDisplay() ) ), osl_getThreadTextEncoding() ) );
110cdf0e10cSrcweir         aBuf.appendAscii( " [" );
111cdf0e10cSrcweir         aBuf.append( static_cast<sal_Int32>(nScreen) );
112cdf0e10cSrcweir         aBuf.append( sal_Unicode(']') );
113cdf0e10cSrcweir         aScreenName = aBuf.makeStringAndClear();
114cdf0e10cSrcweir     }
115cdf0e10cSrcweir     else
116cdf0e10cSrcweir     {
117cdf0e10cSrcweir         if( nScreen >= static_cast<unsigned int>(pSalDisp->GetScreenCount()) )
118cdf0e10cSrcweir             nScreen = 0;
119cdf0e10cSrcweir         rtl::OUStringBuffer aBuf( 256 );
120cdf0e10cSrcweir         aBuf.append( rtl::OStringToOUString( rtl::OString( DisplayString( pSalDisp->GetDisplay() ) ), osl_getThreadTextEncoding() ) );
121cdf0e10cSrcweir         // search backwards for ':'
122cdf0e10cSrcweir         int nPos = aBuf.getLength();
123cdf0e10cSrcweir         if( nPos > 0 )
124cdf0e10cSrcweir             nPos--;
125cdf0e10cSrcweir         while( nPos > 0 && aBuf.charAt( nPos ) != ':' )
126cdf0e10cSrcweir             nPos--;
127cdf0e10cSrcweir         // search forward to '.'
128cdf0e10cSrcweir         while( nPos < aBuf.getLength() && aBuf.charAt( nPos ) != '.' )
129cdf0e10cSrcweir             nPos++;
130cdf0e10cSrcweir         if( nPos < aBuf.getLength() )
131cdf0e10cSrcweir             aBuf.setLength( nPos+1 );
132cdf0e10cSrcweir         else
133cdf0e10cSrcweir             aBuf.append( sal_Unicode('.') );
134cdf0e10cSrcweir         aBuf.append( static_cast<sal_Int32>(nScreen) );
135cdf0e10cSrcweir         aScreenName = aBuf.makeStringAndClear();
136cdf0e10cSrcweir     }
137cdf0e10cSrcweir     return aScreenName;
138cdf0e10cSrcweir }
139cdf0e10cSrcweir 
ShowNativeDialog(const String & rTitle,const String & rMessage,const std::list<String> & rButtons,int nDefButton)140cdf0e10cSrcweir int X11SalSystem::ShowNativeDialog( const String& rTitle, const String& rMessage, const std::list< String >& rButtons, int nDefButton )
141cdf0e10cSrcweir {
142cdf0e10cSrcweir     int nRet = -1;
143cdf0e10cSrcweir 
144cdf0e10cSrcweir     ImplSVData* pSVData = ImplGetSVData();
145cdf0e10cSrcweir     if( pSVData->mpIntroWindow )
146cdf0e10cSrcweir         pSVData->mpIntroWindow->Hide();
147cdf0e10cSrcweir 
148cdf0e10cSrcweir 	WarningBox aWarn( NULL, WB_STDWORK, rMessage );
149cdf0e10cSrcweir 	aWarn.SetText( rTitle );
150cdf0e10cSrcweir 	aWarn.Clear();
151cdf0e10cSrcweir 
152cdf0e10cSrcweir 	sal_uInt16 nButton = 0;
153cdf0e10cSrcweir 	for( std::list< String >::const_iterator it = rButtons.begin(); it != rButtons.end(); ++it )
154cdf0e10cSrcweir 	{
155cdf0e10cSrcweir             aWarn.AddButton( *it, nButton+1, nButton == (sal_uInt16)nDefButton ? BUTTONDIALOG_DEFBUTTON : 0 );
156cdf0e10cSrcweir             nButton++;
157cdf0e10cSrcweir 	}
158cdf0e10cSrcweir 	aWarn.SetFocusButton( (sal_uInt16)nDefButton+1 );
159cdf0e10cSrcweir 
160cdf0e10cSrcweir 	nRet = ((int)aWarn.Execute()) - 1;
161cdf0e10cSrcweir 
162cdf0e10cSrcweir     // normalize behaviour, actually this should never happen
163cdf0e10cSrcweir     if( nRet < -1 || nRet >= int(rButtons.size()) )
164cdf0e10cSrcweir         nRet = -1;
165cdf0e10cSrcweir 
166cdf0e10cSrcweir     return nRet;
167cdf0e10cSrcweir }
168cdf0e10cSrcweir 
ShowNativeMessageBox(const String & rTitle,const String & rMessage,int nButtonCombination,int nDefaultButton)169cdf0e10cSrcweir int X11SalSystem::ShowNativeMessageBox(const String& rTitle, const String& rMessage, int nButtonCombination, int nDefaultButton)
170cdf0e10cSrcweir {
171cdf0e10cSrcweir     int nDefButton = 0;
172cdf0e10cSrcweir     std::list< String > aButtons;
173cdf0e10cSrcweir     int nButtonIds[5], nBut = 0;
174cdf0e10cSrcweir 
175cdf0e10cSrcweir     if( nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK ||
176cdf0e10cSrcweir         nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL )
177cdf0e10cSrcweir     {
178cdf0e10cSrcweir         aButtons.push_back( Button::GetStandardText( BUTTON_OK ) );
179cdf0e10cSrcweir         nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_OK;
180cdf0e10cSrcweir     }
181cdf0e10cSrcweir     if( nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_YES_NO_CANCEL ||
182cdf0e10cSrcweir         nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_YES_NO )
183cdf0e10cSrcweir     {
184cdf0e10cSrcweir         aButtons.push_back( Button::GetStandardText( BUTTON_YES ) );
185cdf0e10cSrcweir         nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_YES;
186cdf0e10cSrcweir         aButtons.push_back( Button::GetStandardText( BUTTON_NO ) );
187cdf0e10cSrcweir         nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_NO;
188cdf0e10cSrcweir         if( nDefaultButton == SALSYSTEM_SHOWNATIVEMSGBOX_BTN_NO )
189cdf0e10cSrcweir             nDefButton = 1;
190cdf0e10cSrcweir     }
191cdf0e10cSrcweir     if( nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL ||
192cdf0e10cSrcweir         nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_YES_NO_CANCEL ||
193cdf0e10cSrcweir         nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_RETRY_CANCEL )
194cdf0e10cSrcweir     {
195cdf0e10cSrcweir         if( nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_RETRY_CANCEL )
196cdf0e10cSrcweir         {
197cdf0e10cSrcweir             aButtons.push_back( Button::GetStandardText( BUTTON_RETRY ) );
198cdf0e10cSrcweir             nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_RETRY;
199cdf0e10cSrcweir         }
200cdf0e10cSrcweir         aButtons.push_back( Button::GetStandardText( BUTTON_CANCEL ) );
201cdf0e10cSrcweir         nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL;
202cdf0e10cSrcweir         if( nDefaultButton == SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL )
203cdf0e10cSrcweir             nDefButton = aButtons.size()-1;
204cdf0e10cSrcweir     }
205cdf0e10cSrcweir     if( nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_ABORT_RETRY_IGNORE )
206cdf0e10cSrcweir     {
207cdf0e10cSrcweir         aButtons.push_back( Button::GetStandardText( BUTTON_ABORT ) );
208cdf0e10cSrcweir         nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_ABORT;
209cdf0e10cSrcweir         aButtons.push_back( Button::GetStandardText( BUTTON_RETRY ) );
210cdf0e10cSrcweir         nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_RETRY;
211cdf0e10cSrcweir         aButtons.push_back( Button::GetStandardText( BUTTON_IGNORE ) );
212cdf0e10cSrcweir         nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_IGNORE;
213cdf0e10cSrcweir         switch( nDefaultButton )
214cdf0e10cSrcweir         {
215cdf0e10cSrcweir             case SALSYSTEM_SHOWNATIVEMSGBOX_BTN_RETRY: nDefButton = 1;break;
216cdf0e10cSrcweir             case SALSYSTEM_SHOWNATIVEMSGBOX_BTN_IGNORE: nDefButton = 2;break;
217cdf0e10cSrcweir         }
218cdf0e10cSrcweir     }
219cdf0e10cSrcweir     int nResult = ShowNativeDialog( rTitle, rMessage, aButtons, nDefButton );
220cdf0e10cSrcweir 
221cdf0e10cSrcweir     return nResult != -1 ? nButtonIds[ nResult ] : 0;
222cdf0e10cSrcweir }
223