summaryrefslogtreecommitdiffstats
path: root/vcl
diff options
context:
space:
mode:
authorThorsten Behrens <Thorsten.Behrens@CIB.de>2018-09-05 02:53:07 +0200
committerThorsten Behrens <Thorsten.Behrens@CIB.de>2018-12-17 18:33:13 +0100
commit410bf59de02192c2daf1158b9de76ec0ebab4c56 (patch)
treebe010e92b862f169076de979796075c925c3e576 /vcl
parentUse 'gb_Library_set_include' for GTK3_CFLAGS (diff)
downloadcore-410bf59de02192c2daf1158b9de76ec0ebab4c56.tar.gz
core-410bf59de02192c2daf1158b9de76ec0ebab4c56.zip
kde5: remove older kde/tde plugins, and references to that
KDE4 is out of maintenance upstream since Nov. 2014, and binaries provided by TDF have switched to KDE5 as the official backend. Change-Id: I165465b56d3ba3a18912b203c06ae8fc6111c0c9 Reviewed-on: https://gerrit.libreoffice.org/60014 Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de> Tested-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/CustomTarget_kde4_moc.mk24
-rw-r--r--vcl/Library_vclplug_kde4.mk99
-rw-r--r--vcl/Module_vcl.mk7
-rw-r--r--vcl/README6
-rw-r--r--vcl/README.scheduler4
-rw-r--r--vcl/inc/vclpluginapi.h6
-rw-r--r--vcl/source/app/salplug.cxx5
-rw-r--r--vcl/source/opengl/OpenGLHelper.cxx2
-rw-r--r--vcl/unx/kde4/FPServiceInfo.hxx28
-rw-r--r--vcl/unx/kde4/KDE4FilePicker.cxx823
-rw-r--r--vcl/unx/kde4/KDE4FilePicker.hxx258
-rw-r--r--vcl/unx/kde4/KDEData.cxx68
-rw-r--r--vcl/unx/kde4/KDEData.hxx37
-rw-r--r--vcl/unx/kde4/KDESalDisplay.cxx91
-rw-r--r--vcl/unx/kde4/KDESalDisplay.hxx45
-rw-r--r--vcl/unx/kde4/KDESalFrame.cxx373
-rw-r--r--vcl/unx/kde4/KDESalFrame.hxx53
-rw-r--r--vcl/unx/kde4/KDESalGraphics.cxx1025
-rw-r--r--vcl/unx/kde4/KDESalGraphics.hxx53
-rw-r--r--vcl/unx/kde4/KDESalInstance.cxx66
-rw-r--r--vcl/unx/kde4/KDESalInstance.hxx45
-rw-r--r--vcl/unx/kde4/KDEXLib.cxx426
-rw-r--r--vcl/unx/kde4/KDEXLib.hxx101
-rw-r--r--vcl/unx/kde4/VCLKDEApplication.cxx87
-rw-r--r--vcl/unx/kde4/VCLKDEApplication.hxx39
-rw-r--r--vcl/unx/kde4/main.cxx89
-rw-r--r--vcl/unx/kde4/tst_exclude_posted_events.hxx67
-rw-r--r--vcl/unx/kde4/tst_exclude_socket_notifiers.hxx80
-rw-r--r--vcl/unx/kde5/KDE5FilePicker2.cxx3
-rw-r--r--vcl/unx/kde5/KDE5SalInstance.cxx1
30 files changed, 8 insertions, 4003 deletions
diff --git a/vcl/CustomTarget_kde4_moc.mk b/vcl/CustomTarget_kde4_moc.mk
deleted file mode 100644
index 16d1561944c6..000000000000
--- a/vcl/CustomTarget_kde4_moc.mk
+++ /dev/null
@@ -1,24 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-
-$(eval $(call gb_CustomTarget_CustomTarget,vcl/unx/kde4))
-
-$(call gb_CustomTarget_get_target,vcl/unx/kde4) : \
- $(call gb_CustomTarget_get_workdir,vcl/unx/kde4)/KDEXLib.moc \
- $(call gb_CustomTarget_get_workdir,vcl/unx/kde4)/KDE4FilePicker.moc \
- $(call gb_CustomTarget_get_workdir,vcl/unx/kde4)/tst_exclude_socket_notifiers.moc \
- $(call gb_CustomTarget_get_workdir,vcl/unx/kde4)/tst_exclude_posted_events.moc
-
-$(call gb_CustomTarget_get_workdir,vcl/unx/kde4)/%.moc : \
- $(SRCDIR)/vcl/unx/kde4/%.hxx \
- | $(call gb_CustomTarget_get_workdir,vcl/unx/kde4)/.dir
- $(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),MOC,1)
- $(MOC4) $< -o $@
-
-# vim: set noet sw=4:
diff --git a/vcl/Library_vclplug_kde4.mk b/vcl/Library_vclplug_kde4.mk
deleted file mode 100644
index 88dfd50f41f7..000000000000
--- a/vcl/Library_vclplug_kde4.mk
+++ /dev/null
@@ -1,99 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# This file incorporates work covered by the following license notice:
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed
-# with this work for additional information regarding copyright
-# ownership. The ASF licenses this file to you under the Apache
-# License, Version 2.0 (the "License"); you may not use this file
-# except in compliance with the License. You may obtain a copy of
-# the License at http://www.apache.org/licenses/LICENSE-2.0 .
-#
-
-$(eval $(call gb_Library_Library,vclplug_kde4))
-
-$(eval $(call gb_Library_use_custom_headers,vclplug_kde4,vcl/unx/kde4))
-
-$(eval $(call gb_Library_set_include,vclplug_kde4,\
- $$(INCLUDE) \
- -I$(SRCDIR)/vcl/inc \
-))
-
-$(eval $(call gb_Library_add_defs,vclplug_kde4,\
- -DVCLPLUG_KDE4_IMPLEMENTATION \
-))
-
-$(eval $(call gb_Library_use_sdk_api,vclplug_kde4))
-
-$(eval $(call gb_Library_use_libraries,vclplug_kde4,\
- vclplug_gen \
- vcl \
- tl \
- utl \
- sot \
- ucbhelper \
- basegfx \
- comphelper \
- cppuhelper \
- i18nlangtag \
- i18nutil \
- $(if $(ENABLE_JAVA), \
- jvmaccess) \
- cppu \
- sal \
-))
-
-$(eval $(call gb_Library_use_externals,vclplug_kde4,\
- boost_headers \
- harfbuzz \
- icuuc \
- kde4 \
- epoxy \
-))
-
-$(eval $(call gb_Library_add_libs,vclplug_kde4,\
- -lX11 \
- -lXext \
- -lSM \
- -lICE \
-))
-
-ifneq ($(KDE4_HAVE_GLIB),)
-$(eval $(call gb_Library_add_defs,vclplug_kde4,\
- $(KDE4_GLIB_CFLAGS) \
-))
-
-$(eval $(call gb_Library_add_libs,vclplug_kde4,\
- $(KDE4_GLIB_LIBS) \
-))
-endif
-
-
-$(eval $(call gb_Library_add_exception_objects,vclplug_kde4,\
- vcl/unx/kde4/KDEData \
- vcl/unx/kde4/KDE4FilePicker \
- vcl/unx/kde4/KDESalDisplay \
- vcl/unx/kde4/KDESalFrame \
- vcl/unx/kde4/KDESalGraphics \
- vcl/unx/kde4/KDESalInstance \
- vcl/unx/kde4/KDEXLib \
- vcl/unx/kde4/main \
- vcl/unx/kde4/VCLKDEApplication \
-))
-
-ifeq ($(OS),LINUX)
-$(eval $(call gb_Library_add_libs,vclplug_kde4,\
- -lm \
- -ldl \
- -lpthread \
-))
-endif
-
-# vim: set noet sw=4 ts=4:
diff --git a/vcl/Module_vcl.mk b/vcl/Module_vcl.mk
index baef5f31e34e..95dd579c38de 100644
--- a/vcl/Module_vcl.mk
+++ b/vcl/Module_vcl.mk
@@ -75,13 +75,6 @@ $(eval $(call gb_Module_add_targets,vcl,\
Library_vclplug_gtk3 \
))
endif
-ifneq ($(ENABLE_KDE4),)
-$(eval $(call gb_Module_add_targets,vcl,\
- CustomTarget_kde4_moc \
- Library_vclplug_kde4 \
-))
-endif
-
ifneq ($(ENABLE_KDE5),)
$(eval $(call gb_Module_add_targets,vcl,\
CustomTarget_kde5_moc \
diff --git a/vcl/README b/vcl/README
index 1169cdf1f660..9219c30b5b46 100644
--- a/vcl/README
+++ b/vcl/README
@@ -38,12 +38,10 @@ unx/
+ GTK2 support
gtk3/
+ GTK3 support
- kde4/
- + KDE4 support
kde5/
- + KDE5 support (under construction)
+ + KDE5 support
gtk3_kde5/
- + GTK3 support with KDE5 file pickers (until kde5 is finished)
+ + GTK3 support with KDE5 file pickers (alternative to native kde5 one)
generic/
+ raw X11 support
diff --git a/vcl/README.scheduler b/vcl/README.scheduler
index b7d7b61b30f7..23decf3b7ec2 100644
--- a/vcl/README.scheduler
+++ b/vcl/README.scheduler
@@ -273,7 +273,7 @@ now need O(log(n)) to find the position in the queue of the priority.
Currently Application::Reschedule() processes a single event or "all" events,
with "all" defined as "100 events" in most backends. This already is ignored
-by the KDE4 backend, as Qt defines its QAbstractEventDispatcher::processEvents
+by the KDE backend, as Qt defines its QAbstractEventDispatcher::processEvents
processing all pending events (there are ways to skip event classes, but no
easy way to process just a single event).
@@ -342,4 +342,4 @@ priority idle in the event loop.
A few layers of indirection make this code hard to follow. The SalXLib::Yield
and SalX11Display::Yield architecture makes it impossible to process just the
current events. This really needs a refactoring and rearchitecture step, which
-will also affect the Gtk+ and KDE4 backend for the user event handling.
+will also affect the Gtk+ and KDE backend for the user event handling.
diff --git a/vcl/inc/vclpluginapi.h b/vcl/inc/vclpluginapi.h
index fb3350e43a1f..495c86b8e57b 100644
--- a/vcl/inc/vclpluginapi.h
+++ b/vcl/inc/vclpluginapi.h
@@ -35,12 +35,6 @@
#define VCLPLUG_GTK_PUBLIC SAL_DLLPUBLIC_IMPORT
#endif
-#if defined VCLPLUG_KDE4_IMPLEMENTATION
-#define VCLPLUG_KDE4_PUBLIC SAL_DLLPUBLIC_EXPORT
-#else
-#define VCLPLUG_KDE4_PUBLIC SAL_DLLPUBLIC_IMPORT
-#endif
-
#if defined VCLPLUG_KDE5_IMPLEMENTATION
#define VCLPLUG_KDE5_PUBLIC SAL_DLLPUBLIC_EXPORT
#else
diff --git a/vcl/source/app/salplug.cxx b/vcl/source/app/salplug.cxx
index 3a3421179274..938780d11879 100644
--- a/vcl/source/app/salplug.cxx
+++ b/vcl/source/app/salplug.cxx
@@ -97,7 +97,7 @@ SalInstance* tryInstance( const OUString& rModuleBase, bool bForce = false )
* #i109007# KDE3 seems to have the same problem.
* And same applies for KDE4.
*/
- if( rModuleBase == "gtk" || rModuleBase == "gtk3" || rModuleBase == "kde4" || rModuleBase == "gtk3_kde5" || rModuleBase == "win" )
+ if( rModuleBase == "gtk" || rModuleBase == "gtk3" || rModuleBase == "gtk3_kde5" || rModuleBase == "win" )
{
pCloseModule = nullptr;
}
@@ -156,9 +156,6 @@ SalInstance* autodetect_plugin()
#if ENABLE_GTK3_KDE5
"gtk3_kde5",
#endif
-#if ENABLE_KDE4
- "kde4",
-#endif
"gtk3", "gtk", "gen", nullptr
};
diff --git a/vcl/source/opengl/OpenGLHelper.cxx b/vcl/source/opengl/OpenGLHelper.cxx
index 882f35d424af..356710a71d2a 100644
--- a/vcl/source/opengl/OpenGLHelper.cxx
+++ b/vcl/source/opengl/OpenGLHelper.cxx
@@ -961,7 +961,7 @@ bool OpenGLHelper::isVCLOpenGLEnabled()
return false;
//tdf#106155, disable GL while loading certain bitmaps needed for the initial toplevel windows
- //under raw X (kde4) vclplug
+ //under raw X (kde) vclplug
if (bTempOpenGLDisabled)
return false;
diff --git a/vcl/unx/kde4/FPServiceInfo.hxx b/vcl/unx/kde4/FPServiceInfo.hxx
deleted file mode 100644
index fdb285144343..000000000000
--- a/vcl/unx/kde4/FPServiceInfo.hxx
+++ /dev/null
@@ -1,28 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#pragma once
-
-// the service names
-#define FILE_PICKER_SERVICE_NAME "com.sun.star.ui.dialogs.KDE4FilePicker"
-
-// the implementation names
-#define FILE_PICKER_IMPL_NAME "com.sun.star.ui.dialogs.KDE4FilePicker"
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/KDE4FilePicker.cxx b/vcl/unx/kde4/KDE4FilePicker.cxx
deleted file mode 100644
index 5454344b949d..000000000000
--- a/vcl/unx/kde4/KDE4FilePicker.cxx
+++ /dev/null
@@ -1,823 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include "KDE4FilePicker.hxx"
-
-#include <com/sun/star/lang/DisposedException.hpp>
-#include <com/sun/star/lang/IllegalArgumentException.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <cppuhelper/interfacecontainer.h>
-#include <cppuhelper/supportsservice.hxx>
-#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
-#include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
-#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
-#include <com/sun/star/ui/dialogs/ControlActions.hpp>
-#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
-
-#include <fpicker/strings.hrc>
-#include <vcl/svapp.hxx>
-#include <vcl/sysdata.hxx>
-#include <vcl/syswin.hxx>
-
-#include <osl/file.h>
-#include <sal/log.hxx>
-
-#include "FPServiceInfo.hxx"
-#include "VCLKDEApplication.hxx"
-
-#include <kfiledialog.h>
-#include <kwindowsystem.h>
-#include <kapplication.h>
-#include <kfilefiltercombo.h>
-#include <kfilewidget.h>
-#include <kdiroperator.h>
-#include <kservicetypetrader.h>
-#include <kmessagebox.h>
-
-#include <QtGui/QClipboard>
-#include <QtGui/QWidget>
-#include <QtGui/QCheckBox>
-#include <QtGui/QGridLayout>
-
-#undef Region
-
-#include <unx/geninst.h>
-
-#include <strings.hrc>
-
-// The dialog should check whether LO also supports the protocol
-// provided by KIO, and KFileWidget::dirOperator() is only 4.3+ .
-// Moreover it's only in this somewhat internal KFileWidget class,
-// which may not necessarily be what KFileDialog::fileWidget() returns,
-// but that's hopefully not a problem in practice.
-#if KDE_VERSION_MAJOR == 4 && KDE_VERSION_MINOR >= 2
-#define ALLOW_REMOTE_URLS 1
-#else
-#define ALLOW_REMOTE_URLS 0
-#endif
-
-// helper functions
-
-#include <QtCore/QDebug>
-
-
-using namespace ::com::sun::star;
-using namespace ::com::sun::star::ui::dialogs;
-using namespace ::com::sun::star::ui::dialogs::TemplateDescription;
-using namespace ::com::sun::star::ui::dialogs::ExtendedFilePickerElementIds;
-using namespace ::com::sun::star::ui::dialogs::CommonFilePickerElementIds;
-using namespace ::com::sun::star::lang;
-using namespace ::com::sun::star::beans;
-using namespace ::com::sun::star::uno;
-
-namespace
-{
- uno::Sequence<OUString> FilePicker_getSupportedServiceNames()
- {
- uno::Sequence<OUString> aRet(3);
- aRet[0] = "com.sun.star.ui.dialogs.FilePicker";
- aRet[1] = "com.sun.star.ui.dialogs.SystemFilePicker";
- aRet[2] = "com.sun.star.ui.dialogs.KDE4FilePicker";
- return aRet;
- }
-}
-
-static OUString toOUString(const QString& s)
-{
- // QString stores UTF16, just like OUString
- return OUString(reinterpret_cast<const sal_Unicode*>(s.data()), s.length());
-}
-
-static QString toQString(const OUString& s)
-{
- return QString::fromUtf16(
- reinterpret_cast<ushort const *>(s.getStr()), s.getLength());
-}
-
-// KDE4FilePicker
-
-KDE4FilePicker::KDE4FilePicker( const uno::Reference<uno::XComponentContext>& )
- : KDE4FilePicker_Base(_helperMutex)
- , allowRemoteUrls( false )
-{
- _extraControls = new QWidget();
- _layout = new QGridLayout(_extraControls);
-
- _dialog = new KFileDialog(KUrl("~"), QString(""), nullptr, _extraControls);
-#if ALLOW_REMOTE_URLS
- if( KFileWidget* fileWidget = dynamic_cast< KFileWidget* >( _dialog->fileWidget()))
- {
- allowRemoteUrls = true;
- // Use finishedLoading signal rather than e.g. urlEntered, because if there's a problem
- // such as the URL being mistyped, there's no way to prevent two message boxes about it,
- // one from us and one from KDE code.
- connect( fileWidget->dirOperator(), SIGNAL( finishedLoading()), SLOT( checkProtocol()));
- }
-#endif
-
- setMultiSelectionMode( false );
-
- // XExecutableDialog functions
- connect( this, SIGNAL( setTitleSignal( const OUString & ) ),
- this, SLOT( setTitleSlot( const OUString & ) ), Qt::BlockingQueuedConnection );
- connect( this, SIGNAL( executeSignal() ),
- this, SLOT( executeSlot() ), Qt::BlockingQueuedConnection );
-
- // XFilePicker functions
- connect( this, SIGNAL( setMultiSelectionModeSignal( bool ) ),
- this, SLOT( setMultiSelectionModeSlot( bool ) ), Qt::BlockingQueuedConnection );
- connect( this, SIGNAL( setDefaultNameSignal( const OUString & ) ),
- this, SLOT( setDefaultNameSlot( const OUString & ) ), Qt::BlockingQueuedConnection );
- connect( this, SIGNAL( setDisplayDirectorySignal( const OUString & ) ),
- this, SLOT( setDisplayDirectorySlot( const OUString & ) ), Qt::BlockingQueuedConnection );
- connect( this, SIGNAL( getDisplayDirectorySignal() ),
- this, SLOT( getDisplayDirectorySlot() ), Qt::BlockingQueuedConnection );
- connect( this, SIGNAL( getFilesSignal() ),
- this, SLOT( getFilesSlot() ), Qt::BlockingQueuedConnection );
-
- // XFilterManager functions
- connect( this, SIGNAL( appendFilterSignal( const OUString &, const OUString & ) ),
- this, SLOT( appendFilterSlot( const OUString &, const OUString & ) ), Qt::BlockingQueuedConnection );
- connect( this, SIGNAL( setCurrentFilterSignal( const OUString & ) ),
- this, SLOT( setCurrentFilterSlot( const OUString & ) ), Qt::BlockingQueuedConnection );
- connect( this, SIGNAL( getCurrentFilterSignal() ),
- this, SLOT( getCurrentFilterSlot() ), Qt::BlockingQueuedConnection );
-
- // XFilterGroupManager functions
- connect( this, SIGNAL( appendFilterGroupSignal( const OUString &, const css::uno::Sequence< css::beans::StringPair > & ) ),
- this, SLOT( appendFilterGroupSlot( const OUString &, const css::uno::Sequence< css::beans::StringPair > & ) ), Qt::BlockingQueuedConnection );
-
- // XFilePickerControlAccess functions
- connect( this, SIGNAL( setValueSignal( sal_Int16, sal_Int16, const css::uno::Any & ) ),
- this, SLOT( setValueSlot( sal_Int16, sal_Int16, const css::uno::Any & ) ), Qt::BlockingQueuedConnection );
- connect( this, SIGNAL( getValueSignal( sal_Int16, sal_Int16 ) ),
- this, SLOT( getValueSlot( sal_Int16, sal_Int16 ) ), Qt::BlockingQueuedConnection );
- connect( this, SIGNAL( enableControlSignal( sal_Int16, bool ) ),
- this, SLOT( enableControlSlot( sal_Int16, bool ) ), Qt::BlockingQueuedConnection );
- connect( this, SIGNAL( setLabelSignal( sal_Int16, const OUString & ) ),
- this, SLOT( setLabelSlot( sal_Int16, const OUString & ) ), Qt::BlockingQueuedConnection );
- connect( this, SIGNAL( getLabelSignal( sal_Int16 ) ),
- this, SLOT( getLabelSlot( sal_Int16 ) ), Qt::BlockingQueuedConnection );
-
- // XFilePicker2 functions
- connect( this, SIGNAL( getSelectedFilesSignal() ),
- this, SLOT( getSelectedFilesSlot() ), Qt::BlockingQueuedConnection );
-
- // XInitialization
- connect( this, SIGNAL( initializeSignal( const css::uno::Sequence< css::uno::Any > & ) ),
- this, SLOT( initializeSlot( const css::uno::Sequence< css::uno::Any > & ) ), Qt::BlockingQueuedConnection );
-
- // Destructor proxy
- connect( this, SIGNAL( cleanupProxySignal() ), this, SLOT( cleanupProxy() ), Qt::BlockingQueuedConnection );
-
- connect( this, SIGNAL( checkProtocolSignal() ), this, SLOT( checkProtocol() ), Qt::BlockingQueuedConnection );
-
- // XFilePickerListener notifications
- connect( _dialog, SIGNAL( filterChanged(const QString&) ), this, SLOT( filterChanged(const QString&) ));
- connect( _dialog, SIGNAL( selectionChanged() ), this, SLOT( selectionChanged() ));
-}
-
-KDE4FilePicker::~KDE4FilePicker()
-{
- cleanupProxy();
-}
-
-void KDE4FilePicker::cleanupProxy()
-{
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT cleanupProxySignal();
- }
- delete _dialog;
-}
-
-void SAL_CALL KDE4FilePicker::addFilePickerListener( const uno::Reference<XFilePickerListener>& xListener )
-{
- SolarMutexGuard aGuard;
- m_xListener = xListener;
-}
-
-void SAL_CALL KDE4FilePicker::removeFilePickerListener( const uno::Reference<XFilePickerListener>& )
-{
- SolarMutexGuard aGuard;
- m_xListener.clear();
-}
-
-void SAL_CALL KDE4FilePicker::setTitle( const OUString &title )
-{
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT setTitleSignal( title );
- }
-
- _dialog->setCaption(toQString(title));
-}
-
-sal_Int16 SAL_CALL KDE4FilePicker::execute()
-{
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT executeSignal();
- }
-
- //get the window id of the main OO window to set it for the dialog as a parent
- vcl::Window *pParentWin = Application::GetDefDialogParent();
- if ( pParentWin )
- {
- const SystemEnvData* pSysData = pParentWin->GetSystemData();
- if ( pSysData )
- {
- KWindowSystem::setMainWindow( _dialog, pSysData->aWindow); // unx only
- }
- }
-
- _dialog->clearFilter();
- _dialog->setFilter(_filter);
-
- if(!_currentFilter.isNull())
- _dialog->filterWidget()->setCurrentItem(_currentFilter);
-
- _dialog->filterWidget()->setEditable(false);
-
- VCLKDEApplication::preDialogSetup();
- //block and wait for user input
- int result = _dialog->exec();
- VCLKDEApplication::postDialogCleanup();
- if( result == KFileDialog::Accepted )
- return ExecutableDialogResults::OK;
-
- return ExecutableDialogResults::CANCEL;
-}
-
-void SAL_CALL KDE4FilePicker::setMultiSelectionMode( sal_Bool multiSelect )
-{
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT setMultiSelectionModeSignal( multiSelect );
- }
-
- if( allowRemoteUrls )
- {
- if (multiSelect)
- _dialog->setMode(KFile::Files);
- else
- _dialog->setMode(KFile::File);
- }
- else
- {
- if (multiSelect)
- _dialog->setMode(KFile::Files | KFile::LocalOnly);
- else
- _dialog->setMode(KFile::File | KFile::LocalOnly);
- }
-}
-
-void SAL_CALL KDE4FilePicker::setDefaultName( const OUString &name )
-{
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT setDefaultNameSignal( name );
- }
-
- const QString url = toQString(name);
- _dialog->setSelection(url);
-}
-
-void SAL_CALL KDE4FilePicker::setDisplayDirectory( const OUString &dir )
-{
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT setDisplayDirectorySignal( dir );
- }
-
- const QString url = toQString(dir);
- _dialog->setUrl(KUrl(url));
-}
-
-OUString SAL_CALL KDE4FilePicker::getDisplayDirectory()
-{
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT getDisplayDirectorySignal();
- }
-
- QString dir = _dialog->baseUrl().url();
- return toOUString(dir);
-}
-
-uno::Sequence< OUString > SAL_CALL KDE4FilePicker::getFiles()
-{
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT getFilesSignal();
- }
- uno::Sequence< OUString > seq = getSelectedFiles();
- if (seq.getLength() > 1)
- seq.realloc(1);
- return seq;
-}
-
-uno::Sequence< OUString > SAL_CALL KDE4FilePicker::getSelectedFiles()
-{
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT getSelectedFilesSignal();
- }
- KUrl::List urls = _dialog->selectedUrls();
- uno::Sequence< OUString > seq( urls.size());
- int i = 0;
- foreach( const KUrl& url, urls )
- seq[ i++ ]= toOUString( url.url());
- return seq;
-}
-
-void SAL_CALL KDE4FilePicker::appendFilter( const OUString &title, const OUString &filter )
-{
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT appendFilterSignal( title, filter );
- }
-
- QString t = toQString(title);
- QString f = toQString(filter);
-
- if (!_filter.isNull())
- _filter.append("\n");
-
- // '/' need to be escaped else they are assumed to be mime types by kfiledialog
- //see the docs
- t.replace("/", "\\/");
-
- // openoffice gives us filters separated by ';' qt dialogs just want space separated
- f.replace(";", " ");
-
- // make sure "*.*" is not used as "all files"
- f.replace("*.*", "*");
-
- _filter.append(QString("%1|%2").arg(f).arg(t));
-}
-
-void SAL_CALL KDE4FilePicker::setCurrentFilter( const OUString &title )
-{
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT setCurrentFilterSignal( title );
- }
-
- _currentFilter = toQString(title);
-}
-
-OUString SAL_CALL KDE4FilePicker::getCurrentFilter()
-{
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT getCurrentFilterSignal();
- }
-
- // _dialog->currentFilter() wouldn't quite work, because it returns only e.g. "*.doc",
- // without the description, and there may be several filters with the same pattern
- QString filter = _dialog->filterWidget()->currentText();
- filter = filter.mid( filter.indexOf( '|' ) + 1 ); // convert from the pattern|description format if needed
- filter.replace( "\\/", "/" );
-
- //default if not found
- if (filter.isNull())
- filter = "ODF Text Document (.odt)";
-
- return toOUString(filter);
-}
-
-void SAL_CALL KDE4FilePicker::appendFilterGroup( const OUString& rGroupTitle, const uno::Sequence<beans::StringPair>& filters)
-{
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT appendFilterGroupSignal( rGroupTitle, filters );
- }
-
- const sal_uInt16 length = filters.getLength();
- for (sal_uInt16 i = 0; i < length; ++i)
- {
- beans::StringPair aPair = filters[i];
- appendFilter( aPair.First, aPair.Second );
- }
-}
-
-void SAL_CALL KDE4FilePicker::setValue( sal_Int16 controlId, sal_Int16 nControlAction, const uno::Any &value )
-{
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT setValueSignal( controlId, nControlAction, value );
- }
-
- if (_customWidgets.contains( controlId )) {
- QCheckBox* cb = dynamic_cast<QCheckBox*>( _customWidgets.value( controlId ));
- if (cb)
- cb->setChecked(value.get<bool>());
- }
- else
- SAL_WARN( "vcl", "set label on unknown control " << controlId );
-}
-
-uno::Any SAL_CALL KDE4FilePicker::getValue( sal_Int16 controlId, sal_Int16 nControlAction )
-{
- if (CHECKBOX_AUTOEXTENSION == controlId)
- // We ignore this one and rely on KFileDialog to provide the function.
- // Always return false, to pretend we do not support this, otherwise
- // LO core would try to be smart and cut the extension in some places,
- // interfering with KFileDialog's handling of it. KFileDialog also
- // saves the value of the setting, so LO core is not needed for that either.
- return uno::Any( false );
-
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT getValueSignal( controlId, nControlAction );
- }
-
- uno::Any res(false);
- if (_customWidgets.contains( controlId )) {
- QCheckBox* cb = dynamic_cast<QCheckBox*>( _customWidgets.value( controlId ));
- if (cb)
- res <<= cb->isChecked();
- }
- else
- SAL_WARN( "vcl", "get value on unknown control " << controlId );
-
- return res;
-}
-
-void SAL_CALL KDE4FilePicker::enableControl( sal_Int16 controlId, sal_Bool enable )
-{
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT enableControlSignal( controlId, enable );
- }
-
- if (_customWidgets.contains( controlId ))
- _customWidgets.value( controlId )->setEnabled( enable );
- else
- SAL_WARN( "vcl", "enable unknown control " << controlId );
-}
-
-void SAL_CALL KDE4FilePicker::setLabel( sal_Int16 controlId, const OUString &label )
-{
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT setLabelSignal( controlId, label );
- }
-
- if (_customWidgets.contains( controlId )) {
- QCheckBox* cb = dynamic_cast<QCheckBox*>( _customWidgets.value( controlId ));
- if (cb)
- cb->setText( toQString(label) );
- }
- else
- SAL_WARN( "vcl", "set label on unknown control " << controlId );
-}
-
-OUString SAL_CALL KDE4FilePicker::getLabel(sal_Int16 controlId)
-{
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT getLabelSignal( controlId );
- }
-
- QString label;
- if (_customWidgets.contains( controlId )) {
- QCheckBox* cb = dynamic_cast<QCheckBox*>( _customWidgets.value( controlId ));
- if (cb)
- label = cb->text();
- }
- else
- SAL_WARN( "vcl", "get label on unknown control " << controlId );
-
- return toOUString(label);
-}
-
-QString KDE4FilePicker::getResString(const char *pResId)
-{
- QString aResString;
-
- if (pResId == nullptr)
- return aResString;
-
- aResString = toQString(VclResId(pResId));
-
- return aResString.replace('~', '&');
-}
-
-void KDE4FilePicker::addCustomControl(sal_Int16 controlId)
-{
- QWidget* widget = nullptr;
- const char* resId = nullptr;
-
- switch (controlId)
- {
- case CHECKBOX_AUTOEXTENSION:
- resId = STR_FPICKER_AUTO_EXTENSION;
- break;
- case CHECKBOX_PASSWORD:
- resId = STR_FPICKER_PASSWORD;
- break;
- case CHECKBOX_GPGENCRYPTION:
- resId = STR_FPICKER_GPGENCRYPT;
- break;
- case CHECKBOX_FILTEROPTIONS:
- resId = STR_FPICKER_FILTER_OPTIONS;
- break;
- case CHECKBOX_READONLY:
- resId = STR_FPICKER_READONLY;
- break;
- case CHECKBOX_LINK:
- resId = STR_FPICKER_INSERT_AS_LINK;
- break;
- case CHECKBOX_PREVIEW:
- resId = STR_FPICKER_SHOW_PREVIEW;
- break;
- case CHECKBOX_SELECTION:
- resId = STR_FPICKER_SELECTION;
- break;
- case PUSHBUTTON_PLAY:
- resId = STR_FPICKER_PLAY;
- break;
- case LISTBOX_VERSION:
- resId = STR_FPICKER_VERSION;
- break;
- case LISTBOX_TEMPLATE:
- resId = STR_FPICKER_TEMPLATES;
- break;
- case LISTBOX_IMAGE_TEMPLATE:
- resId = STR_FPICKER_IMAGE_TEMPLATE;
- break;
- case LISTBOX_IMAGE_ANCHOR:
- resId = STR_FPICKER_IMAGE_ANCHOR;
- break;
- case LISTBOX_VERSION_LABEL:
- case LISTBOX_TEMPLATE_LABEL:
- case LISTBOX_IMAGE_TEMPLATE_LABEL:
- case LISTBOX_IMAGE_ANCHOR_LABEL:
- case LISTBOX_FILTER_SELECTOR:
- break;
- }
-
- switch (controlId)
- {
- case CHECKBOX_AUTOEXTENSION:
- case CHECKBOX_PASSWORD:
- case CHECKBOX_GPGENCRYPTION:
- case CHECKBOX_FILTEROPTIONS:
- case CHECKBOX_READONLY:
- case CHECKBOX_LINK:
- case CHECKBOX_PREVIEW:
- case CHECKBOX_SELECTION:
- {
- widget = new QCheckBox(getResString(resId), _extraControls);
-
- // the checkbox is created even for CHECKBOX_AUTOEXTENSION to simplify
- // code, but the checkbox is hidden and ignored
- if( controlId == CHECKBOX_AUTOEXTENSION )
- widget->hide();
-
- break;
- }
- case PUSHBUTTON_PLAY:
- case LISTBOX_VERSION:
- case LISTBOX_TEMPLATE:
- case LISTBOX_IMAGE_TEMPLATE:
- case LISTBOX_IMAGE_ANCHOR:
- case LISTBOX_VERSION_LABEL:
- case LISTBOX_TEMPLATE_LABEL:
- case LISTBOX_IMAGE_TEMPLATE_LABEL:
- case LISTBOX_IMAGE_ANCHOR_LABEL:
- case LISTBOX_FILTER_SELECTOR:
- break;
- }
-
- if (widget)
- {
- _layout->addWidget(widget);
- _customWidgets.insert(controlId, widget);
- }
-}
-
-void SAL_CALL KDE4FilePicker::initialize( const uno::Sequence<uno::Any> &args )
-{
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT initializeSignal( args );
- }
-
- _filter.clear();
- _currentFilter.clear();
-
- // parameter checking
- uno::Any arg;
- if (args.getLength() == 0)
- {
- throw lang::IllegalArgumentException(
- "no arguments",
- static_cast< XFilePicker2* >( this ), 1 );
- }
-
- arg = args[0];
-
- if (( arg.getValueType() != cppu::UnoType<sal_Int16>::get()) &&
- ( arg.getValueType() != cppu::UnoType<sal_Int8>::get()))
- {
- throw lang::IllegalArgumentException(
- "invalid argument type",
- static_cast< XFilePicker2* >( this ), 1 );
- }
-
- sal_Int16 templateId = -1;
- arg >>= templateId;
-
- //default is opening
- KFileDialog::OperationMode operationMode = KFileDialog::Opening;
-
- switch ( templateId )
- {
- case FILEOPEN_SIMPLE:
- break;
-
- case FILESAVE_SIMPLE:
- operationMode = KFileDialog::Saving;
- break;
-
- case FILESAVE_AUTOEXTENSION:
- operationMode = KFileDialog::Saving;
- addCustomControl( CHECKBOX_AUTOEXTENSION );
- break;
-
- case FILESAVE_AUTOEXTENSION_PASSWORD:
- {
- operationMode = KFileDialog::Saving;
- addCustomControl( CHECKBOX_PASSWORD );
- addCustomControl( CHECKBOX_GPGENCRYPTION );
- break;
- }
- case FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS:
- {
- operationMode = KFileDialog::Saving;
- addCustomControl( CHECKBOX_AUTOEXTENSION );
- addCustomControl( CHECKBOX_PASSWORD );
- addCustomControl( CHECKBOX_GPGENCRYPTION );
- addCustomControl( CHECKBOX_FILTEROPTIONS );
- break;
- }
- case FILESAVE_AUTOEXTENSION_SELECTION:
- operationMode = KFileDialog::Saving;
- addCustomControl( CHECKBOX_AUTOEXTENSION );
- addCustomControl( CHECKBOX_SELECTION );
- break;
-
- case FILESAVE_AUTOEXTENSION_TEMPLATE:
- operationMode = KFileDialog::Saving;
- addCustomControl( CHECKBOX_AUTOEXTENSION );
- addCustomControl( LISTBOX_TEMPLATE );
- break;
-
- case FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE:
- addCustomControl( CHECKBOX_LINK );
- addCustomControl( CHECKBOX_PREVIEW );
- addCustomControl( LISTBOX_IMAGE_TEMPLATE );
- break;
-
- case FILEOPEN_LINK_PREVIEW_IMAGE_ANCHOR:
- addCustomControl( CHECKBOX_LINK );
- addCustomControl( CHECKBOX_PREVIEW );
- addCustomControl( LISTBOX_IMAGE_ANCHOR );
- break;
-
- case FILEOPEN_PLAY:
- addCustomControl( PUSHBUTTON_PLAY );
- break;
-
- case FILEOPEN_LINK_PLAY:
- addCustomControl( CHECKBOX_LINK );
- addCustomControl( PUSHBUTTON_PLAY );
- break;
-
- case FILEOPEN_READONLY_VERSION:
- addCustomControl( CHECKBOX_READONLY );
- addCustomControl( LISTBOX_VERSION );
- break;
-
- case FILEOPEN_LINK_PREVIEW:
- addCustomControl( CHECKBOX_LINK );
- addCustomControl( CHECKBOX_PREVIEW );
- break;
-
- case FILEOPEN_PREVIEW:
- addCustomControl( CHECKBOX_PREVIEW );
- break;
-
- default:
- throw lang::IllegalArgumentException(
- "Unknown template",
- static_cast< XFilePicker2* >( this ),
- 1 );
- }
-
- _dialog->setOperationMode( operationMode );
-
- const char *resId = nullptr;
- switch (_dialog->operationMode())
- {
- case KFileDialog::Opening:
- resId = STR_FPICKER_OPEN;
- break;
- case KFileDialog::Saving:
- resId = STR_FPICKER_SAVE;
- _dialog->setConfirmOverwrite( true );
- break;
- default:
- break;
- }
-
- _dialog->setCaption(getResString(resId));
-}
-
-void SAL_CALL KDE4FilePicker::cancel()
-{
-
-}
-
-void KDE4FilePicker::disposing( const lang::EventObject &rEvent )
-{
- uno::Reference<XFilePickerListener> xFilePickerListener( rEvent.Source, uno::UNO_QUERY );
-
- if ( xFilePickerListener.is() )
- {
- removeFilePickerListener( xFilePickerListener );
- }
-}
-
-OUString SAL_CALL KDE4FilePicker::getImplementationName()
-{
- return OUString( FILE_PICKER_IMPL_NAME );
-}
-
-sal_Bool SAL_CALL KDE4FilePicker::supportsService( const OUString& ServiceName )
-{
- return cppu::supportsService(this, ServiceName);
-}
-
-uno::Sequence< OUString > SAL_CALL KDE4FilePicker::getSupportedServiceNames()
-{
- return FilePicker_getSupportedServiceNames();
-}
-
-void KDE4FilePicker::checkProtocol()
-{
- if( qApp->thread() != QThread::currentThread() ) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT checkProtocolSignal();
- }
-
- // There's no libreoffice.desktop :(, so find a matching one.
- KService::List services = KServiceTypeTrader::self()->query( "Application", "Exec =~ 'libreoffice %U'" );
- QStringList protocols;
- if( !services.isEmpty())
- protocols = services[ 0 ]->property( "X-KDE-Protocols" ).toStringList();
- if( protocols.isEmpty()) // incorrect (developer?) installation ?
- protocols << "file" << "http";
- if( !protocols.contains( _dialog->baseUrl().protocol()) && !protocols.contains( "KIO" ))
- KMessageBox::error( _dialog, KIO::buildErrorString( KIO::ERR_UNSUPPORTED_PROTOCOL, _dialog->baseUrl().protocol()));
-}
-
-void KDE4FilePicker::filterChanged(const QString &)
-{
- FilePickerEvent aEvent;
- aEvent.ElementId = LISTBOX_FILTER;
- SAL_INFO( "vcl", "filter changed" );
- if (m_xListener.is())
- m_xListener->controlStateChanged( aEvent );
-}
-
-void KDE4FilePicker::selectionChanged()
-{
- FilePickerEvent aEvent;
- SAL_INFO( "vcl", "file selection changed" );
- if (m_xListener.is())
- m_xListener->fileSelectionChanged( aEvent );
-}
-
-#include <KDE4FilePicker.moc>
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/KDE4FilePicker.hxx b/vcl/unx/kde4/KDE4FilePicker.hxx
deleted file mode 100644
index f0b37452ef3d..000000000000
--- a/vcl/unx/kde4/KDE4FilePicker.hxx
+++ /dev/null
@@ -1,258 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#pragma once
-
-#include <cppuhelper/compbase.hxx>
-
-#include <com/sun/star/lang/XServiceInfo.hpp>
-#include <com/sun/star/lang/XInitialization.hpp>
-#include <com/sun/star/ui/dialogs/XFilePicker3.hpp>
-#include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
-#include <com/sun/star/uno/XComponentContext.hpp>
-
-#include <osl/conditn.hxx>
-#include <osl/mutex.hxx>
-
-#include <rtl/ustrbuf.hxx>
-
-#include <QtCore/QObject>
-#include <QtCore/QString>
-#include <QtCore/QHash>
-
-class KFileDialog;
-class QWidget;
-class QLayout;
-
-typedef ::cppu::WeakComponentImplHelper
-< css::ui::dialogs::XFilePicker3
-, css::ui::dialogs::XFilePickerControlAccess
-// TODO css::ui::dialogs::XFilePreview
-, css::lang::XInitialization
-, css::lang::XServiceInfo
-> KDE4FilePicker_Base;
-
-class KDE4FilePicker
- : public QObject
- , public KDE4FilePicker_Base
-{
- Q_OBJECT
-protected:
-
- css::uno::Reference< css::ui::dialogs::XFilePickerListener > m_xListener;
-
- //the dialog to display
- KFileDialog* _dialog;
-
- osl::Mutex _helperMutex;
-
- //running filter string to add to dialog
- QString _filter;
- // string to set the current filter
- QString _currentFilter;
-
- //mapping of SAL control ID's to created custom controls
- QHash<sal_Int16, QWidget*> _customWidgets;
-
- //widget to contain extra custom controls
- QWidget* _extraControls;
-
- //layout for extra custom controls
- QLayout* _layout;
-
- bool allowRemoteUrls;
-
-public:
- explicit KDE4FilePicker( const css::uno::Reference< css::uno::XComponentContext >& );
- virtual ~KDE4FilePicker() override;
-
- // XFilePickerNotifier
- virtual void SAL_CALL addFilePickerListener( const css::uno::Reference< css::ui::dialogs::XFilePickerListener >& xListener ) override;
- virtual void SAL_CALL removeFilePickerListener( const css::uno::Reference< css::ui::dialogs::XFilePickerListener >& xListener ) override;
-
- // XExecutableDialog functions
- virtual void SAL_CALL setTitle( const OUString &rTitle ) override;
- virtual sal_Int16 SAL_CALL execute() override;
-
- // XFilePicker functions
- virtual void SAL_CALL setMultiSelectionMode( sal_Bool bMode ) override;
- virtual void SAL_CALL setDefaultName( const OUString &rName ) override;
- virtual void SAL_CALL setDisplayDirectory( const OUString &rDirectory ) override;
- virtual OUString SAL_CALL getDisplayDirectory() override;
- virtual css::uno::Sequence< OUString > SAL_CALL getFiles() override;
-
- // XFilterManager functions
- virtual void SAL_CALL appendFilter( const OUString &rTitle, const OUString &rFilter ) override;
- virtual void SAL_CALL setCurrentFilter( const OUString &rTitle ) override;
- virtual OUString SAL_CALL getCurrentFilter() override;
-
- // XFilterGroupManager functions
- virtual void SAL_CALL appendFilterGroup( const OUString &rGroupTitle, const css::uno::Sequence< css::beans::StringPair > &rFilters ) override;
-
- // XFilePickerControlAccess functions
- virtual void SAL_CALL setValue( sal_Int16 nControlId, sal_Int16 nControlAction, const css::uno::Any &rValue ) override;
- virtual css::uno::Any SAL_CALL getValue( sal_Int16 nControlId, sal_Int16 nControlAction ) override;
- virtual void SAL_CALL enableControl( sal_Int16 nControlId, sal_Bool bEnable ) override;
- virtual void SAL_CALL setLabel( sal_Int16 nControlId, const OUString &rLabel ) override;
- virtual OUString SAL_CALL getLabel( sal_Int16 nControlId ) override;
-
- /* TODO XFilePreview
-
- virtual css::uno::Sequence< sal_Int16 > SAL_CALL getSupportedImageFormats( ) throw (css::uno::RuntimeException);
- virtual sal_Int32 SAL_CALL getTargetColorDepth( ) throw (css::uno::RuntimeException);
- virtual sal_Int32 SAL_CALL getAvailableWidth( ) throw (css::uno::RuntimeException);
- virtual sal_Int32 SAL_CALL getAvailableHeight( ) throw (css::uno::RuntimeException);
- virtual void SAL_CALL setImage( sal_Int16 aImageFormat, const css::uno::Any &rImage ) throw (css::lang::IllegalArgumentException, css::uno::RuntimeException);
- virtual sal_Bool SAL_CALL setShowState( sal_Bool bShowState ) throw (css::uno::RuntimeException);
- virtual sal_Bool SAL_CALL getShowState( ) throw (css::uno::RuntimeException);
- */
-
- // XFilePicker2 functions
- virtual css::uno::Sequence< OUString > SAL_CALL getSelectedFiles() override;
-
- // XInitialization
- virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any > &rArguments ) override;
-
- // XCancellable
- virtual void SAL_CALL cancel( ) override;
-
- // XEventListener
- /// @throws css::uno::RuntimeException
- virtual void disposing( const css::lang::EventObject &rEvent );
- using cppu::WeakComponentImplHelperBase::disposing;
-
- // XServiceInfo
- virtual OUString SAL_CALL getImplementationName() override;
- virtual sal_Bool SAL_CALL supportsService( const OUString &rServiceName ) override;
- virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
-
-private Q_SLOTS:
- // XExecutableDialog functions
- /// @throws css::uno::RuntimeException
- void setTitleSlot( const OUString &rTitle ) { return setTitle( rTitle ); }
- /// @throws css::uno::RuntimeException
- sal_Int16 executeSlot() { return execute(); }
-
- // XFilePicker functions
- /// @throws css::uno::RuntimeException
- void setMultiSelectionModeSlot( bool bMode ) { return setMultiSelectionMode( bMode ); }
- /// @throws css::uno::RuntimeException
- void setDefaultNameSlot( const OUString &rName ) { return setDefaultName( rName ); }
- /// @throws css::uno::RuntimeException
- void setDisplayDirectorySlot( const OUString &rDirectory ) { return setDisplayDirectory( rDirectory ); }
- /// @throws css::uno::RuntimeException
- OUString getDisplayDirectorySlot() { return getDisplayDirectory(); }
- /// @throws css::uno::RuntimeException
- css::uno::Sequence< OUString > getFilesSlot() { return getFiles(); }
-
- // XFilterManager functions
- /// @throws css::lang::IllegalArgumentException
- /// @throws css::uno::RuntimeException
- void appendFilterSlot( const OUString &rTitle, const OUString &rFilter ) { return appendFilter( rTitle, rFilter ); }
- /// @throws css::lang::IllegalArgumentException
- /// @throws css::uno::RuntimeException
- void setCurrentFilterSlot( const OUString &rTitle ) { return setCurrentFilter( rTitle ); }
- /// @throws css::uno::RuntimeException
- OUString getCurrentFilterSlot() { return getCurrentFilter(); }
-
- // XFilterGroupManager functions
- /// @throws css::lang::IllegalArgumentException
- /// @throws css::uno::RuntimeException
- void appendFilterGroupSlot( const OUString &rGroupTitle, const css::uno::Sequence< css::beans::StringPair > &rFilters ) { return appendFilterGroup( rGroupTitle, rFilters ); }
-
- // XFilePickerControlAccess functions
- /// @throws css::uno::RuntimeException
- void setValueSlot( sal_Int16 nControlId, sal_Int16 nControlAction, const css::uno::Any &rValue ) { return setValue( nControlId, nControlAction, rValue ); }
- /// @throws css::uno::RuntimeException
- css::uno::Any getValueSlot( sal_Int16 nControlId, sal_Int16 nControlAction ) { return getValue( nControlId, nControlAction ); }
- /// @throws css::uno::RuntimeException
- void enableControlSlot( sal_Int16 nControlId, bool bEnable ) { return enableControl( nControlId, bEnable ); }
- /// @throws css::uno::RuntimeException
- void setLabelSlot( sal_Int16 nControlId, const OUString &rLabel ) { return setLabel( nControlId, rLabel ); }
- /// @throws css::uno::RuntimeException
- OUString getLabelSlot( sal_Int16 nControlId ) { return getLabel( nControlId ); }
-
- // XFilePicker2 functions
- /// @throws css::uno::RuntimeException
- css::uno::Sequence< OUString > getSelectedFilesSlot() { return getSelectedFiles(); }
-
- // XInitialization
- /// @throws css::uno::Exception
- /// @throws css::uno::RuntimeException
- void initializeSlot( const css::uno::Sequence< css::uno::Any > &rArguments ) { return initialize( rArguments ); }
-
-Q_SIGNALS:
- // XExecutableDialog functions
- void setTitleSignal( const OUString &rTitle );
- sal_Int16 executeSignal();
-
- // XFilePicker functions
- void setMultiSelectionModeSignal( bool bMode );
- void setDefaultNameSignal( const OUString &rName );
- void setDisplayDirectorySignal( const OUString &rDirectory );
- OUString getDisplayDirectorySignal();
- css::uno::Sequence< OUString > getFilesSignal();
-
- // XFilterManager functions
- void appendFilterSignal( const OUString &rTitle, const OUString &rFilter );
- void setCurrentFilterSignal( const OUString &rTitle );
- OUString getCurrentFilterSignal();
-
- // XFilterGroupManager functions
- void appendFilterGroupSignal( const OUString &rGroupTitle, const css::uno::Sequence< css::beans::StringPair > &rFilters );
-
- // XFilePickerControlAccess functions
- void setValueSignal( sal_Int16 nControlId, sal_Int16 nControlAction, const css::uno::Any &rValue );
- css::uno::Any getValueSignal( sal_Int16 nControlId, sal_Int16 nControlAction );
- void enableControlSignal( sal_Int16 nControlId, bool bEnable );
- void setLabelSignal( sal_Int16 nControlId, const OUString &rLabel );
- OUString getLabelSignal( sal_Int16 nControlId );
-
- // XFilePicker2 functions
- css::uno::Sequence< OUString > getSelectedFilesSignal() ;
-
- // XInitialization
- void initializeSignal( const css::uno::Sequence< css::uno::Any > &rArguments );
-
- // Destructor proxy
- void cleanupProxySignal();
-
- // KDE protocol lookup
- void checkProtocolSignal();
-
-private:
- KDE4FilePicker( const KDE4FilePicker& ) = delete;
- KDE4FilePicker& operator=( const KDE4FilePicker& ) = delete;
-
- //add a custom control widget to the file dialog
- void addCustomControl(sal_Int16 controlId);
-
- static QString getResString(const char* pRedId);
-
-private Q_SLOTS:
- void cleanupProxy();
- void checkProtocol();
-
- // emit XFilePickerListener controlStateChanged event
- void filterChanged(const QString &filter);
- // emit XFilePickerListener fileSelectionChanged event
- void selectionChanged();
-};
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/KDEData.cxx b/vcl/unx/kde4/KDEData.cxx
deleted file mode 100644
index 1f3d0bfcbb3c..000000000000
--- a/vcl/unx/kde4/KDEData.cxx
+++ /dev/null
@@ -1,68 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include <QtGui/QStyle>
-#include <kapplication.h>
-
-#undef Region
-
-#include "KDEData.hxx"
-
-#include "KDEXLib.hxx"
-#include "KDESalDisplay.hxx"
-
-KDEData::~KDEData()
-{
-}
-
-void KDEData::Init()
-{
- pXLib_.reset(new KDEXLib());
- pXLib_->Init();
- SetDisplay( SalKDEDisplay::self() );
-}
-
-void KDEData::initNWF()
-{
- ImplSVData *pSVData = ImplGetSVData();
-
- // draw toolbars on separate lines
- pSVData->maNWFData.mbDockingAreaSeparateTB = true;
- // no borders for menu, theming does that
- pSVData->maNWFData.mbFlatMenu = true;
- // Qt theme engines may support a rollover menubar
- pSVData->maNWFData.mbRolloverMenubar = true;
-
- pSVData->maNWFData.mbNoFocusRects = true;
-
- // Styled menus need additional space
- QStyle *style = QApplication::style();
- pSVData->maNWFData.mnMenuFormatBorderX =
- style->pixelMetric( QStyle::PM_MenuPanelWidth ) +
- style->pixelMetric( QStyle::PM_MenuHMargin );
- pSVData->maNWFData.mnMenuFormatBorderY =
- style->pixelMetric( QStyle::PM_MenuPanelWidth ) +
- style->pixelMetric( QStyle::PM_MenuVMargin );
-}
-
-void KDEData::deInitNWF()
-{
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/KDEData.hxx b/vcl/unx/kde4/KDEData.hxx
deleted file mode 100644
index 4efd23a7df34..000000000000
--- a/vcl/unx/kde4/KDEData.hxx
+++ /dev/null
@@ -1,37 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#pragma once
-
-#include <unx/saldisp.hxx>
-#include <unx/saldata.hxx>
-
-class KDEData : public X11SalData
-{
- public:
- explicit KDEData( SalInstance *pInstance )
- : X11SalData( SAL_DATA_KDE4, pInstance ) {}
- virtual ~KDEData() override;
-
- virtual void Init() override;
- virtual void initNWF() override;
- virtual void deInitNWF() override;
-};
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/KDESalDisplay.cxx b/vcl/unx/kde4/KDESalDisplay.cxx
deleted file mode 100644
index 14a753e1c0a1..000000000000
--- a/vcl/unx/kde4/KDESalDisplay.cxx
+++ /dev/null
@@ -1,91 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include "KDESalDisplay.hxx"
-
-#include "KDEXLib.hxx"
-#include "VCLKDEApplication.hxx"
-
-#include <assert.h>
-
-SalKDEDisplay* SalKDEDisplay::selfptr = nullptr;
-
-SalKDEDisplay::SalKDEDisplay( Display* pDisp )
- : SalX11Display( pDisp )
-{
- assert( selfptr == nullptr );
- selfptr = this;
- xim_protocol = XInternAtom( pDisp_, "_XIM_PROTOCOL", False );
-}
-
-SalKDEDisplay::~SalKDEDisplay()
-{
- // in case never a frame opened
- static_cast<KDEXLib*>(GetXLib())->doStartup();
- // clean up own members
- doDestruct();
- selfptr = nullptr;
- // prevent SalDisplay from closing KApplication's display
- pDisp_ = nullptr;
-}
-
-void SalKDEDisplay::Yield()
-{
- // Prevent blocking from Drag'n'Drop events, which may have already have processed the event
- if (XEventsQueued( pDisp_, QueuedAfterReading ) == 0)
- return;
-
- DBG_ASSERT( GetSalData()->m_pInstance->GetYieldMutex()->IsCurrentThread(),
- "will crash soon since solar mutex not locked in SalKDEDisplay::Yield" );
-
- XEvent event;
- XNextEvent( pDisp_, &event );
- if( checkDirectInputEvent( &event ))
- return;
- qApp->x11ProcessEvent( &event );
-}
-
-// HACK: When using Qt event loop, input methods (japanese, etc.) will get broken because
-// of XFilterEvent() getting called twice, once by Qt, once by LO (bnc#665112).
-// This function is therefore called before any XEvent is passed to Qt event handling
-// and if it is a keyboard event and no Qt widget is the active window (i.e. we are
-// processing events for some LO window), then feed the event only to LO directly and skip Qt
-// completely. Skipped events are KeyPress, KeyRelease and also _XIM_PROTOCOL client message
-// (seems to be necessary too, hopefully there are not other internal XIM messages that
-// would need this handling).
-bool SalKDEDisplay::checkDirectInputEvent( XEvent* ev )
-{
- if( ev->xany.type == KeyPress || ev->xany.type == KeyRelease
- || ( ev->xany.type == ClientMessage && ev->xclient.message_type == xim_protocol ))
- {
- if( QApplication::activeWindow() == nullptr )
- {
- Dispatch(ev);
- return true;
- }
- }
- return false;
-}
-
-void SalKDEDisplay::TriggerUserEventProcessing()
-{
- static_cast<KDEXLib*>(GetXLib())->TriggerUserEventProcessing();
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/KDESalDisplay.hxx b/vcl/unx/kde4/KDESalDisplay.hxx
deleted file mode 100644
index 07b5ca3dadf5..000000000000
--- a/vcl/unx/kde4/KDESalDisplay.hxx
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#pragma once
-
-#include <unx/saldisp.hxx>
-
-class SalKDEDisplay : public SalX11Display
-{
- Atom xim_protocol;
- static SalKDEDisplay* selfptr;
-
-protected:
- virtual void TriggerUserEventProcessing() override;
-
-public:
- explicit SalKDEDisplay( Display* pDisp );
- virtual ~SalKDEDisplay() override;
- static SalKDEDisplay* self();
- virtual void Yield() override;
- bool checkDirectInputEvent( XEvent* ev );
-};
-
-inline SalKDEDisplay* SalKDEDisplay::self()
-{
- return selfptr;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/KDESalFrame.cxx b/vcl/unx/kde4/KDESalFrame.cxx
deleted file mode 100644
index c92551fe6ca2..000000000000
--- a/vcl/unx/kde4/KDESalFrame.cxx
+++ /dev/null
@@ -1,373 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include <memory>
-#include <QtGui/QColor>
-#include <QtGui/QStyle>
-#include <QtCore/QDebug>
-#include <QtGui/QToolTip>
-
-#include <kconfig.h>
-#include <kglobal.h>
-#include <kmenubar.h>
-#include <kconfiggroup.h>
-#include <kmainwindow.h>
-#include <kapplication.h>
-#include <ktoolbar.h>
-
-#undef Region
-
-#include "KDESalFrame.hxx"
-#include "KDEXLib.hxx"
-#include "KDESalGraphics.hxx"
-
-#include <tools/color.hxx>
-
-#include <vcl/font.hxx>
-#include <vcl/settings.hxx>
-#include <sal/log.hxx>
-
-#include <unx/fontmanager.hxx>
-
-#include <svdata.hxx>
-
-#include <boost/optional.hpp>
-
-
-KDESalFrame::KDESalFrame( SalFrame* pParent, SalFrameStyleFlags nState ) :
- X11SalFrame( pParent, nState )
-{
-}
-
-void KDESalFrame::Show( bool bVisible, bool bNoActivate )
-{
- if ( !GetParent() && ! (GetStyle() & SalFrameStyleFlags::INTRO) )
- {
- KDEXLib* pXLib = static_cast<KDEXLib*>(GetDisplay()->GetXLib());
- pXLib->doStartup();
- }
-
- X11SalFrame::Show( bVisible, bNoActivate );
-}
-
-/** Helper function to convert colors.
-*/
-static Color toColor( const QColor &rColor )
-{
- return Color( rColor.red(), rColor.green(), rColor.blue() );
-}
-
-/** Helper function to read untranslated text entry from KConfig configuration repository.
-*/
-static OUString readEntryUntranslated(
- KConfigGroup const*const pGroup, char const*const pKey)
-{
- return OUString::createFromAscii( static_cast<const char *>(pGroup->readEntryUntranslated( pKey ).toAscii()) );
-}
-
-/** Helper function to add information to Font from QFont.
-
- Mostly grabbed from the Gtk+ vclplug (salnativewidgets-gtk.cxx).
-*/
-static vcl::Font toFont( const QFont &rQFont, const css::lang::Locale& rLocale )
-{
- psp::FastPrintFontInfo aInfo;
- QFontInfo qFontInfo( rQFont );
-
- // set family name
- aInfo.m_aFamilyName = OUString( static_cast<const char *>(rQFont.family().toUtf8()), strlen( static_cast<const char *>(rQFont.family().toUtf8()) ), RTL_TEXTENCODING_UTF8 );
-
- // set italic
- aInfo.m_eItalic = ( qFontInfo.italic()? ITALIC_NORMAL: ITALIC_NONE );
-
- // set weight
- int nWeight = qFontInfo.weight();
- if ( nWeight <= QFont::Light )
- aInfo.m_eWeight = WEIGHT_LIGHT;
- else if ( nWeight <= QFont::Normal )
- aInfo.m_eWeight = WEIGHT_NORMAL;
- else if ( nWeight <= QFont::DemiBold )
- aInfo.m_eWeight = WEIGHT_SEMIBOLD;
- else if ( nWeight <= QFont::Bold )
- aInfo.m_eWeight = WEIGHT_BOLD;
- else
- aInfo.m_eWeight = WEIGHT_ULTRABOLD;
-
- // set width
- int nStretch = rQFont.stretch();
- if ( nStretch <= QFont::UltraCondensed )
- aInfo.m_eWidth = WIDTH_ULTRA_CONDENSED;
- else if ( nStretch <= QFont::ExtraCondensed )
- aInfo.m_eWidth = WIDTH_EXTRA_CONDENSED;
- else if ( nStretch <= QFont::Condensed )
- aInfo.m_eWidth = WIDTH_CONDENSED;
- else if ( nStretch <= QFont::SemiCondensed )
- aInfo.m_eWidth = WIDTH_SEMI_CONDENSED;
- else if ( nStretch <= QFont::Unstretched )
- aInfo.m_eWidth = WIDTH_NORMAL;
- else if ( nStretch <= QFont::SemiExpanded )
- aInfo.m_eWidth = WIDTH_SEMI_EXPANDED;
- else if ( nStretch <= QFont::Expanded )
- aInfo.m_eWidth = WIDTH_EXPANDED;
- else if ( nStretch <= QFont::ExtraExpanded )
- aInfo.m_eWidth = WIDTH_EXTRA_EXPANDED;
- else
- aInfo.m_eWidth = WIDTH_ULTRA_EXPANDED;
-
- SAL_INFO( "vcl.kde4", "font name BEFORE system match: \"" << aInfo.m_aFamilyName << "\"" );
-
- // match font to e.g. resolve "Sans"
- psp::PrintFontManager::get().matchFont( aInfo, rLocale );
-
- SAL_INFO( "vcl.kde4", "font match " <<
- (aInfo.m_nID != 0 ? "succeeded" : "failed") <<
- ", name AFTER: \"" << aInfo.m_aFamilyName << "\"" );
-
- // font height
- int nPointHeight = qFontInfo.pointSize();
- if ( nPointHeight <= 0 )
- nPointHeight = rQFont.pointSize();
-
- // Create the font
- vcl::Font aFont( aInfo.m_aFamilyName, Size( 0, nPointHeight ) );
- if( aInfo.m_eWeight != WEIGHT_DONTKNOW )
- aFont.SetWeight( aInfo.m_eWeight );
- if( aInfo.m_eWidth != WIDTH_DONTKNOW )
- aFont.SetWidthType( aInfo.m_eWidth );
- if( aInfo.m_eItalic != ITALIC_DONTKNOW )
- aFont.SetItalic( aInfo.m_eItalic );
- if( aInfo.m_ePitch != PITCH_DONTKNOW )
- aFont.SetPitch( aInfo.m_ePitch );
-
- return aFont;
-}
-
-/** Implementation of KDE integration's main method.
-*/
-void KDESalFrame::UpdateSettings( AllSettings& rSettings )
-{
- StyleSettings style( rSettings.GetStyleSettings() );
- bool bSetTitleFont = false;
-
- // General settings
- QPalette pal = QApplication::palette();
-
- style.SetToolbarIconSize( ToolbarIconSize::Large );
-
- // Font
- vcl::Font aFont = toFont( QApplication::font(), rSettings.GetUILanguageTag().getLocale() );
- style.BatchSetFonts( aFont, aFont );
-
- aFont.SetWeight( WEIGHT_BOLD );
- if( !bSetTitleFont )
- {
- style.SetTitleFont( aFont );
- }
- style.SetFloatTitleFont( aFont );
-
- style.SetHelpFont( toFont( QToolTip::font(), rSettings.GetUILanguageTag().getLocale()));
-
- // WM settings
- KConfig *pConfig = KGlobal::config().data();
- if ( pConfig )
- {
- const char *pKey;
-
- {
- KConfigGroup aWMGroup = pConfig->group( "WM" );
-
- pKey = "titleFont";
- if (aWMGroup.hasKey(pKey))
- {
- vcl::Font aTitleFont = toFont(aWMGroup.readEntry(pKey, QFont()),
- rSettings.GetUILanguageTag().getLocale());
- style.SetTitleFont( aTitleFont );
- bSetTitleFont = true;
- }
- }
-
- KConfigGroup aIconsGroup = pConfig->group("Icons");
-
- pKey = "Theme";
- if (aIconsGroup.hasKey(pKey))
- style.SetPreferredIconTheme( readEntryUntranslated(&aIconsGroup, pKey));
-
- //toolbar
- pKey = "toolbarFont";
- if (aIconsGroup.hasKey(pKey))
- {
- vcl::Font aToolFont = toFont(aIconsGroup.readEntry(pKey, QFont()),
- rSettings.GetUILanguageTag().getLocale());
- style.SetToolFont( aToolFont );
- }
- }
-
- // Menu
- std::unique_ptr<KMenuBar> pMenuBar = std::unique_ptr<KMenuBar>( new KMenuBar() );
- QPalette qMenuCG = pMenuBar->palette();
-
- Color aFore = toColor( pal.color( QPalette::Active, QPalette::WindowText ) );
- Color aBack = toColor( pal.color( QPalette::Active, QPalette::Window ) );
- Color aText = toColor( pal.color( QPalette::Active, QPalette::Text ) );
- Color aBase = toColor( pal.color( QPalette::Active, QPalette::Base ) );
- Color aButn = toColor( pal.color( QPalette::Active, QPalette::ButtonText ) );
- Color aMid = toColor( pal.color( QPalette::Active, QPalette::Mid ) );
- Color aHigh = toColor( pal.color( QPalette::Active, QPalette::Highlight ) );
- Color aHighText = toColor( pal.color( QPalette::Active, QPalette::HighlightedText ) );
-
- style.SetSkipDisabledInMenus( TRUE );
-
- // Foreground
- style.SetRadioCheckTextColor( aFore );
- style.SetLabelTextColor( aFore );
- style.SetDialogTextColor( aFore );
- style.SetGroupTextColor( aFore );
-
- // Text
- style.SetFieldTextColor( aText );
- style.SetFieldRolloverTextColor( aText );
- style.SetWindowTextColor( aText );
- style.SetToolTextColor( aText );
-
- // Base
- style.SetFieldColor( aBase );
- style.SetWindowColor( aBase );
- style.SetActiveTabColor( aBase );
-
- // Buttons
- style.SetButtonTextColor( aButn );
- style.SetButtonRolloverTextColor( aButn );
- style.SetButtonPressedRolloverTextColor( aButn );
-
- // Tabs
- style.SetTabTextColor( aButn );
- style.SetTabRolloverTextColor( aButn );
- style.SetTabHighlightTextColor( aButn );
-
- // Disable color
- style.SetDisableColor( toColor( pal.color( QPalette::Disabled, QPalette::WindowText ) ) );
-
- // Background
- style.BatchSetBackgrounds( aBack );
- style.SetInactiveTabColor( aBack );
-
- // Workspace
- style.SetWorkspaceColor( aMid );
-
- // Selection
- style.SetHighlightColor( aHigh );
- style.SetHighlightTextColor( aHighText );
-
- // Tooltip
- style.SetHelpColor( toColor( QToolTip::palette().color( QPalette::Active, QPalette::ToolTipBase )));
- style.SetHelpTextColor( toColor( QToolTip::palette().color( QPalette::Active, QPalette::ToolTipText )));
-
- int flash_time = QApplication::cursorFlashTime();
- style.SetCursorBlinkTime( flash_time != 0 ? flash_time/2 : STYLE_CURSOR_NOBLINKTIME );
-
- // Menu text and background color, theme specific
- Color aMenuFore = toColor( qMenuCG.color( QPalette::WindowText ) );
- Color aMenuBack = toColor( qMenuCG.color( QPalette::Window ) );
-
- style.SetMenuTextColor( aMenuFore );
- style.SetMenuBarTextColor( style.GetPersonaMenuBarTextColor().get_value_or( aMenuFore ) );
- style.SetMenuColor( aMenuBack );
- style.SetMenuBarColor( aMenuBack );
- style.SetMenuHighlightColor( toColor ( qMenuCG.color( QPalette::Highlight ) ) );
- style.SetMenuHighlightTextColor( toColor ( qMenuCG.color( QPalette::HighlightedText ) ) );
-
- // set special menubar highlight text color
- if ( QApplication::style()->inherits( "HighContrastStyle" ) )
- ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = toColor( qMenuCG.color( QPalette::HighlightedText ) );
- else
- ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = aMenuFore;
-
- // set menubar rollover color
- if ( pMenuBar->style()->styleHint( QStyle::SH_MenuBar_MouseTracking ) )
- {
- style.SetMenuBarRolloverColor( toColor ( qMenuCG.color( QPalette::Highlight ) ) );
- style.SetMenuBarRolloverTextColor( ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor );
- }
- else
- {
- style.SetMenuBarRolloverColor( aMenuBack );
- style.SetMenuBarRolloverTextColor( aMenuFore );
- }
- style.SetMenuBarHighlightTextColor(style.GetMenuHighlightTextColor());
-
- // Font
- aFont = toFont( pMenuBar->font(), rSettings.GetUILanguageTag().getLocale() );
- style.SetMenuFont( aFont );
-
- // Scroll bar size
- style.SetScrollBarSize( QApplication::style()->pixelMetric( QStyle::PM_ScrollBarExtent ) );
- style.SetMinThumbSize( QApplication::style()->pixelMetric( QStyle::PM_ScrollBarSliderMin ));
-
- // These colors are used for the ruler text and marks
- style.SetShadowColor(toColor(pal.color(QPalette::Disabled, QPalette::WindowText)));
- style.SetDarkShadowColor(toColor(pal.color(QPalette::Inactive, QPalette::WindowText)));
-
- rSettings.SetStyleSettings( style );
-}
-
-void KDESalFrame::ReleaseGraphics( SalGraphics *pGraphics )
-{
- for( int i = 0; i < nMaxGraphics; i++ )
- {
- if( m_aGraphics[i].pGraphics.get() == pGraphics )
- {
- m_aGraphics[i].bInUse = false;
- break;
- }
- }
-}
-
-void KDESalFrame::updateGraphics( bool bClear )
-{
- Drawable aDrawable = bClear ? None : GetWindow();
- for( int i = 0; i < nMaxGraphics; i++ )
- {
- if( m_aGraphics[i].bInUse )
- m_aGraphics[i].pGraphics->SetDrawable( aDrawable, GetScreenNumber() );
- }
-}
-
-SalGraphics* KDESalFrame::AcquireGraphics()
-{
- if( GetWindow() )
- {
- for( int i = 0; i < nMaxGraphics; i++ )
- {
- if( ! m_aGraphics[i].bInUse )
- {
- m_aGraphics[i].bInUse = true;
- if( ! m_aGraphics[i].pGraphics )
- {
- m_aGraphics[i].pGraphics.reset( new KDESalGraphics );
- m_aGraphics[i].pGraphics->Init( this, GetWindow(), GetScreenNumber() );
- }
- return m_aGraphics[i].pGraphics.get();
- }
- }
- }
-
- return nullptr;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/KDESalFrame.hxx b/vcl/unx/kde4/KDESalFrame.hxx
deleted file mode 100644
index 114cd49bd8d2..000000000000
--- a/vcl/unx/kde4/KDESalFrame.hxx
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#pragma once
-
-#include <memory>
-
-#include <unx/saldisp.hxx>
-#include <unx/salframe.h>
-#include <unx/salgdi.h>
-
-class KDESalFrame : public X11SalFrame
-{
- private:
- static const int nMaxGraphics = 2;
-
- struct GraphicsHolder
- {
- std::unique_ptr<X11SalGraphics> pGraphics;
- bool bInUse;
-
- GraphicsHolder() : bInUse( false ) {}
- };
-
- GraphicsHolder m_aGraphics[ nMaxGraphics ];
-
- public:
- KDESalFrame( SalFrame* pParent, SalFrameStyleFlags nStyle );
-
- virtual SalGraphics* AcquireGraphics() override;
- virtual void ReleaseGraphics( SalGraphics *pGraphics ) override;
- virtual void updateGraphics( bool bClear ) override;
- virtual void UpdateSettings( AllSettings& rSettings ) override;
- virtual void Show( bool bVisible, bool bNoActivate = false ) override;
-};
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/KDESalGraphics.cxx b/vcl/unx/kde4/KDESalGraphics.cxx
deleted file mode 100644
index b36e8abd4762..000000000000
--- a/vcl/unx/kde4/KDESalGraphics.cxx
+++ /dev/null
@@ -1,1025 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include <QtGui/QStyle>
-#include <QtGui/QStyleOption>
-#include <QtGui/QPainter>
-#include <QtGui/QFrame>
-#include <QtGui/QLabel>
-
-#include <kapplication.h>
-#include <kdebug.h>
-
-#undef Region
-
-#include "KDESalGraphics.hxx"
-#include "KDESalInstance.hxx"
-
-#include <vcl/settings.hxx>
-#include <vcl/decoview.hxx>
-#include <rtl/ustrbuf.hxx>
-
-/**
- Conversion function between VCL ControlState together with
- ImplControlValue and Qt state flags.
- @param nControlState State of the widget (default, focused, ...) in Native Widget Framework.
- @param aValue Value held by the widget (on, off, ...)
-*/
-static QStyle::State vclStateValue2StateFlag( ControlState nControlState,
- const ImplControlValue& aValue )
-{
- QStyle::State nState =
- ( (nControlState & ControlState::ENABLED)? QStyle::State_Enabled: QStyle::State_None ) |
- ( (nControlState & ControlState::FOCUSED)? QStyle::State_HasFocus: QStyle::State_None ) |
- ( (nControlState & ControlState::PRESSED)? QStyle::State_Sunken: QStyle::State_None ) |
- ( (nControlState & ControlState::SELECTED)? QStyle::State_Selected : QStyle::State_None ) |
- ( (nControlState & ControlState::ROLLOVER)? QStyle::State_MouseOver: QStyle::State_None );
-
- switch ( aValue.getTristateVal() )
- {
- case ButtonValue::On: nState |= QStyle::State_On; break;
- case ButtonValue::Off: nState |= QStyle::State_Off; break;
- case ButtonValue::Mixed: nState |= QStyle::State_NoChange; break;
- default: break;
- }
-
- return nState;
-}
-
-/**
- Convert tools::Rectangle to QRect.
- @param rControlRegion The tools::Rectangle to convert.
- @return The matching QRect
-*/
-static QRect region2QRect( const tools::Rectangle& rControlRegion )
-{
- return QRect(rControlRegion.Left(), rControlRegion.Top(), rControlRegion.GetWidth(), rControlRegion.GetHeight());
-}
-
-bool KDESalGraphics::IsNativeControlSupported( ControlType type, ControlPart part )
-{
- switch (type)
- {
- case ControlType::Pushbutton:
- case ControlType::Radiobutton:
- case ControlType::Checkbox:
- case ControlType::Tooltip:
- case ControlType::Progress:
- case ControlType::ListNode:
- return (part == ControlPart::Entire);
-
- case ControlType::Menubar:
- case ControlType::MenuPopup:
- case ControlType::Editbox:
- case ControlType::MultilineEditbox:
- case ControlType::Combobox:
- case ControlType::Toolbar:
- case ControlType::Frame:
- case ControlType::Scrollbar:
- case ControlType::WindowBackground:
- case ControlType::Fixedline:
- return true;
-
- case ControlType::Listbox:
- return (part == ControlPart::Entire || part == ControlPart::HasBackgroundTexture);
-
- case ControlType::Spinbox:
- return (part == ControlPart::Entire || part == ControlPart::HasBackgroundTexture);
-
- case ControlType::Slider:
- return (part == ControlPart::TrackHorzArea || part == ControlPart::TrackVertArea);
-
- default:
- break;
- }
-
- return false;
-}
-
-/// helper drawing methods
-namespace
-{
- void draw( QStyle::ControlElement element, QStyleOption* option, QImage* image, QStyle::State const & state, QRect rect = QRect())
- {
- option->state |= state;
- option->rect = !rect.isNull() ? rect : image->rect();
-
- QPainter painter(image);
- QApplication::style()->drawControl(element, option, &painter);
- }
-
- void draw( QStyle::PrimitiveElement element, QStyleOption* option, QImage* image, QStyle::State const & state, QRect rect = QRect())
- {
- option->state |= state;
- option->rect = !rect.isNull() ? rect : image->rect();
-
- QPainter painter(image);
- QApplication::style()->drawPrimitive(element, option, &painter);
- }
-
- void draw( QStyle::ComplexControl element, QStyleOptionComplex* option, QImage* image, QStyle::State const & state )
- {
- option->state |= state;
- option->rect = image->rect();
-
- QPainter painter(image);
- QApplication::style()->drawComplexControl(element, option, &painter);
- }
-
- void lcl_drawFrame( QStyle::PrimitiveElement element, QImage* image, QStyle::State const & state,
- QStyle::PixelMetric eLineMetric = QStyle::PM_DefaultFrameWidth )
- {
- #if ( QT_VERSION >= QT_VERSION_CHECK( 4, 5, 0 ) )
- QStyleOptionFrameV3 option;
- option.frameShape = QFrame::StyledPanel;
- option.state = QStyle::State_Sunken;
- option.lineWidth = QApplication::style()->pixelMetric( eLineMetric );
- #else
- QStyleOptionFrame option;
-
- QFrame aFrame( nullptr );
- aFrame.setFrameRect( QRect(0, 0, image->width(), image->height()) );
- aFrame.setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
- aFrame.ensurePolished();
-
- option.initFrom( &aFrame );
- option.lineWidth = aFrame.lineWidth();
- option.midLineWidth = aFrame.midLineWidth();
- #endif
- draw(element, &option, image, state);
- }
-}
-
-#if QT_VERSION >= QT_VERSION_CHECK( 4, 5, 0 )
-#define IMAGE_BASED_PAINTING
-#else
-#undef IMAGE_BASED_PAINTING
-#endif
-
-#ifdef IMAGE_BASED_PAINTING
-// There is a small catch with this function, although hopefully only philosophical.
-// Officially Xlib's vcl::Region is an opaque data type, with only functions for manipulating it.
-// However, whoever designed it apparently didn't give it that much thought, as it's impossible
-// to find out what exactly a region actually is (except for really weird ways like XClipBox()
-// and repeated XPointInRegion(), which would be awfully slow). Fortunately, the header file
-// describing the structure actually happens to be installed too, and there's at least one
-// widely used software using it (Compiz). So access the data directly too and assume that
-// everybody who compiles with Qt4 support has Xlib new enough and good enough to support this.
-// In case this doesn't work for somebody, try #include <X11/region.h> instead, or build
-// without IMAGE_BASED_PAINTING (in which case QApplication::setGraphicsSystem( "native" ) may
-// be needed too).
-#include <X11/Xregion.h>
-static QRegion XRegionToQRegion( Region xr )
-{
- QRegion qr;
- for( long i = 0;
- i < xr->numRects;
- ++i )
- {
- BOX& b = xr->rects[ i ];
- qr |= QRect( b.x1, b.y1, b.x2 - b.x1, b.y2 - b.y1 ); // x2,y2 is outside, not the bottom-right corner
- }
- return qr;
-}
-#endif
-
-bool KDESalGraphics::drawNativeControl( ControlType type, ControlPart part,
- const tools::Rectangle& rControlRegion, ControlState nControlState,
- const ImplControlValue& value,
- const OUString& )
-{
- bool nativeSupport = IsNativeControlSupported( type, part );
- if( ! nativeSupport ) {
- assert( ! nativeSupport && "drawNativeControl called without native support!" );
- return false;
- }
-
- if( lastPopupRect.isValid() && ( type != ControlType::MenuPopup || part != ControlPart::MenuItem ))
- lastPopupRect = QRect();
-
- bool returnVal = true;
-
- QRect widgetRect = region2QRect(rControlRegion);
-
- //if no image, or resized, make a new image
- if (!m_image || m_image->size() != widgetRect.size())
- {
- m_image.reset(new QImage( widgetRect.width(), widgetRect.height(), QImage::Format_ARGB32 ) );
- }
-
- // Default image color - just once
- switch (type)
- {
- case ControlType::MenuPopup:
- if( part == ControlPart::MenuItemCheckMark || part == ControlPart::MenuItemRadioMark )
- {
- // it is necessary to fill the background transparently first, as this
- // is painted after menuitem highlight, otherwise there would be a grey area
- m_image->fill( Qt::transparent );
- break;
- }
- [[fallthrough]]; // QPalette::Window
- case ControlType::Menubar:
- case ControlType::WindowBackground:
- m_image->fill( KApplication::palette().color(QPalette::Window).rgb() );
- break;
- case ControlType::Tooltip:
- m_image->fill(KApplication::palette().color(QPalette::ToolTipBase).rgb());
- break;
- case ControlType::Pushbutton:
- m_image->fill(KApplication::palette().color(QPalette::Button).rgb());
- break;
- case ControlType::Scrollbar:
- if ((part == ControlPart::DrawBackgroundVert)
- || (part == ControlPart::DrawBackgroundHorz))
- {
- m_image->fill( KApplication::palette().color(QPalette::Window).rgb() );
- break;
- }
- [[fallthrough]]; // Qt::transparent
- default:
- m_image->fill( Qt::transparent );
- break;
- }
-
- QRegion* localClipRegion = nullptr;
-
- if (type == ControlType::Pushbutton)
- {
- QStyleOptionButton option;
- draw( QStyle::CE_PushButton, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value) );
- }
- else if (type == ControlType::Menubar)
- {
- if (part == ControlPart::MenuItem)
- {
- QStyleOptionMenuItem option;
- if ( ( nControlState & ControlState::ROLLOVER )
- && QApplication::style()->styleHint( QStyle::SH_MenuBar_MouseTracking ) )
- option.state |= QStyle::State_Selected;
-
- if ( nControlState & ControlState::SELECTED ) // Passing State_Sunken is currently not documented.
- option.state |= QStyle::State_Sunken; // But some kinds of QStyle interpret it.
-
- draw( QStyle::CE_MenuBarItem, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value) );
- }
- else if (part == ControlPart::Entire)
- {
- QStyleOptionMenuItem option;
- draw( QStyle::CE_MenuBarEmptyArea, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value) );
- }
- else
- {
- returnVal = false;
- }
- }
- else if (type == ControlType::MenuPopup)
- {
- OSL_ASSERT( part == ControlPart::MenuItem ? lastPopupRect.isValid() : !lastPopupRect.isValid());
- if( part == ControlPart::MenuItem )
- {
- QStyleOptionMenuItem option;
- draw( QStyle::CE_MenuItem, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value) );
- // HACK: LO core first paints the entire popup and only then it paints menu items,
- // but QMenu::paintEvent() paints popup frame after all items. That means highlighted
- // items here would paint the highlight over the frame border. Since calls to ControlPart::MenuItem
- // are always preceded by calls to ControlPart::Entire, just remember the size for the whole
- // popup (otherwise not possible to get here) and draw the border afterwards.
- QRect framerect( lastPopupRect.topLeft() - widgetRect.topLeft(),
- widgetRect.size().expandedTo( lastPopupRect.size()));
- QStyleOptionFrame frame;
- draw( QStyle::PE_FrameMenu, &frame, m_image.get(), vclStateValue2StateFlag( nControlState, value ), framerect );
- }
- else if( part == ControlPart::Separator )
- {
- QStyleOptionMenuItem option;
- option.menuItemType = QStyleOptionMenuItem::Separator;
- // Painting the whole menu item area results in different background
- // with at least Plastique style, so clip only to the separator itself
- // (QSize( 2, 2 ) is hardcoded in Qt)
- option.rect = m_image->rect();
- QSize size = QApplication::style()->sizeFromContents( QStyle::CT_MenuItem, &option, QSize( 2, 2 ));
- QRect rect = m_image->rect();
- QPoint center = rect.center();
- rect.setHeight( size.height());
- rect.moveCenter( center );
- // don't paint over popup frame border (like the hack above, but here it can be simpler)
- int fw = QApplication::style()->pixelMetric( QStyle::PM_MenuPanelWidth );
- localClipRegion = new QRegion(rect.translated(widgetRect.topLeft()).adjusted(fw, 0, -fw, 0));
- draw( QStyle::CE_MenuItem, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value), rect );
- }
- else if( part == ControlPart::MenuItemCheckMark || part == ControlPart::MenuItemRadioMark )
- {
- QStyleOptionMenuItem option;
- option.checkType = ( part == ControlPart::MenuItemCheckMark )
- ? QStyleOptionMenuItem::NonExclusive : QStyleOptionMenuItem::Exclusive;
- option.checked = bool( nControlState & ControlState::PRESSED );
- // widgetRect is now the rectangle for the checkbox/radiobutton itself, but Qt
- // paints the whole menu item, so translate position (and it'll be clipped);
- // it is also necessary to fill the background transparently first, as this
- // is painted after menuitem highlight, otherwise there would be a grey area
- assert( value.getType() == ControlType::MenuPopup );
- const MenupopupValue* menuVal = static_cast<const MenupopupValue*>(&value);
- QRect menuItemRect( region2QRect( menuVal->maItemRect ));
- QRect rect( menuItemRect.topLeft() - widgetRect.topLeft(),
- widgetRect.size().expandedTo( menuItemRect.size()));
- // checkboxes are always displayed next to images in menus, so are never centered
- const int focus_size = QApplication::style()->pixelMetric( QStyle::PM_FocusFrameHMargin );
- rect.moveTo( -focus_size, rect.y() );
- draw( QStyle::CE_MenuItem, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState & ~ControlState::PRESSED, value), rect );
- }
- else if( part == ControlPart::Entire )
- {
- QStyleOptionMenuItem option;
- draw( QStyle::PE_PanelMenu, &option, m_image.get(), vclStateValue2StateFlag( nControlState, value ));
- // Try hard to get any frame!
- QStyleOptionFrame frame;
- draw( QStyle::PE_FrameMenu, &frame, m_image.get(), vclStateValue2StateFlag( nControlState, value ));
- draw( QStyle::PE_FrameWindow, &frame, m_image.get(), vclStateValue2StateFlag( nControlState, value ));
- lastPopupRect = widgetRect;
- }
- else
- returnVal = false;
- }
- else if ( (type == ControlType::Toolbar) && (part == ControlPart::Button) )
- {
- QStyleOptionToolButton option;
-
- option.arrowType = Qt::NoArrow;
- option.subControls = QStyle::SC_ToolButton;
-
- option.state = vclStateValue2StateFlag( nControlState, value );
- option.state |= QStyle::State_Raised | QStyle::State_Enabled | QStyle::State_AutoRaise;
-
- draw( QStyle::CC_ToolButton, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value) );
- }
- else if ( (type == ControlType::Toolbar) && (part == ControlPart::Entire) )
- {
- QStyleOptionToolBar option;
-
- option.rect = QRect(0, 0, widgetRect.width(), widgetRect.height());
- option.state = vclStateValue2StateFlag( nControlState, value );
-
- draw( QStyle::CE_ToolBar, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value) );
- }
- else if ( (type == ControlType::Toolbar)
- && (part == ControlPart::ThumbVert || part == ControlPart::ThumbHorz) )
- { // reduce paint area only to the handle area
- const int handleExtend = QApplication::style()->pixelMetric(QStyle::PM_ToolBarHandleExtent);
- QRect rect;
- QStyleOption option;
-
- if (part == ControlPart::ThumbVert)
- {
- rect = QRect( 0, 0, handleExtend, widgetRect.height());
- localClipRegion = new QRegion(widgetRect.x(), widgetRect.y(), handleExtend, widgetRect.height());
- option.state = QStyle::State_Horizontal;
- }
- else
- {
- rect = QRect( 0, 0, widgetRect.width(), handleExtend);
- localClipRegion = new QRegion(widgetRect.x(), widgetRect.y(), widgetRect.width(), handleExtend);
- }
-
- draw( QStyle::PE_IndicatorToolBarHandle, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value), rect );
- }
- else if (type == ControlType::Editbox)
- {
- lcl_drawFrame( QStyle::PE_PanelLineEdit, m_image.get(),
- vclStateValue2StateFlag(nControlState, value));
- }
- else if (type == ControlType::MultilineEditbox)
- {
- lcl_drawFrame( QStyle::PE_FrameLineEdit, m_image.get(),
- vclStateValue2StateFlag(nControlState, value));
- }
- else if (type == ControlType::Combobox)
- {
- QStyleOptionComboBox option;
- option.editable = true;
- draw( QStyle::CC_ComboBox, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value) );
- }
- else if (type == ControlType::Listbox)
- {
- QStyleOptionComboBox option;
- option.editable = false;
- switch (part) {
- case ControlPart::ListboxWindow:
- lcl_drawFrame( QStyle::PE_Frame, m_image.get(),
- vclStateValue2StateFlag(nControlState, value),
- QStyle::PM_ComboBoxFrameWidth );
- break;
- case ControlPart::SubEdit:
- draw( QStyle::CE_ComboBoxLabel, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value) );
- break;
- case ControlPart::Entire:
- draw( QStyle::CC_ComboBox, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value) );
- break;
- case ControlPart::ButtonDown:
- option.subControls = QStyle::SC_ComboBoxArrow;
- draw( QStyle::CC_ComboBox, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value) );
- break;
- default:
- returnVal = false;
- break;
- }
- }
- else if (type == ControlType::ListNode)
- {
- QStyleOption option;
- option.state = QStyle::State_Item | QStyle::State_Children;
-
- if (value.getTristateVal() == ButtonValue::On)
- option.state |= QStyle::State_Open;
-
- draw( QStyle::PE_IndicatorBranch, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value) );
- }
- else if (type == ControlType::Checkbox)
- {
- QStyleOptionButton option;
- draw( QStyle::CE_CheckBox, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value) );
- }
- else if (type == ControlType::Scrollbar)
- {
- if ((part == ControlPart::DrawBackgroundVert) || (part == ControlPart::DrawBackgroundHorz))
- {
- QStyleOptionSlider option;
- OSL_ASSERT( value.getType() == ControlType::Scrollbar );
- const ScrollbarValue* sbVal = static_cast<const ScrollbarValue *>(&value);
-
- //if the scroll bar is active (aka not degenerate... allow for hover events)
- if (sbVal->mnVisibleSize < sbVal->mnMax)
- option.state = QStyle::State_MouseOver;
-
- bool horizontal = ( part == ControlPart::DrawBackgroundHorz ); //horizontal or vertical
- option.orientation = horizontal ? Qt::Horizontal : Qt::Vertical;
- if( horizontal )
- option.state |= QStyle::State_Horizontal;
-
- //setup parameters from the OO values
- option.minimum = sbVal->mnMin;
- option.maximum = sbVal->mnMax - sbVal->mnVisibleSize;
- option.maximum = qMax( option.maximum, option.minimum ); // bnc#619772
- option.sliderValue = sbVal->mnCur;
- option.sliderPosition = sbVal->mnCur;
- option.pageStep = sbVal->mnVisibleSize;
- if (part == ControlPart::DrawBackgroundHorz)
- option.upsideDown = sbVal->maButton1Rect.Left() > sbVal->maButton2Rect.Left();
-
- //setup the active control... always the slider
- if (sbVal->mnThumbState & ControlState::ROLLOVER)
- option.activeSubControls = QStyle::SC_ScrollBarSlider;
-
- draw( QStyle::CC_ScrollBar, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value) );
- }
- else
- {
- returnVal = false;
- }
- }
- else if (type == ControlType::Spinbox)
- {
- QStyleOptionSpinBox option;
- option.frame = true;
-
- // determine active control
- if( value.getType() == ControlType::SpinButtons )
- {
- const SpinbuttonValue* pSpinVal = static_cast<const SpinbuttonValue *>(&value);
- if( pSpinVal->mnUpperState & ControlState::PRESSED )
- option.activeSubControls |= QStyle::SC_SpinBoxUp;
- if( pSpinVal->mnLowerState & ControlState::PRESSED )
- option.activeSubControls |= QStyle::SC_SpinBoxDown;
- if( pSpinVal->mnUpperState & ControlState::ENABLED )
- option.stepEnabled |= QAbstractSpinBox::StepUpEnabled;
- if( pSpinVal->mnLowerState & ControlState::ENABLED )
- option.stepEnabled |= QAbstractSpinBox::StepDownEnabled;
- if( pSpinVal->mnUpperState & ControlState::ROLLOVER )
- option.state = QStyle::State_MouseOver;
- if( pSpinVal->mnLowerState & ControlState::ROLLOVER )
- option.state = QStyle::State_MouseOver;
- }
-
- draw( QStyle::CC_SpinBox, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value) );
- }
- else if (type == ControlType::Radiobutton)
- {
- QStyleOptionButton option;
- draw( QStyle::CE_RadioButton, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value) );
- }
- else if (type == ControlType::Tooltip)
- {
- QStyleOption option;
- draw( QStyle::PE_PanelTipLabel, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value) );
- }
- else if (type == ControlType::Frame)
- {
- lcl_drawFrame( QStyle::PE_Frame, m_image.get(),
- vclStateValue2StateFlag(nControlState, value) );
- // draw just the border, see http://qa.openoffice.org/issues/show_bug.cgi?id=107945
- int fw = QApplication::style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
- localClipRegion = new QRegion(QRegion(widgetRect).subtracted(widgetRect.adjusted(fw, fw, -fw, -fw)));
- }
- else if (type == ControlType::WindowBackground)
- {
- // Nothing to do - see "Default image color" switch ^^
- }
- else if (type == ControlType::Fixedline)
- {
- QStyleOptionMenuItem option;
- option.menuItemType = QStyleOptionMenuItem::Separator;
- option.state |= QStyle::State_Item;
-
- draw( QStyle::CE_MenuItem, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value) );
- }
- else if (type == ControlType::Slider && (part == ControlPart::TrackHorzArea || part == ControlPart::TrackVertArea))
- {
- OSL_ASSERT( value.getType() == ControlType::Slider );
- const SliderValue* slVal = static_cast<const SliderValue *>(&value);
- QStyleOptionSlider option;
-
- option.rect = QRect(0, 0, widgetRect.width(), widgetRect.height());
- option.state = vclStateValue2StateFlag( nControlState, value );
- option.maximum = slVal->mnMax;
- option.minimum = slVal->mnMin;
- option.sliderPosition = option.sliderValue = slVal->mnCur;
- bool horizontal = ( part == ControlPart::TrackHorzArea ); //horizontal or vertical
- option.orientation = horizontal ? Qt::Horizontal : Qt::Vertical;
- if( horizontal )
- option.state |= QStyle::State_Horizontal;
-
- draw( QStyle::CC_Slider, &option, m_image.get(), vclStateValue2StateFlag(nControlState, value) );
- }
- else if( type == ControlType::Progress && part == ControlPart::Entire )
- {
- QStyleOptionProgressBarV2 option;
- option.minimum = 0;
- option.maximum = widgetRect.width();
- option.progress = value.getNumericVal();
- option.rect = QRect(0, 0, widgetRect.width(), widgetRect.height());
- option.state = vclStateValue2StateFlag( nControlState, value );
-
- draw( QStyle::CE_ProgressBar, &option, m_image.get(),
- vclStateValue2StateFlag(nControlState, value) );
- }
- else
- {
- returnVal = false;
- }
-
- if (returnVal)
- {
-#ifdef IMAGE_BASED_PAINTING
- // Create a wrapper QPixmap around the destination pixmap, allowing the use of QPainter.
- // Using X11SalGraphics::CopyScreenArea() would require using QPixmap and if Qt uses
- // other graphics system than native, QPixmap::handle() would be 0 (i.e. it wouldn't work),
- // I have no idea how to create QPixmap with non-null handle() in such case, so go this way.
- // See XRegionToQRegion() comment for a small catch (although not real hopefully).
- QPixmap destPixmap = QPixmap::fromX11Pixmap( GetDrawable(), QPixmap::ExplicitlyShared );
- QPainter paint( &destPixmap );
- if (localClipRegion && mpClipRegion)
- paint.setClipRegion(localClipRegion->intersected(XRegionToQRegion(mpClipRegion)));
- else if (localClipRegion)
- paint.setClipRegion(*localClipRegion);
- else if( mpClipRegion )
- paint.setClipRegion( XRegionToQRegion( mpClipRegion ));
- paint.drawImage( widgetRect.left(), widgetRect.top(), *m_image,
- 0, 0, widgetRect.width(), widgetRect.height(),
- Qt::ColorOnly | Qt::OrderedDither | Qt::OrderedAlphaDither );
-#else
- GC gc = GetFontGC();
- if( gc )
- {
- Region pTempClipRegion = NULL;
- if (localClipRegion)
- {
- pTempClipRegion = XCreateRegion();
- foreach(const QRect& r, localClipRegion->rects())
- {
- XRectangle xr;
- xr.x = r.x();
- xr.y = r.y();
- xr.width = r.width();
- xr.height = r.height();
- XUnionRectWithRegion( &xr, pTempClipRegion, pTempClipRegion );
- }
- if( mpClipRegion )
- XIntersectRegion( pTempClipRegion, mpClipRegion, pTempClipRegion );
- XSetRegion( GetXDisplay(), gc, pTempClipRegion );
- }
- QPixmap pixmap = QPixmap::fromImage(*m_image, Qt::ColorOnly | Qt::OrderedDither | Qt::OrderedAlphaDither);
- X11SalGraphics::CopyScreenArea( GetXDisplay(),
- pixmap.handle(), pixmap.x11Info().screen(), pixmap.x11Info().depth(),
- GetDrawable(), GetScreenNumber(), GetVisual().GetDepth(),
- gc, 0, 0, widgetRect.width(), widgetRect.height(), widgetRect.left(), widgetRect.top());
-
- if( pTempClipRegion )
- {
- if( mpClipRegion )
- XSetRegion( GetXDisplay(), gc, mpClipRegion );
- else
- XSetClipMask( GetXDisplay(), gc, None );
- XDestroyRegion( pTempClipRegion );
- }
- }
- else
- returnVal = false;
-#endif
- }
- delete localClipRegion;
- return returnVal;
-}
-
-bool KDESalGraphics::getNativeControlRegion( ControlType type, ControlPart part,
- const tools::Rectangle& controlRegion, ControlState controlState,
- const ImplControlValue& val,
- const OUString&,
- tools::Rectangle &nativeBoundingRegion, tools::Rectangle &nativeContentRegion )
-{
- bool retVal = false;
-
- QRect boundingRect = region2QRect( controlRegion );
- QRect contentRect = boundingRect;
- QStyleOptionComplex styleOption;
-
- switch ( type )
- {
- // Metrics of the push button
- case ControlType::Pushbutton:
- if (part == ControlPart::Entire)
- {
- styleOption.state = vclStateValue2StateFlag(controlState, val);
-
- if ( controlState & ControlState::DEFAULT )
- {
- int size = QApplication::style()->pixelMetric(
- QStyle::PM_ButtonDefaultIndicator, &styleOption );
- boundingRect.adjust( -size, -size, size, size );
- retVal = true;
- }
- }
- break;
- case ControlType::Editbox:
- case ControlType::MultilineEditbox:
- {
- QStyleOptionFrameV3 fo;
- fo.frameShape = QFrame::StyledPanel;
- fo.state = QStyle::State_Sunken;
- fo.lineWidth = QApplication::style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
- QSize aMinSize = QApplication::style()->
- sizeFromContents( QStyle::CT_LineEdit, &fo, contentRect.size() );
- if( aMinSize.height() > boundingRect.height() )
- {
- int nHeight = (aMinSize.height() - boundingRect.height()) / 2;
- assert( 0 == (aMinSize.height() - boundingRect.height()) % 2 );
- boundingRect.adjust( 0, -nHeight, 0, nHeight );
- }
- if( aMinSize.width() > boundingRect.width() )
- {
- int nWidth = (aMinSize.width() - boundingRect.width()) / 2;
- assert( 0 == (aMinSize.width() - boundingRect.width()) % 2 );
- boundingRect.adjust( -nWidth, 0, nWidth, 0 );
- }
- retVal = true;
- break;
- }
- case ControlType::Checkbox:
- if (part == ControlPart::Entire)
- {
- styleOption.state = vclStateValue2StateFlag(controlState, val);
-
- contentRect.setWidth(QApplication::style()->pixelMetric(
- QStyle::PM_IndicatorWidth, &styleOption));
- contentRect.setHeight(QApplication::style()->pixelMetric(
- QStyle::PM_IndicatorHeight, &styleOption));
-
- contentRect.adjust(0, 0,
- 2 * QApplication::style()->pixelMetric(
- QStyle::PM_FocusFrameHMargin, &styleOption),
- 2 * QApplication::style()->pixelMetric(
- QStyle::PM_FocusFrameVMargin, &styleOption)
- );
-
- boundingRect = contentRect;
-
- retVal = true;
- }
- break;
- case ControlType::Combobox:
- case ControlType::Listbox:
- {
- QStyleOptionComboBox cbo;
-
- cbo.rect = QRect(0, 0, contentRect.width(), contentRect.height());
- cbo.state = vclStateValue2StateFlag(controlState, val);
-
- switch ( part )
- {
- case ControlPart::Entire:
- {
- // find out the minimum size that should be used
- // assume contents is a text ling
- int nHeight = QApplication::fontMetrics().height();
- QSize aContentSize( contentRect.width(), nHeight );
- QSize aMinSize = QApplication::style()->
- sizeFromContents( QStyle::CT_ComboBox, &cbo, aContentSize );
- if( aMinSize.height() > contentRect.height() )
- contentRect.adjust( 0, 0, 0, aMinSize.height() - contentRect.height() );
- boundingRect = contentRect;
- retVal = true;
- break;
- }
- case ControlPart::ButtonDown:
- contentRect = QApplication::style()->subControlRect(
- QStyle::CC_ComboBox, &cbo, QStyle::SC_ComboBoxArrow );
- contentRect.translate( boundingRect.left(), boundingRect.top() );
- retVal = true;
- break;
- case ControlPart::SubEdit:
- {
- contentRect = QApplication::style()->subControlRect(
- QStyle::CC_ComboBox, &cbo, QStyle::SC_ComboBoxEditField );
- contentRect.translate( boundingRect.left(), boundingRect.top() );
- retVal = true;
- break;
- }
- default:
- break;
- }
- break;
- }
- case ControlType::Spinbox:
- {
- QStyleOptionSpinBox sbo;
- sbo.frame = true;
-
- sbo.rect = QRect(0, 0, contentRect.width(), contentRect.height());
- sbo.state = vclStateValue2StateFlag(controlState, val);
-
- switch ( part )
- {
- case ControlPart::Entire:
- {
- int nHeight = QApplication::fontMetrics().height();
- QSize aContentSize( contentRect.width(), nHeight );
- QSize aMinSize = QApplication::style()->
- sizeFromContents( QStyle::CT_SpinBox, &sbo, aContentSize );
- if( aMinSize.height() > contentRect.height() )
- contentRect.adjust( 0, 0, 0, aMinSize.height() - contentRect.height() );
- boundingRect = contentRect;
- retVal = true;
- break;
- }
- case ControlPart::ButtonUp:
- contentRect = QApplication::style()->subControlRect(
- QStyle::CC_SpinBox, &sbo, QStyle::SC_SpinBoxUp );
- contentRect.translate( boundingRect.left(), boundingRect.top() );
- retVal = true;
- boundingRect = QRect();
- break;
-
- case ControlPart::ButtonDown:
- contentRect = QApplication::style()->subControlRect(
- QStyle::CC_SpinBox, &sbo, QStyle::SC_SpinBoxDown );
- retVal = true;
- contentRect.translate( boundingRect.left(), boundingRect.top() );
- boundingRect = QRect();
- break;
-
- case ControlPart::SubEdit:
- contentRect = QApplication::style()->subControlRect(
- QStyle::CC_SpinBox, &sbo, QStyle::SC_SpinBoxEditField );
- retVal = true;
- contentRect.translate( boundingRect.left(), boundingRect.top() );
- break;
- default:
- break;
- }
- break;
- }
- case ControlType::MenuPopup:
- {
- int h, w;
- switch ( part ) {
- case ControlPart::MenuItemCheckMark:
- h = QApplication::style()->pixelMetric(QStyle::PM_IndicatorHeight);
- w = QApplication::style()->pixelMetric(QStyle::PM_IndicatorWidth);
- retVal = true;
- break;
- case ControlPart::MenuItemRadioMark:
- h = QApplication::style()->pixelMetric(QStyle::PM_ExclusiveIndicatorHeight);
- w = QApplication::style()->pixelMetric(QStyle::PM_ExclusiveIndicatorWidth);
- retVal = true;
- break;
- default:
- break;
- }
- if (retVal) {
- contentRect = QRect(0, 0, w, h);
- boundingRect = contentRect;
- }
- break;
- }
- case ControlType::Frame:
- {
- if( part == ControlPart::Border )
- {
- auto nStyle = static_cast<DrawFrameFlags>(
- val.getNumericVal() & 0xFFF0);
- if( nStyle & DrawFrameFlags::NoDraw )
- {
- int nFrameWidth = QApplication::style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
- contentRect.adjust(nFrameWidth, nFrameWidth, -nFrameWidth, -nFrameWidth);
- }
- retVal = true;
- }
- break;
- }
- case ControlType::Radiobutton:
- {
- const int h = QApplication::style()->pixelMetric(QStyle::PM_ExclusiveIndicatorHeight);
- const int w = QApplication::style()->pixelMetric(QStyle::PM_ExclusiveIndicatorWidth);
-
- contentRect = QRect(boundingRect.left(), boundingRect.top(), w, h);
- contentRect.adjust(0, 0,
- 2 * QApplication::style()->pixelMetric(
- QStyle::PM_FocusFrameHMargin, &styleOption),
- 2 * QApplication::style()->pixelMetric(
- QStyle::PM_FocusFrameVMargin, &styleOption)
- );
- boundingRect = contentRect;
-
- retVal = true;
- break;
- }
- case ControlType::Slider:
- {
- const int w = QApplication::style()->pixelMetric(QStyle::PM_SliderLength);
- if( part == ControlPart::ThumbHorz )
- {
- contentRect = QRect(boundingRect.left(), boundingRect.top(), w, boundingRect.height());
- boundingRect = contentRect;
- retVal = true;
- }
- else if( part == ControlPart::ThumbVert )
- {
- contentRect = QRect(boundingRect.left(), boundingRect.top(), boundingRect.width(), w);
- boundingRect = contentRect;
- retVal = true;
- }
- break;
- }
- case ControlType::Toolbar:
- {
- const int nWorH = QApplication::style()->pixelMetric(QStyle::PM_ToolBarHandleExtent);
- if( part == ControlPart::ThumbHorz )
- {
- contentRect = QRect(boundingRect.left(), boundingRect.top(), boundingRect.width(), nWorH );
- boundingRect = contentRect;
- retVal = true;
- }
- else if( part == ControlPart::ThumbVert )
- {
- contentRect = QRect(boundingRect.left(), boundingRect.top(), nWorH, boundingRect.height() );
- boundingRect = contentRect;
- retVal = true;
- }
- break;
- }
- case ControlType::Scrollbar:
- {
- // core can't handle 3-button scrollbars well, so we fix that in hitTestNativeControl(),
- // for the rest also provide the track area (i.e. area not taken by buttons)
- if( part == ControlPart::TrackVertArea || part == ControlPart::TrackHorzArea )
- {
- QStyleOptionSlider option;
- bool horizontal = ( part == ControlPart::TrackHorzArea ); //horizontal or vertical
- option.orientation = horizontal ? Qt::Horizontal : Qt::Vertical;
- if( horizontal )
- option.state |= QStyle::State_Horizontal;
- // getNativeControlRegion usually gets ImplControlValue as 'val' (i.e. not the proper
- // subclass), so use random sensible values (doesn't matter anyway, as the wanted
- // geometry here depends only on button sizes)
- option.maximum = 10;
- option.minimum = 0;
- option.sliderPosition = option.sliderValue = 4;
- option.pageStep = 2;
- // Adjust coordinates to make the widget appear to be at (0,0), i.e. make
- // widget and screen coordinates the same. QStyle functions should use screen
- // coordinates but at least QPlastiqueStyle::subControlRect() is buggy
- // and sometimes uses widget coordinates.
- QRect rect = contentRect;
- rect.moveTo( 0, 0 );
- option.rect = rect;
- rect = QApplication::style()->subControlRect( QStyle::CC_ScrollBar, &option,
- QStyle::SC_ScrollBarGroove );
- rect.translate( contentRect.topLeft()); // reverse the workaround above
- contentRect = boundingRect = rect;
- retVal = true;
- }
- break;
- }
- default:
- break;
- }
- if (retVal)
- {
- // Bounding region
- Point aBPoint( boundingRect.x(), boundingRect.y() );
- Size aBSize( boundingRect.width(), boundingRect.height() );
- nativeBoundingRegion = tools::Rectangle( aBPoint, aBSize );
-
- // vcl::Region of the content
- Point aPoint( contentRect.x(), contentRect.y() );
- Size aSize( contentRect.width(), contentRect.height() );
- nativeContentRegion = tools::Rectangle( aPoint, aSize );
- }
-
- return retVal;
-}
-
-/** Test whether the position is in the native widget.
- If the return value is TRUE, bIsInside contains information whether
- aPos was or was not inside the native widget specified by the
- nType/nPart combination.
-*/
-bool KDESalGraphics::hitTestNativeControl( ControlType nType, ControlPart nPart,
- const tools::Rectangle& rControlRegion, const Point& rPos,
- bool& rIsInside )
-{
- if ( nType == ControlType::Scrollbar )
- {
- if( nPart != ControlPart::ButtonUp && nPart != ControlPart::ButtonDown
- && nPart != ControlPart::ButtonLeft && nPart != ControlPart::ButtonRight )
- { // we adjust only for buttons (because some scrollbars have 3 buttons,
- // and LO core doesn't handle such scrollbars well)
- return FALSE;
- }
- rIsInside = FALSE;
- bool bHorizontal = ( nPart == ControlPart::ButtonLeft || nPart == ControlPart::ButtonRight );
- QRect rect = region2QRect( rControlRegion );
- QPoint pos( rPos.X(), rPos.Y());
- // Adjust coordinates to make the widget appear to be at (0,0), i.e. make
- // widget and screen coordinates the same. QStyle functions should use screen
- // coordinates but at least QPlastiqueStyle::subControlRect() is buggy
- // and sometimes uses widget coordinates.
- pos -= rect.topLeft();
- rect.moveTo( 0, 0 );
- QStyleOptionSlider options;
- options.orientation = bHorizontal ? Qt::Horizontal : Qt::Vertical;
- if( bHorizontal )
- options.state |= QStyle::State_Horizontal;
- options.rect = rect;
- // some random sensible values, since we call this code only for scrollbar buttons,
- // the slider position does not exactly matter
- options.maximum = 10;
- options.minimum = 0;
- options.sliderPosition = options.sliderValue = 4;
- options.pageStep = 2;
- QStyle::SubControl control = QApplication::style()->hitTestComplexControl( QStyle::CC_ScrollBar, &options, pos );
- if( nPart == ControlPart::ButtonUp || nPart == ControlPart::ButtonLeft )
- rIsInside = ( control == QStyle::SC_ScrollBarSubLine );
- else // DOWN, RIGHT
- rIsInside = ( control == QStyle::SC_ScrollBarAddLine );
- return TRUE;
- }
- return FALSE;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/KDESalGraphics.hxx b/vcl/unx/kde4/KDESalGraphics.hxx
deleted file mode 100644
index eb513388f369..000000000000
--- a/vcl/unx/kde4/KDESalGraphics.hxx
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#pragma once
-
-#include <memory>
-
-#include <rtl/string.hxx>
-#include <unx/saldisp.hxx>
-#include <unx/salgdi.h>
-
-#include <QtGui/QImage>
-
-/**
- * Handles native graphics requests and performs the needed drawing operations.
- */
-class KDESalGraphics : public X11SalGraphics
-{
-public:
- virtual bool IsNativeControlSupported( ControlType, ControlPart ) override;
-
- virtual bool hitTestNativeControl( ControlType, ControlPart,
- const tools::Rectangle&, const Point&, bool& ) override;
-
- virtual bool drawNativeControl( ControlType, ControlPart, const tools::Rectangle&,
- ControlState, const ImplControlValue&, const OUString& ) override;
-
- virtual bool getNativeControlRegion( ControlType, ControlPart, const tools::Rectangle&,
- ControlState, const ImplControlValue&,
- const OUString&, tools::Rectangle&, tools::Rectangle& ) override;
-
-private:
- std::unique_ptr<QImage> m_image;
- QRect lastPopupRect;
-};
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/KDESalInstance.cxx b/vcl/unx/kde4/KDESalInstance.cxx
deleted file mode 100644
index c11d62689b52..000000000000
--- a/vcl/unx/kde4/KDESalInstance.cxx
+++ /dev/null
@@ -1,66 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include "KDE4FilePicker.hxx"
-#include "KDESalInstance.hxx"
-
-#include "KDESalFrame.hxx"
-
-#include "KDEXLib.hxx"
-#include "KDESalDisplay.hxx"
-
-#include <QtGui/QApplication>
-#include <QtCore/QThread>
-#include <QX11Info>
-
-using namespace com::sun::star;
-
-KDESalInstance::KDESalInstance(std::unique_ptr<SalYieldMutex> pMutex)
- : X11SalInstance(std::move(pMutex))
-{
- ImplSVData* pSVData = ImplGetSVData();
- pSVData->maAppData.mxToolkitName = OUString("kde4");
-}
-
-SalFrame* KDESalInstance::CreateFrame( SalFrame *pParent, SalFrameStyleFlags nState )
-{
- return new KDESalFrame( pParent, nState );
-}
-
-uno::Reference< ui::dialogs::XFilePicker2 > KDESalInstance::createFilePicker(
- const uno::Reference< uno::XComponentContext >& xMSF )
-{
- KDEXLib* kdeXLib = static_cast<KDEXLib*>( mpXLib );
- if (kdeXLib->allowKdeDialogs())
- return kdeXLib->createFilePicker(xMSF);
- else
- return X11SalInstance::createFilePicker( xMSF );
-}
-
-SalX11Display* KDESalInstance::CreateDisplay() const
-{
- return new SalKDEDisplay( QX11Info::display() );
-}
-
-bool KDESalInstance::IsMainThread() const
-{
- return qApp->thread() == QThread::currentThread();
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/KDESalInstance.hxx b/vcl/unx/kde4/KDESalInstance.hxx
deleted file mode 100644
index 87328a88406e..000000000000
--- a/vcl/unx/kde4/KDESalInstance.hxx
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#pragma once
-
-#include <unx/salinst.h>
-
-class SalYieldMutex;
-class SalFrame;
-
-class KDESalInstance : public X11SalInstance
-{
-protected:
- virtual SalX11Display* CreateDisplay() const override;
-
-public:
- explicit KDESalInstance(std::unique_ptr<SalYieldMutex> pMutex);
- virtual SalFrame* CreateFrame( SalFrame* pParent, SalFrameStyleFlags nStyle ) override;
-
- virtual bool hasNativeFileSelection() const override { return true; }
-
- virtual css::uno::Reference< css::ui::dialogs::XFilePicker2 >
- createFilePicker( const css::uno::Reference<
- css::uno::XComponentContext >& ) override;
-
- virtual bool IsMainThread() const override;
-};
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/KDEXLib.cxx b/vcl/unx/kde4/KDEXLib.cxx
deleted file mode 100644
index 0852c543a6d7..000000000000
--- a/vcl/unx/kde4/KDEXLib.cxx
+++ /dev/null
@@ -1,426 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include <config_kde4.h>
-
-#include "KDEXLib.hxx"
-#include "VCLKDEApplication.hxx"
-#include "KDESalInstance.hxx"
-
-#include <kapplication.h>
-#include <klocale.h>
-#include <kaboutdata.h>
-#include <kcmdlineargs.h>
-#include <kstartupinfo.h>
-
-#include <QtCore/QAbstractEventDispatcher>
-#include <QtGui/QClipboard>
-#include <QtCore/QThread>
-#include <QtGui/QFrame>
-
-#include <unx/i18n_im.hxx>
-#include <unx/i18n_xkb.hxx>
-#include <unx/saldata.hxx>
-#include <o3tl/make_unique.hxx>
-#include <osl/process.h>
-#include <sal/log.hxx>
-
-#include "KDESalDisplay.hxx"
-
-#if KDE4_HAVE_GLIB
-#include "KDE4FilePicker.hxx"
-#include <tst_exclude_socket_notifiers.moc>
-#include <tst_exclude_posted_events.moc>
-#endif
-
-KDEXLib::KDEXLib() :
- SalXLib(), m_bStartupDone(false),
- m_nFakeCmdLineArgs( 0 ),
- m_isGlibEventLoopType(false), m_allowKdeDialogs(false),
- m_timerEventId( -1 ), m_postUserEventId( -1 )
- , m_bTimedOut( false )
-{
- m_timerEventId = QEvent::registerEventType();
- m_postUserEventId = QEvent::registerEventType();
-
- // the timers created here means they belong to the main thread.
- // As the timeoutTimer runs the LO event queue, which may block on a dialog,
- // the timer has to use a Qt::QueuedConnection, otherwise the nested event
- // loop will detect the blocking timer and drop it from the polling
- // freezing LO X11 processing.
- timeoutTimer.setSingleShot( true );
- connect( &timeoutTimer, SIGNAL( timeout()), this, SLOT( timeoutActivated()), Qt::QueuedConnection );
-
- // QTimer::start() can be called only in its (here main) thread, so this will
- // forward between threads if needed
- connect( this, SIGNAL( startTimeoutTimerSignal()), this, SLOT( startTimeoutTimer()), Qt::QueuedConnection );
-
- // this one needs to be blocking, so that the handling in main thread is processed before
- // the thread emitting the signal continues
- connect( this, SIGNAL( processYieldSignal( bool, bool )), this, SLOT( processYield( bool, bool )),
- Qt::BlockingQueuedConnection );
-
- // Create the File picker in the main / GUI thread and block the calling thread until
- // the FilePicker is created.
- connect( this, SIGNAL( createFilePickerSignal( const css::uno::Reference< css::uno::XComponentContext >&) ),
- this, SLOT( createFilePicker( const css::uno::Reference< css::uno::XComponentContext >&) ),
- Qt::BlockingQueuedConnection );
-}
-
-KDEXLib::~KDEXLib()
-{
-
- // free the faked cmdline arguments no longer needed by KApplication
- for( int i = 0; i < m_nFakeCmdLineArgs; i++ )
- {
- free( m_pFreeCmdLineArgs[i] );
- }
-}
-
-void KDEXLib::Init()
-{
- m_pInputMethod.reset(new SalI18N_InputMethod);
- m_pInputMethod->SetLocale();
- XrmInitialize();
-
- KAboutData *kAboutData = new KAboutData( "LibreOffice",
- "kdelibs4",
- ki18n( "LibreOffice" ),
- "3.6.0",
- ki18n( "LibreOffice with KDE Native Widget Support." ),
- KAboutData::License_File,
- ki18n("Copyright (c) 2000, 2014 LibreOffice contributors" ),
- ki18n( "LibreOffice is an office suite.\n" ),
- "http://libreoffice.org",
- "libreoffice@lists.freedesktop.org");
-
- kAboutData->addAuthor( ki18n( "Jan Holesovsky" ),
- ki18n( "Original author and maintainer of the KDE NWF." ),
- "kendy@artax.karlin.mff.cuni.cz",
- "http://artax.karlin.mff.cuni.cz/~kendy" );
- kAboutData->addAuthor( ki18n("Roman Shtylman"),
- ki18n( "Porting to KDE 4." ),
- "shtylman@gmail.com", "http://shtylman.com" );
- kAboutData->addAuthor( ki18n("Eric Bischoff"),
- ki18n( "Accessibility fixes, porting to KDE 4." ),
- "bischoff@kde.org" );
-
- m_nFakeCmdLineArgs = 2;
-
- sal_uInt32 nParams = osl_getCommandArgCount();
- OString aDisplay;
- OUString aParam, aBin;
-
- for ( sal_uInt32 nIdx = 0; nIdx < nParams; ++nIdx )
- {
- osl_getCommandArg( nIdx, &aParam.pData );
- if ( !m_pFreeCmdLineArgs && aParam == "-display" && nIdx + 1 < nParams )
- {
- osl_getCommandArg( nIdx + 1, &aParam.pData );
- aDisplay = OUStringToOString( aParam, osl_getThreadTextEncoding() );
-
- m_pFreeCmdLineArgs = o3tl::make_unique<char*[]>(m_nFakeCmdLineArgs + 2);
- m_pFreeCmdLineArgs[ m_nFakeCmdLineArgs + 0 ] = strdup( "-display" );
- m_pFreeCmdLineArgs[ m_nFakeCmdLineArgs + 1 ] = strdup( aDisplay.getStr() );
- m_nFakeCmdLineArgs += 2;
- }
- }
- if ( !m_pFreeCmdLineArgs )
- m_pFreeCmdLineArgs = o3tl::make_unique<char*[]>(m_nFakeCmdLineArgs);
-
- osl_getExecutableFile( &aParam.pData );
- osl_getSystemPathFromFileURL( aParam.pData, &aBin.pData );
- OString aExec = OUStringToOString( aBin, osl_getThreadTextEncoding() );
- m_pFreeCmdLineArgs[0] = strdup( aExec.getStr() );
- m_pFreeCmdLineArgs[1] = strdup( "--nocrashhandler" );
-
- // make a copy of the string list for freeing it since
- // KApplication manipulates the pointers inside the argument vector
- // note: KApplication bad !
- m_pAppCmdLineArgs = o3tl::make_unique<char*[]>(m_nFakeCmdLineArgs);
- for( int i = 0; i < m_nFakeCmdLineArgs; i++ )
- m_pAppCmdLineArgs[i] = m_pFreeCmdLineArgs[i];
-
- KCmdLineArgs::init( m_nFakeCmdLineArgs, m_pAppCmdLineArgs.get(), kAboutData );
-
- // LO does its own session management, so prevent KDE/Qt from interfering
- // (QApplication::disableSessionManagement(false) wouldn't quite do,
- // since that still actually connects to the session manager, it just
- // won't save the application data on session shutdown).
- char* session_manager = nullptr;
- if( getenv( "SESSION_MANAGER" ) != nullptr )
- {
- session_manager = strdup( getenv( "SESSION_MANAGER" ));
- unsetenv( "SESSION_MANAGER" );
- }
- m_pApplication.reset( new VCLKDEApplication() );
- if( session_manager != nullptr )
- {
- // coverity[tainted_string] - trusted source for setenv
- setenv( "SESSION_MANAGER", session_manager, 1 );
- free( session_manager );
- }
-
- KApplication::setQuitOnLastWindowClosed(false);
-
-#if KDE4_HAVE_GLIB
- m_isGlibEventLoopType = QAbstractEventDispatcher::instance()->inherits( "QEventDispatcherGlib" );
- // Using KDE dialogs (and their nested event loops) works only with a proper event loop integration
- // that will release SolarMutex when waiting for more events.
- // Moreover there are bugs in Qt event loop code that allow QClipboard recursing because the event
- // loop processes also events that it should not at that point, so no dialogs in that case either.
- // https://bugreports.qt-project.org/browse/QTBUG-37380
- // https://bugreports.qt-project.org/browse/QTBUG-34614
- if (m_isGlibEventLoopType && (0 == tst_processEventsExcludeSocket()) && tst_excludePostedEvents() == 0 )
- m_allowKdeDialogs = true;
-#endif
-
- setupEventLoop();
-
- m_pDisplay = QX11Info::display();
-}
-
-// When we use Qt event loop, it can actually use its own event loop handling, or wrap
-// the Glib event loop (the latter is the default is Qt is built with Glib support
-// and $QT_NO_GLIB is not set). We mostly do not care which one it is, as QSocketNotifier's
-// and QTimer's can handle it transparently, but it matters for the SolarMutex, which
-// needs to be unlocked shortly before entering the main sleep (e.g. select()) and locked
-// immediately after. So we need to know which event loop implementation is used and
-// hook accordingly.
-#if KDE4_HAVE_GLIB
-#include <glib.h>
-
-static GPollFunc old_gpoll = nullptr;
-
-static gint gpoll_wrapper( GPollFD* ufds, guint nfds, gint timeout )
-{
- SolarMutexReleaser aReleaser;
- return old_gpoll( ufds, nfds, timeout );
-}
-#endif
-
-static bool ( *old_qt_event_filter )( void* );
-static bool qt_event_filter( void* m )
-{
- if( old_qt_event_filter != nullptr && old_qt_event_filter( m ))
- return true;
- if( SalKDEDisplay::self() && SalKDEDisplay::self()->checkDirectInputEvent( static_cast< XEvent* >( m )))
- return true;
- return false;
-}
-
-void KDEXLib::setupEventLoop()
-{
- old_qt_event_filter = QAbstractEventDispatcher::instance()->setEventFilter( qt_event_filter );
-#if KDE4_HAVE_GLIB
- if( m_isGlibEventLoopType )
- {
- old_gpoll = g_main_context_get_poll_func( nullptr );
- g_main_context_set_poll_func( nullptr, gpoll_wrapper );
- if( m_allowKdeDialogs )
- QApplication::clipboard()->setProperty( "useEventLoopWhenWaiting", true );
- return;
- }
-#endif
-}
-
-void KDEXLib::Insert( int fd, void* data, YieldFunc pending, YieldFunc queued, YieldFunc handle )
-{
- if( !m_isGlibEventLoopType )
- return SalXLib::Insert( fd, data, pending, queued, handle );
- SocketData sdata;
- sdata.data = data;
- sdata.pending = pending;
- sdata.queued = queued;
- sdata.handle = handle;
- // qApp as parent to make sure it uses the main thread event loop
- sdata.notifier = new QSocketNotifier( fd, QSocketNotifier::Read, qApp );
- connect( sdata.notifier, SIGNAL( activated( int )), this, SLOT( socketNotifierActivated( int )));
- socketData[ fd ] = sdata;
-}
-
-void KDEXLib::Remove( int fd )
-{
- if( !m_isGlibEventLoopType )
- return SalXLib::Remove( fd );
- SocketData sdata = socketData.take( fd );// according to SalXLib::Remove() this should be safe
- delete sdata.notifier;
-}
-
-void KDEXLib::socketNotifierActivated( int fd )
-{
- const SocketData& sdata = socketData[ fd ];
- sdata.handle( fd, sdata.data );
-}
-
-bool KDEXLib::Yield( bool bWait, bool bHandleAllCurrentEvents )
-{
- bool bWasEvent = false;
- if( !m_isGlibEventLoopType )
- {
- if( qApp->thread() == QThread::currentThread())
- {
- // even if we use the LO event loop, still process Qt's events,
- // otherwise they can remain unhandled for quite a long while
- bWasEvent = processYield( false, bHandleAllCurrentEvents );
- }
- return SalXLib::Yield(bWait, bHandleAllCurrentEvents) || bWasEvent;
- }
- // if we are the main thread (which is where the event processing is done),
- // good, just do it
- if( qApp->thread() == QThread::currentThread())
- {
- bWasEvent = processYield( bWait, bHandleAllCurrentEvents );
- if ( bWasEvent )
- m_aWaitingYieldCond.set();
- }
- else
- {
- // we were called from another thread;
- // release the yield lock to prevent deadlock with the main thread
- // (it's ok to release it here, since even normal processYield() would
- // temporarily do it while checking for new events)
- {
- SolarMutexReleaser aReleaser;
- bWasEvent = Q_EMIT processYieldSignal( false, bHandleAllCurrentEvents );
- }
- if ( !bWasEvent && bWait )
- {
- m_aWaitingYieldCond.reset();
- SolarMutexReleaser aReleaser;
- m_aWaitingYieldCond.wait();
- bWasEvent = true;
- }
- }
- return bWasEvent;
-}
-
-bool KDEXLib::processYield( bool bWait, bool bHandleAllCurrentEvents )
-{
- bool wasEvent = false;
- if ( m_isGlibEventLoopType )
- {
- wasEvent = SalKDEDisplay::self()->DispatchInternalEvent( bHandleAllCurrentEvents );
- if ( !bHandleAllCurrentEvents && wasEvent )
- return true;
- }
-
- /**
- * Quoting the Qt docs: [QAbstractEventDispatcher::processEvents] processes
- * pending events that match flags until there are no more events to process.
- */
- QAbstractEventDispatcher* dispatcher = QAbstractEventDispatcher::instance( qApp->thread());
- if ( bWait && !wasEvent )
- wasEvent = dispatcher->processEvents( QEventLoop::WaitForMoreEvents );
- else
- wasEvent = dispatcher->processEvents( QEventLoop::AllEvents ) || wasEvent;
- return wasEvent;
-}
-
-void KDEXLib::StartTimer( sal_uLong nMS )
-{
- if( !m_isGlibEventLoopType )
- return SalXLib::StartTimer( nMS );
- timeoutTimer.setInterval( nMS );
- // QTimer's can be started only in their thread (main thread here)
- if( qApp->thread() == QThread::currentThread())
- startTimeoutTimer();
- else
- Q_EMIT startTimeoutTimerSignal();
-}
-
-void KDEXLib::startTimeoutTimer()
-{
- timeoutTimer.start();
-}
-
-void KDEXLib::StopTimer()
-{
- if( !m_isGlibEventLoopType )
- return SalXLib::StopTimer();
- timeoutTimer.stop();
-}
-
-bool KDEXLib::CheckTimeout( bool bExecuteTimers )
-{
- if( !m_isGlibEventLoopType )
- return SalXLib::CheckTimeout( bExecuteTimers );
- assert( !bExecuteTimers );
- return m_bTimedOut;
-}
-
-void KDEXLib::timeoutActivated()
-{
- // don't potentially wait in timeout, as QTimer is non-recursive
- m_bTimedOut = true;
- QApplication::postEvent(this, new QEvent(QEvent::Type( m_timerEventId )));
-}
-
-void KDEXLib::customEvent(QEvent* e)
-{
- if( e->type() == m_timerEventId )
- {
- m_bTimedOut = false;
- X11SalData::Timeout();
- }
-}
-
-void KDEXLib::Wakeup()
-{
- if( !m_isGlibEventLoopType )
- return SalXLib::Wakeup();
- QAbstractEventDispatcher::instance( qApp->thread())->wakeUp(); // main thread event loop
-}
-
-void KDEXLib::TriggerUserEventProcessing()
-{
- if( !m_isGlibEventLoopType )
- return SalXLib::TriggerUserEventProcessing();
- QApplication::postEvent(this, new QEvent(QEvent::Type( m_postUserEventId )));
-}
-
-void KDEXLib::doStartup()
-{
- if( ! m_bStartupDone )
- {
- KStartupInfo::appStarted();
- m_bStartupDone = true;
- SAL_INFO( "vcl.kde4", "called KStartupInfo::appStarted()" );
- }
-}
-
-using namespace com::sun::star;
-
-uno::Reference< ui::dialogs::XFilePicker2 > KDEXLib::createFilePicker(
- const uno::Reference< uno::XComponentContext >& xMSF )
-{
-#if KDE4_HAVE_GLIB
- if( qApp->thread() != QThread::currentThread()) {
- SolarMutexReleaser aReleaser;
- return Q_EMIT createFilePickerSignal( xMSF );
- }
- return uno::Reference< ui::dialogs::XFilePicker2 >( new KDE4FilePicker( xMSF ) );
-#else
- return NULL;
-#endif
-}
-
-#include <KDEXLib.moc>
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/KDEXLib.hxx b/vcl/unx/kde4/KDEXLib.hxx
deleted file mode 100644
index 452aae8b3286..000000000000
--- a/vcl/unx/kde4/KDEXLib.hxx
+++ /dev/null
@@ -1,101 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#pragma once
-
-#include <memory>
-
-#include <unx/saldisp.hxx>
-
-#include <fixx11h.h>
-
-#include <QtCore/QHash>
-#include <QtCore/QSocketNotifier>
-#include <QtCore/QTimer>
-
-#include <unx/salinst.h>
-#include <osl/conditn.hxx>
-
-class VCLKDEApplication;
-
-class KDEXLib : public QObject, public SalXLib
-{
- Q_OBJECT
-
- bool m_bStartupDone;
- std::unique_ptr<VCLKDEApplication> m_pApplication;
- std::unique_ptr<char*[]> m_pFreeCmdLineArgs;
- std::unique_ptr<char*[]> m_pAppCmdLineArgs;
- int m_nFakeCmdLineArgs;
- struct SocketData
- {
- void* data;
- YieldFunc pending;
- YieldFunc queued;
- YieldFunc handle;
- QSocketNotifier* notifier;
- };
- QHash< int, SocketData > socketData; // key is fd
- QTimer timeoutTimer;
- bool m_isGlibEventLoopType;
- bool m_allowKdeDialogs;
- int m_timerEventId;
- int m_postUserEventId;
- osl::Condition m_aWaitingYieldCond;
- bool m_bTimedOut;
-
- void setupEventLoop();
-
-private Q_SLOTS:
- void socketNotifierActivated( int fd );
- void timeoutActivated();
- void startTimeoutTimer();
- bool processYield( bool bWait, bool bHandleAllCurrentEvents );
-
-Q_SIGNALS:
- void startTimeoutTimerSignal();
- bool processYieldSignal( bool bWait, bool bHandleAllCurrentEvents );
- css::uno::Reference< css::ui::dialogs::XFilePicker2 >
- createFilePickerSignal( const css::uno::Reference< css::uno::XComponentContext >& );
-
-public:
- KDEXLib();
- virtual ~KDEXLib() override;
-
- virtual void Init() override;
- virtual bool Yield( bool bWait, bool bHandleAllCurrentEvents ) override;
- virtual void Insert( int fd, void* data, YieldFunc pending, YieldFunc queued, YieldFunc handle ) override;
- virtual void Remove( int fd ) override;
- virtual void StartTimer( sal_uLong nMS ) override;
- virtual void StopTimer() override;
- virtual bool CheckTimeout( bool bExecuteTimers = true ) override;
- virtual void Wakeup() override;
- void TriggerUserEventProcessing();
-
- void doStartup();
- bool allowKdeDialogs() { return m_allowKdeDialogs; }
-
- virtual void customEvent(QEvent* e) override;
-
-public Q_SLOTS:
- css::uno::Reference< css::ui::dialogs::XFilePicker2 >
- createFilePicker( const css::uno::Reference< css::uno::XComponentContext >& );
-};
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/VCLKDEApplication.cxx b/vcl/unx/kde4/VCLKDEApplication.cxx
deleted file mode 100644
index 78181b2a486c..000000000000
--- a/vcl/unx/kde4/VCLKDEApplication.cxx
+++ /dev/null
@@ -1,87 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include "VCLKDEApplication.hxx"
-
-#include <QtGui/QClipboard>
-#include <QtCore/QEvent>
-
-#include "KDESalDisplay.hxx"
-
-VCLKDEApplication::VCLKDEApplication() :
- KApplication()
-{
-}
-
-bool VCLKDEApplication::x11EventFilter(XEvent* ev)
-{
- //if we have a display and the display consumes the event
- //do not process the event in qt
- if (SalKDEDisplay::self() && SalKDEDisplay::self()->Dispatch(ev))
- {
- return true;
- }
-
- return false;
-}
-
-// various hacks to be performed before re-entering Qt's event loop
-// because of showing a Qt dialog
-void VCLKDEApplication::preDialogSetup()
-{
- // KFileDialog integration requires using event loop with QClipboard.
- // Opening the KDE file dialog here can lead to QClipboard
- // asking for clipboard contents. If LO core is the owner of the clipboard
- // content, without event loop use this will block for 5 seconds and timeout,
- // since the clipboard thread will not be able to acquire SolarMutex
- // and thus won't be able to respond. If the event loops
- // are properly integrated and QClipboard can use a nested event loop
- // (see the KDE VCL plug), then this won't happen.
- // We cannot simply release SolarMutex here, because the event loop started
- // by the file dialog would also call back to LO code.
- assert( QApplication::clipboard()->property( "useEventLoopWhenWaiting" ).toBool() );
-}
-
-// various hacks to be performed after a Qt dialog has been closed
-void VCLKDEApplication::postDialogCleanup()
-{
- // HACK: KFileDialog uses KConfig("kdeglobals") for saving some settings
- // (such as the auto-extension flag), but that doesn't update KGlobal::config()
- // (which is probably a KDE bug), so force reading the new configuration,
- // otherwise the next opening of the dialog would use the old settings.
- KGlobal::config()->reparseConfiguration();
- // HACK: If Qt owns clipboard or selection, give up on their ownership now. Otherwise
- // LO core might ask for the contents, but it would block while doing so (i.e. it
- // doesn't seem to have an equivalent of QClipboard's "useEventLoopWhenWaiting"),
- // therefore QClipboard wouldn't be able to respond, and whole LO would block until
- // a timeout. Given that Klipper is most probably running, giving up clipboard/selection
- // ownership will not only avoid the blocking, but even pasting that content in LO
- // will in fact work, if Klipper can handle it.
- // Technically proper solution would be of course to allow Qt to process QClipboard
- // events while LO waits for clipboard contents, or short-circuit to QClipboard somehow
- // (it's a mystery why LO's clipboard handling has its own thread when whole LO can
- // get blocked by both trying to send and receive clipboard contents anyway).
- QClipboard* clipboard = QApplication::clipboard();
- if( clipboard->ownsSelection())
- clipboard->clear( QClipboard::Selection );
- if( clipboard->ownsClipboard())
- clipboard->clear();
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/VCLKDEApplication.hxx b/vcl/unx/kde4/VCLKDEApplication.hxx
deleted file mode 100644
index 622d898eb9bc..000000000000
--- a/vcl/unx/kde4/VCLKDEApplication.hxx
+++ /dev/null
@@ -1,39 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#pragma once
-
-#include <sal/config.h>
-
-#include <sal/types.h>
-
-#include <kapplication.h>
-
-#undef Region
-
-class VCLKDEApplication : public KApplication
-{
- public:
- VCLKDEApplication();
- virtual bool x11EventFilter(XEvent* event) override;
- static void preDialogSetup();
- static void postDialogCleanup();
-};
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/main.cxx b/vcl/unx/kde4/main.cxx
deleted file mode 100644
index 9d192247679b..000000000000
--- a/vcl/unx/kde4/main.cxx
+++ /dev/null
@@ -1,89 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include <QtGui/QApplication>
-
-#include "KDEData.hxx"
-#include "KDESalInstance.hxx"
-
-#include <vclpluginapi.h>
-
-#include <rtl/string.hxx>
-#include <sal/log.hxx>
-
-/// entry point for the KDE4 VCL plugin
-extern "C" {
- VCLPLUG_KDE4_PUBLIC SalInstance* create_SalInstance()
- {
- /* #i92121# workaround deadlocks in the X11 implementation
- */
- static const char* pNoXInitThreads = getenv( "SAL_NO_XINITTHREADS" );
- /* #i90094#
- from now on we know that an X connection will be
- established, so protect X against itself
- */
- if( ! ( pNoXInitThreads && *pNoXInitThreads ) )
- {
-#if QT_VERSION >= 0x040800
- // let Qt call XInitThreads(), so that also Qt knows it's been used
- // (otherwise QPixmap may warn about threads not being initialized)
- QApplication::setAttribute( Qt::AA_X11InitThreads );
-#else
- XInitThreads();
- // just in case somebody builds with old version and then upgrades Qt,
- // otherwise this is a no-op
- QApplication::setAttribute( static_cast< Qt::ApplicationAttribute >( 10 ));
-#endif
- }
-
-#if QT_VERSION < 0x050000
- // Qt 4.x support needs >= 4.1.0
- OString aVersion( qVersion() );
- SAL_INFO( "vcl.kde4", "qt version string is " << aVersion );
-
- sal_Int32 nIndex = 0, nMajor = 0, nMinor = 0;
- nMajor = aVersion.getToken( 0, '.', nIndex ).toInt32();
- if( nIndex > 0 )
- nMinor = aVersion.getToken( 0, '.', nIndex ).toInt32();
- if( nMajor != 4 || nMinor < 1 )
- {
-#if OSL_DEBUG_LEVEL > 1
- sal_Int32 nMicro = 0;
- if( nIndex > 0 )
- nMicro = aVersion.getToken( 0, '.', nIndex ).toInt32();
- SAL_INFO( "vcl.kde4", "unsuitable qt version " << nMajor << "." << nMinor << "." << nMicro );
-#endif
- return nullptr;
- }
-#endif
-
- KDESalInstance* pInstance = new KDESalInstance( o3tl::make_unique<SalYieldMutex>() );
- SAL_INFO( "vcl.kde4", "created KDESalInstance " << &pInstance );
-
- // initialize SalData
- KDEData *salData = new KDEData( pInstance );
- salData->Init();
- salData->initNWF();
- pInstance->SetLib(salData->GetLib());
-
- return pInstance;
- }
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/tst_exclude_posted_events.hxx b/vcl/unx/kde4/tst_exclude_posted_events.hxx
deleted file mode 100644
index c07ca895a9dc..000000000000
--- a/vcl/unx/kde4/tst_exclude_posted_events.hxx
+++ /dev/null
@@ -1,67 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- *
- * This code is based on the SocketEventsTester from the Qt4 test suite.
- */
-
-#pragma once
-
-#include <QtCore/QCoreApplication>
-#include <QtCore/QEventLoop>
-
-const QEvent::Type eventType = QEvent::User;
-
-class TestExcludePostedEvents
- : public QObject
-{
- Q_OBJECT
- public:
- TestExcludePostedEvents();
- virtual bool event( QEvent* e ) override;
- bool processed;
-};
-
-TestExcludePostedEvents::TestExcludePostedEvents()
- : processed( false )
-{
-}
-
-bool TestExcludePostedEvents::event( QEvent* e )
-{
- if( e->type() == eventType )
- processed = true;
- return QObject::event( e );
-}
-
-#define QVERIFY(a) \
- if (!a) return 1;
-
-static int tst_excludePostedEvents()
-{
- TestExcludePostedEvents test;
- QCoreApplication::postEvent( &test, new QEvent( eventType ));
- QEventLoop loop;
- loop.processEvents(QEventLoop::ExcludeUserInputEvents
- | QEventLoop::ExcludeSocketNotifiers
-// | QEventLoop::WaitForMoreEvents
- | QEventLoop::X11ExcludeTimers);
- QVERIFY( !test.processed );
- loop.processEvents();
- QVERIFY( test.processed );
- return 0;
-}
diff --git a/vcl/unx/kde4/tst_exclude_socket_notifiers.hxx b/vcl/unx/kde4/tst_exclude_socket_notifiers.hxx
deleted file mode 100644
index d0acafede239..000000000000
--- a/vcl/unx/kde4/tst_exclude_socket_notifiers.hxx
+++ /dev/null
@@ -1,80 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- *
- * This code is based on the SocketEventsTester from the Qt4 test suite.
- */
-
-#pragma once
-
-#include <QtCore/QCoreApplication>
-#include <QtCore/QEventLoop>
-#include <QtCore/QSocketNotifier>
-#include <unistd.h>
-
-class TestExcludeSocketNotifiers
- : public QObject
-{
- Q_OBJECT
- public:
- TestExcludeSocketNotifiers( const int* pipes );
- virtual ~TestExcludeSocketNotifiers() override;
- bool received;
- public slots:
- void slotReceived();
- private:
- const int* pipes;
-};
-
-TestExcludeSocketNotifiers::TestExcludeSocketNotifiers( const int* thePipes )
- : received( false )
- , pipes( thePipes )
-{
-}
-
-TestExcludeSocketNotifiers::~TestExcludeSocketNotifiers()
-{
- close( pipes[ 0 ] );
- close( pipes[ 1 ] );
-}
-
-void TestExcludeSocketNotifiers::slotReceived()
-{
- received = true;
-}
-
-#define QVERIFY(a) \
- if (!a) return 1;
-
-static int tst_processEventsExcludeSocket()
-{
- int pipes[ 2 ];
- if( pipe( pipes ) < 0 )
- return 1;
- TestExcludeSocketNotifiers test( pipes );
- QSocketNotifier notifier( pipes[ 0 ], QSocketNotifier::Read );
- QObject::connect( &notifier, SIGNAL( activated( int )), &test, SLOT( slotReceived()));
- char dummy = 'a';
- if( 1 != write( pipes[ 1 ], &dummy, 1 ) )
- return 1;
- QEventLoop loop;
- loop.processEvents( QEventLoop::ExcludeSocketNotifiers );
- QVERIFY( !test.received );
- loop.processEvents();
- QVERIFY( test.received );
- return 0;
-}
diff --git a/vcl/unx/kde5/KDE5FilePicker2.cxx b/vcl/unx/kde5/KDE5FilePicker2.cxx
index 553ed8500c84..dc87f90c84ce 100644
--- a/vcl/unx/kde5/KDE5FilePicker2.cxx
+++ b/vcl/unx/kde5/KDE5FilePicker2.cxx
@@ -68,10 +68,11 @@ namespace
{
uno::Sequence<OUString> FilePicker_getSupportedServiceNames()
{
- uno::Sequence<OUString> aRet(3);
+ uno::Sequence<OUString> aRet(4);
aRet[0] = "com.sun.star.ui.dialogs.FilePicker";
aRet[1] = "com.sun.star.ui.dialogs.SystemFilePicker";
aRet[2] = "com.sun.star.ui.dialogs.KDE5FilePicker";
+ aRet[3] = "com.sun.star.ui.dialogs.KDE5FolderPicker";
return aRet;
}
}
diff --git a/vcl/unx/kde5/KDE5SalInstance.cxx b/vcl/unx/kde5/KDE5SalInstance.cxx
index 484920d01e97..d37654f7a73a 100644
--- a/vcl/unx/kde5/KDE5SalInstance.cxx
+++ b/vcl/unx/kde5/KDE5SalInstance.cxx
@@ -21,7 +21,6 @@
#include <utility>
-//#include "KDE4FilePicker.hxx"
#include <QtCore/QAbstractEventDispatcher>
#include <QtCore/QThread>
#include <QtWidgets/QApplication>