2 years agoidentd: Remove unneeded strict attribute
Manuel Nickschas [Mon, 18 Jun 2018 18:19:26 +0000 (20:19 +0200)]
identd: Remove unneeded strict attribute

Strictness is now handled in CoreSession, so the attribute is no
longer used.

2 years agoidentd: Ensure sockets are deleted when disconnected
Manuel Nickschas [Sun, 17 Jun 2018 22:07:51 +0000 (00:07 +0200)]
identd: Ensure sockets are deleted when disconnected

Don't leave stale sockets around; instead, have them delete themselves
once disconnected. Use a QPointer in Request to be able to check for
deletion before trying to access the socket.

2 years agoidentd: Cleanup
Manuel Nickschas [Sun, 17 Jun 2018 22:03:25 +0000 (00:03 +0200)]
identd: Cleanup

Fix formatting and const-correctness.

2 years agoidentd: Return INVALID-PORT if the parsing fails
Jan Alexander Steffens (heftig) [Sat, 19 May 2018 10:47:02 +0000 (12:47 +0200)]
identd: Return INVALID-PORT if the parsing fails

2 years agoidentd: Move response construction to Request
Jan Alexander Steffens (heftig) [Sat, 19 May 2018 10:31:40 +0000 (12:31 +0200)]
identd: Move response construction to Request

2 years agoidentd: Rework lowestSocketId handling
Jan Alexander Steffens (heftig) [Sat, 19 May 2018 10:31:40 +0000 (12:31 +0200)]
identd: Rework lowestSocketId handling

Since we're appending only strictly increasing integers, the lowest
socketId is always at the front of the list (if that exists).

hasSocketsBelowId also had a off-by-one error. This had no effect on the
code since a socketId equal to the current _socketId cannot be in the
_waiting list.

Reorder processWaiting's handling of requests:
  - If the socketId is one the request might have been waiting for,
    check responseAvailable.
  - Otherwise, if there is at least one socket we need to wait for,
    continue waiting.
  - Otherwise, responseUnavailable.

The former order was:
  - If there are no sockets left from before this request was made,
  - If the socketId is one the request might have been waiting for,
    check responseAvailable.
  - Otherwise, continue waiting.

The change was necessary as the lowestSocketId no longer includes the
socketId that was just removed. In addition, the new order also matches
the if-else chain in IdentServer::respond.

2 years agoidentd: Simplify responseAvailable via early return
Jan Alexander Steffens (heftig) [Sat, 19 May 2018 10:29:43 +0000 (12:29 +0200)]
identd: Simplify responseAvailable via early return

2 years agoidentd: Flatten respond's if-else chain
Jan Alexander Steffens (heftig) [Sat, 19 May 2018 10:29:42 +0000 (12:29 +0200)]
identd: Flatten respond's if-else chain

2 years agoidentd: Avoid a maybe-uninitialized warning
Jan Alexander Steffens (heftig) [Sat, 19 May 2018 10:42:48 +0000 (12:42 +0200)]
identd: Avoid a maybe-uninitialized warning

2 years agoidentd: Turn !canReadLine into an early return
Jan Alexander Steffens (heftig) [Sat, 19 May 2018 10:29:42 +0000 (12:29 +0200)]
identd: Turn !canReadLine into an early return

Reduces rightward drift.

2 years agoidentd: Implement --ident-port option
Janne Koschinski [Tue, 8 May 2018 15:44:25 +0000 (17:44 +0200)]
identd: Implement --ident-port option

2 years agoidentd: Implement blocking request queueing
Janne Koschinski [Mon, 7 May 2018 23:49:13 +0000 (01:49 +0200)]
identd: Implement blocking request queueing

2 years agoidentd: Initial draft of integrated ident daemon
Janne Koschinski [Mon, 7 May 2018 22:12:32 +0000 (00:12 +0200)]
identd: Initial draft of integrated ident daemon

2 years agoqtui: Fix typo
Manuel Nickschas [Mon, 18 Jun 2018 06:46:20 +0000 (08:46 +0200)]
qtui: Fix typo

2 years agoclient: Use QT_VERSION for 'enum class' fallback
Shane Synan [Sun, 17 Jun 2018 19:30:33 +0000 (14:30 -0500)]
client: Use QT_VERSION for 'enum class' fallback

Use QT_VERSION macro for 'enum class' fallback, making it much
simpler to clean up the Qt4 code once the migration happens.

2 years agodocs: Move SQL schema to README.md, add more help
Shane Synan [Sun, 17 Jun 2018 19:25:39 +0000 (14:25 -0500)]
docs: Move SQL schema to README.md, add more help

Move SQL schema guidelines to a dedicated README.md, with all the
niceties of Markdown formatting and the added prominence of GitHub
displaying it whenever navigating to the `src/sql` folder.

Add a brief high-level overview of Quassel's database schema.

Polish up the SQL schema guidelines to follow the current Quassel

Clean up remarks in the script files, including pointing to the new
README.md file.

2 years agodocs: Revert '–' to '--' in root README.md
Shane Synan [Sun, 17 Jun 2018 17:38:12 +0000 (12:38 -0500)]
docs: Revert '–' to '--' in root README.md

Revert to '--' in root README.md instead of Unicode '–'.  The former
is easier to distinguish in monospace text environments.

2 years agoqtui: Fix typo in #ifdef
Manuel Nickschas [Sun, 17 Jun 2018 17:32:11 +0000 (19:32 +0200)]
qtui: Fix typo in #ifdef

2 years agoicons: Don't offer the Oxygen fallback if not enabled in CMake
Manuel Nickschas [Sun, 17 Jun 2018 14:01:11 +0000 (16:01 +0200)]
icons: Don't offer the Oxygen fallback if not enabled in CMake

If -DWITH_OXYGEN_ICONS is disabled, Quassel will not install its
own Oxygen icons, and thus those would be missing if Oxygen were
chosen as a fallback.

Ensure that the fallback isn't offered in this case even if there
happens to be a (runtime-detected) system installation of Oxygen.

2 years agoicons: Update icons/README.md to match reality
Manuel Nickschas [Sun, 17 Jun 2018 13:59:07 +0000 (15:59 +0200)]
icons: Update icons/README.md to match reality

2 years agoicons: Update bundled icon themes
Manuel Nickschas [Sun, 17 Jun 2018 12:36:37 +0000 (14:36 +0200)]
icons: Update bundled icon themes

Adapt to the changes in the previous commit.

2 years agoicons: Warn on missing icons
Manuel Nickschas [Sun, 17 Jun 2018 11:39:25 +0000 (13:39 +0200)]
icons: Warn on missing icons

Provide new helper functions icon::get() that replace the uses of
QIcon::fromTheme. These functions still use fromTheme() internally,
but log a warning if an icon could not be found. This should make
it easier to detect problems with icons.

Replace all uses of QIcon::fromTheme() with icon::get(), remove
useless fallbacks as that should be taken care of by the normal
icon loader mechanism.

Update the icon import script accordingly.

2 years agodocs: Simplify README.md, add help, downloads
Shane Synan [Sun, 17 Jun 2018 04:27:25 +0000 (23:27 -0500)]
docs: Simplify README.md, add help, downloads

Add more guidance to README.md, namely the use of `--help`.

Add a section on downloads, pointing to the official download page,
automated builds, and community-contributed builds.

Move the status badges to a new line, simplifying the header

Clean up the URLs with Markdown references, add the "Windows: " text
to AppVeyor builds to distinguish it from Linux.  Travis CI
unfortunately does not allow for a similar customization.

Replace "--" with "–", a Unicode replacement that should match the

Replace ```triple-backticks``` with `single-backticks`; both function
correctly and the latter is less annoying to read as plain text.

Fix bullet list indentation.

See https://docs.travis-ci.com/user/status-images/
And https://www.appveyor.com/docs/status-badges/

2 years agoExclude ignored messages in Away Log
Svetlana Tkachenko [Wed, 31 Jan 2018 23:11:35 +0000 (23:11 +0000)]
Exclude ignored messages in Away Log

Cleaned-up-by: Manuel Nickschas <sputnick@quassel-irc.org>
2 years agocmake: Enable ccache by default, if available
Manuel Nickschas [Sat, 16 Jun 2018 19:58:51 +0000 (21:58 +0200)]
cmake: Enable ccache by default, if available

Check for the existence of the ccache binary, and enable ccache
support if available. This avoids the need for hacks using PATH
or the CXX variable to make ccache work.

The automatic detection can be disabled by passing -DUSE_CCACHE=OFF
to CMake (may be useful for distributors having their own ccache
infrastructure in place).

Reorder things in the top-level CMakeLists.txt a bit, because ccache
should be enabled before calling project() (which checks compiler

2 years agoclient: UiStyle.h use "enum" for Qt4, cleanup
Shane Synan [Sat, 16 Jun 2018 18:17:59 +0000 (13:17 -0500)]
client: UiStyle.h use "enum" for Qt4, cleanup

Use "enum" instead of "enum class" for Qt4 support in Q_ENUMS, adding
a comment about switching back later.

Update Doxygen comments to properly associate to the previous line
via "///<" intead of "///".

2 years agoclient: Remove unused highlight UI translations
Shane Synan [Sat, 16 Jun 2018 17:12:09 +0000 (12:12 -0500)]
client: Remove unused highlight UI translations

Mark the highlightImport text and tooltip in
CoreHighlightSettingsPage as no translate, and make it obvious this
text is replaced at runtime.

Let Qt Creator do its formatting thing, updating the UI width and

2 years agoclient: Clean up chatviewsettingspage.ui
Shane Synan [Sat, 16 Jun 2018 17:10:00 +0000 (12:10 -0500)]
client: Clean up chatviewsettingspage.ui

Clean up the HTML spew from the Rich Text editor for
senderPrefixComboBox, using handcrafted Qt markup to simplify it for
translators.  (Hopefully.)

CAUTION: Editing the tooltip in Qt's Rich Text editor will convert it
back to HTML.  Use the Source view of the editor.

Use <number> instead of <bool> for custom enumeration values.  This
stops Qt Creator from converting it to "false" when loading the file.

2 years agoclient: ChatViewSettings check before reload Qss
Shane Synan [Thu, 14 Jun 2018 05:33:41 +0000 (00:33 -0500)]
client: ChatViewSettings check before reload Qss

Check if Qt stylesheet needs regenerating before regenerating and
reloading the stylesheet, only doing it if the font settings change.
Everything else doesn't modify the stylesheet, speeding up changing
those settings when font is not changed.

2 years agoclient: Highest sender prefix mode, migrate, fix
Shane Synan [Thu, 14 Jun 2018 04:58:48 +0000 (23:58 -0500)]
client: Highest sender prefix mode, migrate, fix

Add a "Highest mode" for showing sender prefixes, to only show the
highest in a given situation.  This mimics most IRC clients,
including Quasseldroid, while still saving the full mode details
behind the scenes.

Switch the UI from a Checkbox to a ComboBox, with all the 'fun' of
enums in Qt.  (Tip: don't code when tired.)

Add settings migration to preserve "None" for people upgrading, so
they won't suddenly see changes.

NOTE:  0.13 master users will need to opt in to enable showing sender
prefixes again.  A migration could be added, but the checkbox has
never been in beta or stable...

Fix up the "enableSenderBrackets" fallback default to be false, as
per Quassel itself.

Fix the sender prefix feature check to use "SenderPrefixes" instead
of "CoreSideHighlights".

2 years agoclient: add FontSelector SettingsPage::hasChanged
Shane Synan [Thu, 14 Jun 2018 03:45:41 +0000 (22:45 -0500)]
client: add FontSelector SettingsPage::hasChanged

Add support for FontSelector in SettingsPage::hasChanged(), allowing
one to easily test if a specific font selector has changed since last

This allows for optimizing stylesheet updates to only happen when
relevant settings are changed.

2 years agoclient: Fix SettingsPage::hasChanged() failure
Shane Synan [Thu, 14 Jun 2018 03:36:28 +0000 (22:36 -0500)]
client: Fix SettingsPage::hasChanged() failure

Fix SettingsPage::hasChanged() to compare with the correct property,
"storedValue", instead of "StoredValue".  This resulted in the
settings page sometimes errantly marking values as not changed when
they were, or vice-versa.

Some settings pages could probably be cleaned up now that this is
fixed.  That is left for future cleanup efforts.

2 years agoclient: Fix settings migration fallthrough
Shane Synan [Thu, 14 Jun 2018 03:32:55 +0000 (22:32 -0500)]
client: Fix settings migration fallthrough

Version 8 was not supposed to fall through to version 7.  Fix this.

2 years agoqtui: Fix build for KDE4
Manuel Nickschas [Sat, 16 Jun 2018 18:34:45 +0000 (20:34 +0200)]
qtui: Fix build for KDE4

2 years agoClean up High-DPI scaling options
Ken Moore [Mon, 1 May 2017 14:53:40 +0000 (10:53 -0400)]
Clean up High-DPI scaling options

Ensure the attributes are set before instantiating the application
object, slightly modify Qt version requirements.

Closes GH-293.

Mangled-by: Manuel Nickschas
2 years agomono: "Import Legacy" for import local highlights
Shane Synan [Wed, 13 Jun 2018 21:10:15 +0000 (16:10 -0500)]
mono: "Import Legacy" for import local highlights

Rename "Import Local" as "Import Legacy", and replace references to
"Local Highlights" with "Legacy Highlights" in core-side highlights
when running in monolithic mode.

This reduces confusion over where highlights are imported when
migrating highlights in Monolithic mode.

This continues clarification efforts in a previous commit,

Only import if question message box result is Yes, instead of not No.
This reduces the risk of accidentally importing if the message box is
ever changed to give more options or if it returns other responses.

2 years agoRemove unused quassel.icns
romibi [Fri, 15 Jun 2018 09:51:28 +0000 (11:51 +0200)]
Remove unused quassel.icns

2 years agoAutogenerate icns from png iconset for app bundle
romibi [Fri, 15 Jun 2018 09:51:03 +0000 (11:51 +0200)]
Autogenerate icns from png iconset for app bundle

2 years agoclient: Update welcome logo with new logo, shadow
Shane Synan [Fri, 15 Jun 2018 20:57:21 +0000 (15:57 -0500)]
client: Update welcome logo with new logo, shadow

Update "quassel-logo.svgz" with new Quassel logo, reduce the
drop-shadow intensity.

Update "quassel-logo.png" with the revised SVG file.

Clean up "quassel-logo.svgz" using the latest Inkscape version, set
up document parameters so Export PNG -> "Page" size works.

To recreate the drop shadow in Inkscape:
1.  Select all objects
2.  In the menu, choose "Filters" -> "Remove Filters", clearing any existing shadows
3.  Select chat bubble logo
4.  In the menu, choose "Filters" -> "Shadows and Glows" -> "Drop Shadow..."
5.  In the "Options" tab, set as follows...
    > Blur radius:       2.1 px
    > Horizontal offset: 1.1 px
    > Vertical offset:   1.1 px
6.  In the "Blur color" tab, set as follows...
    > RGBA:              1c1c1c33
7.  Apply the filter
8.  Select the "Quassel IRC" text object
9.  In the menu, choose "Filters" -> "Shadows and Glows" -> "Drop Shadow..."
10. In the "Options" tab, set as follows...
    > Blur radius:       4.2 px
    > Horizontal offset: 2.1 px
    > Vertical offset:   2.1 px
11. In the "Blur color" tab, set as follows...
    > RGBA:              1c1c1c33
12. Apply the filter

To export an updated welcome logo:
1.  In the menu, choose "File" -> "Export PNG Image..."
2.  For "Export Area", choose "Page"
3.  Export the image

2 years agoqtui: Rework the attention state behavior of the tray icon
Manuel Nickschas [Thu, 14 Jun 2018 22:59:15 +0000 (00:59 +0200)]
qtui: Rework the attention state behavior of the tray icon

Move the attention behavior handling into the SystemTray base class,
which now determines the correct icon names to display based on
the tray state and notification settings. Systray implementations
now just react on signals from the base class to update their
icons accordingly.

Extend the systray notification settings to allow for a more fine-
grained configuration. Users can now choose if the tray should be
alerted at all, and if so, if the tray icon should change color or
even blink instead of relying on the visualizer's default.

This now works with both StatusNotifierItem and the legacy tray.

Supersedes and closes GH-327.

2 years agoqtui: Fix duplication of tray icon with StatusNotifier
Manuel Nickschas [Thu, 14 Jun 2018 22:55:07 +0000 (00:55 +0200)]
qtui: Fix duplication of tray icon with StatusNotifier

Don't register a custom D-Bus service for the StatusNotifierItem.
Instead, just use the base service that is already registered.

Fixes the duplication of the tray icon that sporadically happened
with Plasma's SNI visualization, which sometimes forgot to properly
track the custom service name.

2 years agoqtui: Hide "fallback" and "Override" if no system theme is configured
Manuel Nickschas [Thu, 14 Jun 2018 19:47:26 +0000 (21:47 +0200)]
qtui: Hide "fallback" and "Override" if no system theme is configured

On platforms that don't support icon themes, it does not make sense
to show related options in appearance settings.

Hide the override option in that case, and change wording from
"Fallback icon theme" to just "Icon theme".

2 years agoqtui: Don't show config for DockManager if not available
Manuel Nickschas [Thu, 14 Jun 2018 19:13:41 +0000 (21:13 +0200)]
qtui: Don't show config for DockManager if not available

Instead of just disabling the checkbox for DockManager notifications,
hide the config widget if the D-Bus service is not available.
Otherwise it's really confusing to see a disabled option for a
notification backend that was basically retired 6 years ago.

2 years agoqtui: Show core connection dialog only after initialization
Manuel Nickschas [Thu, 14 Jun 2018 19:12:17 +0000 (21:12 +0200)]
qtui: Show core connection dialog only after initialization

Showing a blocking dialog in init() is a bad idea, because then
initialization doesn't actually finish until the dialog is closed.
For example, this delays the setup of the tray icon.

Instead, go through the event loop before showing the initial
connection dialog.

2 years agoicons: Fix icons not showing for format color buttons
Manuel Nickschas [Thu, 14 Jun 2018 17:58:21 +0000 (19:58 +0200)]
icons: Fix icons not showing for format color buttons

Adding a menu to a button seems to clear an icon set previously
until the button is clicked. Fix this by reordering things.

2 years agoqtui: Fix tooltip and change wording in Appearance settings
Manuel Nickschas [Thu, 14 Jun 2018 17:33:38 +0000 (19:33 +0200)]
qtui: Fix tooltip and change wording in Appearance settings

Let the tooltip for "Fallback icon theme" wrap. Change the wording
from "Invert colors" to "Invert brightness", which is what the option
really does.

2 years agoqtui: Properly update tray icons
Manuel Nickschas [Wed, 13 Jun 2018 22:03:23 +0000 (00:03 +0200)]
qtui: Properly update tray icons

Refresh tray icons in case the icon theme is changed, or when
switching between normal and inverted tray icons.

2 years agoqtui: Refactor the system tray implementations
Manuel Nickschas [Wed, 13 Jun 2018 21:47:52 +0000 (23:47 +0200)]
qtui: Refactor the system tray implementations

Replace the mess of virtual methods and init() and other weird
shenanigans by a cleaner architecture. Handle mode/state changes
in the base class and let the implementations explicitly act on
changes. This should make it much clearer how the implementations
behave if mode or state change.

Simplify the D-Bus parts of StatusNotifierItem quite a bit by
keeping the SNI watcher always alive; no need to kill it when
unregistering. Add error handling to the final D-Bus registration
call and fall back to the legacy icon if something went wrong.

2 years agoicons: Add hicolor fallback for Qt < 5.5
Manuel Nickschas [Wed, 13 Jun 2018 20:57:37 +0000 (22:57 +0200)]
icons: Add hicolor fallback for Qt < 5.5

Turns out that Qt only added support for split icon themes in 5.5,
so with older Qt versions our icon theme support doesn't work

Install hicolor icons for Qt < 5.5, as we already do for Qt 4.
Add a hicolor icon resource, too, and make use of it in the system
tray implementations, which is arguably the most important place
to have proper icon support.

This adds around 130 KiB to the binary size, but should save a lot
of headaches.

2 years agoqtui: Switch to tray-specific icons
Manuel Nickschas [Tue, 12 Jun 2018 20:56:59 +0000 (22:56 +0200)]
qtui: Switch to tray-specific icons

Change icon names for the system tray to use the tray-specific
icons. Add support for inverted colors, too.

2 years agoqtui: Use icon names in tray implementations
Manuel Nickschas [Tue, 12 Jun 2018 20:00:01 +0000 (22:00 +0200)]
qtui: Use icon names in tray implementations

Instead of keeping QIcon instances in the base class, have a central
place to define the icon names for each state, and use that in the

2 years agoicons: Update application icon
Manuel Nickschas [Mon, 11 Jun 2018 22:06:41 +0000 (00:06 +0200)]
icons: Update application icon

Use the ones generated by justJanne, rather than the stock version.
Looks identical.

2 years agoqtui: Clean up SystemTray
Manuel Nickschas [Mon, 11 Jun 2018 20:52:16 +0000 (22:52 +0200)]
qtui: Clean up SystemTray

Remove inlines, use override, default-initialize attributes,
reorder methods.

2 years agoicons: Fix icon theme support for StatusNotifierItem
Manuel Nickschas [Mon, 11 Jun 2018 19:07:37 +0000 (21:07 +0200)]
icons: Fix icon theme support for StatusNotifierItem

If SNI is used, the tray icons are passed along to the visualizer
by name rather than as a pixmap (the SNI protocol would support
pixmaps too, however that is a) discouraged and b) not supported
e.g. in Unity).

The SNI interface supports a more or less undocumented attribute
IconThemePath, which may contain an additional path for the
visualizer to look into for specific icons. At least Plasma and
LXQt seem to expect a hicolor theme in the given directory.

Have StatusNotifierItem create a skeleton hicolor theme containing
the tray icons in a temporary directory, and pass that along via
IconThemePath. The tray icons to be saved are dynamically determined
using the current icon theme/fallback.

All available icon sizes are saved as pixmaps; sadly, with the dynamic
approach, scalable icons cannot be supported. Alternatively, one could
hard-code the relevant .svg files from the fallback themes, and copy
those, but that would just be annoying - and kill themeability.

2 years agointerfaces: Fix types in SNI interfaces, remove old annotations
Manuel Nickschas [Wed, 6 Jun 2018 22:49:20 +0000 (00:49 +0200)]
interfaces: Fix types in SNI interfaces, remove old annotations

Not sure why, but the pixmap types in the SNI interface were all
wrong (didn't seem to cause any issues, though, for some reason...).
Fix this.

Remove old com.trolltech.QtDBus.QtTypeName annotations, which are no
longer needed in any version of Qt we still support.

2 years agoFix notification icon not appearing in Unity
Daniel Albers [Tue, 5 Aug 2014 10:36:51 +0000 (12:36 +0200)]
Fix notification icon not appearing in Unity

Unity's indicator expects certain properties to be exported by an
application, of which Quassel is lacking some. This adds IconThemePath,
Menu, ItemIsMenu to org.kde.StatusNotifierItem.

Thanks a lot to shiznix for providing this patch.

Fixes #1269

(cherry picked from commit 3939820389d995f56a073fc1d54ab245c6558312)

2 years agoicons: Install Quassel-specific icons in hicolor for Qt4
Manuel Nickschas [Mon, 11 Jun 2018 18:37:05 +0000 (20:37 +0200)]
icons: Install Quassel-specific icons in hicolor for Qt4

Qt4 sadly doesn't support split icon themes yet, so our injection
and mechanism does not work.
Install the Quassel-specific icons into hicolor, so they should be
found at least in a proper system installation. Use the Oxygen
theme, because its layout matches the hicolor one (simplifying
the install rule), and it was default for Qt4 anyway.

2 years agocmake: Clean up icon-related build options
Manuel Nickschas [Tue, 5 Jun 2018 21:20:58 +0000 (23:20 +0200)]
cmake: Clean up icon-related build options

from CMake. Instead, provide two new options that should make things
a bit clearer:

-DWITH_BUNDLED_ICONS now controls if bundled icon themes should be
    installed/embedded. Defaults to ON to ensure that required
    icons are available unless explicitly disabled (e.g. by a
    package maintainer, who should then make sure that a dependency
    to Breeze/Oxygen exists).
    Disabling this option saves less than 2 MB of disk space.

-DWITH_OXYGEN_ICONS controls whether the Oxygen icon theme should
    still be supported. This affects both the Oxygen-themed
    Quassel-specific icons and the bundled icon theme. Defaults to
    OFF when building against Qt5, ON for Qt4.

Adapt code accordingly, and update INSTALL.

2 years agoqtui: Fix icons in the AboutDlg
Manuel Nickschas [Mon, 4 Jun 2018 20:13:12 +0000 (22:13 +0200)]
qtui: Fix icons in the AboutDlg

With the icon reorganization, no aliases are created inside resource
files anymore. Explicitly put the Breeze and Oxygen Quassel pixmaps
for the AboutDlg into pics/ and add it to the :pics/ resource.

Remove pics/quassel.png which was shipped, but not actually used
due to it missing from the resource file.

2 years agoqtui: Set proper icon for "About Quassel" menu option
Manuel Nickschas [Sun, 3 Jun 2018 23:16:01 +0000 (01:16 +0200)]
qtui: Set proper icon for "About Quassel" menu option

With the icons reorganization, we no longer have fallbacks available
on a resource path. Use QIcon::fromTheme() instead.

2 years agoqtui: Set default window icon independent of connection state
Manuel Nickschas [Sun, 3 Jun 2018 23:14:43 +0000 (01:14 +0200)]
qtui: Set default window icon independent of connection state

2 years agoqtui: Fix icon loading and improve icon theme support
Manuel Nickschas [Mon, 4 Jun 2018 22:07:01 +0000 (00:07 +0200)]
qtui: Fix icon loading and improve icon theme support

Quassel relies on quite a number of icons that are part of KDE/Plasma
icon themes such as Breeze and Oxygen, but are not specified by
freedesktop.org's Icon Naming Specification. As such, icon themes
other than the afforementioned most likely don't contain all the
icons Quassel needs.

Additionally, Quassel ships several additional icons that are not part
of any theme, but are made to fit in with Breeze/Oxygen.

In order to ensure that all required icons are available, we now
assume that at least one of Breeze, Breeze Dark or Oxygen themes is
available as a fallback, either as a system-wide installation, or by
having Quassel itself deploy the required subset in its data dir
(related build options will be adapted in a follow-up commit).

Allow the user to configure which fallback theme is to be used,
and if the system icon theme should be completely overridden (as
opposed to just filling in missing icons). If the system theme
is Breeze/Oxygen, just inject the corresponding Quassel-specific
icons. If the configured system theme doesn't match the selected
fallback (and should not be overridden), create a proxy icon theme
that inherits from first the system theme and then the selected
fallback. That way, missing icons are found through the inheritance

Note that as of Qt 5.11.0, icons from the hicolor default theme are
preferred over the ones from inherited themes, which violates the
Icon Theme Specification (cf. QTBUG-68603). This affects Quassel's
application icon, which will thus always use the Breeze variant
if a non-supported system icon theme is used. Other icons will be
picked from the selected fallback theme, as expected.

2 years agoqa: Use override in QtUi
Manuel Nickschas [Tue, 15 May 2018 22:36:44 +0000 (00:36 +0200)]
qa: Use override in QtUi

2 years agoicons: Use more common names for irc-channel-* icons
Manuel Nickschas [Tue, 15 May 2018 20:13:00 +0000 (22:13 +0200)]
icons: Use more common names for irc-channel-* icons

irc-channel-joined and irc-channel-parted are not shipped with Oxygen.
Use irc-channel-active and irc-channel-inactive instead, which are
supported by both Oxygen and Breeze (and are identical to the previous
ones in Breeze).

2 years agoicons: Fix message-quassel-tray-inverted icon
Manuel Nickschas [Mon, 4 Jun 2018 20:38:01 +0000 (22:38 +0200)]
icons: Fix message-quassel-tray-inverted icon

Use the correct base shape for this icon.

2 years agoicons: Update bundled Breeze and Breeze Dark icon themes
Manuel Nickschas [Tue, 15 May 2018 19:40:47 +0000 (21:40 +0200)]
icons: Update bundled Breeze and Breeze Dark icon themes

Update to latest upstream commit.

2 years agoicons: Adapt and improve icon import script
Manuel Nickschas [Tue, 15 May 2018 19:14:09 +0000 (21:14 +0200)]
icons: Adapt and improve icon import script

No longer require running it from inside a specific directory.
Remove theme-specific blacklists, as they are not needed anymore.
Modernize and improve the code a bit.

2 years agoicons: Remove obsolete hicolor icons
Manuel Nickschas [Mon, 14 May 2018 21:59:32 +0000 (23:59 +0200)]
icons: Remove obsolete hicolor icons

The hicolor directory should only contain the application icon
for external use. Remove other icons (which are no longer used
by Quassel anyway).

Move irc-channel-joined and irc-channel-parted into the quassel-
specific oxygen icon set, as they're not part of the upstream theme.

2 years agoicons: Reorganize icon directories
Manuel Nickschas [Mon, 14 May 2018 21:44:21 +0000 (23:44 +0200)]
icons: Reorganize icon directories

Move bundled icon themes into 3rdparty/icons for clarity. Move
Quassel-specific icons from icons/extra-icons into icons proper.
Rename breezedark to breeze-dark to match the upstream directory
name. Update corresponding qrc files accordingly.

Note that this breaks icon loading until the code is adapted to
properly support icon themes and fallback mechanisms. This will
be fixed in a follow-up commit. Since then Quassel itself will
no longer use the hicolor icons (which are only intended to contain
the application icons for use by desktop environments), there is
no need to bundle them anymore.

The import_theme.pl script also still requires adaptations that will
be delivered in a later commit.

2 years agoAdd a README to the icons folder
romibi [Sat, 17 Mar 2018 17:06:29 +0000 (18:06 +0100)]
Add a README to the icons folder

2 years agoUpdate qrc's for new Icons and update Import Script
romibi [Thu, 1 Feb 2018 22:47:30 +0000 (23:47 +0100)]
Update qrc's for new Icons and update Import Script

2 years agoUpdate Quassel-Icons based on justjannes icon-repo
romibi [Thu, 1 Feb 2018 22:42:36 +0000 (23:42 +0100)]
Update Quassel-Icons based on justjannes icon-repo

See https://github.com/justjanne/quassel-icons commit 18a8974
inkl. new slim Tray-Icons
inkl. Inverted Tray Icons (Light to Dark and vice versa)
Updated Quassel App Icon
Put Extra Icons in a separate folder in Resources/Data
Updated quassel.ico and .icns

2 years agoShip light and dark Breeze Icon theme by default
romibi [Thu, 1 Feb 2018 22:50:44 +0000 (23:50 +0100)]
Ship light and dark Breeze Icon theme by default

2 years agoMove systray animation settings to notification settings page
romibi [Mon, 5 Feb 2018 17:51:54 +0000 (18:51 +0100)]
Move systray animation settings to notification settings page

2 years agoSplit systray notification backend
romibi [Mon, 5 Feb 2018 17:40:37 +0000 (18:40 +0100)]
Split systray notification backend

into SystrayAnimationNotificationBackend for tray icon animation
and SystrayNotificationBackend for tray message popup

2 years agoqtui: Properly fix the SettingsDlg layout
Manuel Nickschas [Mon, 4 Jun 2018 21:44:32 +0000 (23:44 +0200)]
qtui: Properly fix the SettingsDlg layout

We've suffered from the page tree in the settings dialog being
squashed horizontally for a long time. A previous commit (65c463f0)
tried to fix this by calculating a minimum size and explicitly
resizing the dialog, but this didn't properly work at least on HIDPI

Instead, fix layouting properly by setting the correct size policy
for the tree widget, and removing both the afforementioned workaround
and a previous hack that tried to set the minimum width manually
(and failed due to a still-hidden widget reporting wrong size hints).

2 years agomono: Move Local Highlights -> Legacy Highlights
Shane Synan [Wed, 6 Jun 2018 19:02:40 +0000 (14:02 -0500)]
mono: Move Local Highlights -> Legacy Highlights

Rename "Local Highlights" as "Legacy Highlights", and rename
"Remote Highlights" as plain "Highlights".  Update the info-bar text
and other references as appropriate.

This reduces confusion over which highlights to configure in
Monolithic mode.

2 years agomono: Show a popup during database migration
Manuel Nickschas [Wed, 30 May 2018 23:16:47 +0000 (01:16 +0200)]
mono: Show a popup during database migration

Database upgrades may take a long while, during which the monolightic
client can not be used. Show a modal popup during migration to both
inform the user about what's going on, and preventing them from
interacting with the client until the internal core is up and running.

Show an "Initializing..." message in the status bar while the core
is starting up, so there's some indication for the user besides the
modal popup.

2 years agomono: Run the internal core in a separate thread
Manuel Nickschas [Wed, 30 May 2018 22:34:13 +0000 (00:34 +0200)]
mono: Run the internal core in a separate thread

Prevent the internal core from blocking the UI of the monolithic
client by running it in a separate thread. This is particularly
important during startup, where e.g. a database upgrade may block
the core for a significant time, preventing the main window from
being rendered, or even showing up.

2 years agocore: Only load translations if running stand-alone
Manuel Nickschas [Wed, 30 May 2018 22:25:00 +0000 (00:25 +0200)]
core: Only load translations if running stand-alone

For the monolithic client, the UI part takes care of loading the
translations configured by the user; the core should not override

Only if the core is running stand-alone, it needs to load
translations itself (using the system locale, since there is no
core-side configuration for this).

2 years agocore: Properly parent QObject-derived attributes
Manuel Nickschas [Wed, 30 May 2018 20:20:17 +0000 (22:20 +0200)]
core: Properly parent QObject-derived attributes

In order to be able to move the Core instance to another thread,
all QObject-derived attributes must be properly parented, so they
move with their parent object.

2 years agocore: Change signature of Core::syncTimer()
Manuel Nickschas [Wed, 30 May 2018 20:18:55 +0000 (22:18 +0200)]
core: Change signature of Core::syncTimer()

Returning a pointer is more consistent with the rest of the code
base and established patterns than returning a non-const reference.

2 years agocommon: Make InternalPeer (more) thread-safe
Manuel Nickschas [Wed, 30 May 2018 20:01:50 +0000 (22:01 +0200)]
common: Make InternalPeer (more) thread-safe

The two internal peers used by a mono client live in different
threads. Previously, they each stored a pointer to their counterpart
to be able to send protocol messages wrapped in an event.
While this has never been observed in the wild, this may cause subtle
lifetime issues if one of the sides goes away before the other.

While currently, as the two peers are at least created in the same
thread (and thus, setting the mutual pointer should not cause issues),
this will change in the near future, since the mono core is slated
to move into its own thread.

Rather than trying to deal with this ourselves, let Qt do the work.
Instead of storing a pointer and sending events, use signal/slot
connections to transfer the messages between the peers. Qt will
ensure that this happens in a thread-safe manner, and that connections
are killed if one of the peers is destroyed.

2 years agocore: Use QCoreApplication::exit() instead of just exit()
Manuel Nickschas [Tue, 29 May 2018 22:05:07 +0000 (00:05 +0200)]
core: Use QCoreApplication::exit() instead of just exit()

Ensure that the application is cleanly terminated (by stopping
the main event loop instead of just exiting) when core
initialization fails. This allows for proper cleanup, shutting
down threads etc.

2 years agocore: Simplify core initialization logic
Manuel Nickschas [Tue, 29 May 2018 21:11:07 +0000 (23:11 +0200)]
core: Simplify core initialization logic

Move all core initialization into Core::init(), including things
that were previously done in CoreApplication and MonoApplication.
Make several functions private and non-static that no longer need
to be called from the outside.

Allow to construct and destroy the core directly, rather than
relying on Core::instance() and Core::destroy(). Explicitly
create and destroy the instance in the application to better control

Ensure core state is saved and storage synced on destruction, instead
of relying on explicit calls (which were partially missing for mono).

2 years agocommon: Ensure the custom config path is stored as an absolute path
Manuel Nickschas [Tue, 29 May 2018 21:18:05 +0000 (23:18 +0200)]
common: Ensure the custom config path is stored as an absolute path

This prevents creation of a bogus and empty directory inside the
custom config directory if the path given by --configdir was

2 years agocommon: Set umask in main() instead of Core::init()
Manuel Nickschas [Tue, 29 May 2018 21:15:57 +0000 (23:15 +0200)]
common: Set umask in main() instead of Core::init()

Ensure that a restricted umask is set for all binaries, before
creating any files.

This fixes the fact that client-side configuration files, including
the configuration directory itself, were created with world-readable
permissions if the system's umask was set accordingly.

2 years agoRemove ancient settings migration code
Manuel Nickschas [Tue, 29 May 2018 19:26:24 +0000 (21:26 +0200)]
Remove ancient settings migration code

Nobody should be running Quassel 0.3 anymore in this decade, so
remove ancient and messy config location migration code.

2 years agoclient: Remap "Reload Stylesheet" to Ctrl+Shift+R
Shane Synan [Fri, 1 Jun 2018 03:26:43 +0000 (22:26 -0500)]
client: Remap "Reload Stylesheet" to Ctrl+Shift+R

Move "Reload Stylesheet" to Ctrl+Shift+R instead of Ctrl+R from
QKeySequence::Refresh.  "Set Marker Line" maps to Ctrl+R by default,
resulting in conflict.

Reloading the stylesheet shouldn't be done often enough to warrant
the easier-to-press key combination.

2 years agoclient: Add keyboard shortcuts for formatting
Shane Synan [Fri, 1 Jun 2018 03:24:07 +0000 (22:24 -0500)]
client: Add keyboard shortcuts for formatting

Add keyboard shortcuts for formatting options as follows:

* Apply foreground color: Ctrl-Shift-G
* Apply background color: Ctrl-Shift-B
* Clear formatting:       Ctrl-Shift-C
* Toggle bold:            Ctrl-B       (from QKeySequence::Bold)
* Toggle italic:          Ctrl-I       (from QKeySequence::Italic)
* Toggle underline:       Ctrl-U       (from QKeySequence::Underline)

2 years agoclient: Add input tooltips, clear format, cleanup
Shane Synan [Fri, 1 Jun 2018 03:13:07 +0000 (22:13 -0500)]
client: Add input tooltips, clear format, cleanup

Add tooltips to all of the input widget items, improving
accessibility for otherwise icon-only buttons and menus.

Add button to clear formatting, making it easy to immediately remove
all those garish foreground and background colors you added, and the
italic/bold/underline, too.

Cleanup formatting options into distinct functions, paving the way
for external signals changing formatting.

2 years agoclient: Clarify QKeySequence::Quit matter in docs
Shane Synan [Fri, 1 Jun 2018 00:20:00 +0000 (19:20 -0500)]
client: Clarify QKeySequence::Quit matter in docs

QKeySequence::Quit does not set "Ctrl-Q" on Windows, while many
Windows programs use that to provide Quit, including Quassel IRC.

Modify the comment to explain the situation.

See https://doc.qt.io/qt-5/qkeysequence.html

2 years agocore: Save schema version for intermediate steps
Shane Synan [Thu, 31 May 2018 23:21:33 +0000 (18:21 -0500)]
core: Save schema version for intermediate steps

When running upgrade queries, update the schema version for each
intermediate step.  This ensures that any interrupted upgrades have a
greater chance of resuming correctly after core restart.

Almost all databases make single queries atomic (fully works or fully
fails, no partial), and with many of the longest migrations being a
single query, this makes upgrade interruptions much more likely to
leave the database in a valid intermediate schema version.

As a side effect, downgrading from a partial upgrade will now require
setting schema version manually, instead of it possibly happening to
work depending on what changed.  An unsupported operation failing in
a known, recoverable way seems better than failing in an unknown,
possibly recoverable way.

Update logging to be more explicit about what fails.

Tested by kill -9'ng Quasselcore during migration, then re-running
core afterwards.

In the future, for databases that support it (e.g. almost only
PostgreSQL), we may want to wrap upgrades in a transaction.  This
will need careful testing of potential additional space requirements
and any database modifications that might not be allowed in a

sqlite> select * from coreinfo;
$ (sleep 0.5 && pkill -9 quasselcore ) & \
  ./run-profile.sh master core local
sqlite> select * from coreinfo;
$ ./run-profile.sh master core local
sqlite> select * from coreinfo;

2 years agocommon: Add '$i:identd', '*' for empty, tooltips
Shane Synan [Wed, 30 May 2018 00:27:37 +0000 (19:27 -0500)]
common: Add '$i:identd', '*' for empty, tooltips

Add "$i:identd" paramater variable to aliases, representing the ident
if verified, or "*" if unknown or unverified (prefixed with '~').

This allows for a general banning rule to target all idents for a
nickname that doesn't provide verified idents (e.g. general clients),
while limiting bans to specific idents for a nickname that provides a
verified ident (e.g. shared bouncer/core).

For example...
/mode channel +b *!$1:identd:$1:hostname

...would target "*!*@bad.example.com" for someone connecting without
an identd server, and "*!userid@shared.example.com" for someone
connecting with an identd server.

For all nickname-based parameters, substitute in "*" when empty
instead of leaving it blank.  This means using the variables for
nicknames that haven't been WHO'd will still provide results.

This may be dangerous if using the above example /ban alias on a
nickname that doesn't have hostname information available, e.g. if
you joined a channel after they did.

Update alias tooltips with 'identd', and totally revamp them using
the table layout for better readability and (hopefully?) easier

Update the comments in AliasManager, too, so it's a bit more

Thanks Exterminador for the suggestion/reporting, and @justJanne for
further clarifications!

2 years agocore: Include timezone for CTCP TIME replies
Shane Synan [Tue, 29 May 2018 18:36:31 +0000 (13:36 -0500)]
core: Include timezone for CTCP TIME replies

Explicitly specify the default Qt::TextDate date/time format to allow
modifying it.

On Qt 5, include the timezone data.  This doesn't reduce privacy as
timezone data could be figured out before by manually comparing with
UTC, this just makes it easier for those who want that information

See https://doc.qt.io/qt-5/qdatetime.html#toString
And https://doc.qt.io/qt-5/qt.html#DateFormat-enum

2 years agocommon: Sort user prefix channelmodes on add/set
Shane Synan [Tue, 29 May 2018 02:17:10 +0000 (21:17 -0500)]
common: Sort user prefix channelmodes on add/set

Sort prefix channelmodes whenever adding/removing/setting per-channel
IrcUser modes.  This keeps the highest mode at the front, necessary
for backlog storage to allow only showing the highest mode.

It's not possible to get away without sorting as modes can be added
in any order.

modesToPrefixes/prefixesToModes operate in order, so sorting prefixes
results in sorted modes for free.  IrcUser modes don't need sorted as
they're not hierarchical and not stored anywhere.

2 years agoRename strict-ident, apply to non-identd response
Shane Synan [Tue, 29 May 2018 16:51:35 +0000 (11:51 -0500)]
Rename strict-ident, apply to non-identd response

Rename "--oidentd-strict" to "--strict-ident", better representing
what it now does - makes all ident replies strict.

Apply strict ident matching to normal (non-identd-enabled) ident,
too.  This allows strict ident to be enforced on IRC networks that do
not check identd responses.

(Yes, some IRC networks behave this way, expecting your shared user
bouncer to enforce ident.  ZNC allows this, so Quassel probably
should too.  No need to run an ident server for those networks.)

Clean up functions, making them a little more generic.  This also
sets the stage for exposing the strict ident mode to the client later

2 years agoFix crash caused by repeated kicks of an already-kicked client
Michael Marley [Wed, 9 May 2018 03:17:21 +0000 (23:17 -0400)]
Fix crash caused by repeated kicks of an already-kicked client

As it turns out, the QHash[] operator implicitly adds nullptrs to
the map when called with a nonexistent key.  If a user clicked the
button to kick another client multiple times, this would cause a
nullptr to be inserted into the peerMap, then causing a crash later
on at least when another client connected.  To solve the problem,
the value() method is used instead, which has no such side-effect.
A big thanks to @digitalcircuit for discovering this behavior.

2 years agoclient: Fix core sessions unsupported warning
Shane Synan [Mon, 14 May 2018 06:00:19 +0000 (01:00 -0500)]
client: Fix core sessions unsupported warning

Move core session supported check to CoreInfoDlg, and show a
warning bar if sessions aren't supported.  A "Details" button
offers additional information on needing to upgrade.

Older core versions didn't provide any core session information, so
the individual session widgets would have never shown up.

Thanks to @justjanne for reporting this.

2 years agoclient: Fix Core Info session widget spacing
Shane Synan [Wed, 9 May 2018 01:28:29 +0000 (20:28 -0500)]
client: Fix Core Info session widget spacing

Fix spacing for Core Info session widget by keeping only one stretch
layout item and inserting before it, rather than manually adding
stretches after every client list update.

See https://doc.qt.io/qt-5/qboxlayout.html#insertWidget