quassel.git
10 months agotest: Bundle GTest/GMock 1.8.1 sources and provide a find script
Manuel Nickschas [Mon, 24 Sep 2018 18:30:25 +0000 (20:30 +0200)]
test: Bundle GTest/GMock 1.8.1 sources and provide a find script

GTest/GMock is a unit testing framework that we want to use for
writing unit tests for Quassel in the future. Since Google
recommends building the test libraries with the same flags and
settings as the code under test, we should build them as part of
Quassel's build process rather than relying on system-provided
libraries.

Because most distros don't seem to package the GTest/GMock sources,
bundle them with Quassel. The upstream sources are unmodified,
although the set of files shipped is trimmed down significantly
in order to not needlessly blow up the repo size.

Provide FindGTest.cmake, which builds the libraries from the
bundled sources.

10 months agomodernize: Require member function pointers for Settings::notify()
Manuel Nickschas [Wed, 19 Sep 2018 22:54:21 +0000 (00:54 +0200)]
modernize: Require member function pointers for Settings::notify()

Require member function pointers for Settings::notify() and
Settings::initAndNotify(). This brings us one step closer to being
SLOT-free.

10 months agomodernize: Remove old-style slot usage in NetworkModelController
Manuel Nickschas [Wed, 19 Sep 2018 19:05:08 +0000 (21:05 +0200)]
modernize: Remove old-style slot usage in NetworkModelController

Use member function pointers in NetworkModelController and related
classes, instead of old-style slots and invokeMethod().

10 months agomodernize: Don't use apparent connect-by-name slots in MainWin
Manuel Nickschas [Tue, 18 Sep 2018 21:48:08 +0000 (23:48 +0200)]
modernize: Don't use apparent connect-by-name slots in MainWin

Rename slots named "on_*" to follow our naming conventions, and avoid
association with the very old and very discouraged connect-by-name
feature in Qt (also known as "auto-connection slots"). MainWin doesn't
even use this feature, so we should not confuse casual readers.

10 months agomodernize: Migrate action-related things to PMF connects
Manuel Nickschas [Tue, 18 Sep 2018 21:37:02 +0000 (23:37 +0200)]
modernize: Migrate action-related things to PMF connects

In our quest to get rid of the deprecated use of slots, refactor
Action and ActionCollection to require pointer-to-member-function
connects. Ensure nobody accidentally still uses SLOT through a static
assertion.

Add a convenience function to ActionCollection for adding lists of
actions. While we're at it, also rework ActionCollection's optional
KDE Frameworks support to simplify things.

Adapt the rest of the code accordingly.

10 months agouisupport: Provide helpers for dealing with widget changes
Manuel Nickschas [Mon, 17 Sep 2018 21:42:37 +0000 (23:42 +0200)]
uisupport: Provide helpers for dealing with widget changes

In many places, we want to connect to a widget's changed signal,
i.e. a signal that is emitted whenever the widget changes. This
requires a great deal of boilerplate especially in settingspages,
since the signal to listen to varies between widget types.

Provide helpers that automate most of this by matching the given
widget against a static list of supported widgets' changed signals,
and connecting automatically. A sprinkle of template magic makes
it very easy to support a bunch of different widget types in a generic
way.

Make use of this feature to get rid of the remaining old-style
connects in SettingsPage. Also migrate a couple of specific
settingspages as proof-of-concept and API validation; others
can follow over time.

10 months agocommon: Provide helper for getting member function traits
Manuel Nickschas [Mon, 17 Sep 2018 21:39:37 +0000 (23:39 +0200)]
common: Provide helper for getting member function traits

Add a new header funchelpers.h that contains helpers for dealing
with member function traits. MemberFunction<Callable> provides
the class, return and argument types of the given Callable, as well
as a compatible std::function type.

10 months agomodernize: Replace most remaining old-style connects by PMF ones
Manuel Nickschas [Wed, 12 Sep 2018 17:45:13 +0000 (19:45 +0200)]
modernize: Replace most remaining old-style connects by PMF ones

Manually replace old-style connects (using the SIGNAL/SLOT macros)
by the much more efficient and typesafe pointer-to-member-function-
based ones.

This fixes the cases where clazy could not auto-migrate to the new
syntax for a variety of reasons. In most of the cases, we need to
remove overloads or explicitly select the desired one, because the
plain syntax cannot deal with overloads. Another issue is trying
to connect to signals in a baseclass that are only declared in a
derived class (which works with the old-style runtime connection
handling, but obviously no longer with the compile-time version).

Also do some selected cleanups in places.

10 months agocommon: Provide helper for resolving overloaded function pointers
Manuel Nickschas [Mon, 10 Sep 2018 20:12:44 +0000 (22:12 +0200)]
common: Provide helper for resolving overloaded function pointers

The pointer-to-member-function connect syntax cannot directly deal
with overloaded method signatures. Provide a helper to avoid ugly
static_cast incantations:

  #include "util.h"
  connect(this, selectOverload<int, QString>(&MyClass::mySignal), other, &Other::mySlot);

This helper can be used for both signals and slots.

10 months agoqtui: Fix initialization order after switching to PMF connects
Manuel Nickschas [Thu, 13 Sep 2018 21:35:29 +0000 (23:35 +0200)]
qtui: Fix initialization order after switching to PMF connects

Seems like switching to PMF connections has changed the order signals
are processed in, resulting in the UI being initialized after the
session manager asks for saving the UI state (for whatever reason).

Make this less fragile (and avoid a crash when using KDE) by
connecting to the session manager only after initializing the UI, and
replace the initUi() slot by a lambda while we're at it.

10 months agoclazy: Convert many old-style connects into function pointer based
Manuel Nickschas [Mon, 10 Sep 2018 16:38:20 +0000 (18:38 +0200)]
clazy: Convert many old-style connects into function pointer based

Since Qt5, signal/slot connections can be expressed using function
pointers rather than the SIGNAL/SLOT macros. This is a) much more
efficient, and b) provides a compile-time check for the sender
and receiver being compatible.

Let clazy auto-fix old-style connects where it can. However, a lot of
occurrences remain where we'll need manual intervention for one
reason or another.

10 months agomodernize: Use ranged-for loops in some obvious cases
Manuel Nickschas [Sun, 9 Sep 2018 22:11:38 +0000 (00:11 +0200)]
modernize: Use ranged-for loops in some obvious cases

Some old-style loops can be automatically converted by clang-tidy
to use ranged-for.

10 months agomodernize: Use 'while(true)' instead of 'while(1)'
Manuel Nickschas [Sun, 9 Sep 2018 22:04:49 +0000 (00:04 +0200)]
modernize: Use 'while(true)' instead of 'while(1)'

10 months agomodernize: Use std::make_unique
Manuel Nickschas [Sun, 9 Sep 2018 22:04:11 +0000 (00:04 +0200)]
modernize: Use std::make_unique

10 months agomodernize: Use C++ versions of system headers
Manuel Nickschas [Sun, 9 Sep 2018 22:02:03 +0000 (00:02 +0200)]
modernize: Use C++ versions of system headers

System headers ending on .h are deprecated; use the c* version
instead.

10 months agomodernize: Use raw string literals instead of escaped strings
Manuel Nickschas [Sun, 9 Sep 2018 21:37:56 +0000 (23:37 +0200)]
modernize: Use raw string literals instead of escaped strings

Replace escaped strings with raw string literals in places where
it makes sense, and doesn't confuse lupdate.

10 months agomodernize: Use braced-init list when returning types
Manuel Nickschas [Sun, 9 Sep 2018 21:20:09 +0000 (23:20 +0200)]
modernize: Use braced-init list when returning types

10 months agomodernize: Use auto where the type is clear from context
Manuel Nickschas [Sun, 9 Sep 2018 20:44:18 +0000 (22:44 +0200)]
modernize: Use auto where the type is clear from context

Apply clang-tidy's modernize-use-auto fix, which uses auto where
the type would otherwise be duplicated in the line (e.g. when casting
a type, or creating an instance with 'new').

10 months agomodernize: Use '= default' instead of empty ctor/dtor bodies
Manuel Nickschas [Thu, 6 Sep 2018 23:08:09 +0000 (01:08 +0200)]
modernize: Use '= default' instead of empty ctor/dtor bodies

Also remove lots of unnecessary, empty ctors and dtors.

10 months agomodernize: Prefer default member init over ctor init
Manuel Nickschas [Thu, 6 Sep 2018 20:43:39 +0000 (22:43 +0200)]
modernize: Prefer default member init over ctor init

Where appropriate, initialize class members in the header rather
than in the constructor.

10 months agomodernize: Pass arguments by value and move in constructors
Manuel Nickschas [Thu, 6 Sep 2018 19:01:22 +0000 (21:01 +0200)]
modernize: Pass arguments by value and move in constructors

If a method (or constructor) wants to store an argument in a local
variable or attribute, one should prefer passing it in by value
and moving it into the final location, rather than taking a
const reference and copying it over. In the best case, this saves
one copy, if the method is called with an rvalue.

This pattern is most frequent in constructors initializing class
members, so let clang-tidy fix this for argument types that have
move constructors.

10 months agomodernize: Use 'using' instead of 'typedef'
Manuel Nickschas [Thu, 6 Sep 2018 17:47:17 +0000 (19:47 +0200)]
modernize: Use 'using' instead of 'typedef'

10 months agomodernize: Use override instead of virtual
Manuel Nickschas [Wed, 5 Sep 2018 22:36:28 +0000 (00:36 +0200)]
modernize: Use override instead of virtual

Let clang-tidy fix all occurrences where override should be used
instead of virtual. Also, let it annotate member functions where
virtual was missing in the first place.

10 months agomodernize: Use nullptr
Manuel Nickschas [Wed, 5 Sep 2018 22:09:45 +0000 (00:09 +0200)]
modernize: Use nullptr

Let clang-tidy fix all occurrences where nullptr should be used
instead of 0.

10 months agoclang-tidy: Mark several settingspage methods as final
Manuel Nickschas [Tue, 4 Sep 2018 22:56:14 +0000 (00:56 +0200)]
clang-tidy: Mark several settingspage methods as final

To avoid warnings about calling virtual methods during construction,
mark affected methods as final. It's legitimate to call things like
load() from their ctors as long as nobody inherits from them.

10 months agoclang-tidy: Don't call virtual methods from CoreAccountModel's ctor
Manuel Nickschas [Tue, 4 Sep 2018 22:36:11 +0000 (00:36 +0200)]
clang-tidy: Don't call virtual methods from CoreAccountModel's ctor

10 months agocmake: Build shared libraries (DLLs) on Windows
Manuel Nickschas [Sun, 2 Sep 2018 21:29:43 +0000 (23:29 +0200)]
cmake: Build shared libraries (DLLs) on Windows

Since symbols are now properly marked for export, we can finally
enable the building of DLLs on Windows.

10 months agocmake: Make symbols hidden by default on GCC/Clang
Manuel Nickschas [Sun, 2 Sep 2018 21:26:24 +0000 (23:26 +0200)]
cmake: Make symbols hidden by default on GCC/Clang

With symbols now being explicitly marked as exported where needed,
there is no need to globally export all symbols anymore.
Tell CMake to set the appropriate compiler flags
(i.e. -fvisibility=hidden) for GCC and Clang so, they only export
requested symbols.

10 months agosrc: Mark symbols to be exported where needed
Manuel Nickschas [Sun, 2 Sep 2018 21:34:36 +0000 (23:34 +0200)]
src: Mark symbols to be exported where needed

Generate export headers for the Quassel modules, and mark all
relevant classes and function to be exported so that shared libraries
can be linked against without globally exporting all symbols.
This is a hard requirement for Windows DLLs, and more efficient on
other platforms, too.

For now, this was done incrementally until everything linked properly.
In the future, we may consider explicitly defining the public
interfaces for each module, and trying to minimize the linker
interface e.g. by PIMPLing.

10 months agocmake: Support generation of export headers
Manuel Nickschas [Sun, 2 Sep 2018 21:06:18 +0000 (23:06 +0200)]
cmake: Support generation of export headers

For using shared libraries without globally exporting all symbols,
one has to explicitly mark classes and free functions to be exported.
This is more efficient on platforms like Linux (enabling the use
of -fvisibility=hidden on GCC/Clang), and a hard requirement for
using DLLs on Windows (which don't support global export at all).

Extend the quassel_add_module() macro with an optional EXPORT
argument, which, if provided, uses CMake's built-in support for
generating an export header that provides macros for exporting
symbols. The same macro will also import the marked symbols when
building against a library.

While we're at it, also fix the install rule to use the proper
install locations for RUNTIME/LIBRARY/ARCHIVE target types.

10 months agosigproxy: Don't expose the thread_local '_current' attribute
Manuel Nickschas [Sun, 2 Sep 2018 21:23:06 +0000 (23:23 +0200)]
sigproxy: Don't expose the thread_local '_current' attribute

Windows does not allow exporting thread_local attributes in the
DLL interface. Since it's not good practice anyway to expose such
an implementation detail in the public header, make the accessor
non-inline and move the attribute into a private anonymous namespace,
removing it from the public interface.

10 months agouisupport: Let ClickableList inherit from std::vector instead of QList
Manuel Nickschas [Sun, 2 Sep 2018 21:18:40 +0000 (23:18 +0200)]
uisupport: Let ClickableList inherit from std::vector instead of QList

Apparently, a class inheriting from a QList specialization cannot
be properly exported, while this works fine when inheriting from
std::vector instead. Since we now prefer std containers over Qt's
anyway, changing the baseclass is a Good Thing™ either way, so
just do it.

10 months agoqtui: Add debug dialog for showing the resource file tree
Manuel Nickschas [Wed, 29 Aug 2018 18:38:31 +0000 (20:38 +0200)]
qtui: Add debug dialog for showing the resource file tree

Add a dialog in the debug menu that shows the compiled-in
resource files. This is useful for checking that resource generation
and loading works properly.

10 months agocommon: Simplify SyncableObject macros and usage
Manuel Nickschas [Thu, 23 Aug 2018 21:40:36 +0000 (23:40 +0200)]
common: Simplify SyncableObject macros and usage

Since the C++11 standard defines "__func__", and modern versions
of MSVC support this, we can remove the workaround for MSVC from
the SyncableObject macros. It is no longer necessary to derive
the function name from MSVC's __FUNCTION__ (which contains the
enclosing class name), and thus the _classNameOffset__ function
declared by the SYNCABLE_OBJECT macro is no longer needed.

Repurpose the macro to define the syncMetaObject() member function
instead, and remove the no-longer needed INIT_SYNCABLE_OBJECT
macro.
The syncMetaObject() function is used by the signal proxy for
accessing the metaObject() of the base class in case there are
client- or core-specific specializations of a syncable object;
i.e. if you have Foo directly inheriting from SyncableObject,
and ClientFoo derived from Foo, the function must only be
declared in Foo, otherwise syncing won't work.

Thus, the SYNCABLE_OBJECT macro declares the function as final,
so it can't be accidentally overridden.

While we're at it, replace include guards with #pragma once in
files we touched.

10 months agoqa: Remove lots of superfluous semicolons
Manuel Nickschas [Wed, 22 Aug 2018 19:15:11 +0000 (21:15 +0200)]
qa: Remove lots of superfluous semicolons

Since we have now enabled -Wpedantic, the compiler warns us about
superfluous semicolons, of which we apparently have a lot.
Remove them.

10 months agocmake: Reorder slightly for consistency
Manuel Nickschas [Wed, 29 Aug 2018 16:17:26 +0000 (18:17 +0200)]
cmake: Reorder slightly for consistency

Other modules link the main dependencies before caring about
options, so do the same for the core module.

10 months agocmake: Link resources statically, and init locally
Manuel Nickschas [Wed, 29 Aug 2018 16:15:47 +0000 (18:15 +0200)]
cmake: Link resources statically, and init locally

Link resource libraries statically in order to avoid problems with
symbol exporting. Move resource initialization from main() into the
respective libraries.

10 months agocmake: Add support for static libs to quassel_add_module
Manuel Nickschas [Wed, 29 Aug 2018 16:10:56 +0000 (18:10 +0200)]
cmake: Add support for static libs to quassel_add_module

We'll need this for building resource libraries, which we can't
easily export symbols from (and which also are not used more than
once).

10 months agocmake: Build shared libraries
Manuel Nickschas [Wed, 22 Aug 2018 21:47:22 +0000 (23:47 +0200)]
cmake: Build shared libraries

The days of static builds are finally over. Build dynamic libraries
for all Quassel modules.

Let CMake handle the RPATH in a way that doesn't cause inconvenience;
always set an RPATH in the build tree so the correct libraries
are loaded, and also set an RPATH for installed binaries unless
they go into a system location.

Also define output directories for all build artifacts.

10 months agocmake: Modernize compile settings; require C++14
Manuel Nickschas [Wed, 22 Aug 2018 18:15:50 +0000 (20:15 +0200)]
cmake: Modernize compile settings; require C++14

Clean up QuasselCompileSettings.cmake, treat GNU and Clang the same.
Use add_compile_options() instead of CMAKE_CXX_FLAGS. Curate the list
of compiler flags, and add sensible linker flags, too.

Check explicitly for required compiler features using CMake's
target_compile_features(), rather than hard-coding compiler versions.
The set of required features basically implies that we now require
a C++14 compiler (even though the new stuff isn't used in the code
yet).

10 months agocmake: Build Windows icon resource again
Manuel Nickschas [Tue, 21 Aug 2018 22:29:17 +0000 (00:29 +0200)]
cmake: Build Windows icon resource again

Building the Windows resource got lost while refactoring the build
system, so bring it back.

10 months agocmake: Modernize translation generation
Manuel Nickschas [Tue, 21 Aug 2018 21:31:45 +0000 (23:31 +0200)]
cmake: Modernize translation generation

Refactor and modernize the CMake support for translation generation.
Properly use targets, custom commands and dependencies to ensure that
files are only regenerated when needed, and avoid useless rebuilds.

Avoid individual invocations of lupdate and lrelease, which both
support processing multiple files at once.

Make use of the newly added quassel_add_resource function instead of
building the .qrc file explicitly.

Fix LINGUAS support, which was previously not working as intended.

10 months agocmake: Autogenerate most of the .qrc resource files
Manuel Nickschas [Wed, 15 Aug 2018 23:35:09 +0000 (01:35 +0200)]
cmake: Autogenerate most of the .qrc resource files

With the CMake support from the previous commit, resource files
can now be autogenerated. Do this for almost all resources;
the hicolor one is special because it uses aliases, and the i18n
one requires more work that is going to be added in a follow-up
commit.

Combine several of the previous resources (e.g. different icon sets)
to reduce complexity. This wasn't possible previously due to the
various configuration-specific combinations, but can now be done
dynamically by extending the glob patterns accordingly.

10 months agocmake: Add support for generating .qrc files
Manuel Nickschas [Wed, 15 Aug 2018 23:25:43 +0000 (01:25 +0200)]
cmake: Add support for generating .qrc files

Most .qrc files we use just map the (partial) contents of a
directory, so that can be autogenerated. Provide CMake functions
that support this endeavour to remove the need of regenerating
resource files if directory contents changes.

Since RCC is stupid, some hacks are required to make this work,
so we can't use either autorcc nor qt5_add_resource(); we must
invoke RCC manually. Clever use of targets and custom commands
as well as external CMake script invocation ensures that the .qrc
files are always up to date even if files change, while avoiding
useless rebuilds (as is currently still the case for i18n).

10 months agocmake: Fix source-specific compile definitions
Manuel Nickschas [Mon, 13 Aug 2018 21:50:24 +0000 (23:50 +0200)]
cmake: Fix source-specific compile definitions

set_source_files_properties() overwrites previously specified
properties and does not have a way to append, which is bad when
e.g. conditionally adding multiple compile definitions to a file.
In this particular case, for main.cpp -DHAVE_UMASK would overwrite
-DEMBED_DATA, and thus resources would not be loaded.

Use set_property(SOURCE... APPEND PROPERTY...) instead.

10 months agocmake: Modernize cmake support for LDAP
Manuel Nickschas [Wed, 8 Aug 2018 20:22:39 +0000 (22:22 +0200)]
cmake: Modernize cmake support for LDAP

Use a more modern, property-based find script for the LDAP libraries
and get rid of the deprecated use of LDAP_LIBRARIES and similar
variables in favor of a namespaced Ldap::Ldap target.
Set package properties for better diagnostic output at configure time.

10 months agocmake: Reorganize package finding
Manuel Nickschas [Mon, 6 Aug 2018 21:35:00 +0000 (23:35 +0200)]
cmake: Reorganize package finding

Use COMPONENTS to find required Qt5 modules in one go.
Don't look for QtWebKit if we already have QtWebEngine.
Look for Sonnet explicitly even when using KDE Frameworks, because
we're using its config widget and shouldn't rely on transitivity
here.
Only look for LDAP when building the core (or mono client).
Add QUIET everywhere to avoid spammy CMake warnings for optional
packages.
Add some diagnostic output indicating the versions of Qt and KF5.

10 months agocmake: Remove some compiler flags that are no longer needed
Manuel Nickschas [Mon, 6 Aug 2018 21:27:10 +0000 (23:27 +0200)]
cmake: Remove some compiler flags that are no longer needed

With the move to a property-based build system, we no longer need
special handling of -fPIC for Qt.

Also remove some things related to old KDE and CMake.

10 months agocmake: Set -DHAVE_UMASK only where it's needed
Manuel Nickschas [Mon, 6 Aug 2018 21:19:52 +0000 (23:19 +0200)]
cmake: Set -DHAVE_UMASK only where it's needed

Avoid setting this define globally when it's only used in two
files.

10 months agocmake: Remove boilerplate from HAVE_SSL check
Manuel Nickschas [Thu, 2 Aug 2018 23:32:35 +0000 (01:32 +0200)]
cmake: Remove boilerplate from HAVE_SSL check

Instead of setting flags and includes manually (potentially
polluting global variables), just link the test program to
Qt5::Core directly and rely on property propagation.

10 months agocmake: Modernize use of Qt Linguist Tools
Manuel Nickschas [Thu, 2 Aug 2018 23:11:08 +0000 (01:11 +0200)]
cmake: Modernize use of Qt Linguist Tools

All Qt versions we support provide an alias target for the linguist
tools. Thus, remove the fallback for older Qt versions.

Use the LOCATION property of the tools' target instead of relying
on the corresponding QT_L*_EXECUTABLE variables.

10 months agocmake: Modernize build system
Manuel Nickschas [Thu, 2 Aug 2018 21:16:22 +0000 (23:16 +0200)]
cmake: Modernize build system

Move to the modern, property-based way of using CMake. This
simplifies a lot of things:
 - No need to manually specify interface include dirs and libraries
   of dependencies
 - No need to carry around variables
 - Clear separation of local and global dependencies and definitions
 - No need for hacks to make the triple-executable thing work

Provide convenience functions to set up library and executable
targets. This will make it very easy in the future to split up
some modules, as well as move towards using shared libraries.

Use the modern, property-based way of using Qt, too. This removes
the need for the deprecated qt5_use_modules() macro, and a bunch
of manual things we had to do to get the compile flags right
for the different Quassel executables.
Also make use of CMake's AUTOUIC and AUTORCC to avoid a bunch of
boilerplate for dealing with .ui files and Qt resources.

Move the .ui files from their subdirectory into the qtui directory,
since the separation doesn't really make too much sense. We'd rather
want to split the QtUi module into smaller parts/libraries.

Remove a bunch of unnecessary stuff from the CMake files.

10 months agocmake: Remove custom build types
Manuel Nickschas [Wed, 1 Aug 2018 20:12:09 +0000 (22:12 +0200)]
cmake: Remove custom build types

The non-standard build types DebugFull and Profile (which we took
from KDE4) are not supported by e.g. Qt, so remove them.

Improve build type handling; show the supported values in CMake GUIs
and provide a sensible default if none is given (Release unless
a .git directory is present, in which case Debug is default).

10 months agocmake: Remove support for building static binaries
Manuel Nickschas [Tue, 31 Jul 2018 21:14:16 +0000 (23:14 +0200)]
cmake: Remove support for building static binaries

Building and running static binaries has become increasingly
difficult on modern systems, in particular when involving
complex libraries like Qt due to their reliance on plugins and
other dynamically loaded resources. It is also a security risk,
as upgrades to system libraries won't apply to the static binary.

Having a static quasselcore binary was quite useful when it was
hard to get Qt on an X11-less box, but these days all major distros
support modular Qt, and can provide Quasselcore packages that
don't require graphical dependencies. Consequently, we no longer
intend to offer static binaries.

Thus, remove the corresponding hacks from the build system.

10 months agocmake: Use official CMake config for QCA
Manuel Nickschas [Tue, 31 Jul 2018 20:18:05 +0000 (22:18 +0200)]
cmake: Use official CMake config for QCA

QCA has been shipping with a CMake config for a while, so use this
rather than providing a custom find module. Remove the custom
modules, as well as FindLibraryWithDebug.cmake which was only used
by them.

Move KeyEvent from common into core, since it's only used there.

10 months agocmake: Use official FindBacktrace rather than custom FindExecInfo
Manuel Nickschas [Tue, 31 Jul 2018 19:16:32 +0000 (21:16 +0200)]
cmake: Use official FindBacktrace rather than custom FindExecInfo

Newer versions of CMake ship their own FindBacktrace.cmake module,
which replaces the FindExecInfo.cmake module so far shipped by
Quassel. The official module is also a bit more thorough in terms
of cross-platform support.

To avoid duplication, remove Quassel's custom find module and use
the official one instead.

10 months agocmake: Bump minimum required CMake version to 3.5
Manuel Nickschas [Wed, 25 Jul 2018 22:47:13 +0000 (00:47 +0200)]
cmake: Bump minimum required CMake version to 3.5

This is the version shipped with Ubuntu 16.04 "Xenial", so
use this as a minimum requirement.

10 months agocmake: Only require a C++ compiler
Manuel Nickschas [Wed, 25 Jul 2018 20:49:27 +0000 (22:49 +0200)]
cmake: Only require a C++ compiler

With miniz gone, the only reason to still specify both C and CXX
as project languages is the use of the check_include_file cmake
macro.

Turns out there's a C++ version of that one, too; so use it.

10 months agocmake: Make zlib a required dependency, remove bundled miniz
Manuel Nickschas [Wed, 25 Jul 2018 21:59:57 +0000 (23:59 +0200)]
cmake: Make zlib a required dependency, remove bundled miniz

These days, zlib should be easily available on all platforms we
support, so make it a required dependency. This allows for removing
the bundled drop-in replacement miniz.

10 months agocommon: Rework command line option handling
Manuel Nickschas [Mon, 30 Jul 2018 22:15:52 +0000 (00:15 +0200)]
common: Rework command line option handling

Since we can now rely on Qt5's QCommandLineParser, there is
no longer a need for an abstraction for command line parsing.
Use QCommandLineParser directly, and remove the now obsolete
AbstractCliParser and its various implementations.

Move command line parsing into Quassel::init(), which allows for
using translated strings. Make user-visible strings translateable.

Remove the long-deprecated --datadir option for now (may come
back if we decide to allow for specifying the database location
independently of config files).

10 months agocommon: Initialize translations in Quassel::init()
Manuel Nickschas [Thu, 26 Jul 2018 20:58:40 +0000 (22:58 +0200)]
common: Initialize translations in Quassel::init()

In order to have localized strings during initialization, e.g. for
command line options, the translation catalogue must be loaded
early.

Since at this point the UI configuration is not available yet,
the system locale is used. QtUi will reload translations afterwards
later if a language different from the system locale is configured
for the UI.

10 months agoqt4-b-gone: Initialize data dir paths on demand
Manuel Nickschas [Thu, 26 Jul 2018 20:07:24 +0000 (22:07 +0200)]
qt4-b-gone: Initialize data dir paths on demand

Since special handling for KDE4 data locations was removed, it is
no longer required to set the paths from the outside. Simply
initialize the paths on first use.

10 months agoqt4-b-gone: Reorganize the initialization sequence
Manuel Nickschas [Thu, 26 Jul 2018 19:21:40 +0000 (21:21 +0200)]
qt4-b-gone: Reorganize the initialization sequence

KDE4 required special handling during initialization, because command
line arguments needed to be parsed before instantiating the
application object. Since this is no longer required, the sequence
can now be simplified.

To prepare for enabling early translations (also for the CLI parser),
instantiate the application first, then explicitly initialize the
Quassel instance in main() (which will later both load translations,
and handle CLI options). Only then also initialize the application
itself.

Since initialization errors are handled by exceptions anyway, get rid
of the return values for the various init() methods, too.

10 months agoqt4-b-gone: Remove bundled sha512 implementation
Manuel Nickschas [Tue, 17 Jul 2018 23:00:58 +0000 (01:00 +0200)]
qt4-b-gone: Remove bundled sha512 implementation

Qt5 supports SHA512 natively, so we no longer need to ship an
external implementation.

10 months agoqt4-b-gone: Remove all code supporting Qt < 5.5 and KDE4
Manuel Nickschas [Tue, 17 Jul 2018 22:42:45 +0000 (00:42 +0200)]
qt4-b-gone: Remove all code supporting Qt < 5.5 and KDE4

Remove compatibility code for Qt versions we no longer support.

10 months agoqt4-b-gone: Remove support for Phonon
Manuel Nickschas [Tue, 17 Jul 2018 20:11:01 +0000 (22:11 +0200)]
qt4-b-gone: Remove support for Phonon

Phonon is superseded by QtMultimedia, which offers everything we need
for playing audio notifications.

10 months agoqt4-b-gone: Remove support for libindicate
Manuel Nickschas [Tue, 17 Jul 2018 20:07:03 +0000 (22:07 +0200)]
qt4-b-gone: Remove support for libindicate

libindicate-qt only exists for the dead Qt4, so remove support
for it.

10 months agocmake: Bump minimum required version of Qt to 5.5.0
Manuel Nickschas [Tue, 17 Jul 2018 21:23:27 +0000 (23:23 +0200)]
cmake: Bump minimum required version of Qt to 5.5.0

This version of Qt is provided in Ubuntu "Xenial" 16.04, which is our
new baseline for distro support.

10 months agocmake: Remove build system support for Qt4/KDE4
Manuel Nickschas [Mon, 16 Jul 2018 22:11:57 +0000 (00:11 +0200)]
cmake: Remove build system support for Qt4/KDE4

In our quest to modernize the codebase, remove support for the
long-dead Qt4 libraries (and consequently, also for integration
into KDE4) from the build system.

10 months agotravis: Add bionic as target distro
Manuel Nickschas [Mon, 18 Jun 2018 17:50:49 +0000 (19:50 +0200)]
travis: Add bionic as target distro

This allows us to test building Quassel against a recent release
of Ubuntu, as well.

10 months agotravis: Add jobs for building against KDE Frameworks
Manuel Nickschas [Mon, 18 Jun 2018 17:27:15 +0000 (19:27 +0200)]
travis: Add jobs for building against KDE Frameworks

Define CMake options in a more generic way, and use this to define
builds against KDE Frameworks.

10 months agotravis: Use docker-based builds, new baseline
Manuel Nickschas [Sun, 17 Jun 2018 17:52:12 +0000 (19:52 +0200)]
travis: Use docker-based builds, new baseline

Perform Linux builds in docker images, which allows us to freely
define the build environment rather than relying on the Travis host
system.

Use Ubuntu 16.04 "Xenial" as the new baseline for Quassel, allowing
us to make use of a more modern toolchain.

Reorganize and modernize travis.yml in general.

10 months agoPost-release version bump 0.14-pre
Manuel Nickschas [Sat, 17 Nov 2018 19:49:54 +0000 (20:49 +0100)]
Post-release version bump

10 months agoBump version for release 0.13.0
Manuel Nickschas [Thu, 15 Nov 2018 23:46:16 +0000 (00:46 +0100)]
Bump version for release

10 months agoUpdate ChangeLog
Manuel Nickschas [Thu, 15 Nov 2018 23:44:51 +0000 (00:44 +0100)]
Update ChangeLog

10 months agoMinor cleanup of BufferView
Manuel Nickschas [Fri, 16 Nov 2018 19:04:01 +0000 (20:04 +0100)]
Minor cleanup of BufferView

Fix some nitpicks.

10 months agoAllow selecting the search result when searching for buffers
Martin T. H. Sandsmark [Mon, 29 Oct 2018 11:52:17 +0000 (12:52 +0100)]
Allow selecting the search result when searching for buffers

If multiple buffers are displayed when filtering by name, allow
selecting one of the using the up/down keys. This makes it possible
to jump to a buffer other than the topmost.

10 months agocommon: Fix syncing of BufferViewManager
Manuel Nickschas [Wed, 7 Nov 2018 20:01:39 +0000 (21:01 +0100)]
common: Fix syncing of BufferViewManager

Two syncable methods where accidentally demoted from being slots,
so adding/removing buffer views would not be synced anymore.

Fix this by making those methods slots again.

10 months agoqtui: Make the debug log a proper dialog
Manuel Nickschas [Tue, 6 Nov 2018 22:46:33 +0000 (23:46 +0100)]
qtui: Make the debug log a proper dialog

For some reason unbeknownst and shrouded in ancient mystery, the
debug log was displayed in a naked widget, which caused it to not
be rendered in a window when using not-so-smart window managers
(such as Windows™).

Make the debug log a proper dialog, and also fix the close button
not being part of a platform-agnostic QDialogButtonBox, while we're
at it.

10 months agocore: Avoid Clang warning for inconsistent override
Manuel Nickschas [Thu, 1 Nov 2018 09:09:35 +0000 (10:09 +0100)]
core: Avoid Clang warning for inconsistent override

10 months agoircuser: Fix setting of away message time by pre-0.13 cores
Manuel Nickschas [Tue, 30 Oct 2018 16:26:43 +0000 (17:26 +0100)]
ircuser: Fix setting of away message time by pre-0.13 cores

IrcUser::setLastAwayMessage() is called by pre-0.13 cores (newer
cores call setLastAwayMessageTime() instead). Fix wrong use of
QDateTime::from[M]SecsSinceEpoch(), which is a static method returning
a new QDateTime instance rather than a modifying setter.

Also fix signatures passing primitive types as const refs.

10 months agoqtui: Disable web preview by default
Manuel Nickschas [Tue, 30 Oct 2018 19:07:44 +0000 (20:07 +0100)]
qtui: Disable web preview by default

Upon popular request, disable the web preview by default. This
feature tends to surprise unwitting new users that just happen
to hover over a questionable link, and the preview's functionality
is limited anyway with today's complex websites.

The web preview can still be enabled explicitly in chatview settings.
Existing configurations are unaffected by this change.

10 months agoFix the order of the Davids
David ‘Bombe’ Roden [Mon, 22 Oct 2018 14:04:16 +0000 (16:04 +0200)]
Fix the order of the Davids

11 months agoBump version for release 0.13-rc2 build/0.13-rc2
Manuel Nickschas [Mon, 15 Oct 2018 17:51:51 +0000 (19:51 +0200)]
Bump version for release

11 months agoUpdate ChangeLog
Manuel Nickschas [Mon, 15 Oct 2018 17:51:00 +0000 (19:51 +0200)]
Update ChangeLog

11 months agocommon: Remove left-overs from signal handling rework
Manuel Nickschas [Sun, 14 Oct 2018 19:39:03 +0000 (21:39 +0200)]
common: Remove left-overs from signal handling rework

Remove some remnants of the old code that were missed when pushing
the reworked implementation.

11 months agoclient: For filter, prioritize exact, startsWith
Shane Synan [Sat, 6 Oct 2018 18:53:59 +0000 (13:53 -0500)]
client: For filter, prioritize exact, startsWith

When filtering buffer view results, prioritize exact string matches,
then prioritize startsWith matches, both case-insensitive.  Within
these results, sort normally (e.g. alphabetical).

This gives weight to exact matches and the start of the string.  When
no filter string is specified, sorting goes back to normal.

Search string: "car"
Before:
> acar
> bcar
> careful
> caring
> racecar
> car [hidden]

After:
> car [hidden]
> careful
> caring
> acar
> bcar
> racecar

Where [hidden] represents a buffer that's temporarily or permanently
hidden.

11 months agoclient: Sort network name case-insensitively
Shane Synan [Sat, 6 Oct 2018 17:48:20 +0000 (12:48 -0500)]
client: Sort network name case-insensitively

Set BufferViewFilter to sort case-insensitively.  This results in
network names being sorted regardless of case.  Channel/nickname
sorting is handled elsewhere.

Before:
> Alpha
> Freenode
> beta

After:
> Alpha
> beta
> Freenode

This probably matches expectations better, and hopefully doesn't
break existing workflows too much...  https://xkcd.com/1172/

11 months agocommon: Don't use unsafe functions when handling POSIX signals
Manuel Nickschas [Fri, 5 Oct 2018 21:07:04 +0000 (23:07 +0200)]
common: Don't use unsafe functions when handling POSIX signals

The set of functions we're allowed to safely use in a POSIX signal
handler is very limited, and certainly does not include anything Qt.
While our previous implementation seemingly worked anyway as long as
all it did was quitting the application, we now start seeing issues
when doing a proper shutdown.

Fix this by providing a generic API for watching signal-like external
events that can be specialized for the various platforms we support.
Provide PosixSignalWatcher, which uses socket notification to safely
hand over control from the signal handler to the Qt event loop.

Also provide an implementation for Windows that still uses the
previous approach; since Windows doesn't support socketpair(), we
can't easily reuse the POSIX implementation. On the bright side, so
far we don't know if signal handlers on Windows face the same
limitations as on POSIX anyway...
Also on Windows we now support console events, i.e. Ctrl+C as well
as closing the console window.

11 months agoqtui: Don't parent dialogs created on the stack
Manuel Nickschas [Thu, 4 Oct 2018 10:52:42 +0000 (12:52 +0200)]
qtui: Don't parent dialogs created on the stack

Dialogs that are created on the stack should not have a parent,
lest they get double-deleted if the main window is destroyed while
such a dialog is still open.

11 months agoRevert "qtui: Don't create parented dialogs on the stack"
Manuel Nickschas [Thu, 4 Oct 2018 10:19:54 +0000 (12:19 +0200)]
Revert "qtui: Don't create parented dialogs on the stack"

Auto-deleting dialogs is a bad idea if we're accessing the instance
after exec(). We could work around this in the affected cases,
however it may be easier and cleaner to create the dialogs on the
stack again, but don't parent them to avoid the crashes we intended
to fix with this commit.

This reverts commit 4e452ee828fdb411e6b1db07c18e02681a30ff27.

11 months agocommon: Don't warn on unknown user in IrcChannel
Manuel Nickschas [Sat, 29 Sep 2018 17:47:05 +0000 (19:47 +0200)]
common: Don't warn on unknown user in IrcChannel

When quitting a channel, the IrcChannel instance may still be
receiving pending events for IrcUsers that have already been removed.
Don't log a warning in this case, because it doesn't help and confuses
users.

11 months agocore: Fix quitting from networks on shutdown
Manuel Nickschas [Sat, 29 Sep 2018 17:38:43 +0000 (19:38 +0200)]
core: Fix quitting from networks on shutdown

The previous implementation relied on processEvents() to let the
QUIT command be sent to the IRC server. However, processEvents()
does not guarantee that it processes all events (also in other
threads), and indeed, the previous approach was not reliable.

Fix this by waiting for the networks to emit the disconnected()
signal after requesting the quit. There already is a 10 second
timeout in case the IRC server does not close the socket within
a reasonable time, so rely on that. Also ensure that connect requests
are ignored during shutdown.

With the CoreSession requesting a clean shutdown, we no longer need
a similar handling in CoreNetwork's dtor, so remove this.

See also GH-203 and GH-207, which were previous attempts on getting
this right.

11 months agocore: Allow clean shutdown of the core
Manuel Nickschas [Sat, 29 Sep 2018 15:31:42 +0000 (17:31 +0200)]
core: Allow clean shutdown of the core

Relying on things to happen while the core is being destroyed is
fragile (and does not work in practice), because events are no
longer delivered to objects that are scheduled for deletion.

Add an explicit call for shutting down the core, its sessions and
their networks. Wait for everything to be cleaned up properly before
quitting the session threads, and ultimately shutting down the main
event loop.

While we're at it, refactor SessionThread to follow the worker
pattern, rather than inheriting from QThread. This avoids accidentally
calling slots in the wrong thread. Ensure that all cross-thread
communication happens through queued signals. Simplify the API, too.

11 months agoqtui: Fix quit sequence and lifetime issues
Manuel Nickschas [Sat, 29 Sep 2018 09:52:12 +0000 (11:52 +0200)]
qtui: Fix quit sequence and lifetime issues

Make use of the Singleton mixin for Client and GraphicalUi. Fix
ownership and explicitly construct and destroy the pseudo singletons.
Remove some static init methods in favor of initializing in the
constructor where possible. We still need delayed initialization
of the main UI however, so GraphicalUi::init() has to stay.

Simply calling QCoreApplication::quit() doesn't clean up properly,
because it immediately stops event processing, which means that
any deferred deletions won't be processed anymore.

Since we perform some important and asynchronous tasks during
shutdown, such as saving settings and properly unregistering from
IRC, we really want proper cleanup, though.

Fix this by relying on Quassel::quit() instead, and registering
appropriate quit handlers that shut down the client in orderly
and controlled fashion. Ensure that all open windows and dialogs
are closed prior to MainWin's destruction.

Core shutdown warrants a more complex approach, which will be
implemented in a follow-up commit.

11 months agogit: Update .gitignore
Manuel Nickschas [Fri, 28 Sep 2018 20:54:15 +0000 (22:54 +0200)]
git: Update .gitignore

Actually hide project files from Qt Creator, as well as KDevelop.

11 months agocore: Use the Singleton mixin for the Core instance
Manuel Nickschas [Fri, 28 Sep 2018 20:28:33 +0000 (22:28 +0200)]
core: Use the Singleton mixin for the Core instance

Instead of implementing the instance pointer manually, use the
Singleton mixin.

11 months agocommon: Prepare Quassel::quit() to be used more widely
Manuel Nickschas [Fri, 28 Sep 2018 20:24:33 +0000 (22:24 +0200)]
common: Prepare Quassel::quit() to be used more widely

In the future we want to use Quassel::quit() as the central entry
point for cleanly quitting the application, instead of relying
on QCoreApplication::quit(), which directly stops the event loop
and thus won't process any asynchronous cleanup tasks.

Make the slot public, and protect against multiple invocations.

11 months agocommon: Use the Singleton mixin for the Quassel instance
Manuel Nickschas [Fri, 28 Sep 2018 19:41:31 +0000 (21:41 +0200)]
common: Use the Singleton mixin for the Quassel instance

Make use of the newly added Singleton mixon to remove the custom
handling of Quassel's instance pointer. Clearly define Quassel's
lifetime by making it a local instance in main(), rather than
relying on someone to call Quassel::instance() at the right time.

Now it is also clear that the instance is deleted after main()
returns (which was the case before, however there still was a no-op
Quassel::destroy() method too, which has now been removed). This
is fine, because Quassel does not own resources that should be deleted
before exiting the event loop.

11 months agocommon: Provide Singleton mixin for handling pseudo singletons
Manuel Nickschas [Fri, 28 Sep 2018 19:17:32 +0000 (21:17 +0200)]
common: Provide Singleton mixin for handling pseudo singletons

We have several singleton and pseudo-singleton classes in Quassel.
A pseudo singleton can be constructed and destroyed in a controlled
manner, but can be accessed through a static instance pointer while
it is alive. As an example, QCoreApplication behaves like this.

In order to avoid duplication and unify the behavior of our singletons
in the future, provide a mixin. Classes can inherit from this and gain
an instance() method, as well as protection against multiple
instantiation and access outside of the object's lifetime.