diff --git a/ChangeLog b/ChangeLog index 7cf0fd48..13b51749 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3568 +1,3568 @@ Changes since 1.7.2: * Added an easier method of copying text starting with # * Fixed handling of IRC URLs for channels starting with more than one # * Re-enabled channel mode buttons * Fixed handling of nick and channel prefix characters potentially using the same set of symbols * Reduced emission of Unicode directional control characters * Removed unnecessary debug message sent as warning * Removed redundant escaping of angle brackets in GECOS ("realname") field +* Fixed a crash in parsing IRC color formatting codes. Changes from Konversation 1.7.1 to 1.7.2: Konversation v1.7.2 is a repackage of v1.7.1 with incomplete and badly maintained translations removed. They were accidentally included with the v1.7.1 release. There are no code changes in this release. Changes from Konversation 1.7 to 1.7.1: Konversation v1.7.1 is a maintenance release that addresses issues with some of the new features introduced in the last major release, such as SASL EXTERNAL and server-time support, along with other minor fixes. As per usual this maintenance release also ships the latest round of translation updates. * Fixed requesting the znc.in/server-time-iso capability from the server. * Fixed SASL EXTERNAL authentication without an account name set in the Identity settings. * Fixed clicking on nickname links containing the ` character. * Fixed the Highlight page in the Configure Konversation dialog not enabling/disabling the Apply button correctly. * Minor cleanups in application metadata setup code. Changes from Konversation 1.7-rc1 to 1.7: Konversation v1.7 is a major feature release focusing on greatly expanded protocol support, with newly-added support for many more IRC v3 extensions and the much-requested support for SASL EXTERNAL and 'server-time'. Many bugfixes and cleanups along with reinstated features initially lost in the first Frameworks 5-based release series v1.6.x are included as well. Finally, the handbook has been thoroughly refreshed in this release, and building and running on macOS and Windows have seen several fixes. * Two-finger scroll on the vertical channel list is now less sensitive. * Fixed execution of bundled scripts showing an error about locating translation files when running on a system without kde4-config installed. * Fixed a bug in executable command line parsing for passed URLs. * Fixed Konversation failing to start on Windows systems without D-Bus (it would previously exit if it failed to initialize its D-Bus service). * Ported from deprecated KDE Frameworks APIs to 5.24+ API (v1.7 requires Frameworks 5.25 or higher). Changes from Konversation 1.6.2 to 1.7-rc1: Konversation v1.7-rc1 is the first release candidate for the next major version of Konversation. The focus of the v1.7 release is on greatly expanded protocol support, with newly-added support for many more IRC v3 extensions and the much-requested support for SASL EXTERNAL and 'server-time'. Many bugfixes and cleanups along with reinstated features initially lost in the first Frameworks 5-based release series v1.6.x are included as well. Finally, the handbook has been thoroughly refreshed in this release and building on Mac and Windows has seen several fixes. * Improved support for CAP negotiation. * Output for CAP LS and CAP LIST is now shown in the server status view. * Added support for IRCv3 CAP MULTI-PREFIX. * Added support for IRCv3 CAP AWAY-NOTIFY. * Added support for IRCv3 CAP ACCOUNT-NOTIFY. * Added support for IRCv3 CAP EXTENDED-JOIN. * Added support for IRCv3 CAP USERHOST-IN-NAMES. * Added support for extended WHO. * Added support for server-time and message tags. * Added support for znc.in/server-time-iso, making buffer playback from ZNC much nicer. * Added support for the SASL EXTERNAL authentication mechanism, e.g. needed for using Tor with freenode. * Redesigned search bar in chat views. * Added support for font zooming to chat views. * Improved bi-di text handling in chat views. * The --restart command line argument works again. * Fixed command line argument parsing when Konversation is already running * Fixed tab completion not working when pressing tab after a full existing nickname as prefix. * Fixed the topic editor not updating when the topic changes. * Fixed nickname links including the pipe character. * Fixed the Invite dialog not closing on OK. * Fixed angle bracket display in OSD message bubbles. * Fixes to core protocol handling, e.g. in prefix parsing. * Fixed crash on close when the nick menu has been shown. * Fixed crash on quit. * Fixed crash when closing views. * Fixed crash in DCC resume dialogs without a Retry button. * Fixed incorrect icon for the global away action. * Minor UI layout cleanups, e.g. in the Behavior -> Chat Window settings page and fixes to tooltips. * Code cleanups, e.g. removal of unused settings and related code paths, porting away from deprecated API, and more. * Overhauled and corrected handbook & refreshed handbook screenshots to Frameworks 5 version. * Build fixes for Windows (MSVC compatibility and winsock linking). * The Windows and Mac builds now have app icons. * Improved code portability by using different byte swapping routines. * Updated AppStream metadata. * Konversation now depends on Qt 5.5+ and KDE Frameworks 5.25+. Changes from Konversation 1.6.1 to 1.6.2: Konversation 1.6.2 is a hotfix release that fixes an unfortunate severe crash condition that crept into 1.6.1. * Fixed a bug causing various operations on server list data to crash, e.g. pressing "Edit" on a server sub-item in the Server List dialog. * Translations for AppData metadata added in v1.6.1. Changes from Konversation 1.6 to 1.6.1: Konversation 1.6.1 is a maintenance release that contains various bug fixes for the stable KDE Frameworks 5-based version of Konversation. * Added an option to allow a server to bypass the global proxy settings. * Fixed a crash when changing the Qt style engine. * Fixed a crash when running "/exec -showpath" with no script name. * Fixed notification events for DCC Chats not working. * Fixed crash when closing the DCC Status tab. * Fixed crashes with the ISO-2022-JP encoding. * Fixed the "Close All Open Queries" action not working properly. * Minor UI polish, e.g. the margin under the nicklist when the Quick Button grid is disabled or emtpy. * Fixed missing icons on the Next/Previous buttons in the search bar. * On screens to small to fit Konversation's configuration dialog, the dialog will now show scrollbars around its content instead of the dialog buttons being forced off-screen. * Konversation now sets its window icon in a way that causes a hi-res icon to be available in window switchers such as Plasma's Alt+Tab UI. * Removed the spell checking language submenu from the context menu of the input bar - KDE Frameworks 5 now contains this upstream, leading to two submenus. * Fixed installing the Oxygen nickname list theme. * Fixed changes to the tab bar font's font weight being applied to the chat text area. * Minor changes to tooltips to support the Wayland windowing system better. * Fixed the Windows build. * Added KCrash (DrKonqi) support. * Improved support for the KDE Kiosk framework, fixing checks for the "shell_command" privilege. * Added AppData metadata for app stores. Changes from Konversation 1.6.1-beta1 to 1.6: Konversation 1.6 is the first stable release of Konversation built on the new KDE Frameworks 5 and Qt 5 library sets, improving integration into many desktop environments, including Plasma Desktop 5, and adding first support for hi-dpi scaling. In addition to porting and reworking things for hi-dpi scaling, a number of behavior improvements and bug fixes were implemented, particularly improved nickname selection behavior at connection time and better layout behavior for the channel topic area. Unfortunately the 1.6 release removes support for integrating with the KDE Address Book, as the interfaces Konversation was using to achieve this were dropped from KDE Frameworks. A replacement is in the works in the form of the new KPeople library, which we intend to use in a future release. Using KPeople, Konversation will then be able to tightly integrate with various contact management-related features in Plasma Desktop. * Improved support for character set aliases via KCharsets. * Improved behavior when reconnecting and Konversation had to use an alternate nickname for the previous connection because the preferred nickname was already in use: Konversation will now try harder to go back to nicknames sorted earlier in the identity's nickname list, instead of advancing down the list without checking whether earlier nicknames have become available again. * Konversation will no longer give up trying to connect when only a single nickname is configured and not available at connection time. Instead, it will do as many reconnection attempts as allowed by user configuration. * Fixed incorrect size calculations for the channel topic text label causing cut-off text and unwanted collapsing of the topic area. * Fixed a bug causing auto-connect not to connect to networks in the order they are listed in the Server List dialog. * Fixed a bug causing the main window not to be raised when an Konversation is started an additional time and the window is currently minimized. * The default tabs position is now 'Left', i.e. the treelist version of the tab bar. * Tabs can now be reordered by drag and drop again. * Fixed various rendering issues in the treelist version of the tab bar and made it high-DPI scaling-capable. * Fixed a bug causing Channel List tabs not to be sorted below the status tab of the server they belong to in the treelist version of the tab bar, and corrupt its contents. * Fixed margins in the Edit Network dialog. * Improved wording and correctness of several interface messages. * Fixed a bug causing some interface messages and labels not to use their translated versions when running with a language other than US English. * Fixed a bug causing Konversation not to generate default command aliases for installed scripts at startup anymore. * The bundled 'cmd' script now defaults to trying to decode command output as Utf-8 even when run on Python 2. * Fixed the bundled 'bug' script not working. * Fixed naming of bundled icons. * Konversation now opts into Qt's high-DPI pixmap handling. * Adjusted build system to use co-installable version of qca-qt5. * Fixed build failures on Windows. Changes from Konversation 1.5.1 to 1.6-beta1: Konversation 1.6-beta1 is the first release of Konversation built on the new KDE Frameworks 5 and Qt 5 library sets, and intended to allow you to help us test and shake out the remaining issues in the ported code. With stability despite many changes under the hood as the primary goal, the 1.6 release will not bring any new features, though Frameworks 5 and Qt 5 offer a host of efficiency improvements over the old stack and will enable us to support hi-dpi scaling and Wayland going forward. Known issues in this beta include a lack of addressbook integration support (the needed Frameworks dependencies have not yet been released), drag and drop support for tabs being disabled, and minor visual polish issues, including some visual assets not having been updated to match KDE's new "Breeze" visual identity yet. We expect to resolve these issues in upcoming releases. * Konversation now depends on KDE Frameworks v5.2.0 and Qt v5.3.0. * The default nickname list theme has been updated to KDE's new Breeze visual identity. * Notification events now have non-generic titles to prevent Plasma Desktop 5 from merging events from different sources. * Fixed a bug causing the "Focus Input Bar" action to be enabled/disabled at incorrect times. - Changes from 1.5 to 1.5.1: Konversation 1.5.1 is a maintenance release containing only bug fixes. The included changes address several minor behavioral defects and a low-risk DoS security defect in the Blowfish ECB support. The KDE Platform version depen- dency has increased to v4.9.0 to gain access to newer Qt socket transport security flags. * Fixed a bug causing wildcards in command alias replacement patterns not to be expanded. * Fixed a bug causing auto-joining of channels not starting in # or & to some- times fail because the auto-join command was generated before we got the CHANTYPES pronouncement by the server. * Added a size sanity check for incoming Blowfish ECB blocks. The blind assumption of incoming blocks being the expected 12 bytes could lead to a crash or up to 11 byte information leak due to an out-of-bounds read. This fixes CVE-2014-8483. * Enabling SSL/TLS support for connections will now advertise the protocols Qt considers secure by default, instead of being hardcoded to TLSv1. * Fixed the bundled 'sysinfo' script not coping with empty lines in /etc/os-release. * Made disk space info in the bundled 'sysinfo' script more robust by forcing the C locale for 'df'. * Added an audio player type hint for Cantata to the bundled 'media' script. * Fixed some minor comparison logic errors turned up by static analysis. * Konversation now depends on KDE Platform v4.9.0 or higher. Changes from 1.5-rc2 to 1.5: Konversation 1.5 adds numerous major features over the previous stable release. Of particular note are support for SASL and client certificate authentication, all-new topic management UI, overhauled authentication UI in the Identities dialog, per-tab spell-checking language settings, user-configurable nick context menu entries, mouse spring-loading on tabs, all-new versions of major bundled scripts and improved Ignore and Watched Nicknames systems. Many under-the-hood changes to improve codec support and general performance, along with the usual slew of bug fixes all over, further sweeten the deal. Don't miss out on reading about various other new features and more fixes in the full changelogs since version 1.4, too! * Expanded interface translations. Changes from 1.5-rc1 to 1.5-rc2: After a (too) long wait, Konversation 1.5-rc2 is hopefully our final bid for your aid in assuring the quality of a now-impending final release. Quite a few gnarly bugs have fallen since rc1; some of them long-standing, others were introduced along with the features that made their debut in the preceding test release. Of particular interest to many users will be robustness improvements in the Watched Nicks system and the lifting of certain restrictions on Unicode support that had been in place as a by-product of supporting older, defective Qt versions. See the changelog for more details! * Fixed a bug that could cause the Watched Nicks system to report all nicknames as offline if the Watched Nicks tab had been opened prior to a reconnect, even if that was not the case. * Fixed a bug where a URL with IRC Color markups caused to show colors, even if 'Allow Colored Text in IRC Messages' was disabled. * Fixed a bug where spaces in the path to the pre-connect shell command were handled incorrectly. Tilde expansion now occurs as well. * Clicking a channel link starting with more than one # character would join a channel starting with one # too few; this has been fixed. * Fixed auto-replace not being applied to messages that are sent from the Large Paste Warning dialog. * Made the action to manually apply Auto Replace work in the Paste Editor as well. * Fixed irc(s):// URL support registration in KDE 4.9.3+ (kdelibs versions 4.9.3 and higher give precedence to .desktop file x-scheme-handler MIME type regis- tration over .protocol files installed by an app, but Konversation did not announce URL support via an %u expando in the Exec key). * Build fix for win32. * Added a workaround for a rare crash on Mac OS X due to bugs in the implementa- tion of Qt's font metrics calculation on that platform. * Fixed a bug causing changes of the 'a' user mode to set/remove Owner status on nickname list entries. * Minor UI cleanup in the Channel Settings dialog. * Enabled freedesktop.org Startup Notification support. * Recent releases of Konversation filtered all Unicode characters outside the Basic Multilingual Plane due to a confluence of grave bugs in the Utf-8 support in Qt. As fixed versions of Qt have now circulated for some time and are required to build Konversation, this restriction on Unicode support has now been lifted. * Fixed a bug that caused the desktop notification (KNotify) event for nicks on the Watched Nicknames list coming online or dropping offline not to fire when notifications for the associated connection's status tab were disabled. * Fixed the bundled 'sysinfo' script crashing on non-ascii characters in /etc/os-release when run on Python 2. * The bundled 'sysinfo' script now tries harder to determine the current CPU clock frequencies (it now looks at sys/.../cpufreq/scaling_cur_freq in addi- tion to /proc/cpuinfo). * Fixed a bug causing the flood fill tool in DCC Whiteboard tabs not to use the correct color after using the color picker tool to set it. * Launching the default browser when clicking on links now works properly again on Windows. * Fixed a bug causing certain combinations of sorting and filtering in Channel List tabs not to work correctly, leading to partially unsorted list entries. * Minor rewordings and cleanups in UI text and the handbook for clarity and correctness, e.g. the "Notify" notification event is now known as "Nick on- line". * More information sources are now taken into account to update Konversation's idea of whether a particular nick is identified with services or not (infor- mation from IRC numeric 330 was previously discarded). * Fixed a bug causing Konversation to attempt to PART a channel that's no longer actually joined when closing a channel tab after having been kicked from the channel. * Some included PNG image files were badly encoded, this has been addressed. * Fixed a bug causing the file URL for an authentication certificate in the Identities dialog to be forgotten across application restarts. * The warning about text in the topic editor exceeding the server-allowed limit now calculates the threshold more correctly, taking encoding and IRC formatting expandos into account. * Konversation now depends on KDE Platform v4.7.0 or higher and Qt v4.7.0 or higher. Changes from 1.4 to 1.5-rc1: Konversation 1.5-rc1 is the first test release for our next major release. The 1.5 development cycle has lead to significant new features in many areas of the application, from support for SASL and client certificate authentication on the protocol side, to all-new topic management UI, overhauled authentication UI, per-tab spell-checking language settings, user-configurable nick context menu entries and mouse spring-loading in the frontend and all-new versions of major bundled scripts. Improved Ignore, Watched Nicknames and Edit Paste functionality and behavior, performance improvements in some critical codepaths and many other bug fixes and minor UI touch-ups round things out. * The user interface for the Auto Identify settings in the Identities dialog has been extended by a combo box that allows choosing the type of authentification to be performed. Depending on the chosen type, different input fields are shown below the combo box. * The server password-based authentification supported by some networks is now configurable in the Identities dialog as well, making it more discoverable and allowing to keep Auto Identify settings generally with the Identity rather than requiring going through the Edit Server dialog. * SASL PLAIN authentification is now supported. To use, pick SASL as the Auto Identify type in the Identities dialog and fill in your account name and password. * Standard NickServ authentification has been further improved. The command sent to to the service, previously hard-coded to "identify", is now configurable, and the name of the service now defaults to "nickserv" in new identities (the previous default was an empty field). * Added support for authenticating via a SSL Client Certificate in the form of a PEM file if Konversation is built against KDE Platform v4.8.3 or higher. Choosing this type of authentication in the Identities dialog forces SSL to be enabled for a connection, overriding any server settings. * Added the ability to set a different spell-checking language for every tab, from the context menu of the input box. The chosen language setting is pre- served across application restarts. * The Topic tab in the Channel Options dialog has been redesigned and rewritten from scratch, featuring a much improved UI and many bug fixes: - In place of the previous UI with a multi-column topic history list and two distinct text fields for browsing and editing there is now only the list and an edit field. The list has been redesigned to show all of the data for a topic, with visually distinct headers serving to delineate individual entries and showing the author and timestamp, above the full text for each topic. - Entries in the history list now sport a context menu allowing to copy the topic text and querying the topic author. - A new search field above the history list allows filtering it by looking for the search string in the text, author name and timestamp of all topics. - When an encryption key is set for a channel an attempt is now made to decrypt all of the topics in the history, not just the current topic. - When editing the topic any text entered past the server's maximum allowed topic length will now be drawn in the color scheme's negative text color (i.e. usually red). Further, if Konversation has been built against KDE Platform v4.7.0 or higher, a warning is shown at the bottom of the text field explaining the limit and offering the option - via a button - to delete the excess text. - The text cursor is now automatically placed at the end of the edit field, making the common use case of adding to the topic more convenient. - The location of the splitter handle inbetween the history list and the edit is now remembered across all Channel Options dialogs and application restarts. - Storing the topic history for each channel now takes up less memory, and general efficiency in handling with topic data has been improved greatly. - Fixed a bug causing redundant entries to accumulate in the topic history across reconnects when the last entry in the history corresponds to the topic given by the server at rejoin. - Fixed a bug causing HTML tags (e.g. ) in topics to be invisible in the edit field. - Fixed a bug causing the "Undo" action in the edit field to occassionally stop working, making it impossible to return the field to the unmodified state in which its contents sync to the selected history list entry. - Fixed a bug causing the topic not to return to its encrypted form when the decryption key for a channel has been deleted. - Fixed a bug causing the author of a topic to sometimes be shown as the full user mask instead of consistenty showing only the nickname. - Fixed a bug causing the "Unknown" placeholder that is used when the author of a topic is unknown not to be translated. - Fixed the incorrect tab key order in the Topic tab. * Fixed a bug causing the topic at the top of channel tabs not to return to its encrypted form after the decryption key for a channel has been deleted. * The size of the Channel Options dialog is now synchronized between the dialogs for different channels and remembered across application restarts. * The widths of the columns in the Ban List tab in the Channel Options dialog is now synchronized across all Channel Options dialogs. * The Quick Buttons options now feature a new checkbox that toggles whether Quick Buttons that operate on nicknames will be shown alongside other nickname- related actions in context menus throughout Konversation. Essentially, this allows for placing custom actions in nickname context menus. * The list of placeholders available in Quick Button patterns now mention the previously undocumented "%k" placeholder for the current channel's key and is sorted alphabetically. * When a Quick Button pattern replaces the current input box contents (due to the presence of the "%n" expando in the pattern) they are now added to the input box history first. * Quick Button patterns now support a new "%i" placeholder that is replaced with the current contents of the input box. * Both the regular tab bar and its listview version now implement "spring- loading". That is, when dragging something onto a tab and holding it there, the hovered tab will now be switched to after a brief delay. This allows switching to the intended tab as part of dragging text or a file to its destination, e.g. the tab's input bar or nicklist. * All types of tabs which sport a prominent input widget will now see focus moved to that widget and the first keypress redirected when focus is on the treelist version of the tab bar while starting to type. In previous releases this already worked for chat tabs with their usual input bars, now it also works for e.g. Channel List tabs and Konsole tabs. * A '/umode' convenience command to set modes on self has been added. * The 'Mode change' notification event now sports a proper text payload describing what has happened. * The system tray icon now shows an overlay icon when global away is enabled. * The behavior of the 'Show/Hide Konversation' action has been simplified and tuned to do the correct thing in more scenarios. Previously, invoking the action would hide the window even if it was not actually visible due to being covered by other windows, because merely not being hidden, not being minimized and being on the current desktop was already considered being shown. A much simpler approach of always showing the window if it is not the currently active window (and, as before, moving it to the current desktop as needed) and hiding it when it is has been adopted now instead. * Added an option to restrict logging to private conversations (queries, DCC chats). * Added an action to manually apply the user-configured auto-replace rules to the input box contents without sending the message, enabling user review before doing so. The relative cursor position is preserved or the cursor is moved to the end of an intersecting replacement insertion when auto-replace is applied. * Server status tabs for networks listed in the Server List dialog now have a "Connect at Startup" checkbox in their context menu, similar to the "Join on Connect" checkbox in the context menu of channel tabs. Both set options also available from the Server List. * Removing newlines in the Edit Paste dialog can now handle Windows-style carriage return line breaks and whitespace characters other than ASCII 0x20. * Part and Quit messages now show the hostmask of the subject, consistent with Join messages. * The nickname list theme preview in the configuration dialog now uses the same background color as the actual nickname lists. * Raw log tabs now use color coding to visually differenciate inbound and outbound messages, using the server message and channel message colors from the color settings respectively. * The DCC Status transfer list update interval now depends on the graphics effects level setting in KDE System Settings, changing between 500, 1000 and 2000 ms depending on the level set. * Fixed a bug causing the input box height not to be adjusted appropriately to fit the contents when the "Input box expands with text" option is enabled and the window is resized horizontally, causing the text to rewrap. * Fixed a bug causing the context menu for an item in the DCC Status transfer list to appear in the wrong position. * The double-click action command for Watched Nicks list entries now supports command aliases. * Fixed a bug causing wildcard expansion to be performed on the input box contents when they start with a Command Alias (rather than just expanding wildcards in the Alias replacement pattern). * The bundled 'media' script has been rewritten from scratch to implement the MPRIS2 standard for interfacing with media players - and only the MPRIS2 standard. This means losing support for a number of legacy players which do not support MPRIS2, but also gaining support for a number of popular modern players which do (e.g. Tomahawk). Additionally, there are often third-party MPRIS2 bridges or plugins for players which do not support it natively. The script now also features much-improved error handling and reporting in the face of misbehaving players or configuration errors. * The bundled 'sysinfo' script has been rewritten from scratch. The new version offers more accurate CPU and KDE version information (accounting for multiple cores and frequency scaling for the former, and making the difference between running inside KDE or just using the KDE Platform for the latter), as well as the addition of distro name and release information and generally improved robustness in data acquisition. Finally, the output format is now easier to configure, adopting an approach similar to the one used in the 'media' script. * The bundled 'sayclip' script has been rewritten from scratch, removing the now-redundant flood handling found in the old version (Konversation takes care of this implicitly today) and improving the error handling in case Klipper cannot be contacted. * The bundled 'bug' script has been rewritten from scratch, featuring improved error handling and adding internationalization support. * Fixed a bug causing the What's This help tooltip for nickname lists to show the regular user icon instead of the away icon as the away icon example. * The desktop notification for a completed incoming DCC file transfer now offers an action to open/run the received file. * Various fixed to tab stops and margins in the configuration dialog pages. * Minor UI fixes for the Queue Tuner (opened by /queuetuner), correcting icon use and button labels. * Removed excess white space from several warning dialog messages. * Fixed a bug causing the Watched Nicks to spam the active tab with repeated WHOIS requests for someone on the Watched Nicks List after opening a query tab to them while they were offline. * Fixed several bugs in preserving per-tab encoding settings across application restarts. * Link opening now properly respects KDE's file type associating settings instead of always opening a web browser. * Fix Konversation not saving the unchecked "... a channel invitation is received" warning dialog option in the Warning Dialogs list in the configuration dialog * Unchecking the "... a channel invitation is received" warning dialog option in the Warning Dialogs list in the configuration dialog now sets the behavior for future channel join invitations to always joining them. The actual dialog allows chosing between always accepting and always ignoring, but until this can be exposed in the configuration dialog, always joining them makes this option consistent to all other warning dialog options. * The default behavior upon receiving a channel join invitation is now to ask the user, instead of silently accepting the invitation. The latter behavior accidentally snuck into 1.4 and is considered a bug. * Added a workaround for behavior in the Phonon multimedia library that could lead to crashes on application quit when using custom highlight notification sounds. * Fixed a bug causing an ambiguous shortcut warning dialog when using the default ESC keyboard shortcut to invoke the Focus Input Box action after the search has been opened and the Focus New Tabs option was disabled while a new tab was opened. * Fixed a bug causing multiple ignore list entries with the same pattern not to be preserved across application restarts. Instead only the latest entry with the pattern would. * Fixed a bug causing the tab label for open log viewer tabs to be set to "ChatWindowObject" when switching the tab bar position between top or bottom and left. * Made the code turning channel names into clickable links more strict about what types of trailing punctuation it incorporates into the link. * Fixed bugs causing currently joined channels not to react correctly to changes in the enabled state of the Automatic User Information Lookup setting. Previously, enabling the lookup would not actually start it, and disabling it would only take effect after one last lookup was performed. Both now take effect immediately. * The reaction to a change of the Automatic User Information Lookup interval setting has been improved considerably: Whereas previously Konversation would simply wait out the current interval scheduled using the old setting value and only then schedule the next lookup using the new value, it now reschedules the next lookup to occur as if the new value had been set all along, or, if the time elapsed since the last lookup was performed already exceeds the new value, comes as close as possible by performing a lookup immediately. * All forms of opening a query (the '/query' command, clicking a nickname in the chat text display, double-clicking in the nickname list or the nickname list context menu action) now consistently move focus to an existing matching query tab, matching the behavior of various forms of joining an already-joined channel. Previously this was only true for the '/query' command. * Minor visual (the selection decoration for server items now spans the whole row) and behavioral (when collapsing a network while one of its a server is selected, the selection is now moved to the network item instead of becoming invisible) improvements in the Server List dialog. * Fixed a bug causing the option to automatically focus new query tabs not to work correctly. * Fixed a bug causing IRC formatting state not to be reset at the end of a topic when showing it in a channel's chat text display, potentially causing the rest of the line to be malformatted. * If built against KDE Platform v4.8.3 or higher, the date column in the Url Catcher will now immediately reflect changes to the date format made in KDE's System Settings application. * Fixed a bug causing an application crash in response to an (illegal) '/unban <#channel>' command. * Showing line and paragraph indicators in the Edit Paste dialog's text entry field unfortunately had to be disabled for the time being due to a bug in the underlying Qt code. * Leaving the "Use custom version reply" option's text field empty now disables responding to CTCP VERSION requests entirely instead of sending empty responses. * Fixed the vertical height of rows in the Channel Invites dialog possibly cutting off the checkboxes depending on the checkbox and font sizes in play. * A basic framework to support the IRC Client Capabilities Extension ("CAP") has been added. * Performance optimizations and code cleanup for processing NAMES messages from the server. * Performance improvements have been applied to hotpaths in the protocol implementation. * Debug builds of Konversation now understand a "--nui" command line argument to disable the check for whether Konversation is already running, thus allowing multiple instances of Konversation to be started. This is known to cause bugs (e.g. for anything started by Konversation that relies on the D-Bus service name of the running instance being org.kde.konversation: this means all bundled scripts) and can wreak havoc with the config file - it's meant only for use by developers / for debugging purposes. * Markup cleanups in the handbook and visual improvements to handbook icons in the PDF export on http://doc.kde.org. * Fixed a compilation problem on 64bit Windows. * Code cleanups for warnings issued by clang. * Build system improvements for kdepimlibs includes handling. * Konversation now depends on KDE Platform v4.6.0 or higher and Qt v4.7.0 or higher. Changes from 1.4-beta1 to 1.4: The dominant theme in Konversation v1.4 is improvements and feature additions to the user interface, particularly to text views, dialogs, (context) menus and input line commands. However, nearly all areas of the application have seen some amount of improvements in this release, as is to be expected given the relatively long release cycle: Connection behavior, IRC protocol handling, scripting support, encryption support, user documentation - new features, polish and certainly also bug fixes are to be found in all of them. In summary, we hope you will enjoy the best Konversation yet. The changelog for this release starts with a (very) brief summary of major highlights relative to v1.3.1, followed by the short list of changes since v1.4-beta1. If you skipped the beta, please do refer to the changelog for v1.4-beta1 as well, which is highly detailed and categorized for your reading pleasure. A brief selection of highlights since v1.3.1: * URL and email detection in text views has been rewritten from scratch, greatly improving the handling of various types of URLs and the contexts they might appear in. * Extensive improvements to IRC formatting code handling, including the return of background color support. * Extensive, sometimes full rewrites of user interface elements such as nearly all context menus, the URL Catcher and the Warning Dialogs system for a long list of user interface improvements and bug fixes. * Improved SSL connection behavior. * Translation support and various other improvements in several bundled scripts. * Expanded Python scripting support via the introduction of an API support package. * Support for more IRC numerics. * Various bugfixes to input line command handling and connection behavior. Changes since 1.4-beta1: * Fixed +q Type A channel modes (Freenode's "quiet bans") being reported as awarding channel owner privileges. * Fixed a bug causing the +r channel mode to be incorrectly described as "server reop" in the user interface. * Improved the description string for the +l channel mode. * Fixed the parameter handling of the example script in the handbook's section on scripting. * Fixed build with KDE Platform versions below 4.6.0. The minimum required version is 4.4.3. * The '/setkey' command now supports keys that have spaces in them, by treating all parameters after the first as part of the key. * The 'Edit Multiline Paste' editor now puts initial focus on the text field, rather than the Send button. * Added a sanity check to avoid a crash while processing broken, empty NAMES messages from a server, encountered with the shroudBNC bouncer. Changes from 1.3.1 to 1.4-beta1: Konversation v1.4-beta1 is the first pre-release leading up to our next major release. A dominant theme in this release cycle have been improvements and feature additions to the user interface, particularly to text views, dialogs, menus and input line commands. However, as you might expect given the amount of time since the last release (sorry about that :-), improvements are to be found in nearly all areas of the application, including connection behavior, IRC protocol handling, scripting support, and more. Please have a look at the changelog for a short summary of the major highlights, as well as the usual extensive coverage of the details. General User interface (more UI changes in individual sections below): * The code handling the context menus of chat text views (including the context menus for nicks and channel links), channel nickname list views and topic areas has been rewritten from scratch, resulting in a long list of bug fixes and consistency and efficiency improvements: - Numerous consistency problems in the area of which actions are available in which context menus have been addressed. For example, the chat text nick context menu used to lack many of the actions available in the nickname list context menu. - Numerous actions that require an established connection (e.g. everything in the "Modes" submenu of nick context menus or the DCC actions) used to not get disabled when loss of connection occurred. Others did get disabled, but not consistently in all menus in which they are available. Still others, such as the "Add to Watched Nicks" action, used to get disabled unnecessarily. All of this has been addressed. - Toggle actions used to appear and behave inconsistently: The nickname list context menu showed either "Ignore" or "Unignore" actions as applicable, while the chat text view nick context menu used a checkable item. Meanwhile, the "Add to Watched Nicknames" action had no corresponding action to remove a nick from the Watched Nicks Online list at all. All of this has been fixed, going with the "Ignore"/"Unignore" style of the nickname list context menu (i.e. there's now a "Remove from Watched Nicks"). - If built against Qt 4.7, the topic area now uses the same context menus as the chat text view (with the exception of the inappropriate "Find Text.." action in the basic context menu), enabling a lot of functionality missing otherwise. - Some actions used to be shown in menus inappropriately, e.g. the "Channel Settings" action in the chat text view context menu of a connection status tab or the "Open Logfile" action in the same context menu of a raw log tab. This has been addressed. - The behavior of many of the actions is now more consistent with their input line equivalents. For example, clicking "Join Channel" in a link to an already-joined channel will now focus the existing channel tab, the same as the /join command would do. Previously, nothing would happen. - Fixed a bug causing the nick and channel link context menus in the chat text view of a channel tab to get disabled after having been kicked from the channel. - Fixed a bug causing the "Send Email..." action to always be disabled, even when any of the associated address book entries did have an email address on file. - The display of helpful titles repeating the nick/channel at the top of the chat text view nick and channel link context menus has been fixed - it previously got broken in the KDE 4 port. - The nick and channel link context menus now mark the action that occurs when clicking either as the default action of the context menu, improving the appearance with UI styles that visually distinguish the default action. - General improvements to the layout of menus, often with an aim for improved consistency with other KDE applications. - Numerous actions that were missing icons now have them. - The consistency of keyboard accelerators between the various menus has been improved. - Various actions in the nickname list context menu now appropriately use a singular or plural form for their text label depending on the number of selected nicks the menu operates on. - Improved memory efficiency by using single global instances of the various menus, rather than for example having two separate instances of the nick context menu - one for the chat text view, one for the nickname list view - for every channel tab. - The code implementing the various actions was in many cases redundantly implemented in three different places, for some even in four. This staggering code duplication has been done away with. - Links now have an "Open With..." action that opens a dialog allowing to choose in which application to open the link. * The URL Catcher has been rewritten from scratch, bringing about a number of improvements and bug fixes: - It is now possible to select multiple list entries, and all of the selection-related actions, such as "Open" or "Add Bookmark", can now operate on multiple selected entries ("Add Bookmark" will offer to add all selected entries as a new bookmark folder, for example). - Reasonable default sorting: The list is now sorted by the "Date" column in descending order the first time the URL Catcher is opened, so that the newest URLs are found at the top. Previously, the list was sorted by the "From" column in ascending order by default. - The list data is no longer stored in memory twice while the URL Catcher is open. Data handling is generally more efficient. - The list entry context menu has been cleaned up, now showing only the actions applicable to individual entries. - The list now automatically receives keyboard focus when switching to the URL Catcher tab. - When saving the list to disk, the file dialog to pick the destination file will now ask before overwriting an existing file of the same name. - The date and time in the header of a saved list file is now formatted according to the user's locale settings. - Fixed a bug causing the opening of caught irc:// and ircs:// URLs not to work. - Fixed a bug causing the "Date" column to sort alphabetically rather than chronologically. - Fixed a bug causing the deletion of list entries not to work. - Fixed a bug causing a 1px remnant of tree branch lines to be visible along the left edge of list entries. - An unnecessary margin around the toolbar and the search line edit has been removed. - Fixed a bug causing the URL Catcher tab to claim to be eligible to receive chat text messages that have the frontmost eligible tab as their recipient despite it not actually possessing the means to display them, resulting in a crash when such a message occurred. * The Warning Dialogs system has been overhauled, with improved wording in the listing in the configuration dialog (which now also contains the previously missing warning when minimizing to the system tray) and further improvements to individual warning dialogs, such as the addition of previously missing Cancel buttons. * Added a "Show/Hide Konversation" action that can be used to toggle the minimized state of the Konversation window or, if the tray icon is enabled, its visibility. Additionally, the window will always be moved to the current virtual desktop if shown using this action (if the window is already shown on another desktop, it will be moved to the current desktop rather than hidden). * It's now possible to give the "Next Active Tab" shortcut a global keyboard shortcut, and when triggered the action will always show, raise and focus the Konversation window (as needed), regardless of whether it will also perform a tab switch. This allows "Next Active Tab" to double as a "get me the Konversation window and the tab that just caused my notifications to go off" global shortcut. * Clicking the Insert button in the "Insert Character" dialog will no longer immediately close the dialog, making it easier to insert multiple characters in quick succession. * Double-clicking a character in the "Insert Character" dialog will now insert it into the input line. * The "Insert Character" dialog now sports a search line. * The widths of the columns and the sort column and direction in the Channel Option dialog's ban list are now remembered across application restarts. * The "Rejoin Channel" context menu action, shown when a channel could not be rejoined automatically on reconnect as well as after having been kicked from a channel, will now appear above the "Close Tab" action rather than at the end of the context menu, so "Close Tab" is always the last item. * The "Ok" button in the "Edit Multiline Paste" editor has been renamed to "Send" to communicate more clearly that clicking it will send the editor contents to the server. * Formatting control codes (e.g. for colors) in user real names are now filtered out before the names are shown in the nickname list when the "Show real names in nickname list" option is enabled. * The layout of user information tooltips (shown e.g. when hovering a nick in the nickname list or the header area of a query tab) has been improved slightly. * Fixed bugs causing the tooltip for the adjacent rather than the hovered item to be shown when hovering the mouse pointer near the upper or lower edges of an item in the nickname list or the listview version of the tab bar (tooltips are only shown on the latter when the listview is too narrow to fit its contents, to provide the unelided tab names). * Fixed bug causing the IRC Color Chooser dialog to only show 15 colors instead of the available 16. * Fixed a bug causing a very wide minimum window width when a query tab with very long user information in the header area was open. * Fixed bug causing the opening of URLs via the "Open URL" sub-menu in the list entry context menu in Channel List tabs not to work. * Fixed a bug causing actions that are meant to operate on the active tab (e.g. "Close Tab" invoked by the default shortcut Ctrl+W) to operate on a different tab after the "Join on Connect" action in that tab's context menu had been used. * Fixed a bug causing the state of the Show/Hide Menubar action not to be updated correctly when hiding the menubar was canceled from the warning dialog. * Fixed a bug causing the "Delete" button in the "Server List" dialog to incorrectly show a "Network needs to have at least one server." error dialog when trying to delete servers, even when the deletion would in fact leave the network with one or more servers. * Fixed a bug causing the active tab's text label not to be greyed out when its IRC server connection is cut. * Got rid of some too large margins in the "Edit Network" dialog. Text views: * Added support for KDE Web Shortcuts when built against KDE Platform 4.5 or higher: The context menu for selected text in a chat text view then offers a submenu by which the selected text can be used in a web search with any of the enabled search providers. The resulting search URL is opened in the system's default wen browser after clicking on the search provider in the submenu. * Added support for ircs:// URLs, the 's' standing for 'SSL'. It is supported both for opening and for bookmarking. If an ircs:// URL matches a server configured in the server list or refers to a network name instead of a specific server, the directive from the URL overrides the state of the SSL setting in the configuration. * Detection of URLs and email addresses in chat text views to turn them into clickable links has been much improved. An incomplete overview of notable cases: - Unicode characters in URLs are now handled properly, enabling support for example for international domain names. - Protocol-less links not starting in "www.", such as the short URLs popular these days ("bit.ly/foo" and similar), are now recognized. - Arbitrary protocols (e.g. "http://" or "message://") are now recognized; previously only a small hand-picked and insufficient set was. - The check that avoids balanced a pair of parentheses around an URL becoming part of the link now works for more than one level of balanced parentheses. - Aside from balanced pairs of parentheses, also square and other forms of brackets are now handled properly. - Trailing question marks no longer become part of the link. - URLs using uncommon schemas, e.g. Apple message:// URLs or Wolfram Alpha URLs, are now handled properly. - Numerous improvements to email link handling: User names containing the plus sign are now handled correctly, opening email links from the URL Catcher works now and others. - The URL detection for the "Open URL" sub-menu in the list entry context menu in Channel List tabs now uses the same infrastructure as link detection elsewhere rather than separate code, making it massively better compared to previous versions. - Average speed of link detection has improved slightly. * Added support for dragging web and email address links found in topic areas. * IRC formatting markup (colors, bold, italic, etc.) support in chat text views and the topic editor has been improved significantly: - Background colors are now supported. - The reverse color formatting character is now supported. - To emphasize usability, links are now consistently displayed using the link and background colors from the configuration dialog, regardless of preceding formatting markup or formatting markup located within the link. - Formatting markup located within links in incoming messages no longer results in those links being broken. - Fixed bugs resulting in incorrect display of messages containing multiple formatting characters. - Improved robustness in the face of invalid color codes. - Formatting markup in the topic editor's topic history listing is now shown in the human-readable format that is also used for entry, making it much easier to derive a new topic from an old one that contains formatting markup. - Fixed a bug causing '/topic <channel>' to display the topic of <channel> with formatting markup stripped. * Join/Part/Nick messages can now be selectively hidden based on whether the nickname the message is about has been active in the respective channel in the last 10 minutes, last hour, last day or last week. Previously it was all or nothing. * Rewrote chat text view wallpaper image support to avoid rendering problems some users were experiencing. * Fixed a bug causing some user hostmasks in chat text lines about channel topic author information to be treated as email addresses and thus turned into clickable links. They would also pollute the URL Catcher. * The code backing the marker and remember lines has been rewritten to work around bugs in Qt that could cause crashes, especially when running Konversation against Qt v4.7.4 or newer (see QTBUG-20916 for more). Input lines: * Added a "Focus Input Box" action that puts keyboard focus on the input box. The default shortcut is the Escape key. * The '(away)' label shown next to input lines when away now has a context menu with actions to change the away message or return from away state. * Pressing the Tab key when the cursor is at the start of the input box now checks whether the remembered nickname is currently attending the channel before repeating the last successful completion. Commands: * The syntax for the '/cycle' command is now '/CYCLE [-APP | -SERVER] [channel | nickname]'. Whereas '/cycle' previously only allowed you to cycle a channel from the input line of that same channel, you can now specify the target explicitly. '-app' will restart Konversation (as with the new 'Restart' action mentioned in the "Command line arguments" section, preservation of the command line arguments the app was started with requires KDE Platform 4.6 Alpha 1 or higher to work) and '--server' will close all tabs belonging to the current connection and then create a new connection with the same settings as the old one (plus it will attempt to rejoin all previously open channels). Both are new abilities for the command. A '/cycle' without parameters issued in server, channel and query tabs is equivalent to specifying '-server' or the current channel or query, respectively -- the ability to cycle a query is also new. * The '/clear' command now supports a channel or query argument to clear, as well as an -all parameter to clear all views. * The '/notify' command now displays more useful output after adding and removing and when summarizing Watched Nicks. * Fixed a bug causing adding of nicknames to the Watched Nicks Online list via the '/notify' command to fail. * Added an optional '-showpath' parameter to the '/exec' command that shows the path at which the given script file was found in the chat text view, i.e. '/exec -showpath media'. * Commands that accept parameters in the form "-foo" will now also understand " --foo". * The '/dns' command used to block the UI while trying to resolve the parameter it was given, potentially causing an extended lock-up of the application when the system has serious DNS trouble. This has been resolved; '/dns' is now fully non-blocking. * Trying to use the '/me' command from a tab that doesn't support it will now cause an appropriate error message to be displayed. * Fixed a bug causing the '/kickban' command not use the default kick reason from the Identity settings if no reason was explicitly specified. * Fixed a bug that could cause the '/list' command to open the Channel List tab for the wrong connection. * Fixed a bug causing '/list <search pattern>' to close an existing Channel List tab (the intended behavior for a parameter-less '/list') rather than update the active filter and refresh the list. Highlights and notifications: * Added a new "Chat Windows" field to the Highlight configuration to optionally restrict the list of chat windows a given highlight event may be triggered in to those named in the field, separated by comma or semicolon. * Resolved a conflict between the highlight system and the graphical emoticon support that was causing unintended highlights when the filesystem path to an emoticon image file shown in the chat text view matched any of the configured highlights. * Fixed bugs in the highlight system caused by it mistakenly operating on the HTML markup used internally by the chat text views rather than the original text. Identities: * Added a "Default away reason" field to the "Away" tab in the Identities dialog. The away reason entered there will be used when no away message is entered manually as an argument to the '/away' or '/aaway' commands, so for example when Global Away is enabled using the keyboard shortcut. * "Away Messages" on the "Away" tab of the Identities dialog has been renamed to "Away Commands". Watched Nicknames: * Fixed a bug causing the Watched Nicks Online system to fail to start checking nickname online status for a network after adding an initial nick to its Watched Nicks list via the context menu actions or the '/notify' command (it worked fine via the WNO tab, however). Bookmarking: * Fixed a bug causing the bookmark address to be unusable (it would lack the network name) when bookmarking a tab and the name of the associated network contains a space or certain other special characters. Logging: * Fixed a bug causing pipe symbols to appear in the date/time stamp and next to the nickname in backlog replay. * Fixed a bug causing the chat text notification messages originating in the Watched Nicknames Online system to be logged in HTML format (and thus HTML source to be displayed e.g. in backlog replay). * Fixed a bug causing a change of the buffer size setting on a log reader tab's toolbar not to immediately apply to new log reader tabs opened thereafter. Instead the buffer size for new tabs would be the size set on the toolbar of the last log reader tab that got closed, making it easy to unintentionally undo a change depending on the order in which log reader tabs were closed. DCC: * Added a Color Picker tool to DCC WHITEBOARD, to select a color from the image. * A better version of the information dialog for DCC file transfers is shown when Konversation is built against KDE Platform 4.5 or higher. * Fixed a bug causing newly-added DCC file transfers to the list in the DCC Status tab not to be sorted when using Qt 4.7. Connection behavior: * The auto-join on connect feature will now skip over any configured channels that are invalid as per the IRC server's CHANTYPES rules when sending the join command(s) to the server, making sure that all valid channels are joined even on servers that stop parsing join commands on the first invalid channel. Previously, all configured channels were sent. * Fixed a bug causing a channel the tab of which was closed while a connection was in disconnected mode to be rejoined upon reconnect. * Fixed a (harmless) bug causing unnecessary trailing "." placeholder channel key segments to be added to the raw format auto-join command (or to the last of multiple such auto-join commands when the amount of auto-join channels requires multiple commands to be generated). * Fixed a regression that could cause an endless loop of reconnection attempts when issuing a reconnect order to an established connection and the time needed to establish the new connection was longer than the configured reconnection delay. It would also cause confusing status messages to be shown in the connection status tab. * Cancelling the dialog asking how to deal with SSL errors upon connecting is now treated as a deliberate disconnect on part of the user, i.e. Konversation will no longer try to automatically reconnect. * A disconnect while waiting for user response to an SSL error dialog will no longer result in an automatic reconnection attempt. Instead, Konversation will wait for the outcome of the user interaction: If the user decides to ignore the SSL errors that have occurred, a reconnect will be initiated, otherwise the connection will remain disconnected. * Fixed a bug causing a crash when the user chose to accept an invalid certificate in the SSL error dialog when the connection had timed out in the meantime. * Fixed a bug causing the quit message to not always be supplied successfully to the server when disconnecting. * Fixed a bug that could cause the "Server found" message to be shown in the connection status tab before the "Looking for server" message if the DNS response was already cached. * Fixed bugs causing the automatic user information lookup, the periodic WHO-on- self and the periodic PING for a given connection not to be suspended properly after a disconnect, causing unnecessary wakeups and the potential for these messages to be sent at inappropriate times in the early phase of a reconnection attempt. * Fixed a bug causing a connection failure to reset the lag meter in the status bar to "Unknown" even when the active tab is not related to the connection that failed. * Solid network up/down notifications are now ignored for connections to localhost. Scripting and bundled scripts: * The 'cmd' script, used to run a shell command from within Konversation and send the output to the server, has been rewritten from scratch to provide the following improvements: - Running a command that returns no output or only empty lines used to result in an error claiming the command does not exist. Now an info message is shown remarking that the command executed successfully but did not return any output or only whitespace. - The script now also works when called from a server status tab - the command output will be shown to the user rather than sent to the server in that case. - The command's error output (stderr) used to be ignored; now it is shown to the user in the active tab (but not sent to the server). - Trailing whitespace is now stripped from command output. - Output lines containing only whitespace are no longer forwarded to Konversation. As an aside, this also implicitly fixes a bug the old script used to suffer from that caused it to generate faulty D-Bus calls when trying to forward empty output lines. * The bundled 'sysinfo' script now handles the way 'mount' reports bind mounts on certain newer Linux distributions by collapsing the repeated mentions of the same volume before calculating the disk space information. * Scripts executed by Konversation can now access Konversation's current UI locale in the KONVERSATION_LANG environment variable. * Konversation now installs an experimental Python scripting support package named 'konversation' into a subdirectory of its application data directory and appends all 'konversation/scripting_support/python' directories found in any KDE application data resource directories (i.e. within $KDEHOME, $KDEDIRS, etc.) to the PYTHONPATH environment variable available in the script execution context, thereby allowing Python scripts executed by Konversation to import the package. The package currently sports modules providing APIs for i18n support and D-Bus communication with Konversation. * User-facing information and error message strings in the bundled 'cmd' and 'media' scripts now finally enjoy translation support, making use of the experimental new Python scripting support package described above. * The 'media' script now requires Python 2.6 or higher and is compatible with Python 3. IRC Protocol: * Added support for the 475 numeric (ERR_BADCHANNELKEY). * Added support for the 482 numeric (ERR_CHANOPRIVSNEEDED). * Added support for UnrealIRCd's 671 numeric. * Incoming actions (i.e. "/me") without an argument are now handled properly. * Fixed a number of crashes on illegal data from the server. * Raw log tabs (/raw) now use percent-recording to depict non-ASCII characters in raw traffic for much improved usefulness and reliability in the multi- encoding world of IRC. * Numeric 437 (ERR_UNAVAILRESOURCE) is now treated like numeric 433 (ERR_NICKNAMEINUSE) during early connection negotiation: The next nickname in the identity's nickname list is tried, or the user asked for a new one if necessary. Previously Konversation would just idle in this situation and allow the connection attempt to time out. Command line arguments: * Added '--restart' command line argument and a 'Restart' action that quits and restart Konversation. Notes: If not already running, the command line argument has no effect; startup will occur normally. Also, the preservation of command line arguments across restarts is only supported on KDE Platform 4.6 Alpha 1 and higher, as a required library feature is only available as of that version. * Added a '--startupdelay <msec>' command line argument that causes the app to sleep for the specified amount of milliseconds early during the startup process, delaying D-Bus activity and UI creation. System integration: * Konversation now also registers itself for the irc:// and ircs:// protocols using the way preferred by freedesktop.org's shared-mime technology rather than just the KDE-specific way. * Fixed the tray icon always being in 'active' mode (and thus conflicting with the Plasma desktop tray's auto-hide behavior) when using the new (and, in this release, only supported) system tray protocol. D-Bus interface: * A D-Bus method call to retrieve the list of channels a particular connection is currently attending has been added. Documentation: * Numerous updates and cleanup in the handbook. * Fixed a bug causing the Help button in the Configure Konversation dialog not to open the handbook. Misc: * Various small code cleanups inspired by cppcheck. Build system and dependencies: * Konversation now depends on KDE Platform v4.4.3 or higher and Qt v4.6.0 or higher. * A Python installation is a recommended dependency due to optional but highly popular bundled scripts and an experimental Python scripting support package mentioned above. * Fixed build with KDE4_ENABLE_FINAL. * The section of the build system required to build user interface and handbook translations is now always present instead of being added manually to the tarball at release time, springing into action when the subdirectories containing the translation files are added to the source tree from KDE SVN, or remaining dormant otherwise. * Konversation could crash during Diffie-Hellman key exchange or Blowfish encryption/decryption if the system's installation of the Qt Cryptographic Infrastructure (QCA) does not have the required features available (usually because the qca-ossl provider plugin is not installed). It will now fail gracefully instead and show helpful error messages in the active tab. Changes from 1.3 to 1.3.1: Konversation 1.3.1 is a maintenance release that improves program behavior and fixes defects, the most serious of which is a regression that unfortu- nately suck into v1.3, which causes data corruption or even loss of Watched Nicknames Online lists on application quit. Behavioral improvements are found in the handling of aborting automatic reconnection attempts after connection failure and RFC 1459 PING/PONG exchanges. Further notable bug- fixes have been made to the Edit Network dialog, the handling of system color schemes and using the ignore list feature to ignore certain CTCP events. * In addition to the '/disconnect' command, the graphical 'Disconnect' action and the '/quit' command can now be used to cancel an in-progress automatic reconnect in the event of connection failure as well. * The '/disconnect' and '/reconnect' commands now take optional quit message parameters. * Fixed crashes when pressing the "Edit" buttons below the server or channel lists in the "New Network"/"Edit Network" dialogs after adding a new server or channel and there was no item selected before in the re- spective list. * Fixed bugs causing the "Edit" buttons below the server or channel lists in the "New Network"/"Edit Network" dialogs to edit the previously selec- ted list items rather than the ones shown as selected after adding a new server or channel. * Fixed a bug that could cause outdated status information for nicks to be displayed in channel nickname lists after a reconnect. * Efficiency improvements for channel join. * Don't send PING in response to PONG if another PING is already scheduled to be sent in the future. This avoids getting kicked off a server for flooding when multiple clients are connected to a bouncer that forwards PONGs to all of them. * Fixed numerous cases in which Konversation would incorrectly apply the KDE system color scheme to input lines, nickname lists and the listview version of the tab bar. This general overhaul of the relevant code also brought about minor efficiency and memory usage improvements. * Fixed nickname lists not respecting the "Alternate Background" setting when set to use custom colors. * Fixed the listview version of the tab bar not greying out disconnected tabs when set to use custom colors. * Fixed a bug causing the processing of incoming CTCP CLIENTINFO and CTCP TIME requests not to take the ignore list into account. * The "Insert IRC Color" dialog will now add a leading zero to colors which have single-digit numbers in the '%C...' string it inserts into the input line, to allow the text that follows to start with a digit rather than such a digit getting interpreted as part of the color number. * Fixed a bug causing the Watched Nicknames Online nickname list for a net- work to be stored under the wrong network or lost entirely on application quit. * Fixed a bug causing the order of the Quick Buttons below the nickname list in channel tabs to be flipped every time the config dialog was OK'd. * Improved consistency of the filter fields in the URL Catcher and Channel List tabs with other KDE applications. * Correct use of singular or plural unit suffixes for several numeric pre- ferences in the configuration dialog. * It is no longer possible to set the auto-way time to the nonsensical value of zero minutes. Rather, a minimum of one minute is now enforced. Changes from 1.3-beta1 to 1.3: Konversation 1.3 debuts a major new feature in the area of Direct-Client- to-Client (DCC) support: An implementation of the DCC Whiteboard extension that brings collaborative drawing - think two-player Kolourpaint - to IRC. It also brings back the integration with KDE's SSL certificate store the KDE 3 version enjoyed and expands support for auto-away to the Windows and Mac OS X platforms thanks to both recent advances in the KDE 4 platform and new code in Konversation. Interface tweaks, new keyboard shortcuts and many bugfixes (including a number of new fixes since 1.3-beta1) round things out. Finally, Konversation now depends on KDE 4.3 and Qt 4.5. * Fixed build with KDE 4.3. * When opening an "Edit Network" dialog and adding a new item to one of the server or channel lists, provided they already contain at least one item and no selection is made before clicking "Add...", the "Move Down" button would be enabled afterwards despite no item being selected. Clicking the button at this point would crash the application. This has been fixed along with other potential problems in the code that updates the state of the list control buttons. * After adding a new item to one of the server or channel lists in "Edit Network" dialogs, that item will now be selected. * Fixed a bug causing the file dialog for selecting a new target directory and file name for an incoming DCC file transfer in the event that the default path is not writable to complain about being unable to find the file after clicking "OK" when no file of the chosen name at the chosen location exists already. * Fixed a bug causing the file dialog for selecting a new target directory and file name for an incoming DCC file transfer in the event that the default path is not writable to lose the file name written in the "Lo- cation" field (by default, the original file name) when changing the current directory. Changes from 1.2.3 to 1.3-beta1: Konversation 1.3-beta1 debuts a major new feature in the area of Direct Client-to-Client (DCC) support: An implementation of the DCC Whiteboard extension that brings collaborative drawing - think two-player Kolour- paint - to IRC. It also brings back the integration with KDE's SSL certi- ficate store the KDE 3 version enjoyed and expands support for auto-away to the Windows and Mac OS X platforms thanks to both recent advances in the KDE 4 platform and new code in Konversation. Interface tweaks, new keyboard shortcuts and many bugfixes round things out. Finally, Konversa- tion now depends on KDE 4.3 and Qt 4.5. * Konversation now depends on Qt 4.5 and KDE 4.3. * Added support for DCC WHITEBOARD, bringing collaborative drawing to IRC. * When showing the dialog informing the user about the local target file for an incoming DCC file transfer already existing that dialog now includes the sizes of the local file and the file the sender is offering up. * Fixed a bug causing either an empty line or a few characters of gar- bage to be placed in the clipboard in place of marker/remember lines when copying chat text containing such lines. * Fixed a bug causing quotation marks, ampersands and angle brackets in chat messages to be displayed as HTML entities in the OSD. * The "Clear All Windows" action will now also resets the notification state of all tabs (i.e. removes active new message or highlight no- tifications from the tab bar). * Fixed a bug causing the server responses to background data gather- ing via WHO (to keep the app's idea of its own hostmask up to date, as well as optionally channel user info) to be displayed in tabs as if the user had made the requests manually after sending a '/who' command without parameters. * Fixed a bug causing a crash when sending '/privmsg' without any pa- rameters (did not apply to '/msg'). * In previous versions, channel tabs opened in the background (i.e. while "Focus new tabs" is disabled, as it is by default) would con- siderably increase the minimum width of the window due to particu- larities of the Qt layout system. After raising every channel tab at least once it would then be possible to make the window much narrower. This unintuitive behavior resulted in confusion as to why the minimum width of the Konversation window would sometimes vary greatly. This has been fixed in this version, i.e. it is no longer necessary to have raised every channel tab at least once to achieve a reasonable minimum width of the window. This also means that joining a new channel is now much less likely to resize the window. * Fixed a bug causing the status bar to become multiple lines in height when hovering an URL containing percent-encoded line breaks in the chat text view. * Fixed a bug making it impossible to scroll the Advanced Modes list in the Channel Settings dialog when the user doesn't have operator status in the channel. * Fixed a crash when selecting more than one completed, failed or aborted outbound transfer in the "DCC Status" tab and clicking "Re- send" in their context menu. * Fixed a bug causing the human-readable mode descriptions used by default in channel chat text views as well as the Channel Settings dialog's Advanced Modes list not to be translated. * When the display of human-readable mode descriptions is enabled (as it is by default), the Advanced Mode list in the Channel Set- tings dialog will now show the respective mode characters along- side them. Previously, only the description was shown. This makes the list useful as a utility to look up the meaning of obscure mode characters. * Fixed a bug causing both the default email client and the default web browser to be invoked when clicking an email address link in the chat text view. * Added a built-in '/sayversion' command that, as opposed to the bundled '/kdeversion' script, can show the version of both the KDE Konversation was built against and is running on. It also outputs the information in a single message instead of several. * Fixed a bug that would cause the second and following segments of a text so long that it has to be split into multiple messages when it is sent to be encoded incorrectly. * The ASCII 0x1d character is now used to denote italic formatting of text rather than 0x09, to avoid the conflict with the tab character that is frequently pasted e.g. from websites with tables. * Fixed a bug causing the server response to '/whois <nick> <nick>' not to be displayed on many IRC servers when the nick in questions is not online at that time (this variant of the WHOIS command is also used by the GUI actions). * Fixed a bug causing missing bans in the list in the Channel Settings dialog on certain (mostly older) IRC servers. * The text in notification messages used to be wrapped every 50 char- acters, an old workaround for problems with KDE 3.x's bubble notifi- cations. This has been removed now since it's no longer needed with modern notification frontends such as Plasma's, and produces rather ugly results there. * Made it possible again to initate DCC file transfers to a query partner by dragging files or URLs onto the chat text area of the query. * When building against the KDE Platform v4.4.3 libraries, the auto- away functionality will now make use of the new KIdleTime library to determine user activity and inactivity rather than use its own code, the primary advantage being that KIdleTime is supported on non-X11 platforms such as Windows and Mac OS X. In effect, this means auto-away is now supported on those platforms, depending on the implementation level in KIdleTime. (The use of KIdleTime can be explicitly disabled by passing '-DUSE_KIDLETIME=false' to 'cmake', in which case Konversation will fall back to using the original, X11-specific code and auto-away will only work decently on an X11 platform.) * SSL support now integrates with KDE's certificate handling again, as it used to in the KDE 3 version, made possible by improvements in the libraries of the KDE Platform v4.3 (the minimum version supported in this release) and higher. * Not reacting to an SSL certificat validation error dialog in a timely manner should no longer result in Konversation locking up. * In-progress automatic reconnect in the event of connection failure can now be aborted by using the '/disconnect' command. * Manually issuing a reconnect order to a connection currently in- active after having exceeded its maximum number of reconnection attempts used to result in a single connection attempt after which it would be announced that the maximum number of reconnect- ion attempts had been exceeded again. This has been fixed: It will now make the number of attempts specified as the upper limit in the application settings. * Fixed a bug that could cause the selection in the transfer list of the DCC Status tab to be lost when a new transfer was added to the list. * Fixed a bug causing the information panel in the DCC Status tab to show information for a transfer other than the one selected in the transfer list after sending a file to oneself for the first time in a session. * The frame that used to be around the main window's tab widget when the tab bar was located either at the bottom or top position has been removed. * Improved compatibility with freedesktop.org-compliant notification frontends other than KDE's. Other frontends could previously show empty notification message contents due to non-standard content in the messages. * Added an action to switch to the last focused tab, making it possi- ble to quickly switch forth and back between two tabs. The default keyboard shortcut for this new action is Alt+Space. * Added a "-local" parameter to the '/amsg' and '/ame' commands that limits their scope to the channel and query tabs associated with the same connection as the tab the command is issued in. * Fixed a bug causing the order of networks in the server list dialog not to be preserved across application restarts. Changes from 1.2.2 to 1.2.3: Konversation 1.2.3 is a hotfix release that improves upon an earlier fix, originally included in Konversation 1.2.2, that increases the re- liability of Konversation's interaction with the D-Bus inter-process communication daemon. * Increased reliability of interactions with the D-Bus inter-process communication daemon. Changes from 1.2.1 to 1.2.2: Konversation 1.2.2 contains a number of new features, such as support for passive DCC chat and amarok:// URLs, and a large amount of user interface improvements to various tabs (e.g. Watched Nicknames Online and the URL Catcher) and dialogs (e.g. Join Channel). When used with KDE SC 4.4 it supports the new system tray icon API. A sizable list of bug fixes round things out; of particular note is a change address- ing the high CPU usage some users have experienced with Qt 4.6. * Added support for passive DCC chat. * Made it possible to accept/reject DCC chats like DCC file transfers. * Added an option to auto-accept DCC chats (previously it would always auto-accept). * Added a confirmation dialog for closing DCC chats, consistent with other conversation tabs. * Improved the sanity-checking code for the validity of ports used in DCC operations. * Fixed connection attempts possibly stalling when there is a problem with executing the associated identity's pre-shell command (provided it has one set at all), and Konversation crashing when it is quit while a connection attempt is stuck on trying to execute the pre- shell command. * Fixed /setkey, /delkey and /showkey treating their target arguments (i.e. a channel or a query) case-sensitive. * Fixed the encryption key for a query getting lost if the other end changes their nickname. * Added support for KStatusNotifierItem, the new system tray API in KDE. * Fixed a bug causing multiple auto-replacements in a single message not to work. * Made it possible to include syntax normally used to refer to a sub- group of the matching pattern as normal text in the replacement pat- tern of a regular expression auto-replace, by escaping it like this: %%1. * Fixed a bug causing an empty MODE message to be sent to the server preceding the correct one when using /op, /deop and the like. * Fixed a bug causing as many mode chars as target nicknames given to commands like /op, /deop etc. to be sent as part of every single re- sultant MODE messages sent to the server, despite one MODE message being generated for every group of three target nicknames. I.e. "/op foo foo foo foo" would result in "MODE +oooo foo foo foo" and "MODE +oooo foo", when it should only be "+ooo" and "+o", respectively. * Added support for amarok:// URLs in chat text views and channel to- pics. * Fixed a bug causing Konversation to treat "Page Up" and "Page Down" key events with any modifier (e.g. Ctrl) the same as without any mo- difier, making such combinations unavailable as shortcuts for other actions. * Fixed a bug causing the status bar to remain stuck displaying the description of a menu action if subsequently hovering other actions without a description set. * The Watched Nicknames Online, URL Catcher and Channel List tabs now use a toolbar at the top rather than a row of buttons at the bottom for their various actions, consistent with the Log Viewer and the (redesigned for 1.2) DCC Status tabs. Aside from a nicer UI this has the side benefit of reducing the minimum window width with any of these tabs open. * Further work on reducing the use of the qt3support/kde3support lib- raries throughout the codebase. * The design of the search bar has been made more consistent with the search bars found in other KDE applications (e.g. Konqueror, Konso- le and KWrite). * Added a "--noautoconnect" command line argument to disable auto-co- nnecting to any IRC networks on application startup. * The invite dialog now has a drop-down offering the options "Always ask", "Always join" and "Always ignore" for future default behavior, rather than just a "Don't ask again" checkbox that wasn't sufficient to cover all scenarios. * The "Hide Nicklist" action has been renamed "Show Nicklist" to com- ply with the KDE 4 HIG. * URLs are no longer decoded before being passed to the web browser, fixing the opening of some links from the chat text view. * Fixed a bug causing the application to crash when pressing the left or right arrow keys after selecting an active file transfer in the DCC Status tab's transfer list when using Qt 4.6. * Improved performance of the DCC Status tab's transfer list. * It's now possible to add nicknames to the Watched Nicknames Online list, as well as remove them, right from the tab rather than having to go to the config dialog. * Fixed a bug that would cause the "Choose Association" KDE address book integration action to create a new contact in the address book. * It's now possible to add a nickname to the watch list of all net- works in the Watched Nicknames Online tab at once. * Fixed a bug causing the opening of all bookmarks in a bookmark fol- der at once not to work. * The ban list interface has seen a facelift. The new way of working with the list makes it very easy to use an existing list entry as a starting point, modify it and then decide between replacing the original ban with the new version or adding it as an additional ban. * The topic history list in the Channel Settings dialog has seen a number of behavioral and reliability improvements. * Updated various dialog layouts to better comply with the alignment rules of the KDE 4 HIG. * The URL list in the URL catcher tab now sports a new Date column and can be sorted. The sorting settings are saved and restored across sessions. * Fixed a bug causing the vertical spacing inbetween the regular mode checkboxen on the "Modes" tab of the Channel Settings dialog to change when the display of the advanced mode list was toggled or the dialog was resized. * The Join Channel dialog now sports a combo box listing all open co- nnections (and the nicknames used on them, to be able to tell mul- tiple connections to the same network apart), with the connection owning the active tab automatically pre-selected. This allows one to pick the connection to join the channel on regardless of the active tab at the time the dialog is invoked (e.g. via the keyboard shortcut). Previously, the dialog would only operate on the connec- tion owning the active tab (and display it in a static label), possibly requiring one to switch to a suitable tab first. * Fixed a bug causing the "Clear History" item in the context menu of the channel combobox in the "Join Channel" dialog not to clear the history correctly; while it would be gone for as long as the dialog was open, it would be back when closing and reopening the dialog. * Fixed a bug causing a crash on Windows when middle-clicking the chat text view. * Fixed a bug causing the pasting of clipboard contents using keyboard shortcuts not to work when the chat text has keyboard focus. * Fixed a bug causing the setting or removing of a 'q' channel mode to be mistakenly announced as giving or taking channel owner privileges on networks where it's actually a type of ban. * Fixed a bug causing a crash when pressing the "Ok" button in the "Join Channel" dialog without entering anything in the dialog's "Channel:" input field beforehand. * More robust Unicode handling to make interaction with the D-Bus dae- mon more reliable. Changes from 1.2 to 1.2.1: This second release in the Konversation 1.2.x release series for KDE 4 adds a number of new features to the bookmarks system and support for reacting to changes in network availability as signaled by KDE's Solid, along with a number of fixes for bugs discovered since version 1.2 was released last month. * Fixed a crash when cancelling the warning dialog that is shown upon receiving two incoming DCC file transfer requests using the same file name. * Fixed a crash when using the "Clear Completed" action in the DCC Sta- tus tab after having previously used the "Clear" action to remove spe- cific transfers from the transfer list. * Fixed a crash when using the "Clear" or "Clear Completed" action in the DCC Status tab after creating a mixed selection of removable (e.g. com- pleted, or failed) and non-removable (e.g. sending) transfers and the last addition to the selection was a removable transfer. * Added a "Bookmark Tabs as Folder" feature. * Added the ability to open the contents of an entire bookmark folder at once (aka "Open Folder in Tabs"). * Made the default generated bookmark titles more verbose: The Format is now "Channel (Network-or-Server)". * Added support for reacting to changes in network availability as re- ported by KDE's Solid subsystem. If the network goes down, Konversa- tion will now no longer make futile attempts to reconnect the affect- ed connections. Instead, it will reconnect once the network comes back up. * Variable expansion (%B, %C, %I, etc.) is no longer done in text seg- ments recognized as URLs to avoid clashes with percent-encoded char- acters in URLs copied from web browsers, such as German umlauts. * Made tooltips for truncated labels in the listview version of the tab bar work again with newer versions of Qt. * Fixed a bug that caused the Watched Nicknames Online list to show the wrong or no tooltip when hovering a list item with the mouse pointer. * The default destination folder for incoming DCC file transfers is now the "Downloads paths" configured in System Settings or the equivalent in other desktop environments (under the hood, this is a shared XDG setting). * Making and then comitting unrelated changes in the Channel Settings dialog could cause unintentionally setting the channel's topic to an older version if someone else had changed the topic since the first time the dialog was opened or while the dialog was open, due to a bug in the code that avoids such external topic changes interfering with concurrent local editing of the topic. This has been fixed. * The contents of the topic edit field in the Channel Settings dialog will now reflect the selected item in the topic history list until the user starts editing. * Fixed a bug that could cause user mode changes occurring directly af- ter joining a channel not to be reflected by the channel's nickname list. * Fixed a bug causing the "Open File" context menu action for DCC file transfer items in the transfer list in the DCC Status tab not to work for incoming file transfers. * Added support for RPL_HOSTHIDDEN. Changes from 1.2-rc1 to 1.2: Konversation 1.2 is the first release of Konversation for the KDE 4 app- lication platform and desktop environment. In addition to preserving the full functionality of the KDE 3 version, this release offers a signifi- cant amount of new features and improvements to the user interface, per- formance, memory usage, energy efficiency, correctness and stability. Sum total, the changelog of all development releases since Konversation 1.1 and of this final release combined once again make for the longest changelog in Konversation's release history. Some of the highlights compared to Konversation 1.1 include support for SOCKS v5 and HTTP proxies, a redesigned DCC file transfer user interface (and much improved DCC code under the hood with several new features, such as support for IPv6 and DCC REJECT), support for UPnP for NAT tra- versal, rewritten and much improved support for Blowfish encryption (now supporting DH1080 key exchange, for example), a significantly better per- forming channel list, a rewrite of the channel nickname lists for better performance and improved battery-friendlyness, a new channel join invita- tion user interface, an improved auto-replace feature, expanded media player support and many improvements to the IRC protocol implementation. Enjoy! * When dragging a link from the chat text view, the drag object will now contain a plain text version in addition to the URL version. This allows dragging a link to places that don't accept URL drops, such as Konsole, the Konqueror address bar or Konversation's own input line. Changes from 1.2-beta1 to 1.2-rc1: After a pleasantly uneventful two weeks with beta1, this release candida- te for our first KDE 4 stable release brings a handful of bugfixes that, while definitely worth having, are fortunately none too scary. We thus ex- pect the final Konversation 1.2 release to follow in the very near future. * Fixed the scrollbar thumb not remaining at the bottom when the chat text view is resized (such as when the window is resized or the input bar in- creases in height after typing more than one line with auto-expand mode enabled). * Fixed a bug that could cause the progress bar for DCC file transfers not to be updated when "Fast DCC send" was enabled. * Fixed a bug that could cause a crash when resuming an incoming DCC file transfer. * Fixed characters that require the Alt Gr modifier to be typed (such as the '@' symbol in German keyboard layouts, for example) not causing key- board focus to move to the input line when typed while the chat text view has keyboard focus and thus not showing up in the input line. * Fixed a bug causing both the link and the marker or remember line to be selected when a line is appended directly after a link that has just been clicked. * Fixed a bug causing the automatic scroll-down not to work when more back- log is replayed than the viewport can show at once at channel join. * The "Advanced Modes" listing in the "Modes" tab of the Channel Settings dialog will now properly vertically expand as the dialog is resized even to a very large height. * Fixed a bug that could cause a crash while manipulating a channel's ban list. * Fixed a bug causing the moving of child tabs of a network tab in the treelist version of the tab bar not to work using the keyboard shortcuts, context menu actions or "Window" menu actions. Changes from 1.2-alpha6 to 1.2-beta1: Konversation 1.2-beta1 marks the departure from active feature development for Konversation 1.2 and the entrance into the much-vaunted halls of bug- fixing-until-the-final-release, which we expect to materialize in early October. Until then, you can enjoy what this beta has to offer: HTTP and SOCKS v5 proxy support, further redesign of the DCC Status tab (many of you will be happy to find the minimum window size with the DCC Status tab open much reduced now), the long-awaited return of marker and remember lines and the resurrection of link dragging from the text display widget are of particular note, but the changelog has the details on a variety of other additions, plus the usual assortment of bugfixes, as well. * Added a topic widget for Konsole windows and hooked it up to the KPart's setWindowCaption signal * Added tooltips to items in the new DCC transfer lists that describe the transfer's status more verbosely. * Fixed the OSD stealing focus when it appears on Windows. * Running DCC file transfers are now properly aborted on application quit. * Removed the 'ucs2' encoding from the encoding list, as it is is not sup- ported on IRC. This also resolves a crash when sending messages after selecting it (however the crashing codepath has been independently made more robust as well). * Fixed a crash when sending a message containing only spaces. * Added a "Manage Profiles" button to the information area above the ter- minal area in Konsole tabs. * Added SOCKS v5 and HTTP proxy support. Proxy credentials are stored in KWallet. * Moved the buttons in the DCC Status tab to a toolbar, similar to how things were already laid out in log viewer tabs. * Redesigned the DCC transfer info panel in the DCC Status tab to have a smaller minimum size. This should mean that less people will see their window size increase when a DCC transfer is initiated, as it reduces the minimum size of the window with the DCC Status tab open. * Added a "Clear Completed" item to the DCC Status tab's toolbar. * Fixed a crash on the processing of illegal lines sent by the server that contain only spaces (as sent by the buggy lidegw lide.cz gateway script). * Made DCC transfer speed reporting more reliable. * Fixed sorting the transfer list in the DCC Status tab by its "Started At" column. Previously, sorting by that column would sort alphabetically by the string value of the fields rather than properly by date. * Fixed the Channel Settings no longer disabling interface elements allow- ing the manipulation of channel properties when the user lacks the ne- cessary operator privileges in the channel. * The position of the splitter handle determining the size of the info pa- nel in the DCC Status tab is now saved across application restarts. * Fixed a crash when changing settings after the "Insert Character" dialog had been used. * When an attempt to set up a port forward via UPnP fails, an error message stating as much will now be shown in the currently active or last active tab for the associated IRC server connection. * Made the '/amsg' command work properly again. * Fixed two close icons (one on the left, one on the right) being shown on tabs when close buttons were enabled and the tabs were in top or bottom position. * Fixed incorrect colors in the listview version of the tab bar when ini- tially switching to it within a session. * Fixed a regression vs. the KDE 3 version that caused a failure to correct- ly parse shortened IPv6 addresses except when using RFC 2732-style bracket notation and explicitly stating a port to connect to. * Made the display of server address and port number in various connection- related chat view messages more consistent and IPv6-friendly (with the '<ip>:<port>' forward previously used, it could be hard to tell where the IP ended and the port began -- now it's '<ip> (port <port>)'). * Updated the scripting documentation to talk about D-Bus rather than DCOP. * The initial width of the nickname lists in channel tabs is now more sen- sible. * Added back the ability to drag links out of the chat view. * Resurrected the RTL text support in the chat view. * Fixed a crash during UPnP discovery when the router doesn't respond in the expected way. * Various actions that operate on the active tab (e.g. those found in the "Insert" menu) are now properly disabled when the last tab is closed. * Fixed a bug with Qt 4.5 where after closing a tab a tab adjacent to it would briefly be activated before subsequently activating the tab that was active before the just closed one (i.e. only noticable when 'a tab adjacent to the just closed tab' and 'the previously active tab' are not the same). * Marker lines and the remember line are back. * Fixed a bug that could cause queue flushing rates to be entered into the configuration that would prevent successfully connecting to Freenode and potentially other IRC networks. Changes from 1.2-alpha5 to 1.2-alpha6: Konversation 1.2-alpha6 is primarily a hotfix release addressing a serious DCC crash that we unfortunately only discovered after releasing alpha5. To sweeten the offer, however, it also includes a nicer DCC tranfer list that separates incoming and outgoing transfers into distinct categories, allows you to enable/disable individual columns and saves the sort column and di- rection across application restarts. Furthermore, Konsole tabs may now be renamed and there's also a fix for the handling of certain rare mode cha- racters. * The transfer list in the DCC Status tab now separates items into "Inco- ming Transfers" and "Outgoing Transfers" categories, using the same ca- tegory headers employed in System Settings and other places throughout KDE 4. * It's now possible to enable/disable the display of individual columns of the transfer list in the DCC Status tab. This is remembered across app- lication restarts. * The sort column and direction of the transfer list in the DCC Status tab is now remembered across application restarts when using Qt 4.5 or higher. * A "Rename Tab..." action has been added to the context menu of Konsole tabs. * Fixed a crash when the client observes channel modes being modified that carry a parameter when used as user modes. * Fixed a crash when an incoming active or outgoing passive DCC file trans- fer either timed out or was manually aborted while in "Connecting" state." Changes from 1.2-alpha4 to 1.2-alpha5: Konversation 1.2-alpha5 features significant performance and memory usage improvements in several areas of the application, such as channel nickname lists, backlog loading, Channel List tabs and the URL Catcher - the latter two have also seen a fair number of interface refinements, making them much more enjoyable to use. The DCC subsystem has seen the addition of IPv6 sup- port and a '/dcc get' command to accept an incoming file transfer from the input line. Various smaller additions and improvements have been made as well, including the usual share of bug fixes. * Added back "Do not ask again" checkbox missing in the rewritten invita- tion dialog that appeared in v1.2-alpha4. By implication, the dialog now also observes the "Automatically join channel on invite" option from the "Warning Dialogs" page in the configuration dialog again. * Fixed problems reconnecting an SSL-enabled connection using a self-sign- ed certificate. * Fixed a build problem with KDE trunk (i.e. what will one day be KDE 4.4). * Fixed loading and saving of the settings toggling the invitation and mul- ti-line paste warning dialogs in the "Warning Dialogs" page of the con- figuration dialog. * Improved wording of the description of the invitation dialog setting in the "Warning Dialogs" page of the configuration dialog to reflect that the dialog being disabled doesn't imply that the channel the user was invited to will be joined automatically, as the user might have rejec- ted the invitation when he got the dialog along with checking "Don't ask again". * Decreased memory usage (the objects created for every IRC user encounter- ed are lighter now). * Initializing Phonon is now delayed until it is actually needed, resulting in less memory usage for those not using highlight sound notifications and less work being done during application startup. * Fixed DCC file transfer problems with files larger than 4 GB on 32bit sys- tems, along with some other correctness improvements to the file transfer code. * Backlog loading is now more efficient. * Added IPv6 support for DCC file transfers. * The fallback default file name for unnamed files received via DCC now con- tains the date of when the file was received in ISO format. * Fixed a crash when trying to perform a tab completion with an empty nick- list (i.e. shortly after joining a big channel, before its nicklist has been filled in). * Channel nickname list updating is now more efficient and pleasant to look at. Rather than resorting the entire list after the addition of a new nick- name, the nickname is now inserted directly at the correct position (using a binary search), avoiding a lot of CPU-intensive comparisons between nick- names. The same optimization is also done for nickname and user status (as relevant in case "Sort by status" is enabled) changes - rather than trigger- ing full resorts, items are moved directly to new positions as necessary. Resorting after both new additions and changes was previously done only after a delay of one second (as part of a scheme to throttle the update rate to a maximum of once per second given how CPU-intensive it was), which meant that new nicknames would initially appear at the end of the list and move to the correct position only after one second, and that nickname and status changes were similarly reflected in the sorting only after one second - this delay has now been eliminated, making the nickname list much snappier in re- acting to what's going on. Note however that when more than ten events requiring an update to sorting occur within one second, a fallback to the old scheme of doing a full resort at a maximum rate of once per second, after an initial delay of one second, occurs, as this is believed to be more efficient in situations of very high activity (such as merges after netsplits). Thus the new scheme described above should be seen as an additional optimization for the common case. * In addition to the broad strokes optimization described above, other minor optimization work has been done on the nickname list updating code, impro- ving the efficiency of updates further. * Fixed topic label text color not reacting to system color scheme changes. * Added a '/dcc get [nick [file]]' command to accept an incoming DCC file transfer request. * Fixed a crash when using the 'Insert -> IRC Color...' menu item without there being any tabs. * Nickname changes of the discussion partner are now announced in query tabs, provided the information is available (i.e. when one shares a channel with the discussion parther, so the server informs Konversation of the nickname change). * Fixed building on OpenSolaris. * The channel item context menu in Channel List tabs now has a "Join Channel" action, and the list of URLs extracted from the channel topic has been mo- ved to a sub-menu. * Increased use of the IRC icons found in recent versions of the Oxygen icon set. * Fixed a bug causing the time a user went online not to be displayed in WHOIS information (provided the server reports it). * Fixed close button icons not immediately appearing on newly-added tabs when enabled (a preferences change would cause them to appear). * A significant revamp of the Channel List code, especially around the way the list data received from the server is being moved into the UI, has brought about significantly improved behavior. The application should now no longer be bogged down for extended periods of time while the list is being process- ed - in extreme cases, this could even lead to disconnects by timeout. * The "Apply Filter" button has been removed from the Channel List interface. Instead, the filter is (re)applied automatically as its settings are chang- ed, i.e. briefly after stopping to type into the "Filter pattern" field or after changing one of the spin- or checkboxes. * Fixed the display of human-readable mode descriptions in place of traditio- nal mode characters (toggled by the "Show raw mode characters" preference and only applicable when Konversation knows a description for a given mode char) being inconsistent between '/mode <channel> and '/mode <channel>/<user> +/-<mode>' - separate, unequal lists of mode descriptions were being used; this has been unified now. * Fixed the "Modes" tab of the Channel Settings dialog not using human-readable mode descriptions in place of traditional mode characters when the "Show raw mode characters" preference is disabled (as it is by default) and a descrip- tion for a given mode char is available. * Fixed the mode list shown by "Show Advanced Modes" in the "Modes" tab of the Channel Settings dialog not showing all modes announced as supported by the server. * The Channel List, when hovering a list item with the mouse pointer, now shows a tooltip with the entire topic of the channel when it doesn't fit the topic column's width. * Konversation will now display a warning dialog box when the user is trying to send a character not supported by the chosen encoding. * When a message containing characters not supported by the chosen encoding is sent, the chat view will now display the '?' replacements for those cha- racters that are sent to the IRC server and thus seen by other users. Pre- viously, the chat view would display the version of the message before this encoding step, and thus usually show the characters, as the Unicode character set normally used by KDE/Qt is considerably broader than many of the encodings that can be selected in Konversation. In other words, the chat view now accurately portrays what is sent to other users when a mes- sage contains characters not supported by the active encoding. * The URL Catcher should now open considerably faster with long lists of caught URLs and mail addresses. * The list items in the URL Catcher now have the same context menu as links in the chat view. Previously there was no context menu. * Caught mails and mail addresses not coming from an IRC user (an example would be links contained in a server's Message of the Day text) now have their "From" field filled in with the tab name instead of it being left blank in the URL Catcher. * Fixed a bug causing the DCC Status tab to sometimes prematurely claim a transfer status of 100%, as well as an unrealistic transfer speed, when sending a file to another user. The transfer would go on until actually finished; merely the information shown in the interface was defective. * Fixed log viewer tabs not observing the chat window background image setting. * Fixed log viewer tabs not reacting to changes to the chat window background color or font settings. * Fixed raw log tabs only applying the chat view background image setting on configuration changes, not when initially being opened. * The removal of the frame around the tab widget is now exclusive to KDE 4.3. We do it by way of enabling document mode for the tab widget (which is new in Qt 4.5), which renders badly in versions of the Oxygen style found in KDE versions earlier than 4.3, and the workaround we previously applied to make it work even with those older Oxygen versions had the unwelcome side- effect of breaking the application of color preferences to the input bar and nickname list. Changes from 1.2-alpha3 to 1.2-alpha4: Alpha 4 marks a significant milestone on the way to feature completeness for the v1.2 release of Konversation. New features in this release inclu- de UPnP NAT traversal support for DCC file transfers and chats, DH1080 key exchange support for Blowfish encryption and the ability to automati- cally split very long actions (i.e. usage of the '/me' command) into mul- tiple messages conforming to the maximum length of an IRC message (this was already supported for regular messages for some time). Many bugs have also been addressed, including an important fix for invita- tion dialogs causing disconnects by timeout if they were not dealt with quickly enough - and not only is the rewritten dialog non-blocking, it also allows for handling multiple outstanding invitations in a single dialog, rather than a new dialog being displayed for every additional invitation received. Other fixes include further interface polish and robustness and correctness improvements to Blowfish encryption, the Watched Nicks Online system and the storage of per-tab encoding preferences in the configuration file. A closing note for packagers: In this release we have replaced our cus- tom implementation of the Blowfish encryption algorithm with an optional dependency on the Qt Cryptographic Architecture (QCA) library in version 2 or higher. By implication, Blowfish encryption support is now optional: A QCA2-enabled build will have it; a build not using QCA2 will not. * Changed links to KDE's (and hence our) bug tracker throughout the code- base to use https://bugs.kde.org/ rather than http://bugs.kde.org/ * Fixed the "Show Menubar" item not getting removed from the chat view context view after showing the menubar again. Also added a separator after the item (only visible when it is present). * Switched the timestamps in log files to use KDE's locale settings for formatting the date and time, as the equivalent Qt API used previously seems to look at the value of LC_NUMERIC to detemine the format in Qt 4, which doesn't meet user expectations. * Fixed the "Date" column in the topic history of the Channel Options Dialog not using KDE's locale settings to format the value. * Fixed the "Date" column in the Channel Settings dialog's topic history sorting alphabetically rather than by date. * Improved Windows support in the bundled 'media' script. * Fixed the vertical alignment of the topic label when using Qt 4.5 (it's now top-aligned rather than vertically centered, i.e. making the topic area bigger than the topic by dragging the splitter down won't cause the topic to move down to stay in the vertical center anymore -- Qt 4.5 is needed because a method to retrieve the document margin from the chat view to use as the top margin for the topic label is new in that version). * Fixed various chat view messages containing date/time values (channel created, topic set, online since, ban info) not using KDE's locale set- tings for their display format. * Added support for using UPnP for NAT traversal for DCC file transfers (both active send and passive receive) and DCC chat. When UPnP is ena- bled in both Konversation and your router, Konversation now knows how to ask your router to set up the necessary port forward, and also how to to ask it to remove it later. * Added support for the KDE 4 version of JuK to the bundled 'media' script. * Fixed '/msg <channel> <message>' not displaying the resulting message in the target channel when the user is attending that channel. * Made the appearance of the line informing about the message being sent with '/msg <nick|channel> <message>' consistent between channel, query and status tabs (it now looks like in the former in the latter two as well). * Fixed the visualization of '/msg <nick|channel> <message>' (i.e. the '<-> target> message' line) being shown only after adding the resul- ting message to the target chat view (if present), causing an odd-look- ing order if the origin view and the target view are the same. * Watched Nicknames Online now generally operates on networks by their internal unique IDs rather than names, enabling it to handle multiple configured networks with identical names properly. * Konversation's custom implementation of Blowfish encryption has been replaced with an optional dependency on the Qt Cryptographic Architec- ture (QCA) library version 2. * The '/setkey [nick|channel] <key>' command now recognizes 'cbc:' (ci- pher-block chaining) and 'ecb:' (electronic codebook) prefixes in the key field to set a particular Blowfish block cipher mode of operation, defaulting to the value of a config dialog preference (Behavior -> Co- nnection-> Encryption -> Default Encryption Type, the default is Elec- tronic Codebook (ECB)) when no prefix is given. * Fixed crash when opening links with ' in them when the "Custom Browser" preference is enabled in Konversation's config dialog. * Improved consistency of link opening behavior between the chat view, the topic label and the URL catcher (all three now use the new-in-KDE-4 KTool- Invocation API to invoke the KDE default browser, whereas the topic label and the URL catcher were still using KRun until now). * Fixed a bug that could cause the state of the spell-checking setting for the input line to be lost across application restarts. * Added support for considering square brackets ([]) part of URLs. * Fixed the code producing multiple JOIN commands for auto-join as neces- sary to stay under the 512 byte limit for a single command to take the length of the commas in the commands into account when calculating the distribution of the channels among the multiple lines, as well as not to list channels falling at the boundary twice, once in the current and once in the following line. In English: Fixed auto-join with a massive amount of channels possibly not joining all channels correctly. * Fixed a bug causing re-joining of password-protected channels to fail on reconnects when those channels also had another mode with a parame- ter set. * Fixed a bug that caused query lines written by the user that are so long that they need to be split up into multiple messages not to display in the query text color. * Fixed a bug causing query lines written by the user that are so long they need to be split up into multiple messages for sending not to be displayed in the configured query text color. * Fixed the status bar showing HTML data when hovering the contents of the info label area at the top of query tabs. The data was actually supposed to be displayed as a tooltip (just like the nickname list item tooltips in channel tabs), and is now. * Fixed a bug causing the automatic away system to set the user away again on the next periodic activity check when no further mouse/keyboard acti- vity occurs after unlocking the screen/ending the screensaver. * Implemented splitting up of overly long actions (i.e. usage of the '/me' command) into multiple messages to stay under the 512 byte message length limit (in raw format) imposed by the IRC protocol. As with the normal message splitting, this is aware of how multi-byte/variable-width text encodings and sender hostmask length (which is part of the message on the receiving end) factor into the matter. Note that only the first message is actually sent as an action, the other messages are sent as normal messa- ges - intentionally, as this seemed to make the most sense formatting-wise. * Fixed the dialog box appearing upon receiving an invitation to join a chan- nel causing a disconnect by timeout when not being dealt with by the user swiftly enough. * Multiple invitations to join channels are now being handled by a single dialog box per connection, so that receiving many invitations in short order no longer means getting flooded with dialog boxes. * Implemented DH1080 key exchange support for Blowfish encryption. You can use the '/keyx' command to initiate a key exchange. * The raw log now shows encrypted incoming and outgoing messages in their encrypted form. Previously, incoming messages were being decrypted before being shown, and outgoing messages were being shown before encryption took place, thus not capturing what was actually coming from or going to the network socket as is the intent of the raw log. * Fixed a bug causing unrecognized channel mode characters being shown as their decimal value in the chat view messages announcing them having been set or removed. * Per-tab encoding settings for tabs belonging to a connection to a configu- red network (i.e. one found in the Server List dialog) now reference the unique ID rather than the name of the network in the config file, making things work reliably across restarts even when there are multiple identi- cally named networks. Encoding config file entries for tabs belonging to connections to servers that are not part of a configured network continue to reference the server hostnames. * Fixed the "(away)" label in front of the input line, indicating away sta- tus, not showing up in query tabs. Changes from 1.2-alpha2 to 1.2-alpha3: This third alpha fixes a fair amount of annoying bugs encountered in day-to-day usage, as well as a serious bug in handling NAMES messages from IRC servers. We've also made some UI changes that we'd like to get your feedback on: We've changed the default tab completion mode to "Cycle Nicklist", and we've removed the frame around the tab wid- get when using the listview version of the tab bar. * Worked around a Qt bug that has a text selection in the chat view that includes the last line in the view grow to include the new text when new text is appended to the view. * Fixed Konversation exposing various signals on D-Bus that it shouldn't have. * Fixed a regression causing '/names #channel' to end up duplicating the nickname list contents when already attending '#channel'. * When using Qt 4.5, Konversation no longer paints a frame around the UI elements of a view (e.g. a channel) when using the listview version of the tab bar. Feedback on this change is appreciated! * Fixed duplicated messages about DCC transfer failures in the chat view. * When the menu bar is hidden, the top-most item in the chat view context menu is now the option to unhide it again. * Fixed the OSD disappearing also cancelling the system tray blinking no- tification. * Fixed a crash on quit by D-Bus / by KDE session logout. * Fixed the tab completion nickname list sorting behavior for the "Shell- like" completion modes. The behavior now matches the "Cycle Nicklist" mode and the "Shell-like" modes of previous Konversation 1.x versions again: The last active nick for the given prefix is at the top of the list, with the rest of the list sorted alphabetically. * The default tab completion mode has been changed to "Cycle Nicklist". Feedback on this change is appreciated! * Changed the bundled 'bug' script to perform a quick search with the given parameter, rather than try to use it as a bug ID directly. The resulting behavior is unchanged for a numerical parameter, but with a string, much more useful. * The 'mail' script, which was disabled in the build system up until now, is now getting installed again. * Fixed a bug causing the "Set Encoding" menu not to work. * Fixed a bug causing the bundled 'media' script not to work when used to retrieve song information from Amarok 2 for a song which has any of the following meta data fields not set: title, artist or album. * Fixed the 'Self' field of the DCC transfer details panel not showing the port when available. * Fixed DCC transfers showing an average speed of 1 TB/s in their first second. Changes from 1.2-alpha1 to 1.2-alpha2: After just under a week's worth of adding back some missing functiona- lity, polishing the interface and, of course, of fixing bugs, we've de- cided to bring you Konversation 1.2-alpha2. While there were no major defects discovered in alpha1, this one should yield an overall more re- fined user experience, and brings us another good step closer to our first stable release for KDE 4. * Fixed nicknames in action messages using the message text color when nick coloring is disabled rather than the correct action text color as the rest of the message. * Added back the context menus for nicknames and channel links in the chat view. * Fixed the topic/info area in channels, queries and DCC chats, the nick- name list in channels and the listview variant of the tab bar not keep- ing their sizes when the window is resized. * Added missing actions ("Reconnect", "Disconnect", "Join channel ...") back to the context menu for server status tabs. * Improved the placement of the "Join on connect" channel tab context menu item (back under "Enable Notifications" as in v1.1). * Added the use of some of the new irc-* icons found in recent updates to the Oxygen icon theme. * Fixed crash when joining a channel after having been blocked from get- ting the topic for the channel. * Made the initial size of the "Edit Network" dialog more reasonable. * Improved vertical size of and text alignment inside the input line. * Added back support for drag and drop reordering of views to the list- view version of the tab bar. * Added back support for "surfing" in the listview version of the tab bar by pressing and holding the left mouse button on a view and moving the mouse up and down in the list view. * Fixed mouse handling for close buttons in the listview version of the tab bar. * Added back support for showing tooltips for truncated view items in the listview version of the tab bar. * Fixed crash when receiving lines terminated by LFCRLF from buggy IRC servers (such as the shroudBNC IRC proxy when it relays a private mes- sage received while no user was connected to it). * Worked around a Qt bug that has a text selection in the chat view that includes the last character in the view grow to include the new text when new text is appended to the view. * Sound notifications for highlights now reuse a single Phonon MediaObject by enqueuing notification sounds rather than instanciate a new one for every notification, improving resource efficiency and hopefully taking care of some high CPU usage reports that seemed to be linked to Konver- sation's Phonon usage. * Fixed the enabling/disabling of the "Find Previous" action. * Fixed several bugs in the Server List dialog (sort indicator disappear- ing while dragging items, stray pixel in the top-left corner of the list- view, hover decoration while dragging not always showing). * Improved handling in the Identity editor dialog: When Konversation com- plains about one or more required fields not being filled in, the dialog will now put focus on the field when it opens. * Fixed the 'Self' IP field of the DCC transfer details panel not showing a value when on the receiving end of a DCC file transfer. * Handle DCC REJECTs. A DCC SEND is now automatically aborted when the partner rejects it. * Fixed a bug causing the ordering of views to be partially reversed when switching from the listview version of the tab bar to the regular tab bar. * Improved consistency of the context menu for links between the topic area and the chat view. * Fixed repeated searches for the same search pattern (i.e. "Find Next") sometimes not working reliably with the chat view search bar. * Minor code cleanups and performance improvements. Changes from 1.1 to 1.2-alpha1: We're happy to bring you this first public release of the KDE 4 version of Konversation. Despite the "alpha" moniker we've settled on for this one, mostly due to not yet being feature-complete (see below), this port has already been used productively by a fair number of people for some time and should be stable enough for general usage. In fact, certain features, notably DCC file transfers and auto-replace, are expected to be more robust than in Konversation 1.1. While this version largely achieves feature parity with Konversation 1.1 (and adds several new features on top), notable exceptions are the lack of support for marker lines as well as nick and channel context menus in the chat view. These are pending the merge of a rewritten chat view and will make a return before the final Konversation 1.2 release. Other known issues in this version include a lack of KDE 4 HIG compliance in the con- figuration dialog and various minor interface polish problems; these will be addressed as well. Enjoy, and don't forget to report any bugs you encounter! * Ported to KDE 4 (KDE 4.1 or higher is required). * Enabled the (experimental, hackish) Amarok 2 support in the 'media' script. * Fixed a bug that could cause channel notifications to be lost across recon- nects. * Removed the code to recreate hidden-to-tray state across application re- starts. It was broken after the shutdown procedures were moved to a point in time after after the main window is hidden to cover quit-by-DCOP, and Konversation 1.1 features an explicit hidden startup option that fulfills user demands more accurately anyhow. This fixes a bug that made Konversa- tion always hide to tray on startup regardless of the aforementioned op- tion when the system tray icon was enabled. * Added a network settings lookup fallback to retrieving the key of a channel. Previously, this relied solely on the channel's mode map. Closes the brief gap between a channel join and the server's reply to MODE where possible, so that e.g. reconnecting directly after auto-joining a channel with a key doesn't result in a failed rejoin due to not having the key by way of the MODE reply yet. * Fixed opening URLs from the channel topic context menu in Channel List tabs. * When connecting to multiple selected unexpanded network items from the Ser- ver List, don't also try to connect to the hidden server sub-items selected by implication, avoiding unwanted connection duplicates. * Mask the password field in the Quick Connect dialog. * Fixed a bug causing passive DCC file transfers to stall at 99%. * Fixed "/leave" command in queries. * Fixed auto-replace rules containing commas in the pattern not being loaded correctly from the config file. * Fixed non-regex mode auto-replace rules containing regex special characters and character sequences not working correctly. * Improved performance of non-regex mode auto-replace rules. * Added option to open log files with the system text editor instead of the built-in log viewer. * Made the Oxygen nicklist icon theme the default nicklist icon theme. * Removed the bundled 'weather' script (it relied on a KDE 3 service no lon- ger present in KDE 4; a replacement will need to adopt a new approach). * Fix sending and receiving of files with names containing spaces * DCC Protocol adjustment to proper handle passive DCC resume/accept requests. (this breaks passive-resume compatibly with <konversation-1.2) * Send proper DCC reject commands when rejecting a queued receive. * Improved error recovery during dcc send. * Fix time left for transfers that finished in under 1 sec displaying infinite time left. * Increased default DCC buffer size to 16384 to reduce CPU load while sending or receiving files. * Added KNotify events for "Highlight triggered", "DCC transfer complete" and "DCC transfer error". * Fixed Automatic User Information Look Up not being started upon channel join on some IRC servers (namely those that don't send RPL_CHANNELCREATED after joining a channel, such at those used by IRCnet). * Updated the server hostname for the pre-configured Freenode network to the one given on their website these days, 'chat.freenode.net'. * Added support for browsing the input line history by using the mouse wheel. * Fixed problems the bundled 'tinyurl' script had with certain URLs by conver- ting it to use the TinyURL API rather than screen scraping. * Added initial support for the MODES parameter of RPL_ISUPPORT. When giving or taking op, half-op or voice to/from multiple people at once, Konversa- tion will now combine as many of them into a single MODE command as the server advertises it supports (as long as it advertises an actual value; the value-less unlimited MODES case is not supported yet as it requires more work on limiting MODE commands to the 512 byte IRC message buffer limit for extreme cases). If MODES is not given at all by the server, the fallback is an RFC1459-compliant value of 3. * Added support for formatting variable expansion in the replacement part of auto-replace rules. * Rewrote multi-line paste editor, improving handling and appearance. * Added button to intelligently replace line breaks with spaces to the multi- line paste editor. Changes from 1.0.1 to 1.1: We are extremely pleased to announce Konversation's newest major release, v1.1. Konversation 1.1 is a special release for us in multiple ways: It's our farewell to KDE 3, by way of being the last major release built upon that venerable platform. It's also our biggest release yet, in terms of the number and magnitude of the changes. The additions and improvements in this release are both user-visible and under the hood. Some of the highlights are rewritten connection handling (robustness and correctness improvements, better support for IRC URLs, bookmarking and more), redone DCC with better UI and Passive/Reverse DCC support, a redone away system with the addition of auto-away support, redone and much more useful remember / marker line support, a new outbound traffic scheduler that is capable of aggressive throttling to avoid flooding while smartly reordering messages to improve latencies, great convenience additions like a "Next Active Tab" shortcut, and much, much more, along with a large number of bugfixes and tweaks to round things out. Note: All fixes made since RC1 are marked with a "[New since RC1]" label in the changelog. We're confident that this release is the best and most robust version of Konversation published so far, and upgrading comes highly recommended to all users. Enjoy! Text views * Added an option to hide the scrollbar in chat windows. * Don't scroll to bottom if the view was scrolled up before resizing. * Fixed chat views occassionally not being scrolled to the bottom at their inception with long backlog appends. * Fixed an off-by-one error in scrollback culling. * Fixed a bug that lead to single leading whitespace characters in lines being omitted from display in chat windows. * Now preserving trailing whitespace in raw log tabs. * Fixed display of '<' and '>' in backlog lines. * Fixed copy/paste with shortcuts other than the default Ctrl+C/V ones. * Fixed onotice display. * Fixed middle-click-to-open-in-new-tab on chat window URLs when Konqueror wasn't running. * Fixed superfluous closing parenthesis being inserted after links in lines which contain multiple links followed by closing parentheses. * Fixed URLs with encoded hash mark %23 being incorrectly passed off to handler. * Fixed variable expansion causing certain URLs to be corrupted when pasted. * Added a "Save Link As" item to the context menu of links in the chat window. * Have the "Save as..." dialog suggest a file name. * Implemented Shift+Click to "Save as..." URLs.. * Made the channel links context menu work in server status views. * Fixed nickname links in chat view messages created as a result of '/msg <nick> <message>' commands erroneously prepending '->' to nicknames. * Fixed operations on nicknames containing "\" characters from the nickname context menu. * Fixed query view context menus operating on the wrong nickname under certain circumstances. * Fixed a bug that caused the "Send File..." action in the generic query context menu to pick the wrong recipient after hovering the user's own nick in the chat display. * Fixed date display not using the locale's date format. * Fixed IRC color parsing so that the colors gets reset to default if no color numbers were given. * Fixed a bug that could cause the text selection in a chat window to be messed up when new text was appended. Marker/Remember Lines * Konversation now distinguishes between manually and automatically inserted marker lines, making the "show line in all chat windows" preference less confusing. * The automatically inserted remember lines when chat windows are hidden are now "sliding", i.e. there is only one per chat window, and it moves. * Automatically inserted remember lines will now optionally only be inserted when there's actually new text being appended to the chat window (enabled by default). * The automatic remember line will now also be inserted when the window has lost focus. * Added an action to clear all marker lines in a chat window. * Improved marker lines-related preferences and terminology. * Improved the appearance of marker lines in the chat window. * Made the (marker line-related and other) identity default settings consistent between the initial identity and additional newly created identities. * Fixed hidden join/part/quit events marking tabs as dirty, allowing multiple consecutive remember lines to appear. * Fixed crash when minimizing or closing the application window prior to any tab switch when the auto-insertion of remember lines is enabled. Input line * Fixed input line contents rather than actual sent text being appended to the input history upon a multi-line paste edit. * Special characters and IRC color codes will now be inserted at the cursor position rather than the end of the input line contents. Nickname list * Implemented an additional "Sort by activity" nicklist sorting mode. * Added Oxygen nicklist icon theme by Nuno Pinheiro. * The list of nickname list themes is now sorted alphabetically. * Fixed race condition when removing a nicklist theme (listview would be repopulated before deletion was complete). * Fixed using the wrong palette for the disabled text color in the nickname list. * Fixed moving back from the custom alternate background color to system colors in the channel nickname listviews when disabling the "Use custom colors for lists, [...]" preference. * Cleanups in the nicklist item code. Tab bar / Tree list * Added option to add and remove a channel from its network's auto-join list from the tab context menu. * Added option to close tabs using middle-mouse. * Slightly sped up tab switching by eliminating some redundant UI action state updates. * Channel tabs will no longer close when kicked, but rather grey out on the tab bar and offer context menu actions to rejoin. * Channel and query tabs will now grey out on the tab bar when disconnected and no higher priority notification is present. Channel tabs will only ungrey if and when the channel is successfully rejoined after reconnect; query tabs ungrey immediately once reconnected. * Display tooltips for truncated treelist items. * Fixed forwarding keyboard events received by the treelist to Konsole widgets and focus adjustment thereafter as well as generally after switching to Konsole tabs by other means. * Fixed treelist scrollbar not picking up on new palette when the KDE color scheme changes. * Fixed a bug that could cause a crash when the view treelist would receive keypress events during application shutdown. * [New since RC1] Fixed a corner case where a server status item could become a child item of another server status item when dragging it below an special application pane item such as DCC Status or Watched Nicks Online. * [New since RC1] Fixed a crash when using the mouse wheel on the list within ~150ms of a drag and drop operation. System Tray icon * Remember and recreate minimized-to-tray state across sessions. * Added option for hidden-to-tray startup. * Reload tray icons when the icon theme changes at runtime. * Added option to not blink the systray icon, but just light it up. Channel Settings Dialog * Added a search line to the ban list. * Fixed sorting the ban list by time set. * Made the ban list's "Time Set" column use KDE locale settings for the date format. * Fixed OK'ing/Cancel'ing/closing the Channel Settings Dialog not dealing with open ban list in-line edits correctly. * Reset topic editbox when the channel options dialog has been dismissed with cancel. * Fixed incorrect time display in the topic history list in the Channel Settings dialog. Server List Dialogs * Moved the "Show at application startup" option for the Server List dialog to the dialog itself. * Auto-correct hostnames and passwords entered with preceding or trailing spaces in the Server List dialog. * Don't allow impossible ports to be set for servers. * Sensible default focus in the server list dialog. * Fixed unresponsive, defective Server List dialog window appearing at application startup using the Beryl or Compiz compositing window managers. Interface Misc * Added a "Next Active Tab" keyboard shortcut to jump to the next active tab with the highest priority notification. * Added a Find Previous standard action. * Have the "Insert Character" dialog pick up on text view font changes. * Show correct number of colors in the color chooser dialog. * Made "Alternate Background" colorchooser disable when unneeded. * Fixed crash when changing the KDE color scheme while a non-chat tab is open. * The encoding selection now allows returning to the used identity's default encoding setting. * Update actions on charset changes. * Added Notifications Toggle and Encoding sub-menu to the window menu. * Moved "Hide Nicklist" menu action from Edit to Settings. * Fixed the "Automatically join channel on invite" setting not to show an inquiring dialog anyway. * Fixed saving the state of the invitation dialog option in the Warning Dialogs preferences. * Added a warning dialog for quitting with active DCC file transfers. * Return focus to the text display widget after closing the search bar in a log reader view. * Made pressing Return or Enter in the Log File Viewer's size spinbox apply the setting, just as pressing the Return button. * Fixed a bug where the SSL padlock icon would be shown on a non-SSL connection (and clicking would cause a crash). * Empty topic labels will no longer show empty tooltips, but rather none at all. * Added a sample 12-hour clock format string to the timestamp format combobox. * Timestamp format list is no longer localized. * Robustness improvements and less UI quirks around channel password handling. * Improved general layout and consistency of tab, chat view, query and topic context menus. Added some missing icons. * Fixed some bugs of UI actions not being appropriately as their context changes. * Fixed enabled state of "Close All Open Queries" action not being updated correctly when queries are closed by way of closing a status view tab. * The window caption is now properly being reset when the last tab is closed. * Made units in spinboxen in the identity and app preferences UI more consistent. * Minor fixes to accelerators and tabbing order in various dialogs. Commands * Support command aliases in network connect commands. * Turned parameter-less '/away' into a toggle: Sets away state with default message initially, and unsets away state if already away. * Added an '/aunaway' command to complement '/aaway' (previously, there was only '/aback'). * Added support for '/kill'. * A '/join' command for an already-joined channel will now focus it. * Added an '/encoding' command as an alias to '/charset'. * '/charset' and '/encoding' now accept 'latin-1' as an alias for 'iso-8859-1'. * Improved messages for the '/charset' and '/encoding' commands. * Rewrote /me parsing to be less hackish and display usage info with an empty parameter. * '/msg <nick>' is no longer treated as equivalent to '/query <nick>'. * '/msg <nick>' will now error out when lacking a message parameter. * '/query <recipient> [message]' will now error out when recipient is a channel. * Added a '/queuetuner' command to bring up the outbound traffic scheduler's tuning/debug pane. Notifications * Seperated query messages and messages containing the user's nickname into two distinct KNotify events. * Made the tab notification color of private messages configurable independently from normal messages. * Don't highlight own nick on topic created by messages. * Fixed disabling notifications for a tab not cancelling highlight sounds. * Fixed a race condition where a highlight's autotext reply would outrun the original line's tab notification. * Fixed actions in queries and DCC chats producing message notification events (rather than the correct private message ones). * Changed the OSD screensaver check logic to work in KDE 4. * [New since RC1] Fixed on screen display occassionally reverting to the default position when using the settings dialog to change unrelated settings. Connection handling * Improved behavior with regard to reusing existing connections in connection attempts that provide an initial channel to join, such as command line arguments, the DCOP interface, the bookmark system or irc:// links). Previously, the application would have inconsistently either reused an existing or created a new connection. * Better dialog messages in the interactive variant of the decision to either reuse or create a new connection (from the Server List dialog and the Quick Connect dialog). * Improved and more consistent display of connection names (i.e. network or server host name) throughout the application. * Much improved irc:// URL support for connection intanciation, with support added for IPv6 host names and many of the features proposed by the Mirashi specification. * Eliminated redundant irc:// URL parsing codepaths in favor of a single one. * Added support for irc:// URLs to the chat views. * Removed "konversationircprotocolhandler" shell script. The Konversation executable now understands irc:// URLs directly. * Initiating connections from command line arguments and options now works also when the application is already running. * Fixed a bug that would cause a connection initiated from command line options not to get past the identity validation stage when the configuration file was unitialized and empty. * The server list dialog will now always be closed when starting Konversation with command line arguments to initiate a connection, consistent with the configuration-based auto-connect behavior. * Providing a channel in the creation of a new connection (i.e. via command line arguments, the DCOP interface, the Quick Connect dialog, the bookmark system or irc:// links) now consistently pre-empts the stored auto-join channel list if the target of the connection is a network or the hostname is found to be part of a configured network. Previously, this would only work for Quick Connect and the bookmark system (which caused the infamous Sabayon user flood in #kde due to their "Get Support" desktop link connecting to Freenode, which in an unconfigured Konversation has #kde in its auto-join list). * Connections now have globally unique IDs. * The DCOP interface now understands connection IDs in addition to host names. * The scripting systems now uses globally unique connection IDs rather than server host names to refer to connections, fixing a bug where scripted responses were being handed to all connections sharing a hostname (which was actually intentional in the absence of connection IDs, but undesirable for users). * Improved iteration behavior over a network's server list on connection losses. * The "Reconnect" action now works also when Konversation doesn't consider the connection to be in a disconnected state. * Improved the server status view messages related to reconnection attempts. * Consistently apply the "Reconnect delay" setting (previously confusingly named "Reconnect timeout"), which wasn't done before. * Fixed a bug that could cause the connection process to claim that a DNS lookup was successful when it actually wasn't. * Fixed opening bookmarks with spaces in the target address name (which may be a network name, and networks may have spaces in their name). * Properly update the state of the "Add/Remove to Watched Nicknames" nickname context menu actions when the connection isn't to a config-backed network, in which case there's no way to store and make use of those list entries. * Fixed a crash when quitting the application with a resident connection that disconnected due to an SSL error. * Fixed crashes in the DCOP interface if no connection was present. * Make the "Reconnect" action available even while ostensibly in the process of connecting. * Fix possible crash when closing all views and subsequently creating a new connection. * Fixed crash upon auto-connect at application startup. * Improved the naming of preferences related to automatic reconnection attempts to be less confusing. * Made it possible to set the number of automatic reconnection attempts to unlimited. * Provided better default values to the preferences related to automatic reconnection attempts. * Fixed crash when opening a Konsole tab and Konsole was not installed. * Fixed allowing the user to create an infinite loop of showing the SSL connection details dialog upon being presented with the invalid certificate multiple choice dialog at connection time by checking "Do not ask again" and then clicking "Details". Identities * Made it possible to set a Quit message independently from the Part message. * Saving a newly-created identity is no longer allowed without entering a real name. * Apply switching the identity in the identity dialog as opened from the network dialog to the network's settings. * Have the Edit/Delete/Up/Down buttons for the nickname list of an Identity correctly change state according to the selection Away system * Added per-identity support for automatic away on a configurable amount of user desktop inactivity and/or screensaver activation, along with support for automatic return on activity. * Fixed the "Global Away" toggle to make sense and update its state properly. * Turned parameter-less '/away' into a toggle: Sets away state with default message initially, and unsets away state if already away. * Added an '/aunaway' command to complement '/aaway' (previously, there was only '/aback'). * Broadly rewrote away management related code for improved robustness and less duplication and hacks (e.g. no more abuse of multiServerCommand for global away). DCC * Massive DCC refactoring and improved reliability. * Passive DCC support (Reverse DCC RECV, SEND). * Replaced the DCC Transfer Details dialog with a retractable transfer details pane directly in the DCC Status tab. * Added DCC transfer average speed reading to the DCC transfer details panel. * The DCC Status tab now remembers its column widths across sessions. * Fixed duplicated quotation marks around file names in DCC transfer status messages. * Fixed "Open File" DCC dialog remembering the last viewed location incorrectly. * Added an "Open Folder" button to the DCC transfer details panel. * Added check for whether the URL is well-formed before initiating a DCC send. Fixes a bug of dragging a nickname link in the chat view onto the query chat view drop target starting a DCC transfer that cannot succeed. * Ported the DCC code away from relying on server group IDs to refer to connections, made it use connection IDs instead. Fixes potential bugs with multiple concurrent connections to the same network. * Fixed queued DCC transfer items not picking up on download destination directory changes. * Fixed bug leading to crash upon initiating DCC Chat when "Focus new tabs" was enabled. * [New since RC1] New transfer items added to the DCC panel's transfer list are no longer automatically selected, meaning work on other items in the list occuring at the same time no longer gets interrupted. * [New since RC1] The "Filename:" line in the DCC panel's detailed info pane is now using text squeezing to avoid an increase in minimum window width with long file names. * [New since RC1] Failed receives now longer show 833TB/s as their transfer speed. Blowfish support * Fixed FiSH-style +p prefix to send clear text to channel despite an encryption key being set. * Text encoding is now being applied to the cleartext, rather than the ciphertext. This fixes using characters outside the ASCII range with blowfish encryption. * Fixed CTCP (and thus DCC) requests to nicknames for whom an encryption key is set. * Added support for encrypted topics. * If an encryption key is set, a lock icon will now be shown next to the input box. * Added a '/showkey <channel|query>' command to show the encryption key for the target in a popup dialog. Auto-replace * Improved auto-replace behavior with multiple matches in one line (fixes multiple Wikipedia links). * Fixed bug that could cause auto-replace to replace the wrong group of the matching string. * Auto-replace is now case-sensitive in regular expression mode. * Added regular expression editor button to auto-replace preferences. * Fixed conditional enabling of the RegExpEditor button in the auto-replace preferences page. Ignore * Fixed being asked twice whether to close a query upon ignoring the opponent. * Fixed crash when opting to close a query upon chosing to ignore the opponent from the context menu of his nickname. Watched Nicknames * Improved robustness of the Watched Nicknames Online system. * The "Offline" branches in the "Watched Nicks Online" list will now be omitted when there are no offline nicks for the respective network. * Fixed display of WHOIS spam prompted by the Watch List's WHOIS activity. * Connections to non-config-backed targets no longer show in Watched Nicks Online. * [New since RC1] Actually honor the preference to enable/disable the Watched Nicknames Online system, and apply it at runtime. * [New since RC1] Make sure the periodic Watched Nicknames Online check actually starts running within the same session after adding the first nickname to the list. * [New since RC1] Fixed a crash on quit with the Watched Nicks Online tab open and there being an open connection to a network that nicks are being watched for. Channel List * IRC markup is now removed from content in the Channel List view. * Speed improvements in Channel List views. * Fixed keyboard accelerator collisions in Channel List views. * Allow higher values than 99 in the min/max users filter spin boxes in Channel List views. Under the Hood / Protocol * Rewrote the outbound queue scheduling system to be smart enough to reorder outbound traffic to reduce interactive latency while aggressively throttling the rate to prevent flooding. Use '/queuetuner' to tweak. * Rearranged when and how auto-who is triggered upon channel join a bit, to avoid excessive flooding on multiple concurrent joins in some cases. * Auto-Who reliability improvements. * Fixed auto-join with very many channels (the auto-join command would exceed the maximum buffer length; it is now split into multiple commands as needed). * Fixed bugs around rejoining channels after reconnects related to the cause of the disconnect, channel passwords and picking the actual list of joined channels over the network's auto-join list. * Improved behavioral consistency in situations where the auto-join list is preempted by a transitory auto-join channel (bookmarks, etc.). * Fixed bug that caused the topic state not to be cleared properly prior to rejoining channels during reconnects. * Fixed onotice payload being cut off after the first word. * Changed RPL_WHOISOPERATOR handling to internationalize the common case ("is an IRC Operator") and otherwise passthrough the string sent by the server. * Fixed parsing of alternate invite format on Asuka ircds (QuakeNet). * Added support for PRIVMSG from the server. * Support RPL_UMODEIS. * Announce 'k' channel mode (i.e. channel key) changes in non-raw mode as well. * The command part of CTCP requests is now always converted to uppercase before sending, as some clients don't like lower- or mixed-case commands as the user may have entered them. * Display mode for your nick and channels you're not in. * Fixed per-channel encoding settings for the channels of a network being lost when the network is renamed. * Fixed crash when receiving actions for channels the client is not attending. * Made newline handling in the DCOP interface more robust, fixing a potential security problem (CVE-2007-4400). * A few speed optimizations and memory leak fixes. * [New since RC1] Fixed a crash on quit during KDE logout or when quitting by DCOP. Included scripts * Support for KMPlayer in the 'media' script (based on the window caption, as KMPlayer has no proper appropriate DCOP interface). * Added KPlayer support to the 'media' script (also caption-based). * Added support for Audacious to the 'media' script. * Fixed problems in disk space calculation in the 'sysinfo' script caused by wrapped df(1) output. * Added KDE 4 support to the 'sysinfo' script. * Removed some bashisms from the 'sysinfo' script. * Rewrote 'weather' script for increased reliability in error handling and better readability. * Removed broken 'qurl' script in favor of new 'tinyurl' one. * Fixed the 'fortune' script not working properly when variable expansion is turned off in the preferences. * [New since RC1] Fixed a bug in the 'media' script that caused it to break when querying Audacious with audtool not being available. Packaging * [New since RC1] Standards compliancy fixes in the application .desktop file and the nicklist icon theme .desktop files. Build * Fixed build with --enable-final. ------------------------------------------------------------------------------- Changes from 1.0 to 1.0.1 We are pleased to announce the immediate availability of Konversation 1.0.1, a maintenance release featuring notable improvements for users of right-to- left languages (including new Arabic and Hebrew translations), further re- finement of the user interface and application functionality, and fixes for minor defects found in the previous release. * A bug that caused left-to-right text contained in lines determined to be right-to-left text to appear reversed has been fixed. * Whether a line is treated as right-to-left vs. left-to-right text is now determined by the amount of each type of character in the line, improving the user experience in chats involving bi-directional text considerably. * The "Edit Network" dialog has been refined for clarity and ease of use. * A warning dialog to prevent accidentally quitting Konversation has been added. * The Auto Replace list can now be sorted. * The '/media' script command now sports improved player recognition, enhan- ced and easier configurability, the ability to distinguish between audio and video media as well as newly added support for kdetv. New '/audio' and '/video' command aliases have been added to expose these new abilities. * The lower boundary of the default DCC port range has been raised from 1025 to 1026 to avoid conflicts with the commonly blocked Windows RPC port 1025. * Dismissing an OSD notification by clicking on it will now also cancel the systray notification flash. * A new configuration file option [OSD]OSDCheckDesktopLock has been added, allowing to manually disable the screensaver check in non-KDE environments that do not support it, causing the OSD not to be displayed. * A bug that could lead to the "Switch to" sub-menu in the context menus of tabs not to be updated properly upon switching tabs has been fixed. * A bug that caused the 'irc setBack' DCOP call not to function has been fixed. * A bug that caused ampersands in the names of tabs not to be displayed and an immediately following character to be used as keyboard accelerator has been fixed. * A bug that caused ignoring nicknames with '[' or ']' characters in them to fail has been fixed. * Command aliases containing regular expression syntax can no longer cause built-in commands not to function. * A bug that caused the Konversation irc:// protocol handler not to function has been fixed. Its compatibility with systems that do not use the GNU bash shell as default shell has been improved. * A notable number of code quality improvements suggested by KDEs automated quality control service EBN have been implemented. ------------------------------------------------------------------------------- Changes from 0.19 to 1.0 We are extremely pleased to announce the immediate availability of Konversation 1.0, a significant milestone in the lifetime of the Konversation project. This release includes major new functionality as well as a large amount of improvements to existing functionality, with an emphasis on user interface polish and overall reliability. Notable new features include a vertical treelist of tabs as an alternative to the traditional tab bar, auto-replacement of words in incoming and outgoing messages, an improved Channel Settings dialog now featuring a ban list, an optional expanding input box and many improvements to both DCC file transfers and DCC chats. Enjoy! User Interface * It is now possible to place the tabs on the left side of the application window. This has been implemented as a treelist of tabs. The treelist supports all of the cosmetic and interactive properties of the original horizontal tab bar, including colored notifications, LED icons, (hover) close buttons with delayed activation, reordering, drag'n'drop and mouse wheel cruising. And a few tricks of its own. * Connection status tabs now feature specific context menu entries to disconnect and reconnect, as well as to join a channel on that connection. * The automatic resizing of tabs in the tab bar first implemented in version 0.19 is now optional. * The grouping behavior of Channel List and Raw Log tabs in the tab bar has been improved. * Disabling notification for a tab will now unset the active notification. * The enabled/disabled state of the notifications for connection status tabs will now be remembered across sessions for configured networks. * The speed of switching tabs in quick succession with the auto-spellchecking preference enabled has been improved. * Using custom fonts in the user interface is now optional. The font used by the tab bar is now configurable. * Events in the connection status tabs are now logged into separate logfiles. * The Channel Settings dialog now includes a Ban List tab that allows viewing, adding and removing bans in a channel. The dialog can now be opened from the menu bar and chat window context menu in addition to the button in the topic area. * Mode and topic handling in the Channel Settings dialog and the channel mode buttons have been overhauled to make them more robust and reliable. * The number of Quick Buttons to show below the nickname list in channel tabs is now configurable. Additional buttons may be added or existing buttons removed. * Konversation now supports auto-replacing words in incoming and outgoing messages. Regular expressions are supported. The auto-replace configuration can be found in the preferences dialog. The static Wiki link feature found in older versions has been retired in favor of an auto-replace rule. * The search bar has been redesigned to provide a better user experience. * The "Find Next" action will now open the search bar when there is no active search, matching the behavior of Konqueror and other KDE applications. * The sorting of the nick completion list has been improved to put the last active user for a given completion prefix at the beginning of the list. * The tab completion of the user's own nickname has been reenabled. * The nick completion feature has been significantly cleaned up and made more reliable. A bug that could lead to an application crash during nick completion has been fixed. * An option to expand the vertical size of the input box automatically when the text entered grows beyond the length of a single line has been added. * The behavior of the input box on pasting text including leading or trailing newline characters has been improved never to cause lines being sent without user acknowledgement. * The input box of connection status, channel and query tabs will now be disabled and the nickname list of channel tabs cleared when the respective server connection is closed. * Konversation can now optionally insert a remember line whenever a tab is hidden, either by switching to a different tab or minimizing the window. * Multiple consecutive remember lines will no longer be inserted. * Remember lines can now also be inserted into the chat windows of connection status and DCC Chat tabs. * The Colored Nicknames feature will now always assign the same color to the same nickname. * The number of backlog lines to show in the chat window is now configurable. * The recognition of URLs in the chat window has been improved to cope better with URLs containing or being surrounded by parentheses and to exclude trailing dots and commas. * Channel links following mode characters or surrounded by interpunctuation are now properly recognized in the chat window. * The context menus for URLs and channel links in the topic area now match the context menus in the chat window. * Multiple ignore or unignore actions ordered at the same time will no longer be shown on separate lines in the chat window. * The nickname context menus in the chat window, topic are and the nickname list will now show "Ignore", "Unignore" and "Add to Watched Nicknames" entries as applicable. * A bug that could lead to the chat window nickname context menu actions ceasing to function after the targeted user left the channel has been fixed. * The Server List dialog now allows connecting to a specific server in a network even when a connection to that network has been previously established. If that connection is active, a dialog box will verify whether to disconnect from the current server and connect to the chosen one instead, otherwise the connection will simply be reestablished using the newly chosen server. * The Quick Connect feature will now properly warn when the identity to be used in the connection attempt is not set up properly. * The appearance and behavior of the warning about an incorrectly set-up identity have been improved. A prior connection attempt will now be automatically resumed after the identity settings have been corrected. * Many of the pages in the Konversation preferences dialog have been redesigned and rewritten for improved consistency, reliability and clarity. The general layout of the dialog has been improved as well. * The naming of certain actions in the Configure Shortcuts dialog has been improved to make them easier to recognize outside of their normal context in the application interface. * Numerous improvements to keyboard navigation have been made. * The nickname list now longer allows drag'n'drop of channel or user links from the chat window onto list entries, as a DCC transfer of those data sources cannot succeed. * The preference to show or hide the real names of users in the nickname list will now be applied immediately. * The columns of the nickname list will no longer resize erratically when the preferences to show or hide real names and hostmasks are changed at runtime. * A bug that could lead to nicknames being sent as messages when double-clicking a selection of multiple nicknames in the nickname list has been fixed. * The placement of actions in the application menus has been improved. * The shown/hidden state of the application menubar will now be remembered across sessions. When the menubar is hidden, a menu action to show it again will now be added to the chat window context menu. * The "Close All Open Queries" menu action is now be disabled properly when there are no open queries. * A bug that could lead to the "Close All Open Queries" menu action failing to properly close all open queries has been fixed. * A bug that could lead to an application crash when closing the tab after choosing to ignore someone in a query has been fixed. * The "Hide Nicklist" menu action will now be disabled properly when the tab shown does not have a nickname list has been fixed. * The actions in the "Insert" menu will now be disabled properly when the current tab does not support them. * The default double-click action in the "Watched Nicks Online" tab is now to open a query to the respective contact. * The sorting in the Watched Nicks Online tab has been improved: Offline users are now always sorted at the bottom. * Several bugs in the "Watched Nicknames Online" tab that could lead to application crashes have been fixed. * Several errors in the chat window status messages produced by the Watched Nicks Online system have been corrected. * A bug that could lead to the columns in the "Watched Nicks Online" list resizing erratically has been fixed. * A bug that could lead to the status bar not being cleared properly when the last tab was closed or the application window lost focus after a link was launched from the chat window has been fixed. * The display of temporary and static info texts in the status bar has been improved not to interfere with each other and provide more useful information. Also, the status bar lag info section is now updated more consistently to avoid jumping around of the other status bar sections. * A bug that could lead to a wrong nickname count being shown in the status bar of channel tabs has been fixed. * Repeated triggering of the "Open URL Catcher" menu action will now properly show and hide the URL Catcher tab. * The warning about pasting text with multiple lines can now be properly disabled and reenabled from the Warning Dialogs preferences page. * A bug that could lead to IRC bookmarks showing up as actions in the Configure Shortcuts dialog has been fixed. * A bug that could lead to changes of the global KDE icon set not being applied to the tab bar close buttons immediately has been fixed. * A bug that caused the application window to change its horizontal size after opening a Query to a user with a very long hostmask has been fixed. The DCC Chat and query tabs now use the same heading style as channel tabs. * A bug that could lead to the topic and nickname list areas not keeping their size properly across tab switches has been fixed. * A bug that could lead to certain types of KNotify event notifications not being executed properly when the system tray icon was enabled has been fixed. * A bug that could lead to ampersands in network names being shown as underscores in the menu under certain circumstances has been fixed. * A bug that could lead to an application crash when trying to access non-existing tabs via the Alt+number keyboard shortcuts has been fixed. * A bug that could lead to the toolbar being hidden after it was edited has been fixed. * A bug that could lead to the chat window context menu not being cancelled properly when clicking outside of it has been fixed. * A bug that could lead to heavy disk seeking when the splitters separating the topic area and the nickname list from the chat window were moved has been fixed. * The option to only show the application in the system tray at all times has been retired in favor of the standard KDE mechanic of minimizing into the system tray. Commands * The 'Now Playing' script invoked via the /media command alias now features support for XMMS and KSCD as well as improved support for untagged media files playing in Amarok. Support for non-ASCII encodings in file names and meta tags has been improved as well. * New "/hop" and "/dehop" commands to grant or remove half-op status from a user have been added. * A new "/devoice" command has been added. * A new "/kickban" command to ban and immediately kick a user has been added. It supports the same parameters as the "/ban" command plus an additional "kickban reason" parameter. * Commands to grant or remove status for users will now be applied to the user's own nickname when no nickname parameter is given. * The "/unignore" command now supports the same simple nickname-only format as the "/ignore" command. * If given no parameter, the "/away" command will now set the away state with the default away message. The "/back" and "/unaway" commands can be used to unset the away state. * You may now use "%nick" as a placeholder for your own nickname in the auto- connect commands for a network. * A bug that could lead to the auto-connect commands for a network not being executed correctly has been fixed. DCC * DCC file transfers now support file names containing spaces on send, receive and resume. The automatic replacement of spaces with underscores in file names can now be optionally disabled in the DCC preferences. * File names are no longer being needlessly lower-cased during DCC transfers. * The DCC file transfer and DCC Chat info messages shown in the chat window have been significantly improved to provide more useful information while being less excessively verbose. * DCC Chats will now be logged properly. * It is now possible to select multiple files in the DCC Status tab. * The default size of the buffer used in DCC transfers has been increased to 8192kb for improved DCC performance. * The DCC Status tab will no longer show a speed of '?' for completed, failed or aborted transfers. * Bugs that could lead to the IP used for DCC transfers not being retrieved from the server correctly upon reconnect or in general on certain servers have been fixed. * A bug that could lead to the progress bar of a transfer in the DCC Status tab being rendered at a wrong position has been fixed. * A bug that could lead to Konversation's CPU usage spiking to 100% after a DCC Chat was closed from the remote side has been fixed. * Several bugs that could lead to application crashes in DCC Chat tabs after the server connection from which the DCC Chat originated was closed have been fixed. Technology * Konversation will now properly split up very long lines into multiple messages by calculating the length of the message preamble and the number of bytes of the text payload. Encodings that use multiple or variable numbers of bytes per character are accounted for. * The Disconnect and Reconnect menu actions and the respective input box commands have been rewritten for increased reliability. Their state will now be updated properly, and they will quit the IRC server in the correct manner. * A previous away state will now be recreated upon reconnection to a server. * The Quick Connect feature will now no longer join the auto-join channels of the configured network that the quick connect server was recognized as being a part of. * The "Konversation" and "KonvDCOPIdentity" DCOP objects have been renamed to "irc" and "identity", respectively. Several bugs in the DCOP API have been fixed, and deprecated interfaces removed. * Processing of the user lists of newly joined channels has been rewritten to fix several bugs, including improved compatibility with the Bip IRC proxy and other servers. * The lag calculation and timeout handling code has been rewritten for improved reliability and performance. * Recognition of the half-op user status has been improved. * The detection of text being typed into the input box to prevent focussing new tabs at inconvenient times has been improved to work correctly with non-ASCII characters. * The handling of channel user limits in the Channel Settings dialog is now more reliable. * Support for mode flags encountered on UnrealIRCD servers has been improved. * Support for RPL_DATASTR on UnrealIRCD servers has been improved. * A bug that could lead to the mode flags displayed for users not being updated properly after they were kicked from a channel has been fixed. * A bug that could lead to iterating over a configured network's servers failing after a connection failure has been fixed. * A bug that could lead to Konversation connecting to the wrong server in a network when choosing to connect to a specific server from the Server List dialog has been fixed. * A dialog will now ask the user for an additional nickname when all nicknames configured in the identity where tried unsuccessfully during a connection attempt. This replaces the previous behavior of repeatedly appending underscores to the last nickname, which eventually ran into the nickname length limit on the server. * A bug that could lead to unnecessary nick changes immediately after connecting to a server has been fixed. * A bug that could lead to Konversation trying to auto-identify multiple times upon connect on certain servers has been fixed. * A bug that could lead to Konversation not picking up on users leaving a channel without providing a part or quit message on UnrealIRCD servers has been fixed. * Changes to the list of auto-join channels for a network will now be applied immediately. * The auto-reconnect preference will now be properly applied at runtime. * Konversation will no longer enable IDENTIFY-MSG mode on servers that support it, but continues to be able to process messages with IDENTIFY-MSG prefixes in case an involved IRC proxy chose to enable IDENTIFY-MSG mode. * The broken default for the Custom Web Browser preference has been fixed. * Konversation will no longer allow Konsole tabs to be opened in KDE environments in which the use of terminals is prohibited by the KIOSK framework. * A bug that could lead to an application crash when a Konsole tab was closed from the Konsole component's context menu has been fixed. * A bug that could lead to an application crash when a channel was joined while the application window was hidden has been fixed. ------------------------------------------------------------------------------- Changes from 0.18 to 0.19 We are extremely pleased to announce the immediate release of Konversation 0.19. The focus of this release is on extending and improving upon established functionality. Most notable in this regard are significantly improved management of IRC networks and servers all across the application, a redesigned tab bar and better support for common IRC commands. A long list of further additions and improvements has us confident of this being the best version of Konversation yet. Enjoy! User Interface * The Server List dialog has been rewritten to allow direct manipulation of a network's servers and features more intelligent sorting behavior. Reordering networks via drag and drop is now possible. A behavioral audit of all actions in the dialog resulted in numerous improvements. * A redesigned tab bar sports highly configurable text- and LED icon-based notifications as well as more intelligent scaling behavior under space-critical conditions. * Tabs are now intelligently grouped around their respective connection status tab. * Status tab labels now display the user-configured network name where appropriate. * The Find Text dialog has been replaced by a search bar that no longer interrupts your workflow. * Channel links in the chat area now feature a context menu for quick access to common actions. * Usage of the status bar has been extended to show context-relevant information as the cursor passes over various interface elements. The lag information segment is now only shown where appropriate. * A channel's topic can now be cleared by setting an empty text in the Channel Options dialog. * The Channel Options dialog has been redesigned to allow editing the current topic while browsing a channel's topic history. * The Watched Nicknames interface has been fully integrated with network management. * Pressing the Arrow Down key in the input line now preserves any input entered by adding it to the history. * Commands may now be sent as regular messages by typing Ctrl+Enter. * The multi-line paste editor window now highlights whitespace characters and prepends the existing content of the input line. * The Colored Nicknames feature has been improved to better handle nickname changes and immediately apply any changes to the color palette. * Some previously not configurable notification events have been made configurable. * Users leaving a server will now be announced in any query you have open with them. * Query tab labels will now update when a user you have a query open with changes his/her name. * The DCC file transfer dialogs have seen a number of cosmetic improvements. Among other things, in the event of a file being renamed on save, the local file name is now shown across the application. * Various status and error messages have been rewritten for improved consistency and clarity. * The KDE standard text font will now be correctly set as initial default chat font. * It is now possible to skip displaying a server's MOTD on connect. * If the application is set to display a server's MOTD in a fixed-width font and the previously configured default chat font is already a fixed-width font, the chat font will now be used rather than the global KDE default fixed-width font. * The state of the automatic spell checking functionality is now remembered across sessions and set for all tabs. * Networks no longer lose their channel history when their settings are changed. * The Server List dialog will no longer close when a connection attempt fails due to the identity not being set up correctly. * After changing your nickname using the optional drop-down menu to the left of the input line, focus will now be returned to the input line. * The configuration dialog has been rewritten to correctly update the button state of its primary actions and improve consistency with the KDE style guide. * The vertical and horizontal splitters in channel tabs now behave better when the application window is resized and correctly retain their positions across sessions. * The OSD preview in the OSD settings page is now always shown correctly. * The OSD will no longer be shown when the desktop is locked. * A bug that prevented copying text from the chat area under certain circumstances has been fixed. * Keyboard search in the channel nickname list has been fixed. * A number of issues affecting nickname context menus in the chat area have been fixed. * A bug leading to a wrong operator count in the status bar has been fixed. * It is no longer possible to add nameless networks or hostless servers in the respon- sible management dialogs. * Bugs that led to parts of the interface not reacting to KDE color scheme changes have been fixed. * The status bar now correctly reacts to KDE font size changes. * A bug that led to the application window resizing on overly long status bar contents has been fixed. * A bug that led to multiple remember lines being inserted into the frontmost tab when away mode was activated has been fixed. * A bug that led to wrong link addresses being opened from the chat area has been fixed. * Bugs that led to wrong URLs being produced by dragging a link from the chat area to the input line have been fixed. * Channel names are now better recognized as such by the chat area. Bookmarking * Bookmark titles now default to the channel name. * Bookmarks now store the network name rather than the server address where available. * Bookmarks now support IPv6 addresses. Commands * The '/server' command now recognizes a greater variety of address notations including network names. * The '/names' command now always succeeds in returning the user list of a channel. * The '/topic' command now always succeeds in returning the topic of a channel. * A '/dns' command has been added that facilitates resolving the host name of a user on the server as well as generic host names. Reverse resolve is supported on KDE 3.5.1+. * An '/unignore' command has been added. * A '/disconnect' command has been added. * A '/reconnect' command has been added that disconnects and then reconnects the respec- tive server. * A '/setkey' command has been added to set the Blowfish encryption/decryption key for the respective context. * The '/list' command now correctly opens the Channel List tab. * A bug in parsing the arguments of the '/join' command has been fixed. * Usage information and error reporting for various commands has been rewritten for improved consistency and clarity. * A bug that led to a 'clear' command being sent to the server when using the '/clear' command to clear the contents of a query tab has been fixed. Miscellaneous * The 'media' script has been rewritten and now features improved compatibility with common character sets, greatly enhanced support for the Kaffeine media player and newly added support for the Yammi media player. * The 'sysinfo' script has been rewritten to produce more concise output and better handle a variety of storage scenarios. * The convenience feature expanding [[term]] into a Wikipedia link is now localizable and generates a link that performs an intelligent lookup for the term in the Wiki- pedia rather than assume a correct direct link. Technology * Konversation now depends on KDE 3.4+. * The preferences storage system has been rewritten to facilitate easier maintenance and faster development in future release cycles. * Localized support for a long list of IRC protocol primitives has been added. * The application will now correctly iterate over a network's servers on successive failed connection attempts. * When the '/server' command or the Quick Connect dialog is used to connect to a server that has previously been added to a network in the Server List dialog, it will be recognized as being part of the network and the respective identity settings will be applied. * The automated reply to a highlight event can now reference the groups of the matched pattern by the identifiers %1-%9 and the entire match by the identifier %0. * The CABAP IDENTIFY-MSG technology is now supported. * Compatibility with the Unreal IRC server has been improved. * Initial support for Blowfish encryption (compatible with mIRCryption and FiSH) has been added. Note that Diffie-Hellman key exchange (DHX) is not yet supported. * The Watched Nicknames reporting has been made more reliable. * Socket handling in the DCC file transfer feature has been improved. * Alpha-blending of icons in the channel nickname list has been fixed. * Support for the iso-2022-jp encoding has been enhanced. * The custom web browser feature will now automatically append the URL as a parameter to the specified command when the %u identifier is missing. * Channel modes are now correctly cleared and updated in the internal representation on rejoin. * A bug that led to an infinite loop during a connection attempt when all nicknames configured in the identity were in use has been fixed. * A bug that could lead to a crash when opening the log file for a closed connection has been fixed. ------------------------------------------------------------------------------- Changes from 0.17 to 0.18 - All nicks were blue when colored nicks are disabled with some setups - /cycle now works as expected - /gauge script was not working correctly when given a bigger than 100 argument - /mail script has been added - Button to invoke Regular Expression Editor (if installed) in Settings -> Highlight. - Complete command line argument system for connection - An option to disable clickable nicks . Add ClickableNicks=false to konversationrc to disable it. - Fixed a big memory leak in message processing - Nicklist slider now correctly resizes in all channels when its resized and correctly restores on startup - [[foo]] is now a link to http://en.wikipedia.org/wiki/foo . We will expand this to local wikipedia's in a later release [Update: Now fixed in 0.19] Changes from 0.16 to 0.17 - Add an option to hide realnames in nicklist - Show away users as disabled ala Xchat - Remove sort by away status - Fix whois replies for normal users on safe channels ( IRCNet alike ) - Fix whois replies from ircd-hybrid ( Efnet alike ) - Better handling of quiet bans ( especially Freenode ) - KDE color scheme is now honered in topic widget - Enable clickable nicks even if colored nicks are off - Per identity pre-shell command support with a GUI - Bookmarking support - Detect Japanese encoding correctly while trying to auto-detect Unicode Changes from 0.15 to 0.16 - Dropping URLs onto nick on nicklist or onto query initiates DCC send - You can now do SSL connections from Quick Connect Dialog - Nicklist Icon Themes - New topic widget - Added a channel dialog - Made the nickname box optional - Fix DCC resume when its set to auto-accept - Calculate DCC CPS more accurately - Colored nicks support - Added dcop functions to set away and added alt+a shortcut to toggle away - Clicking nicks in channel text will now open a query and similarly, clicking #foo will now join channel #foo - Nicks in channel view now have a context menu as in nicklistview - Tab at begining of line inserts last completed nick - A media script added to replace amarok,juk,noatun,kaffeine scripts. Use /media instead of using /amarok,/juk etc. - Links can now be dragged & dropped from channels - Midde clicking urls now opens them in new tab in konqueror ( if konqueror is used for links ) - Improved unicode detection - Fix unicode detection for strings containing color markup - /omsg,/onotice support - Added an option to use an IPv4 interface for IPv6 dcc sends - A new /google script added to search Google using Google SOAP api - Redesigned settings page - A new application icon - Lots of optimizations all around Changes from 0.14 to 0.15 - Ported socket code to KNetwork. Weird connection problems should be gone now - Get default username/ident information from system - Support for bouncer prefixes in nick completion - Dcc port range support - Scripts now works with /script or /exec script - Improved bidi support. - Cleaned up settings dialog - Added an option how to get own IP for DCC send/chat - "Open Watched Nicks Online panel on startup" option - Support encoding settings per channel - SSL Support - KIO-fied local I/O on DCC send/receive - OSD Positioning Support - New network based server settings - Added an option to stay in systray all the time - Full irc:/ url support (channel name & password now supported in url) - /charset support - auto /WHO support - display away status of nicks in nick list Changes from 0.13 to 0.14 - Added irc "pseudo" command /prefs for changing settings without settings dialog. - Measure away time and make it available via placeholder (%t) - (Very much) Improved OSD. - New application icons by luciash d' being <luci@sh.ground.cz>. Thanks! - Added /server command for connecting to a server. - After the connection is lost and the old nickname is still in use, the nickbutton in the channelwindows is updated to the new nick. - Now you can read utf8 encoded messages even if your locale is not unicode - "Do not show this dialog again" preferences now works correctly - Added an "Insert Remember Line" feature. The user can mark the position in the channel where he stopped reading(because he is away for a short time). When he comes back, he can scroll back to this mark and read what he missed. - Added the possibility to execute commands on server connection(for authentication and such things). Can be configured in the "Edit Server" dialog. - Added further timestamps for am/pm (BR 79612) - Added QuickConnect dialog by Michael Goettsche. (Thanks once again) - Properly receive a logout/shutdown request and terminate konversation, instead of minimizing to the systray. - Make OSD switchable on/off via DCOP. Thanks to Michael Goettsche! (BR 75870) - Dates can now be shown, next to the timestamp. Patch by Michael Goettsche (BR 82785) (thanks!) - Added DCC auto-resume feature by Michael Goettsche (BR 81740) (thanks!) - Added systray notification - Added shell like nick completion mode (aka uga mode) - Implemented a cleaner way of handling tab shortcuts - Implemented DCC Chat - Hilight mailto: links - Topic line can now be hidden - Added an away nickname - Added /aaway, /ame and /amsg - Added "Open URL" context menu to channel list entries - Implemented slower / faster blinking of tabs for more / less important events - Less important events like Join, Part and Nickchanges can now be hidden - Custom CTCP Version Reply Support - Added a shortcut to close all open queries - Added a patch by Thomas Nagy to cycle tabs with mouse scroll wheel (thanks!) - Added logfile reader - Added patch by Gary Cramblitt to enhance DCC panel (thanks!) - Added patch by Gary Cramblitt to select custom web browser command (thanks!) - When the server goes offline, now all associated tabs get crossed out - Added a multi line pasting editor - Nicks Online is now a tabbed panel, rather than separate window. - Added sound support to the highlight list - Added regular expression support to the highlight list^ - Follow the style guide when the tray icon is enabled by minimizing to tray when the close button is clicked. - Auto text feature on highlight events - DCC resume offers to rename a transfer now - Added patch by Ruud Nabben to enable hiding of IRC colors (thanks!) - Various small fixes and additions Changes from 0.12 to 0.13 - Added an option to hide hostmasks in channel nick lists - Autojoin on invite with user interaction implemented - Added URL catcher interface - Added user interface for "don't show again" dialogs - Added slovenian translation by Barko (thanks!) - Added korean translation by Hye-Shik Chang (thanks!) - Added option to place tabs on top - Color configuration is now in preferences dialog - Quick buttons configuration is now in preferences dialog - Notify list is now in preferences dialog - Option for a background image added - Added /quote command for raw server messages - Added Copy URL into clipboard for URL catcher - Added option for reconnect on too long lag - Added "Server list" menu entry to "File" menu - Applied a patch by Peter Simonsson (thanks!) - Patch added Color picker, IRC colors and KNotify events - Added support for command aliases - Encodings are now on per-identity basis - Added indicator to show own away state - Added system tray icon patch by Frauke Oster (thanks!) - Channel list update is now more CPU friendly - Tell the user why the channel list could not be opened - Channel list now sorts correctly when number column is clicked - Applied a patch by Christian Muehlhaeuser to enable bigger mode changes (thanks) - Applied a patch by Christian Muehlhaeuser to right-align close widgets (thanks) - Info button on dcc panel now works - Added /unban command - Applied a patch by Christian Muehlhaeuser for OSD functions (thanks) - Applied a patch by Sascha Cunz for extended user modes beyond @ and + (thanks) - Applied a patch by Steve Wollkind to close visible tab via shortcut (thanks) Changes from 0.11 to 0.12 - Now handles multi server mode in one single window - Fixed the wrong Ops counter - Added /notify command and respective dcop calls - Added support for /oper command - Implemented /ban command and menu items - Added shortcut (F3) for search dialog - History does not get cleared on cursor up/down anymore - Added context menu to copy URLs immediately - Added paragraph spacing - Added hostmask column to nick list - Implemented background hostmask scanning - Recognises now who set the first topic - Added nickname sorting options - Sorting now has up/down arrows - Added channel list panel - Added russian translation by Stanislav Karchebny (thanks!) - Applied some patches by Stanislav Karchebny - Added PgUp/PgDown support to Channels, Queries and Status views - Added rename button to identity page to overcome QComboBox limitations - Tabs now blink in the last highlight color to indicate important text - Tabs don't get to front anymore while the user is typing in an input line - Added shortcut editor dialog - Added konsole panel (thanks to Mickael Marchand) Changes from 0.10 to 0.11 - Added a patch by Bart Verwilst to provide automatic service registration (thanks!) - Added "Hide Menu" function - Improved server connection code to stop konversation freezes at startup - Server lag calculation after reconnect fixed - Implemented own async lookup class to throw out broken QDns - Added prelimnary application icons - Send File in dcc panel now works - Added Send File context menu item in text views - Added dialog for Resume / Overwrite DCC Get files - Added large paste warning dialog - Close Buttons on tabs are now an option - Added context menu on tabs with close item - Added ALT+1 - ALT+9 for switching tabs - Applied a big patch by Alex Zepeda. Thanks! - First working DCOP implementation - Implemented a simple search dialog - Added a raw log pane Changes from 0.9 to 0.10 - Font encodings are now set via KCharsets - Implemented different identities - Added double click actions to nick list and notify list - Added support for ASCII-BEL - Added custom spacing and margin - Added close buttons for the tabs - Redesign of the color configuration dialog - Switched to kapp->config() to properly remember dialog status - Color code parsing now works with QRegExp - CTCP-Ping now works - Removed files that are no longer needed - Updated German translation Changes from 0.8 to 0.9 - Added strikeout support (untested yet) - Added Swedish translation, done by Karolina Lindqvist (thanks!) - Added optional timestamps to chat windows - Quick Buttons and Channel Mode Buttons can now be hidden - Added support for multi channel joins - Added #include "sourcefile.moc" to all Q_OBJECTS to speed up compiles - Added support for autoconnect to server - Inserted a QSplitter between channel text and nick list - Added support for background colors - Reduced flickering on blinking tabs - Added experimental support for foreign language characters - Added ignore list functionality - Added away / unaway messages - DCC folder can now be selected vial GUI - Applied a patch by Barak Bloch to fix foreign character set behaviour (thanks!) - Updated German translation Changes from 0.7 to 0.8: - DCCs can now be opened (started) using the 'open' button - DCCs can now be aborted using the 'abort' button - Added support for /users reply - Added support for /invite and 341 reply - Added support for 401 error reply - Added /smsg for "silent messages" - Text and Nicklist-Fonts can now be selected via GUI - Changed server ping response again to make dalnet ircd happy - Fixed nicklist sorting in channels - Switched to kdevelop 2.1.4 to hopefully fix some compile problems - Made Notices appear a bit different - DCC recipient list now gets sorted - Made text widget not scroll when scroll bar isn't completely down - Parsed WHOIS messages into human readable form - Pasting multiline text into input lines now behaves as expected - Hilights now honor the sending nick, too (patch by Suran. Thanks!) - You can now hilight all your own lines independently - Fixed the problem in the appearance dialog with font names - Added DCC error dialogs - Quit/Nickchange/Kicks are now only reported in channels where the nick actually is in - Fixed bug with lockups on defective logfiles - Added support for EUR currency symbol - Added keyboard handling to navigate between pages - Code cleanup in nick list - Added first support for custom colors in nick list - Added application dsescription for the 'About' dialog - Major restructuring of the server status panel diff --git a/src/commit.h b/src/commit.h index 9b71ba25..035d185f 100644 --- a/src/commit.h +++ b/src/commit.h @@ -1,4 +1,4 @@ // This COMMIT number is added to version string to be used as "patch level" #ifndef COMMIT -#define COMMIT 5021 +#define COMMIT 5022 #endif diff --git a/src/viewer/ircview.cpp b/src/viewer/ircview.cpp index 766987d7..e2c95c20 100644 --- a/src/viewer/ircview.cpp +++ b/src/viewer/ircview.cpp @@ -1,2384 +1,2386 @@ // -*- mode: c++; c-file-style: "bsd"; c-basic-offset: 4; tabs-width: 4; indent-tabs-mode: nil -*- /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ /* Copyright (C) 2002 Dario Abatianni <eisfuchs@tigress.com> Copyright (C) 2005-2016 Peter Simonsson <peter.simonsson@gmail.com> Copyright (C) 2006-2010 Eike Hein <hein@kde.org> Copyright (C) 2004-2011 Eli Mackenzie <argonel@gmail.com> */ #include "ircview.h" #include "channel.h" #include "dcc/chatcontainer.h" #include "application.h" #include "highlight.h" #include "sound.h" #include "emoticons.h" #include "notificationhandler.h" #include <QDrag> #include <QScrollBar> #include <QTextBlock> #include <QPainter> #include <QTextDocumentFragment> #include <QMimeData> #include <KIconLoader> #include <KStandardShortcut> #include <kio/pixmaploader.h> #include <KUrlMimeData> #include <QLocale> using namespace Konversation; class ScrollBarPin { QPointer<QScrollBar> m_bar; public: ScrollBarPin(QScrollBar *scrollBar) : m_bar(scrollBar) { if (m_bar) m_bar = m_bar->value() == m_bar->maximum()? m_bar : 0; } ~ScrollBarPin() { if (m_bar) m_bar->setValue(m_bar->maximum()); } }; // Scribe bug - if the cursor position or anchor points to the last character in the document, // the cursor becomes glued to the end of the document instead of retaining the actual position. // This causes the selection to expand when something is appended to the document. class SelectionPin { int pos, anc; QPointer<IRCView> d; public: SelectionPin(IRCView *doc) : pos(0), anc(0), d(doc) { if (d->textCursor().hasSelection()) { int end = d->document()->rootFrame()->lastPosition(); //WARNING if selection pins don't work in some build environments, we need to keep the result d->document()->lastBlock(); pos = d->textCursor().position(); anc = d->textCursor().anchor(); if (pos != end && anc != end) anc = pos = 0; } } ~SelectionPin() { if (d && (pos || anc)) { QTextCursor mv(d->textCursor()); mv.setPosition(anc); mv.setPosition(pos, QTextCursor::KeepAnchor); d->setTextCursor(mv); } } }; IRCView::IRCView(QWidget* parent) : QTextBrowser(parent), m_rememberLine(0), m_lastMarkerLine(0), m_rememberLineDirtyBit(false), markerFormatObject(this) { m_mousePressedOnUrl = false; m_isOnNick = false; m_isOnChannel = false; m_chatWin = 0; m_server = 0; setAcceptDrops(false); // Marker lines connect(document(), SIGNAL(contentsChange(int,int,int)), SLOT(cullMarkedLine(int,int,int))); //This assert is here because a bad build environment can cause this to fail. There is a note // in the Qt source that indicates an error should be output, but there is no such output. QTextObjectInterface *iface = qobject_cast<QTextObjectInterface *>(&markerFormatObject); if (!iface) { Q_ASSERT(iface); } document()->documentLayout()->registerHandler(IRCView::MarkerLine, &markerFormatObject); document()->documentLayout()->registerHandler(IRCView::RememberLine, &markerFormatObject); connect(this, SIGNAL(anchorClicked(QUrl)), this, SLOT(anchorClicked(QUrl))); connect( this, SIGNAL(highlighted(QString)), this, SLOT(highlightedSlot(QString)) ); setOpenLinks(false); setUndoRedoEnabled(0); document()->setDefaultStyleSheet("a.nick:link {text-decoration: none}"); setWordWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); setFocusPolicy(Qt::ClickFocus); setReadOnly(true); viewport()->setCursor(Qt::ArrowCursor); setTextInteractionFlags(Qt::TextBrowserInteraction); viewport()->setMouseTracking(true); //HACK to workaround an issue with the QTextDocument //doing a relayout/scrollbar over and over resulting in 100% //proc usage. See bug 215256 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setContextMenuOptions(IrcContextMenus::ShowTitle | IrcContextMenus::ShowFindAction, true); } IRCView::~IRCView() { } void IRCView::increaseFontSize() { QFont newFont(font()); newFont.setPointSize(font().pointSize() + 1); setFont(newFont); } void IRCView::decreaseFontSize() { QFont newFont(font()); newFont.setPointSize(font().pointSize() - 1); setFont(newFont); } void IRCView::resetFontSize() { setFont(Preferences::self()->textFont()); } void IRCView::setServer(Server* newServer) { if (m_server == newServer) return; m_server = newServer; } void IRCView::setChatWin(ChatWindow* chatWin) { m_chatWin = chatWin; } void IRCView::findText() { emit doSearch(); } void IRCView::findNextText() { emit doSearchNext(); } void IRCView::findPreviousText() { emit doSearchPrevious(); } bool IRCView::search(const QString& pattern, QTextDocument::FindFlags flags, bool fromCursor) { if (pattern.isEmpty()) return true; m_pattern = pattern; m_searchFlags = flags; if (!fromCursor) moveCursor(QTextCursor::End); else moveCursor(QTextCursor::StartOfWord); // Do this to that if possible the same position is kept when changing search options return searchNext(); } bool IRCView::searchNext(bool reversed) { QTextDocument::FindFlags flags = m_searchFlags; if(!reversed) flags |= QTextDocument::FindBackward; return find(m_pattern, flags); } class IrcViewMimeData : public QMimeData { public: IrcViewMimeData(const QTextDocumentFragment& _fragment): fragment(_fragment) {} virtual QStringList formats() const; protected: virtual QVariant retrieveData(const QString &mimeType, QVariant::Type type) const; private: mutable QTextDocumentFragment fragment; }; QStringList IrcViewMimeData::formats() const { if (!fragment.isEmpty()) return QStringList() << QString::fromLatin1("text/plain"); else return QMimeData::formats(); } QVariant IrcViewMimeData::retrieveData(const QString &mimeType, QVariant::Type type) const { if (!fragment.isEmpty()) { IrcViewMimeData *that = const_cast<IrcViewMimeData *>(this); //Copy the text, skipping any QChar::ObjectReplacementCharacter QRegExp needle(QString("\\xFFFC\\n?")); that->setText(fragment.toPlainText().remove(needle)); fragment = QTextDocumentFragment(); } return QMimeData::retrieveData(mimeType, type); } QMimeData *IRCView::createMimeDataFromSelection() const { const QTextDocumentFragment fragment(textCursor()); return new IrcViewMimeData(fragment); } void IRCView::dragEnterEvent(QDragEnterEvent* e) { if (e->mimeData()->hasUrls()) e->acceptProposedAction(); else e->ignore(); } void IRCView::dragMoveEvent(QDragMoveEvent* e) { if (e->mimeData()->hasUrls()) e->accept(); else e->ignore(); } void IRCView::dropEvent(QDropEvent* e) { if (e->mimeData() && e->mimeData()->hasUrls()) emit urlsDropped(KUrlMimeData::urlsFromMimeData(e->mimeData(), KUrlMimeData::PreferLocalUrls)); } // Marker lines #define _S(x) #x << (x) QDebug operator<<(QDebug dbg, QTextBlockUserData *bd); QDebug operator<<(QDebug d, QTextFrame* feed); QDebug operator<<(QDebug d, QTextDocument* document); QDebug operator<<(QDebug d, QTextBlock b); // This object gets stuffed into the userData field of a text block. // Qt does not give us a way to track blocks, so we have to // rely on the destructor of this object to notify us that a // block we care about was removed from the document. This does not // prevent the first block bug from deleting the wrong block's data, // however that should not result in a crash. struct Burr: public QTextBlockUserData { Burr(IRCView* o, Burr* prev, QTextBlock b, int objFormat) : m_block(b), m_format(objFormat), m_prev(prev), m_next(0), m_owner(o) { if (m_prev) m_prev->m_next = this; } ~Burr() { m_owner->blockDeleted(this); unlink(); } void unlink() { if (m_prev) m_prev->m_next = m_next; if (m_next) m_next->m_prev = m_prev; } QTextBlock m_block; int m_format; Burr* m_prev, *m_next; IRCView* m_owner; }; void IrcViewMarkerLine::drawObject(QPainter *painter, const QRectF &r, QTextDocument *doc, int posInDocument, const QTextFormat &format) { Q_UNUSED(format); QTextBlock block=doc->findBlock(posInDocument); QPen pen; Burr* b = dynamic_cast<Burr*>(block.userData()); Q_ASSERT(b); // remember kids, only YOU can makes this document support two user data types switch (b->m_format) { case IRCView::BlockIsMarker: pen.setColor(Preferences::self()->color(Preferences::ActionMessage)); break; case IRCView::BlockIsRemember: pen.setColor(Preferences::self()->color(Preferences::CommandMessage)); // pen.setStyle(Qt::DashDotDotLine); break; default: //nice color, eh? pen.setColor(Qt::cyan); } pen.setWidth(2); // FIXME this is a hardcoded value... painter->setPen(pen); qreal y = (r.top() + r.height() / 2); QLineF line(r.left(), y, r.right(), y); painter->drawLine(line); } QSizeF IrcViewMarkerLine::intrinsicSize(QTextDocument *doc, int posInDocument, const QTextFormat &format) { Q_UNUSED(posInDocument); Q_UNUSED(format); QTextFrameFormat f=doc->rootFrame()->frameFormat(); qreal width = doc->pageSize().width()-(f.leftMargin()+f.rightMargin()); return QSizeF(width, 6); // FIXME this is a hardcoded value... } QTextCharFormat IRCView::getFormat(ObjectFormats x) { QTextCharFormat f; f.setObjectType(x); return f; } void IRCView::blockDeleted(Burr* b) //slot { Q_ASSERT(b); // this method only to be called from a ~Burr(); //tracking only the tail if (b == m_lastMarkerLine) m_lastMarkerLine = b->m_prev; if (b == m_rememberLine) m_rememberLine = 0; } void IRCView::cullMarkedLine(int, int, int) //slot { QTextBlock prime = document()->firstBlock(); if (prime.length() == 1 && document()->blockCount() == 1) //the entire document was wiped. was a signal such a burden? apparently.. wipeLineParagraphs(); } void IRCView::insertMarkerLine() //slot { //if the last line is already a marker of any kind, skip out if (lastBlockIsLine(BlockIsMarker)) return; //the code used to preserve the dirty bit status, but that was never affected by appendLine... //maybe i missed something appendLine(IRCView::MarkerLine); } void IRCView::insertRememberLine() //slot { m_rememberLineDirtyBit = true; // means we're going to append a remember line if some text gets inserted if (!Preferences::self()->automaticRememberLineOnlyOnTextChange()) { appendRememberLine(); } } void IRCView::cancelRememberLine() //slot { m_rememberLineDirtyBit = false; } bool IRCView::lastBlockIsLine(int select) { Burr *b = dynamic_cast<Burr*>(document()->lastBlock().userData()); int state = -1; if (b) state = b->m_format; if (select == -1) return (state == BlockIsRemember || state == BlockIsMarker); return state == select; } void IRCView::appendRememberLine() { //clear this now, so that doAppend doesn't double insert m_rememberLineDirtyBit = false; //if the last line is already the remember line, do nothing if (lastBlockIsLine(BlockIsRemember)) return; if (m_rememberLine) { QTextBlock rem = m_rememberLine->m_block; voidLineBlock(rem); if (m_rememberLine != 0) { // this probably means we had a block containing only 0x2029, so Scribe merged the userData/userState into the next m_rememberLine = 0; } } m_rememberLine = appendLine(IRCView::RememberLine); } void IRCView::voidLineBlock(QTextBlock rem) { QTextCursor c(rem); c.select(QTextCursor::BlockUnderCursor); c.removeSelectedText(); } void IRCView::clearLines() { while (hasLines()) { //IRCView::blockDeleted takes care of the pointers voidLineBlock(m_lastMarkerLine->m_block); }; } void IRCView::wipeLineParagraphs() { m_rememberLine = m_lastMarkerLine = 0; } bool IRCView::hasLines() { return m_lastMarkerLine != 0; } Burr* IRCView::appendLine(IRCView::ObjectFormats type) { ScrollBarPin barpin(verticalScrollBar()); SelectionPin selpin(this); QTextCursor cursor(document()); cursor.movePosition(QTextCursor::End); if (cursor.block().length() > 1) // this will be a 0x2029 cursor.insertBlock(); cursor.insertText(QString(QChar::ObjectReplacementCharacter), getFormat(type)); QTextBlock block = cursor.block(); Burr *b = new Burr(this, m_lastMarkerLine, block, type == MarkerLine? BlockIsMarker : BlockIsRemember); block.setUserData(b); m_lastMarkerLine = b; //TODO figure out what this is for cursor.setPosition(block.position()); return b; } // Other stuff void IRCView::updateAppearance() { QFont newFont; const int fontSize = font().pointSize(); if (Preferences::self()->customTextFont()) newFont = Preferences::self()->textFont(); else newFont = QFontDatabase::systemFont(QFontDatabase::GeneralFont); newFont.setPointSize(fontSize); setFont(newFont); setVerticalScrollBarPolicy(Preferences::self()->showIRCViewScrollBar() ? Qt::ScrollBarAlwaysOn : Qt::ScrollBarAlwaysOff); if (Preferences::self()->showBackgroundImage()) { QUrl url = Preferences::self()->backgroundImage(); if (url.isValid()) { viewport()->setStyleSheet("QWidget { background-image: url("+url.path()+"); background-attachment:fixed; }"); return; } } if (!viewport()->styleSheet().isEmpty()) viewport()->setStyleSheet(QString()); QPalette p; p.setColor(QPalette::Base, Preferences::self()->color(Preferences::TextViewBackground)); viewport()->setPalette(p); } bool IRCView::dateRtlDirection() { // Keep format synced with IRCView::timeStamp return QLocale().toString(QDate::currentDate(), QLocale::ShortFormat).isRightToLeft(); } // To minimize the use of bidi marks, for cases below, some bidi marks are // needed. // * left aligned lines in LTR locales, and // * right aligned lines in RTL locales // // First, check if the direction of the message is the same as the // direction of the timestamp, if not, then add a mark depending on // message's direction, so that timestamp don't be first strong character. // // If we have a LTR label, and the message is right-aligned, we prepend // it with LRM to look correct (check nickname case below), and then append // it with LRM also and then a RLM to preserve the direction of the // right-aligned line. // // Later, if the message is RTL, nicknames like "_nick]" will appear // as "[nick_". // First, add a LRM mark to make underscore on the left, next add the // nickname, and then another LRM mark. Since we use RTL/LTR count, the // message may start with a LTR word, and appear to the right of the // nickname. That's why we add a RLM mark before the nick to force it // appearing on left. QString IRCView::formatFinalLine(bool rtl, QString lineColor, QString label, QString nickLine, QString nickStar, QString text) { // Nick correctly displayed: <_nick]> QString line; // It's right-aligned under LTR locale, or left-aligned under RTL locale if (!rtl == dateRtlDirection()) line += (rtl ? RLM : LRM); if (!label.isEmpty()) { // Label correctly displayed: [_label.] if (rtl) line += LRM; // [.label_] -> [._label] line += "<font color=\"" + lineColor + "\"><b>[</b>%4<b>]</b></font>"; if (!label.isRightToLeft() == rtl) line += LRM + RLM; // [._label] -> [_label.] } line += "<font color=\"" + lineColor + "\">%1"; if (!nickStar.isEmpty()) // Used for [timeStamp] * nick action line += nickStar; if (rtl) line += LRM; // <[nick_> -> <[_nick]> line += nickLine; if (rtl) { line += LRM; // <[_nick]> -> <_nick]> // It might start with an English word, but it's RTL because of counting if (!text.isEmpty() && !text.isRightToLeft()) line += RLM; // ARABIC_TEXT <_nick]> Hi -> ARABIC_TEXT Hi <_nick]> } if (text.isEmpty()) line += "</font>"; else line += " %3</font>"; return line; } // Data insertion void IRCView::append(const QString& nick, const QString& message, const QHash<QString, QString> &messageTags, const QString& label) { QString channelColor = Preferences::self()->color(Preferences::ChannelMessage).name(); m_tabNotification = Konversation::tnfNormal; QString nickLine = createNickLine(nick, channelColor); QChar::Direction dir; QString text(filter(message, channelColor, nick, true, true, false, &dir)); QString line; bool rtl = (dir == QChar::DirR); // Normal chat lines // [timestamp] <nickname> chat message line = formatFinalLine(rtl, channelColor, label, nickLine, QString(), text); line = line.arg(timeStamp(messageTags, rtl), nick, text); if (!label.isEmpty()) { line = line.arg(label); } emit textToLog(QString("<%1>\t%2").arg(nick, message)); doAppend(line, rtl); } void IRCView::appendRaw(const QString& message, bool self) { QColor color = self ? Preferences::self()->color(Preferences::ChannelMessage) : Preferences::self()->color(Preferences::ServerMessage); m_tabNotification = Konversation::tnfNone; // Raw log is always left-aligned // [timestamp] << server line // If the timedate string is RTL, prepend a LTR mark to force the direction // to be LTR, as the datetime string is already returned as it's for a // left-aligned line. QString line; if (dateRtlDirection()) line += LRM; line += (timeStamp(QHash<QString, QString>(), false) + " <font color=\"" + color.name() + "\">" + message + "</font>"); doAppend(line, false, self); } void IRCView::appendLog(const QString & message) { QColor channelColor = Preferences::self()->color(Preferences::ChannelMessage); m_tabNotification = Konversation::tnfNone; // Log view is plain log files. // Direction will be depending on the logfile line direction. QString line("<font color=\"" + channelColor.name() + "\">" + message + "</font>"); doRawAppend(line, message.isRightToLeft()); } void IRCView::appendQuery(const QString& nick, const QString& message, const QHash<QString, QString> &messageTags, bool inChannel) { QString queryColor=Preferences::self()->color(Preferences::QueryMessage).name(); m_tabNotification = Konversation::tnfPrivate; QString nickLine = createNickLine(nick, queryColor, true, inChannel); QString line; QChar::Direction dir; QString text(filter(message, queryColor, nick, true, true, false, &dir)); bool rtl = (dir == QChar::DirR); // Private chat lines // [timestamp] <nickname> chat message line = formatFinalLine(rtl, queryColor, QString(), nickLine, QString(), text); line = line.arg(timeStamp(messageTags, rtl), nick, text); if (inChannel) { emit textToLog(QString("<-> %1>\t%2").arg(nick, message)); } else { emit textToLog(QString("<%1>\t%2").arg(nick, message)); } doAppend(line, rtl); } void IRCView::appendChannelAction(const QString& nick, const QString& message, const QHash<QString, QString> &messageTags) { m_tabNotification = Konversation::tnfNormal; appendAction(nick, message, messageTags); } void IRCView::appendQueryAction(const QString& nick, const QString& message, const QHash<QString, QString> &messageTags) { m_tabNotification = Konversation::tnfPrivate; appendAction(nick, message, messageTags); } void IRCView::appendAction(const QString& nick, const QString& message, const QHash<QString, QString> &messageTags) { QString actionColor = Preferences::self()->color(Preferences::ActionMessage).name(); QString line; QString nickLine = createNickLine(nick, actionColor, false); if (message.isEmpty()) { // No text to check direction. Better to check last line, if it's RTL, // treat it as that. QTextCursor formatCursor(document()->lastBlock()); bool rtl = (formatCursor.blockFormat().alignment().testFlag(Qt::AlignRight)); line = formatFinalLine(rtl, actionColor, QString(), nickLine, QString(" * "), QString()); line = line.arg(timeStamp(messageTags, rtl), nick); emit textToLog(QString("\t * %1").arg(nick)); doAppend(line, rtl); } else { QChar::Direction dir; QString text(filter(message, actionColor, nick, true,true, false, &dir)); bool rtl = (dir == QChar::DirR); // Actions line // [timestamp] * nickname action line = formatFinalLine(rtl, actionColor, QString(), nickLine, QString(" * "), text); line = line.arg(timeStamp(messageTags, rtl), nick, text); emit textToLog(QString("\t * %1 %2").arg(nick, message)); doAppend(line, rtl); } } void IRCView::appendServerMessage(const QString& type, const QString& message, const QHash<QString, QString> &messageTags, bool parseURL) { QString serverColor = Preferences::self()->color(Preferences::ServerMessage).name(); m_tabNotification = Konversation::tnfControl; // Fixed width font option for MOTD QString fixed; if(Preferences::self()->fixedMOTD() && !m_fontDataBase.isFixedPitch(font().family())) { if(type == i18n("MOTD")) fixed=" face=\"" + QFontDatabase::systemFont(QFontDatabase::FixedFont).family() + "\""; } QString line; QChar::Direction dir; QString text(filter(message, serverColor, 0 , true, parseURL, false, &dir)); // Server text may be translated strings. It's not user input: treat with first strong. bool rtl = text.isRightToLeft(); // It's right-aligned under LTR locale, or left-aligned under RTL locale if (!rtl == dateRtlDirection()) line += (rtl ? RLM : LRM); line += "<font color=\"" + serverColor + "\"" + fixed + ">%1 <b>[</b>%2<b>]</b>"; if (!rtl == type.isRightToLeft()) line += (rtl ? RLM : LRM); // [50 [ARABIC_TEXT users -> [ARABIC_TEXT] 50 users line += " %3</font>"; line = line.arg(timeStamp(messageTags, rtl), type, text); emit textToLog(QString("%1\t%2").arg(type, message)); doAppend(line, rtl); } void IRCView::appendCommandMessage(const QString& type, const QString& message, const QHash<QString, QString> &messageTags, bool parseURL, bool self) { QString commandColor = Preferences::self()->color(Preferences::CommandMessage).name(); QString prefix="***"; m_tabNotification = Konversation::tnfControl; if(type == i18nc("Message type", "Join")) { prefix="-->"; parseURL=false; } else if(type == i18nc("Message type", "Part") || type == i18nc("Message type", "Quit")) { prefix="<--"; } prefix=prefix.toHtmlEscaped(); QString line; QChar::Direction dir; QString text(filter(message, commandColor, 0, true, parseURL, self, &dir)); // Commands are translated and contain LTR IP addresses. Treat with first strong. bool rtl = text.isRightToLeft(); // It's right-aligned under LTR locale, or left-aligned under RTL locale if (!rtl == dateRtlDirection()) line += (rtl ? RLM : LRM); line += "<font color=\"" + commandColor + "\">%1 %2 %3</font>"; line = line.arg(timeStamp(messageTags, rtl), prefix, text); emit textToLog(QString("%1\t%2").arg(type, message)); doAppend(line, rtl, self); } void IRCView::appendBacklogMessage(const QString& firstColumn,const QString& rawMessage) { QString time; QString message = rawMessage; QString nick = firstColumn; QString backlogColor = Preferences::self()->color(Preferences::BacklogMessage).name(); m_tabNotification = Konversation::tnfNone; //The format in Chatwindow::logText is not configurable, so as long as nobody allows square brackets in a date/time format.... int eot = nick.lastIndexOf(' '); time = nick.left(eot); nick = nick.mid(eot+1); if(!nick.isEmpty() && !nick.startsWith('<') && !nick.startsWith('*')) { nick = '|' + nick + '|'; } // Nicks are in "<nick>" format so replace the "<>" nick.replace('<',"<"); nick.replace('>',">"); QString line; QChar::Direction dir; QString text(filter(message, backlogColor, NULL, false, false, false, &dir)); bool rtl = nick.startsWith('|') ? text.isRightToLeft() : (dir == QChar::DirR); // It's right-aligned under LTR locale, or left-aligned under RTL locale if (!rtl == time.isRightToLeft()) line += (rtl ? RLM : LRM); line += "<font color=\"" + backlogColor + "\">"; // Prepend and append timestamp's correct bidi mark if the time and text // directions are different. if (rtl == time.isRightToLeft()) line += "%1"; else line += (time.isRightToLeft() ? RLM+"%1"+RLM : LRM+"%1"+LRM); // Partially copied from IRCView::formatFinalLine if (rtl) { // Return back to the normal direction after setting mark if (!rtl == time.isRightToLeft()) line += (!time.isRightToLeft() ? RLM : LRM); line += LRM; // <[nick_> -> <[_nick]> } line += "%2"; if (rtl) { line += LRM; // <[_nick]> -> <_nick]> if (!text.isRightToLeft()) line += RLM; // ARABIC_TEXT <_nick]> Hi -> ARABIC_TEXT Hi <_nick]> } line += " %3</font>"; line = line.arg(time, nick, text); doAppend(line, rtl); } void IRCView::doAppend(const QString& newLine, bool rtl, bool self) { if (m_rememberLineDirtyBit) appendRememberLine(); if (!self && m_chatWin) m_chatWin->activateTabNotification(m_tabNotification); int scrollMax = Preferences::self()->scrollbackMax(); if (scrollMax != 0) { //don't remove lines if the user has scrolled up to read old lines bool atBottom = (verticalScrollBar()->value() == verticalScrollBar()->maximum()); document()->setMaximumBlockCount(atBottom ? scrollMax : document()->maximumBlockCount() + 1); } doRawAppend(newLine, rtl); //FIXME: Disable auto-text for DCC Chats since we don't have a server to parse wildcards. if (!m_autoTextToSend.isEmpty() && m_server) { // replace placeholders in autoText QString sendText = m_server->parseWildcards(m_autoTextToSend,m_server->getNickname(), QString(), QString(), QString(), QString()); // avoid recursion due to signalling m_autoTextToSend.clear(); // send signal only now emit autoText(sendText); } else { m_autoTextToSend.clear(); } if (!m_lastStatusText.isEmpty()) emit clearStatusBarTempText(); } void IRCView::doRawAppend(const QString& newLine, bool rtl) { SelectionPin selpin(this); // HACK stop selection at end from growing QString line(newLine); line.remove('\n'); QTextBrowser::append(line); QTextCursor formatCursor(document()->lastBlock()); QTextBlockFormat format = formatCursor.blockFormat(); format.setAlignment(Qt::AlignAbsolute|(rtl ? Qt::AlignRight : Qt::AlignLeft)); formatCursor.setBlockFormat(format); } QString IRCView::timeStamp(QHash<QString, QString> messageTags, bool rtl) { if(Preferences::self()->timestamping()) { QDateTime serverTime; if (messageTags.contains(QStringLiteral("time"))) // If it exists use the supplied server time. serverTime = QDateTime::fromString(messageTags[QStringLiteral("time")], Qt::ISODate).toLocalTime(); QTime time = serverTime.isValid() ? serverTime.time() : QTime::currentTime(); QString timeColor = Preferences::self()->color(Preferences::Time).name(); QString timeFormat = Preferences::self()->timestampFormat(); QString timeString; bool dateRtl = dateRtlDirection(); if(!Preferences::self()->showDate()) { timeString = QString(QLatin1String("<font color=\"") + timeColor + QLatin1String("\">[%1]</font> ")).arg(time.toString(timeFormat)); } else { QDate date = serverTime.isValid() ? serverTime.date() : QDate::currentDate(); timeString = QString("<font color=\"" + timeColor + "\">[%1%2 %3%4]</font> ") .arg((dateRtl==rtl) ? QString() : (dateRtl ? RLM : LRM), QLocale().toString(date, QLocale::ShortFormat), time.toString(timeFormat), (dateRtl==rtl) ? QString() : (!dateRtl ? RLM : LRM)); } return timeString; } return QString(); } QString IRCView::createNickLine(const QString& nick, const QString& defaultColor, bool encapsulateNick, bool privMsg) { QString nickLine ="%2"; QString nickColor; if (Preferences::self()->useColoredNicks()) { if (m_server) { if (nick != m_server->getNickname()) nickColor = Preferences::self()->nickColor(m_server->obtainNickInfo(nick)->getNickColor()).name(); else nickColor = Preferences::self()->nickColor(8).name(); } else if (m_chatWin->getType() == ChatWindow::DccChat) { QString ownNick = static_cast<DCC::ChatContainer*>(m_chatWin)->ownNick(); if (nick != ownNick) nickColor = Preferences::self()->nickColor(Konversation::colorForNick(ownNick)).name(); else nickColor = Preferences::self()->nickColor(8).name(); } } else nickColor = defaultColor; nickLine = QLatin1String("<font color=\"") + nickColor + QLatin1String("\">") + nickLine + QLatin1String("</font>"); if (Preferences::self()->useClickableNicks()) nickLine = "<a class=\"nick\" href=\"#" + nick + "\">" + nickLine + "</a>"; if (privMsg) nickLine.prepend(QLatin1String("-> ")); if(encapsulateNick) nickLine = QLatin1String("<") + nickLine + QLatin1String(">"); if(Preferences::self()->useBoldNicks()) nickLine = QLatin1String("<b>") + nickLine + QLatin1String("</b>"); return nickLine; } void IRCView::replaceDecoration(QString& line, char decoration, char replacement) { int pos; bool decorated = false; while((pos=line.indexOf(decoration))!=-1) { line.replace(pos,1,(decorated) ? QString("</%1>").arg(replacement) : QString("<%1>").arg(replacement)); decorated = !decorated; } } QString IRCView::filter(const QString& line, const QString& defaultColor, const QString& whoSent, bool doHighlight, bool parseURL, bool self, QChar::Direction* direction) { QString filteredLine(line); Application* konvApp = Application::instance(); //Since we can't turn off whitespace simplification withouteliminating text wrapping, // if the line starts with a space turn it into a non-breaking space. // (which magically turns back into a space on copy) if (filteredLine[0] == ' ') { filteredLine[0] = '\xA0'; } // TODO: Use QStyleSheet::escape() here // Replace all < with < filteredLine.replace('<', "\x0blt;"); // Replace all > with > filteredLine.replace('>', "\x0bgt;"); if (filteredLine.contains('\x07')) { if (Preferences::self()->beep()) { qApp->beep(); } //remove char after beep filteredLine.remove('\x07'); } filteredLine = ircTextToHtml(filteredLine, parseURL, defaultColor, whoSent, true, direction); // Highlight QString ownNick; if (m_server) { ownNick = m_server->getNickname(); } else if (m_chatWin->getType() == ChatWindow::DccChat) { ownNick = static_cast<DCC::ChatContainer*>(m_chatWin)->ownNick(); } if(doHighlight && (whoSent != ownNick) && !self) { QString highlightColor; if (Preferences::self()->highlightNick() && line.toLower().contains(QRegExp("(^|[^\\d\\w])" + QRegExp::escape(ownNick.toLower()) + "([^\\d\\w]|$)"))) { // highlight current nickname highlightColor = Preferences::self()->highlightNickColor().name(); m_tabNotification = Konversation::tnfNick; } else { QList<Highlight*> highlightList = Preferences::highlightList(); QListIterator<Highlight*> it(highlightList); Highlight* highlight; QStringList highlightChatWindowList; bool patternFound = false; QStringList captures; while (it.hasNext()) { highlight = it.next(); highlightChatWindowList = highlight->getChatWindowList(); if (highlightChatWindowList.isEmpty() || highlightChatWindowList.contains(m_chatWin->getName(), Qt::CaseInsensitive)) { if (highlight->getRegExp()) { QRegExp needleReg(highlight->getPattern()); needleReg.setCaseSensitivity(Qt::CaseInsensitive); // highlight regexp in text patternFound = ((line.contains(needleReg)) || // highlight regexp in nickname (whoSent.contains(needleReg))); // remember captured patterns for later captures = needleReg.capturedTexts(); } else { QString needle = highlight->getPattern(); // highlight patterns in text patternFound = ((line.contains(needle, Qt::CaseInsensitive)) || // highlight patterns in nickname (whoSent.contains(needle, Qt::CaseInsensitive))); } if (patternFound) { break; } } } if (patternFound) { highlightColor = highlight->getColor().name(); m_highlightColor = highlightColor; if (highlight->getNotify()) { m_tabNotification = Konversation::tnfHighlight; if (Preferences::self()->highlightSoundsEnabled() && m_chatWin->notificationsEnabled()) { konvApp->sound()->play(highlight->getSoundURL()); } konvApp->notificationHandler()->highlight(m_chatWin, whoSent, line); } m_autoTextToSend = highlight->getAutoText(); // replace %0 - %9 in regex groups for (int capture = 0; capture < captures.count(); capture++) { m_autoTextToSend.replace(QString("%%1").arg(capture), captures[capture]); } m_autoTextToSend.remove(QRegExp("%[0-9]")); } } // apply found highlight color to line if (!highlightColor.isEmpty()) { filteredLine = QLatin1String("<font color=\"") + highlightColor + QLatin1String("\">") + filteredLine + QLatin1String("</font>"); } } else if (doHighlight && (whoSent == ownNick) && Preferences::self()->highlightOwnLines()) { // highlight own lines filteredLine = QLatin1String("<font color=\"") + Preferences::self()->highlightOwnLinesColor().name() + QLatin1String("\">") + filteredLine + QLatin1String("</font>"); } filteredLine = Konversation::Emoticons::parseEmoticons(filteredLine); return filteredLine; } QString IRCView::ircTextToHtml(const QString& text, bool parseURL, const QString& defaultColor, const QString& whoSent, bool closeAllTags, QChar::Direction* direction) { TextHtmlData data; data.defaultColor = defaultColor; QString htmlText(text); bool allowColors = Preferences::self()->allowColorCodes(); QString linkColor = Preferences::self()->color(Preferences::Hyperlink).name(); unsigned int rtl_chars = 0; unsigned int ltr_chars = 0; QString fromNick; TextUrlData urlData; TextChannelData channelData; if (parseURL) { QString strippedText(removeIrcMarkup(htmlText)); urlData = extractUrlData(strippedText); if (!urlData.urlRanges.isEmpty()) { // we detected the urls on a clean richtext-char-less text // to make 100% sure we get the correct urls, but as a result // we have to map them back to the original url adjustUrlRanges(urlData.urlRanges, urlData.fixedUrls, htmlText, strippedText); //Only set fromNick if we actually have a url, //yes this is a ultra-minor-optimization if (whoSent.isEmpty()) fromNick = m_chatWin->getName(); else fromNick = whoSent; } channelData = extractChannelData(strippedText); adjustUrlRanges(channelData.channelRanges, channelData.fixedChannels , htmlText, strippedText); } else { // Change & to & to prevent html entities to do strange things to the text htmlText.replace('&', "&"); htmlText.replace("\x0b", "&"); } int linkPos = -1; int linkOffset = 0; bool doChannel = false; if (parseURL) { //get next recent channel or link pos if (!urlData.urlRanges.isEmpty() && !channelData.channelRanges.isEmpty()) { if (urlData.urlRanges.first() < channelData.channelRanges.first()) { doChannel = false; linkPos = urlData.urlRanges.first().first; } else { doChannel = true; linkPos = channelData.channelRanges.first().first; } } else if (!urlData.urlRanges.isEmpty() && channelData.channelRanges.isEmpty()) { doChannel = false; linkPos = urlData.urlRanges.first().first; } else if (urlData.urlRanges.isEmpty() && !channelData.channelRanges.isEmpty()) { doChannel = true; linkPos = channelData.channelRanges.first().first; } else { linkPos = -1; } } // Remember last char for pair of spaces situation, see default in switch (htmlText.at(pos)... QChar lastChar; int offset; for (int pos = 0; pos < htmlText.length(); ++pos) { //check for next relevant url or channel link to insert if (parseURL && pos == linkPos+linkOffset) { if (doChannel) { QString fixedChannel = channelData.fixedChannels.takeFirst(); const QPair<int, int>& range = channelData.channelRanges.takeFirst(); QString oldChannel = htmlText.mid(pos, range.second); QString strippedChannel = removeIrcMarkup(oldChannel); QString colorCodes = extractColorCodes(oldChannel); QString link("%1<a href=\"#%2\" style=\"color:" + linkColor + "\">%3</a>%4%5"); link = link.arg(closeTags(&data), fixedChannel, strippedChannel, openTags(&data, 0), colorCodes); htmlText.replace(pos, oldChannel.length(), link); pos += link.length() - colorCodes.length() - 1; linkOffset += link.length() - oldChannel.length(); } else { QString fixedUrl = urlData.fixedUrls.takeFirst(); const QPair<int, int>& range = urlData.urlRanges.takeFirst(); QString oldUrl = htmlText.mid(pos, range.second); QString strippedUrl = removeIrcMarkup(oldUrl); QString closeTagsString(closeTags(&data)); QString colorCodes = extractColorCodes(oldUrl); colorCodes = removeDuplicateCodes(colorCodes, &data, allowColors); QString link("%1<a href=\"%2\" style=\"color:" + linkColor + "\">%3</a>%4%5"); link = link.arg(closeTagsString, fixedUrl, strippedUrl, openTags(&data, 0), colorCodes); htmlText.replace(pos, oldUrl.length(), link); //url catcher QMetaObject::invokeMethod(Application::instance(), "storeUrl", Qt::QueuedConnection, Q_ARG(QString, fromNick), Q_ARG(QString, fixedUrl), Q_ARG(QDateTime, QDateTime::currentDateTime())); pos += link.length() - colorCodes.length() - 1; linkOffset += link.length() - oldUrl.length(); } bool invalidNextLink = false; do { if (!urlData.urlRanges.isEmpty() && !channelData.channelRanges.isEmpty()) { if (urlData.urlRanges.first() < channelData.channelRanges.first()) { doChannel = false; linkPos = urlData.urlRanges.first().first; } else { doChannel = true; linkPos = channelData.channelRanges.first().first; } } else if (!urlData.urlRanges.isEmpty() && channelData.channelRanges.isEmpty()) { doChannel = false; linkPos = urlData.urlRanges.first().first; } else if (urlData.urlRanges.isEmpty() && !channelData.channelRanges.isEmpty()) { doChannel = true; linkPos = channelData.channelRanges.first().first; } else { linkPos = -1; } //for cases like "#www.some.url" we get first channel //and also url, the channel->clickable-channel replace we are //already after the url, so just forget it, as a clickable //channel is correct in this case if (linkPos > -1 && linkPos+linkOffset < pos) { invalidNextLink = true; if (doChannel) { channelData.channelRanges.removeFirst(); channelData.fixedChannels.removeFirst(); } else { urlData.urlRanges.removeFirst(); urlData.fixedUrls.removeFirst(); } } else { invalidNextLink = false; } } while (invalidNextLink); continue; } switch (htmlText.at(pos).toLatin1()) { case '\x02': //bold offset = defaultHtmlReplace(htmlText, &data, pos, QLatin1String("b")); pos += offset -1; linkOffset += offset -1; break; case '\x1d': //italic offset = defaultHtmlReplace(htmlText, &data, pos, QLatin1String("i")); pos += offset -1; linkOffset += offset -1; break; case '\x15': //mirc underline case '\x1f': //kvirc underline offset = defaultHtmlReplace(htmlText, &data, pos, QLatin1String("u")); pos += offset -1; linkOffset += offset -1; break; case '\x13': //strikethru offset = defaultHtmlReplace(htmlText, &data, pos, QLatin1String("s")); pos += offset -1; linkOffset += offset -1; break; case '\x03': //color { QString fgColor, bgColor; bool fgOK = true, bgOK = true; QString colorMatch(getColors(htmlText, pos, fgColor, bgColor, &fgOK, &bgOK)); if (!allowColors) { htmlText.remove(pos, colorMatch.length()); pos -= 1; linkOffset -= colorMatch.length(); break; } QString colorString; // check for color reset conditions //TODO check if \x11 \017 is really valid here if (colorMatch == QLatin1String("\x03") || colorMatch == QLatin1String("\x11") || (fgColor.isEmpty() && bgColor.isEmpty()) || (!fgOK && !bgOK)) { //in reverse mode, just reset both colors //color tags are already closed before the reverse start if (data.reverse) { data.lastFgColor.clear(); data.lastBgColor.clear(); } else { if (data.openHtmlTags.contains(QLatin1String("font")) && data.openHtmlTags.contains(QLatin1String("span"))) { colorString += closeToTagString(&data, QLatin1String("span")); data.lastBgColor.clear(); colorString += closeToTagString(&data, QLatin1String("font")); data.lastFgColor.clear(); } else if (data.openHtmlTags.contains("font")) { colorString += closeToTagString(&data, QLatin1String("font")); data.lastFgColor.clear(); } } htmlText.replace(pos, colorMatch.length(), colorString); pos += colorString.length() - 1; linkOffset += colorString.length() -colorMatch.length(); break; } if (!fgOK) { fgColor = defaultColor; } if (!bgOK) { bgColor = fontColorOpenTag(Preferences::self()->color(Preferences::TextViewBackground).name()); } // if we are in reverse mode, just remember the new colors if (data.reverse) { if (!fgColor.isEmpty()) { data.lastFgColor = fgColor; if (!bgColor.isEmpty()) { data.lastBgColor = bgColor; } } } // do we have a new fgColor? // NOTE: there is no new bgColor is there is no fgColor else if (!fgColor.isEmpty()) { if (data.openHtmlTags.contains(QLatin1String("font")) && data.openHtmlTags.contains(QLatin1String("span"))) { colorString += closeToTagString(&data, QLatin1String("span")); colorString += closeToTagString(&data, QLatin1String("font")); } else if (data.openHtmlTags.contains(QLatin1String("font"))) { colorString += closeToTagString(&data, QLatin1String("font")); } data.lastFgColor = fgColor; if (!bgColor.isEmpty()) data.lastBgColor = bgColor; if (!data.lastFgColor.isEmpty()) { colorString += fontColorOpenTag(data.lastFgColor); data.openHtmlTags.append(QLatin1String("font")); if (!data.lastBgColor.isEmpty()) { colorString += spanColorOpenTag(data.lastBgColor); data.openHtmlTags.append(QLatin1String("span")); } } } htmlText.replace(pos, colorMatch.length(), colorString); pos += colorString.length() - 1; linkOffset += colorString.length() -colorMatch.length(); break; } break; case '\x0f': //reset to default { QString closeText; while (!data.openHtmlTags.isEmpty()) { closeText += QLatin1String("</") + data.openHtmlTags.takeLast() + QLatin1Char('>'); } data.lastBgColor.clear(); data.lastFgColor.clear(); data.reverse = false; htmlText.replace(pos, 1, closeText); pos += closeText.length() - 1; linkOffset += closeText.length() - 1; } break; case '\x16': //reverse { // treat inverse as color and block it if colors are not allowed if (!allowColors) { htmlText.remove(pos, 1); pos -= 1; linkOffset -= 1; break; } QString colorString; // close current color strings and open reverse tags if (!data.reverse) { if (data.openHtmlTags.contains(QLatin1String("span"))) { colorString += closeToTagString(&data, QLatin1String("span")); } if (data.openHtmlTags.contains(QLatin1String("font"))) { colorString += closeToTagString(&data, QLatin1String("font")); } data.reverse = true; colorString += fontColorOpenTag(Preferences::self()->color(Preferences::TextViewBackground).name()); data.openHtmlTags.append(QLatin1String("font")); colorString += spanColorOpenTag(defaultColor); data.openHtmlTags.append(QLatin1String("span")); } else { // if reset reverse, close reverse and set old fore- and // back-groundcolor if set in data colorString += closeToTagString(&data, QLatin1String("span")); colorString += closeToTagString(&data, QLatin1String("font")); data.reverse = false; if (!data.lastFgColor.isEmpty()) { colorString += fontColorOpenTag(data.lastFgColor); data.openHtmlTags.append(QLatin1String("font")); if (!data.lastBgColor.isEmpty()) { colorString += spanColorOpenTag(data.lastBgColor); data.openHtmlTags.append(QLatin1String("span")); } } } htmlText.replace(pos, 1, colorString); pos += colorString.length() -1; linkOffset += colorString.length() -1; } break; default: { const QChar& dirChar = htmlText.at(pos); // Replace pairs of spaces with "<space> " to preserve some semblance of text wrapping //filteredLine.replace(" ", " \xA0"); // This used to work like above. But just for normal text like "test test" // It got replaced as "test \xA0 \xA0test" and QTextEdit showed 4 spaces. // In case of color/italic/bold codes we don't necessary get a real pair of spaces // just "test<html> <html> <html> <html> test" and QTextEdit shows it as 1 space. // Now if we remember the last char, to ignore html tags, and check if current and last ones are spaces // we replace the current one with \xA0 (a forced space) and get // "test<html> <html>\xA0<html> <html>\xA0test", which QTextEdit correctly shows as 4 spaces. //NOTE: replacing all spaces with forced spaces will break text wrapping if (dirChar == ' ' && !lastChar.isNull() && lastChar == ' ') { htmlText[pos] = '\xA0'; lastChar = '\xA0'; } else { lastChar = dirChar; } if (!(dirChar.isNumber() || dirChar.isSymbol() || dirChar.isSpace() || dirChar.isPunct() || dirChar.isMark())) { switch(dirChar.direction()) { case QChar::DirL: case QChar::DirLRO: case QChar::DirLRE: ltr_chars++; break; case QChar::DirR: case QChar::DirAL: case QChar::DirRLO: case QChar::DirRLE: rtl_chars++; break; default: break; } } } } } if (direction) { // in case we found no right or left direction chars both // values are 0, but rtl_chars > ltr_chars is still false and QChar::DirL // is returned as default. if (rtl_chars > ltr_chars) *direction = QChar::DirR; else *direction = QChar::DirL; } if (parseURL) { // Change & to & to prevent html entities to do strange things to the text htmlText.replace('&', "&"); htmlText.replace("\x0b", "&"); } if (closeAllTags) { htmlText += closeTags(&data); } return htmlText; } int IRCView::defaultHtmlReplace(QString& htmlText, TextHtmlData* data, int pos, const QString& tag) { QString replace; if (data->openHtmlTags.contains(tag)) { replace = closeToTagString(data, tag); } else { data->openHtmlTags.append(tag); replace = QLatin1Char('<') + tag + QLatin1Char('>'); } htmlText.replace(pos, 1, replace); return replace.length(); } QString IRCView::closeToTagString(TextHtmlData* data, const QString& _tag) { QString ret; QString tag; int i = data->openHtmlTags.count() - 1; //close all tags to _tag for ( ; i >= 0 ; --i) { tag = data->openHtmlTags.at(i); ret += QLatin1String("</") + tag + QLatin1Char('>'); if (tag == _tag) { data->openHtmlTags.removeAt(i); break; } } // reopen relevant tags - ret += openTags(data, i); + if (i > -1) + ret += openTags(data, i); return ret; } QString IRCView::openTags(TextHtmlData* data, int from) { QString ret, tag; - int i = from; + int i = from > -1 ? from : 0; + for ( ; i < data->openHtmlTags.count(); ++i) { tag = data->openHtmlTags.at(i); if (tag == QLatin1String("font")) { if (data->reverse) { ret += fontColorOpenTag(Preferences::self()->color(Preferences::TextViewBackground).name()); } else { ret += fontColorOpenTag(data->lastFgColor); } } else if (tag == QLatin1String("span")) { if (data->reverse) { ret += spanColorOpenTag(data->defaultColor); } else { ret += spanColorOpenTag(data->lastBgColor); } } else { ret += QLatin1Char('<') + tag + QLatin1Char('>'); } } return ret; } QString IRCView::closeTags(TextHtmlData* data) { QString ret; QListIterator< QString > i(data->openHtmlTags); i.toBack(); while (i.hasPrevious()) { ret += QLatin1String("</") + i.previous() + QLatin1Char('>'); } return ret; } QString IRCView::fontColorOpenTag(const QString& fgColor) { return QLatin1String("<font color=\"") + fgColor + QLatin1String("\">"); } QString IRCView::spanColorOpenTag(const QString& bgColor) { return QLatin1String("<span style=\"background-color:") + bgColor + QLatin1String("\">"); } QString IRCView::removeDuplicateCodes(const QString& codes, TextHtmlData* data, bool allowColors) { int pos = 0; QString ret; while (pos < codes.length()) { switch (codes.at(pos).toLatin1()) { case '\x02': //bold defaultRemoveDuplicateHandling(data, QLatin1String("b")); ++pos; break; case '\x1d': //italic defaultRemoveDuplicateHandling(data, QLatin1String("i")); ++pos; break; case '\x15': //mirc underline case '\x1f': //kvirc underline defaultRemoveDuplicateHandling(data, QLatin1String("u")); ++pos; break; case '\x13': //strikethru defaultRemoveDuplicateHandling(data, QLatin1String("s")); ++pos; break; case '\x0f': //reset to default data->openHtmlTags.clear(); data->lastBgColor.clear(); data->lastFgColor.clear(); data->reverse = false; ++pos; break; case '\x16': //reverse if (!allowColors) { pos += 1; continue; } if (data->reverse) { data->openHtmlTags.removeOne(QLatin1String("span")); data->openHtmlTags.removeOne(QLatin1String("font")); data->reverse = false; if (!data->lastFgColor.isEmpty()) { data->openHtmlTags.append(QLatin1String("font")); if (!data->lastBgColor.isEmpty()) { data->openHtmlTags.append(QLatin1String("span")); } } } else { data->openHtmlTags.removeOne(QLatin1String("span")); data->openHtmlTags.removeOne(QLatin1String("font")); data->reverse = true; data->openHtmlTags.append(QLatin1String("font")); data->openHtmlTags.append(QLatin1String("span")); } ++pos; break; case '\x03': //color { QString fgColor, bgColor; bool fgOK = true, bgOK = true; QString colorMatch(getColors(codes, pos, fgColor, bgColor, &fgOK, &bgOK)); if (!allowColors) { pos += colorMatch.length(); continue; } // check for color reset conditions //TODO check if \x11 \017 is really valid here if (colorMatch == QLatin1String("\x03") || colorMatch == QLatin1String("\x11") || (fgColor.isEmpty() && bgColor.isEmpty()) || (!fgOK && !bgOK)) { if (!data->lastBgColor.isEmpty()) { data->lastBgColor.clear(); data->openHtmlTags.removeOne(QLatin1String("span")); } if (!data->lastFgColor.isEmpty()) { data->lastFgColor.clear(); data->openHtmlTags.removeOne(QLatin1String("font")); } pos += colorMatch.length(); break; } if (!fgOK) { fgColor = data->defaultColor; } if (!bgOK) { bgColor = fontColorOpenTag(Preferences::self()->color(Preferences::TextViewBackground).name()); } if (!fgColor.isEmpty()) { data->lastFgColor = fgColor; data->openHtmlTags.append(QLatin1String("font")); if (!bgColor.isEmpty()) { data->lastBgColor = bgColor; data->openHtmlTags.append(QLatin1String("span")); } } pos += colorMatch.length(); } break; default: // qDebug() << "unsupported duplicate code:" << QString::number(codes.at(pos).toLatin1(), 16); ret += codes.at(pos); ++pos; } } return ret; } void IRCView::defaultRemoveDuplicateHandling(TextHtmlData* data, const QString& tag) { if (data->openHtmlTags.contains(tag)) { data->openHtmlTags.removeOne(tag); } else { data->openHtmlTags.append(tag); } } void IRCView::adjustUrlRanges(QList< QPair<int, int> >& urlRanges, const QStringList& fixedUrls, QString& richtext, const QString& strippedText) { Q_UNUSED(fixedUrls); QRegExp ircRichtextRegExp(colorRegExp); int start = 0, j; int i = 0; QString url; int htmlTextLength = richtext.length(), urlCount = urlRanges.count(); for (int x = 0; x < urlCount; ++x) { if (x == 0) i = urlRanges.first().first; j = 0; const QPair<int, int>& range = urlRanges.at(x); url = strippedText.mid(range.first, range.second); for ( ; i < htmlTextLength; ++i) { if (richtext.at(i) == url.at(j)) { if (j == 0) start = i; ++j; if (j == url.length()) { urlRanges[x].first = start; urlRanges[x].second = i - start + 1; break; } } else if (ircRichtextRegExp.exactMatch(richtext.at(i))) { ircRichtextRegExp.indexIn(richtext, i); i += ircRichtextRegExp.matchedLength() - 1; } else { j = 0; } } } } QString IRCView::getColors(const QString& text, int start, QString& _fgColor, QString& _bgColor, bool* fgValueOK, bool* bgValueOK) { QRegExp ircColorRegExp("(\003([0-9][0-9]|[0-9]|)(,([0-9][0-9]|[0-9]|)|,|)|\017)"); if (ircColorRegExp.indexIn(text,start) == -1) return QString(); QString ret(ircColorRegExp.cap(0)); QString fgColor(ircColorRegExp.cap(2)), bgColor(ircColorRegExp.cap(4)); if (!fgColor.isEmpty()) { int foregroundColor = fgColor.toInt(); if (foregroundColor > -1 && foregroundColor < 16) { _fgColor = Preferences::self()->ircColorCode(foregroundColor).name(); if (fgValueOK) *fgValueOK = true; } else { if (fgValueOK) *fgValueOK = false; } } else { if (fgValueOK) *fgValueOK = true; } if (!bgColor.isEmpty()) { int backgroundColor = bgColor.toInt(); if (backgroundColor > -1 && backgroundColor < 16) { _bgColor = Preferences::self()->ircColorCode(backgroundColor).name(); if (bgValueOK) *bgValueOK = true; } else { if (bgValueOK) *bgValueOK = false; } } else { if (bgValueOK) *bgValueOK = true; } return ret; } void IRCView::resizeEvent(QResizeEvent *event) { ScrollBarPin b(verticalScrollBar()); QTextBrowser::resizeEvent(event); } void IRCView::mouseMoveEvent(QMouseEvent* ev) { if (m_mousePressedOnUrl && (m_mousePressPosition - ev->pos()).manhattanLength() > QApplication::startDragDistance()) { m_mousePressedOnUrl = false; QTextCursor textCursor = this->textCursor(); textCursor.clearSelection(); setTextCursor(textCursor); QPointer<QDrag> drag = new QDrag(this); QMimeData* mimeData = new QMimeData; QUrl url(m_dragUrl); mimeData->setUrls(QList<QUrl>() << url); drag->setMimeData(mimeData); QPixmap pixmap = KIO::pixmapForUrl(url, 0, KIconLoader::Desktop, KIconLoader::SizeMedium); drag->setPixmap(pixmap); drag->exec(); return; } else { // Store the url here instead of in highlightedSlot as the link given there is decoded. m_urlToCopy = anchorAt(ev->pos()); } QTextBrowser::mouseMoveEvent(ev); } void IRCView::mousePressEvent(QMouseEvent* ev) { if (ev->button() == Qt::LeftButton) { m_dragUrl = anchorAt(ev->pos()); if (!m_dragUrl.isEmpty() && Konversation::isUrl(m_dragUrl)) { m_mousePressedOnUrl = true; m_mousePressPosition = ev->pos(); } } QTextBrowser::mousePressEvent(ev); } void IRCView::wheelEvent(QWheelEvent *ev) { if(ev->modifiers()==Qt::ControlModifier) { if(ev->delta() < 0) decreaseFontSize(); if(ev->delta() > 0) increaseFontSize(); } QTextBrowser::wheelEvent(ev); } void IRCView::mouseReleaseEvent(QMouseEvent *ev) { if (ev->button() == Qt::LeftButton) { m_mousePressedOnUrl = false; } else if (ev->button() == Qt::MidButton) { if (m_contextMenuOptions.testFlag(IrcContextMenus::ShowLinkActions)) { // The QUrl magic is what QTextBrowser's anchorClicked() does internally; // we copy it here for consistent behavior between left and middle clicks. openLink(QUrl::fromEncoded(m_urlToCopy.toUtf8())); // krazy:exclude=qclasses return; } else { emit textPasted(true); return; } } QTextBrowser::mouseReleaseEvent(ev); } void IRCView::keyPressEvent(QKeyEvent* ev) { const int key = ev->key() | ev->modifiers(); if (KStandardShortcut::paste().contains(key)) { emit textPasted(false); ev->accept(); return; } QTextBrowser::keyPressEvent(ev); } void IRCView::anchorClicked(const QUrl& url) { openLink(url); } void IRCView::openLink(const QUrl& url) { QString link(url.toString()); // HACK Replace " " with %20 for channelnames, NOTE there can't be 2 channelnames in one link link = link.replace (' ', "%20"); // HACK Handle pipe as toString doesn't seem to decode that correctly link = link.replace ("%7C", "|"); // HACK Handle ` as toString doesn't seem to decode that correctly link = link.replace ("%60", "`"); if (!link.isEmpty() && !link.startsWith('#')) Application::openUrl(url.toEncoded()); //FIXME: Don't do channel links in DCC Chats to begin with since they don't have a server. else if (link.startsWith(QLatin1String("##")) && m_server && m_server->isConnected()) { m_server->sendJoinCommand(link.mid(1)); } //FIXME: Don't do user links in DCC Chats to begin with since they don't have a server. else if (link.startsWith('#') && m_server && m_server->isConnected()) { QString recipient(link); recipient.remove('#'); NickInfoPtr nickInfo = m_server->obtainNickInfo(recipient); m_server->addQuery(nickInfo, true /*we initiated*/); } } void IRCView::highlightedSlot(const QString& /*_link*/) { QString link = m_urlToCopy; // HACK Replace " " with %20 for channelnames, NOTE there can't be 2 channelnames in one link link = link.replace (' ', "%20"); //we just saw this a second ago. no need to reemit. if (link == m_lastStatusText && !link.isEmpty()) return; if (link.isEmpty()) { if (!m_lastStatusText.isEmpty()) { emit clearStatusBarTempText(); m_lastStatusText.clear(); } } else { m_lastStatusText = link; } if (!link.startsWith(QLatin1Char('#'))) { m_isOnNick = false; m_isOnChannel = false; if (!link.isEmpty()) { //link therefore != m_lastStatusText so emit with this new text emit setStatusBarTempText(link); } if (link.isEmpty() && m_contextMenuOptions.testFlag(IrcContextMenus::ShowLinkActions)) setContextMenuOptions(IrcContextMenus::ShowLinkActions, false); else if (!link.isEmpty() && !m_contextMenuOptions.testFlag(IrcContextMenus::ShowLinkActions)) setContextMenuOptions(IrcContextMenus::ShowLinkActions, true); } else if (link.startsWith(QLatin1Char('#')) && !link.startsWith(QLatin1String("##"))) { m_currentNick = link.mid(1); m_isOnNick = true; emit setStatusBarTempText(i18n("Open a query with %1", m_currentNick)); } else { // link.startsWith("##") m_currentChannel = link.mid(1); m_isOnChannel = true; emit setStatusBarTempText(i18n("Join the channel %1", m_currentChannel)); } } void IRCView::setContextMenuOptions(IrcContextMenus::MenuOptions options, bool on) { if (on) m_contextMenuOptions |= options; else m_contextMenuOptions &= ~options; } void IRCView::contextMenuEvent(QContextMenuEvent* ev) { // Consider the following scenario: (1) context menu opened, (2) mouse // pointer moved, (3) mouse button clicked to dismiss menu, (4) mouse // button clicked to reopen context menu. In this scenario, if there is // no mouse movement between steps (3) and (4), highlighted() is never // emitted, and the data we use here to display the correct context menu // is outdated. Thus what we're going to do here is post a fake mouse // move event using the context menu event coordinate, forcing an update // just before we display the context menu. QMouseEvent fake(QEvent::MouseMove, ev->pos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier); mouseMoveEvent(&fake); if (m_isOnChannel && m_server) { IrcContextMenus::channelMenu(ev->globalPos(), m_server, m_currentChannel); m_isOnChannel = false; return; } if (m_isOnNick && m_server) { IrcContextMenus::nickMenu(ev->globalPos(), m_contextMenuOptions, m_server, QStringList() << m_currentNick, m_chatWin->getName()); m_currentNick.clear(); m_isOnNick = false; return; } int contextMenuActionId = IrcContextMenus::textMenu(ev->globalPos(), m_contextMenuOptions, m_server, textCursor().selectedText(), m_urlToCopy, m_contextMenuOptions.testFlag(IrcContextMenus::ShowNickActions) ? m_chatWin->getName() : QString()); switch (contextMenuActionId) { case -1: break; case IrcContextMenus::TextCopy: copy(); break; case IrcContextMenus::TextSelectAll: selectAll(); break; default: if (m_contextMenuOptions.testFlag(IrcContextMenus::ShowNickActions)) { IrcContextMenus::processNickAction(contextMenuActionId, m_server, QStringList() << m_chatWin->getName(), m_contextMenuOptions.testFlag(IrcContextMenus::ShowChannelActions) ? m_chatWin->getName() : QString()); } break; } } // For more information about these RTFM // http://www.unicode.org/reports/tr9/ // http://www.w3.org/TR/unicode-xml/ QChar IRCView::LRM = (ushort)0x200e; // Right-to-Left Mark QChar IRCView::RLM = (ushort)0x200f; // Left-to-Right Mark QChar IRCView::LRE = (ushort)0x202a; // Left-to-Right Embedding QChar IRCView::RLE = (ushort)0x202b; // Right-to-Left Embedding QChar IRCView::RLO = (ushort)0x202e; // Right-to-Left Override QChar IRCView::LRO = (ushort)0x202d; // Left-to-Right Override QChar IRCView::PDF = (ushort)0x202c; // Previously Defined Format QChar::Direction IRCView::basicDirection(const QString& string) { // The following code decides between LTR or RTL direction for // a line based on the amount of each type of characters pre- // sent. It does so by counting, but stops when one of the two // counters becomes higher than half of the string length to // avoid unnecessary work. unsigned int pos = 0; unsigned int rtl_chars = 0; unsigned int ltr_chars = 0; unsigned int str_len = string.length(); unsigned int str_half_len = str_len/2; for(pos=0; pos < str_len; ++pos) { if (!(string[pos].isNumber() || string[pos].isSymbol() || string[pos].isSpace() || string[pos].isPunct() || string[pos].isMark())) { switch(string[pos].direction()) { case QChar::DirL: case QChar::DirLRO: case QChar::DirLRE: ltr_chars++; break; case QChar::DirR: case QChar::DirAL: case QChar::DirRLO: case QChar::DirRLE: rtl_chars++; break; default: break; } } if (ltr_chars > str_half_len) return QChar::DirL; else if (rtl_chars > str_half_len) return QChar::DirR; } if (rtl_chars > ltr_chars) return QChar::DirR; else return QChar::DirL; } #define dS d.space() #define dN d.nospace() QDebug operator<<(QDebug d, QTextBlockUserData *bd) { Burr* b = dynamic_cast<Burr*>(bd); if (b) { dN; d << "("; d << (void*)(b) << ", format=" << b->m_format << ", blockNumber=" << b->m_block.blockNumber() << " p,n=" << (void*)b->m_prev << ", " << (void*)b->m_next; d << ")"; } else if (bd) dN << "(UNKNOWN! " << (void*)bd << ")"; else d << "(none)"; return d.space(); } QDebug operator<<(QDebug d, QTextFrame* feed) { if (feed) { d << "\nDumping frame..."; dN << hex << (void*)feed << dec; QTextFrame::iterator it = feed->begin(); if (it.currentFrame() == feed) dS << "loop!" << endl; dS << "position" << feed->firstPosition() << feed->lastPosition(); dN << "parentFrame=" << (void*)feed->parentFrame(); dS; while (!it.atEnd()) { //d << "spin"; QTextFrame *frame = it.currentFrame(); if (!frame) // this is a block { //d<<"dumping blocks:"; QTextBlock b = it.currentBlock(); //d << "block" << b.position() << b.length(); d << endl << b; } else if (frame != feed) { d << frame; } ++it; }; d << "\n...done.\n"; } else d << "No frame to dump."; return d; } QDebug operator<<(QDebug d, QTextDocument* document) { d << "====================================================================================================================================================================="; if (document) d << document->rootFrame(); return d; } QDebug operator<<(QDebug d, QTextBlock b) { QTextBlock::Iterator it = b.begin(); int fragCount = 0; d << "blockNumber" << b.blockNumber(); d << "position" << b.position(); d << "length" << b.length(); dN << "firstChar 0x" << hex << b.document()->characterAt(b.position()).unicode() << dec; if (b.length() == 2) dN << " second 0x" << hex << b.document()->characterAt(b.position()+1).unicode() << dec; dS << "userState" << b.userState(); dN << "userData " << (void*)b.userData(); //dS << "text" << b.text(); dS << endl; if (b.userData()) d << b.userData(); for (it = b.begin(); !(it.atEnd()); ++it) { QTextFragment f = it.fragment(); if (f.isValid()) { fragCount++; //d << "frag" << fragCount << _S(f.position()) << _S(f.length()); } } d << _S(fragCount); return d; }