The Document Foundation Planet

 

May 21, 2025

Official TDF Blog

LibreOffice Marketing Activities – TDF’s Annual Report 2024

TDF Annual Report 2024 banner

In 2024, The Document Foundation and its global LibreOffice community undertook a variety of marketing initiatives aimed at increasing visibility, fostering community engagement, and driving adoption of LibreOffice

(This is part of The Document Foundation’s Annual Report for 2024 – we’ll post the full version here soon.)

LibreOffice and Open Source Conference 2024 in Luxembourg

A major highlight of TDF’s 2024 marketing activities was the LibreOffice and Open Source Conference, held from October 10 to 12 in Luxembourg. The annual event brought together contributors from around the world, including developers, designers, documentation writers, translators, and marketers.

Marketing efforts for the conference included:

  • A targeted social media campaign promoting the event’s location, speakers, and agenda.
  • Outreach to local technology communities and universities in Luxembourg to boost participation.
  • The creation of promotional graphics and materials highlighting the conference themes and goals.
  • Live updates and content shared across LibreOffice’s social channels to engage a remote audience.
  • The conference acted as a vital showcase of LibreOffice’s progress, community strength, and future plans.

LibreOffice Conference 2024 group photo

“Month of LibreOffice” Campaigns

Throughout May and November 2024, TDF organized its recurring “Month of LibreOffice” initiative. This campaign aimed to recognize and reward community contributors across various roles, including development, documentation, QA and marketing.

Participants who contributed during the campaign period were acknowledged through:

  • Special edition badges awarded digitally.
  • Public recognition via blog posts and social media.
  • Incentives like stickers and merchandise shipped to selected contributors.

This initiative not only celebrated existing contributors but also attracted new participants interested in supporting open source software.

Month of LibreOffice stickers

Launch of the LibreOffice Podcast Series

In November 2024, TDF launched its LibreOffice Podcast, a new platform to discuss topics related to LibreOffice and the wider world of open source software. The podcast aimed to:

  • Share success stories from migrations to LibreOffice.
  • Offer insights into FOSS marketing strategies.
  • Feature interviews with developers and community leaders.
  • Provide behind-the-scenes looks at the ongoing work within TDF.

The first episode focused on marketing strategies for FOSS, with discussions on how to engage institutions and governments in adopting LibreOffice.

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.

YouTube privacy policy

If you accept this notice, your choice will be saved and the page will refresh.

Enhanced Social Media and Content Strategy

In 2024, TDF expanded and optimized its social media presence. Alongside its traditional platforms like Twitter (X) and Facebook, TDF increased its focus on:

  • Mastodon: engaging the open-source community on federated social platforms.
  • LinkedIn: Sharing professional success stories, including case studies on large-scale LibreOffice deployments.
  • Regular posting of blog content, including release announcements, tutorials, and community spotlights.
  • Short video clips and graphics to make content more accessible and visually engaging.

These efforts aimed to grow the project’s audience, particularly among decision-makers in public administration and enterprises.

Native Language Community Outreach

TDF placed a strong emphasis on supporting native language communities. The marketing team worked with volunteers worldwide to produce localized materials, including:

  • Press releases for new LibreOffice versions.
  • Social media templates and visual assets.
  • Brochures explaining the benefits of LibreOffice in local contexts.

Several regions ran independent marketing initiatives, including:

  • Nepal: workshops for students on using LibreOffice Writer to create professional resumes.
  • India: local events demonstrating LibreOffice’s potential for government offices and educational institutions.

Software Freedom Day participants in Nepal

Workshops, Training and Community Events

Throughout the year, TDF organized workshops and training sessions aimed at onboarding new users and contributors. These included:

  • Online training for translators and QA testers.
  • Regional events offering hands-on experience with LibreOffice migrations.
  • Webinars aimed at IT administrators exploring LibreOffice deployment in enterprise environments.

The Open Source Workshops helped public sector organizations understand the benefits of LibreOffice and how it can replace proprietary office suites.

Outreachy and Template Development

LibreOffice participated in the Outreachy program, with a focus on developing new templates for LibreOffice Writer. These templates included resumes, reports, and business documents aimed at improving the user experience and broadening appeal, particularly for users migrating from proprietary suites.

Marketing activities highlighted:

  • How templates increase productivity.
  • The contributions of new developers and designers participating in the Outreachy program.
  • The availability of these templates through LibreOffice’s website and community channels.

Media and Press Relations

TDF continued its media relations work, distributing regular press releases covering:

  • New LibreOffice releases and features.
  • Major migrations by organizations and governments.
  • Events such as LibreOffice Conference and Month of LibreOffice campaigns.

TDF’s press outreach focused on reinforcing LibreOffice’s position as a cost-effective, secure, and privacy-respecting alternative to proprietary office suites.

Download Statistics and User Adoption

The marketing efforts in 2024 yielded significant results:

  • Download Milestone: by the end of 2024, LibreOffice surpassed 400 million cumulative downloads since its inception in 2011, with an average of 28.6 million downloads per year.
  • Weekly Downloads: Weekly downloads approached 1 million, marking the highest figures since 2023.
  • Public Sector Adoption: The German state of Schleswig-Holstein announced plans to migrate 30,000 PCs to LibreOffice, aiming for completion by 2026.

Schleswig-Holstein moving 30,000 PCs to LibreOffice

Conclusion

In 2024, through conferences, campaigns, podcasts, and media outreach, TDF advanced its mission of promoting free and open source software while making LibreOffice more accessible and trusted around the world. These marketing efforts not only amplified LibreOffice’s visibility but also demonstrated the value of community-driven open source projects in delivering professional-grade software solutions.

Like what we do? Support the LibreOffice project and The Document Foundation – get involved and help our volunteers, or make a donation. Thank you!

by Mike Saunders at May 21, 2025 02:36 PM

Michael Meeks

2025-05-21 Wednesday

  • Mail chew, early call, sync with Dave.
  • Published the next strip around how private initiative can smooth roads:
    The Open Road to Freedom - strip#19 - private initiative can smooth roads
  • More catch-up, sales team call.

May 21, 2025 02:10 PM

May 20, 2025

Michael Meeks

2025-05-20 Tuesday

  • Up in the night, caught up with admin; checked-out, another day of interesting talks to partners & friends at the OS Founders Summit, good to hear about progress left & right.
  • Worked on the Eurostar home, got back rather late, late call with a friend.

May 20, 2025 09:00 PM

LibreOffice QA Blog

LibreOffice 25.8 Alpha1 is available for testing

LibreOffice 25.8 will be released as final at the end of August, 2025 ( Check the Release Plan ) being LibreOffice 25.8 Alpha1 the first pre-release since the development of version 25.8 started at the beginning of December, 2024. Since then, 3918 commits have been submitted to the code repository and 533 bugs were set to FIXED in Bugzilla. Check the release notes to find the new features included in this version of LibreOffice.

LibreOffice 25.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!

Happy testing!!

Download it now!

by x1sc0 at May 20, 2025 12:10 PM

May 19, 2025

Michael Meeks

2025-05-19 Monday

  • Up earlyish, found the venue, lots of great talks from various Open Source founders on a whole range of interesting topics. Ran a workshop with Amandine.
  • More talks 1:1 interrupted by some partner calls here and there. Out for dinner in the evening.

May 19, 2025 09:00 PM

May 18, 2025

Michael Meeks

2025-05-18 Sunday

  • Up early, cooked breakfast, talk on love from David. Packed & cleaned up, drove home early with Alex.
  • Changed, showered, packed, lunch with B&C passing through, caught up with them a bit - and J. dropped me into Cambridge North.
  • Train & tube to St Pancras to catch the Eurostar to the Open Source Founders Summit.

May 18, 2025 09:00 PM

May 17, 2025

Michael Meeks

2025-05-17 Saturday

  • Up earlyish, Ian cooked a fine cooked breakfast. Out for a great walk through the countryside together, enjoyed some chips in a pub en-route.
  • Soldiered on with the hip through it all, drove back to base, rested in the sun, while others watched the FA cup final. Lovely. Business call and some messaging; more resting.
  • Out for a lovely pub meal in the evening; and back, avoided Eurovision & bed to try to sleep.

May 17, 2025 09:00 PM

May 16, 2025

Official TDF Blog

What is the Open Document Format (ODF)?

An introduction to the Open Document Format

The documents we create today, whether reports, spreadsheets or presentations, are essential for communicating, sharing and storing knowledge. However, the format in which these documents are saved often goes unnoticed. This is where the Open Document Format (ODF) comes in. ODF is a technical standard and a tool that ensures documents remain accessible, editable and usable over time without being tied to a specific vendor or product.

Approved by OASIS as an open standard document format in May 2005 and by ISO/IEC in May 2006, ODF has been around for over 20 years. Despite 20 years having passed, most productivity software users are not familiar with the format and therefore do not use it, as it is not as widespread as its proprietary counterpart, Microsoft OOXML.

This means that a huge number of documents — equivalent to over 100 zettabytes of data in 2025 — are subject to the commercial strategies of a company and completely beyond the control of their authors. These authors may suddenly find themselves unable to manage their own content unless they use specific software.

This also means that the enormous wealth of information contained in these documents does not contribute to the growth of collective intelligence because they are limited in terms of interoperability due to being tied to a single, specific, proprietary software.

Furthermore, Microsoft’s touted backward compatibility feature prevents true innovation in document formats because the presence of proprietary elements from old binary formats, which are not included in the ODF standard, forces documents to remain with technologies that have long been obsolete and incompatible with future developments.

What is ODF?

ODF is an open standard for saving and exchanging office documents. It includes text files (.odt), spreadsheets (.ods), presentations (.odp), and other types of documents, such as drawings (.odg). Developed by OASIS, an organisation that promotes structured information standards, it was approved by ISO/IEC as the international standard ISO/IEC 26300 in 2006.

Put simply, ODF is a universal language for documents, ensuring they can be read and written by any compatible software without locking users into a single ecosystem.

To understand the importance of ODF, it is helpful to know how proprietary formats work. When a document is saved in a Microsoft format, such as .docx, or an Apple format, such as .pages, it is often designed to work best with that company’s software only. Over time, this can cause problems such as limited compatibility, vendor lock-in, and the risk of obsolescence if the proprietary format is abandoned or changed significantly, as older documents may become unreadable.

ODF avoids these problems. It is completely open and free, meaning that anyone can implement it in their software, and users can switch between tools without losing access to their files.

ODF is not limited to text documents, but includes a wide range of office document types, including .odt (OpenDocument Text) for text documents such as reports, letters and books; .ods (OpenDocument Spreadsheet) for data analysis, tables and financial models; .odp (OpenDocument Presentation) for presentations with visual content; .odg (OpenDocument Graphics) for diagrams and vector graphics, as well as documents containing text and images; and .odf (OpenFormula) for formulas used in ODS spreadsheets.

Each of these document types is structured in such a way as to allow maximum compatibility while maintaining formatting and advanced software features.

How does ODF compare with Microsoft document formats?

Feature ODF Microsoft (docx. xlsx, pptx)
Open Standard Yes No
Long Term Archiving Solid Support Risk of Format Changes
Risk of Online Dependency
Offline Support Fully Supported Supported
Editable without Vendor Software Yes Limited

Common misconceptions about ODF

It is not as feature-rich as .docx or .xlsx

False. ODF supports complex formatting, styles, images, tables, charts, macros and more. Its feature set is robust and evolving thanks to contributions from a global community of developers and users.

No one uses ODF

This is also false. In fact, millions of users worldwide use ODF-compatible software every day. LibreOffice alone has tens of millions of active users worldwide.

It doesn’t work with my existing documents

ODF-compatible software, such as LibreOffice, can open, edit and export many formats, including .docx and .xlsx. Switching to ODF is easy and you won’t lose access to your existing files.

The future of ODF

The growing importance of digital documents in every sector, including education, public administration and business, is bound to impact the adoption of the ODF format because users cannot continue to use a format that disadvantages them in every way. Furthermore, the number of countries adopting policies based on open standards and demanding transparency and control over their data is growing all the time, and this can only lead to increased adoption of ODF in the long term.

Documents should belong to their authors, not to a software vendor through the file format used. In the case of a country, documents should belong to its citizens. ODF is the only effective way to regain control and ensure that data remains open, accessible and future-proof. ODF embodies the principles of digital freedom, collaboration, and user empowerment.

Whether you are an individual seeking control over your digital life, a teacher aiming to share knowledge using open tools to ensure its long-term availability to the community, a public official seeking long-term transparency, or a politician representing citizens’ interests, ODF is the smart, sustainable choice.

DISCLAIMER: Artificial Intelligence has helped in putting together background data in a matter of seconds, thus dramatically reducing the time needed to draft the article. I have over 4GB of background documents on my online storage, and although I have read most of them, it is impossible for my humble brain to retain all information. Here, Artificial Intelligence helps a lot, especially a 70 years old guy.

by Italo Vignoli at May 16, 2025 10:55 AM

Month of LibreOffice, May 2025 – Half-way point!

Month of LibreOffice banner

So we’re half-way through the Month of LibreOffice, May 2025. And already, 216 contributors have won cool LibreOffice sticker packs! Details on how to claim them will be provided at the end of the month, but if you don’t see your name (or username) on that page, it’s not too late to join…

How to take part

There are many ways you can help out – and you don’t need to be a developer. For instance, you can be a:

  • Handy Helper, answering questions from users on Ask LibreOffice. We’re keeping an eye on that site so if you give someone useful advice, you can claim your shiny stickers.
  • First Responder, helping to confirm new bug reports: Go to our Bugzilla page and look for new bugs. If you can recreate one, add a comment like “CONFIRMED on Windows 11 and LibreOffice 25.2.3”.
  • Drum Beater, spreading the word: Tell everyone about LibreOffice on Mastodon, Bluesky or X (Twitter)! Just say why you love it or what you’re using it for, add the #libreoffice hashtag, and at the end of the month you can claim your stickers.
  • Globetrotter, translating the user interface: LibreOffice is available in a wide range of languages, but its interface translations need to be kept up-to-date. Or maybe you want to translate the suite to a whole new language? Get involved here.
  • Docs Doctor, writing documentation: Whether you want to update the online help or add chapters to the handbooks, here’s where to start.

So, two more weeks to go! We’ll be posting more updates on this blog and our Mastodon, Bluesky and X (Twitter) accounts…

by Mike Saunders at May 16, 2025 08:55 AM

May 15, 2025

Official TDF Blog

Projects selected for LibreOffice in the Google Summer of Code 2025

The LibreOffice Google Summer of Code projects have been selected for 2025.

  • Adam Seskunas – Implement Report Builder in C++: replacing the current Java-based Report Builder with a new solution will improve maintainability and remove one of the last remaining dependencies on Java.
  • Karthik Godha – New dialog to edit Table Styles: Writer and Calc have a feature called AutoFormat styles with the possibility to add custom styles. This project will make it possible to edit existing table styles.
  • Devansh Varshney – BASIC IDE code auto-completion: rudimentary auto-completion for BASIC macro authors is already available, but this project will make the feature much more helpful.
  • Manish Bera – Python code auto-completion: currently there is no support at all for Python auto-completion when developing scripts for LibreOffice, so this will be quite a welcome addition.
  • Mohamed Ali Mohamed – Rust UNO language binding: last year LibreOffice received support for Lua and the latest .NET and now it’s time to make it possible to use the API with Rust.
  • Ujjawal Kumar – Import Markdown files into Writer: Markdown is a rather popular markup language for quickly formatting text in blog content, comments, chats and more. Requests to support it have increased recently, so it makes sense to tackle it.
  • Shardul Vikram Singh – Rework Impress slideshow to use DrawingLayer primitives: this is one of those projects that are incomprehensible to most users, but really important for the long term maintenance of the code.

Good luck to the contributors – we appreciate their work on these important features and improvements! And thanks to our mentors for assisting them: Thorsten Behrens, Stephan Bergmann and Sarper Akdemir (allotropia); Rafael Lima; Jonathan Clark, Heiko Tietze, Xisco Faulí, Michael Weghorn and Hossein Nourikhah (TDF).

Between August 25 and September 1, contributors will submit their code, project summaries, and final evaluations of their mentors. Find out more about the timeline here, and check out more details about the projects on this page.

by Ilmari Lauhakangas at May 15, 2025 10:19 AM

May 14, 2025

Official TDF Blog

TDF and LibreOffice website, blogs and social media – Annual Report 2024

TDF Annual Report 2024 banner

Our two main websites are vital sources of information for The Document Foundation and the LibreOffice software. We also 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 2024 – we’ll post the full version here soon.)

TDF website

The Document Foundation website provides general information about the foundation (overview, statutes, code of conduct, financials and reports) and its governance (board of directors, membership committee, members, advisory board, and engineering steering committee), and about LibreOffice certification, including a list of certified developers, and professionals for migrations and trainings.

During 2024, the foundation’s website was visited 98,499 times, with 146,456 page views – a slight reduction in visits but also a slight growth in page views from 2023. Continent-wise, the largest chunk of visits were from Europe (52%), followed by North America (24%) and Asia (16%). And regarding software: the most visits were from PCs using the Windows (65%) operating system, followed by GNU/Linux (10%) and macOS (8%) and devices uses Android (6.2%), while for browsers: Chrome had 39%, followed by Firefox (16%) and Microsoft Edge (15%).

Matomo graph of visits to the website

LibreOffice website

The LibreOffice website provides information about the office suite and the document format, the various download options, how to get help, how to contribute to the project, events where users can get to know the LibreOffice community, and how to make a donation to support the project and the community.

In 2024, we continued to make improvements and tweaks to the website, updating the “Discover” and “New Features” sections of the site to reflect new versions of the software.

During 2024, the English-language LibreOffice website was visited 19,298,517 times (a 0.6% gain over 2023), with 46,065,236 page views (a 0.1% gain). Most visits were from Europe (52%), followed by Asia (20%), North America (15%) and South America (9%), from PCs using the Windows operating system (82%), followed by macOS (6%) and Linux (23%). Regarding web browsers, Chrome was the most popular (41%), followed by Microsoft Edge (29%) and Firefox (13%).

Matomo graph of visits to the website

Blogs

TDF’s blogs (like this one) are essential for communicating activities inside and around the project, including new releases of LibreOffice, community events and support for other free and open source initiatives. In 2024, we used them to post regular interviews with community members and provide updates from team members about documentation, marketing, QA, design and more.

Photo of Ndidi Folasade Ogboi

Blogs were also maintained by various native language communities including Japanese, Spanish, German and others. Thanks to the hard work of community members, we had press releases, tips and other articles translated into many languages, and picked up by local media organisations.

These native language blogs complement the information provided by the main blog in English, and by the two blogs managed by members of the design and the quality assurance projects, which provide updates about activities for the upcoming major releases.
In 2024, the blog had 100,180 visits and 131,174 page views – a drop in both cases of around 30% from the previous year. The press releases for LibreOffice 24.2 and 24.8 were the most popular posts, followed by the posts about the German state of Schleswig-Holstein moving 30,000 PCs from Microsoft Office/365 to LibreOffice.

Social media

In January 2024, our X (formerly known as Twitter) account (@LibreOffice) had 63,060 followers; by the end of the year, we had grown this to 68,870. Our most popular posts were for major releases of LibreOffice, and news about migrations to the suite. We posted 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 posts, but also retweeting announcements from the LibreOffice community members. We liked and reposted 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 reposted 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 2024 we worked more on expanding our activities on our account @libreoffice@fosstodon.org, and from January to December, we grew our follower base from 25,440 to 29,326. We also joined Bluesky in late 2023 thanks to invites from a community member, and by December 2024 our follower count had reached 2,900.

Screenshot of LibreOffice account on Bluesky

Our Facebook page growth was smaller, from 63,348 page followers to 64,239. We’ve noticed a gradual reduction in activity on Facebook over the last few years, which reflects its changing audience, and the move towards other social media platforms. 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 20,638 subscribers and 3,243,107 video views in January 2024 to 22,586 subscribers and 3,534,370 video views by the end of the year. The most popular videos were the “New Features” videos for LibreOffice 24.2 and 24.8, and we also added videos of talks, presentations and workshops from the LibreOffice Conference 2024.

At the end of 2024, we posted the first video from the new LibreOffice Podcast series, where Italo Vignoli and Mike Saunders from TDF talked about the challenges and opportunities in marketing free and open source software like LibreOffice. More podcasts are planned for 2025.

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.

YouTube privacy policy

If you accept this notice, your choice will be saved and the page will refresh.

Like what we do? Support the LibreOffice project and The Document Foundation – get involved and help our volunteers, or make a donation. Thank you!

by Mike Saunders at May 14, 2025 01:40 PM

May 09, 2025

LibreOffice QA Blog

QA/Dev Report: April 2025

General Activities

  1. Olivier Hallot (TDF) fixed displaying help for a particular module from the command line, updated help after changes to object boundaries options, improved help on BASIC format codes and added type information to BASIC help pages, added help about multithreading in Calc, added help on saving only active sheet in Calc, explained case sensitivity in the help for Calc’s Validity and improved help for CSV import
  2. Gábor Kelemen (allotropia) worked on the script for finding unneeded includes and did many code cleanups
  3. Alain Romedenne fixed some Python code examples in Help
  4. Tomaž Vajngerl (Collabora) added support for embedded fonts in PowerPoint files, made graphics handling code more efficient and continued reworking slideshow rendering code
  5. Gökay Şatır, Marco Cecchetti, Pranam Lashkari, Parth Raiyani, Ashod Nakashian, Gülşah Köse, Szymon Kłos and Jaume Pujantell (Collabora) worked on LOKit used by Collabora Online. Jaume also added support for annotationRef elements in DOCX export to preserve the order of comments.
  6. Karthik Godha added all 3 Spotlight commands (Paragraph Style, Character Style, Direct Formatting) to Style Inspector, made it possible to rename objects from the Writer Navigator and fixed extended help tooltips being too wide in the Navigator
  7. Miklós Vajna (Collabora) continued polishing per-user change tracking in Writer, improved compatibility with DOCX’s character properties defined for “paragraph markers”, improved the handling of tracked changes that depend on each other and added support for reinstating changes
  8. Xisco Faulí (TDF) fixed exporting Writer table formulas with a sum of a range to DOCX, added a bunch of new automated tests, upgraded many dependencies, fixed crashes and did some code cleanups
  9. Michael Stahl (allotropia) made the line height for paragraphs that are empty due to hidden text compatible with MS Word and made replying to Writer comments and recovering broken ZIP files more robust
  10. Mike Kaganski (Collabora) did many code cleanups and optimisations
  11. Caolán McNamara (Collabora) fixed crashes and many issues found by static analysers and did code cleanups and optimisations
  12. Stephan Bergmann (allotropia) worked on the WASM build. He also adapted the code to compiler changes and did code cleanups
  13. Noel Grandin (Collabora) made handling large charts in Calc much faster when loading, toggling edit mode and switching sheets, improved the loading speed of large RTL Writer documents, improved the speed of calculating optimal row heights in Calc and improved the speed of image processing with Skia. He also did many code cleanups and optimisations
  14. Justin Luth (Collabora) made it so table cell margins get exported to PPTX, improved the DOCX compatibility of padding and border spacing in table cells and paragraph margins, improved object positioning in DOCX import and made it so preview thumnails are displayed for DOTX templates
  15. Michael Weghorn (TDF) continued cleaning up and reorganising accessibility-related code and fixed a crash in Qt-based UIs when inserting videos into Impress. He also worked on using native widgets in Qt UIs
  16. Balázs Varga (allotropia) polished the implementation of Calc’s XLOOKUP() function, fixed an OOXML export issue with chart colours and added an expert configuration option to remove “Total editing time” separately from all private information during save
  17. Patrick Luby allowed macOS to add menu items into LibreOffice Window menu, making it possible to use macOS’s window positioning and arrangement commands, added a CPU architecture prioritisation list for macOS language pack installations and fixed Apple Silicon version being incorrectly reported as iOS in macOS’s System Report
  18. Oliver Specht (CIB) fixed not being able to switch off the page number of page breaks in paragraph dialog and fixed an RTF import issue related to character style properties
  19. László Németh added new options to adjust hyphenation like DTP software in accordance with typographic requirements (end zones), added custom word spacing to control the shrinking and expansion of space width and added min/max word spacing to avoid of rivers of white space and too much hyphenation
  20. Christian Lohmaier (TDF) added Meson support to the build system due to HarfBuzz migrating to it and fixed MSI installer generation on native windows/aarch64
  21. Jonathan Clark (TDF) fixed incorrect line breaking in mixed CJK+Latin text, generated genko yoshi grid layout issues in DOCX files and excessive overlap in justified Arabic script in text boxes
  22. Andreas Heinisch fixed unwanted scrolling in Writer when deleting all comments by an author
  23. Chris Sherlock did code cleanups and refactoring in VCL toolkit
  24. Jean-Pierre Ledure worked on the ScriptForge library
  25. Áron Budea (Collabora) expanded Calc’s support of quote characters in formulas for improved compatibility with MS Excel
  26. Mohamed Ali made master slides/pages copyable in Impress/Draw
  27. Jim Raykowski improved the layout of Hyphenation Sidebar deck, made switching to styles & formatting Spotlight independent of the Sidebar being visible, reworked page and object renaming in the Draw Navigator after Karthik’s work, made Esc key behaviour logical when focused into the Navigator in Draw and fixed opening a context menu unexpectedly ending the editing of bookmark text in the Bookmark dialog
  28. Julien Nabet added support for importing documents encrypted with AES_192_CBC/AES_192_EBC and fixed some crashes
  29. Bayram Çiçek (Collabora) improved MSO compatibility of document protection
  30. Shardul Singh polished the code for his Text Import improvement done in March
  31. David Gilbert implemented support for importing encrypted hybrid PDFs
  32. Heiko Tietze (TDF) made it so the Edit button for fields is only shown in dialogs when it makes sense and started working on a first-run wizard
  33. Juraj Šarinay fixed issues with timestamps in digital signatures
  34. David Hashe added automated tests for image icons and accelerators and Calc’s currency formats
  35. Sarper Akdemir (allotropia) made Notes pane in Impress/Draw support Ctrl+PgUp/Dn for navigation, made it possible to apply Paste Special in Notes pane’s context and allowed list formatting when in Notes pane
  36. Michael Meeks (Collabora) optimised graphics handling
  37. Kurt Nordback (Collabora) started working on support for chart types introduced in MSO 2016 or later, that use the chartex schema
  38. Andras Timar (Collabora) fixed internal Python build for the ppc64le platform
  39. Muhammad Arsalan Khan added support for altChunk elements referencing HTML in DOCX files
  40. Eike Rathke (Red Hat) added Gronings language support and fixed Azerbaijani Manat ₼ (AZN) currency symbol not being displayed in Calc
  41. Samuel Mehrbrodt (allotropia) improved directory pre-selection when using the Export dialog
  42. Pierre Vacher did code cleanups in uno-skeletonmaker
  43. Regina Henschel did cleanups in radial gradient code
  44. Attila Szűcs (Collabora) did some improvements to chart code
  45. Tibor Nagy (allotropia) fixed displaying sparklines in merged cells
  46. Emmanuel Dreyfus (NetBSD) fixed a UNO failure seen with some filesystems
  47. Akshay Dubey worked on supporting zstd decompression
  48. Ilmari Lauhakangas (TDF) made code comments easier to read and understand
  49. Mateusz Wlazłowski fixed an issue with Calc date functions

Kudos to Ilmari Lauhakangas for helping to elaborate this list.

Reported Bugs

406 bugs, 61 of which are enhancements, have been reported by 286 people.

Top 10 Reporters

  1. Eyal Rozenberg ( 17 )
  2. Gabor Kelemen (allotropia) ( 14 )
  3. nobu ( 10 )
  4. Justin L ( 9 )
  5. Aron Budea ( 7 )
  6. Timur ( 6 )
  7. Uralion ( 5 )
  8. Xisco Faulí ( 4 )
  9. golemus ( 4 )
  10. Cameron ( 4 )

Triaged Bugs

344 bugs have been triaged by 74 people.

Top 10 Triagers

  1. m_a_riosv ( 61 )
  2. V Stuart Foote ( 29 )
  3. Olivier Hallot ( 26 )
  4. Buovjaga ( 22 )
  5. meagan.eggert ( 18 )
  6. raal ( 17 )
  7. Mateusz Wlazłowski ( 17 )
  8. Mike Kaganski ( 16 )
  9. Xisco Faulí ( 15 )
  10. Aron Budea ( 9 )

Resolution of resolved bugs

269 bugs have been set to RESOLVED.

Check the following sections for more information about bugs resolved as FIXED, WORKSFORME and DUPLICATE.

Fixed Bugs

107 bugs have been fixed by 31 people.

Top 10 Fixers

  1. Justin Luth ( 6 )
  2. Noel Grandin ( 5 )
  3. Balazs Varga ( 5 )
  4. Aron Budea ( 5 )
  5. Jonathan Clark ( 4 )
  6. Patrick Luby ( 4 )
  7. Sarper Akdemir ( 4 )
  8. Miklos Vajna ( 4 )
  9. László Németh ( 3 )
  10. Olivier Hallot ( 3 )

List of critical bugs fixed

  1. tdf#166107 CRASH: Opening print dialog after print preview ( Thanks to Xisco Fauli )

List of high severity bugs fixed

  1. tdf#45617 Make Impress Master Slides copyable ( Thanks to Mohamed Ali )

List of crashes fixed

  1. tdf#166055 Crash when inserting .mp4 videos in Impress (kf6) ( Thanks to Michael Weghorn )
  2. tdf#166107 CRASH: Opening print dialog after print preview ( Thanks to Xisco Fauli )
  3. tdf#166365 Crash in file picker, directory property ( Thanks to Julien Nabet )

List of performance issues fixed

  1. tdf#147874 HANG: switching to another sheet ( Thanks to Noel Grandin )
  2. tdf#151876 Slow Chart Render open, cpu spike, and view if data point is more than 1000 data point in Calc ( Thanks to Noel Grandin )
  3. tdf#165595 Calc becomes VERY slow scrolling/editing if the default image brightness being adjusted ( Thanks to Noel Grandin )
  4. tdf#166258 Scrolling/Swipping through a document with Skia Metal on is choppy/slow; smooth with Skia Raster ( Thanks to Patrick Luby )

List of old bugs ( more than 4 years old ) fixed

  1. tdf#101625 Conditionally hide the Edit button in edit fields dialog ( Thanks to Heiko Tietze )
  2. tdf#126154 Make space between words configurable to increase readability (minimum, desired and maximum word spacing) ( Thanks to László Németh )
  3. tdf#130592 Incorrect line breaking for CJK text in UI with certain VCL backends ( Thanks to Jonathan Clark )
  4. tdf#132784 Help files do not yet describe Calc’s multi-threading facility ( Thanks to Olivier Hallot )
  5. tdf#136540 Unwanted scroll when deleting all comments by an author ( Thanks to Andreas Heinisch )
  6. tdf#139418 The layout is broken when opening a vertical writing manuscript paper(Genko yoshi) docx file ( Thanks to Jonathan Clark )
  7. tdf#139633 Direct editing of tree nodes in the Navigator to rename objects ( Thanks to Jim Raykowski )
  8. tdf#45617 Make Impress Master Slides copyable ( Thanks to Mohamed Ali )
  9. tdf#55425 PDF import: support encryption algorithm value 4 (AES) ( Thanks to Dr. David Alan Gilbert )

WORKSFORME bugs

45 bugs have been retested by 25 people.

Top 10 testers

  1. Buovjaga ( 5 )
  2. Andreas Heinisch ( 4 )
  3. Olivier Hallot ( 4 )
  4. Jonathan Clark ( 4 )
  5. raal ( 3 )
  6. xordevoreaux ( 2 )
  7. Robert Großkopf ( 2 )
  8. m_a_riosv ( 2 )
  9. Pierre Fortin ( 2 )
  10. Julien Nabet ( 2 )

DUPLICATED bugs

77 bugs have been duplicated by 21 people.

Top 10 testers

  1. V Stuart Foote ( 17 )
  2. m_a_riosv ( 13 )
  3. nobu ( 7 )
  4. Mateusz Wlazłowski ( 5 )
  5. Xisco Faulí ( 4 )
  6. Mike Kaganski ( 4 )
  7. Timur ( 3 )
  8. Gabor Kelemen (allotropia) ( 3 )
  9. Buovjaga ( 3 )
  10. Regina Henschel ( 3 )

Verified bug fixes

16 bugs have been verified by 10 people.

Top 10 Verifiers

  1. BogdanB ( 4 )
  2. Gerald Pfeifer ( 3 )
  3. Buovjaga ( 2 )
  4. Ulrich Windl ( 1 )
  5. Heiko Tietze ( 1 )
  6. m_a_riosv ( 1 )
  7. Hossein ( 1 )
  8. Patrick (volunteer) ( 1 )
  9. Eyal Rozenberg ( 1 )
  10. Timur ( 1 )

Categorized Bugs

211 bugs have been categorized with a metabug by 25 people.

Top 10 Categorizers

  1. Aron Budea ( 36 )
  2. Gabor Kelemen (allotropia) ( 34 )
  3. Eyal Rozenberg ( 33 )
  4. V Stuart Foote ( 29 )
  5. BogdanB ( 14 )
  6. Jonathan Clark ( 13 )
  7. Olivier Hallot ( 10 )
  8. Heiko Tietze ( 8 )
  9. raal ( 6 )
  10. Jeff Fortin Tam ( 5 )

Regression Bugs

28 bugs have been set as regressions by 15 people.

Top 10

  1. Xisco Faulí ( 6 )
  2. Buovjaga ( 4 )
  3. Mateusz Wlazłowski ( 3 )
  4. Saburo ( 2 )
  5. Telesto ( 2 )
  6. m_a_riosv ( 2 )
  7. Gabor Kelemen (allotropia) ( 1 )
  8. mikhail.machine ( 1 )
  9. Timur ( 1 )
  10. Jonathan Clark ( 1 )

Bisected Bugs

33 bugs have been bisected by 14 people.

Top 10 Bisecters

  1. Xisco Faulí ( 6 )
  2. Saburo ( 5 )
  3. Mateusz Wlazłowski ( 4 )
  4. Timur ( 3 )
  5. Juan Q. ( 3 )
  6. Jessica ( 2 )
  7. Buovjaga ( 2 )
  8. raal ( 2 )

by x1sc0 at May 09, 2025 10:36 AM

May 08, 2025

Miklos Vajna

Reinstate for tracked changes in Writer

Writer has the concept of rejecting tracked changes: if a proposed insertion or deletion is not wanted, then one can reject it to push back on the proposal. So far such an action left no trace in the document, which is sometimes not wanted. Calling reinstate on a change behaves like reject, but with history: it reinstates the original state, with the rejected change preserved in the document.

This work is primarily for Collabora Online, but the feature is available in desktop Writer as well.

Motivation

When Alice works on a document to insert e.g. new conditions for a contract, then perhaps Bob is not happy with the proposal. But just rejecting the change "silently" would not be polite: the tracked change then disappears, so possibly Alice thinks it was accepted and Bob didn't communicate the pushback explicitly in the resulting document, either.

Reinstate is meant to improve this interaction: if an insert is reinstated, then an explicit delete is created on top of the insert, so Alice can see that Bob was not happy with the proposal. Or in case Alice proposed a delete, Bob can reinstate that by adding the same content again to the document, without typing the text manually after the delete.

This is a UI feature: the resulting model still only contains inserts and deletes, so it works even with DOCX files.

Results so far

Given an insert:

Reinstate: an insert

Now you can easily create a delete on top of the insert:

Reinstate: a reinstated insert

And given a delete:

Reinstate: a delete

Now you can easily create an insert right after the delete, preserving complex content:

Reinstate: a reinstated delete

As you can see, this creates the opposite of the original change as a new tracked change, so it will in the end still reject the change, but without deleting the original change.

How is this implemented?

If you would like to know a bit more about how this works, continue reading... :-)

As usual, the high-level problem was addressed by a series of small changes. Core side:

Online side:

Want to start using this?

You can get a development edition of Collabora Online 25.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 (25.8).

by Miklos Vajna at May 08, 2025 06:44 AM

April 30, 2025

Marius Popa Adrian

FirebirdSQL introduces support for Windows ARM64 builds

This FirebirdSQL pull request introduces support for Windows ARM64 builds to the Firebird project. The changes cover updates to build scripts, configuration files, and Visual Studio solution/project files to accommodate ARM64 architecture, ensuring compatibility and enabling compilation and functionality on Windows ARM64 platforms.

by Popa Adrian Marius (noreply@blogger.com) at April 30, 2025 11:36 AM

SQL-compliant aliases GREATEST and LEAST for the existing MAXVALUE and MINVALUE functions.

This FirebirdSQL pull request introduces SQL-compliant aliases GREATEST and LEAST for the existing MAXVALUE and MINVALUE functions. These aliases align with the SQL:2023 standard and provide a more intuitive and widely recognized syntax. The changes include updates to documentation, keywords, parser tokens, and system function definitions to support these new aliases.

by Popa Adrian Marius (noreply@blogger.com) at April 30, 2025 07:24 AM

April 18, 2025

LibreOffice Dev Blog

Splash screen with VCL weld – difficultyInteresting EasyHack

As a LibreOffice user, you have certainly seen the LibreOffice splash screen. It is displayed when you open LibreOffice, it has a progress bar, and when loading the application is finished it goes away. Here we discuss a suggested improvement for this splash screen.

Current Implementation Approach

Currently, the splash screen is implemented by creating a custom widget with a custom painting mechanism that draws the splash image and also the progress bar and moves the progress indicator.

This has some drawbacks:

1. The splash screen does not always scale to the same size as the main LibreOffice Window.

2. The style of the progress bar is somehow different from other UI elements, looks mostly like gen interface.

3. It needs and uses a custom paint code.

4. It does not conform to the dark/light theme.

5. It is not easily localize-able. In fact, the only text is from the displayed image, in English. When you build from sources, the image file is instdir/program/intro.png.

LibreOffice splash screen bitmap

LibreOffice splash screen bitmap

6. It is a separate binary (oosplash). You may run it with:

$ ./instdir/program/oosplash
LibreOffice dev splash screen

LibreOffice dev splash screen

VCL Weld Mechanism

I have previously written about VCL weld mechanism, which is based on creating user interface files (.ui) and loading them inside the application.

The weld mechanism greatly reduces the complexity of creating user interfaces, and also improves other aspects of the user interface, including the consistency.

Code Pointers

Most of the code for the current implementation resides in:
desktop/source/splash/splash.cxx.

The SplashScreenWindow class has an custom paint method, SplashScreenWindow::Paint(), which draws the bitmap, and also the progress. A new UI file is needed for this purpose, which should use GtkProgressBar, which will be considered a weld::ProgressBar. VCL then uses appropriate progress bar widget in different graphical plugins of VCL.

You may look into some dialogs like tip of the day to get some insight:

It would be interesting to avoid a separate binary, but it is fine to keep things as is, and just change to use .ui file.

Final Words

The above issue is tdf#166128. If you would like to work on fixing it, you can just follow the Bugzilla link to see more information.

You may also use ideas from a minimal weld application here:

VCL weld: create LibreOffice GUI from design files

by Hossein Nourikhah at April 18, 2025 01:37 PM

April 11, 2025

LibreOffice QA Blog

QA/Dev Report: March 2025

General Activities

  1. LibreOffice 25.2.2 and LibreOffice 24.8.6 were announced on March 27
  2. Stanislav Horáček updated and improved UI and help texts
  3. Gábor Kelemen (allotropia) documented a new field that displays the page count for a range until the next numbering reset
  4. Alain Romedenne expanded help for ScriptForge and other scripting topics
  5. Tomaž Vajngerl (Collabora) reworked slideshow rendering code for robustness and simplicity
  6. Gökay Şatır, Marco Cecchetti and Szymon Kłos (Collabora) worked on LOKit used by Collabora Online
  7. Miklós Vajna (Collabora) implemented per-user change tracking in Writer and fixed unexpected list level change on inserting a new bullet in Writer
  8. Olivier Hallot (TDF) improved the UI and help pages for Calc’s Data Provider and improved help for Calc’s Duplicates command
  9. Xisco Faulí (TDF) added a bunch of new automated tests, upgraded many dependencies and did some code cleanups
  10. Michael Stahl (allotropia) improved the Accessibility Checker, improved MS Word compatibility with hiding empty paragraphs before tables in certain scenarios and fixed an issue with installing custom default templates via extensions
  11. Mike Kaganski (Collabora) greatly improved the performance of font preview in Calc, fixed Calc’s COUNTA() function returning 1 for empty ranges, fixed integer overflow in Writer’s Find & Replace match count, improved the loading speed of Writer documents with lots of bookmarks and tables and made the code for Underline Trailing Spaces compatibility option more robust
  12. Caolán McNamara (Collabora) improved spellchecking performance in multi-language spreadsheets, fixed many issues found by static analysers and did code cleanups and optimisations
  13. Stephan Bergmann (allotropia) worked on the WASM build. He also adapted the code to compiler changes and did code cleanups
  14. Noel Grandin (Collabora) made canvas rendering in Draw more robust, updated Skia through several versions, fixed slow switching of sheets in Calc when lots of drawing objects or lots of formatted cells are involved, improved spellchecking speed in Writer, made it faster to load complex XLSX spreadsheets, made it faster to delete very large tables in Writer, made it faster to load Writer documents with change tracked moves and improved the loading time of certain DOC files. He also did many code cleanups and optimisations
  15. Justin Luth (Collabora) fixed a line spacing issue in table cell content in PPTX files and fixed endnotes and footnotes data becoming lost when roundtripping glossary relations to DOCX
  16. Michael Weghorn (TDF) continued cleaning up and reorganising accessibility-related code, made Quick Find more accessible and made gtk4 file dialog show all the extra controls. He also worked on using native widgets in Qt UIs
  17. Balázs Varga (allotropia) worked on the WASM build, fixed unwanted table border lines in PPTX export, added an accessibility check for links and references in header/footer, fixed Quickstarter being visible in options even if the feature is not installed and made it so the Online Update page is not visible, if the feature was not selected to be installed
  18. Patrick Luby made the macOS Start Center displaying logic more robust, finalised native macOS full screen mode support, made macOS dark/light mode changes apply even without restart (for the most part) and added an expert option to allow macOS trackpad and Magic Mouse users to restore the legacy zoom via Command+swipe gesture
  19. Oliver Specht (CIB) fixed a style inheritance issue in RTF files, added a new field that displays the page count for a range until the next numbering reset, made switching to object rotation mode happen with a single click in Writer and Calc as it already did in Impress and Draw, fixed an issue with losing character attributes in form field elements, added a feature to convert fields into plain text, added handling of page breaks and continuous section breaks before tables in RTF files, made it so page breaks after tables are not ignored in RTF files, fixed formulas in Writer tables not updating when cells change from value to text and improved scrolling behaviour when selecting
  20. László Németh finalised the implementation of HyphenationKeepLine feature
  21. Christian Lohmaier (TDF) fixed arm64 build issues with Skia and pdfium libraries and did build-related cleanups
  22. Jonathan Clark (TDF) fixed kashida positions becoming corrupted during editing in Writer, added support for right-to-left icon variants, implemented DOC/DOCX import support for indentation based on ch units, fixed layout logic for bidirectional text shown in the UI and added a DOC/DOCX compatibility option for space width adjustment in CJK documents
  23. Sahil Gautam (allotropia) added a readme file for the implementation details of themes
  24. Andreas Heinisch made it so the first page is always used as thumbnail in the recent documents view for Draw and Impress documents, made Calc always use the visible sheet for the thumbnail when saving, fixed rendering of fill colours in Calc tables pasted as OLE objects into Impress, made positioning of pasted objects in Draw more robust and synchronised the visual indicator of “From rows” when the property is remembered across CSV imports
  25. Chris Sherlock did code cleanups and refactoring in VCL toolkit
  26. Armin Le Grand (Collabora & allotropia) continued polishing item handling and Cairo Linux rendering reworks
  27. Jean-Pierre Ledure worked on the ScriptForge library
  28. Áron Budea (Collabora) fixed charts getting saved incorrectly to XLSX and made it so incomplete VML drawings will not be saved to XLSX to avoid creating invalid files
  29. Adam Seskunas added a UI test for Warning InfoBar
  30. Rafael Lima fixed an issue with Data Provider preview updates, made the “All” checkbox in Handle Duplicates dialog work as in AutoFilter and fixed a crash when importing CSV data into Data Provider
  31. Jaume Pujantell (Collabora) fixed DOCX compatibility issues with change tracking and made it so the text cursor in Calc no longer jumps after a failed search
  32. Mohamed Ali did refactoring in preparation for making Impress Master Slides copyable
  33. Kohei Yoshida added support for importing Autofilters from MS Excel XML files
  34. Jim Raykowski made Writer Navigator display a tooltip for Heading entries with the outline word and character count that includes all sub-outline words and characters, fixed gtk3 issues with previews not displayed in Chart Colors options and the spotlight view not displaying coloured and numbered boxes beside the names of the styles
  35. Julien Nabet increased the maximum size of a VARCHAR database field from 255 to 16383
  36. Bayram Çiçek (Collabora) continued polishing pivot table XLSX export
  37. Banobe Pascal (Collabora) improved the layout of the Styles Sidebar deck
  38. Bingwu Zhang fixed Skia build issues on LoongArch64 CPU architecture
  39. Shardul Singh fixed images getting squished when resetting cropping, added an option to skip filter settings dialog while adding an “Always Show on Import” checkbox to Calc’s Text Import settings dialog and removed import dialog for normal paste actions in Calc
  40. Ujjawal Kumar added a command to insert a paragraph break before a table and added a “Clear AutoFilter” option to the context menu of Calc cells
  41. David Gilbert implemented support for importing PDFs encrypted with algorithm value 4 (AES)
  42. Heiko Tietze (TDF) made it possible to delete glue points via context menu, added commands to protect image size and position (so they can be activated elsewhere than just the Position and Size dialog) and made it so Print Preview always uses a white background
  43. Taichi Haradaguchi updated ICU library to version 77.1
  44. Karthik Godha added a toggle to show the password in password input dialogs
  45. Pierre Vacher made it possible for uno-skeletonmaker to create Java services in passive registration mode and added support for Java instrumentation
  46. Jan Rheinländer fixed UI glitches seen in the Insert Bookmark dialog in certain UI variants
  47. zllangty fixed PDF import of paths with non-zero fill rules
  48. Muhammad Danish made WinGet config files consistent with new recommendations (related to the build system and development)
  49. Moritz Duge (allotropia) worked on the WASM build
  50. Deepanshu Sharma did refactoring in XLSX import code
  51. Juraj Šarinay improved adbe.pkcs7.sha1 PDF signature verification
  52. David Hashe added an automated test for saving a toolbar to a document
  53. Ahmed Hamed made it possible to customise conditional formatting operators in icon sets
  54. Johann Lorber (Linagora) added a Match Diacritics option to the Quick Find bar
  55. Amin Irgaliev made scrolling pages using a mouse in the print dialog preview more intuitive
  56. Devashish Gupta did refactoring in XLSX import code
  57. Devansh Varshney refactored Windows error helper code
  58. Sarper Akdemir (allotropia) worked on making the Freehand Tool more flexible

Kudos to Ilmari Lauhakangas for helping to elaborate this list.

Reported Bugs

467 bugs, 63 of which are enhancements, have been reported by 313 people.

Top 10 Reporters

  1. Gabor Kelemen (allotropia) ( 20 )
  2. Eyal Rozenberg ( 11 )
  3. Aron Budea ( 9 )
  4. Liz Lee ( 9 )
  5. Olivier Hallot ( 7 )
  6. Rafael Lima ( 7 )
  7. Mike Kaganski ( 6 )
  8. Robert Großkopf ( 6 )
  9. Justin L ( 5 )
  10. Jeff Fortin Tam ( 5 )

Triaged Bugs

488 bugs have been triaged by 72 people.

Top 10 Triagers

  1. Xisco Faulí ( 99 )
  2. m_a_riosv ( 67 )
  3. Buovjaga ( 56 )
  4. V Stuart Foote ( 33 )
  5. raal ( 33 )
  6. Heiko Tietze ( 21 )
  7. Mike Kaganski ( 14 )
  8. jquintanaalvarado ( 10 )
  9. Olivier Hallot ( 10 )
  10. Julien Nabet ( 9 )

Resolution of resolved bugs

359 bugs have been set to RESOLVED.

Check the following sections for more information about bugs resolved as FIXED, WORKSFORME and DUPLICATE.

Fixed Bugs

151 bugs have been fixed by 37 people.

Top 10 Fixers

  1. Oliver Specht ( 15 )
  2. Noel Grandin ( 8 )
  3. Heiko Tietze ( 6 )
  4. Michael Stahl ( 6 )
  5. Balazs Varga ( 6 )
  6. Patrick Luby ( 5 )
  7. Caolán McNamara ( 5 )
  8. Jonathan Clark ( 5 )
  9. Mike Kaganski ( 4 )
  10. Karthik ( 4 )

List of critical bugs fixed

  1. tdf#165487 CRASH in SfxTabDialogController::ResetHdl(weld::Button &) ( Thanks to Samuel Mehrbrodt )

List of high severity bugs fixed

  1. tdf#101142 Print preview picks the color from the document background option (should be wysiwyg even in dark mode) ( Thanks to Heiko Tietze )
  2. tdf#156855 macOS: Applying to light/dark from LibreOffice -> Preferences > View doesn’t properly refresh the UI until restart ( Thanks to Patrick Luby )

List of crashes fixed

  1. tdf#165351 Crash when undoing adding new row in table ( Thanks to Michael Stahl )
  2. tdf#165487 CRASH in SfxTabDialogController::ResetHdl(weld::Button &) ( Thanks to Samuel Mehrbrodt )
  3. tdf#165815 Base – crashes on saving edited table ( Thanks to Noel Grandin )
  4. tdf#165870 Crash when opening PPTX file containing video link to Youtube (qt6 on Linux) ( Thanks to Michael Weghorn )

List of performance issues fixed

  1. tdf#130326 XLSX: Long time for file opens and using 100% of one core of CPU after opening ( Thanks to Noel Grandin )
  2. tdf#131595 Very slow switching between sheets in the attached xlsx document ( Thanks to Noel Grandin )
  3. tdf#136238 Deleting a very very large cross page table (26 pages) very very slow ( Thanks to Noel Grandin )
  4. tdf#141415 DOC: FILEOPEN: Very slow document opening (2-5min instead of 20sec) ( Thanks to Noel Grandin )
  5. tdf#150623 Switching between filled and empty sheets slow (sc::RowHeightContext) ( Thanks to Noel Grandin )
  6. tdf#162343 Slow .svg file opening ( Thanks to Noel Grandin )
  7. tdf#165277 Settings on macOS (Apple Silicon, ARM) freeze the app ( Thanks to Patrick Luby )

List of old bugs ( more than 4 years old ) fixed

  1. tdf#101142 Print preview picks the color from the document background option (should be wysiwyg even in dark mode) ( Thanks to Heiko Tietze )
  2. tdf#123225 Loss of functions in XLSX pivot table’s context menu until refreshed (see comment 18) ( Thanks to Bayram Çiçek )
  3. tdf#124673 why toggle function DrawText, HyperlinkDialog and Horizontal Line ( Thanks to Heiko Tietze )
  4. tdf#128186 Create Native macOS Full Screen Mode ( Thanks to Patrick Luby )
  5. tdf#130326 XLSX: Long time for file opens and using 100% of one core of CPU after opening ( Thanks to Noel Grandin )
  6. tdf#131595 Very slow switching between sheets in the attached xlsx document ( Thanks to Noel Grandin )
  7. tdf#133352 Undo not working properly, blocking formatting of table cell ( Thanks to Oliver Specht )
  8. tdf#134791 UI: Options dialog window is

by x1sc0 at April 11, 2025 09:55 AM

April 08, 2025

Marius Popa Adrian

New FirebirdSQL engine feature : Range-based FOR statement

Here is the description : "The range-based FOR statement is used to iterate over a range of numeric values. The iteration is performed in increasing order when used with TO clause and in decreasing order when used with DOWNTO clause"Syntax[<label> :]  FOR <variable> = <initial value> {TO | DOWNTO} <final value> [BY <by value>] DO      &

by Popa Adrian Marius (noreply@blogger.com) at April 08, 2025 09:17 AM

April 07, 2025

Marius Popa Adrian

Jaybird 6.0.1 and Jaybird 5.0.7 released

We are happy to announce the release of Jaybird 6.0.1 and Jaybird 5.0.7. Both releases provide a number of performance improvements to blob handling, and some bug fixes.We plan to offer more blob performance improvements in upcoming releases of Jaybird 5 and 6, for Firebird 5.0.3 and higher (see also New Article: Data access methods used in Firebird).

by Popa Adrian Marius (noreply@blogger.com) at April 07, 2025 11:11 AM

April 02, 2025

Miklos Vajna

Per-user track changes recording in Writer

Writer has the concept of recording tracked changes or not: if recording, typing into a document or deleting content will create tracked changes of type insertion or deletion. So far this was a per-document setting, but now individual users can enable or disable this as they wish.

This work is primarily for Collabora Online, but the feature is available in desktop Writer as well.

Motivation

When Alice keeps typing and Bob enables change tracking, then surprisingly the typed characters of Alice will form a tracked insertion, which is surprising, since that was not the case a second ago and Alice didn't do anything other than typing.

Giving users a choice if they enable recording for just this user or for all users fixes this problem.

Results so far

Here is how the per-user (technically per-view) tracked changes recording looks like:

Per-view tracked changes recording

As you can see, the user on the left has recording turned on and this doesn't influence the user on the right, while this was not possible before.

How is this implemented?

If you would like to know a bit more about how this works, continue reading... :-)

As usual, the high-level problem was addressed by a series of small changes. Core side:

Online side:

Want to start using this?

You can get a development edition of Collabora Online 25.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 (25.8).

by Miklos Vajna at April 02, 2025 11:33 AM

March 10, 2025

LibreOffice QA Blog

QA/Dev Report: February 2025

General Activities

  1. LibreOffice 25.2.0 was announced on Feb 6. Three weeks later, LibreOffice 25.2.1 was announced on Feb, 27
  2. LibreOffice 24.8.5 was announced on Feb 20
  3. Olivier Hallot (TDF) improved the descriptions of new Calc functions shown in the UI, added a Help button to the Data Provider dialog, added help pages for new Calc functions CHOOSECOLS(), CHOOSEROWS(), VSTACK() and HSTACK(), added a help page for Calc’s Data Provider and improved help for Paste Special as well as labels and business cards
  4. Tomaž Vajngerl (Collabora) continued working on PDF 2.0 support and refactored graphics and animation handling code in VCL toolkit
  5. Miklós Vajna, Rashesh Padia, Darshan Upadhyay, Gökay Şatır, Attila Szűcs, Szymon Kłos (Collabora) worked on LOKit used by Collabora Online. Szymon also improved the user experience of the Currency dropdown by removing the need to click an OK button
  6. Andras Timar (Collabora) fixed an issue with importing WEEKNUM() functions from XLSX files, made Excel style cell reference syntax be respected in non-English UIs and made it so in read-only documents one can’t invoke the Search and Replace dialog, reset cell attributes or fill down cells
  7. Xisco Faulí (TDF) implemented new Calc functions CHOOSECOLS(), VSTACK() and HSTACK(), made UNIQUE() case-insensitive like its counterpart in Excel, added a couple of dozen automated tests, upgraded many dependencies and fixed a crash
  8. Michael Stahl (allotropia) fixed rendering of overlapping tracked formatting and deletions in imported DOCX files, fixed losing tracked changes when paragraph has a frame anchored to it, fixed truncation of tables in sections split across pages and improved compatibility with MS Word in the case of hidden text
  9. Mike Kaganski (Collabora) fixed an issue with the Alt+X Unicode conversion command when following a combining character, fixed Calc’s INFO() function giving unexpected results with some arguments, made BASIC’s Shell() function more robust and implemented a compatibility option for MS Word’s “Underline Trailing Spaces”. He also did many code cleanups and optimisations
  10. Caolán McNamara (Collabora) fixed sheet identifiers going out of sync sometimes with XLSX export, fixed crashes, fixed many issues found by static analysers and did code cleanups and optimisations
  11. Stephan Bergmann (allotropia) worked on the WASM build. He also adapted the code to compiler changes and did code cleanups
  12. Noel Grandin (Collabora) made it faster to load and display XLS and XLSX files with lots of conditional formatting. He also did many code cleanups and optimisations, especially in the area of graphics handling
  13. Justin Luth (Collabora) fixed an Excel compatibility issue with frozen cell zones, fixed unwanted empty paragraphs appearing in headings in DOCX files, fixed tabstops missing from paragraph styles in DOC import and made DOCX metadata compatible with MS Word (Word deviates from the OOXML specification in this area)
  14. Michael Weghorn (TDF) continued cleaning up and reorganising accessibility-related code, made Sidebar, Quick Find and editable comboboxes more accessible, fixed a visual glitch when resizing the window in certain cases affecting Qt-based UIs, fixed an issue with pasting non-latin text from Firefox or Thunderbird affecting Qt-based UIs and fixed crashes and build issues on Android. He also worked on using native widgets in Qt UIs
  15. Balázs Varga (allotropia) optimised the speed of Calc’s SubTotal functions, fixed a data loss issue affecting text box controls and fixed locking down of “Use hardware acceleration” options not always working
  16. Patrick Luby enabled native full screen mode on macOS, helped Sahil in polishing the UI theming rework and fixed macOS and iOS build issues
  17. Oliver Specht (CIB) implemented support for read protection in RTF files, fixed multi-line Docvariable fields being broken in imported DOCX files, made it so border distance in styles gets applied to tables in imported RTF files, fixed renaming list styles causing disconnection from the paragraph style, implemented support for repeated table headers in RTF import, fixed character properties getting wrongly extended in RTF import and fixed unwanted clearing of object state after visiting Impress/Draw options
  18. László Németh improved the inline headings and smart justify features and worked on DOCX support for hyphenate-keep feature
  19. Ilmari Lauhakangas (TDF) reduced the size of Karasa Jaga SVG icon theme by simplifying graphics
  20. Christian Lohmaier (TDF) improved the Windows build setup
  21. Jonathan Clark (TDF) implemented exact and at-least line spacing for CJK text grid in Writer, fixed DOC/DOCX compatibility issues related to CJK grid and fixed a kashida justification issue in Writer
  22. Sahil Gautam (allotropia) continued polishing the Libreoffice Theme rework
  23. Andreas Heinisch made it possible to use the Delete key to remove bitmaps in the Area tab of various dialogs
  24. Chris Sherlock did code cleanups, documentation and refactoring in VCL toolkit
  25. Armin Le Grand (Collabora & allotropia) continued polishing item handling and Cairo Linux rendering reworks
  26. Björn Michaelsen did refactoring in Writer code
  27. Tibor Nagy (allotropia) made it possible to insert AutoText and enable spell checking in sections that are editable in read-only documents and made the PDF export of table caption elements conform to accessibility standards
  28. Jean-Pierre Ledure worked on the ScriptForge library
  29. Áron Budea (Collabora) fixed an issue causing certain presentations with embedded media to fail to open with PowerPoint after saving to PPTX via command line
  30. Adam Seskunas converted a database test from Java to C++
  31. Rafael Lima did cleanups in item handling
  32. Jaume Pujantell (Collabora) fixed unwanted anchoring of a shape to the page when inserted to a DOCX file and made it so the page number is added when saving/loading PDF pages as images
  33. Alexandre Sena Coelho fixed ambiguous sorting in SQL Query Wizard by including table names in ORDER BY clause
  34. Robin Candau and René Engelhard fixed PDF import breakage due to changes in poppler version 25.02.0
  35. Mohamed Ali implemented right-to-left brochure printing in Draw / Impress
  36. Manish Bera improved thread handling in WebDav code
  37. Samuel Mehrbrodt (allotropia) made it so turning off a colour AutoFilter drops the filter settings
  38. Thorsten Behrens (allotropia) made mouse-as-pen status changes be reflected in real time into live Impress slideshows and made it so cli and Firebird intl DLLs are code signed
  39. Kohei Yoshida upgraded mdds and liborcus libraries
  40. Jim Raykowski fixed Writer bookmarks list getting corrupted after sorting and deleting actions, made it so reminder objects will be skipped when copying and pasting text in Writer, fixed inability to deal with font listboxes after increasing font size on the system and made Navigator respect change tracking visibility in the case of deleted headings
  41. Gülşah Köse (Collabora) fixed an issue causing XLS files with command buttons roundtripped as XLSX to not open in Excel
  42. Julien Nabet synchronised Star Database Connectivity (SDBC) API with JDBC 4.3
  43. Bayram Çiçek (Collabora) fixed a pivot table issue when exporting to XLSX
  44. Mohit Marathe (allotropia) fixed unwanted table border lines shown in a certain PPTX file
  45. Pranam Lashkari (Collabora) fixed OOXML import of formulas containing delimiters
  46. Michael Meeks (Collabora) improved thread handling code

Kudos to Ilmari Lauhakangas for helping to elaborate this list.

Reported Bugs

536 bugs, 69 of which are enhancements, have been reported by 330 people.

Top 10 Reporters

  1. Eyal Rozenberg ( 28 )
  2. Justin L ( 26 )
  3. Aron Budea ( 19 )
  4. Gabor Kelemen (allotropia) ( 14 )
  5. Jeff Fortin Tam ( 12 )
  6. Mike Kaganski ( 8 )
  7. Radish ( 8 )
  8. wodsfort ( 7 )
  9. Telesto ( 6 )
  10. Buovjaga ( 6 )

Triaged Bugs

465 bugs have been triaged by 60 people.

Top 10 Triagers

  1. m_a_riosv ( 76 )
  2. Buovjaga ( 70 )
  3. V Stuart Foote ( 44 )
  4. Xisco Faulí ( 35 )
  5. Heiko Tietze ( 27 )
  6. raal ( 22 )
  7. Mike Kaganski ( 19 )
  8. Justin L ( 18 )
  9. Aron Budea ( 15 )
  10. Regina Henschel ( 12 )

Resolution of resolved bugs

354 bugs have been set to RESOLVED.

Check the following sections for more information about bugs resolved as FIXED, WORKSFORME and DUPLICATE.

Fixed Bugs

144 bugs have been fixed by 34 people.

Top 10 Fixers

  1. Oliver Specht ( 13 )
  2. Michael Weghorn ( 8 )
  3. Olivier Hallot ( 7 )
  4. Justin Luth ( 7 )
  5. Armin Le Grand (Collabora) ( 6 )
  6. Mike Kaganski ( 6 )
  7. Balazs Varga ( 5 )
  8. Tibor Nagy ( 5 )
  9. Xisco Fauli ( 5 )
  10. Noel Grandin ( 4 )

List of critical bugs fixed

  1. tdf#164949 Crash on Clone Formatting when selecting more than one table cell ( Thanks to Oliver Specht )
  2. tdf#165099 CRASH: selecting an animation after slideshow ( Thanks to Mike Kaganski )

List of high severity bugs fixed

  1. tdf#120397 FILESAVE doesn’t save all the text in text box control ( Thanks to Balazs Varga )
  2. tdf#153131 Copy causes Calc to Freeze on Windows 11 with Speech Recognition (comment 58) (workaround: comment 73) ( Thanks to Michael Weghorn )
  3. tdf#160252 Editing a conditional format from the Manage dialog changes the range / creates a new one ( Thanks to Armin Le Grand (Collabora) )
  4. tdf#165295 REPORTBUILDER – Report builder freezes when creating a report ( Thanks to Caolán McNamara )

List of crashes fixed

  1. tdf#164072 LibreOffice crashes when deleting all comments (debug) ( Thanks to Michael Weghorn )
  2. tdf#164620 CRASH: selecting all and deleting ( Thanks to Noel Grandin )
  3. tdf#164949 Crash on Clone Formatting when selecting more than one table cell ( Thanks to Oliver Specht )
  4. tdf#165099 CRASH: selecting an animation after slideshow ( Thanks to Mike Kaganski )
  5. tdf#165420 Shell(Empty) crashes ( Thanks to Mike Kaganski )

List of performance issues fixed

  1. tdf#134864 Calc takes a time for XLSX file opening (so many condition formatting rules in the file) ( Thanks to Noel Grandin )

List of old bugs ( more than 4 years old ) fixed

  1. tdf#118465 RTF import does not repeat header / repeat heading / repeat as header row for table ( Thanks to Oliver Specht )
  2. tdf#120397 FILESAVE doesn’t save all the text in text box control ( Thanks to Balazs Varga )
  3. tdf#126824 Most strings in Calc Data Provider shown in English ( Thanks to Olivier Hallot )
  4. tdf#128186 Create Native macOS Full Screen Mode ( Thanks to Patrick Luby )
  5. tdf#133146 Allow [Delete] shortcut to open “Delete Bitmap” dialog in Paragraph Style > Area ( Thanks to Andreas Heinisch )
  6. tdf#134864 Calc takes a time for XLSX file opening (so many condition formatting rules in the file) ( Thanks to Noel Grandin )
  7. tdf#90293 Unify drawing object rotation access by single click ( Thanks to Oliver Specht )

WORKSFORME bugs

51 bugs have been retested by 25 people.

Top 10 testers

  1. V Stuart Foote ( 10 )
  2. Buovjaga ( 6 )
  3. m_a_riosv ( 4 )
  4. Dieter ( 3 )
  5. Regina Henschel ( 3 )
  6. BogdanB ( 3 )
  7. Aron Budea ( 2 )
  8. Olivier Hallot ( 2 )
  9. Samuel Mehrbrodt (allotropia) ( 2 )
  10. Michael Weghorn ( 2 )

DUPLICATED bugs

96 bugs have been duplicated by 26 people.

Top 10 testers

  1. Buovjaga ( 17 )
  2. Xisco Faulí ( 16 )
  3. V Stuart Foote ( 14 )
  4. m_a_riosv ( 13 )
  5. Michael Weghorn ( 6 )
  6. Gabor Kelemen (allotropia) ( 3 )
  7. Saburo ( 3 )
  8. Regina Henschel ( 3 )
  9. Timur ( 2 )
  10. Julien Nabet ( 2 )

Verified bug fixes

22 bugs have been verified by 12 people.

Top 10 Verifiers

  1. Buovjaga ( 4 )
  2. Stéphane Guillou (stragu) ( 4 )
  3. m_a_riosv ( 3 )
  4. Xisco Faulí ( 2 )
  5. Gerald Pfeifer ( 2 )
  6. Telesto ( 1 )
  7. BogdanB ( 1 )
  8. Julien Nabet ( 1 )
  9. Heiko Tietze ( 1 )
  10. Ming Hua ( 1 )

Categorized Bugs

270 bugs have been categorized with a metabug by 27 people.

Top 10 Categorizers

  1. V Stuart Foote ( 52 )
  2. Eyal Rozenberg ( 45 )
  3. Aron Budea ( 38 )
  4. BogdanB ( 27 )
  5. Roman Kuznetsov ( 25 )
  6. Jeff Fortin Tam ( 23 )
  7. Heiko Tietze ( 10 )
  8. Stéphane Guillou (stragu) ( 7 )
  9. Buovjaga ( 4 )
  10. jan d ( 4 )

Regression Bugs

37 bugs have been set as regressions by 10 people.

Top 10

  1. m_a_riosv ( 9 )
  2. raal ( 8 )
  3. Xisco Faulí ( 7 )
  4. Buovjaga ( 4 )
  5. V Stuart Foote ( 3

by x1sc0 at March 10, 2025 12:21 PM

March 06, 2025

allotropia

ZetaJS: Combining Writer & Calc

We’ve added a great new Vue.js-3 ZetaJS demo (source)! It showcases word processing and spreadsheets inside a single web app. Calc is being used as a data source for an HTML app, filling letter templates in Writer. You can even upload custom data spreadsheets or document templates! And have you seen the nice Writer toolbar, all done with Vue.js?

We’ve also updated the existing demos, showcasing Chrome PWA support with the Ping Monitor demo – just click the little install button at the top-right of the address bar, to get the Ping Monitor “installedâ€� on your desktop!

new demo combining Writer, Calc and the complete toolbar

Talks

Meanwhile, our team was giving some great talks about our work for ZetaOffice and LibreOffice. Why not check out the recordings during your lunch break?

ZetaJS & ZetaOffice

FOSDEM LibreOffice DevRoom talks

News clippings

Look, we made some headlines! TheRegister was following up some earlier coverage about the WebAssembly port, after Thorsten gave Liam a demo during FOSDEM. Read up the full article here.

Next up

In case you’re around, meet us in two weeks at the FOSSAsia Summit in Bangkok, where Sarper Akdemir will give an update over our work. Dates are March 13-15.

If you’re based in Europe, you might instead enjoy Thorsten’s talk at the Chemnitz Linux Days (Germany) from March 22-23.

Looking forward to meet you there!

Feedback appreciated!

Please subscribe to our Newsletter or on Mastodon and let us know how you liked ZetaJS and the demos! If you’re playing with the code leave a star at the ZetaJS repo or if you hit any issues please file a report on GitHub.

Or just leave a comment and let us know directly – thanks for reading! 🙂

by Moritz Duge at March 06, 2025 10:30 AM

March 03, 2025

LibreOffice Design Blog

New Templates For You – Your Feedback Matters!

By Ndidi Folasade Ogboi

For the past two months, I’ve been working on adding more templates to LibreOffice Writer as part of my Outreachy project. My goal has been to create functional templates that users need the most.

I created these templates based on what you told us in our survey and your response was incredible!…

by Heiko Tietze at March 03, 2025 01:33 PM

February 26, 2025

Marius Popa Adrian

Firebird 5.0.2 minor release is available

Firebird Project is happy to announce general availability of Firebird 5.0.2 — the latest minor release in the Firebird 5.0 series.This minor release offers bug fixes as well as a few improvements, please refer to the Release Notes for the full list of changes.Binary kits for Windows, Linux, MacOS and Android platforms are immediately available for download.

by Popa Adrian Marius (noreply@blogger.com) at February 26, 2025 10:57 AM

February 17, 2025

LibreOffice Dev Blog

Understanding the existing code to provide better patches

LibreOffice inherits a gigantic code base from its ancestors, StarOffice and OpenOffice. Here I discuss some notes for the newcomers on how to better understand the existing LibreOffice code, and improve the patches.

Studying the Existing Code

As said, LibreOffice is a huge code base, containing ~10 million lines of mostly C++ code. There are different assumptions, conventions and coding styles across ~200 modules that LibreOffice has.

Therefore, it is important to first, study the existing code, through reading and debugging LibreOffice source code, to understand the things that it does, and the way you can implement your ideas, including bug fixes and adding new features.

And although implementing some ideas seem to be straightforward at first sight, it is meaningful to study the details.

Quality Assurance Point of View

First of all, you should understand the thing that you want to implement. No matter if it is a bug, a new feature, or just an EasyHack, you should understand what is requested, what works and what does not work. This requires careful reading of the Bugzilla pages.

User Point of View

Then, you should try to run LibreOffice to understand the exact place in the application where you want to change. LibreOffice user interface has thousands of dialog boxes, so you need to make sure that you understand the thing that you want to do.

Developer Point of View

And at last, you get into implementing something in the code. Here are some questions that you can ask yourself about the details, when reading the existing code:

  • Why this statement is here, in the first place? (detail-oriented view)
    • You can use git blame to see the last author of a specific line
    • You can use git log to study the details by knowing the commit hash
    • What can this part of code actually does?
    • Can I see its effect?
git log

git log

Or, you may be interested in the code behavior in the big picture:

  • What does the code do as a whole? (holistic view)
  • There are many other statements, functions and other constructs in the code. What do they do?
  • What is the overall goal of the code?
  • Can I test that in action?

You can do some small changes, before even getting into implementing your idea:

  • What happens if I remove it? (small changes)
  • Does the removal prevent the code from working?
  • Is it incomplete, or does it actually do something useful, which
  • will be absent if I remove it?

Then, you can work on the actual implementation. Ask yourself:

  • How can I implement the idea in its simplest form? (straightforward change)
  • Does it have side effects?
  • How can I make sure every thing else works as before?
  • How can I write a test for it?

After understanding some of the basic details about the way things work, you may go into improving your implementation.

  • How can I make it better? (sophisticated change)
  • Can I make the code more robust where it is brittle?
  • Can I complete the code where it is incomplete?

Final Notes

These were the questions to give you some ideas of some of the underlying complexities in the code. You can start from small changes to become familiar with these complexities, and then grow to do more complex stuff in the code.

We have various different EasyHacks in LibreOffice, with different difficulty levels. If you are interested in coding, you can always find something that fits you, and grow gradually.

You can read more in these links:

by Hossein Nourikhah at February 17, 2025 10:17 AM

February 11, 2025

LibreOffice QA Blog

QA/Dev Report: January 2025

General Activities

  1. Olivier Hallot (TDF) added help pages for new Calc functions TOROW(), TOCOL(), WRAPROWS(), WRAPCOLS(), EXPAND(), TAKE() and DROP(), added dark mode support to the help interface, improved help for PDF/UA, did cleanups in the Xapian-based search in online help, added help for tables styles in Writer and improved help related to printing
  2. Dione Maddern added a help page for Cell Appearance Sidebar deck
  3. Stanislav Horáček did some cleanups in help
  4. Gábor Kelemen (allotropia) added a detailed list of allowed PDF password characters into help and improved the developer tools for finding unneeded includes and UI strings that might need to be translatable
  5. Tomaž Vajngerl (Collabora) continued working on PDF 2.0 support and document themes and fixed an Excel compatibility issue with empty values of defined names
  6. Miklós Vajna, Andras Timar, Henry Castro, Gökay Şatır, Attila Szűcs, Szymon Kłos and Pranam Lashkari (Collabora) worked on LOKit used by Collabora Online
  7. Xisco Faulí (TDF) implemented new Calc functions, TOCOL, TOROW, WRAPCOLS, WRAPROWS, TAKE, DROP, EXPAND and CHOOSEROWS, added support for setuptools and pip in Python scripting, upgraded many dependencies, added some unit tests and did many code stability improvements
  8. Michael Stahl (allotropia) continued improving the correctness of HTML import regarding formatting and fixed issues with table splitting in Writer’s layout
  9. Mike Kaganski (Collabora) fixed an issue with opening newly-created database forms, fixed Basic isNumeric() function giving incorrect results, fixed an installation issue affecting Active Directory setups on Windows, fixed issues with allowed characters in file name when exporting as PDF, fixed wrong number of results being reported when going over 1000 while executing Find All in Calc, fixed inability to pass a Date object to an UNO API method, fixed an issue with handling of Variant types in Basic, made handling of conditional formatting with colour conditions more robust when moving columns, made intercepting .uno:Open command work again, fixed a crash related to regular expressions in Basic and made SQL queries handle negative values
  10. Caolán McNamara (Collabora) fixed crashes, fixed many issues found by static analysers and did code cleanups and optimisations
  11. Stephan Bergmann (allotropia) worked on the WASM build. He also adapted the code to compiler changes and did code cleanups
  12. Noel Grandin (Collabora) improved the speed of inserting rotated images to Writer. He also did many code cleanups and optimisations
  13. Justin Luth (Collabora) fixed DOCX import issues with frames before tables getting anchored to a table cell instead of an empty paragraph and missing header properties in page styles
  14. Michael Weghorn (TDF) continued cleaning up and reorganising accessibility-related code, did refactoring in Linux printer code and fixed some crashes. He also worked on using native widgets in Qt UIs
  15. Balázs Varga (allotropia) fixed import of cropped vector graphic objects in PPTX files, improved warnings related to allowed characters in the PDF password input dialog, made it possible to show or hide the text in some password dialogs (more to be included), fixed broken cropped SVG files in PPTX import and made it so the size values in Position and Size and Crop tabs in Image Properties dialog are synchronised
  16. Patrick Luby fixed artifacts showing in animated GIFs with Skia UI rendering on macOS, added Quick Look plugins for .od* files on macOS and made it so the Start Center menubar is shown in the default menubar on macOS
  17. Oliver Specht (CIB) made it so the table context menu in Draw/Impress includes hyperlink actions, made scrolling while selecting less hasty, made it so Ctrl+scrollwheel changes the slides per row setting when in View – Slide Sorter in Impress, made the status of numbered and bulleted list toggle state visible in toolbars and menus in Impress/Draw, made it possible to open the Edit Field dialog in read-only Writer documents and fixed losing chart number formatting when copying and pasting the chart
  18. Heiko Tietze (TDF) added a confirmation dialog when deleting all comments in Writer
  19. László Németh fixed loss of images anchored to page in subdocuments of Writer master documents and made bookmark boundary mark labels look cleaner in Writer
  20. Ilmari Lauhakangas (TDF) improved the layout of help and did cleanups in its CSS styles
  21. Christian Lohmaier (TDF) improved the Windows build setup
  22. Eike Rathke (Red Hat) added support for English (Guyana)
  23. Jonathan Clark (TDF) added support for Mongolian while enabling vertical text options for it, made the script type assignment algorithm in the context of mixed Western and Asian text more robust, implemented vertical CJK printing for all fonts on Windows and fixed borders of merged cells in Calc vanishing when changing sheet direction to right-to-left
  24. Sahil Gautam (allotropia) continued polishing the Libreoffice Theme rework
  25. Andreas Heinisch added support for importing inserted text tag “ins” from HTML, made it so the Edit… button in Writer’s Index dialog is disabled, if no concordance file has been selected and added first and secondary keys to the tooltips of index fields
  26. Chris Sherlock did code cleanups in VCL
  27. Laurent Balland did fixes in Lights, Focus, Forestbird, Yellow Idea and Vivid Impress templates
  28. Armin Le Grand (Collabora) did refactoring in item handling
  29. Björn Michaelsen did refactoring in Writer code
  30. David Gilbert added a readme for PDF import code
  31. Tibor Nagy (allotropia) fixed a PDF export accessibility issue and made the Formatting toolbar visible in sections that are marked as editable in read-only documents
  32. Jean-Pierre Ledure worked on the ScriptForge library
  33. Ahmed Hamed added a category to store favorite functions in Calc’s Function Wizard and Functions Sidebar deck
  34. Áron Budea (Collabora) fixed unwanted cell formatting reset upon changing language on a selection in Calc
  35. Adam Seskunas ported a Java test to C++
  36. Rafael Lima made solver’s Sensitivity Report prettier and did cleanups in item handling
  37. Jaume Pujantell (Collabora) fixed unneeded duplication of slide master when exporting to PPTX
  38. Skyler Grey (Collabora) made the iOS app use desktop clipboard code

Kudos to Ilmari Lauhakangas for helping to elaborate this list.

Reported Bugs

418 bugs, 50 of which are enhancements, have been reported by 246 people.

Top 10 Reporters

  1. Justin L ( 20 )
  2. Gabor Kelemen (allotropia) ( 18 )
  3. Aertx ( 12 )
  4. Eyal Rozenberg ( 11 )
  5. Telesto ( 10 )
  6. Aron Budea ( 9 )
  7. Michael Otto ( 8 )
  8. Jeff Fortin Tam ( 8 )
  9. Mike Kaganski ( 7 )
  10. Mihai Vasiliu ( 7 )

Triaged Bugs

362 bugs have been triaged by 67 people.

Top 10 Triagers

  1. BogdanB ( 45 )
  2. Buovjaga ( 37 )
  3. raal ( 37 )
  4. Heiko Tietze ( 28 )
  5. m_a_riosv ( 26 )
  6. V Stuart Foote ( 21 )
  7. Mike Kaganski ( 16 )
  8. Aron Budea ( 11 )
  9. Roman Kuznetsov ( 11 )
  10. Xisco Faulí ( 10 )

Resolution of resolved bugs

347 bugs have been set to RESOLVED.

Check the following sections for more information about bugs resolved as FIXED, WORKSFORME and DUPLICATE.

Fixed Bugs

157 bugs have been fixed by 29 people.

Top 10 Fixers

  1. Mike Kaganski ( 17 )
  2. Xisco Fauli ( 12 )
  3. Olivier Hallot ( 11 )
  4. Jonathan Clark ( 8 )
  5. Oliver Specht ( 7 )
  6. Patrick Luby ( 7 )
  7. Michael Weghorn ( 7 )
  8. Balazs Varga ( 6 )
  9. Noel Grandin ( 5 )
  10. Michael Stahl ( 5 )

List of critical bugs fixed

  1. tdf#164185 View -> Boundaries is turned off by default making it impossible to move image + caption frame ( Thanks to Ilmari Lauhakangas )

List of high severity bugs fixed

  1. tdf#164127 [Crash] Crash on returning to dialog window after switching to document while editing Basic-IDE dialog controls ( Thanks to Michael Weghorn )
  2. tdf#164640 List bullets formatting changed ( Thanks to Noel Grandin )
  3. tdf#164855 Crash while centering table contents ( Thanks to Balazs Varga )
  4. tdf#35361 [feature request: macOS] Support Apple Quick Look plugin ( Thanks to Patrick Luby )

List of crashes fixed

  1. tdf#156348 Crash if change in formatting in Writer by converting text to table with field variable ( Thanks to Michael Stahl )
  2. tdf#159377 CRASH at undo at after pasting table in footer (swlo!SwFormatFootnote::SetNumStr+0x3e26:) ( Thanks to Michael Stahl )
  3. tdf#160770 Crashes on second access of regex matches without VBA support option ( Thanks to Mike Kaganski )
  4. tdf#163335 Linux (qt6): crash whenever selecting text using cursor or keyboard going from right to left ( Thanks to Michael Weghorn )
  5. tdf#164127 [Crash] Crash on returning to dialog window after switching to document while editing Basic-IDE dialog controls ( Thanks to Michael Weghorn )
  6. tdf#164130 LibreOffice Calc crashes when doing a lookup in a sheet with a space in its name ( Thanks to Henry Castro )
  7. tdf#164179 Crash when switching the Short Name in Bibliography Entry dialog ( Thanks to Vojtěch Doležal )
  8. tdf#164620 CRASH: selecting all and deleting ( Thanks to Noel Grandin )
  9. tdf#164621 CRASH: pasting content ( Thanks to Oliver Specht )
  10. tdf#164783 Libreoffice crashes when clicking on grid form column header or in empty space below rows, gtk3+a11y ( Thanks to Michael Weghorn )
  11. tdf#164855 Crash while centering table contents ( Thanks to Balazs Varga )
  12. tdf#164899 [CRASH] LO crashes upon opening file with macro when the Tabbed interface is used ( Thanks to Michael Weghorn )

List of performance issues fixed

  1. tdf#137848 Inserted image slow (15 seconds, expected 3) ( Thanks to Noel Grandin )
  2. tdf#164853 unusual copy seen in find_if ( Thanks to Caolán McNamara )

List of old bugs ( more than 4 years old ) fixed

  1. tdf#105083 Impress: The numbered/bulleted list toggle button and menu items aren’t highlighted when a numbered/bullet list is active ( Thanks to Oliver Specht )
  2. tdf#117946 Impress: Slide Sorter: Ctrl+mouse wheel should change slides per row ( Thanks to Oliver Specht )
  3. tdf#121119 Loss of image anchored to page in a writer master document ( Thanks to László Németh )
  4. tdf#130672 base sql query parameter with negative value fails ( Thanks to Mike Kaganski )
  5. tdf#132770 Underline text using INS tag from HTML document do not appear ( Thanks to Andreas Heinisch )
  6. tdf#137848 Inserted image slow (15 seconds, expected 3) ( Thanks to Noel Grandin )
  7. tdf#34837 Merged Cell’s borders vanishes when changing sheet direction to (Right-To-Left) ( Thanks to Jonathan Clark )
  8. tdf#35361 [feature request: macOS] Support Apple Quick Look plugin ( Thanks to Patrick Luby )
  9. tdf#37507 Vertical scrolling with mouse cursor is too fast to control ( Thanks to Oliver Specht )
  10. tdf#41775 Don’t remove all menus when no windows are open – keep Tools and Help ( Thanks to Xisco Fauli )
  11. tdf#50743 FORMATTING: Highlighting scrolls automatically ( Thanks to Oliver Specht )
  12. tdf#66791 FORMATTING: Incorrect application of “Asian text font” for quotation marks when the paragraph contains a mixture of western and asian characters ( Thanks to Jonathan Clark )
  13. tdf#94193 Installer forces AD domain users in Administrators group to run as Administrator, otherwise custom actions are disallowed during execution stage and not completed ( Thanks to Mike Kaganski )

WORKSFORME bugs

54 bugs have been retested by 29 people.

Top 10 testers

  1. BogdanB ( 11 )
  2. raal ( 5 )
  3. V Stuart Foote ( 4 )
  4. Andreas Heinisch ( 3 )
  5. Timur ( 3 )
  6. Buovjaga ( 3 )
  7. Regina Henschel ( 2 )
  8. Aron Budea ( 2 )
  9. m_a_riosv ( 2 )
  10. Eduardo ( 1 )

DUPLICATED bugs

66 bugs have been duplicated by 26 people.

Top 10 testers

  1. Buovjaga ( 8 )
  2. Aron Budea ( 7 )
  3. BogdanB ( 6 )
  4. V Stuart Foote ( 6 )
  5. Gabor Kelemen (allotropia) ( 5 )
  6. m_a_riosv ( 5 )
  7. Jonathan Clark ( 3 )
  8. Roman Kuznetsov ( 3 )
  9. Timur ( 2 )
  10. Justin L ( 2 )

Verified bug fixes

22 bugs have been verified by 13 people.

Top 10 Verifiers

  1. Buovjaga ( 4 )
  2. Gerald Pfeifer ( 3 )
  3. BogdanB ( 2 )
  4. Aron Budea ( 2 )
  5. Piotr Osada ( 2 )
  6. Xisco Faulí ( 2 )
  7. Michael Weghorn ( 2 )
  8. Timur ( 1 )
  9. Alex Thurgood ( 1 )
  10. Regina Henschel ( 1 )

Categorized Bugs

354 bugs have been categorized with a metabug by 28 people.

Top 10 Categorizers

  1. Roman Kuznetsov ( 128 )

by x1sc0 at February 11, 2025 04:18 PM

January 30, 2025

LibreOffice Dev Blog

Custom message boxes using VCL Weld

When you want to interact with users, sometimes simple dialog boxes are sufficient: a simple yes or no, or some info box. But in other cases, you may need more complex message boxes. Here I discuss how to use VCL Weld to create a custom one.

Simple Message Box

You can create a simple message box, using predefined templates like Info box using a code snippet like this:

std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(pParent, VclMessageType::Question, VclButtonsType::YesNo, u"Are you sure?"_ustr));
xInfoBox->run();

And, this is the result, which is very simple, without any title bar:

Yes / No message box

Yes / No message box

There are other predefined types, which can be used in different scenarios:

enum class VclMessageType
{
    Info,
    Warning,
    Question,
    Error,
    Other
};

But, if you want custom message boxes, you should be using weld mechanism, with its CreateBuilder function.

Custom Message Boxes

Below is the code from the source code sfx2/source/doc/QuerySaveDocument.cxx, which is inside sfx2 (framework) module. This dialog box is accessible across different modules, including Writer, Calc and Draw/Impress.

Let’s look into the code:

short ExecuteQuerySaveDocument(weld::Widget* _pParent, std::u16string_view _rTitle)
{
    ...
    std::unique_ptr<weld::Builder> xBuilder(
        Application::CreateBuilder(_pParent, u"sfx/ui/querysavedialog.ui"_ustr));
    std::unique_ptr<weld::MessageDialog> xQBox(
        xBuilder->weld_message_dialog(u"QuerySaveDialog"_ustr));
    xQBox->set_primary_text(xQBox->get_primary_text().replaceFirst("$(DOC)", _rTitle));
    return xQBox->run();
}

The code is using a UI file, named sfx/ui/querysavedialog.ui to create a message dialog, and then change the title of it.

QuerySaveDialog

QuerySaveDialog

If you look into the include file, include/vcl/weld.hxx inside Builder class, you may see functions like weld_… that are suitable to find various different UI elements from the UI, by mentioning the element ID. For example, to find a label with the ID equal to lable_id, you do this:

std::unique_ptr<weld::Label> m_pTextLabel label = m_xBuilder->weld_label(u"label_id"_ustr)

Result

This is the result, when you try to close an unsaved document.

QuerySaveDialog running

QuerySaveDialog running

Alternative Ways

This is not the only way you can create nice dialog boxes using VCL weld mechanism. There are some predefined message boxes that look nice which use weld mechanism, and are available for use via relevant C++ classes.

An interesting one here, is the QueryDialog, which is created by a factory method design pattern.

It uses a predefined dialog, using cui/uiconfig/ui/querydialog.ui as the UI file, and it contains a nice stock image! You can test it easily, by modifying a LibreOffice example, minweld.

IMPL_LINK_NOARG(TipOfTheDayDialog, OnNextClick, weld::Button&, void)
{
    VclAbstractDialogFactory* pFact = VclAbstractDialogFactory::Create();
    auto pDlg = pFact->CreateQueryDialog(getDialog(), u"Tips"_ustr, u"Tip of the day"_ustr, u"Are you sure you want to see the next tip of the day?"_ustr, false);
    sal_Int32 nResult = pDlg->Execute();
    pDlg->disposeOnce();

    if(nResult == RET_YES)
    {
        ++m_nCounter;
        m_pTextLabel->set_label(u"Here you will see tip of the day #"_ustr
+ OUString::number(m_nCounter) + ".");
    }
}

Assuming that you have a working build of LibreOffice, you can simply run the minweld workbench by invoking:

./bin/run minweld

The result looks much more interesting:

QueryDialog

QueryDialog

Final Words

The possibilities are endless! It only depends on your ideas and understanding of the user’s needs and requirements. It would be good if you look into what design team does to understand the design process:

by Hossein Nourikhah at January 30, 2025 03:01 PM

January 16, 2025

LibreOffice Dev Blog

Outlook for the new year 2025

Happy new year 2025! I wish a great year for you, and the global LibreOffice community. Now that we are now in 2025, I briefly discuss the year 2024 and outlook for 2024 in the development blog.

LibreOffice Conference 2024, Luxembourg

LibreOffice Conference 2024, Luxembourg

At The Document Foundation (TDF), our aim is to improve LibreOffice, the leading free/open source office suite that has millions of users around the world. Our work is community-driven, and the software needs your contribution to become better, and work in a way that you like.

My goal here, is to help people understand LibreOffice code easier, and eventually participate in LibreOffice core development to make LibreOffice better for everyone. In 2024, I wrote 22 posts around LibreOffice development in the dev blog (4 of them are unpublished drafts).

Outlook For the New Year

Focus of the development blog for 2025 in this blog will be:

  • Introducing new EasyHacks
  • Describing user interface creation with VCL
  • Explaining LibreOffice architecture
  • Explaining Python interaction with LibreOffice

I have written about some of these topics in 2024. Therefore, this year I will try to expand the previous writings and provide new articles about them. For example, creating user interfaces using VCL with the help of glade interface designer will be one of important things to discuss.

You can give feedback by writing a comment here, or sending me an email to hossein AT libreoffice DOT org.

We provide mentoring support to those who want to start LibreOffice development. You are welcome to contact me if you need help to build LibreOffice and do some EasyHacks via the above email address. Also, you can always refer to our Getting Involved Wiki page:

Let’s hope a great year for LibreOffice (and the world) in 2025.

by Hossein Nourikhah at January 16, 2025 02:29 PM

January 13, 2025

LibreOffice Design Blog

Results from a survey about Writer templates

By Ndidi Folasade Ogboi

LibreOffice Writer has long been a trusted tool for users worldwide, offering an open-source solution for documents. But what happens when we take a step back and look at the user experience? How do templates fit into the workflows of users, what makes a great template and where do users want LibreOffice writer to improve?…

by Heiko Tietze at January 13, 2025 10:06 AM

January 08, 2025

Miklos Vajna

Ignoring the paragraph margin at the top of pages in Writer

Writer has the concept of paragraph margins and page margins, but what happens when you combine the two? It turns out the expectation is that sometimes the top paragraph margin is ignored in this case. We'll see two cases where the behavior of Writer is now improved to better match Word in this regard.

This work is primarily for Collabora Online, but the feature is available in desktop Writer as well.

Motivation

As described in a previous bugreport, there was a first problem where Word ignored the top paragraph margin of a document, but Writer did not. A recent bugreport then pointed out that the first implementation went too far and now a wanted top margin was ignored. This lead to a set of conditions which now does a decent emulation of Word's rules in this regard.

Results so far

Here is the old Writer render result for a document where the top margin should be ignored:

Bugdoc: old Writer render

And here is the new Writer render result for a document where the top margin is ignored:

Bugdoc: new Writer render

Finally, the reference render result, showing the ignored top paragraph margin:

Bugdoc: reference render

As you can see, now the unwanted top paragraph margin is omitted at page top.

How is this implemented?

If you would like to know a bit more about how this works, continue reading... :-)

As usual, the high-level problem was addressed by a series of small changes:

Want to start using this?

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 (25.2).

by Miklos Vajna at January 08, 2025 08:53 AM

December 20, 2024

LibreOffice Design Blog

LibreOffice Themes will replace the color customization

Since the first implementation of a dark color theme we continuously improved the customization of LibreOffice. In a GSoC projects this year, Sahil Gautam made it possible to not only change the application colors but also what is defined by the operating system respectively the desktop environment.…

by Heiko Tietze at December 20, 2024 12:55 PM

December 04, 2024

Miklos Vajna

Editeng RTF export: fixing a lost paragraph style

Impress shape text doesn't have much support for styles, e.g. the default UI in Writer gives you a paragraph style dropdown, and you don't get the same in Impress. Still, a paragraph style is attached to bullets based on their outline level, and Impress has a View → Outline menu item to give you that styled text you can copy. Pasting that to Writer started to lose styles recently and it's now fixed to work again.

This work is primarily for Collabora Online, but the feature is available in desktop Impress as well.

Motivation

As described in a previous commit, I had a case where lots of not needed paragraph styles were exported to RTF in case an Impress document had enough master pages. The idea was to only export actually used paragraph styles, to avoid wasting CPU power.

Turns out filtering out paragraph styles has to happen at two locations:

  • in the style table to assign an index to a paragraph style
  • when referring to those styles

The problem was that unused styles were removed from the style table, but not from the style → index mapping, so as soon as you had both used and unused paragraph styles, the declared and the referred style indexes didn't match anymore.

Results so far

Here is a sample paste result in Writer, where you can see that the text doesn't have a custom paragraph style:

Bugdoc: old Writer paste

And here is the same paste, now with paragraph styles restored:

Bugdoc: new Writer paste

As you can see, now the pasted text has paragraph styles.

How is this implemented?

If you would like to know a bit more about how this works, continue reading... :-)

The bugfix commit was editeng RTF export: fix broken offsets into the para style table.

The tracking bug was tdf#163883.

Want to start using this?

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 (25.2).

by Miklos Vajna at December 04, 2024 10:34 AM

November 29, 2024

Chris Sherlock

The mess that is the VCL

 Let me count the ways, in no particular order and in no way exhaustive:

  • OutputDevice is the base class for printing, windowing and PDFs. It doesn't just do output. 
  • OutputDevice has GetOutDevType() because the base class needs to know what child class is using it. Ugh. 
  • OutputDevice drawing primitives not only draw, but they record a metafile. There are literally functions that turn off drawing and just let it record the metafile. I made an attempt at seperating the concerns, but it got nowhere. 
  • VCL relies on DrawingLayer and DrawingLayer relies on the VCL. 
  • There is a concept of a VirtualDevice, which is derived from OutputDevice. VirtualDevice does a bunch of things, but one of which is alpha-handling. In OutputDevice, there is a member which is a VirtualDevice. Each drawing function in Outputdevice calls upon the correlated drawing function in this member VirtualDevice.
  • Bitmaps don't get modified via the Bitmap class. Instead, you have to use BitmapInfoAccess, BitmapReadAccess and BitmapWriteAccess. I'm still puzzling out why these are seperate classes. 
  • Bitmaps are transformed in SalGraphics indirectly via OutputDevice. Except when they aren't, in which case it fails, whereby OutputDevice tries an alternative way via SalGraphics. Otherwise, it tries its own poor man approach at drawing the bitmap. Consequently, often times you bypass the platform optimized ways of doing things, because its not been implemented.
  • Fonts are lazy loaded from OutputDevice. There is no central font manager. To get the fonts, you have to go through SalGraphics. To get a SalGraphics, you need to initialize a lot of stuff not related to fonts. 
  • Font caching is done from OutputDevice. Lazily. Font data is updated for all frames. Frames are a concept needed for Windows. Frames are not a concept needed by Printers and VirtualDevices, or even PDFs. Note that Printers, VirtualDevices and PDFs all inherit from OutputDevice. 
  • OutputDevice converts between "logical" units and display units. It's a nightmare to know what each function needs what sort of units. For the mapping between units, I refer you to vcl/source/gdi/mapmod.cxx and vcl/source/outdev/map.cxx
  • There is tools and basegfx. They do the same thing, though basegfx is considerably better written. You have Size and B2DSize, Point and B2DPoint, Polygon and B2DPolygon, PolyPolygon and B2DPolyPolygon. OutputDevice must handle it all. 
  • Gradient handling is sort of half baked in OutputDevice, much of gradient handling is done in other modules. 
  • Font substitution is truly, truly weird. PhysicalFontSelect::FindFontFamilyByAttributes() has clearly got a bug in it - (e.g. ImplFontAttrs::None == ((nSearchType ^ nMatchType) & ImplFontAttrs::Rounded an XOR?) and it is a truly strange weighting scheme. Yes, I did try to untangle that beast with proper unit tests, but gave up after being told I was being unreasonable. 
  • There is VCL, canvas, cppcanvas and drawinglayer. drawinglayer is way better than VCL, but we are stuck with VCL for everything. 
  • Consider the following Window hierarchy: WorkWindow inherits from SystemWindow, which inherits from Window. Window holds an OutputDevice to do stuff. WindowOutputDevice derives from OutputDevice. This is needed because OutputDevice often needs to know if it is doing Window operations, via WindowOutputDevice. Try untangling this in your head.
  • Text layout is its own beast, and has its own set of classes. A lot of text layout is worked out in OutputDevice. 
  • Text layout is done via OutputDevice::ImplLayout(). I present to you the ImplLayout function signature:

        std::unique_ptr<SalLayout> ImplLayout(
            const OUString&, sal_Int32 nIndex, sal_Int32 nLen, const Point& rLogicPos = Point(0, 0),
            tools::Long nLogicWidth = 0, KernArraySpan aKernArray = KernArraySpan(),
            std::span<const sal_Bool> pKashidaArray = {}, SalLayoutFlags flags = SalLayoutFlags::NONE,
            vcl::text::TextLayoutCache const* = nullptr, const SalLayoutGlyphs* pGlyphs = nullptr,
            std::optional<sal_Int32> nDrawOriginCluster = std::nullopt,
            std::optional<sal_Int32> nDrawMinCharPos = std::nullopt,
            std::optional<sal_Int32> nDrawEndCharPos = std::nullopt) const; 
     

by Chris Sherlock (noreply@blogger.com) at November 29, 2024 10:58 PM

November 26, 2024

allotropia

Precision-engineering for JavaScript

This post is about recent improvements for ZetaJS, the JavaScript wrapper library for ZetaOffice’s WebAssembly version of LibreOffice:

There is something of a mismatch between the UNO type system and the JavaScript types used by zetajs. For example, JavaScript only has a single number type for both integer and floating point values, while UNO has a whole slew of different numeric types (BYTE, SHORT, UNSIGNED SHORT, LONG, UNSIGNED LONG, FLOAT, DOUBLE) that all map to that one JavaScript type. Similarly, the different UNO sequence<T> types all map to JavaScript arrays, where information about the UNO element type T is lost.

Normally, that’s not an issue. When you call a UNO method that returns a LONG, you get a number just like when you call a UNO method that returns a DOUBLE, and your JavaScript code then has a number to work with, and that’s all. Similarly, when you call a UNO method that returns a sequence<LONG>, you get an array of numbers you can work with, just like when you call a UNO method that returns a sequence<DOUBLE>. And when you then call a UNO method that takes a seaquence<LONG> as an argument, you pass in an array of numbers, and the zetajs runtimes figures out how to dress that array up as a UNO sequence<LONG>, and all is well.

However, one place where UNO’s insistance on more precise typing gets in the way is the UNO ANY type. It is not just a means to transport any kind of UNO value, it also carries precise type information. A UNO ANY value that contains a LONG of value 1 is something different than a UNO ANY vlaue that contains an UNSIGNED LONG of value 1. And a UNO ANY value that contains a reference of type css.uno.XInterface to some UNO object is something different than a UNO ANY value that contains a reference of type css.lang.XComponent to the same UNO object.

Again, most of the time, those precise distinctions are irrelevant to most of the code. When you call a UNO method that returns an ANY, and you know that that ANY value must contain a LONG, you just want to get a JavaScript number out, regardless of what precise numeric UNO type was encoded in that ANY value. Similarly, when you call a UNO method that returns an ANY that must contain a css.uno.XInterface reference, you just want to get some JavaScript object that you can do further UNO method calls on (or null), regardless of what precise UNO interface type was encoded in that ANY value. And when you then call a UNO method that takes an ANY that must contain a LONG, you want to just pass in a JavaScript number, and the zetajs runtime shall figure out how to dress that up as a UNO ANY containing a LONG (or throw an exception, if you passed something that just can’t be dressed up accordingly).

But, sometimes, you need more fine-grained control. There might be a UNO method that takes an ANY argument and behaves completely differently when you pass it a LONG of value 1 or an UNSIGNED LONG of value 1. But when you call that UNO method with the JavaScript number 1, zetajs will always dress that up as a UNO ANY of type LONG for you, never as an UNSIGNED LONG. To solve that issue, the zetajs UNO binding also has the notion of a zetajs.Any JavaScript type, which records a value along with its precise UNO type. You can thus pass either a new zetajs.Any(zetajs.type.long, 1) or a new zetajs.Any(zetajs.type.unsigned_long, 1) when you call that picky UNO method.

Now, when a UNO method returns an ANY value, the zetajs binding used to be conservative: You might want to know exactly what UNO type it contains (even though, most of the time you don’t actually care), so it always returned those wrapped zetajs.Any objects that carry the precise contained UNO type. But that lead to awkward code. When you call e.g. x.nextElement() to get a UNO ANY that contains a reference to another UNO object, you had to unwrap that first (with zetajs.fromAny) before you could do any further calls on the obtained UNO object: zetajs.fromAny(x.nextElement()).doSomething(). But you know that this call to x.nextElement() will return an ANY containing an interface reference, and you don’t care about the exact UNO interface type—you just want to do another method call on the obtained object.

So, recently (in Let zetajs return unwrapped ANY representations), the zetajs binding was changed so that it now always returns unwrapped UNO ANY values: x.nextElement() no longer returns a zetajs.Any wrapper (on which you would need to call zetajs.fromAny first), it directly returns the relevant JavaScript object. And the resulting overall code looks way better: x.nextElement().doSomething().

When, in the other direction, you pass something into a UNO method that takes an ANY argument, you still have the same options you had before: Either, you simply pass the JavaScript number 1, and zetajs figures out for you that that should be dressed up as a UNO ANY of type LONG, or you want to be picky and pass in either a new zetajs.Any(zetajs.type.long, 1) or a new zetajs.Any(zetajs.type.unsigned_long, 1).

And when it comes time that you do want to be picky about the ANY values that you obtain as return values from UNO method calls, there’s now a $precise way to do that: x.$precise.nextElement() (and same for any other UNO method call) will always give you back a wrapped zetajs.Any value. See the updated The zetajs UNO Mapping for all the details.

by allotropiasoft at November 26, 2024 09:00 AM

November 22, 2024

LibreOffice Dev Blog

VCL weld: create LibreOffice GUI from design files

LibreOffice uses VCL (Visual Class Library) as its internal widget toolkit to create the graphical user interface (GUI) of LibreOffice. Here I discuss how to use UI files designed with Glade interface designer to create LibreOffice user interfaces with a framework called weld, which is part of LibreOffice core source code.

Creating a Minimal VCL Weld Application

In my previous blog post, you can find out about the structure of a minimal VCL application. Please refer to the below blog post to see how a Window is created in VCL, and how it can be used as a test workbench called minvcl. You can run it with ./bin/run minvcl after you build LibreOffice.

VCL application in its minimal form

Here I discuss how to go further, and create user interface with Glade interface designer, and do most of the things without writing code.

VCL Weld Mechanism

In order to simplify user interface creation in LibreOffice, experienced LibreOffice developer, Caolán, has introduced a mechanism to load UI files created with Glade interface designer, and use them as if they are UI files for each and every GUI framework that LibreOffice supports: from GTK itself to Qt, Windows, macOS and even the so-called gen backend that only requires the X11 library on Linux.

To illustrate how the VCL weld mechanism works, I have added a minimal example, minweld, as a test workbench. The structure of the code is very similar to the previous example, minvcl, but there are some changes in the code. In the new code, UI is created from a .ui file that is designed visually with Glade interface designer. The .ui file is an XML file which contains placement of widgets that should be displayed on the screen.

The complete code for minweld is available in the LibreOffice core source code repository, which can also be viewed online:

Glade UI File

In minweld, I have used an existing Glade UI file, tipofthedaydialog.ui. This is the user interface for displaying a tip of the day in LibreOffice at startup. Heiko, the TDF design mentor, has discussed this dialog box in detail before:

Easyhacking: How to create a new “Tip-Of-The-Day” dialog

But, you can assume that it is a simple .ui file, that one can create with Glade. Here, we use it to create our own user interface in C++. You may use any other .ui file that you have created with almost the same code.

Tip of the day displayed at LibreOffice startup

Tip of the day displayed at LibreOffice startup

This UI file is found in cui/uiconfig/ui/tipofthedaydialog.ui, and minweld loads it. This is how it looks when you open it in Glade interface designer:

tipofthedaydialog.ui in Glade user interface designer

tipofthedaydialog.ui in Glade user interface designer

Let’s look into the specifics of minweld.cxx.

Header Includes

Headers are almost the same, but here we use vcl/weld.hxx instead of vcl/wrkwin.hxx. Therefore, you can see this line in the code:

#include <vcl/weld.hxx>

Then we have the C++ code for the application. The TipOfTheDayDialog class is defined with:

class TipOfTheDayDialog : public weld::GenericDialogController
{
public:
    TipOfTheDayDialog(weld::Window* pParent = nullptr);
    DECL_LINK(OnNextClick, weld::Button&, void);

private:
    std::unique_ptr<weld::Label> m_pTextLabel;
    std::unique_ptr<weld::Button> m_pNextButton;
    sal_Int32 m_nCounter = 0;
};
...
}

As you can see, TipOfTheDayDialog inherits from weld::GenericDialogController, and not Application class as before. Also, TipOfTheDayDialog constructor receives a parent of type weld::Window*, which is nullptr now. The reason is that there is no parent window in this example. Using weld:: prefix is also done for other types of widgets that we use in LibreOffice. For example, we use weld::Button to denote a push button in LibreOffice, or in any application that is created with the vcl::weld mechanism.

Class Constructor

This is the code for the TipOfTheDayDialog constructor. Here, we initialize two member variables, m_pTextLabel and m_pNextButton which point to a label and a button, respectively. We will interact with these two in our code. There are string literals like lbText and btnNext , which are the IDs of those widgets in Glade. The IDs should be unique for linking to specific variables in the code.

TipOfTheDayDialog::TipOfTheDayDialog(weld::Window* pParent)
: weld::GenericDialogController(pParent, u"cui/ui/tipofthedaydialog.ui"_ustr,
u"TipOfTheDayDialog"_ustr)
, m_pTextLabel(m_xBuilder->weld_label(u"lbText"_ustr))
, m_pNextButton(m_xBuilder->weld_button(u"btnNext"_ustr))
{
    m_pNextButton->connect_clicked(LINK(this, TipOfTheDayDialog, OnNextClick));
}

One last step is linking the events with functions in the code. You may do that with the LINK macro. In the last line, connect_clicked activates OnNextClick from the class TipOfTheDayDialog, whenever m_pNextButton is clicked.

Event Handler

This is the implementation of the event handler. It should be started with IMPL_LINK macro, in the form of IMPL_LINK_NOARG(Class, Member, ArgType, RetType). The code is straightforward: It increases a counter which is initially zero, and displays it alongside a text:

IMPL_LINK_NOARG(TipOfTheDayDialog, OnNextClick, weld::Button&, void)
{
    ++m_nCounter;
    m_pTextLabel->set_label(u"Here you will see tip of the day #"_ustr
+ OUString::number(m_nCounter) + ".");
}

With a call to set_label function, m_pTextLabel is updated every time that you click on “Next Tip” button.

Running the Example

You may run the example after you have built LibreOffice from sources. Then, you may simply invoke:

./bin/run minweld

The result is a little bit different from the tipoftheday dialog in LibreOffice, as it does not use a picture. But, it has a nice feature: if you click on “Next Tip”, it will show a text and a counter that goes up whenever you click on it again.

Final Notes

You may look into the original “tip of the day” dialog box in cui/source/dialogs/tipofthedaydlg.cxx, which is more complex than the one that we created here, as it reads some data from the configuration and uses images. But, the idea is the same. Inherit a class from GenericDialogController, define and link variables to the widgets with their IDs, add event handlers. Now, the application with VCL graphical user interface is ready to use!

This is somehow similar to the way one creates dialog boxes with Qt and other widget toolkits. On the other hand, the VCL weld mechanism is different in the way that it uses such a toolkit to create UI on the fly. Therefore, if you choose a desired VCL UI plugin, then it will use that specific library for creating user interface. For example, you can run minweld example with Qt this way:

export SAL_USE_VCLPLUGIN=qt5

./bin/run minweld
The minweld example in Qt (light theme)

The minweld example in Qt (light theme)

You may also run it with GTK3 UI, this way:

export SAL_USE_VCLPLUGIN=gtk3

export GTK_THEME=Adwaita:light # For light/dark theme

./bin/run minweld
The minweld example in GTK3 (light theme)

The minweld example in GTK3 (light theme)

I hope that this explanation was helpful for you to understand the basics of GUI design and implementation in LibreOffice. You can try doing small improvements in LibreOffice GUI by looking into the EasyHacks that with the tag “Design“:

TDF Wiki: EasyHacks categorized by “Design” as the required skill

We welcome your code submissions to improve LibreOffice. If you would like to start contributing to LibreOffice, please take a look at our video tutorial:

Getting Started (Video Tutorial)

by Hossein Nourikhah at November 22, 2024 05:07 PM

November 08, 2024

allotropia

Announcing ZetaOffice, a new LibreOffice Technology product for web, mobile & desktop

Hamburg and Bolzano, November 8th, 2024 – During the two-day annual South Tyrol Free Software Conference, allotropia software GmbH today announces beta versions of its new product line “ZetaOffice”.

ZetaOffice is a new set of applications, libraries and services, all powered by the LibreOffice Technology stack. Featured among its products is ZetaJS, an innovative browser-based plugin, with unique programmability & embeddability – the perfect tool for complex office editing, process automation and line-of-business applications in the web.

Additionally, leveraging the unique portability and flexibility of the LibreOffice Technology stack, ZetaOffice will be available in bit-by-bit identical versions (allowing for perfect interoperability and feature parity) also for open-source-based mobile operating systems (Android, and derived OS), as well as for all relevant desktop operating systems (Windows, macOS, Linux – via flatpak and snapcraft).

“We’re very excited being able to offer powerful, data-sovereign Open Source office functionality on even more platforms today”, says Thorsten Behrens, owner and managing director of allotropia software. “In particular our innovative, WASM-based browser version of LibreOffice will be a game-changer for every web developer in need of processing, analysing or integrating with office documents.”

“This could not have come at a better time”, says Michiel Leenaars, director of strategy at philanthropic investor NLnet Foundation. “It is long overdue but certainly in the wake of the recent geo-political developments, we all recognise the urgent need for Europe to regain its technological independence when it comes to core technologies – as boring as these may seem. ZetaOffice shows that Europe has the talent and capacity to break with the past and create new paradigms and use innovation and collaboration to save the day.”

“ZetaOffice is the perfect addition to our portfolio of tools for document and business process automation”, says Uli Brandner, CEO and owner of CIB Group. “With solutions like CIB flow for workflow modeling and CIB coSys for high-quality template management, CIB Group already offers powerful digitalization tools. As demand grows to bring proven applications to the web and stay on the cutting edge of technology, ZetaOffice stands out as an innovative solution precisely tailored to our customers’ needs.”

A detailed blog post, including links to beta versions of the software, is available here.

For the products, please refer to our website at zetaoffice.net.

ZetaOffice and the team at allotropia thanks the European Commission’s Next Generation Internet initiative/NGI Zero for its financial contribution to the development of this software.

About ZetaOffice:

ZetaOffice is a product line based on LibreOffice Technology, comprising of desktop LTS products for classical office productivity requirements; a browser-native version based on WebAssembly for fast, client-side integration and automation of office technology; and an
upcoming mobile app widget, for deep integration in mobile line-of-business applications. ZetaOffice is focused on speed, superb embeddability, excellent inter-product as well as Office compatibility, and geared towards digital-sovereign & data protection needs.

About ZetaJS:

ZetaJS is a JavaScript library, available via the npm package manager, to enable developers to quickly & conveniently embed ZetaOffice WebAssembly in web applications. ZetaJS makes available the entire gamut of the LibreOffice programmability interfaces, providing a web-native component for JavaScript developers to deeply embed an office suite into their web apps. In contrast to classical cloud-office setups, ZetaJS can be used as an integral, client-side part of any web application – permitting users to interact with office documents as part of a larger application framework, with very low latency. That way, e.g. direct integration for editing, suggestions or running calculations in complex spreadsheets can be provided. Similarly, it’s trivially easy to implement direct, client-side rendering and export of office documents into PDF or HTML – all via a self-hostable, digital-sovereign Open Source solution.

About allotropia software GmbH:

The company allotropia software GmbH provides services, consulting and products around LibreOffice and related opensource projects. Founded in 2020 by long-time developers of the project, its stated mission is to make LibreOffice shine – in as many different shapes and forms as necessary to serve modern needs towards office productivity software. allotropia software GmbH is headquartered in Hamburg, Germany at the birthplace of the OpenOffice/LibreOffice project. For more information, visit allotropia.de, or follow fosstodon.org/@allotropia on Mastodon and LinkedIn: www.linkedin.com/company/allotropia-software-gmbh

by allotropiasoft at November 08, 2024 10:59 AM

Launching ZetaJS for ZetaOffice

Today allotropia has launched the ZetaOffice range of products at the SFSCON in South Tyrol. ZetaOffice is a LibreOffice Technology built & designed for professional use in the browser, on the desktop and on mobile.

We are excited to additionally announce a massively improved way for which LibreOffice Technology can be used fully client-side on the web. As an additional building block, we have developed the ZetaJS wrapper, which enables convenient embedding and automating WASM (WebAssembly) builds of ZetaOffice via JavaScript. With that, all of the LibreOffice Technology APIs and features are available to web applications – and by leveraging WASM, which runs ZetaOffice client-side, no server or cloud services are needed. All processing is taking place on the client browser, which minimizes latencies & load (of course, a minimal static delivery of web application code, assets and the WASM binary is still needed, but that’s extremely light-weight). 

Examples

Let’s look at some simple examples to give you an idea, how easy ZetaOffice integration is. All comprise of an HTML and a JavaScript file. A ZetaOffice WASM build will automatically be included from the following URL. To replace it with a custom WASM build see config.sample.js of each demo.

https://cdn.zetaoffice.net/zetaoffice_latest/

Next you need to upload the zetajs/ folder onto a webserver of your choice, which sets the following HTTP headers (see developer.mozilla.org for further details):

Cross-Origin-Opener-Policy "same-origin"
Cross-Origin-Embedder-Policy "require-corp"

So back to the example code. The HTML files for all examples embed ZetaOffice and some JavaScript loading code. Please check the actual JavaScript file for the code interacting with ZetaOffice.

Lets have a look at the simple.html (see live). ZetaOffice displays its content using an HTML canvas. So in line 14 we initialize this canvas. Currently a list of attributes like is needed for the canvas. But we will migrate those attributes to the ZetaJS wrapper, so they won’t be needed anymore in the HTML code.

<canvas
  id="qtcanvas" contenteditable="true"
  oncontextmenu="event.preventDefault()" onkeydown="event.preventDefault()"
  style="height:100%; width:100%; border:0px none; padding:0;"/>

The Module variable on line 30 passes the information needed to initialize WASM binaries. First is the canvas. And second is an array of JavaScript files which will be executed in the main Web Worker running the WASM binary. Web Workers are a process like feature of the browsers WASM runtime environment. We pass the ZetaJS wrapper and a file with custom JavaScript code, in this example the simple.js. You may need to ensure, that the zeta.js is reachable under the given URL path.

Line 33 to 39 preload the soffice.js file to ensure, it’s not being blocked by the browsers origin policy when loaded from a foreign origin. Line 42 triggers a website resize event, to make ZetaOffice display nicely inside the canvas. This can be done more precise, as shown in the more complex demos. But for the start the resize event will be triggered after a fixed interval. And finally the soffice.js document is finally loaded which triggers the start of the WASM binary.

Second is the simple.js file. It’s running inside the same Web Worker as the WASM binary to enable interaction. When running in Chromium / Google Chrome you will find a dropdown list labeled “top” at the upper left of the “Console” tab in the developer tools. There you can select the em-pthread_1 Web Worker to debug code in the simple.js file.

Inside the simple.js you will find pretty much the same code as when controlling a LibreOffice running naively on Linux, Windows or any other native OS. It is using LibreOffice’s UNO interface. Most existing examples using UNO via Python or Basic can be easily moved to JavaScript.

The control flow is being passed by the Module.zetajs.thenwhich gets called as soon as the WASM binary is loaded. It passes the zetajs object from which we first get the common com.sun.star object (do not confuse it’s abbreviation css with HTML CSS). In the lines 11 to 21 we get some control objects via UNO, which allow us to trigger the load of an example office document example.odt which is embedded in the WASM binary.

Module.zetajs.then(function(zetajs) {
  function getTextDocument() {
    const css = zetajs.uno.com.sun.star;
    const context = zetajs.getUnoComponentContext();
    const desktop = css.frame.Desktop.create(context);
    let xModel = desktop.getCurrentFrame().getController().getModel();
    if (xModel === null
      || !zetajs.fromAny(
        xModel.queryInterface(zetajs.type.interface(css.text.XTextDocument))))
    {
      xModel = desktop.loadComponentFromURL(
        'file:///android/default-document/example.odt', '_default', 0, []);
    }
    const toolkit = css.awt.Toolkit.create(context);

Line 27 is where the actual application logic starts. In this simple example we get a cursor object from the document to insert the text string here! at the top. In the final section from line 32 to 38 each paragraph of the office document becomes colored in a random color.

    const xText = xModel.getText();
    const xTextCursor = xText.createTextCursor();
    xTextCursor.setString("string here!");
  }
  {
    const xModel = getTextDocument();
    const xText = xModel.getText();
    const xParaEnumeration = xText.createEnumeration();
    for (const next of xParaEnumeration) {
      const xParagraph = zetajs.fromAny(next);
      const color = Math.floor(Math.random() * 0xFFFFFF);
      xParagraph.setPropertyValue("CharColor", color);
    }

This other simple-examples/ show you a little more interesting tasks you can do with the same basic techniques as shown here. While the HTML files are all the same, the simple_key_handler.js (see live) shows you how to register to ZetaOffice event handlers. And finally rainbow_writer.js (see live) uses this to implement a small tool coloring text as you write it.

More Complex Examples

The next big step is in the standalone/ (see live) example. It adds a nice loading animation and shows you how to pass messages between the WASM Web Worker and the browsers main thread, handling the HTML page. This is being used to implement some simple controls on the HTML page for formatting text inside ZetaOffice. The demo is build as a npm package and can be run according to the contained README.md. Don’t forget to pass an URL to the soffice_base_url variable as explained above!

Additional examples are vuejs3-ping-tool/ (see live) and letter-address-tool/ (see live). The vuejs3-ping-tool/is again a npm package, and show-cases how to automatically fill spreadsheets documents with values, displaying them in nicely animated Calc charts. The other letter-address-tool/ example gives you an impression how to connect ZetaOffice with external data sources to automatically create letters from templates, and export the result as office document or PDF file.

Please share your feedback as a comment in the blog, or use the GitHub issue tracker for suggestions or bugs in the code!

by Moritz Duge at November 08, 2024 10:58 AM

Miklos Vajna

Handling page captures for Writer TextBoxes

Writer TextBoxes provide the user with shapes that can have complex geometry and complex content. There is also a feature to capture shapes inside page boundaries: now the two features interact with each other better.

This work is primarily for Collabora Online, but the feature is available in desktop Writer as well.

Motivation

As described in a previous post, Writer implements the TextBox feature with a pair of objects: a Draw shape (with complex geometry) and a (hidden) Writer TextFrame, providing complex content. To avoid wrapping problems, the underlying TextFrame always has its wrap type set to "through", i.e. text may wrap around the Draw shape, but the hidden TextFrame is always ignored during text wrapping.

In most cases this provides the expected behavior, because the user sees one object, so wrapping around at most one object is not surprising.

However, there is also an other feature, that shapes may be captured inside page frames: if their position would be outside the page frame, Writer corrects this, so they are not off-page. This also makes sense, so it can't happen that your document has a shape that is hard to find, due to a silly position.

The trouble comes when these two are combined: the Draw shape's position gets adjusted to be captured inside the page frame, but the TextFrame's wrap type is "through", and objects with this wrap type are an exception from the capturing mechanism, so the position of the two shapes get out of sync.

Results so far

The problem is now solved by improving the layout, so in case the TextFrame is actually part of a Draw shape + TextFrame pair (forming a TextBox), then we calculate the effective wrap type of the TextFrame based on the wrap type of its Draw shape, so either both objects are captured or none, which results in consistent render result.

Here is a sample document where all margins are configured to be equal, but capturing corrected the Draw shape (and not the TextFrame):

Bugdoc: old Writer render

And here is the same document, with consistent positioning:

Bugdoc: new Writer render

As you can see, now the rendered margins actually equal, as wanted.

How is this implemented?

If you would like to know a bit more about how this works, continue reading... :-)

The bugfix commit was sw textbox: capture fly when its draw object is captured.

The tracking bug was tdf#138711.

Want to start using this?

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 (25.2).

by Miklos Vajna at November 08, 2024 07:58 AM

August 26, 2024

Roman Kuznetsov

The best LibreOffice extensions. Code Highlighter 2

When I translated one book about Python to Russian which contained many examples of Python code I though quite long how to highlight them in the normal text. For book writing I used LibreOffice Writer (of course) but Writer has no a standard tool for code highlighting.

So after some searching I found the LibreOffice extension - Code Highlighter 2. It is also available on our extension site. This extension makes code highlighting using Pygments Python library. There is support for many programming languages and many color styles for highlighting there.

The extension worked fine, but I didn't like that for highlighting I should manually select every code example in the text, then press some shortcut, then select another code example, etc...

I wrote an issue on the extension github page and after some discussions the extension author Jean-Marc Zambon implemented a new feature that allows to highlight all code example in the book in only one action using Paragraph style!

So my workflow in this case will be as follows:

  • Create a snippet for the AutoText with code example that has a special paragraph style (for example, with font name Consolas and font size 12pt) with name, for example too - 'Python_code'.
  • Use this snippet to insert code examples
  • In the end of book writing just use the new feature in the extension and highlight all code examples in only one action!

 


Above you can see examples of the Code Highlighter work with some light and some dark styles.

by Roman Kuznetsov (noreply@blogger.com) at August 26, 2024 11:18 AM

August 23, 2024

Caolán McNamara

Linux Namespaces and Collabora Online

In Collabora Online (for the normal mode of operation) we have a single server process (coolwsd) that spawns a separate process (kit) to load and manage each individual document. Each of those per-document kit processes runs in its own isolated environment. See architecture for details.

Each environment contains a minimal file system (ideally bind mounted from a template dir for speed, but linked/copied if not possible) that each kit chroots into, limiting its access to that subtree.

That chroot requires the CAP_SYS_CHROOT capability (and the desirable mount requires the CAP_SYS_ADMIN capability), and granting those capabilities to the coolforkit and coolmount binaries is a root privilege that, for typical deb/rpm packages, is done automatically at install time.

But it would be far more convenient not to require these capabilities to be set to do this isolation. They grant online more ability to affect its host system than it uses, we only want to mount dirs and chroot into dirs that belong to online and have no need or desire to make them available to any other process or user, and it's awkward, especially during development. to require root privileges to set these capabilities.

This scenario is not unique, and Linux provides namespaces, typically used by container implementations, to support achieving this. So recent work in Collabora Online leverages these namespaces to do its own layer of per-document kit isolation. (There's a good series of articles by Steve Ovens on the various namespaces, with the mount namespaces the most relevant one here.)

In essence, a user level process can create its own namespace in which it is apparently root from its own perspective, but as the original uid from the outside perspective and limited to operating on resources that the original uid is limited to accessing. So for each forkit, instead of requiring initial system capabilities and creating a system level bind mount we instead have no specific initial capabilities, enter a new namespace, unique to each forkit, in which that forkit becomes king of its own castle with apparent full capabilities, and can create bind mounts and chroot into its minimal file system.

Which is pretty magical to me as the whole existence of namespaces passed me by entirely without notice despite debuting over a decade ago.

Nothing is ever simple however, so some hurdles along the way.

Entering the namespace "requires that the calling process is not threaded" (man 2 unshare) which is not a problem for the normal use case in each kit, but did pose a problem for the test coolwsd does in advance to probe if there are working namespaces on the system in determine if it should operate kits in namespace mode or not. There it turned out that the Poco::Logger we use backups existing logs when it creates a new one, and then by default spawns a  thread to compress the old log.

I initially had the vague notion that I could treat a namespace as a sort pseudo-sudo and switch back and forth freely between them, but that's not the model, typically it's a one way journey. But namespaces can be stacked instead with a namespace where the original uid is mapped to (apparent) root then containing another namespace where the user is mapped back to the original uid again. So we do that, each forkit enters its initial namespace and is mapped to root, does the mounts, enters another nested namespace mapped back to the original uid, chroots and drops all of the capabilities gained on entering a namespace.  Which aligns the namespace mode with the expectations of the non-namespaces mode as to what effective uid the kit appears to run as.

The mounts that each forkit does are private to that forkit, so while in the non-namespace case the mounts are visible system-wide, in the namespace case the mounts are not visible either to other forkits or to the parent coolwsd. So how the document is provided by coolwsd to a child kit had to be adapted for the new mode of even less potential leakage between components.

There was a glitch in mounting, because when we bind mounts dirs from our system template we want them to be readonly, which requires the typical Linux 2 step process of mount and remount with readonly flags. This worked for the non namespace case, but failed for namespaces even though the initial mount succeeded. Here we had an extra flag of MS_NOATIME when remounting to potentially shave a little time off use of the kit jail, but in namespaces removing that option from the underlying system mount isn't permitted.

Despite that mount flag change giving working namespace-using kits directly inside toplevel OS, one of our lxc-using ci systems still refused to allow a readonly remount in a namespace to work. The catch here was that lxc is bundled with default apparmor rules which additionally restrict a readonly remount call to a certain set of arguments which our remount effort didn't match, so that had to be adjusted. Specifically the rather obscure MS_SILENT use.

Performance-wise, an unexpected (to me at least) side effect of using namespaces is that the coolwsd measurement of the time to spawn a forkit on my hardware has reduced from an average of 39.63ms per spawn to an average of an average of 6.15ms per spawn, which wasn't the primary goal but is a nice benefit.

Surveying distros where namespaces are available by default suggests:

RHEL/CENTOS

  • 8.0+ works with namespaces out of the box
  • 7.9 (EOL) not enabled by default, possible with
    • echo 10000 > /proc/sys/user/max_user_namespaces

Debian

  • 11+ (bullseye) works with namespaces out of the box
  • 10 (buster) EOL, not enabled by default, possible with
    • sudo sysctl -w kernel.unprivileged_userns_clone=1

Ubuntu

  • 16.04+ works with namespaces out of the box

Ubuntu 24.04 however, while supporting namespaces out of the box, has restricted namespaces via apparmor rules, which complicates things again so Collabora Online .deb packages install an apparmor profile to enable it to use namespaces out of the box.

by caolan (noreply@blogger.com) at August 23, 2024 11:17 AM