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