If you want to use LibreOffice functionality in your applications, LibreOfficeKit API is one of the good ways to do that. Here I describe how, with some examples. If you want to add the capability of loading, displaying, editing, saving and/or converting LibreOffice/MS Office files to your application, you have come to a good place.
What is LibreOfficeKit?
LibreOfficeKit is the (relatively) new API to access LibreOffice functionalities in C/C++ without the need of older UNO API and its dependencies. It is used in LibreOffice Online, and also LibreOffice Viewer for Android.
LibreOffice functionality can also be used through older UNO API, which is several years old and provides many functionalities of LibreOffice through network or sockets. But UNO API is not helpful if you want to have the LibreOffice UI in your application. In comparison, LibreOfficeKit is capable of doing that.
LibreOfficeKit can create tiles from the LibreOffice application, which can be compiled as a static library, and then lets the user interact with the application from somewhere else, either different application, or a web browser.
In this way, it becomes much easier to create applications that incorporate the actual functionalities of LibreOffice in them, while having the LibreOffice UI in themselves.
Example: GTK Tiled Viewer
As an example, gtktiledviewer provides a small editor that can load the LibreOffice/MS Office files, display them and the user can actually edit those files.
LibreOffice GTK Tiled Viewer
If you have a working build of LibreOffice, you can run thegtktiledviewer application this way:
Another interesting example is document conversion. For example, if you want to convert an ODT file to PDF or other formats with LibreOffice, you can use LibreOfficeKit API to do that.
One example code that does that is the lloconv project. You may find it on gitlab:
The conversion code happens inside convert.cc source file, and it is pretty straightforward, although there are some extra code which handles finding LibreOffice binary path, and parsing command line arguments.
The important functions that are used in loading and converting documents can be found in these lines:
lodoc->saveAs(output_url.c_str(), format, options)
It essentially initializes the document vialok_cpp_init, then loads the document using documentLoad function, and at last convert it to the final file format using saveAs() function.
The API for conversion is pretty straightforward, and it is enough to to know the path to the LibreOffice installation path to be able to compile and run the C++ example.
More interesting things are possible with LibreOfficeKit API, and I will write more about them.
In 2023, 11,272 commits were made to the LibreOffice source code, from 253 authors, in 21 repositories. We also took part in the Google Summer of Code, to support student developers
(This is part of The Document Foundation’s Annual Report for 2023 – we’ll post the full version here soon.)
Infrastructure for developers
TDF provides infrastructure for the developer community to continue their work on LibreOffice. These include Git and Gerrit, to make changes to the source code, along with Bugzilla (to track bug reports and enhancement requests), a wiki (to document changes), and Weblate (for translations).
Most technical discussions took place on the developer mailing list and IRC channel, with the latter providing more real-time communication. Members of the Engineering Steering Committee met weekly, to discuss the most pressing issues with the codebase.
Google Summer of Code (GSoC)
Google Summer of Code (GSoC) is an annual programme in which student developers of free and open source software projects receive stipends from Google for their work. LibreOffice takes part in GSoC every year, and in 2023, five students developed features and updates in the software. They were mentored by developers from the LibreOffice ecosystem and TDF. Let’s go through them…
Improving OpenPGP encryption experience in LibreOffice by Ahmed Gamal Eltokhy: LibreOffice can encrypt documents using OpenPGP public key cryptography by making use of external applications such as gpg4win, GPGTools and gnupg. Thanks to Ahmed’s work, it is now easier to manage and search keys and faster to navigate large keyrings.
Selecting tests to run on Gerrit patches based on machine learning by Baole Fang: This project was inspired by Mozilla’s work on Firefox’s continuous integration. There is now a system in place that makes predictions on the test failure possibility of submitted code changes and decides the most efficient way to build the changes. As this kind of machinery is very new to everyone, we expect many tweaks to follow.
Search Field in Options by Bayram Çiçek: Searching through options is standard in applications these days, so it is about time LibreOffice learned how to do it. This makes it much easier for end users to find specific options and settings, by simply typing a few letters, rather than having to navigate though a large set of menus and widgets.
Convert Writer’s Java UNO API Tests to C++ by Dipam Turkar: The idea here was to reduce the dependency on Java during the LibreOffice build process. Half of the tests for Writer were converted.
Add APNG import/export support by Paris Oplopoios: APNG is short for Animated Portable Network Graphics. It is not an official extension to PNG, but nevertheless has broad support in web browsers these days. Thanks to Paris’s work, LibreOffice now fully supports this format.
For the full details about the students’ work, see this post. And thanks to Andreas Heinisch, Thorsten Behrens (allotropia), Heiko Tietze (TDF), Hossein Nourikhah (TDF), Tomaž Vajngerl (Collabora), Xisco Faulí (TDF), Stéphane Guillou (TDF) and Christian Lohmaier (TDF) for mentoring the students.
We use our social media channels to raise awareness about our work, share information and encourage new contributors to join us
(This is part of The Document Foundation’s Annual Report for 2023 – we’ll post the full version here soon.)
Social media
In January 2023, our X (formerly known as Twitter) account @LibreOffice had 53,541 followers; by the end of the year, we had grown this to 62,443. Our most popular tweets were for major releases, but we also tweeted customised images for “Community Member Monday” interviews with short quotes, encouraging more users to get involved with LibreOffice projects.
In addition, we focused not only on our own tweets, but also retweeting announcements from the LibreOffice ecosystem and community members. We liked and retweeted messages of support from end users – many of whom were surprised and thankful that a large project would show them support. To keep the content flowing, we retweeted popular older tweets, and responded to individual messages.
On other social media platforms, we focused on growing our account on Mastodon, a Twitter-like open source, federated and self-hosted microblogging service. In 2023 we worked more on expanding our activities on our account @libreoffice@fosstodon.org, and from January to December, we grew our follower base from 17,632 to 24,987. We also joined Bluesky in 2023 thanks to invites from a community member, with our new account @libreoffice.bsky.social reaching over 150 followers by the end of the year.
Our Facebook page growth was smaller, from 60,278 page followers to 63,189. We’ve noticed a gradual reduction in activity on Facebook over the last few years, which reflects its changing audience, and the move towards newer mobile applications. Nonetheless, Facebook still provides a good opportunity to interact with end users of LibreOffice, and every day we checked in to answer questions, get feedback, and post announcements/tips about the software.
YouTube channel
Our YouTube channel grew from 18,108 subscribers and 2,886,284 video views in January 2023 to 20,504 subscribers and 3,217,282 video views by the end of the year. The “LibreOffice 7.5: New Features” video (a fantastic production by the Indonesian community) had almost 60,000 views – while the video for LibreOffice 7.6 had over 60,000. We also added videos of talks, presentations and workshops from the LibreOffice Conference 2023.
Please confirm that you want to play a YouTube video. By accepting, you will be accessing content from YouTube, a service provided by an external third party.
If you accept this notice, your choice will be saved and the page will refresh.
Meanwhile, our community helped out with tutorial videos – in particular Harald Berger of the German community, who continued to produce a series of professional-looking step-by-step guides to installing and using LibreOffice.
Worked on slides for our first public Tea Time Training;
hopefully we can get more people discussing LibreOfficeKit
& COOL development weekly & interactively.
Lunch; J. drove us to Durham to meet up with H,
finally a lovely sunny day.
Worked in the car - annoyingly mobile internet
is now good enough that you can do back-to-back
admin in the car; COOL co-editing, Docusigning etc.
squeezing out precious hacking time.
Earlier this month, we were pleased to sponsor the Libreoffice Technology Hackfest in Budapest, Hungary, and enjoyed meeting up with some of our fellow LibreOffice Technology hackers. Over two days, a dozen developers from Collabora Productivity and the wider community met up in the Eco Community Space to work on the LibreOffice codebase, and reap the benefits of spending time together.
A hackfest is an event where developers from multiple organisations meet each other, work on what they want and also more freely exchange ideas while being together in person. While having an international community working remotely on the codebase is excellent, there are still many benefits to more directly seeing what problems are being tackled by other developer sitting next to you; and this friendly environment allows building relationships that can then help even more in the future (even remotely).
As one attendee Miklos Vajna shared with us after the event, “It was really great to spend a couple of days with the other developers. I found it very helpful seeing what other people are working on, sharing ideas about the future feature possibilities, and especially enjoyed going out for a dinner with everyone in Budapest after a hard day’s work!”
For this reason, we were very pleased to sponsor this most recent meet up. Many thanks to all who joined us in Budapest, we look forward to seeing you soon at the next meeting!
If you would like to find out more about joining the Collabora Online or LibreOffice community, we would encourage you to join the Collabora Online Community Forum or have a look at the Collabora Online Github to learn about how to get started.
For more information about our upcoming events, and to learn where you could meet us next, do have a look at our events page.
Planning call, gave a Nextcloud Office webinar,
slides, monthly management call, partner meetings.
Birthday; got some pruning scissors and a mini
chainsaw for J's gardening; some new shirts and a nice
new guitar - upgrading my 25 year old £5 version; spoiled
with steak & Baked Alsaka; fun.
In 2023, the marketing team continued the deployment of the Strategic Marketing Plan, without overlooking ongoing activities to promote LibreOffice and support the efforts of native language communities
(This is part of The Document Foundation’s Annual Report for 2023 – we’ll post the full version here soon.)
Slide Decks and Videos for Marketing Purposes
We updated presentations on The Document Foundation (project history and digital sovereignty), LibreOffice (technology, including commentary, and sustainability) and Open Document Format (standard format, ODF and interoperability, and OOXML issues) for use by community members. Videos are also available to help tailor a presentation to the audience.
We updated the LibreOffice Technology White Paper, which explains the evolution of LibreOffice from a single desktop product to a product-based technology for personal or enterprise productivity that is the foundation for a series of products optimised for different platforms, such as desktop, mobile and cloud. To emphasise the importance of the LibreOffice technology concept, a specific logo has been created to make it visually easier to associate all products based on this technology platform.
We also created a Security Backgrounder that describes – in a language accessible to everyone, even non-security specialists – the impressive work done by the developers and quality control specialists in the security area of LibreOffice.
Finally, the project continues to invest in communicating the sustainability of FOSS. Companies need to consider that focusing on the ‘free as beer’ nature of software can seriously damage the projects they rely on as strategic assets of their infrastructure. It is a short-sighted decision because they can save a lot by not paying a single penny, but they may also have to spend a lot tomorrow if the original project is unable to sustain itself by having to revert to a proprietary solution.
The Importance of Donations
Donations are essential for the current operations and future development of The Document Foundation, as they allow us to keep the organisation alive, fund specific activities, support events and other marketing tasks organised by the native language projects, and maintain a small team working on various aspects of LibreOffice.
In 2023, donations were used to fund various activities: the organisation of the LibreOffice conference in Bucharest and the regional LibreOffice conferences in Asia and Latin America, events and other activities of the native language communities, reimbursement of travel expenses to conferences around the world, the supply of merchandise for the Month of LibreOffice, and other small projects.
Ongoing Marketing Activities
Marketing for The Document Foundation and LibreOffice is a large team effort, with contractors paid for their work – thanks to the funds provided by our generous donors – and several volunteers who run activities on both a global and local level to increase visibility and brand awareness.
One of the ongoing projects is the Community Member Monday series, where one or more community members are interviewed about their contribution to the project.
The marketing team, supported by many volunteers, created a series of New Features videos for the announcement of LibreOffice 7.6 and LibreOffice 24.2, covering the suite as a whole – and Writer, Calc and Impress in detail. These videos are a great way to demonstrate new features to end users and are often embedded in news sites. They were also translated into several languages by volunteers from the localisation community.
Activities Month-by-Month
JANUARY
In January we had two update releases for LibreOffice: 7.4.4 and 7.4.5. The Documentation team announced the availability of the LibreOffice Draw Guide 7.4, an update to the 7.3 guide, and the Czech community announced their translation of the Calc Guide 7.4.
Later in the month, The Document Foundation commented on the EU’s proposed Cyber Resilience Act, as the text in its original form could have devastating (though probably unintended) consequences for several European-based open source projects, such as most of the products based on LibreOffice Technology.
We also welcomed Juan José González, a new member of the team, in the role of Web Technology Engineer, in charge of the TDF and LibreOffice web properties: the websites, the blogs, the wiki, Weblate and much more.
FEBRUARY
The main focus was the announcement of LibreOffice 7.5, with a host of new and improved features, and participation in FOSDEM 2023 with a booth and a half-day devroom.
The documentation team proudly announced the availability of the Writer and Calc guides for LibreOffice 7.5, reducing the gap between the release of the software and the guide to just a few days.
LibreOffice had a booth at the Uninvention Summit 2023 in Bremen, Germany.
We started the month by announcing the LibreOffice 2023 conference in Bucharest, the capital of Romania, from Wednesday 20 September (community meetings) to Saturday 23 September.
During the month we had three updates of LibreOffice: 7.5.1 on 2 March, 7.4.6 on 9 March and 7.5.2 on 30 March. The European Data Protection Supervisor (EDPS) also announced the internal use of products based on LibreOffice technology, which shows how much we care about data protection and privacy.
Members of the German-speaking LibreOffice community met at the Chemnitzer Linux-Tage, where they had a booth with merchandise, and then at the LinuxHotel in Essen. The Czech localisation team released the LibreOffice 7.3 Base Guide in Czech.
APRIL
We reported on our policy-related activities in the European Union, where the TDF has supported several campaigns in support of FOSS in the EU and helped raise awareness of the problems with the Cyber Resilience Act.
Speaking of FOSS, we looked at how it continues to grow, according to data provided by analyst reports and user statements. In 2022 over 76% of IT managers have increased their use of FOSS, while almost 22% have stayed the same and less than 2% have reduced it.
Throughout the month, we began posting sections of The Document Foundation’s 2022 Annual Report. The Brazilian community presented the LibreOffice project at FLISOL (Festival Latino Americano de Instalação de Software Livre) in Brasilia.
MAY
May is the Month of LibreOffice. This is a campaign we run twice a year to encourage users to join our community and help improve the software. People who contribute get some goodies in return. The LibreOffice YouTube channel passed the 3 million views mark.
We announced LibreOffice 7.5.3 and LibreOffice 7.4.7, the final release of the 7.4 family, and the various sponsorship packages for the LibreOffice 2024 conference in Bucharest. The LibreOffice Google Summer of Code projects for 2023 were also selected.
In May, the esLibre conference was held in Zaragoza, Spain, and members of the Spanish-speaking community took the opportunity to meet in person and talk about the project. The Italian community attended the Merge IT event in Verona.
JUNE
We announced the LibreOffice Conf Asia x UbuCon Asia 2023 in Indonesia, an event that will bring together Linux and FOSS activists, contributors, users, communities and companies in the Asian region. It will be held in Surakarta in October 2023.
We also announced a Getting Started with Development workshop at the LibreOffice Conference 2023, aimed at students from the Polytechnic University of Bucharest.
We released LibreOffice 7.5.4 Community, the fourth minor update of the 7.5 family, and published some ideas from community members about the integration of LibreOffice and the Thunderbird email client.
JULY
We welcomed Michael Weghorn to the Document Foundation, the non-profit organisation behind LibreOffice. Michael is a developer focusing on accessibility improvements. The TDF team met in Munich to discuss the project, community development and software development.
The Extensions and Templates website received a number of improvements thanks to the recently hired web developer: Juan José González (aka “JJ”).
The Membership Committee (MC), responsible for managing membership applications and renewals, announced a new membership management system called Proteus.
The Documentation and Localisation Communities updated the LibreOffice 7.5 Getting Started Guide and finished a Czech translation of the LibreOffice 7.4 Draw Guide.
We also released LibreOffice 7.5.5, the fifth maintenance release of LibreOffice 7.5.
AUGUST
The biggest news in August was the release of LibreOffice 7.6, with a host of new features and updates.
Please confirm that you want to play a YouTube video. By accepting, you will be accessing content from YouTube, a service provided by an external third party.
If you accept this notice, your choice will be saved and the page will refresh.
We announced the full version of TDF’s Annual Report 2022, and the LibreOffice documentation team released Impress Guide 7.5 and Draw Guide 7.5. We use Weblate to translate the LibreOffice user interface, and thanks to donations we were able to fund some improvements to Weblate to help all localisation volunteers.
We also announced the fourth edition of the LibreOffice Latin America Conference, to be held at the UNAM Engineering Faculty in Mexico City in November.
SEPTEMBER
The biggest event in September was the LibreOffice 2023 conference in Bucharest, Romania. We had a great time with talks, workshops and social gatherings. Google Summer of Code (GSoC) students also presented some of the results of their work. Five projects were successfully completed.
We released LibreOffice 7.6.2 and 7.5.7, two major updates with security fixes. The documentation community released the LibreOffice Writer Guide 7.6, just one month after the announcement.
The month was full of LibreOffice and FOSS events. We started with the LibreOffice Nepali Localisation Sprint 2023, followed by LibreOffice at the Software Freedom Law Centre in Delhi, India, and LibreOffice at LinuxDays 2023 in Prague.
The LibreOffice Conference Asia 2023 was a great success, with speakers and attendees from all over the world.
Finally, the QA community blogged about SVG support improvements and interoperability work with the Inkscape community.
NOVEMBER
November is also the month of LibreOffice. The project released LibreOffice 7.5.8, a maintenance release for the 7.5 branch with compatibility improvements and bug fixes, and LibreOffice 7.6.3, while the documentation community released the Impress and Draw guides for LibreOffice 7.6.
The LibreOffice Viewer app for Android was made available again in the Google Play Store, with experimental editing support.
We supported our friends at the Free Software Foundation Europe by signing the Open Letter “The right to install any software on any device” to the German Bundestag in support of sustainability and freedom in electronic products in the EU.
The LibreOffice Latin American Conference 2023, held in Mexico City, was a huge success with hundreds of attendees, including many students.
DECEMBER
We announced LibreOffice 7.6.4 and LibreOffice 7.5.9, and the documentation community announced the LibreOffice Calc Guide 7.6, which reflects the changes and updates in the latest version of the suite.
Meanwhile, we prepared a Security Backgrounder document that describes – in language accessible to everyone, including non-security specialists – the impressive work done by developers and QA specialists in the area of LibreOffice security.
The Documentation Team is proud to announce the immediate availability of the Impress Guide 24.2.
The Impress Guide 24.2 update was coordinated by Peter Schofield, with assistance of Olivier Hallot and B. Antonio Fernandez, and is based on the Impress Guide 7.6.
Peter Schofield
LibreOffice 24.2 Community also includes many other changes, including improvements in accessibility, change tracking, spell checking, and interoperability with Microsoft’s proprietary file formats. Notably, Impress now allows small caps in text and secured slide show remote control with bluetooth, as well as enhancements to supplied templates.
The guide is available for immediate download in PDF format, and in HTML format for online reading, as well as in source format (OpenDocument Format). Soon it will be available as printed book by LuLu inc.
LibreOffice 24.8 will be released as final at the end of August, 2024 ( Check the Release Plan ) being LibreOffice 24.8 Beta1 the second pre-release since the development of version 24.8 started at the beginning of December, 2023. Since the previous release, LibreOffice 24.8 Alpha1, 672 commits have been submitted to the code repository and 191 issues got fixed. Check the release notes to find the new features included in this version of LibreOffice.
IMPORTANT INFORMATION FOR WINDOWS 7 USERS
Internal python version has been upgraded to python 3.9 which no longer supports Windows 7. It’s very important to us to know whether LibreOffice 24.8 still works on Windows 7 or not, as well as its python functionalities. Please, do test this version and give us feedback.
LibreOffice 24.8 Beta1 can be downloaded for Linux, macOS and Windows, and it can be installed alongside the standard version.
In case you find any problem in this pre-release, please report it in Bugzilla ( You just need a legit email account in order to create a new account ).
For help, you can contact the QA Team directly in the QA IRC channel or via Matrix.
LibreOffice is a volunteer-driven community project, so please help us to test – we appreciate it!
The LibreOffice Conference is the annual gathering of the community, our end-users, developers, and everyone interested in free office software. In 2023, it took place in Bucharest, Romania
(This is part of The Document Foundation’s Annual Report for 2023 – we’ll post the full version here soon.)
This was our second in-person conference after the COVID pandemic, following on from the Milan conference in 2022, but we also lived-streamed sessions and made recordings so that participants could watch remotely (and ask questions in our chat channels too).
The conference took place from September 20 – 23, at the Universitatea Națională de Știință și Tehnologie Politehnica București – Facultatea de Automatică și Calculatoare – PRECIS. The organisers produced a very handy “Essential guide to Bucharest” with information on transportation in the city, exchanging money, and joining the social events.
Conference Tracks and extra sessions
Following the opening session, presentations and talks were given across various “tracks”, or categories: Development, Advocacy, Open Document Format, Quality Assurance, Localisation and Business. There were highly technical talks focused on specific areas of the software and source code, along with more open discussions about community building and recent updates from The Document Foundation.
In addition to the talks, there was also a community dinner at Hanu’ lui Manuc, a restaurant with outdoor seating that served traditional Romanian food, accompanied by live folk music and dancing. There was also a hackfest where developers could work together on the codebase while sharing pizza.
A workshop for new developers was held in parallel with the main tracks over the three days of the conference, and many different things around LibreOffice development were discussed, including: effective communication in free and open source projects; bug reporting and triaging; building LibreOffice from its source code; and using Gerrit for code reviews.
Sponsoring and merchandise
The event was sponsored by Collabora, allotropia, dveloper.io and 1&1, with support from itgenetics, rosedu, Tech Lounge, Web.de, GMX and Mail.com Thanks to the sponsors, attendees could get merchandise at the event, including T-shirts with the conference logo.
Full Programme
Full details about the event are available on the conference website. For a quick overview of all the talks, including links to PDF versions of the presentations, see the schedule. Videos from most of the talks are available as a playlist on our YouTube channel – or on PeerTube.
Please confirm that you want to play a YouTube video. By accepting, you will be accessing content from YouTube, a service provided by an external third party.
Olivier Hallot (TDF) added help pages for SEQUENCE and UNIQUE Calc functions and finalised help for RANDARRAY, XLOOKUP, XMATCH, FILTER, RANDARRAY, SORT and SORTBY functions. He also improved the help for Calc’s Advanced Filter, added extended tips to Sparklines dialog and improved the descriptions seen in the UI for Calc’s RANDARRAY and UNIQUE functions
Adolfo Jayme Barrientos improved the readability and grammar of Help pages
Stéphane Guillou (TDF) added help content for the new ability to start a presentation from the command line at an arbitrary slide number
Alain Romedenne added unit tests for officehelper.py
Dione Maddern added help content for new bar-of-pie and pie-of-pie chart types, updated help for File Properties, Slide Show Settings, Calc View Options, Summary and Expand Slides, Edit Points Bar, Calc change tracking, Shapes menu, Bullets and Numbering Image tab alongside various fixes and cleanups
Stanislav Horacek did corrections to Calc help content
Bogdan Buzea improved help about object positioning in Writer
Gábor Kelemen (allotropia) did code cleanups in the area of measurement units and snap lines, code simplification and includes
Laurent Balland did cleanups in Impress templates and added handling of xlink:type attributes for embedded charts, so they don’t produce a warning in the console
Miklós Vajna (Collabora) created a better implementation of continuous endnotes for Microsoft Word compatibility, implemented support for DOCX/DOC mirrored object positioning and adapted DOCX paragraph handling for files created with Word 2013 or newer, so the top margin of paragraphs on other pages than the first are collapsed
Áron Budea (Collabora) made it faster to open PPTX files with custom shapes
Gökay Şatır, Pranam Lashkari, Szymon Kłos, Méven Car, Hubert Figuière, Jaume Pujantell, Henry Castro and Michael Meeks (Collabora) worked on LOKit used by Collabora Online
Tomaž Vajngerl (Collabora) refactored the code for Impress annotations and cleaned up the accessibility checker code
Julien Nabet continued polishing gssapi authentication support for the MariaDB/MySQL connector and fixed a crash when exporting spreadsheet as PDF with “whole sheet export” option
Xisco Faulí (TDF) added support for SVG 2 attribute values context-stroke and context-fill, optimised the code for getting selected points and objects, added a couple of unit tests, upgraded many dependencies and started applying the newly-added SAL_RET_MAYBENULL for enforcing null checking
Michael Stahl (allotropia) implemented support for recognising localized paragraph style names in DOCX files, fixed the visibility of shapes in header/footer in DOCX files and fixed an issue with AutoText insertion or pasting overriding Writer paragraph style indentation
Mike Kaganski (Collabora) continued polishing HTML map export for text hyperlinks in frames, made LibreOffice’s own OLE objects obey AddReplacementImages setting, made it so the newly-added Windows version detection also handles architectures other than x86_64 and fixed a Writer undo issue affecting list levels
Caolán McNamara (Collabora) introduced SAL_RET_MAYBENULL which for debug builds and MSVC uses _Ret_maybenull_ and -analyze to enforce null checking. He also fixed many issues found by static analysers and fuzzers
Stephan Bergmann (allotropia) worked on WASM build, creating a UNO bridge for it, worked on MAR autoupdater and did many code cleanups and adapted the code to compiler changes
Noel Grandin (Collabora) optimised the speed of Calc column height calculation and getting the text script type and made loading large XLS files faster. He also did many code cleanups mainly in the area of strings
Justin Luth (Collabora) added a button to Notebookbar UIs to toggle dark mode, fixed an issue with comment replies in DOCX appearing in the wrong order, made it possible to start presentations at a specific slide using command line parameters, fixed percents misbehaving when used as list level prefixes/suffixes in Writer, made image fills work in imported DOCX files, fixed an issue with paragraphs in textboxes losing their left and right paragraph indents in imported DOC files and made it so separators for lists with None numbering level are not exported to DOCX
Michael Weghorn (TDF) worked on the accessibility features of Windows, GTK3 and Qt UIs in areas such as comboboxes, made it so the Number of copies field in the Print dialog only responds to mousewheel when the mouse is over it, fixed a Qt6 freeze, made Qt6 support video playback in Impress presentations on Wayland and did cleanups in the Android code
Balázs Varga (allotropia) added Excel2021 array functions RANDARRAY and UNIQUE to Calc, polished the XLOOKUP and XMATCH implementations, made it possible to format characters in text boxes and shapes inside charts, added an option to make data validity case-sensitive in Calc and made the Open Remote button in the Start Center respect disabling via a config file
Patrick Luby did many macOS stability improvements
Jim Raykowski made Navigator Headings display flat when alphabetically sorted and improved context menus related to Navigator
Sarper Akdemir (allotropia) continued polishing the new pane display of Presenter Notes in Impress
Samuel Mehrbrodt (allotropia) made it so dialog tabs that would have spanned multiple horizontal lines are displayed vertically and made bullets used in the current document be displayed in the bullets dropdown
Armin Le Grand (allotropia) continued the rework of handling attributes and properties
Oliver Specht (CIB) made case cycling more robust, continued improving the dialog for managing user fields, fixed an issue with calculation in Writer tables with merged cells, improved OOXML compatibility with wrapped through shapes and images and made it so Data Validation in the context menu is disabled in protected Calc sheets
Arnaud Versini did some code cleanups
Heiko Tietze (TDF) improved some dialogs, made the focus rectangle more prominent for toolbar widgets, made Calc comment authorship optional, increased the mouse hit area for Calc column/row resizing actions and made the visibility of formatting marks more intuitive
Vasily Melenchuk (CIB) expanded the use of Windows attention-grabbing FlashWindow API to dialogs opening, documents loading and LibreOffice starting
László Németh continued polishing new hyphenation options, fixed ordinal indicators for Portuguese and Catalan when using AutoCorrect and made resizing images work in fixed-height Writer table cells in all cases
Ilmari Lauhakangas (TDF) synchronised the Developer Guide hosted in TDF wiki with ODK examples and updated the PyUNO code for setting Python home directory to use PyConfig with newer Python versions
Christian Lohmaier (TDF) made the makefiles easier to read by getting rid of overly complicated leftover conventions from a time when there was a need to deal with split repositories and two different build systems. He also worked on build support under Windows Subsystem for Linux
Thorsten Behrens (allotropia) helped Samuel with the vertical dialog tabs work and fixed build issues
Eike Rathke (Red Hat) fixed a rounding issue when saving to XLSX, fixed an issue with array separators changing when using the fill handle, made Excel intersect operator (space) be correctly detected in XLSX import and made Japanese calendar format import from XLSX more robust
Jonathan Clark (TDF) finalised making BreakIterator (for breaking words or lines) use ICU, made Writer text layout across formatting changes more robust, avoiding incorrect kerning, fixed Writer text shaping across formatting changes and improved CJK fallback font rendering performance
Jakub Kościelak made 64-bit Windows be correctly detected and made the MSI installer code more conformant
Regina Henschel fixed an issue with object positioning after row sort in Calc AutoFilter and made text fit to contour in rotated polygons or bézier curves
Shail Gautum made both Calc’s rolumn/row highlighting and edit mode highlighting more robust and fixed a build issue
Pierre Vacher made zoned time type handling correct in Base table design and made it possible to manage relationships outside the default catalog/schema in Base
Tibor Nagy (allotropia) made it possible to change default bullet symbols via the UI and made Writer hyperlink names show as tooltips
Bayram Çiçek (Collabora) improved the speed of opening Tools – Options by deferring the indexing of dialog strings for the search feature and made it so AutoFill in Calc can now be called via .uno commands without needing to use the mouse
Kurt Nordback continued polishing the of-pie chart type
Rafał Dobrakowski made zoom in/out smoother in Calc preview
Adam Seskunas made it so Writer tables get copied as a matrix to plain text editors
Venetia Furtado added support for measuring the start up time between each splash screen update
Rafael Lima reworked the new cell outline to work nice with different zoom levels and made it so AutoFill handle updates the cursor right after merging cells
Leonard Sasse did cleanups in Python code
Rizal Muttaqin added new icons for of-pie chart types
Kudos to Ilmari Lauhakangas for helping to elaborate this list.
Reported Bugs
438 bugs, 55 of which are enhancements, have been reported by 272 people.
Top 10 Reporters
Eyal Rozenberg ( 19 )
Stéphane Guillou (stragu) ( 18 )
Gabor Kelemen (allotropia) ( 15 )
Mike Kaganski ( 11 )
johnks ( 9 )
Mihai Vasiliu ( 9 )
Regina Henschel ( 8 )
Heiko Tietze ( 7 )
Hossein ( 7 )
Xisco Faulí ( 7 )
Triaged Bugs
484 bugs have been triaged by 62 people.
Top 10 Triagers
Stéphane Guillou (stragu) ( 177 )
Heiko Tietze ( 52 )
m_a_riosv ( 47 )
Dieter ( 21 )
Buovjaga ( 17 )
V Stuart Foote ( 17 )
Julien Nabet ( 16 )
Mike Kaganski ( 16 )
ady ( 12 )
Robert Großkopf ( 11 )
Resolution of resolved bugs
472 bugs have been set to RESOLVED.
Check the following sections for more information about bugs resolved as FIXED, WORKSFORME and DUPLICATE.
Fixed Bugs
178 bugs have been fixed by 39 people.
Top 10 Fixers
Mike Kaganski ( 15 )
Dione Maddern ( 11 )
Heiko Tietze ( 9 )
Justin Luth ( 8 )
Caolán McNamara ( 8 )
Balazs Varga ( 6 )
Miklos Vajna ( 6 )
Jonathan Clark ( 4 )
Patrick Luby ( 4 )
Michael Stahl ( 4 )
List of critical bugs fixed
List of high severity bugs fixed
tdf#126573 Add array functions in Calc: FILTER, SORT, SORTBY, UNIQUE, SEQUENCE, RANDARRAY ( Thanks to Balazs Varga )
tdf#144576 Copy a table from Writer to plain text editor or as unformatted text pastes a list instead of matrix (like Calc does) ( Thanks to Adam Seskunas )
tdf#159027 Writer table formulas calculated incorrectly in merged cells when table splits over pages ( Thanks to Oliver Specht )
tdf#160937 Document Properties pages in all modules do not fit screen and cannot be resized (gtk3/gtk4) ( Thanks to Heiko Tietze )
tdf#161020 Vertical Tab dialogs–initial size of the style dialog is too small ( Thanks to Thorsten Behrens )
tdf#161047 Vertical Tab dialogs–Page style dialog is too small and not resizeable ( Thanks to Thorsten Behrens )
tdf#161049 Vertical Tab dialogs–Format Cells dialog in recent 24.8 alpha is too small ( Thanks to Thorsten Behrens )
tdf#161190 LibreOffice Calc crashes if you export a spreadsheet as PDF with “whole sheet export” option enabled. ( Thanks to Julien Nabet )
tdf#61444 Text layout broken across formatting changes (color, underline, etc.) ( Thanks to Jonathan Clark )
List of crashes fixed
tdf#160855 LibreOffice crashes when Calc cells are selected/copied ( Thanks to Patrick Luby )
tdf#160898 Crash selecting all (Ctrl+A) in a temporarily visible paragraph under a table inside a table ( Thanks to Mike Kaganski )
tdf#160906 Crash when changing formatting (e.g. font) inside Text Box Form Control ( Thanks to Armin Le Grand (allotropia) )
tdf#161083 CRASH: closing the document ( Thanks to Miklos Vajna )
tdf#161190 LibreOffice Calc crashes if you export a spreadsheet as PDF with “whole sheet export” option enabled. ( Thanks to Julien Nabet )
List of performance issues fixed
tdf#148616 FILEOPEN PPTX A certain POTX template is slow to open ( Thanks to Aron Budea )
Shortcuts are a major topic for user experience. Novices are advised to learn basic shortcuts beyond the famous Ctrl+C/X/V like Ctrl+1/2/3.. to quickly change the paragraph style to heading 1/2/3… in Writer. Once you have learned those combinations you never want to unlearn and to change the muscle memory.…
As described in a previous post, Writer already had
minimal support for not rendering endnotes on a separate endnote page, but it was not mature enough
to enable is by default for DOCX files.
What changed from the previous "continuous endnotes" approach is that instead of trying to map
endnotes to footnotes, we now create a special endnotes section, which only exists at a layout level
(no section node is backing this one), and this hosts all endnotes at the end of the document. It
turns out this is a much more scalable technique, for example a stress-test with 72 endnotes over
several pages is now handled just fine.
As you can see, there were various differences for this document, but the most problematic one was
that the entire endnote was missing from the (originally) last page, as it was rendered on a
separate page.
Now it's not only on the correct page, but also its position is correct: the endnote is after the
body text, while the footnote is at the bottom of the page, as expected. The second screenshot shows
~no red, which means there is ~no reference output, where the Writer output would be missing.
You can get a development edition of Collabora Online 24.04 and try it out yourself right now: try
the development edition. Collabora intends to continue
supporting and contributing to LibreOffice, the code is merged so we expect all of this work will be
available in TDF's next release too (24.8).
In this blog post, I discuss porting Java tests from Java to C++. We have many Java tests, and porting them to C++ is beneficial for LibreOffice. Here I discuss why, and how.
Why Porting Java Tests?
In the past, Java was used extensively in LibreOffice, and many tests where written in Java. They consist of various tests, including JUnit.
Searching for junit in LibreOffice source code gives many results: (Note that this is not the number of tests)
$ git grep -i junit | wc -l
901
Although these tests are useful, they have drawbacks:
1. They are slower than C++ CppUnitTests
2. They are outside process, which is creates them even more slower, and harder to debug
Porting these tests to C++ can make them faster, more reliable, and easier to debug. Let’s see how we can do it.
Start from Examples
The best way to find out how to do porting is to look into the previous examples. This issue is around porting Java API tests to C++:
In the above commit, Jens has ported qadevOOo/tests/java/ifc/sheet/_XSheetCellRanges.java test to C++ test test/source/sheet/xsheetcellranges.cxx.
I can summarize the changes in this way:
1. An equivalent C++ file, in test/ folder
2. Removal of Java file from qadevOOo/.
3. The Makefiles in test/ and qadevOOo/ folders should reflect the removal of Java test, and addition of C++ test.
4. Some Java tests are adjusted to reflect the deletion of the old Java test.
5. Some C++ tests are adjusted to reflect the addition of new C++ test.
Final Words
To be able to port a test, one should be able to understand the old test. Reading the code is the best way that one can achieve this purpose. By looking into similar ports, you can gain a better understanding of what to do. In Bugzilla page for tdf#45904, you may find similar ports.
After resigning from the Board of Directors of
TDF
over the weekend, I hope I will again find more time to look into the technical details of LibreOffice Writer. I will also try to do my best to write some good article here about the depth of that application. While a text processor in itself is not that interesting anymore these days, the challenges of migrating that big old legacy code might be fascinating quite often. Hope to have you as a reader for that soon!
LibreOffice 24.8 will be released as final at the end of August, 2024 ( Check the Release Plan ) being LibreOffice 24.8 Alpha1 the first pre-release since the development of version 24.8 started at the beginning of December, 2023. Since then, 4448 commits have been submitted to the code repository and more than 667 bugs were set to FIXED in Bugzilla. Check the release notes to find the new features included in this version of LibreOffice.
LibreOffice 24.8 Alpha1 can be downloaded for Linux, macOS and Windows, and it can be installed alongside the standard version.
In case you find any problem in this pre-release, please report it in Bugzilla ( You just need a legit email account in order to create a new account ).
For help, you can contact the QA Team directly in the QA IRC channel or via Matrix.
LibreOffice is a volunteer-driven community project, so please help us to test – we appreciate it!
In the previous parts of the blog posts series on fixing software crashes, I have written about some crash fixes in LibreOffice around segfaults, aborts, and I discussed how test them. Here I write about fixing assertion failure.
What is Assertion Failure?
Assertion is a mechanism provided to the developers to make sure that things are good in runtime, conforming to what they were assuming. For example, making sure that some pointer is valid, some data elements match expectation, or some similar assumptions that need to be valid in order to get the correct results.
As an example, consider the C++ function basegfx::utils::createAreaGeometryForLineStartEnd(), which creates a geometric representation of an arrow. The code resides here:
This is the line of code which contains assertion:
assert((rCandidate.count() > 1) && "createAreaGeometryForLineStartEnd: Line polygon has too few points");
On top of the actual function implementation, the C++ code asserts many conditions to make sure that they are met. In the above assertion, it checks to make sure that the number of points in the given data structure is more than 1. Otherwise, it leads to an assertion failure.
For various reasons, sometimes these sort of assumption may not be valid. To avoid reaching to incorrect results, it is important to have such assertions in place, to find such issues as soon as possible. If you are developing LibreOffice, you may have already built the code from sources in debug mode. Therefore, you may see software stops working, or simply crashes.
This crash may not happen for the end users, which use the release version of software. Therefore, these type of crashes have lower impact for the end users, and they are usually considered of lower importance compared to the crashes that happen for the end users.
Backtrace
One of the things that can help diagnose the problem is the stack trace, or simply backtrace. The way to obtain a backtrace depends on the platform and/or IDE that you use. If you use an IDE like Qt Creator, Visual Studio, etc., getting a backtrace would be as easy as debugging LibreOffice, making the assert fail, and then copy the backtrace from the UI. To learn more about IDEs, see this Wiki page:
One thing to mention is that if you work on a reported bug regarding to assertion failure, then the actual way to reproduce the issue and make the assertion fail is usually described in the relevant TDF Bugzilla issue. In the meta bug related to assertion failure, you may find some of these issues in the last part of this blog post.
Fixing the Problem
To fix the problem, first you should gain understanding of the assumption, and why it fails. You should be able to answer these questions by reading the code and debugging it:
What does some assumption mean?
Why it fails?
How to fix that, so that it does not fail?
To gain this understanding, you have to look into the places where backtrace points. Backtrace can be complex, containing the whole stack of the function calls across the software, linking to places in the code, but let’s discuss a simplified form.
The problem was caused by an out of bound access to a vector of integers, and to fix that, you had to see why this happens, and fix that.
This is the description from the commit title:
Previously, for the 7 days of the week, a 7 letter string smtwtfs (depending on the week start day this can be different, but length is always 7) was sent to this method without providing the length, thus the string length: 7 was used. In this case, positions of the letters were calculated and used from other array named mnDayOfWeekAry[7]. mnDayOfWeekAry[k+1] was used as the position of letter k (k=0..5). In this case, there was 7 letters for 7 days, and only 6 positions provided by the array. This caused assertion failure in span.hxx:83 when trying to access mnDayOfWeekAry[7] via o3tl::span<T>::operator[].
As you can see, a false assumption was creating assertion failure, and the fix was essentially changing the code based on the corrected assumption.
Sometimes, the fix can be easier. As an example, by only checking a pointer to make sure that it is valid, the assertion failure does not happen. Therefore, to fix the problem, you have to carefully study the code and its behavior.
Final Notes
Many of the assertion failure bugs are fixed in daily works of the developers, before causing problems for the end users, which use the “release” version of the software, that do not crash because of the assertion failure. But there are some of these issues remaining.
Do you want to help fix some of the remaining issues? Then, please refer to the list here, read some bug report, and pick one:
Olivier Hallot (TDF) added Help content for user interface selection dialog, Calc row recalculation at load time, automatic labeled ranges in Calc and font embedding. He also updated menu item paths in Help
Rafael Lima added support for hidden named expressions in Calc, added Reload command to Notebookbar UIs and made named ranges created by the Solver in Calc hidden by default
Stéphane Guillou (TDF) updated Help content for Navigator’s Navigate By
Alain Romedenne continued improving the officehelper Python script for connecting to LibreOffice processes
Dione Maddern improved Help content for inserting objects from the Gallery and did cleanups in Help
Colton Garrett improved Help content for OpenCL and added a Help page for digital signing of paragraphs
Laurent Balland did style cleanups in Impress templates
Miklós Vajna (Collabora) fixed an issue with shape positioning in DOCX import and did many code cleanups
Áron Budea (Collabora) fixed an issue with unwanted spacing in printed text
Marco Cecchetti, Gökay Şatır, Pranam Lashkari, Szymon Kłos and Michael Meeks (Collabora) worked on LOKit used by Collabora Online
Attila Szűcs (Collabora) continued improving the performance of handling transparent animated GIFs
Tomaž Vajngerl (Collabora) improved the text scaling in Impress text boxes, implemented support for custom cell format of pivot table output found in OOXML and did many code cleanups and restructurings
Julien Nabet added gssapi authentication support for the MariaDB/MySQL connector, fixed UI issues in Writer’s Paragraph dialog related to the “Allow to split paragraph” option, fixed crashes and did code cleanups
Xisco Faulí (TDF) continued the implementation of SVG filters
Michael Stahl (allotropia) changed the handling of paragraph and text attributes in empty lines at the end of paragraphs to match the behaviour seen in Microsoft Word
Mike Kaganski (Collabora) fixed issues with rotated text being partially cut off, made it possible to create DDE links to files with special characters in their names on Windows, made the Basic LIKE operator more robust, fixed an issue preventing Windows users with special characters in their names from importing PDF files into Draw, made the position shifting behaviour more robust for objects anchored As Character in Writer, fixed an issue with chapter titles in headers/footers getting mixed up due to headings in endnote content, fixed handling of em and ex units in the properties of imported SVG files, improved the stability of text part positioning in SVG files, fixed handling of whitespace in SVG text, fixed a Draw issue causing font colour to not be retained in certain situations and restored HTML map export for text hyperlinks in frames. He also did many code cleanups and optimisations
Caolán McNamara (Collabora) continued improving performance of threaded calculation in Calc. He also fixed crashes and many issues found by static analysers and fuzzers
Stephan Bergmann (allotropia) worked on WASM build, added a new Expert Configuration setting to not offer Safe Mode in the UI, fixed the msvc_win32_arm64 UNO bridge and worked on Windows Subsystem for Linux support. He also did many code cleanups and adapted the code to compiler changes
Noel Grandin (Collabora) did a big restructuring allowing optimisations to writerfilter which is responsible for RTF and OOXML file support, continued improving the speed of print preview with large merged rows in spreadsheets, improved the speed of loading conditional formatting rules in XLS files and changed to a faster algorithm for generating selection overlays. He also did many code cleanups and optimisations
Justin Luth (Collabora) fixed an issue with paragraph style overrides in imported DOCX files, fixed an issue with protected cell ranges not exporting to XLSX correctly, made parsing of cell addresses in XLSX import more robust, fixed a UI glitch in Groupedbar Compact related to pivot tables and made the z-index of VML GroupShapes import correctly from DOCX files
Michael Weghorn (TDF) worked on the accessibility features of Windows, GTK3 and GTK4 UIs in areas such as toolbar button toggles and Navigator, made IME cursor position reporting more reliable and fixed an issue with form control help texts showing up where they shouldn’t with kf5 UI
Balázs Varga (allotropia) made it possible to do character formatting in chart text elements and included OOXML support for the formatting, continued polishing XLOOKUP and SORT function implementations and added Excel2021 array function SEQUENCE to Calc
Patrick Luby fixed a macOS hang caused by JDBC driver extension, fixed PDF export of presentations containing PDF images, fixed an issue with cursor leftovers being displayed when using Skia/Metal UI rendering on macOS and made SVG icon rendering respect Retina resolution on macOS
Jim Raykowski made fixes and optimisations to Navigator in Impress/Draw context, including fixing an update glitch after saving and reloading and made it possible to delete footnotes and endnotes using the Navigator in Writer
Sarper Akdemir (allotropia) reworked Presenter Notes in Impress, so they are now available as a collapsible pane under the slide in Normal view and made it so mouse scrolling fully visible slides/pages in Impress/Draw switches between the previous/next one
Samuel Mehrbrodt (allotropia) worked on Impress Presenter Notes pane together with Sarper, made it so text formatting toolbar gets enabled when focusing into a text box and ensured text is properly aligned when tabstop is outside of textbox
Armin Le Grand (allotropia) continued polishing support for editing Impress slides during presentation and continued the rework of handling attributes and properties
Oliver Specht (CIB) improved the dialog for managing user fields, made it so Cycle Case will be applied to the sentence if the cursor is at the sentence end and implemented support for DOCVARIABLE fields in imported DOC files
Arnaud Versini did cleanups in locale handling code
Heiko Tietze (TDF) did improvements to several dialogs and made it so the cell focus rectangle in Calc appears outside the active cell
Taichi Haradaguchi updated Help content after UI changes, updated external library versions and did many UI string fixes and cleanups
Vasily Melenchuk (CIB) fixed a crash in Writer Navigator
Vivek Javiya (Collabora) extended the easy conditional formatting dialog in Calc
László Németh added DOCX import support for hyphenate-keep, added a Hyphenation Across option into Paragraph dialog’s Text Flow tab in Writer, made it possible to resize table rows even if cursor is outside the table in Writer and made Writer table cell selection and resizing more robust when dealing with images in cells
Ilmari Lauhakangas (TDF) removed obsolete reserved shortcuts and improved documentation for the related code
Gábor Kelemen (allotropia) fixed some dialog settings not being remembered across sessions and did code cleanups in the area of code simplification and includes
Ritobroto Mukherjee added sinusoidal and coil-like shapes and ported Java TerminationTest ODK example to C++
Christian Lohmaier (TDF) worked on build support under Windows Subsystem for Linux
Moritz Duge (allotropia) optimised the loading of GPG key data
AntonyDas Nadar (Collabora) enabled accessibility for comboboxes in Sidebar
Thorsten Behrens (allotropia) made editing Impress slides during presentation non-experimental
Khushi Gautam implemented the Sidebar Quick Find deck in Writer as part of an Outreachy project
Gabriel Masei (1&1) improved CSV field separator detection when several separators are selected on import
Mohit Marathe added UI to set document properties TabsRelativeToIndent and TabOverMargin
Sujatro Bhadra replaced AutoFormat button with table style listbox in Writer’s Convert Text to Table dialog
Eike Rathke (Red Hat) added [Multiple] and [Undetermined] to language list
Leonid Ryzhov made LanguageTool use correct default URL when username/API key are set
Jonathan Clark (TDF) worked on making BreakIterator (for breaking words or lines) use ICU
Juan C. Sanz made it possible to connect to MS Access .mdb files by using Microsoft.ACE.OLEDB.12.0 provider
Kira Tubo added several automated tests for Writer
Zeph Chai ported ChartInDraw and ChartInWriter ODK examples to Python
Sahil Gautam extended Insert Cells Dialog to allow adding a set of rows/columns and made the cell background change when entering edit mode in Calc
Ahmed Hamed improved the conditional formatting dialog by replacing the static “>=” with a dropdown of different operators
Luv Sharma made the handling of “#” characters more robust in Basic
Jakub Kościelak did fixes to the Windows installer and improved the presentation of the Windows version string in Help – About dialog (based on earlier work by Joel Dowdy and Achintya Sharma)
Alex Henrie added missing file types to Linux desktop files
Todor Balabanov improved the accuracy of the comparison code in NLP Solver
Kudos to Ilmari Lauhakangas for helping to elaborate this list.
Reported Bugs
410 bugs, 67 of which are enhancements, have been reported by 260 people.
Top 10 Reporters
Gabor Kelemen (allotropia) ( 16 )
Telesto ( 14 )
Mike Kaganski ( 12 )
Heiko Tietze ( 10 )
Stéphane Guillou (stragu) ( 10 )
Eyal Rozenberg ( 9 )
Xisco Faulí ( 8 )
Tyler ( 7 )
peter josvai ( 7 )
Cor Nouws ( 5 )
Triaged Bugs
398 bugs have been triaged by 66 people.
Top 10 Triagers
Stéphane Guillou (stragu) ( 61 )
m_a_riosv ( 48 )
Heiko Tietze ( 47 )
Buovjaga ( 27 )
Dieter ( 21 )
V Stuart Foote ( 21 )
Mike Kaganski ( 20 )
raal ( 14 )
Xisco Faulí ( 14 )
ady ( 12 )
Resolution of resolved bugs
430 bugs have been set to RESOLVED.
Check the following sections for more information about bugs resolved as FIXED, WORKSFORME and DUPLICATE.
Fixed Bugs
149 bugs have been fixed by 37 people.
Top 10 Fixers
Mike Kaganski ( 19 )
Michael Stahl ( 7 )
Noel Grandin ( 7 )
Heiko Tietze ( 6 )
Patrick Luby ( 6 )
Jim Raykowski ( 5 )
Xisco Fauli ( 5 )
Balazs Varga ( 5 )
László Németh ( 4 )
Michael Weghorn ( 4 )
List of high severity bugs fixed
tdf#154581 Paragraph language and character formatting (bold, italic) lost when pasting HTML ( Thanks to Michael Stahl )
tdf#160016 Inserted GIF flipped vertically; previews in Gallery and Fontwork dialog flipped or mangled ( Thanks to Tomaž Vajngerl )
tdf#160444 Crash on closing the 3D-Effects Window ( Thanks to Patrick Luby )
tdf#160632 TABLE: Crash when using column width dialog ( Thanks to Noel Grandin )
tdf#160698 Crash after opening Print dialog ( Thanks to Tibor Nagy )
tdf#58434 Show formatting marks when displaying non-printing characters +F10, rather than field shading +F8 (for formatting marks as in comment 18) ( Thanks to Heiko Tietze )
List of crashes fixed
tdf#159379 Writer crashes when multiple images are drag-and-dropped “As Character” (steps in comment 8) ( Thanks to Miklos Vajna )
tdf#159683 Crash on closing LibreOffice with certain content on the clipboard ( Thanks to Miklos Vajna )
tdf#159719 SfxItemPool::IsInRange crash: save and reload in Impress or Draw ( Thanks to Armin Le Grand (allotropia) )
tdf#160444 Crash on closing the 3D-Effects Window ( Thanks to Patrick Luby )
tdf#160590 Impress crashes with skia Metal enabled, skia raster software rendering works (MacOS Monterey (12.7.4) w/Intel HD Graphics 6000) ( Thanks to Patrick Luby )
tdf#160632 TABLE: Crash when using column width dialog ( Thanks to Noel Grandin )
tdf#160698 Crash after opening Print dialog ( Thanks to Tibor Nagy )
tdf#160765 EDITING: Insert comment – Copy – Paste Comments – Undo – Show comment -> LO crash ( Thanks to Andreas Heinisch )
tdf#160768 Changing value in a text box control with a link cell set up, Crash ( Thanks to Noel Grandin )
tdf#160827 Crash on opening certain .docx files ( Thanks to Julien Nabet )
List of performance issues fixed
tdf#160399 Print Preview freezes with whole row merged in large spreadsheet ( Thanks to Noel Grandin )
tdf#160706 speed up loading conditional formatting rule in XLS ( Thanks to Noel Grandin )
List of old bugs ( more than 4 years old ) fixed
tdf#107081 LOCALHELP: Index: backgrounds;inserting form Gallery ( Thanks to Dione Maddern )
tdf#108057 Primary key should default to AutoValue=Yes when type is integer ( Thanks to Mike Kaganski )
tdf#132253 CHARACTER DIALOG: Drop hyperlink from character attributes ( Thanks to Olivier Hallot )
tdf#132599 Option to stop words hyphenating across pages
LOWA is LibreOffice built with Emscripten as a Wasm executable that runs in the browser. Controlling that LibreOffice through UNO with JavaScript looks like a natural fit. Enter Embind, a mechanism to generate the binding glue between JavaScript and Wasm/C++.
As we will see, the Embind vs. UNO match is not perfect, but it kind-of gets the job done, at least for a first iteration.
Mappings
To dive straight into technical matters, the UNO type system is mapped to JavaScript as follows. (If you would like to see some example code first, jump ahead to the Starting Points and come back here later for reference.)
UNO BOOLEAN, depending on context and somewhat inconsistently maps to JavaScript Boolean and to JavaScript Number values 0 and 1. (The C/C++ representation of UNO BOOLEAN is sal_Bool, which is an alias for unsigned char, which Embind maps to JavaScript Number. So in places where we directly rely on Embind, like for the return value of a UNO interface method invocation, we get the Embind mapping to Number. But in places where we have more control, like for the JavaScript get method for a UNO ANY, we can be a bit more fancy and use a mapping to Boolean.)
UNO BYTE, SHORT, UNSIGNED SHORT, LONG, UNSIGNED LONG, FLOAT, and DOUBLE all map to JavaScript Number (with restricted value ranges for everything but UNO DOUBLE).
UNO HYPER and UNSIGNED HYPER both map to JavaScript BigInt (with restricted value ranges).
UNO CHAR and STRING both map to JavaScript String (with single UTF-16 code unit strings for UNO CHAR).
UNO TYPE maps to JavaScript Module.uno_Type objects. There are construction functions Module.uno_Type.Void, Module.uno_Type.Boolean, Module.uno_Type.Byte, Module.uno_Type.Short, Module.uno_Type.UnsignedShort, Module.uno_Type.Long, Module.uno_Type.UnsignedLong, Module.uno_Type.Hyper, Module.uno_Type.UnsignedHyper, Module.uno_Type.Float, Module.uno_Type.Double, Module.uno_Type.Char, Module.uno_Type.String, Module.uno_Type.Type, Module.uno_Type.Any, Module.uno_Type.Sequence, Module.uno_Type.Enum, Module.uno_Type.Struct, Module.uno_Type.Exception, and Module.uno_Type.Interface for representations of all the UNO TYPE values. The Module.uno_Type.Sequence construction function recursively takes a UNO TYPE argument for the component type, while the Module.uno_Type.Enum, Module.uno_Type.Struct, Module.uno_Type.Exception, and Module.uno_Type.Interface construction functions each take a string argument denoting the given type’s name in dotted notation (e.g., Module.uno_Type.Interface('com.sun.star.uno.XInterface')). Those JavaScript objects implement toString, which is also used for equality checks (e.g., type === 'com.sun.star.uno.XInterface').
UNO ANY maps to JavaScript Module.uno_Any objects. There is a constructor taking a UNO TYPE argument and a corresponding value (using an undefined value for UNO type VOID). Those JavaScript objects implement a method get that returns the JavaScript representation of the contained UNO value.
UNO sequence types map to a pre-canned variety of JavaScript Module.uno_Sequence_... objects. The problem is that Embind does not let us have a generic mapping to the C++ com::sun::star::uno::Sequence<T> class template; we can only have individual Embind mappings to specific class template instantiations. As a hack, for every UNO sequence type that appears somewhere in the LibreOffice UNO API, we generate a specific JavaScript Module.uno_Sequence_.... The naming is Module.uno_Sequence_boolean, Module.uno_Sequence_byte, Module.uno_Sequence_short, Module.uno_Sequence_unsigned_short, Module.uno_Sequence_long, Module.uno_Sequence_unsigned_long, Module.uno_Sequence_hyper, Module.uno_Sequence_unsigned_hyper, Module.uno_Sequence_float, Module.uno_Sequence_double, Module.uno_Sequence_char, Module.uno_Sequence_string, Module.uno_Sequence_type, and Module.uno_Sequence_any for the simple UNO component types; Module.uno_Sequence_... followed by the UNO type name in dollar-separated notation (e.g., Module.uno_Sequence_com$sun$star$uno$XInterface) for enum, struct, and interface component types; and Module.uno_SequenceN_..., with N greater than 1, for sequence component types (e.g., Module.uno_Sequence2_long for the UNO type “sequence of sequence of LONG“). That means that there currently is just no way to come up with e.g. a JavaScript representation of the UNO type “sequence of interface com.sun.star.frame.XDesktop“, as that sequence type happens to not be mentioned anywhere in the LibreOffice UNO API. (But for those sequence types that are used as interface method parameter or return types, corresponding JavaScript representations are provided. That should hopefully cover all relevant use cases for now; a future overhaul of this part of the mapping is likely.) These JavaScript sequence objects have two constructors, one taking a JavaScript array of member values (e.g., new Module.uno_Sequence_long([1, 2, 3])) and one taking a size and a Module.FromSize marker (as Emind does not allow to have multiple constructors with the same number of arguments) whose members will have default values (e.g., new Module.uno_Sequence_long(3, Module.FromSize)). Additional methods are resize (taking the new length as argument), size (returning the current length), get (taking an index as argument and returning the member at that index), and set (taking an index and a new member value as arguments). (The naming of those resize, size, get, and set methods is modelled after Embind’s emscripten::register_vector.)
UNO enum types are mapped to Embind-provided enums named Module.uno_Type_... followed by the UNO type name in dollar-separated notation (e.g., Module.uno_Type_com$sun$star$uno$TypeClass).
Plain UNO struct types and UNO exception types are mapped to Embind-provided value objects named Module.uno_Type_... followed by the UNO type name in dollar-separated notation (e.g., Module.uno_Type_com$sun$star$beans$NamedValue, Module.uno_Type_com$sun$star$uno$Exception). Polymorphic UNO struct types face a similar issue to sequence types, in that Embind does not allow to directly map their corresponding C++ class templates. It would be possible to do a similar hack and add specific mappings for all instantiated polymorphic struct types that are mentioned anywhere in the LibreOffice UNO API, but that has not been implemented so far. (And, similar to sequence types, a future overhaul of this part of the mapping is likely.)
UNO interface types are mapped to Embind-provided classes named Module.uno_Type_... followed by the UNO type name in dollar-separated notation (e.g., Module.uno_Type_com$sun$star$uno$XInterface). Null references are mapped to JavaScript null. The special com.sun.star.uno.XInterface UNO interface methods queryInterface, acquire, and release are not exposed to JavaScript client code.
UNOIDL single-interface–based service constructors are mapped to JavaScript functions named Module.uno_Function_...$$... followed by the service’s name in dollar-separated notation, followed by the constructor’s name set of by two dollar signs (e.g., Module.uno_Function_com$sun$star$beans$Introspection$$create). Like with other UNO language bindings, those functions take the com.sun.star.uno.XComponentContext as an additional first argument.
UNOIDL service-based singletons are mapped to JavaScript functions named Module.uno_Function_... followed by the singleton’s name in dollar-separated notation (e.g., Module.uno_Function_com$sun$star$frame$theDesktop). Like with other UNO language bindings, those functions take the com.sun.star.uno.XComponentContext as their (sole) argument.
Starting Points
To make all this work, the Embind mapping of the LibreOffice UNO API needs to be set up first. This is done by a call to
const uno = init_unoembind_uno(Module);
which also returns a wrapper object uno that allows for more natural access to all the UNOIDL entities whose mappings use that dollar-separated notation: Instead of Module.uno_Type_com$sun$star$uno$XInterface one can write uno.com.sun.star.uno.XInterface, and a call to uno_Function_com$sun$star$beans$Introspection$$create(context) can be written as uno.com.sun.star.beans.Introspection.create(context). If you want to cut down on the common uno.com.sun.star prefix even further,
const css = uno.com.sun.star;
lets you reduce that to just css.uno.XInterface and css.beans.Introspection.create(context).
The starting points to access the LibreOffice UNO API from JavaScript are Module.getUnoComponentContext() (returning the central css.uno.XComponentContext, through which all the services and singletons are reachable) and a Module.getCurrentModelFromViewSh() convenience function (returning the css.frame.XModel of the currently showing document). The gitlab.com/allotropia/lowa-demos repository is a growing site of example code showing all of this in action.
Summing this up, here is some example code that iterates over all the paragraphs of a Writer document and gives each of them a random foreground text color:
const uno = init_unoembind_uno(Module);
const css = uno.com.sun.star;
const model = Module.getCurrentModelFromViewSh();
const document = css.text.XTextDocument.query(model);
const text = document.getText();
const access = css.container.XEnumerationAccess.query(text);
const paragraphs = access.createEnumeration();
while (paragraphs.hasMoreElements()) {
const paragraph = css.text.XTextRange.query(
paragraphs.nextElement().get());
const props = css.beans.XPropertySet.query(paragraph);
const color = new Module.uno_Any(
Module.uno_Type.Long(),
Math.floor(Math.random() * 0xFFFFFF));
props.setPropertyValue("CharColor", color);
color.delete();
}
Cleanup
Embind is built on the concept that whatever C++ objects you reference from JavaScript, you manually and explicitly need to declare those references as no longer needed once you are done, by calling delete() methods on the corresponding JavaScript objects. (Or else, you risk memory leaks.) This can be quite cumbersome and would pollute the code with tons of such delete() calls. Luckily, JavaScript grew a FinalizationRegistry mechanism that allows code to be executed when the JavaScript garbage collector finds an objet to be unused and reclaims it. (And that code can thus transparently do the delete() call for us.) Embind implements such FinalizationRegistry-support for some types (those that are modelled based on some “smart poiner”) but not for others.
That means that (besides all the primitive types) JavaScript mappings of UNO string, type, enums, sequences, exceptions, and interfaces all do not need explicit delete() calls, while the mappings of UNO any and UNO sequences, and the various Module.uno_InOutParam_... all need explicit delete() calls.
Even though we expect that the JavaScript engines that we target do support the FinalizationRegistry mechanism, Embind is prepared to work with older engines that do not support it. Therefore, whenever an object is transparently cleaned up, Embind logs a somewhat unhelpful warning to the JavaScript console, stating that it “found a leaked C++ instance” (and that it will “free it automatically”).
Interfaces
For each UNO interface type there is a JavaScript class method query taking any JavaScript UNO object reference (in the form of the common com.sun.star.uno.XInterface base interface) as argument (and internally using UNO’s queryInterface to obtain either a correspondingly-typed reference to that object, or a null reference). There is also a JavaScript helper function Module.sameUnoObject, taking two interface references as arguments and returning whether both are references to the same UNO object.
UNO interface methods taking out or in-out parameters need special treatment. There are Module.uno_InOutParam_... wrappers (with a val property carrying the actual value) that need to be set up and passed into the UNO method. Such wrappers have a constructor taking no arguments (creating a dummy object, suitable for pure out parameters) and another constructor taking one argument of the wrapped type (suitable for in-out parameters). For example, to read data from a com.sun.star.io.XInputStream:
const stream = ...;
const input = css.io.XInputStream.query(stream);
if (input) {
const data = new Module.uno_InOutParam_sequence_byte;
input.readBytes(data, 100);
for (let i = 0; i != data.val.size(); ++i) {
console.log('read byte ' + data.val.get(i));
}
data.delete();
}
Exception Handling
Support for throwing and catching exceptions between JavaScript and C++ is rather rough: JavaScript code can use try ... catch (e) ... to catch a UNO exception thrown from C++, but all the information it can get about that exception is e.name stating the exception’s type. Also, for technical reasons, the catch block needs some increment– and decrementExceptionRefcount boilerplate,
try {
...
} catch (e) {
incrementExceptionRefcount(e);
//TODO, needed when building with JS-based -fexceptions,
// see
// <https://github.com/emscripten-core/emscripten/issues/17115>
// "[EH] Fix inconsistency of refcounting in Emscripten
// EH vs. Wasm EH"
if (e.name === 'com::sun::star::uno::RuntimeException') {
...
}
decrementExceptionRefcount(e);
}
To throw UNO exceptions from JavaScript code, there is a helper function Module.throwUnoException that takes a UNO (exception) type and an instance of that type:
The JavaSript-to-UNO binding is a full mapping, so you can even implement new UNO objects in JavaScript. This requires quite some boilerplate, though. For example, the below obj implements com.sun.star.lang.XTypeProvider and com.sun.star.task.XJob:
const obj = {
// Implementation details:
implRefcount: 0,
implTypes: new Module.uno_Sequence_type([
Module.uno_Type.Interface(
'com.sun.star.lang.XTypeProvider'),
Module.uno_Type.Interface(
'com.sun.star.task.XJob')]),
implImplementationId: new Module.uno_Sequence_byte([]),
// The methods of XInterface:
queryInterface(type) {
if (type == 'com.sun.star.uno.XInterface') {
return new Module.uno_Any(
type,
css.uno.XInterface.reference(
this.implXTypeProvider));
} else if (type == 'com.sun.star.lang.XTypeProvider') {
return new Module.uno_Any(
type,
css.lang.XTypeProvider.reference(
this.implXTypeProvider));
} else if (type == 'com.sun.star.task.XJob') {
return new Module.uno_Any(
type,
css.task.XJob.reference(
this.implXJob));
} else {
return new Module.uno_Any(
Module.uno_Type.Void(), undefined);
}
},
acquire() { ++this.implRefcount; },
release() {
if (--this.implRefcount === 0) {
this.implXTypeProvider.delete();
this.implXJob.delete();
this.implTypes.delete();
this.implImplementationId.delete();
}
},
// The methods of XTypeProvider:
getTypes() { return this.implTypes; },
getImplementationId() {
return this.implImplementationId;
},
// The methods of XJob:
execute(args) {
if (args.size() !== 1 || args.get(0).Name !== 'name') {
Module.throwUnoException(
Module.uno_Type.Exception(
'com.sun.star.lang.IllegalArgumentException'),
{Message: 'bad args', Context: null,
ArgumentPosition: 0});
}
console.log(
'Hello, my name is ' + args.get(0).Value.get());
return new Module.uno_Any(
Module.uno_Type.Void(), undefined);
},
};
obj.implXTypeProvider
= css.lang.XTypeProvider.implement(obj);
obj.implXJob
= css.task.XJob.implement(obj);
obj.acquire();
// ... pass obj to UNO here ...
obj.release();
I have previously discussed fixing crashes in 2 parts (segfaults, aborts). Here I discuss testing crashes to avoid creating re-creating regressions.
Why testing crashes?
When you fix a crash, you have to make sure that it does not happen again in the future. The key to achieve such a goal is to write a suitable test. The test should do the exact steps to reproduce the problem on the program in order to detect the known crash before the new code is merged.
This can be done using either UITests, or CppUnitTests. UITests are written in Python. They are easier to write, but they do not run on each and every platform, and they are usually slower. CppUnitTests, on the other hand, are written in C++. They are much faster, and they run on every platform that CI runs to make sure that everything is built and can be run correctly.
This problem was happening when someone created a footnote, deleted the reference, and then hovered the mouse on the removed footnote reference. To reproduce that, one could use keyboard to generate a key sequence that repeats the required steps:
Write something, add footnote, select all the footnotes and remove them, then go back to the text, and hover the footnote reference.
Using keyboard-only is not always enough, but here it was possible. To implement the UITest, you should first find the appropriate place to put the test file, and then write a Python script for that. Here, the test was written in sw/qa/uitest/writer_tests2/deleteFootnotes.py. The UITest test can be found alongside the bug fix, in the class class tdf150457(UITestCase):
Just doing the same steps would be enough, as if the crash happens with the fix in place, or in a bad commit in the future, the test would fail. This test failure will prevent the same problem in the future.
The nice thing is that it turned out the same test could have been written using C++ and CppUnitTest, which is considered superior.
The new CppUnitTest can be found in the below change:
The new test resides in sw/qa/extras/uiwriter/uiwriter3.cxx, and essentially uses postKeyEvent and dispatchCommand as similar functions.
If you look at the current version of the test, you can see that it was simplified in later commits, but the idea is the same: “repeat the same steps that lead to crash in the code”.
Final Words
It is expected that every bug fix is accompanied with a test, to avoid seeing the same problem in the future. If you want to know more about UITests and CppUnitTests, please take a look at this TDF Wiki pages:
Also, keep in mind that looking into the existing tests is the best way to understand how to write a new test. Therefore, make sure that you look into qa/ folders of the modules when you want to add a new test.
LibreOffice 7.6.6 and LibreOffice 24.2.2 were released on March 28
Olivier Hallot (TDF) renamed Fontwork to Text along Path in the UI while updating Help, added Help content for ExportAsFixedFormat VBA method and new Calc functions FILTER, SORT and SORTBY and did several cleanups and fixes in Help
Rafael Lima made several improvements to Calc’s Solver dialog, improved the visual consistency of the Tabbed UI and added a warning about the need to reload file after changing macro security level
Stéphane Guillou (TDF) updated Help content after UI changes and improved the Help page for macro security
Alain Romedenne made many improvements to the officehelper Python script for connecting to LibreOffice processes
Dione Maddern rewrote the Help page for Calc’s SUMIF function, updated Help for Writer’s View options and did cleanups in Help
Gábor Kelemen (allotropia) did many cleanups in the area of includes while improving the script for finding unneeded includes. He also made some Help fixes
Pierre F. made many improvements and fixes to Help pages, for example in the areas of regular expressions and Basic
Andras Timar (Collabora) made Help build more robust on Windows and made some cleanups in Help regarding translatable strings
Áron Budea, Marco Cecchetti, Gökay Şatır, Pranam Lashkari, Jaume Pujantell and Michael Meeks (Collabora) worked on LOKit used by Collabora Online
Gülşah Köse (Collabora) made it so pressing Enter in an empty list item ends the list in Impress
Attila Szűcs (Collabora) improved the performance of handling transparent animated GIFs and made it so image placeholders imported from PPTX files do not display text
Tomaž Vajngerl (Collabora) did many code cleanups in graphics code
Julien Nabet fixed incorrect display of custom page numbers in Sidebar, fixed an issue with duplicating a sheet in Calc causing unwanted axis label to appear in charts and fixed some crashes
Andreas Heinisch fixed an issue with saving print ranges to XLS files
Xisco Faulí (TDF) made a dozen additions and changes to automated tests and added a script to replace missing fonts in test documents. He also improved SVG support by implementing overflow:visible, switch element and the filters feMerge, feMergeNode, feBlend and feComposite.
Michael Stahl (allotropia) made the Curl-based WebDAV content provider more robust
Mike Kaganski (Collabora) fixed issues with copying and pasting charts in Calc, fixed an issue causing incorrect closing tags in Writer HTML export, fixed an issue affecting conditional formatting in overlapping cell ranges, made canceling out of Insert Chart dialog more robust in case of multiple views, fixed an issue with picking a connection type in Database Wizard, fixed an issue in the UNO API implementation for text ranges, harmonised the rounding in Calc’s number formatter and ROUND function and made it so index field names can be single characters which is good news for Japanese users
Caolán McNamara (Collabora) improved the performance of threaded calculation in Calc, fixed an issue with Calc’s currency selection dropdown in GTK UIs, improved dark mode support and made “Always autocorrect to” more robust. He also fixed crashes and many issues found by static analysers and fuzzers
Stephan Bergmann (allotropia) worked on WASM build. He also did many code cleanups and adapted the code to compiler changes
Noel Grandin (Collabora) improved loading time for PPTX files with lots of unused master slides, improved loading time for DOCX files with lots of headers and footers, optimised the handling of columns in Calc, improved the speed of print preview with large merged rows in spreadsheets. He also did many code cleanups
Justin Luth (Collabora) made the new global config option RecalcOptimalRowHeightMode also work for XLSX files, fixed a crash when trying to overwrite file in read-only directory when its lock file exists, fixed an issue with z-ordering of objects in DOCX files, fixed image placement issues in DOC/DOCX files, made searching backwards for end of paragraph regex work in Writer, fixed an issue causing unwanted toggling of Ordered List button and made it so frame text boundary line in Writer is only shown if display of formatting marks is active
Michael Weghorn (TDF) fixed HiDPI scaling with KF6/Qt6 UIs under Wayland and worked on the accessibility features of GTK4 UI
Balázs Varga (allotropia) added Excel2021 array functions FILTER, SORT and SORTBY to Calc, fixed issues with chart rendering in XLSX files, improved the performance of Calc’s SUMPRODUCT function and fixed an issue with objects not shown in slideshow in a PPTX file if they have fillstyle or linestyle
Patrick Luby (NeoOffice) fixed issues related to the transparency-to-alpha rework, fixed a Skia issue related to a changed default, fixed horizontal swiping and scrolling when using an RTL UI, made it possible to encrypt files with using public GPG keys with unknown Ownertrust on macOS and fixed macOS crashes
Jim Raykowski fixed an issue preventing use of keyboard shortcuts when focused into a tab bar element in the Sidebar, fixed an issue with text selection over pages for multi column tables with repeated headings, improved the name display of custom shapes in the Navigator in Impress/Draw and added a UNO API command to set layer of objects in Draw
Sarper Akdemir (allotropia) made it so a reload is not required for embedded objects to be disabled
Regina Henschel worked on extruded/3D shape support in PPTX files
Samuel Mehrbrodt (allotropia) improved the accessibility checker
Armin Le Grand (allotropia) continued polishing support for editing Impress slides during presentation and continued the rework of handling attributes and properties
Oliver Specht (CIB) made it possible to insert an empty paragraph before an index that is the first element in a Writer document, made Clone Formatting more robust in Impress, added a search field to Gallery and made Cycle Case also work at the end of words
Arnaud Versini did some code cleanups and optimisations
Heiko Tietze (TDF) made Infobar close buttons easier to hit, made Bullets and Numbering dialog cleaner, improved dark mode support and added a “What’s new?” dialog to be shown on first run of a major version
Hossein Nourikhah (TDF) worked on Developers Guide examples and fixed updating hyperlinks in Draw
Tibor Nagy (allotropia) fixed an issue with disappearing text in merged Calc cells and fixed a placeholder box being too tall in PPTX files
Kurt Nordback finished adding a chart type for “pie-with-remainder-as-another-pie” and fixed an issue where stacked column charts did not show connection lines
Taichi Haradaguchi did some cleanups in dialog definition files
Vasily Melenchuk (CIB) improved the code for WinAPI FlashWindow() function that alerts the user about an event in an application
Hubert Figuière (Collabora) worked on jsdialog used by Collabora Online
David Gilbert did code cleanups in PDF import code
Jean-Pierre Ledure worked on the ScriptForge library
Leonard Sasse did many cleanups in Python files
Fridrich Štrba fixed building with Java 8 and autoconf 2.72
Vivek Javiya made heading colours dynamic in Calc, allowing for automatic adjustment
László Németh fixed hyphenation at stem boundary by adding a new hyphenation option “Compound characters at line end” and implemented hyphenate-keep paragraph property to keep both parts of a hyphenated word within a single page
Adlair Cerecedo-Mendez added LibreOffice minor version and CPU architecture to PDF metadata
Skyler Grey (Collabora) improved animating of bullets in presentations exported as SVG
René Engelhard (Debian) did build fixes
Sahil Gautam made hyperlinks accessible via keyboard
Kudos to Ilmari Lauhakangas for helping to elaborate this list.
Reported Bugs
468 bugs, 82 of which are enhancements, have been reported by 297 people.
Top 10 Reporters
peter josvai ( 20 )
Stéphane Guillou (stragu) ( 17 )
Rafael Lima ( 12 )
Telesto ( 11 )
Jeff Fortin Tam ( 10 )
Gabor Kelemen (allotropia) ( 9 )
prrvchr ( 8 )
Michael Otto ( 7 )
Kevin Suo ( 6 )
Mike Kaganski ( 6 )
Triaged Bugs
469 bugs have been triaged by 73 people.
Top 10 Triagers
Stéphane Guillou (stragu) ( 149 )
V Stuart Foote ( 29 )
m_a_riosv ( 28 )
Heiko Tietze ( 22 )
Buovjaga ( 20 )
Julien Nabet ( 15 )
Mike Kaganski ( 15 )
Rafael Lima ( 15 )
dunguyen ( 14 )
ady ( 14 )
Resolution of resolved bugs
429 bugs have been set to RESOLVED.
Check the following sections for more information about bugs resolved as FIXED, WORKSFORME and DUPLICATE.
Fixed Bugs
143 bugs have been fixed by 35 people.
Top 10 Fixers
Mike Kaganski ( 12 )
Caolán McNamara ( 12 )
Julien Nabet ( 8 )
Justin Luth ( 7 )
Pierre F ( 6 )
Xisco Fauli ( 6 )
Patrick Luby ( 6 )
Rafael Lima ( 6 )
Balazs Varga ( 5 )
Noel Grandin ( 5 )
List of critical bugs fixed
tdf#160036 Selection invisible in a11y High Contrast modes with SKIA/Raster, Skia/Vulkan unaffected ( Thanks to Patrick Luby )
tdf#160095 CRASH: using ALT+RETURN twice ( Thanks to Julien Nabet )
List of high severity bugs fixed
tdf#142133 Hyperlinks cannot be clicked / interacted with in PDF export of RTF or DOCX files (comment 9) ( Thanks to Xisco Fauli )
tdf#152524 macOS: LibreOffice crashes (gpgme / gpgmeio) on macOS 13 Ventura ( Thanks to Patrick Luby )
tdf#154863 Crash when moving images around in a multipage table ( Thanks to Matt K )
tdf#157258 “Always autocorrect to” deletes the word instead of replacing (affects extensions like Grammalecte, LanguageTool, Antidote) ( Thanks to Caolán McNamara )
tdf#159094 FILESAVE PDF Tagged PDF export of media file fails to create PDF ( Thanks to Tibor Nagy )
tdf#159373 Crash in: ScTable::HasAttrib(short,long,short,long,HasAttrFlags) ( Thanks to Julien Nabet )
tdf#159931 Exported pptx cannot be opened in PowerPoint because a referenced part does not exist ( Thanks to Sarper Akdemir )
tdf#160149 CRASH: undoing conditional format ( Thanks to Mike Kaganski )
tdf#160184 allow to “Encrypt with GPG key” on save using public keys with unknown Ownertrust ( Thanks to Patrick Luby )
tdf#160365 Writer: unable to turn off “text boundaries” for frames / tables ( Thanks to Justin Luth )
tdf#83720 PIVOTTABLE: Wrong date format in column field ( Thanks to Tomaž Vajngerl )
tdf#93352 UI. RTL: Horizontal scrolling for right-to-left Sheet moves in opposite direction (macOS and Linux) ( Thanks to Patrick Luby )
List of crashes fixed
tdf#152524 macOS: LibreOffice crashes (gpgme / gpgmeio) on macOS 13 Ventura ( Thanks to Patrick Luby )
tdf#154072 crash / no effect when clicking some dropdown buttons when toolbar overflows ( Thanks to Caolán McNamara )
tdf#154863 Crash when moving images around in a multipage table ( Thanks to Matt K )
tdf#158344 FILEOPEN DOCX Crash on opening file ( Thanks to Miklos Vajna )
tdf#158945 Calc: crash when entering text in a cell ( Thanks to Julien Nabet )
tdf#159373 Crash in: ScTable::HasAttrib(short,long,short,long,HasAttrFlags) ( Thanks to Julien Nabet )
tdf#159879 Crash when closing “3D View” dialog ( Thanks to Xisco Fauli )
tdf#159933 crash when applying Solarize filter to raster image ( Thanks to Noel Grandin )
tdf#160095 CRASH: using ALT+RETURN twice ( Thanks to Julien Nabet )
tdf#160149 CRASH: undoing conditional format ( Thanks to Mike Kaganski )
tdf#160192 CRASH when trying to overwrite file in read-only directory when its lock file exists ( Thanks to Justin Luth )
tdf#160222 LibreOffice 7.6.5 – SF_Session RunApplication crash for unknown reason ( Thanks to Jean-Pierre Ledure )
tdf#160368 Crash on save after deleting sheet ( Thanks to Caolán McNamara )
List of performance issues fixed
tdf#159687 Cutting rows from specific file with whole column references in formula is slow ( Thanks to Balazs Varga )
List of old bugs ( more than 4 years old ) fixed
tdf#103068 New Database Wizard gets confused between ODBC and JDBC connection if you backup twice to step 1. ( Thanks to Mike Kaganski )
tdf#116156 Python // officehelper.py misbehaves since 5.3.7 ( Thanks to Alain Romedenne )
First, Collabora Online was using the
deprecateddocument.execCommand() API to paste text, which is problematic, as the "paste" button on the
toolbar can't behave the same way as pressing Ctrl-V on the keyboard.
Second, it turns out Google Sheets came up with some additional HTML attributes to represent
spreadsheet data in HTML in a much better way, and Calc HTML import/export had no support for this,
while this is all fixable.
In short, Collabora Online now uses the Clipboard
API to read from the system
clipboard -- this has to be supported by the
integration,
and Calc's HTML filter now support the subset of the Google Sheets markup I figured out so far. This
subset is also
documented.
Note that the default behavior is that the new Clipboard API is available in Chrome/Safari, but not
in Firefox.
For the longer version, here are some screenshots:
You can get a snapshot / demo of Collabora Office 24.04 and try it out yourself right now: try the
unstable snapshot. Collabora
intends to continue supporting and contributing to LibreOffice, the code is merged so we expect all
of this work will be available in TDF's next release too (24.8).
One of the areas that can help LibreOffice, but may not directly be visible to the users even though it has a big impact is the quality assurance, is automated testing. Here, I discuss some areas and notes around improving tests for LibreOffice. First, I start with regressions and bug fixes without a test.
Missing Unit Tests
This is the description from the GSoC ideas page:
While there are some automated tests for LibreOffice, there are not nearly enough. Adding more and better tests helps developers who work on the code to be more productive by allowing them to find regressions as early as possible.
To elaborate more, I should say there are many regressions and bugs in general that are fixed, but lack testing. It is important to have tests for those bug fixes, to avoid such problems in the future. You can see a list of those fixed issues that lack tests here:
If you want to add some new tests for the bug fixes, first you should read the bug report very carefully to understand what is it about, and try to test the fix yourself. You can either use git revert command to revert the fix, and see the problem in action, or try changing back the fix in the code, if it is not too big.
That is important, because you have to see that the test fails without the fix in place, but succeeds when it is applied. This is an essential step when writing the test.
To know more about unit tests, you may look into these Wiki pages:
Some tests are written in the past, but now have issues because of the way they are written. In this case, porting them can provide improvement.
Tests can be written in multiple languages. At least, C++, Python, Java and BASIC are currently in use for different tests across the LibreOffice code base. Again in the GSoC ideas page, you can read:
There is some support in LibreOffice for automated tests, both at the level of unit tests, and at the level of system tests that drive a full LibreOffice instance. Currently tests can be written in C++, Java, or Python. Various new automated tests should be developed to improve the test coverage.
Tests written exclusively for Java (e.g. the JUnit framework) should be ported to C++ so that they can execute much more rapidly. Similarly, tests that do remote control of an existing LibreOffice instance, should be re-factored to run inside that instance to make debugging much easier.
Almost all JUnitTests and UITests, and also some smoke tests, run as an outside process. To verify, the trick is to remove the soffice(.exe) binary, or to remove its execute permission (on Linux). In this way, out-of-process tests should fail, as they need to run the soffice binary. After a successful build, you can see if this works. For example, try this:
make -d JunitTest_framework_complex
As an example, we have this issue around complex tests that should be ported to Python:
You may find many examples of the previously ported test in the issue page. Keep in mind that usually old Java tests should be removed in the same patch that provides the CppUnitTest port.
Also, you may find examples of UITests ported to C++ from Python. For example, see this patch:
It ports a previously implemented UITest from Python to C++. The result is a faster test, which is more robust.
Focusing on a Specific Area
If you want to add or port some tests, please focus on a specific area of the code. The LibreOffice code base is huge, and consists of more than 200 modules. It is not easy, and in fact not suggested, to work across different applications and modules. It is much better that you pick a specific application, and even inside that application, like Writer, Calc, Impress, etc., focus on a specific module. In this way, it would be much easier to understand the ideas and the way tests are implemented.
How Hard is it to Write / Port a Test?
One important question is around the complexity of writing or porting tests. The answer is not straightforward, as it depends on the area that the test is written. But one can take a look at what others did in the past. By looking into Gerrit or git log, you can find what other people, including GSoC applicants, were able to achieve during their work.
After writing a few tests, or porting a few tests, it may become easier for you to write more tests. Another thing is that you don’t have to write tests from scratch. There are many tests available in the LibreOffice code base, and you can create your new test based on existing tests and customize it to match the purpose of the issue you are working on.
Legal numbering is a way to influence the number format of values inherited in a multi-level
numbering. Say, the outer numbering uses Roman numerals and the inner numbering uses X.Y as the number
format, but the inner level wants to display the outer values as Arabic numerals. If this is wanted
(and guessing from the name, sometimes lawyers do want this), then the inner number portion will
expand to values like "2.01" instead of "II.01", while the outer number portions will remain values
like "II".
Mike did 80% of the work, what you can
see here is just the RTF/DOC filters.
Picking a smaller feature task like this looked like a good idea, since I wanted to spend some of
the time on regression fixing around last year's multi-page floating table project.
It shows how the outer "II" gets turned into "2", while it remained "II" in the past. This works for
both loading and saving.
The same feature is now handled in the RTF filter as well. There the relevant detail is the
\levellegal control word, which has an odd 1 default value (the default is usually 0). Here is the
result:
You can get a snapshot / demo of Collabora Office 24.04 and try it out yourself right now: try the
unstable snapshot. Collabora
intends to continue supporting and contributing to LibreOffice, the code is merged so we expect all
of this work will be available in TDF's next release too (24.8).
After a long slog since November when the previous version of coverity was EOLed and we had to start using 2022.6.0 with its new suggestions for std::move etc, LibreOffice is now finally back to a 0 warnings coverity state
This post describes some challenges around having multiple views of one opened document in
LibreOffice core, when those views belong to LOK views, representing different users, with their
own language, locale and other view settings.
This work is primarily for Collabora Online, but is useful for
all clients of the LOK API.
LOK views are meant to represent separate users, so we need to make sure that when a user sets their
preferences and trigger an action, then the response to that action goes to the correct view, with
the correct view settings.
This is different from the desktop LibreOffice use-case, where multiple windows are still meant to
share the same user name, language, undo stack and so on.
In this post, I would like to present 4 small improvements that recently happened to the LOK API to
provide this wanted separation of views.
The first was an issue where two users were
editing the same document, one busily typing and the other clicked on a link in Calc. What could
happen sometimes is the link popup appeared for the user who typed, not for the user who clicked on
the link:
This specific problem can be fixed by making sure that link click callbacks are invoked
synchronously (while the clicking view is still active) and not later, when the current view may or
may not be the correct one.
It turns out the same problem (async command dispatch) affects not only hyperlinks, but many other
cases as well, where we want to stay async, for example, when one dialog would invoke another
dialog, like the Calc conditional format -> add dialog:
There you don't want to change async commands into sync commands, because that may mean spinning the
main loop inside a dialog, resulting in nested main loops. This can be fixed by making sure that
async commands to be dispatched (sfx2 hints in general) are processed in a way that the current view
at dispatch & processing is the same, which is now the case.
The third problem was around wrong language & locale in the status bar:
This is not simply a problem of missing translation, the trouble was that the status bar update is
also async and by the time the update happened, the locale of the view on the left was used, for a
string that appears on the right.
The way to fix this is to perform the update of toolbars/statusbar/etc (in general: SfxBindings) in
a way that the language at job schedule time and at UI string creation time is the same.
The last problem was quite similar, still about bad language on the UI, but this time on the
sidebar:
This is similar to the statusbar case, but the sidebar has its own executor for its async jobs, so
that needed a fix similar to what the statusbar already had, now done.
You can get the latest Collabora Online Development Edition 23.05 and try it out yourself right now:
try the development edition.
Collabora intends to continue supporting and contributing to LibreOffice, the code is merged so we
expect all of this work will be available in TDF's next release too (24.8).
Firebird Project is happy to announce general availability of Firebird 5.0 — the latest major release of the Firebird relational database for Windows, Linux, MacOS and Android platforms.This release introduces improvements in areas of performance, multithreaded processing (including backup, restore, sweep), SQL queries profiling, with better scalability and numerous enhancements in SQL
Using comments is a key feature in text processing. A typical workflow might be to review a document where notes are made by different colleagues. LibreOffice Writer currently shows these comments in the document margin, which is limited to the page height, ending up in the need to scroll long text (even while editing [1]) and eventually in paging-like interactions if the number of comments exceed the total size.…
Previous posts described the hardest part of multi-page floating tables: making sure that text can
wrap around them and they can split across pages. In this part, we'll look at a case where that
content is not just text, but the wrapping content itself is also a table.
Regarding testing of the floating table feature in general, the core.git repository has 92 files now
which are focusing on correct handling of floating tables (filenames matching
floattable-|floating-table-). This doesn't count cases where the document model is built using C++
code in the memory and then we assert the result of some operation.
Here are some screenshots from the improvements this month:
The first screenshot shows a situation where the mouse cursor is near the right edge of the first
page of a floating table. What used to happen is we found this position close to the invisible
anchor of the floating table on that page, then corrected this position to be at the real anchor on
the last page. In short, the user clicked on one page and we jumped to the last page. This is now
fixed, we notice that part of the floating table is close to the click position and we correct the
cursor to be at the closest position inside the table's content.
The next screenshot shows a floating table where the content wrapping around the table happens to be
an inline table. You can see how such wrapping didn't happen in the past, and the new rendering is
close to the reference now.
You can get a snapshot / demo of Collabora Office 23.05 and try it out yourself right now: try the
unstable snapshot. Collabora
intends to continue supporting and contributing to LibreOffice, the code is merged so we expect all
of this work will be available in TDF's next release too (24.8).
The new version of Firebird ODBC driver is in Beta stage now. Version 3.0.0 Beta is available for testing on Windows. It works only with Firebird 3+ , and requires fbclient.dll from Firebird 3 or above.https://github.com/FirebirdSQL/firebird-odbc-driver/wikiPlease download, test, and report any issues!Issues can be reported here: https://github.com/FirebirdSQL/firebird-odbc-driver/issuesOriginal
Thank you, Red Hat, for generously letting me work for so long on stuff that is near and dear to my heart. At the intersection of theory and practice, of compiler technology and the LibreOffice code base. But, to keep doing what I love, I need to move on.
So, thank you, allotropia, for having me. I’m excited.
And, above all, thank you, LibreOffice, family of friends. Lets make sure to keep this a happy family, one that Tolstoy would have nothing to write home about. With quarrels and arguments, for sure; feud even. But happy at heart. I wish to keep meeting you all for years to come, virtually, and for a feast at FOSDEM or LOCon. And booze.
To paraphrase Hamburger Tafel (donations needed, btw), “Wir haben LibreOffice noch lange nicht satt.”
This is my first blog post on the topic of LibreOffice. Let me quickly explain my link to LibreOffice. I work for a data protection authority in the EU and help navigate the digital transformation of our office with about 100 staff members. While many of our partner organisations adopt Microsoft 365, our office decided to pilot Nextcloud with Collabora Office Online.
In the future, I want to blog (in my personal capacity) about my thoughts related to the use of alternative word processing software in the public sector in general and in our specific case.
As there are no dedicated resources for training, preparation of templates etc., during the pilot of LibreOffice, the experience so far covers a large spectrum of user satisfaction. Generally, our staff has been spent years of their life using Microsoft Office and has the expectation that any other software works the same way. If it does not, they send an email to me (best case) or switch back to Microsoft Office.
During the week, I discussed again some smaller LibreOffice bugs. Then, I showed this weekend some FOSS Blender animated short videos to family members. It seems that Blender is more successful in its domain than LibreOffice. Is that possible? Or are animated short videos just more capturing due to their special effects? 😅
You can watch the 1min Blender animated short movie “CREST� on Youtube or the making-off. The latter you find here below.
I find it very inspiring to see what talented artists can do with Blender. For my part, I have once installed Blender and deinstalled it. Back then it was not easy to use for people not familiar with video animation software. Blender competes with proprietary software such as Maya or Cinema 4D. The latter is about 60Â USD per month in the annual subscription plan. Not exactly cheap.
Then, I read in the fediverse about people working with LibreOffice:
I just tried to use #LibreOffice #Draw to draw some arrows and boxes onto JPEG images for emphasizing stuff.
The UX is really bad for somebody not working with Draw all the time.
Whatever I do, instead of drawing onto the image, the image gets selected instead.
Could not find any layer-sidebar.
Could not scale text without starting the “Character …� menu, modifying font size blindly + confirming > just to see its effect and then start all over.
In my past, I have worked on online voting systems. They are not very good yet despite years of efforts. xkcd dedicated a comic to voting software
Elections seem simple—aren’t they just counting? But they have
a unique, challenging combination of security and privacy requirements.
The stakes are high; the context is adversarial; the electorate
needs to be convinced that the results are correct; and the secrecy of
the ballot must be ensured. And they have practical constraints: time
is of the essence, and voting systems need to be affordable and maintainable,
and usable by voters, election officials, and pollworkers.
What is the unique challenge of developing word processing software? Happy to hear back from you in the blog comments or on the companion fediverse post!
News via reddit : "We are pleased to announce a new release of Valgrind, version 3.22.0,available from https://valgrind.org/downloads/current.html.See the release notes below for details of changes.Our thanks to all those who contribute to Valgrind's development. Thisrelease represents a great deal of time, energy and effort on the partof many people.Happy and productive debugging and
This was the second time LibreOffice Conference Asia has been held in Tokyo in 2019, as it could not occur due to the COVID-19 pandemic. UbuCon Asia was first held online in 2021, and the first in-person event was held in Seoul, Korea in 2022, and this still was the second in-person event.
I was burnt out by the pandemic and had stopped most of my OSS activities, but I still had many friends in the OSS world, so I went to Indonesia to meet with them.
Therefore, I had initially intended to be a general participant. Still, a friend of the speaker was suddenly unable to attend due to illness, so I gave a presentation in his place. Here is my slide:
As mentioned, I am halfway out of OSS activities, but I know what my friends are doing, so it was not so difficult to talk about this subject.
Although I cannot say that the presentation itself was a great success (due to my English language skills), I was pleased because the audience was very responsive and easy to talk to, and many people approached me after the presentation was over.
Other than my presentation, I was naturally interested in the two keynote speeches by The Document Foundation and was surprised and grateful when Franklin Weng mentioned my name as an "Asian activist to be featured at the LibreOffice Latin America Conference. "
I listened to Muhammad Syazwan Md Khusaini's "Hands-On on Translating in Ubuntu" with great interest; however, I was a bit surprised to hear from a friend that many Indonesians use English for desktop environments and applications like LibreOffice. I recognized that this was quite different from Japan.
The event itself was just as enthusiastic. Unlike OSS events in Japan (laugh), the participants were young, and there were many women. I was also surprised to see junior high school students among the speakers.
Both lunch and dinner were complimentary, and the one-day Surakaruta city tour the day after the event was delightful. I appreciated the hospitality of the local staff.
This was my first time in Indonesia, and although short, I enjoyed many things, including the train trip. In Yogyakarta, I visited a museum and learned a lot about the history of Indonesia. However, I was overcharged by the tuk-tuk in Yogya.
I know it was a lot of work for the organizers, but as I have many friends in LibreOffice and am also an Ubuntu user, I was very grateful that the two events were co-hosted. Thanks to all the sponsors, global/local organizers, and everyone who talked to me there. See you soon!
Firebird Project announces the first Release Candidate of Firebird 5.0, the next major version of the Firebird relational database, which is now available for testing on all supported platforms (Windows, Linux, MacOS, Android).This Release Candidate demonstrates the complete set of features and improvements developed for the new release. Release Candidates are generally considered stable enough
Flamerobin 0.9.9 Snapshot released with a few fixesWhat’s Changed :Fix Mac OS compilation by @rlakis in #328Fix saving style error and code scanning alert by @arvanus in #330Improve SQL statistics by @arvanus in #331New Contributors :@rlakis made their first contribution in #328
LibreOffice is a complex application with a large and growing number of options. It is not easy to find the right needle in the haystack. Like most other complex applications, it will be valuable and useful enhancement to add a search field to the “Tools > Options” dialog that iterates over the various tabs and filters where the search text is found. The Search Field in Options project aims to provide this search functionality in “Tools > Options” page.
Include Options TreeView’s parent and child node names into searching
Add GetAllStrings() method to fetch strings from 69 dialogs step by step
Include following element strings into searching:
labels
check buttons
radio buttons
toggle buttons
link buttons
buttons
Include accessibility elements into searching:
accessible-names
accessible-descriptions
tooltip-texts
Include option pages from extensions into searching
Initialize all dialogs at background if it’s possible (salhelper::Thread - asynchronously)
Initialize all dialogs to get strings properly (not in background - synchronously)
initialize ~half of them after opening the options
and initialize remaining ones after doing a search
Update Options TreeView properly after the searching done
Expand the first node and select first child-node after search by default
Remove Hyphen (_) and Tilde (~) symbols from fetched strings to make the search function work correctly
My Work during GSoC
During 13 weeks GSoC program, I added a search field in Options dialog and included the node names and their .ui strings into searching. Since sub-dialogs under the Options are not initialized at startup of Options dialog, it was not possible to access their .ui strings. To overcome this issue we had two options:
Option A:Extract .ui strings at build-time and fetch them at run-time
This option requires working on file operations, LibreOffice’s build system, makefiles, localization etc. I worked on this option for ~5 weeks but this approach caused a lot of issues that took the project out of its scope. For example, how to deal with localization issue while extracting strings at build-time? This was another big problem…
Option B:Initialize all dialogs in some way and get their strings
This option is more understandable and simple. Instructions are clear. No need to worry about localization. No need to work on file operations, extracting and fetching data, working with makefiles etc…
When I felt that Option A is just wasting my time (~5 weeks); I switched to Option B where I can -at least- make some progress. The main issue in Option B was initializing all dialogs which takes about 4-8 secs. I tried to initialize them at background but there was some errors on Win10 that I don’t reproduce the issue on my linux machine. Then I tried to see the errors on Win10 with a virtual machine, but it was too slow to test. Therefore I uninstalled Manjaro/Linux (which I’ve been using it more than 1.5 years) from my computer and had to install Win10 (which I last used 6 years ago) on my machine to see the problems in there. There was some visual inconsistencies while initializing sub-dialogs using salhelper::Thread at background.
After working long hours for weeks meanwhile the time was running out, I decided to initialize almost half of them at Options dialog startup and the remaining ones at the time of searching. In that way, time of initializing process is divided by ~2 which can be acceptable time in some degree in terms of user experience.
The most challenging part was implementing GetAllStrings() function for every ~69 dialogs step by step. Current implementation may not be the best solution for user experience, but at least searching through the numerous options is now possible.
Whats left to do or can be done?
Following tasks are left and can be implemented after GSoC:
Include accessibility elements into searching:
accessible-names
accessible-descriptions
tooltip-texts
Include option pages from extensions into searching
Initialize all dialogs at background if it’s possible (salhelper::Thread - asynchronously)
Additional hacks
Show modified options with some special indicator (as in KDE settings). (better to discuss this idea in a separate ticket)
Implement highlighting feature
Tasks I’ll be working on after GSoC
improvement on the initialization of the dialogs, maybe it can be possible to initialize them at background without encountering any visual inconsistencies - especially on Windows.
Implementing the remaining tasks:
Include accessibility elements into searching
Include option pages from extensions into searching
If everything works fine I’d like to work on the highlighting feature
Also it would be prettier if Options dialog have a modified options indicator (as in KDE settings)
Thanks
I’m very happy that we all reached the end of GSoC. During that time, I know that I had a responsibility for doing everything that I can. Therefore I worked hard and tried to complete as much tasks as I can.
I learned a lot of things during the GSoC. Although GSoC is finished, I will definitely continue to contribute to LibreOffice. I am really happy to be a part of the LibreOffice community and Google Summer of Code. I’m really thankful to LibreOffice and Google for providing us this such a great opportunity which helped me gain this amazing experience!
I always tried to be active on IRC #libreoffice-dev channel, and I want to thank for everybody who helped me about my questions.
And most importantly, greatly thankful to Andreas Heinisch and Heiko Tietze who were my mentors throughout the GSoC period. They always guided me everything about my questions. Thank you endlessly for your time and effort. I appreciate that you always motivating and encouraging me in all that I attempt and do. I can never truly express how grateful I am. Your guidance, reviews, help and shared experiences have been invaluable. Thank you very much for everything.
I’d like to express my gratitude to everyone in the LibreOffice community for their help and kindness. They always tried to answer my questions on IRC. I fell very lucky to work with this amazing community. I have learned a lot from you and I will never forget this wonderful experience.