diff options
author | Michael Meeks <michael.meeks@novell.com> | 2011-07-28 14:18:26 +0100 |
---|---|---|
committer | Michael Meeks <michael.meeks@suse.com> | 2011-10-25 13:41:44 +0100 |
commit | 4a7e3482912c90b73d6e12c82bcd9ce31975e3f1 (patch) | |
tree | 2ffbfc6c706da67e58d186a97f01a24c3b9dbceb /vcl | |
parent | remove obsolete pieces, and erroneous conditional (diff) | |
download | core-4a7e3482912c90b73d6e12c82bcd9ce31975e3f1.tar.gz core-4a7e3482912c90b73d6e12c82bcd9ce31975e3f1.zip |
re-write gtksys to use the cleaner GdkScreen API avoiding X & Xinerama
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/Library_vclplug_gen.mk | 4 | ||||
-rw-r--r-- | vcl/inc/svdata.hxx | 2 | ||||
-rw-r--r-- | vcl/inc/unx/gtk/gtkdata.hxx | 18 | ||||
-rw-r--r-- | vcl/inc/unx/gtk/gtkframe.hxx | 3 | ||||
-rw-r--r-- | vcl/inc/unx/gtk/gtkgdi.hxx | 4 | ||||
-rw-r--r-- | vcl/inc/unx/gtk/gtkinst.hxx | 32 | ||||
-rw-r--r-- | vcl/inc/unx/gtk/gtksys.hxx | 63 | ||||
-rw-r--r-- | vcl/inc/unx/saldisp.hxx | 1 | ||||
-rw-r--r-- | vcl/inc/unx/salsys.h | 22 | ||||
-rw-r--r-- | vcl/inc/unx/x11/x11sys.hxx | 60 | ||||
-rw-r--r-- | vcl/source/window/dialog.cxx | 10 | ||||
-rw-r--r-- | vcl/unx/generic/app/saldisp.cxx | 21 | ||||
-rw-r--r-- | vcl/unx/generic/app/salsys.cxx | 129 | ||||
-rw-r--r-- | vcl/unx/gtk/app/gtkdata.cxx | 100 | ||||
-rw-r--r-- | vcl/unx/gtk/app/gtksys.cxx | 322 | ||||
-rw-r--r-- | vcl/unx/gtk/window/gtkframe.cxx | 403 | ||||
-rw-r--r-- | vcl/unx/x11/x11sys.cxx | 174 | ||||
-rw-r--r-- | vcl/win/source/app/salinfo.cxx | 6 | ||||
-rw-r--r-- | vcl/win/source/window/salframe.cxx | 9 |
19 files changed, 698 insertions, 685 deletions
diff --git a/vcl/Library_vclplug_gen.mk b/vcl/Library_vclplug_gen.mk index 4ba10d2ccbad..ffc70a87079f 100644 --- a/vcl/Library_vclplug_gen.mk +++ b/vcl/Library_vclplug_gen.mk @@ -113,8 +113,12 @@ $(eval $(call gb_Library_add_exception_objects,vclplug_gen,\ vcl/unx/generic/window/FWS \ vcl/unx/generic/window/salframe \ vcl/unx/generic/window/salobj \ + vcl/unx/x11/x11sys \ )) +# ultimately we want to split the x11 dependencies out +# into their own library I think. + $(eval $(call gb_Library_add_defs,vclplug_gen,\ -D_XSALSET_LIBNAME=\"$(call gb_Library_get_runtime_filename,spa)\" \ -DVCLPLUG_GEN_IMPLEMENTATION \ diff --git a/vcl/inc/svdata.hxx b/vcl/inc/svdata.hxx index 7b36b4f90a31..5918380b8a8e 100644 --- a/vcl/inc/svdata.hxx +++ b/vcl/inc/svdata.hxx @@ -181,7 +181,6 @@ struct ImplSVAppData ImeStatusWindowMode meShowImeStatusWindow; DECL_STATIC_LINK( ImplSVAppData, ImplQuitMsg, void* ); - }; @@ -394,6 +393,7 @@ long ImplCallEvent( NotifyEvent& rEvt ); extern VCL_PLUGIN_PUBLIC ImplSVData* pImplSVData; inline VCL_PLUGIN_PUBLIC ImplSVData* ImplGetSVData() { return pImplSVData; } inline ImplSVData* ImplGetAppSVData() { return ImplGetSVData(); } +VCL_PLUGIN_PUBLIC void ImplHideSplash(); bool ImplInitAccessBridge( sal_Bool bAllowCancel, sal_Bool &rCancelled ); diff --git a/vcl/inc/unx/gtk/gtkdata.hxx b/vcl/inc/unx/gtk/gtkdata.hxx index 01c5c1129942..b2c5127fa41b 100644 --- a/vcl/inc/unx/gtk/gtkdata.hxx +++ b/vcl/inc/unx/gtk/gtkdata.hxx @@ -37,6 +37,7 @@ #include <unx/saldisp.hxx> #include <unx/saldata.hxx> +#include <unx/gtk/gtksys.hxx> #include <vcl/ptrstyle.hxx> #include <osl/conditn.h> @@ -143,6 +144,7 @@ class GtkSalDisplay class GtkSalDisplay : public SalDisplay #endif { + GtkSalSystem* m_pSys; GdkDisplay* m_pGdkDisplay; GdkCursor *m_aCursors[ POINTER_COUNT ]; bool m_bStartupCompleted; @@ -159,9 +161,12 @@ public: virtual void deregisterFrame( SalFrame* pFrame ); GdkCursor *getCursor( PointerStyle ePointerStyle ); virtual int CaptureMouse( SalFrame* pFrame ); - virtual void initScreen( int nScreen ) const; - virtual int GetDefaultMonitorNumber() const; + bool IsXinerama() { return !m_pSys->IsMultiDisplay(); } + int GetDefaultScreenNumber() { return m_pSys->GetDefaultDisplayNumber(); } + int GetScreenCount() { return m_pSys->GetDisplayScreenCount(); } + Size GetScreenSize( int screen ); + virtual void initScreen( int nScreen ) const; GdkFilterReturn filterGdkEvent( GdkXEvent* sys_event, GdkEvent* event ); @@ -180,14 +185,9 @@ public: #if !GTK_CHECK_VERSION(3,0,0) virtual long Dispatch( XEvent *pEvent ); #else - bool IsXinerama() { return false; } - int GetDefaultScreenNumber() const { return 0; } - int GetScreenCount() const { return 1; } - std::vector<Rectangle> GetXineramaScreens() { return std::vector<Rectangle>(); } - Size GetScreenSize( int screen ); void SendInternalEvent( SalFrame* pFrame, void* pData, sal_uInt16 nEvent = SALEVENT_USEREVENT ); - void CancelInternalEvent( SalFrame* pFrame, void* pData, sal_uInt16 nEvent ); - bool DispatchInternalEvent(); + void CancelInternalEvent( SalFrame* pFrame, void* pData, sal_uInt16 nEvent ); + bool DispatchInternalEvent(); SalFrame *m_pCapture; sal_Bool MouseCaptured( const SalFrame *pFrameData ) const diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx index 60256600ab89..36a5c5dbfb6a 100644 --- a/vcl/inc/unx/gtk/gtkframe.hxx +++ b/vcl/inc/unx/gtk/gtkframe.hxx @@ -298,6 +298,7 @@ class GtkSalFrame : public SalFrame, basebmp::BitmapDeviceDamageTracker void AllocateFrame(); void updateWMClass(); + void SetScreen( unsigned int nNewScreen, int eType, Rectangle *pSize = NULL ); DECL_LINK( ImplDelayedFullScreenHdl, void* ); public: @@ -329,8 +330,6 @@ public: void popIgnoreDamage(); void renderArea( cairo_t *cr, cairo_rectangle_t *src ); - void moveToScreen( int nScreen ); - virtual ~GtkSalFrame(); // SalGraphics or NULL, but two Graphics for all SalFrames diff --git a/vcl/inc/unx/gtk/gtkgdi.hxx b/vcl/inc/unx/gtk/gtkgdi.hxx index 527f49bf24c2..e00808934006 100644 --- a/vcl/inc/unx/gtk/gtkgdi.hxx +++ b/vcl/inc/unx/gtk/gtkgdi.hxx @@ -45,7 +45,8 @@ #define GTK_GRAPHICS_DISABLED class GtkSalFrame; -class GtkSalGraphics : public SvpSalGraphics { +class GtkSalGraphics : public SvpSalGraphics +{ GtkSalFrame *mpFrame; public: GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow ); @@ -53,6 +54,7 @@ public: long nSrcX, long nSrcY, long nSrcWidth, long nSrcHeight, sal_uInt16 /*nFlags*/ ); + void updateSettings( AllSettings& rSettings ); }; #else diff --git a/vcl/inc/unx/gtk/gtkinst.hxx b/vcl/inc/unx/gtk/gtkinst.hxx index e33b91453eda..5e7eff7f7f74 100644 --- a/vcl/inc/unx/gtk/gtkinst.hxx +++ b/vcl/inc/unx/gtk/gtkinst.hxx @@ -115,38 +115,6 @@ public: virtual bool AnyInput( sal_uInt16 nType ); }; -#if GTK_CHECK_VERSION(3,0,0) -class GtkSalSystem : public SalSystem -{ -public: - GtkSalSystem() : SalSystem() {} -#else -class GtkSalSystem : public X11SalSystem -{ -public: - GtkSalSystem() : X11SalSystem() {} -#endif - virtual ~GtkSalSystem(); - -#if GTK_CHECK_VERSION(3,0,0) - virtual unsigned int GetDisplayScreenCount(); - virtual bool IsMultiDisplay(); - virtual unsigned int GetDefaultDisplayNumber(); - virtual Rectangle GetDisplayScreenPosSizePixel( unsigned int nScreen ); - virtual Rectangle GetDisplayWorkAreaPosSizePixel( unsigned int nScreen ); - virtual rtl::OUString GetScreenName( unsigned int nScreen ); - virtual int ShowNativeMessageBox( const String& rTitle, - const String& rMessage, - int nButtonCombination, - int nDefaultButton); -#endif - - virtual int ShowNativeDialog( const String& rTitle, - const String& rMessage, - const std::list< String >& rButtons, - int nDefButton ); -}; - #endif // _VCL_GTKINST_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/unx/gtk/gtksys.hxx b/vcl/inc/unx/gtk/gtksys.hxx new file mode 100644 index 000000000000..05e58f5d9f94 --- /dev/null +++ b/vcl/inc/unx/gtk/gtksys.hxx @@ -0,0 +1,63 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License or as specified alternatively below. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Initial Developer of the Original Code is + * Michael Meeks <michael.meeks@novell.com> + * Portions created by the Initial Developer are Copyright (C) 2010 the + * Initial Developer. All Rights Reserved. + * + * Major Contributor(s): + * + * For minor contributions see the git repository. + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ +#ifndef _VCL_GTKSYS_HXX_ +#define _VCL_GTKSYS_HXX_ + +#include "unx/salsys.h" +#include <gtk/gtk.h> + +class GtkSalSystem : public UnxSalSystem +{ + GdkDisplay *mpDisplay; +public: + GtkSalSystem(); + virtual ~GtkSalSystem(); + static GtkSalSystem *GetSingleton(); + + virtual bool IsMultiDisplay(); + virtual unsigned int GetDisplayScreenCount(); + virtual unsigned int GetDefaultDisplayNumber(); + virtual rtl::OUString GetScreenName (unsigned int nScreen); + virtual Rectangle GetDisplayScreenPosSizePixel (unsigned int nScreen); + virtual Rectangle GetDisplayWorkAreaPosSizePixel (unsigned int nScreen); + virtual int ShowNativeDialog (const String& rTitle, + const String& rMessage, + const std::list< String >& rButtons, + int nDefButton); + + // We have a 'screen' number that is combined from screen-idx + monitor-idx + static int getScreenIdxFromPtr (GdkDisplay *pDisplay, GdkScreen *pScreen); + static int getScreenMonitorIdx (GdkDisplay *pDisplay, GdkScreen *pScreen, int nX, int nY); + static GdkScreen *getScreenMonitorFromIdx (GdkDisplay *pDisplay, int nIdx, gint &nMonitor); +}; + +#endif // _VCL_GTKSYS_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/unx/saldisp.hxx b/vcl/inc/unx/saldisp.hxx index 78ba62994238..6aefeff44784 100644 --- a/vcl/inc/unx/saldisp.hxx +++ b/vcl/inc/unx/saldisp.hxx @@ -446,7 +446,6 @@ public: XLIB_Window GetDrawable( int nScreen ) const { return getDataForScreen( nScreen ).m_aRefWindow; } Display *GetDisplay() const { return pDisp_; } int GetDefaultScreenNumber() const { return m_nDefaultScreen; } - virtual int GetDefaultMonitorNumber() const { return 0; } const Size& GetScreenSize( int nScreen ) const { return getDataForScreen( nScreen ).m_aSize; } srv_vendor_t GetServerVendor() const { return meServerVendor; } void SetServerVendor() { meServerVendor = sal_GetServerVendor(pDisp_); } diff --git a/vcl/inc/unx/salsys.h b/vcl/inc/unx/salsys.h index e4ce898e9550..cd87738736e2 100644 --- a/vcl/inc/unx/salsys.h +++ b/vcl/inc/unx/salsys.h @@ -30,31 +30,19 @@ #ifndef _SV_SALSYS_H #define _SV_SALSYS_H -#include <vcl/sv.h> -#include <osl/mutex.hxx> -#include <osl/thread.hxx> #include <salsys.hxx> #include <vclpluginapi.h> - #include <list> -class VCLPLUG_GEN_PUBLIC X11SalSystem : public SalSystem +class VCLPLUG_GEN_PUBLIC UnxSalSystem : public SalSystem { -public: - X11SalSystem() {} - virtual ~X11SalSystem(); - - // overload pure virtual methods - virtual unsigned int GetDisplayScreenCount(); - virtual bool IsMultiDisplay(); - virtual unsigned int GetDefaultDisplayNumber(); - virtual Rectangle GetDisplayScreenPosSizePixel( unsigned int nScreen ); - virtual Rectangle GetDisplayWorkAreaPosSizePixel( unsigned int nScreen ); - virtual rtl::OUString GetScreenName( unsigned int nScreen ); + public: + UnxSalSystem(); + virtual ~UnxSalSystem(); virtual int ShowNativeDialog( const String& rTitle, const String& rMessage, const std::list< String >& rButtons, - int nDefButton ); + int nDefButton ) = 0; virtual int ShowNativeMessageBox( const String& rTitle, const String& rMessage, int nButtonCombination, diff --git a/vcl/inc/unx/x11/x11sys.hxx b/vcl/inc/unx/x11/x11sys.hxx new file mode 100644 index 000000000000..a4385347bfa2 --- /dev/null +++ b/vcl/inc/unx/x11/x11sys.hxx @@ -0,0 +1,60 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// -=-= includes -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#ifndef _SV_X11SYS_H +#define _SV_X11SYS_H + +#include <vcl/sv.h> +#include <osl/mutex.hxx> +#include <osl/thread.hxx> +#include <unx/salsys.h> +#include <vclpluginapi.h> + +class VCLPLUG_GEN_PUBLIC X11SalSystem : public UnxSalSystem +{ +public: + X11SalSystem() {} + virtual ~X11SalSystem(); + + // overload pure virtual methods + virtual unsigned int GetDisplayScreenCount(); + virtual bool IsMultiDisplay(); + virtual unsigned int GetDefaultDisplayNumber(); + virtual Rectangle GetDisplayScreenPosSizePixel( unsigned int nScreen ); + virtual Rectangle GetDisplayWorkAreaPosSizePixel( unsigned int nScreen ); + virtual rtl::OUString GetScreenName( unsigned int nScreen ); + virtual int ShowNativeDialog( const String& rTitle, + const String& rMessage, + const std::list< String >& rButtons, + int nDefButton ); +}; + +#endif // _SV_X11SYS_H + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx index f4e5622d1d8e..794fb7cea20e 100644 --- a/vcl/source/window/dialog.cxx +++ b/vcl/source/window/dialog.cxx @@ -114,6 +114,16 @@ static sal_Bool ImplIsMnemonicCtrl( Window* pWindow ) // ----------------------------------------------------------------------- +// Called by native error dialog popup implementations +void ImplHideSplash() +{ + ImplSVData* pSVData = ImplGetSVData(); + if( pSVData->mpIntroWindow ) + pSVData->mpIntroWindow->Hide(); +} + +// ----------------------------------------------------------------------- + void ImplWindowAutoMnemonic( Window* pWindow ) { MnemonicGenerator aMnemonicGenerator; diff --git a/vcl/unx/generic/app/saldisp.cxx b/vcl/unx/generic/app/saldisp.cxx index 9ef360114e44..b63cfb9cd3f6 100644 --- a/vcl/unx/generic/app/saldisp.cxx +++ b/vcl/unx/generic/app/saldisp.cxx @@ -576,12 +576,9 @@ void SalDisplay::doDestruct() pSalData->SetSalDisplay( NULL ); } -static int DisplayHasEvent( int -#ifdef DBG_UTIL -fd -#endif -, SalX11Display *pDisplay ) +static int DisplayHasEvent( int fd, SalX11Display *pDisplay ) { + (void)fd; DBG_ASSERT( ConnectionNumber( pDisplay->GetDisplay() ) == fd, "wrong fd in DisplayHasEvent" ); if( ! pDisplay->IsDisplay() ) @@ -594,12 +591,9 @@ fd GetSalData()->m_pInstance->GetYieldMutex()->release(); return result; } -static int DisplayQueue( int -#ifdef DBG_UTIL -fd -#endif -, SalX11Display *pDisplay ) +static int DisplayQueue( int fd, SalX11Display *pDisplay ) { + (void)fd; DBG_ASSERT( ConnectionNumber( pDisplay->GetDisplay() ) == fd, "wrong fd in DisplayHasEvent" ); int result; @@ -611,12 +605,9 @@ fd return result; } -static int DisplayYield( int -#ifdef DBG_UTIL -fd -#endif -, SalX11Display *pDisplay ) +static int DisplayYield( int fd, SalX11Display *pDisplay ) { + (void)fd; DBG_ASSERT( ConnectionNumber( pDisplay->GetDisplay() ) == fd, "wrong fd in DisplayHasEvent" ); diff --git a/vcl/unx/generic/app/salsys.cxx b/vcl/unx/generic/app/salsys.cxx index ab69cda23a47..9f68512a97bb 100644 --- a/vcl/unx/generic/app/salsys.cxx +++ b/vcl/unx/generic/app/salsys.cxx @@ -43,139 +43,23 @@ #include <rtl/ustrbuf.hxx> #include <osl/thread.h> - -SalSystem* X11SalInstance::CreateSalSystem() -{ - return new X11SalSystem(); -} - -// ----------------------------------------------------------------------- - -X11SalSystem::~X11SalSystem() -{ -} - -// for the moment only handle xinerama case -unsigned int X11SalSystem::GetDisplayScreenCount() -{ - SalDisplay* pSalDisp = GetX11SalData()->GetDisplay(); - return pSalDisp->IsXinerama() ? pSalDisp->GetXineramaScreens().size() : pSalDisp->GetScreenCount(); -} - -bool X11SalSystem::IsMultiDisplay() -{ - SalDisplay* pSalDisp = GetX11SalData()->GetDisplay(); - unsigned int nScreenCount = pSalDisp->GetScreenCount(); - return pSalDisp->IsXinerama() ? false : (nScreenCount > 1); -} - -unsigned int X11SalSystem::GetDefaultDisplayNumber() -{ - SalDisplay* pSalDisp = GetX11SalData()->GetDisplay(); - return pSalDisp->IsXinerama() ? pSalDisp->GetDefaultMonitorNumber() : pSalDisp->GetDefaultScreenNumber(); -} - -Rectangle X11SalSystem::GetDisplayScreenPosSizePixel( unsigned int nScreen ) -{ - Rectangle aRet; - SalDisplay* pSalDisp = GetX11SalData()->GetDisplay(); - if( pSalDisp->IsXinerama() ) - { - const std::vector< Rectangle >& rScreens = pSalDisp->GetXineramaScreens(); - if( nScreen < rScreens.size() ) - aRet = rScreens[nScreen]; - } - else - { - const SalDisplay::ScreenData& rScreen = pSalDisp->getDataForScreen( nScreen ); - aRet = Rectangle( Point( 0, 0 ), rScreen.m_aSize ); - } - - return aRet; -} - -Rectangle X11SalSystem::GetDisplayWorkAreaPosSizePixel( unsigned int nScreen ) +UnxSalSystem::UnxSalSystem() { - // FIXME: workareas - return GetDisplayScreenPosSizePixel( nScreen ); } -rtl::OUString X11SalSystem::GetScreenName( unsigned int nScreen ) +UnxSalSystem::~UnxSalSystem() { - rtl::OUString aScreenName; - SalDisplay* pSalDisp = GetX11SalData()->GetDisplay(); - if( pSalDisp->IsXinerama() ) - { - const std::vector< Rectangle >& rScreens = pSalDisp->GetXineramaScreens(); - if( nScreen >= rScreens.size() ) - nScreen = 0; - rtl::OUStringBuffer aBuf( 256 ); - aBuf.append( rtl::OStringToOUString( rtl::OString( DisplayString( pSalDisp->GetDisplay() ) ), osl_getThreadTextEncoding() ) ); - aBuf.appendAscii( " [" ); - aBuf.append( static_cast<sal_Int32>(nScreen) ); - aBuf.append( sal_Unicode(']') ); - aScreenName = aBuf.makeStringAndClear(); - } - else - { - if( nScreen >= static_cast<unsigned int>(pSalDisp->GetScreenCount()) ) - nScreen = 0; - rtl::OUStringBuffer aBuf( 256 ); - aBuf.append( rtl::OStringToOUString( rtl::OString( DisplayString( pSalDisp->GetDisplay() ) ), osl_getThreadTextEncoding() ) ); - // search backwards for ':' - int nPos = aBuf.getLength(); - if( nPos > 0 ) - nPos--; - while( nPos > 0 && aBuf.charAt( nPos ) != ':' ) - nPos--; - // search forward to '.' - while( nPos < aBuf.getLength() && aBuf.charAt( nPos ) != '.' ) - nPos++; - if( nPos < aBuf.getLength() ) - aBuf.setLength( nPos+1 ); - else - aBuf.append( sal_Unicode('.') ); - aBuf.append( static_cast<sal_Int32>(nScreen) ); - aScreenName = aBuf.makeStringAndClear(); - } - return aScreenName; } -int X11SalSystem::ShowNativeDialog( const String& rTitle, const String& rMessage, const std::list< String >& rButtons, int nDefButton ) -{ - int nRet = -1; - - ImplSVData* pSVData = ImplGetSVData(); - if( pSVData->mpIntroWindow ) - pSVData->mpIntroWindow->Hide(); - - WarningBox aWarn( NULL, WB_STDWORK, rMessage ); - aWarn.SetText( rTitle ); - aWarn.Clear(); - - sal_uInt16 nButton = 0; - for( std::list< String >::const_iterator it = rButtons.begin(); it != rButtons.end(); ++it ) - { - aWarn.AddButton( *it, nButton+1, nButton == (sal_uInt16)nDefButton ? BUTTONDIALOG_DEFBUTTON : 0 ); - nButton++; - } - aWarn.SetFocusButton( (sal_uInt16)nDefButton+1 ); - - nRet = ((int)aWarn.Execute()) - 1; - - // normalize behaviour, actually this should never happen - if( nRet < -1 || nRet >= int(rButtons.size()) ) - nRet = -1; - - return nRet; -} - -int X11SalSystem::ShowNativeMessageBox(const String& rTitle, const String& rMessage, int nButtonCombination, int nDefaultButton) +int UnxSalSystem::ShowNativeMessageBox(const String& rTitle, const String& rMessage, + int nButtonCombination, int nDefaultButton) { int nDefButton = 0; std::list< String > aButtons; int nButtonIds[5], nBut = 0; + ImplHideSplash(); + if( nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK || nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL ) { @@ -220,6 +104,7 @@ int X11SalSystem::ShowNativeMessageBox(const String& rTitle, const String& rMess case SALSYSTEM_SHOWNATIVEMSGBOX_BTN_IGNORE: nDefButton = 2;break; } } + int nResult = ShowNativeDialog( rTitle, rMessage, aButtons, nDefButton ); return nResult != -1 ? nButtonIds[ nResult ] : 0; diff --git a/vcl/unx/gtk/app/gtkdata.cxx b/vcl/unx/gtk/app/gtkdata.cxx index 9c3e11f6ffa6..4467d0784afa 100644 --- a/vcl/unx/gtk/app/gtkdata.cxx +++ b/vcl/unx/gtk/app/gtkdata.cxx @@ -84,6 +84,7 @@ GtkSalDisplay::GtkSalDisplay( GdkDisplay* pDisplay ) : #if !GTK_CHECK_VERSION(3,0,0) SalDisplay( gdk_x11_display_get_xdisplay( pDisplay ) ), #endif + m_pSys( GtkSalSystem::GetSingleton() ), m_pGdkDisplay( pDisplay ), m_bStartupCompleted( false ) { @@ -243,57 +244,20 @@ GdkFilterReturn GtkSalDisplay::filterGdkEvent( GdkXEvent* sys_event, void GtkSalDisplay::screenSizeChanged( GdkScreen* pScreen ) { #if !GTK_CHECK_VERSION(3,0,0) - if( pScreen ) - { - int nScreen = gdk_screen_get_number( pScreen ); - if( nScreen < static_cast<int>(m_aScreens.size()) ) - { - ScreenData& rSD = const_cast<ScreenData&>(m_aScreens[nScreen]); - if( rSD.m_bInit ) - { - rSD.m_aSize = Size( gdk_screen_get_width( pScreen ), - gdk_screen_get_height( pScreen ) ); - if( ! m_aFrames.empty() ) - m_aFrames.front()->CallCallback( SALEVENT_DISPLAYCHANGED, 0 ); - } - } - else - { - OSL_FAIL( "unknown screen changed size" ); - } - } + if (pScreen) + m_aFrames.front()->CallCallback( SALEVENT_DISPLAYCHANGED, 0 ); +#else +#warning get this right #endif } void GtkSalDisplay::monitorsChanged( GdkScreen* pScreen ) { #if !GTK_CHECK_VERSION(3,0,0) - if( pScreen ) - { - if( gdk_display_get_n_screens(m_pGdkDisplay) == 1 ) - { - int nScreen = gdk_screen_get_number( pScreen ); - if( nScreen == m_nDefaultScreen ) //To-Do, make m_aXineramaScreens a per-screen thing ? - { - gint nMonitors = gdk_screen_get_n_monitors(pScreen); - m_aXineramaScreens = std::vector<Rectangle>(); - m_aXineramaScreenIndexMap = std::vector<int>(nMonitors); - for (gint i = 0; i < nMonitors; ++i) - { - GdkRectangle dest; - gdk_screen_get_monitor_geometry(pScreen, i, &dest); - addXineramaScreenUnique( i, dest.x, dest.y, dest.width, dest.height ); - } - m_bXinerama = m_aXineramaScreens.size() > 1; - if( ! m_aFrames.empty() ) - m_aFrames.front()->CallCallback( SALEVENT_DISPLAYCHANGED, 0 ); - } - else - { - OSL_FAIL( "monitors for non-default screen changed, extend-me" ); - } - } - } + if (pScreen) + m_aFrames.front()->CallCallback( SALEVENT_DISPLAYCHANGED, 0 ); +#else +#warning get this right #endif } @@ -302,42 +266,6 @@ extern "C" typedef gint(* screen_get_primary_monitor)(GdkScreen *screen); } -int GtkSalDisplay::GetDefaultMonitorNumber() const -{ - int n = 0; -#if !GTK_CHECK_VERSION(3,0,0) - GdkScreen* pScreen = gdk_display_get_screen( m_pGdkDisplay, m_nDefaultScreen ); -#if GTK_CHECK_VERSION(2,20,0) - n = gdk_screen_get_primary_monitor(pScreen); -#else - static screen_get_primary_monitor sym_gdk_screen_get_primary_monitor = - (screen_get_primary_monitor)osl_getAsciiFunctionSymbol( GetSalData()->m_pPlugin, "gdk_screen_get_primary_monitor" ); - if (sym_gdk_screen_get_primary_monitor) - n = sym_gdk_screen_get_primary_monitor( pScreen ); - else - { -#if GTK_CHECK_VERSION(2,14,0) - //gdk_screen_get_primary_monitor unavailable, take the first laptop monitor - //as the default - gint nMonitors = gdk_screen_get_n_monitors(pScreen); - for (gint i = 0; i < nMonitors; ++i) - { - if (g_ascii_strncasecmp (gdk_screen_get_monitor_plug_name(pScreen, i), "LVDS", 4) == 0) - { - n = i; - break; - } - } -#endif - } -#endif - - if( n >= 0 && size_t(n) < m_aXineramaScreenIndexMap.size() ) - n = m_aXineramaScreenIndexMap[n]; -#endif - return n; -} - void GtkSalDisplay::initScreen( int nScreen ) const { #if GTK_CHECK_VERSION(3,0,0) @@ -1012,16 +940,6 @@ void GtkSalDisplay::CancelInternalEvent( SalFrame* pFrame, void* pData, sal_uInt } } -Size GtkSalDisplay::GetScreenSize( int nScreen ) -{ - GdkScreen *pScreen = gdk_display_get_screen (m_pGdkDisplay, nScreen); - if (!pScreen) - return Size(); - else - return Size( gdk_screen_get_width (pScreen), - gdk_screen_get_height (pScreen) ); -} - #endif // hEventGuard_ held during this invocation diff --git a/vcl/unx/gtk/app/gtksys.cxx b/vcl/unx/gtk/app/gtksys.cxx index d1c538987ddb..ae64f0e7c187 100644 --- a/vcl/unx/gtk/app/gtksys.cxx +++ b/vcl/unx/gtk/app/gtksys.cxx @@ -1,153 +1,190 @@ /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License or as specified alternatively below. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ * - * Copyright 2000, 2010 Oracle and/or its affiliates. + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. * - * OpenOffice.org - a multi-platform office productivity suite + * The Initial Developer of the Original Code is + * Michael Meeks <michael.meeks@novell.com> + * Portions created by the Initial Developer are Copyright (C) 2010 the + * Initial Developer. All Rights Reserved. * - * This file is part of OpenOffice.org. + * Major Contributor(s): * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. + * For minor contributions see the git repository. * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_vcl.hxx" - -#ifdef AIX -#define _LINUX_SOURCE_COMPAT -#include <sys/timer.h> -#undef _LINUX_SOURCE_COMPAT -#endif - -#include <unx/svunx.h> -#include <svdata.hxx> - -#include <vcl/window.hxx> -#include <unx/gtk/gtkinst.hxx> -#include <cstdio> -#include <gdk/gdk.h> + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ +#include <string.h> #include <gtk/gtk.h> -#include <X11/Xlib.h> +#include <unx/gtk/gtkinst.hxx> +#include <unx/gtk/gtksys.hxx> + +GtkSalSystem *GtkSalSystem::GetSingleton() +{ + static GtkSalSystem *pSingleton = NULL; + if (!pSingleton) + pSingleton = new GtkSalSystem(); + return pSingleton; +} SalSystem *GtkInstance::CreateSalSystem() { - return new GtkSalSystem(); + return GtkSalSystem::GetSingleton(); } -GtkSalSystem::~GtkSalSystem() +GtkSalSystem::GtkSalSystem() : UnxSalSystem() { + mpDisplay = gdk_display_get_default(); } -#if GTK_CHECK_VERSION(3,0,0) -unsigned int GtkSalSystem::GetDisplayScreenCount() +GtkSalSystem::~GtkSalSystem() { - return 1; } -bool GtkSalSystem::IsMultiDisplay() +GdkScreen * +GtkSalSystem::getScreenMonitorFromIdx (GdkDisplay *pDisplay, int nIdx, gint &nMonitor) { - return false; + GdkScreen *pScreen = NULL; + for (gint i = 0; i < gdk_display_get_n_screens (pDisplay); i++) + { + pScreen = gdk_display_get_screen (pDisplay, i++); + if (!pScreen) + break; + if (nIdx > gdk_screen_get_n_monitors (pScreen)) + nIdx -= gdk_screen_get_n_monitors (pScreen); + else + break; + } + nMonitor = nIdx; + return pScreen; } -unsigned int GtkSalSystem::GetDefaultDisplayNumber() +int +GtkSalSystem::getScreenIdxFromPtr (GdkDisplay *pDisplay, GdkScreen *pScreen) { + int nIdx = 0; + for (gint i = 0; i < gdk_display_get_n_screens (pDisplay); i++) + { + GdkScreen *pCmp = gdk_display_get_screen (pDisplay, i); + if (pCmp == pScreen) + return nIdx; + nIdx += gdk_screen_get_n_monitors (pCmp); + } + g_warning ("failed to find screen %p", pScreen); return 0; } -Rectangle GtkSalSystem::GetDisplayScreenPosSizePixel( unsigned int nScreen ) +int GtkSalSystem::getScreenMonitorIdx (GdkDisplay *pDisplay, + GdkScreen *pScreen, + int nX, int nY) { - g_warning ("FIXME: GetDisplayScreenPosSizePixel unimplemented"); - return Rectangle (0, 0, 1024, 768); + return getScreenIdxFromPtr (pDisplay, pScreen) + + gdk_screen_get_monitor_at_point (pScreen, nX, nY); } -Rectangle GtkSalSystem::GetDisplayWorkAreaPosSizePixel( unsigned int nScreen ) +unsigned int GtkSalSystem::GetDisplayScreenCount() { - return GetDisplayScreenPosSizePixel( nScreen ); + gint nMonitor; + (void)getScreenMonitorFromIdx (mpDisplay, G_MAXINT, nMonitor); + return G_MAXINT - nMonitor; } -rtl::OUString GtkSalSystem::GetScreenName( unsigned int nScreen ) +bool GtkSalSystem::IsMultiDisplay() { - return rtl::OUString::createFromAscii( "Jim" ); + return gdk_display_get_n_screens (mpDisplay) > 1; } -// FIXME: shocking cut/paste from X11SalSystem ... [!] - push me lower ... -#include <vcl/msgbox.hxx> -#include <vcl/button.hxx> - -int GtkSalSystem::ShowNativeMessageBox( const String& rTitle, - const String& rMessage, - int nButtonCombination, - int nDefaultButton) +namespace { +int _fallback_get_primary_monitor (GdkScreen *pScreen) { - int nDefButton = 0; - std::list< String > aButtons; - int nButtonIds[5], nBut = 0; - - if( nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK || - nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL ) - { - aButtons.push_back( Button::GetStandardText( BUTTON_OK ) ); - nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_OK; - } - if( nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_YES_NO_CANCEL || - nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_YES_NO ) - { - aButtons.push_back( Button::GetStandardText( BUTTON_YES ) ); - nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_YES; - aButtons.push_back( Button::GetStandardText( BUTTON_NO ) ); - nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_NO; - if( nDefaultButton == SALSYSTEM_SHOWNATIVEMSGBOX_BTN_NO ) - nDefButton = 1; - } - if( nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL || - nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_YES_NO_CANCEL || - nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_RETRY_CANCEL ) + // Use monitor name as primacy heuristic + int ret = -1; + int max = gdk_screen_get_n_monitors (pScreen); + for (int i = 0; i < max && ret < 0; i++) { - if( nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_RETRY_CANCEL ) - { - aButtons.push_back( Button::GetStandardText( BUTTON_RETRY ) ); - nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_RETRY; - } - aButtons.push_back( Button::GetStandardText( BUTTON_CANCEL ) ); - nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL; - if( nDefaultButton == SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL ) - nDefButton = aButtons.size()-1; + char *name = gdk_screen_get_monitor_plug_name (pScreen, i); + if (!g_ascii_strncasecmp (name, "LVDS", 4)) + ret = i; + g_free (name); } - if( nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_ABORT_RETRY_IGNORE ) + return 0; +} + +int _get_primary_monitor (GdkScreen *pScreen) +{ + static int (*get_fn) (GdkScreen *) = NULL; +#if GTK_CHECK_VERSION(3,0,0) + get_fn = gdk_screen_get_primary_monitor; +#endif + // Perhaps we have a newer gtk+ with this symbol: + if (!get_fn) { - aButtons.push_back( Button::GetStandardText( BUTTON_ABORT ) ); - nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_ABORT; - aButtons.push_back( Button::GetStandardText( BUTTON_RETRY ) ); - nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_RETRY; - aButtons.push_back( Button::GetStandardText( BUTTON_IGNORE ) ); - nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_IGNORE; - switch( nDefaultButton ) - { - case SALSYSTEM_SHOWNATIVEMSGBOX_BTN_RETRY: nDefButton = 1;break; - case SALSYSTEM_SHOWNATIVEMSGBOX_BTN_IGNORE: nDefButton = 2;break; - } + GModule *module = g_module_open (NULL, (GModuleFlags) 0); + if (!g_module_symbol (module, "gdk_screen_get_primary_monitor", + (gpointer *)&get_fn)) + get_fn = NULL; + g_module_close (module); } - int nResult = ShowNativeDialog( rTitle, rMessage, aButtons, nDefButton ); + if (!get_fn) + get_fn = _fallback_get_primary_monitor; - return nResult != -1 ? nButtonIds[ nResult ] : 0; + return get_fn (pScreen); +} +} // end anonymous namespace + +unsigned int GtkSalSystem::GetDefaultDisplayNumber() +{ + GdkScreen *pDefault = gdk_display_get_default_screen (mpDisplay); + int idx = getScreenIdxFromPtr (mpDisplay, pDefault); + return idx + _get_primary_monitor (pDefault); +} + +Rectangle GtkSalSystem::GetDisplayScreenPosSizePixel (unsigned int nScreen) +{ + gint nMonitor; + GdkScreen *pScreen; + GdkRectangle aRect; + pScreen = getScreenMonitorFromIdx (mpDisplay, nScreen, nMonitor); + if (!pScreen) + return Rectangle(); + gdk_screen_get_monitor_geometry (pScreen, nMonitor, &aRect); + return Rectangle (aRect.x, aRect.y, aRect.width, aRect.height); +} + +Rectangle GtkSalSystem::GetDisplayWorkAreaPosSizePixel (unsigned int nScreen) +{ + // FIXME: in theory we need extra code here to collect + // the work area, ignoring fixed panels etc. on the screen. + // surely gtk+ should have API to get this for us (?) + return GetDisplayScreenPosSizePixel( nScreen ); +} + +rtl::OUString GtkSalSystem::GetScreenName(unsigned int nScreen) +{ + gchar *pStr; + gint nMonitor; + GdkScreen *pScreen; + pScreen = getScreenMonitorFromIdx (mpDisplay, nScreen, nMonitor); + if (!pScreen) + return rtl::OUString(); + pStr = gdk_screen_get_monitor_plug_name (pScreen, nMonitor); + rtl::OUString aRet (pStr, strlen (pStr), RTL_TEXTENCODING_UTF8); + g_free (pStr); + return aRet; } -#endif // convert ~ to indicate mnemonic to '_' static rtl::OString MapToGtkAccelerator(const String &rStr) @@ -157,59 +194,32 @@ static rtl::OString MapToGtkAccelerator(const String &rStr) return rtl::OUStringToOString(aRet, RTL_TEXTENCODING_UTF8); } -int GtkSalSystem::ShowNativeDialog( const String& rTitle, - const String& rMessage, - const std::list< String >& rButtons, - int nDefButton ) +int GtkSalSystem::ShowNativeDialog (const String& rTitle, const String& rMessage, + const std::list< String >& rButtonNames, + int nDefaultButton) { - - ImplSVData* pSVData = ImplGetSVData(); - if( pSVData->mpIntroWindow ) - pSVData->mpIntroWindow->Hide(); - -#if OSL_DEBUG_LEVEL > 1 - std::fprintf( stderr, "GtkSalSystem::ShowNativeDialog\n"); -#endif - - rtl::OString aTitle(rtl::OUStringToOString(rTitle, - RTL_TEXTENCODING_UTF8)); - rtl::OString aMessage(rtl::OUStringToOString(rMessage, - RTL_TEXTENCODING_UTF8)); - - /* Create the dialogue */ - GtkWidget* mainwin = gtk_message_dialog_new - ( NULL, (GtkDialogFlags)0, GTK_MESSAGE_WARNING, - GTK_BUTTONS_NONE, aMessage.getStr(), NULL ); - gtk_window_set_title( GTK_WINDOW( mainwin ), aTitle.getStr() ); - - gint nButtons = 0, nResponse; - + rtl::OString aTitle (rtl::OUStringToOString (rTitle, RTL_TEXTENCODING_UTF8)); + rtl::OString aMessage (rtl::OUStringToOString (rMessage, RTL_TEXTENCODING_UTF8)); + + GtkDialog *pDialog = GTK_DIALOG ( + g_object_new (GTK_TYPE_MESSAGE_DIALOG, + "title", aTitle.getStr(), + "message-type", (int)GTK_MESSAGE_WARNING, + "text", aMessage.getStr(), + NULL)); int nButton = 0; - for( std::list< String >::const_iterator it = rButtons.begin(); it != rButtons.end(); ++it ) - { - if( nButton == nDefButton ) - { - gtk_dialog_add_button(GTK_DIALOG( mainwin ), - MapToGtkAccelerator(*it).getStr(), nButtons); - gtk_dialog_set_default_response(GTK_DIALOG(mainwin), nButtons); - } - else - { - rtl::OString aLabel(rtl::OUStringToOString(*it, - RTL_TEXTENCODING_UTF8)); - gtk_dialog_add_button(GTK_DIALOG(mainwin), aLabel.getStr(), - nButtons); - } - nButtons++; - } + std::list< String >::const_iterator it; + for (it = rButtonNames.begin(); it != rButtonNames.end(); ++it) + gtk_dialog_add_button (pDialog, MapToGtkAccelerator(*it).getStr(), nButton++); + gtk_dialog_set_default_response (pDialog, nDefaultButton); - nResponse = gtk_dialog_run( GTK_DIALOG(mainwin) ); - if( nResponse == GTK_RESPONSE_NONE || nResponse == GTK_RESPONSE_DELETE_EVENT ) - nResponse = -1; + nButton = gtk_dialog_run (pDialog); + if (nButton < 0) + nButton = -1; - gtk_widget_destroy( GTK_WIDGET(mainwin) ); + gtk_widget_destroy (GTK_WIDGET (pDialog)); - return nResponse; + return nButton; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/gtk/window/gtkframe.cxx b/vcl/unx/gtk/window/gtkframe.cxx index 8bbfa3e54e30..614af44ecdc1 100644 --- a/vcl/unx/gtk/window/gtkframe.cxx +++ b/vcl/unx/gtk/window/gtkframe.cxx @@ -38,6 +38,7 @@ #include <unx/sm.hxx> #include <unx/salbmp.h> #include <unx/salprn.h> +#include <unx/headless/svpgdi.hxx> #include <vcl/floatwin.hxx> #include <vcl/svapp.hxx> #include <vcl/window.hxx> @@ -567,24 +568,11 @@ ooo_fixed_get_type() void GtkSalFrame::updateScreenNumber() { -#if !GTK_CHECK_VERSION(3,0,0) - if( getDisplay()->IsXinerama() && getDisplay()->GetXineramaScreens().size() > 1 ) - { - Point aPoint( maGeometry.nX, maGeometry.nY ); - const std::vector<Rectangle>& rScreenRects( getDisplay()->GetXineramaScreens() ); - size_t nScreens = rScreenRects.size(); - for( size_t i = 0; i < nScreens; i++ ) - { - if( rScreenRects[i].IsInside( aPoint ) ) - { - maGeometry.nScreenNumber = static_cast<unsigned int>(i); - break; - } - } - } - else - maGeometry.nScreenNumber = static_cast<unsigned int>(m_nScreen); -#endif + int nScreen = 0; + GdkScreen *pScreen = gtk_widget_get_screen( m_pWindow ); + if( pScreen ) + nScreen = GtkSalSystem::getScreenMonitorIdx( getGdkDisplay(), pScreen, maGeometry.nX, maGeometry.nY ); + maGeometry.nScreenNumber = nScreen; } void GtkSalFrame::InitCommon() @@ -1277,39 +1265,24 @@ void GtkSalFrame::Center() { nX = ((long)m_pParent->maGeometry.nWidth - (long)maGeometry.nWidth)/2; nY = ((long)m_pParent->maGeometry.nHeight - (long)maGeometry.nHeight)/2; - } else { - long nScreenWidth, nScreenHeight; - long nScreenX = 0, nScreenY = 0; + GdkScreen *pScreen = NULL; + gint px, py; + GdkModifierType nMask; + gdk_display_get_pointer( getGdkDisplay(), &pScreen, &px, &py, &nMask ); + if( !pScreen ) + pScreen = gtk_widget_get_screen( m_pWindow ); - Size aScreenSize = GetGtkSalData()->GetDisplay()->GetScreenSize( m_nScreen ); - nScreenWidth = aScreenSize.Width(); - nScreenHeight = aScreenSize.Height(); - if( GetGtkSalData()->GetDisplay()->IsXinerama() ) - { - // get xinerama screen we are on - // if there is a parent, use its center for screen determination - // else use the pointer - GdkScreen* pScreen; - gint x, y; - GdkModifierType aMask; - gdk_display_get_pointer( getGdkDisplay(), &pScreen, &x, &y, &aMask ); + gint nMonitor; + nMonitor = gdk_screen_get_monitor_at_point( pScreen, px, py ); - const std::vector< Rectangle >& rScreens = GetGtkSalData()->GetDisplay()->GetXineramaScreens(); - for( unsigned int i = 0; i < rScreens.size(); i++ ) - if( rScreens[i].IsInside( Point( x, y ) ) ) - { - nScreenX = rScreens[i].Left(); - nScreenY = rScreens[i].Top(); - nScreenWidth = rScreens[i].GetWidth(); - nScreenHeight = rScreens[i].GetHeight(); - break; - } - } - nX = nScreenX + (nScreenWidth - (long)maGeometry.nWidth)/2; - nY = nScreenY + (nScreenHeight - (long)maGeometry.nHeight)/2; + GdkRectangle aMonitor; + gdk_screen_get_monitor_geometry( pScreen, nMonitor, &aMonitor ); + + nX = aMonitor.x + (aMonitor.width - (long)maGeometry.nWidth)/2; + nY = aMonitor.y + (aMonitor.height - (long)maGeometry.nHeight)/2; } SetPosSize( nX, nY, 0, 0, SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y ); } @@ -1562,9 +1535,9 @@ void GtkSalFrame::SetMinClientSize( long nWidth, long nHeight ) } } -#if GTK_CHECK_VERSION(3,0,0) void GtkSalFrame::AllocateFrame() { +#if GTK_CHECK_VERSION(3,0,0) basegfx::B2IVector aFrameSize( maGeometry.nWidth, maGeometry.nHeight ); if( ! m_aFrame.get() || m_aFrame->getSize() != aFrameSize ) { @@ -1576,7 +1549,7 @@ void GtkSalFrame::AllocateFrame() basebmp::Format::TWENTYFOUR_BIT_TC_MASK, this ); // basebmp::Format::THIRTYTWO_BIT_TC_MASK_ARGB ); - fprintf( stderr, "allocate m_aFrame size of %dx%d \n", + fprintf( stderr, "allocated m_aFrame size of %dx%d \n", (int)maGeometry.nWidth, (int)maGeometry.nHeight ); #if OSL_DEBUG_LEVEL > 0 // set background to orange @@ -1584,15 +1557,15 @@ void GtkSalFrame::AllocateFrame() #endif // update device in existing graphics - for( unsigned int i = 0; i < SAL_N_ELEMENTS(m_aGraphics); ++i ) + for( unsigned int i = 0; i < SAL_N_ELEMENTS( m_aGraphics ); ++i ) { if( !m_aGraphics[i].pGraphics ) continue; m_aGraphics[i].pGraphics->setDevice( m_aFrame ); } } -} #endif +} void GtkSalFrame::SetPosSize( long nX, long nY, long nWidth, long nHeight, sal_uInt16 nFlags ) { @@ -1677,10 +1650,8 @@ void GtkSalFrame::SetPosSize( long nX, long nY, long nWidth, long nHeight, sal_u m_bDefaultPos = false; -#if GTK_CHECK_VERSION(3,0,0) - if( bSized) + if( bSized ) AllocateFrame(); -#endif if( bSized && ! bMoved ) CallCallback( SALEVENT_RESIZE, NULL ); @@ -1741,10 +1712,12 @@ void GtkSalFrame::SetWindowState( const SalFrameState* pState ) maGeometry.nWidth = pState->mnMaximizedWidth; maGeometry.nHeight = pState->mnMaximizedHeight; updateScreenNumber(); + AllocateFrame(); m_nState = GdkWindowState( m_nState | GDK_WINDOW_STATE_MAXIMIZED ); m_aRestorePosSize = Rectangle( Point( pState->mnX, pState->mnY ), Size( pState->mnWidth, pState->mnHeight ) ); + CallCallback( SALEVENT_RESIZE, NULL ); } else if( pState->mnMask & (SAL_FRAMESTATE_MASK_X | SAL_FRAMESTATE_MASK_Y | SAL_FRAMESTATE_MASK_WIDTH | SAL_FRAMESTATE_MASK_HEIGHT ) ) @@ -1813,7 +1786,6 @@ sal_Bool GtkSalFrame::GetWindowState( SalFrameState* pState ) } else { - pState->mnX = maGeometry.nX; pState->mnY = maGeometry.nY; pState->mnWidth = maGeometry.nWidth; @@ -1827,89 +1799,109 @@ sal_Bool GtkSalFrame::GetWindowState( SalFrameState* pState ) return sal_True; } -void GtkSalFrame::moveToScreen( int nScreen ) +typedef enum { + SET_RETAIN_SIZE, + SET_FULLSCREEN, + SET_UN_FULLSCREEN +} SetType; + +void GtkSalFrame::SetScreen( unsigned int nNewScreen, int eType, Rectangle *pSize ) { -#if !GTK_CHECK_VERSION(3,0,0) - if( isChild() ) + if( !m_pWindow ) return; - if( nScreen < 0 || nScreen >= gdk_display_get_n_screens( getGdkDisplay() ) ) - nScreen = m_nScreen; - if( nScreen == m_nScreen ) - return; + gint nMonitor; + GdkScreen *pScreen = NULL; + pScreen = GtkSalSystem::getScreenMonitorFromIdx( getGdkDisplay(), nNewScreen, nMonitor ); - GdkScreen* pScreen = gdk_display_get_screen( getGdkDisplay(), nScreen ); - if( pScreen ) + // Heavy lifting, need to move screen ... + if( pScreen != gtk_widget_get_screen( m_pWindow )) + gtk_window_set_screen( GTK_WINDOW( m_pWindow ), pScreen ); + + gint nOldMonitor = gdk_screen_get_monitor_at_window( + pScreen, widget_get_window( m_pWindow ) ); + if( nMonitor == nOldMonitor ) + g_warning( "FIXME: do we get a lot of pointless SetScreens ?" ); + + GdkRectangle aOldMonitor, aNewMonitor; + gdk_screen_get_monitor_geometry( pScreen, nOldMonitor, &aOldMonitor ); + gdk_screen_get_monitor_geometry( pScreen, nMonitor, &aNewMonitor ); + + bool bResize = false; + bool bVisible = IS_WIDGET_MAPPED( m_pWindow ); + if( bVisible ) + Show( sal_False ); + + maGeometry.nX = aNewMonitor.x + maGeometry.nX - aOldMonitor.x; + maGeometry.nY = aNewMonitor.y + maGeometry.nY - aOldMonitor.y; + + if( eType == SET_FULLSCREEN ) + { + maGeometry.nX = aNewMonitor.x; + maGeometry.nY = aNewMonitor.x; + maGeometry.nWidth = aNewMonitor.width; + maGeometry.nHeight = aNewMonitor.height; + m_nStyle |= SAL_FRAME_STYLE_PARTIAL_FULLSCREEN; + bResize = true; + + // #i110881# for the benefit of compiz set a max size here + // else setting to fullscreen fails for unknown reasons + m_aMaxSize.Width() = aNewMonitor.width+100; + m_aMaxSize.Height() = aNewMonitor.height+100; + } + + if( pSize && eType == SET_UN_FULLSCREEN ) { - m_nScreen = nScreen; - gtk_window_set_screen( GTK_WINDOW(m_pWindow), pScreen ); - // realize the window, we need an XWindow id - gtk_widget_realize( m_pWindow ); - // update system data - GtkSalDisplay* pDisp = getDisplay(); - m_aSystemData.aWindow = GDK_WINDOW_XWINDOW(widget_get_window(m_pWindow)); + maGeometry.nX = pSize->Left(); + maGeometry.nY = pSize->Top(); + maGeometry.nWidth = pSize->GetWidth(); + maGeometry.nHeight = pSize->GetHeight(); + m_nStyle &= ~SAL_FRAME_STYLE_PARTIAL_FULLSCREEN; + bResize = true; + } + + if (bResize) + { + // temporarily re-sizeable + if( !(m_nStyle & SAL_FRAME_STYLE_SIZEABLE) ) + gtk_window_set_resizable( GTK_WINDOW(m_pWindow), TRUE ); + gtk_window_resize( GTK_WINDOW( m_pWindow ), maGeometry.nWidth, maGeometry.nHeight ); + } + + gtk_window_move( GTK_WINDOW( m_pWindow ), maGeometry.nX, maGeometry.nY ); + #if !GTK_CHECK_VERSION(3,0,0) - m_aSystemData.pVisual = pDisp->GetVisual( m_nScreen ).GetVisual(); - m_aSystemData.nDepth = pDisp->GetVisual( m_nScreen ).GetDepth(); - m_aSystemData.aColormap = pDisp->GetColormap( m_nScreen ).GetXColormap(); + // _NET_WM_STATE_FULLSCREEN (Metacity <-> KWin) + if( ! getDisplay()->getWMAdaptor()->isLegacyPartialFullscreen() ) #endif - m_aSystemData.nScreen = nScreen; - m_aSystemData.pAppContext = NULL; - m_aSystemData.aShellWindow = m_aSystemData.aWindow; - // update graphics if necessary - for( unsigned int i = 0; i < SAL_N_ELEMENTS(m_aGraphics); i++ ) - { - if( m_aGraphics[i].bInUse ) - m_aGraphics[i].pGraphics->SetDrawable( GDK_WINDOW_XWINDOW(widget_get_window(m_pWindow)), m_nScreen ); - } - updateScreenNumber(); + { + if( eType == SET_FULLSCREEN ) + gtk_window_fullscreen( GTK_WINDOW( m_pWindow ) ); + else if( eType == SET_UN_FULLSCREEN ) + gtk_window_unfullscreen( GTK_WINDOW( m_pWindow ) ); } + if( eType == SET_UN_FULLSCREEN && + !(m_nStyle & SAL_FRAME_STYLE_SIZEABLE) ) + gtk_window_set_resizable( GTK_WINDOW( m_pWindow ), FALSE ); - if( m_pParent && m_pParent->m_nScreen != m_nScreen ) + // FIXME: we should really let gtk+ handle our widget hierarchy ... + if( m_pParent && gtk_widget_get_screen( m_pParent->m_pWindow ) != pScreen ) SetParent( NULL ); std::list< GtkSalFrame* > aChildren = m_aChildren; for( std::list< GtkSalFrame* >::iterator it = aChildren.begin(); it != aChildren.end(); ++it ) - (*it)->moveToScreen( m_nScreen ); + (*it)->SetScreen( nNewScreen, SET_RETAIN_SIZE ); - // FIXME: SalObjects -#endif + m_bDefaultPos = m_bDefaultSize = false; + updateScreenNumber(); + CallCallback( SALEVENT_MOVERESIZE, NULL ); + + if( bVisible ) + Show( sal_True ); } void GtkSalFrame::SetScreenNumber( unsigned int nNewScreen ) { - if( nNewScreen == maGeometry.nScreenNumber ) - return; - - if( m_pWindow && ! isChild() ) - { - GtkSalDisplay* pDisp = getDisplay(); - if( pDisp->IsXinerama() && pDisp->GetXineramaScreens().size() > 1 ) - { - if( nNewScreen >= pDisp->GetXineramaScreens().size() ) - return; - - Rectangle aOldScreenRect( pDisp->GetXineramaScreens()[maGeometry.nScreenNumber] ); - Rectangle aNewScreenRect( pDisp->GetXineramaScreens()[nNewScreen] ); - bool bVisible = IS_WIDGET_MAPPED(m_pWindow); - if( bVisible ) - Show( sal_False ); - maGeometry.nX = aNewScreenRect.Left() + (maGeometry.nX - aOldScreenRect.Left()); - maGeometry.nY = aNewScreenRect.Top() + (maGeometry.nY - aOldScreenRect.Top()); -#if !GTK_CHECK_VERSION(3,0,0) - createNewWindow( None, false, m_nScreen ); -#endif - gtk_window_move( GTK_WINDOW(m_pWindow), maGeometry.nX, maGeometry.nY ); - if( bVisible ) - Show( sal_True ); - maGeometry.nScreenNumber = nNewScreen; - } - else if( sal_Int32(nNewScreen) < pDisp->GetScreenCount() ) - { - moveToScreen( (int)nNewScreen ); - maGeometry.nScreenNumber = nNewScreen; - gtk_window_move( GTK_WINDOW(m_pWindow), maGeometry.nX, maGeometry.nY ); - } - } + SetScreen( nNewScreen, SET_RETAIN_SIZE ); } void GtkSalFrame::updateWMClass() @@ -1950,101 +1942,23 @@ void GtkSalFrame::SetApplicationID( const rtl::OUString &rWMClass ) void GtkSalFrame::ShowFullScreen( sal_Bool bFullScreen, sal_Int32 nScreen ) { -#if !GTK_CHECK_VERSION(3,0,0) - if( m_pWindow && ! isChild() ) + m_bFullscreen = bFullScreen; + + if( !m_pWindow || isChild() ) + return; + + if( bFullScreen ) { - GtkSalDisplay* pDisp = getDisplay(); - // xinerama ? - if( pDisp->IsXinerama() && pDisp->GetXineramaScreens().size() > 1 ) - { - if( bFullScreen ) - { - m_aRestorePosSize = Rectangle( Point( maGeometry.nX, maGeometry.nY ), - Size( maGeometry.nWidth, maGeometry.nHeight ) ); - bool bVisible = IS_WIDGET_MAPPED(m_pWindow); - if( bVisible ) - Show( sal_False ); - m_nStyle |= SAL_FRAME_STYLE_PARTIAL_FULLSCREEN; - createNewWindow( None, false, m_nScreen ); - Rectangle aNewPosSize; - if( nScreen < 0 || nScreen >= static_cast<int>(pDisp->GetXineramaScreens().size()) ) - aNewPosSize = Rectangle( Point( 0, 0 ), pDisp->GetScreenSize(m_nScreen) ); - else - aNewPosSize = pDisp->GetXineramaScreens()[ nScreen ]; - gtk_window_resize( GTK_WINDOW(m_pWindow), - maGeometry.nWidth = aNewPosSize.GetWidth(), - maGeometry.nHeight = aNewPosSize.GetHeight() ); - gtk_window_move( GTK_WINDOW(m_pWindow), - maGeometry.nX = aNewPosSize.Left(), - maGeometry.nY = aNewPosSize.Top() ); - // #i110881# for the benefit of compiz set a max size here - // else setting to fullscreen fails for unknown reasons - m_aMaxSize.Width() = aNewPosSize.GetWidth()+100; - m_aMaxSize.Height() = aNewPosSize.GetHeight()+100; - // workaround different legacy version window managers have different opinions about - // _NET_WM_STATE_FULLSCREEN (Metacity <-> KWin) - if( ! getDisplay()->getWMAdaptor()->isLegacyPartialFullscreen() ) - { - if( !(m_nStyle & SAL_FRAME_STYLE_SIZEABLE) ) - gtk_window_set_resizable( GTK_WINDOW(m_pWindow), sal_True ); - gtk_window_fullscreen( GTK_WINDOW( m_pWindow ) ); - } - if( bVisible ) - Show( sal_True ); - } - else - { - bool bVisible = IS_WIDGET_MAPPED(m_pWindow); - if( ! getDisplay()->getWMAdaptor()->isLegacyPartialFullscreen() ) - gtk_window_unfullscreen( GTK_WINDOW(m_pWindow) ); - if( bVisible ) - Show( sal_False ); - m_nStyle &= ~SAL_FRAME_STYLE_PARTIAL_FULLSCREEN; - createNewWindow( None, false, m_nScreen ); - if( ! m_aRestorePosSize.IsEmpty() ) - { - gtk_window_resize( GTK_WINDOW(m_pWindow), - maGeometry.nWidth = m_aRestorePosSize.GetWidth(), - maGeometry.nHeight = m_aRestorePosSize.GetHeight() ); - gtk_window_move( GTK_WINDOW(m_pWindow), - maGeometry.nX = m_aRestorePosSize.Left(), - maGeometry.nY = m_aRestorePosSize.Top() ); - m_aRestorePosSize = Rectangle(); - } - if( bVisible ) - Show( sal_True ); - } - } - else - { - if( bFullScreen ) - { - if( !(m_nStyle & SAL_FRAME_STYLE_SIZEABLE) ) - gtk_window_set_resizable( GTK_WINDOW(m_pWindow), TRUE ); - gtk_window_fullscreen( GTK_WINDOW(m_pWindow) ); - moveToScreen( nScreen ); - Size aScreenSize = pDisp->GetScreenSize( m_nScreen ); - maGeometry.nX = 0; - maGeometry.nY = 0; - maGeometry.nWidth = aScreenSize.Width(); - maGeometry.nHeight = aScreenSize.Height(); - } - else - { - gtk_window_unfullscreen( GTK_WINDOW(m_pWindow) ); - if( !(m_nStyle & SAL_FRAME_STYLE_SIZEABLE) ) - gtk_window_set_resizable( GTK_WINDOW(m_pWindow), FALSE ); - moveToScreen( nScreen ); - } - } - m_bDefaultPos = m_bDefaultSize = false; - updateScreenNumber(); - CallCallback( SALEVENT_MOVERESIZE, NULL ); + m_aRestorePosSize = Rectangle( Point( maGeometry.nX, maGeometry.nY ), + Size( maGeometry.nWidth, maGeometry.nHeight ) ); + SetScreen( nScreen, SET_FULLSCREEN ); + } + else + { + SetScreen( nScreen, SET_UN_FULLSCREEN, + !m_aRestorePosSize.IsEmpty() ? &m_aRestorePosSize : NULL ); + m_aRestorePosSize = Rectangle(); } - m_bFullscreen = bFullScreen; -#else -# warning No fullscreening - fix me ! -#endif } /* definitions from xautolock.c (pl15) */ @@ -2192,16 +2106,20 @@ void GtkSalFrame::StartPresentation( sal_Bool bStart ) int nTimeout, nInterval, bPreferBlanking, bAllowExposures; +#if !GTK_CHECK_VERSION(3,0,0) XGetScreenSaver( pDisplay, &nTimeout, &nInterval, &bPreferBlanking, &bAllowExposures ); +#endif if( bStart ) { if ( nTimeout ) { m_nSavedScreenSaverTimeout = nTimeout; +#if !GTK_CHECK_VERSION(3,0,0) XResetScreenSaver( pDisplay ); XSetScreenSaver( pDisplay, 0, nInterval, bPreferBlanking, bAllowExposures ); +#endif } #ifdef ENABLE_DBUS m_nGSMCookie = dbus_inhibit_gsm(g_get_application_name(), "presentation", @@ -2210,10 +2128,12 @@ void GtkSalFrame::StartPresentation( sal_Bool bStart ) } else { +#if !GTK_CHECK_VERSION(3,0,0) if( m_nSavedScreenSaverTimeout ) XSetScreenSaver( pDisplay, m_nSavedScreenSaverTimeout, nInterval, bPreferBlanking, bAllowExposures ); +#endif m_nSavedScreenSaverTimeout = 0; #ifdef ENABLE_DBUS dbus_uninhibit_gsm(m_nGSMCookie); @@ -2221,8 +2141,10 @@ void GtkSalFrame::StartPresentation( sal_Bool bStart ) } } -void GtkSalFrame::SetAlwaysOnTop( sal_Bool /*bOnTop*/ ) +void GtkSalFrame::SetAlwaysOnTop( sal_Bool bOnTop ) { + if( m_pWindow ) + gtk_window_set_keep_above( GTK_WINDOW( m_pWindow ), bOnTop ); } void GtkSalFrame::ToTop( sal_uInt16 nFlags ) @@ -2489,6 +2411,16 @@ SalBitmap* GtkSalFrame::SnapShot() if( !m_pWindow ) return NULL; +#if GTK_CHECK_VERSION(3,0,0) + SvpSalGraphics *pGraphics = static_cast<SvpSalGraphics *>(GetGraphics()); + if (!pGraphics) + return NULL; + + SalBitmap *pRet = pGraphics->getBitmap( 0, 0, maGeometry.nWidth, maGeometry.nHeight ); + ReleaseGraphics( pGraphics ); + + return pRet; +#else X11SalBitmap *pBmp = new X11SalBitmap; GdkWindow *pWin = widget_get_window(m_pWindow); if( pBmp->SnapShot( GDK_DISPLAY_XDISPLAY( getGdkDisplay() ), @@ -2496,15 +2428,13 @@ SalBitmap* GtkSalFrame::SnapShot() return pBmp; else delete pBmp; +#endif return NULL; } void GtkSalFrame::UpdateSettings( AllSettings& rSettings ) { - (void)rSettings; - -#if !GTK_CHECK_VERSION(3,0,0) if( ! m_pWindow ) return; @@ -2516,13 +2446,10 @@ void GtkSalFrame::UpdateSettings( AllSettings& rSettings ) bFreeGraphics = true; } -#ifndef GTK_GRAPHICS_DISABLED pGraphics->updateSettings( rSettings ); -#endif if( bFreeGraphics ) ReleaseGraphics( pGraphics ); -#endif } void GtkSalFrame::Beep( SoundType eType ) @@ -2748,6 +2675,7 @@ bool GtkSalFrame::Dispatch( const XEvent* pEvent ) maGeometry.nWidth = pEvent->xconfigure.width; maGeometry.nHeight = pEvent->xconfigure.height; setMinMaxSize(); + AllocateFrame(); getDisplay()->SendInternalEvent( this, NULL, SALEVENT_RESIZE ); } } @@ -3044,7 +2972,9 @@ void GtkSalFrame::popIgnoreDamage() void GtkSalFrame::damaged (const basegfx::B2IRange& rDamageRect) { -#if GTK_CHECK_VERSION(3,0,0) +#if !GTK_CHECK_VERSION(3,0,0) + (void)rDamageRect; +#else if (m_nDuringRender) return; #if OSL_DEBUG_LEVEL > 1 @@ -3350,15 +3280,12 @@ gboolean GtkSalFrame::signalConfigure( GtkWidget*, GdkEventConfigure* pEvent, gp * already exact; even worse: due to the asynchronicity of configure * events the borderwindow which would evaluate this event * would size/move based on wrong data if we would actually evaluate - * this event. So let's swallow it; this is also a performance - * improvement as one can omit the synchronous XTranslateCoordinates - * call below. + * this event. So let's swallow it. */ if( (pThis->m_nStyle & SAL_FRAME_STYLE_OWNERDRAWDECORATION) && pThis->getDisplay()->GetCaptureFrame() == pThis ) return sal_False; - /* #i31785# claims we cannot trust the x,y members of the event; * they are e.g. not set correctly on maximize/demaximize; * yet the gdkdisplay-x11.c code handling configure_events has @@ -3378,6 +3305,12 @@ gboolean GtkSalFrame::signalConfigure( GtkWidget*, GdkEventConfigure* pEvent, gp * - which is not good since the window manager will now size the window back to this * wrong size at some point. */ + fprintf (stderr, "configure %d %d %d (%d) %d, %d diff? %d\n", + (int)pThis->m_bFullscreen, (pThis->m_nStyle & (SAL_FRAME_STYLE_SIZEABLE | SAL_FRAME_STYLE_PLUG)), SAL_FRAME_STYLE_SIZEABLE, + !!( pThis->m_bFullscreen || (pThis->m_nStyle & (SAL_FRAME_STYLE_SIZEABLE | SAL_FRAME_STYLE_PLUG)) == SAL_FRAME_STYLE_SIZEABLE ), + pEvent->width, pEvent->height, + !!(pEvent->width != (int)pThis->maGeometry.nWidth || pEvent->height != (int)pThis->maGeometry.nHeight) + ); if( pThis->m_bFullscreen || (pThis->m_nStyle & (SAL_FRAME_STYLE_SIZEABLE | SAL_FRAME_STYLE_PLUG)) == SAL_FRAME_STYLE_SIZEABLE ) { if( pEvent->width != (int)pThis->maGeometry.nWidth || pEvent->height != (int)pThis->maGeometry.nHeight ) @@ -3406,8 +3339,11 @@ gboolean GtkSalFrame::signalConfigure( GtkWidget*, GdkEventConfigure* pEvent, gp pThis->maGeometry.nRightDecoration = 0; } - GTK_YIELD_GRAB(); pThis->updateScreenNumber(); + if( bSized ) + pThis->AllocateFrame(); + + GTK_YIELD_GRAB(); if( bMoved && bSized ) pThis->CallCallback( SALEVENT_MOVERESIZE, NULL ); else if( bMoved ) @@ -4226,6 +4162,11 @@ GtkSalGraphics::GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow ) { } +void GtkSalGraphics::updateSettings( AllSettings& rSettings ) +{ + g_warning ("unimplemented GtkSalGraphics update"); +} + static void print_cairo_region (cairo_region_t *region, const char *msg) { if (!region) { @@ -4307,3 +4248,13 @@ void GtkSalGraphics::copyArea( long nDestX, long nDestY, #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ + +Size GtkSalDisplay::GetScreenSize( int nScreen ) +{ + GdkScreen *pScreen = gdk_display_get_screen (m_pGdkDisplay, nScreen); + if (!pScreen) + return Size(); + else + return Size( gdk_screen_get_width (pScreen), + gdk_screen_get_height (pScreen) ); +} diff --git a/vcl/unx/x11/x11sys.cxx b/vcl/unx/x11/x11sys.cxx new file mode 100644 index 000000000000..e3d51b45f3df --- /dev/null +++ b/vcl/unx/x11/x11sys.cxx @@ -0,0 +1,174 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +#include <unx/salunx.h> +#include <unx/saldata.hxx> +#include <unx/salinst.h> +#include <unx/saldisp.hxx> +#include <unx/x11/x11sys.hxx> + +#include <vcl/msgbox.hxx> +#include <vcl/button.hxx> + +#include <svdata.hxx> + +#include <rtl/ustrbuf.hxx> +#include <osl/thread.h> + + +SalSystem* X11SalInstance::CreateSalSystem() +{ + return new X11SalSystem(); +} + +// ----------------------------------------------------------------------- + +X11SalSystem::~X11SalSystem() +{ +} + +// for the moment only handle xinerama case +unsigned int X11SalSystem::GetDisplayScreenCount() +{ + SalDisplay* pSalDisp = GetX11SalData()->GetDisplay(); + return pSalDisp->IsXinerama() ? pSalDisp->GetXineramaScreens().size() : pSalDisp->GetScreenCount(); +} + +bool X11SalSystem::IsMultiDisplay() +{ + SalDisplay* pSalDisp = GetX11SalData()->GetDisplay(); + unsigned int nScreenCount = pSalDisp->GetScreenCount(); + return pSalDisp->IsXinerama() ? false : (nScreenCount > 1); +} + +unsigned int X11SalSystem::GetDefaultDisplayNumber() +{ + SalDisplay* pSalDisp = GetX11SalData()->GetDisplay(); + return pSalDisp->GetDefaultScreenNumber(); +} + +Rectangle X11SalSystem::GetDisplayScreenPosSizePixel( unsigned int nScreen ) +{ + Rectangle aRet; + SalDisplay* pSalDisp = GetX11SalData()->GetDisplay(); + if( pSalDisp->IsXinerama() ) + { + const std::vector< Rectangle >& rScreens = pSalDisp->GetXineramaScreens(); + if( nScreen < rScreens.size() ) + aRet = rScreens[nScreen]; + } + else + { + const SalDisplay::ScreenData& rScreen = pSalDisp->getDataForScreen( nScreen ); + aRet = Rectangle( Point( 0, 0 ), rScreen.m_aSize ); + } + + return aRet; +} + +Rectangle X11SalSystem::GetDisplayWorkAreaPosSizePixel( unsigned int nScreen ) +{ + // FIXME: workareas + return GetDisplayScreenPosSizePixel( nScreen ); +} + +rtl::OUString X11SalSystem::GetScreenName( unsigned int nScreen ) +{ + rtl::OUString aScreenName; + SalDisplay* pSalDisp = GetX11SalData()->GetDisplay(); + if( pSalDisp->IsXinerama() ) + { + const std::vector< Rectangle >& rScreens = pSalDisp->GetXineramaScreens(); + if( nScreen >= rScreens.size() ) + nScreen = 0; + rtl::OUStringBuffer aBuf( 256 ); + aBuf.append( rtl::OStringToOUString( rtl::OString( DisplayString( pSalDisp->GetDisplay() ) ), osl_getThreadTextEncoding() ) ); + aBuf.appendAscii( " [" ); + aBuf.append( static_cast<sal_Int32>(nScreen) ); + aBuf.append( sal_Unicode(']') ); + aScreenName = aBuf.makeStringAndClear(); + } + else + { + if( nScreen >= static_cast<unsigned int>(pSalDisp->GetScreenCount()) ) + nScreen = 0; + rtl::OUStringBuffer aBuf( 256 ); + aBuf.append( rtl::OStringToOUString( rtl::OString( DisplayString( pSalDisp->GetDisplay() ) ), osl_getThreadTextEncoding() ) ); + // search backwards for ':' + int nPos = aBuf.getLength(); + if( nPos > 0 ) + nPos--; + while( nPos > 0 && aBuf.charAt( nPos ) != ':' ) + nPos--; + // search forward to '.' + while( nPos < aBuf.getLength() && aBuf.charAt( nPos ) != '.' ) + nPos++; + if( nPos < aBuf.getLength() ) + aBuf.setLength( nPos+1 ); + else + aBuf.append( sal_Unicode('.') ); + aBuf.append( static_cast<sal_Int32>(nScreen) ); + aScreenName = aBuf.makeStringAndClear(); + } + return aScreenName; +} + +int X11SalSystem::ShowNativeDialog( const String& rTitle, const String& rMessage, const std::list< String >& rButtons, int nDefButton ) +{ + int nRet = -1; + + ImplSVData* pSVData = ImplGetSVData(); + if( pSVData->mpIntroWindow ) + pSVData->mpIntroWindow->Hide(); + + WarningBox aWarn( NULL, WB_STDWORK, rMessage ); + aWarn.SetText( rTitle ); + aWarn.Clear(); + + sal_uInt16 nButton = 0; + for( std::list< String >::const_iterator it = rButtons.begin(); it != rButtons.end(); ++it ) + { + aWarn.AddButton( *it, nButton+1, nButton == (sal_uInt16)nDefButton ? BUTTONDIALOG_DEFBUTTON : 0 ); + nButton++; + } + aWarn.SetFocusButton( (sal_uInt16)nDefButton+1 ); + + nRet = ((int)aWarn.Execute()) - 1; + + // normalize behaviour, actually this should never happen + if( nRet < -1 || nRet >= int(rButtons.size()) ) + nRet = -1; + + return nRet; +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/win/source/app/salinfo.cxx b/vcl/win/source/app/salinfo.cxx index 67b23e9c2b91..03d1810b081a 100644 --- a/vcl/win/source/app/salinfo.cxx +++ b/vcl/win/source/app/salinfo.cxx @@ -243,11 +243,7 @@ int WinSalSystem::ShowNativeMessageBox(const String& rTitle, const String& rMess nDefaultButton <= SALSYSTEM_SHOWNATIVEMSGBOX_BTN_NO) nFlags |= DEFAULT_BTN_MAPPING_TABLE[nButtonCombination][nDefaultButton]; - //#107209 hide the splash screen if active - ImplSVData* pSVData = ImplGetSVData(); - if (pSVData->mpIntroWindow) - pSVData->mpIntroWindow->Hide(); - + ImplHideSplash(); return MessageBoxW( 0, reinterpret_cast<LPCWSTR>(rMessage.GetBuffer()), diff --git a/vcl/win/source/window/salframe.cxx b/vcl/win/source/window/salframe.cxx index 488ff4749d65..5c6bee5f717f 100644 --- a/vcl/win/source/window/salframe.cxx +++ b/vcl/win/source/window/salframe.cxx @@ -5730,9 +5730,7 @@ LRESULT CALLBACK SalFrameWndProc( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lP if ( WM_USER_SYSTEM_WINDOW_ACTIVATED == nMsg ) { - if (pSVData->mpIntroWindow) - pSVData->mpIntroWindow->Hide(); - + ImplHideSplash(); return 0; } @@ -5918,10 +5916,7 @@ LRESULT CALLBACK SalFrameWndProc( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lP ImplSVData* pSVData = ImplGetSVData(); pSVData->maAppData.mnModalMode++; - // #106431#, hide SplashScreen - if( pSVData->mpIntroWindow ) - pSVData->mpIntroWindow->Hide(); - + ImplHideSplash(); if( pWin ) { pWin->EnableInput( FALSE, TRUE, TRUE, NULL ); |