The Document Foundation Planet

 

October 09, 2025

Official TDF Blog

Release of LibreOffice 25.8.2

Berlin, 9 October 2025 – LibreOffice 25.8.2, the second minor release of the free, volunteer-supported office suite for personal productivity in office environments, is now available on our download page for Windows, macOS and Linux.

This release includes over 60 bug and regression fixes over LibreOffice 25.8 [1] to enhance the software’s stability and robustness. It also solves several interoperability issues with the proprietary Microsoft Office/365 document format and improves the user interface and file opening and saving processes.

LibreOffice is the only office suite with a feature set comparable to the market leader. It also offers a range of interface options to suit all user habits, from traditional to modern, and makes the most of different screen form factors by optimising the space available on the desktop to put the maximum number of features just a click or two away.

LibreOffice 25.8.2 is available at www.libreoffice.org/download/.

For users who don’t need the latest features and prefer a version that has undergone more testing and bug fixing, The Document Foundation maintains the LibreOffice 25.2 family, which includes several months of back-ported fixes. The current release is LibreOffice 25.2.6.

The Document Foundation does not provide technical support for users, although they can get it from volunteers on user mailing lists and the Ask LibreOffice website: ask.libreoffice.org

LibreOffice users, free software advocates and community members can support the Document Foundation by making a donation on our donate page.

[1] Fixes in RC1: wiki.documentfoundation.org/Releases/25.8.2/RC1. Fixes in RC2: wiki.documentfoundation.org/Releases/25.8.2/RC2.

by Italo Vignoli at October 09, 2025 12:09 PM

LibreOffice 64-bit progress, and support for Amazon Linux 2023

CPU on a motherboard

LibreOffice has been available for Linux since we started the project in 2010. The official builds from The Document Foundation (the non-profit entity behind LibreOffice) are designed to be self-contained and distribution agnostic – that is, they should work on as many distributions as possible.

To achieve this, we test on various Linux distributions, and now we consider Amazon Linux 2023 as another platform supported by LibreOffice. Amazon has provided resources for regular and automated CI (continuous integration) testing of LibreOffice builds against Amazon Linux 2023, including crash-testing runs, via the AWS Open Source Credits programme.

As part of this, and for the general benefit of other users, TDF has started to provide 64-bit ARM Linux builds (aarch64) in RPM format. We’ve worked on improving 64-bit ARM support for various platforms in recent years, including for Windows and on Apple silicon Macs, given that the chips are becoming increasingly used in desktops and servers.

64-bit ARM chips commonly power cloud infrastructure, where LibreOffice is often used in headless (non-GUI) tasks, such as batch conversions of large numbers of documents. But some users run LibreOffice graphically too. With the updates we’ve been working on, LibreOffice is now available on more infrastructure and can be deployed on Amazon Elastic Compute Cloud (Amazon EC2). If there’s anything else users would like to see, submit an enhancement request and let us know!

by Mike Saunders at October 09, 2025 08:28 AM

October 08, 2025

Michael Meeks

2025-10-08 Wednesday

  • Mail chew, patch bits, sync with Dave.
  • Re-arranged the lounge to bring the Windows build machine back into action for VM-based build acceleration & office testing after its main role (and ethernet cable) got replaced by a cheap Android-TV box.
  • Published the next strip exploring whether maintenance should be free:
    The Open Road to Freedom - strip#38 - Free Maintenance
  • Chased a weird hanging in a Loading phase issue through reams of logs.

October 08, 2025 04:11 PM

October 07, 2025

Michael Meeks

2025-10-07 Tuesday

  • Mail chew, patch review, planning call, lunch.
  • Disabled Vaultwarden's browser plugin - after the performance horrors of re-scanning the DOM every keystroke - to seeing if that helps with my wayland/x11 clipboard issues.
  • Plugged away at a contract, still suffering from poor contrast between selected and un-selected window titles in GNOME in light-mode too on large-screen, tried highlight focus for my keyboard only flow.
  • Date night with J. lovely to spend some time with just her and eat out too, been a while.

October 07, 2025 09:00 PM

Official TDF Blog

LibreOffice project and community recap: September 2025

LibreOffice Conference 2025 merchandise

Here’s our summary of updates, events and activities in the LibreOffice project in the last four weeks – click the links to learn more…

  • At the start of the month, the LibreOffice Conference 2025 took place in Budapest, Hungary. We had talks, workshops, fun social events and more. Thanks to all who attended 😊 See the schedule for information about the talks (and links to the slides, where available).

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.

LibreOffice 25.2 logo

Guidebook cover

  • The Annual Report of The Document Foundation describes the foundation’s activities and projects, especially in regard to LibreOffice and the Document Liberation Project. We’ve been posting sections of the 2024 report here on the blog, and now the full version is available.

TDF Annual Report 2024 cover

  • Companies around the world use LibreOffice to reduce costs, improve their privacy, and free themselves from dependence on single vendors. We talked to Flotte Karotte, a German company with 50 employees that recently made a generous donation to support the LibreOffice project and community.

Photo of food being delivered

Open Source Conference 2025 logo

  • We spoke to Devansh Varshney, who added histogram chart support to LibreOffice and is working on improvements to the Basic IDE.

Devansh Varney photo

Suraj Bhattarai

Montage of photos from LibreOffice events

Bundesheer logo

Keep in touch – follow us on Mastodon, X (formerly Twitter), Bluesky, Reddit and Facebook. Like what we do? Support our community with a donation – or join our community and help to make LibreOffice even better!

by Mike Saunders at October 07, 2025 08:25 AM

Miklos Vajna

Markdown import/export in Writer

Writer recently got a Markdown import & export filter and there were a number of improvements to that.

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

Motivation

Ujjawal Kumar contributed a markdown import to Writer, as part of Google Summer of Code (GSoC) this summer. Mike Kaganski of Collabora also created a minimal markdown export in Writer. I looked at the feature differences between the two, and filled in various gaps in the markdown export. I also added a few general markdown import/export improvements relevant for normal Writer documents, like embedded image support.

Results so far

Here is a sample case of a document using inline code spans:

Code span: baseline

Exporting this to markdown & loading back to Writer, the code span was lost:

Code span: old result

And now it's preserved:

Code span: new result

This also works with code blocks.

Second, here is a document with lists:

Lists: baseline

Exporting this to markdown & loading back to Writer, the lists were lost:

Lists: old result

And now they are preserved:

Lists: new result

This also works with nested lists.

Third, here is a document with an image:

Image: baseline

Exporting this to markdown & loading back to Writer, the image was lost:

Image: old result

And now it's preserved:

Image: new result

This also works with embedded and anchored images.

Fourth, here is a document with a table:

Table: baseline

Exporting this to markdown & loading back to Writer, the table was lost:

Table: old result

And now it's preserved:

Table: new result

This also works with table alignments and nested tables (to the extent the markdown markup allows that).

Fifth, here is a document with a quote block:

Quote: baseline

Exporting this to markdown & loading back to Writer, the quote's paragraph indentation was lost:

Quote: old result

And now it's preserved:

Quote: new result

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:

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

by Miklos Vajna at October 07, 2025 06:13 AM

October 06, 2025

Michael Meeks

2025-10-06 Monday

  • Up early, poked at XML attribute ordering issues in PPTX export to minimize the diffs to what MS Office produces, used officeotron to find a problem, and pushed a tentative patch.
  • Lots of 1:1's with my reports - lots of goodness going on. Plugged away at a contract until late.

October 06, 2025 09:00 PM

Official TDF Blog

🇨🇺 LibreOffice in Latin America: heading to Havana for the 2025 Latin American Congress

From October 6 to 9, Havana, Cuba, will host the Latin American LibreOffice 2025 Conference, a meeting that will bring together contributors, developers, universities, and governments from the region to celebrate and strengthen free software.

This year, the Latin American conference will be held as part of the IV International Congress on Digital Transformation (Cibersociedad 2025) in Havana, Cuba. This integration reinforces LibreOffice’s crucial role in the digital transformation of Latin American communities, promoting open innovation, technological sovereignty, and collaboration between countries.

The event will take place at the iconic Hotel Nacional de Cuba and will feature an intense program of lectures, panels, and workshops dedicated to LibreOffice, its communities, and institutional adoption initiatives.

� A meeting that connects communities and governments

The opening ceremony will pay tribute to Cuban volunteer Carlos Parra, who passed away in 2022.

It was thanks to his dedication, articulation, and love for the community that the opportunity arose to hold the Latin American LibreOffice Congress in Cuba—a dream he helped make possible.

Carlos was the link between the Cuban community and The Document Foundation, and his contribution will remain as a legacy of collaboration and commitment to digital freedom.

During the event, Adlair Cerecedo-Méndez will present the experience of Office GobMX, the LibreOffice-based suite developed by the Mexican government. Other highlights include the panel “LibreOffice is freedom,� with Olivier Hallot, founding member of The Document Foundation and Documentation Coordinator for the LibreOffice Project, as well as discussions on government migration, extensions, technical quality, and the rebirth of the Cuban community — with participation from Gustavo Pacheco (Brazil), Mauricio Baeza (Mexico), and Xisco Faulí (Spain).

🧑�� Training and academic innovation

At the University of Information Sciences (UCI), the event will open space for young people and educators with the “LibreOffice and Universities� lab, led by Gustavo Pacheco, and the “Creating my first extension� workshop, conducted by Mauricio Baeza — a practical opportunity for those who want to learn how to expand LibreOffice and contribute technically to the project.

💬 Regional meetings and plans for 2026

The congress will close with meetings between Latin American members of the LibreOffice community, addressing:

  • the 2026 events calendar (including esLibre and the next Latin American Congress);
  • academic projects such as Google Summer of Code and Outreachy;
  • and new partnerships with other free software communities, such as GNOME Latam.

These sessions reflect the collective commitment to strengthening collaboration between countries and consolidating a more active presence for Latin America within The Document Foundation.

💪 An event driven by volunteers

The Congreso Latinoamericano de LibreOffice is an event organized entirely by volunteers, who dedicate their time, energy, and knowledge to make this initiative possible. Our special recognition and thanks go to Daniel Rodriguez (Argentina), Gastón Hannay (Uruguay), Omar Correa (Cuba), Gustavo Pacheco (Brazil), and Juan González (Mexico), who have been working tirelessly to make every detail of this edition possible.

We also express our sincere gratitude to the University of Computer Sciences (UCI) and the Cibersociedad 2025 organization for opening their doors and sharing their infrastructure—including rooms, laboratories, and technical support—making it possible to hold the Latin American LibreOffice Congress within their event.

This partnership reinforces the spirit of academic collaboration and the joint commitment to digital transformation in Latin America.

The Document Foundation (TDF), in its mission to promote LibreOffice and strengthen its global community, supports and sponsors these activities, enabling the participation of volunteers from different countries.

This support allows members of the Latin American community to meet in person, exchange experiences, and strengthen the international collaboration that sustains the project.

� Freedom, collaboration, and the future

The LibreOffice Latin American Congress in Cuba is more than a technical event—it is a reunion of the Latin American community, united by ideals of freedom, solidarity, and technological sovereignty.

LibreOffice is, above all, a project made by people, for people. And this congress is living proof that collaboration can cross borders, languages, and generations.

📅 Date: October 6-9, 2025

� Location: Hotel Nacional de Cuba – Havana

� More information: latam.conference.libreoffice.org

by Olivier Hallot at October 06, 2025 01:56 AM

October 05, 2025

Michael Meeks

2025-10-05 Sunday

  • Up lateish, All Saints - iSing + some bass & singing. Pizza lunch.
  • Picked, practiced songs, played guitar for the evening service. J. and H. doing some lino-printing action.
  • Ran the service, home, relaxed.

October 05, 2025 09:00 PM

October 04, 2025

Michael Meeks

2025-10-04 Saturday

  • Up lateish, plugged away at tax filing with J. H. and myself; three in one day - nice.
  • Lunch, bid 'bye to Nina, out for a walk with J. & H.
  • Bit of hacking, and out to Tash's 40'th birthday party and barn-dance in Isleham - fun.

October 04, 2025 09:00 PM

October 03, 2025

Official TDF Blog

The artificial complexity of OOXML files (the DOCX case)

The complexity of the OOXML format is linked to its design and was deliberately created to make the format more difficult for non-Microsoft software developers to implement. Compatibility issues are caused by a veritable “maze” of tags used even for the simplest content, which binds users to the Microsoft ecosystem in the first example of standard-based lock-in.

The DOCX case

To demonstrate the difference in complexity between the XML schemas of Writer and Word text documents in the ODF and OOXML formats, I used two classic English theatre plays: William Shakespeare’s Hamlet and Oscar Wilde’s The Importance of Being Earnest. I downloaded the text versions of these works from Project Gutenberg — a library of classic texts for which US copyright has expired — and deleted the introductions and conclusions added by Project Gutenberg, without making any other changes.

I then repeated this process for both documents.

I copied all the text and pasted it, without any formatting, into two newly created blank documents. For Writer, I used the template that I usually use for unstructured documents; for Word, I did not use a template. This means that, in Writer, the XML schema contains information about the template (margins, paragraph and font formatting), but this does not increase its complexity.

To perform the analysis, I duplicated and renamed the two files, replacing the original extension with “ZIP”, and then decompressed them to create two folders containing all the files of the respective XML schemas.

The LibreOffice folder contained three subfolders and six files with the same names as those in the ODS file examined last week, as would be expected of a standard aiming to simplify life for developers and users. All the content is actually in the content.xml file, while the other files contain instructions for displaying the text document correctly.

The Microsoft 365 folder contains three subfolders and the [Content_Types].xml file, as with the XLSX file examined last week. One of the subfolders has a different name, but this is related to the application and does not increase complexity. Opening the [Content_Types].xml file provides information about the other files, including those in the subfolders.

In this case, the content is in the document.xml file inside the Word folder, which contains folders and files that differ completely from those in the XLSX file. Again, there is no technical reason for this difference in the XML schemas of the two files other than to make their internal structures different and more complex.

Let’s now analyse William Shakespeare’s Hamlet and then Oscar Wilde’s The Importance of Being Earnest.

Here is the PDF of Hamlet:

hamlet

 

The difference in complexity between the document.xml and content.xml files is striking when you compare their lengths: the content.xml file has 6,802 lines, while the document.xml file has 60,245 lines, compared to a text document of 5,566 lines.

Let us now compare the two files’ XML schemas from the beginning to the end of the introduction.

CONTENT.XML

<office:body>
<office:text text:use-soft-page-breaks=”true”>
<office:forms form:automatic-focus=”false” form:apply-design-mode=”false”/>
<text:sequence-decls>
<text:sequence-decl text:display-outline-level=”0″ text:name=”Illustration”/>
<text:sequence-decl text:display-outline-level=”0″ text:name=”Table”/>
<text:sequence-decl text:display-outline-level=”0″ text:name=”Text”/>
<text:sequence-decl text:display-outline-level=”0″ text:name=”Drawing”/>
<text:sequence-decl text:display-outline-level=”0″ text:name=”Figure”/>
</text:sequence-decls>
<text:p text:style-name=”P1″>THE TRAGEDY OF HAMLET, PRINCE OF DENMARK</text:p>
<text:p text:style-name=”P1″/>
<text:p text:style-name=”P1″>by William Shakespeare</text:p>
<text:p text:style-name=”P1″/>
<text:p text:style-name=”P1″/>
<text:p text:style-name=”P1″/>
<text:p text:style-name=”P1″/>
<text:p text:style-name=”P1″>Contents</text:p>
<text:p text:style-name=”P1″/>
<text:p text:style-name=”P1″><text:s/>ACT I</text:p>
<text:p text:style-name=”P1″><text:s/>Scene I. Elsinore. A platform before the Castle</text:p>
<text:p text:style-name=”P1″><text:s/>Scene II. Elsinore. A room of state in the Castle</text:p>
<text:p text:style-name=”P1″><text:s/>Scene III. A room in Polonius’s house</text:p>
<text:p text:style-name=”P1″><text:s/>Scene IV. The platform</text:p>
<text:p text:style-name=”P1″><text:s/>Scene V. A more remote part of the Castle</text:p>
<text:p text:style-name=”P1″/>
<text:p text:style-name=”P1″><text:s/>ACT II</text:p>
<text:p text:style-name=”P1″><text:s/>Scene I. A room in Polonius’s house</text:p>
<text:p text:style-name=”P1″><text:s/>Scene II. A room in the Castle</text:p>
<text:p text:style-name=”P1″/>
<text:p text:style-name=”P1″><text:s/>ACT III</text:p>
<text:p text:style-name=”P1″><text:s/>Scene I. A room in the Castle</text:p>
<text:p text:style-name=”P1″><text:s/>Scene II. A hall in the Castle</text:p>
<text:p text:style-name=”P1″><text:s/>Scene III. A room in the Castle</text:p>
<text:p text:style-name=”P1″><text:s/>Scene IV. Another room in the Castle</text:p>
<text:p text:style-name=”P1″/>
<text:p text:style-name=”P1″><text:s/>ACT IV</text:p>
<text:p text:style-name=”P1″><text:s/>Scene I. A room in the Castle</text:p>
<text:p text:style-name=”P1″><text:s/>Scene II. Another room in the Castle</text:p>
<text:p text:style-name=”P1″><text:s/>Scene III. Another room in the Castle</text:p>
<text:p text:style-name=”P1″><text:s/>Scene IV. A plain in Denmark</text:p>
<text:p text:style-name=”P1″><text:s/>Scene V. Elsinore. A room in the Castle</text:p>
<text:p text:style-name=”P1″><text:soft-page-break/><text:s/>Scene VI. Another room in the Castle</text:p>
<text:p text:style-name=”P1″><text:s/>Scene VII. Another room in the Castle</text:p>
<text:p text:style-name=”P1″/>
<text:p text:style-name=”P1″><text:s/>ACT V</text:p>
<text:p text:style-name=”P1″><text:s/>Scene I. A churchyard</text:p>
<text:p text:style-name=”P1″><text:s/>Scene II. A hall in the Castle</text:p>
<text:p text:style-name=”P1″/>
<text:p text:style-name=”P1″/>
<text:p text:style-name=”P1″/>
<text:p text:style-name=”P1″/>
<text:p text:style-name=”P1″>Dramatis Personæ</text:p>
<text:p text:style-name=”P1″/>
<text:p text:style-name=”P1″>HAMLET, Prince of Denmark</text:p>
<text:p text:style-name=”P1″>CLAUDIUS, King of Denmark, Hamlet’s uncle</text:p>
<text:p text:style-name=”P1″>The GHOST of the late king, Hamlet’s father</text:p>
<text:p text:style-name=”P1″>GERTRUDE, the Queen, Hamlet’s mother, now wife of Claudius</text:p>
<text:p text:style-name=”P1″>POLONIUS, Lord Chamberlain</text:p>
<text:p text:style-name=”P1″>LAERTES, Son to Polonius</text:p>
<text:p text:style-name=”P1″>OPHELIA, Daughter to Polonius</text:p>
<text:p text:style-name=”P1″>HORATIO, Friend to Hamlet</text:p>
<text:p text:style-name=”P1″>FORTINBRAS, Prince of Norway</text:p>
<text:p text:style-name=”P1″>VOLTEMAND, Courtier</text:p>
<text:p text:style-name=”P1″>CORNELIUS, Courtier</text:p>
<text:p text:style-name=”P1″>ROSENCRANTZ, Courtier</text:p>
<text:p text:style-name=”P1″>GUILDENSTERN, Courtier</text:p>
<text:p text:style-name=”P1″>MARCELLUS, Officer</text:p>
<text:p text:style-name=”P1″>BARNARDO, Officer</text:p>
<text:p text:style-name=”P1″>FRANCISCO, a Soldier</text:p>
<text:p text:style-name=”P1″>OSRIC, Courtier</text:p>
<text:p text:style-name=”P1″>REYNALDO, Servant to Polonius</text:p>
<text:p text:style-name=”P1″>Players</text:p>
<text:p text:style-name=”P1″>A Gentleman, Courtier</text:p>
<text:p text:style-name=”P1″>A Priest</text:p>
<text:p text:style-name=”P1″><text:soft-page-break/>Two Clowns, Grave-diggers</text:p>
<text:p text:style-name=”P1″>A Captain</text:p>
<text:p text:style-name=”P1″>English Ambassadors.</text:p>
<text:p text:style-name=”P1″>Lords, Ladies, Officers, Soldiers, Sailors, Messengers, and Attendants</text:p>

It is a reasonably complex XML file. After the initial instructions on the sequence of content, the text of the tragedy can easily be located alongside the sequence of the five acts and the descriptions of the dramatis personae.

DOCUMENT.XML

<w:body>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” wp14:paraId=”73C9069B” wp14:textId=”09294AE1″>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>THE TRAGEDY OF HAMLET, PRINCE OF DENMARK</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”3AA342A9″ wp14:textId=”00E76CB9″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t xml:space=”preserve”> </w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”1B479704″ wp14:textId=”129900F6″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>by William Shakespeare</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”6C6F02DD” wp14:textId=”1D8A204F”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t xml:space=”preserve”> </w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”1F7D25FF” wp14:textId=”4619853B”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t xml:space=”preserve”> </w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”50471715″ wp14:textId=”708F3004″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t xml:space=”preserve”> </w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”7E2BE7BA” wp14:textId=”48A7F848″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t xml:space=”preserve”> </w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”5B16A927″ wp14:textId=”10A9E3F9″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Contents</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”429A556E” wp14:textId=”6416D4DB”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t xml:space=”preserve”> </w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”1C38A773″ wp14:textId=”4F3F8ED2″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>ACT I</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”59328897″ wp14:textId=”21C9F129″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene I. Elsinore. A platform before the Castle</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”30C9E582″ wp14:textId=”0A7616FF”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene II. Elsinore. A room of state in the Castle</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”5EAB6C01″ wp14:textId=”70B75214″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene III. A room in Polonius’s house</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”232393A3″ wp14:textId=”069440B2″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene IV. The platform</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”65E1A75F” wp14:textId=”1E769B73″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene V. A more remote part of the Castle</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”6C6D2F5C” wp14:textId=”13700863″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t xml:space=”preserve”> </w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”339DBFF3″ wp14:textId=”4AF718C4″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>ACT II</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”774AAE76″ wp14:textId=”3F8EE2B8″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene I. A room in Polonius’s house</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”526BCABF” wp14:textId=”441F6801″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene II. A room in the Castle</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”6A1841AB” wp14:textId=”1FBE8D34″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t xml:space=”preserve”> </w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”577B4504″ wp14:textId=”1BF167DB”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>ACT III</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”2724CC9A” wp14:textId=”293764E9″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene I. A room in the Castle</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”04FF9ABE” wp14:textId=”30F918C2″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene II. A hall in the Castle</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”338872C6″ wp14:textId=”1F0AFFE6″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene III. A room in the Castle</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”46D240C2″ wp14:textId=”3D28AE8B”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene IV. Another room in the Castle</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”64F40DC7″ wp14:textId=”16C2A388″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t xml:space=”preserve”> </w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”4B538D6F” wp14:textId=”7CB11368″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>ACT IV</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”2508ABE7″ wp14:textId=”4925909D”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene I. A room in the Castle</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”5ABD1B8F” wp14:textId=”68A02D9E”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene II. Another room in the Castle</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”57D2E145″ wp14:textId=”08927478″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene III. Another room in the Castle</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”2BA12E96″ wp14:textId=”1E35C8BC”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene IV. A plain in Denmark</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”4DF8BEC9″ wp14:textId=”67676CF3″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene V. Elsinore. A room in the Castle</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”17EE90DC” wp14:textId=”708C9696″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene VI. Another room in the Castle</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”3302F704″ wp14:textId=”2ADB2A66″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene VII. Another room in the Castle</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”0F7C9E68″ wp14:textId=”5D706618″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t xml:space=”preserve”> </w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”1091F950″ wp14:textId=”2EE5201C”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>ACT V</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”6E162B67″ wp14:textId=”10199C37″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene I. A churchyard</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”1A2FA647″ wp14:textId=”683EF1FA”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Scene II. A hall in the Castle</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”62A90ACE” wp14:textId=”156F1611″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t xml:space=”preserve”> </w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”557F5426″ wp14:textId=”05194972″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t xml:space=”preserve”> </w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”011BF8B2″ wp14:textId=”175BE494″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t xml:space=”preserve”> </w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”4BB65B79″ wp14:textId=”7256A412″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t xml:space=”preserve”> </w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”1EEEFC18″ wp14:textId=”2D4F2D20″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Dramatis Personæ</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”69D361D6″ wp14:textId=”0A66ADE7″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t xml:space=”preserve”> </w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”7198BA63″ wp14:textId=”0ECB601B”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>HAMLET, Prince of Denmark</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”7A30698D” wp14:textId=”2A3EE787″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>CLAUDIUS, King of Denmark, Hamlet’s uncle</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”7D437DFF” wp14:textId=”0C3AFC43″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>The GHOST of the late king, Hamlet’s father</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”663C7E0E” wp14:textId=”4F1E93F2″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>GERTRUDE, the Queen, Hamlet’s mother, now wife of Claudius</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”1EE14B03″ wp14:textId=”567F43B4″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>POLONIUS, Lord Chamberlain</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”7A4F8A78″ wp14:textId=”39759F7E”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>LAERTES, Son to Polonius</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”11E371D7″ wp14:textId=”36CD515A”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>OPHELIA, Daughter to Polonius</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”2D438C1E” wp14:textId=”7211E8E5″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>HORATIO, Friend to Hamlet</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”4E6B50D6″ wp14:textId=”559117D7″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>FORTINBRAS, Prince of Norway</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”1B5B4955″ wp14:textId=”599A64FC”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>VOLTEMAND, Courtier</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”32BA9096″ wp14:textId=”6E8C2728″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>CORNELIUS, Courtier</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”60FD9B45″ wp14:textId=”2F2E3956″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>ROSENCRANTZ, Courtier</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”0CC7985B” wp14:textId=”56DED383″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>GUILDENSTERN, Courtier</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”775EA68F” wp14:textId=”089F9982″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>MARCELLUS, Officer</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”4E2AEAC2″ wp14:textId=”34855F77″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>BARNARDO, Officer</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”6DB5A437″ wp14:textId=”146C2E48″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>FRANCISCO, a Soldier</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”389BDBAC” wp14:textId=”0B30EC2E”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>OSRIC, Courtier</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”12730B2E” wp14:textId=”60DC1BFE”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>REYNALDO, Servant to Polonius</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”7FA85C5A” wp14:textId=”3D66976B”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Players</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”2F38E070″ wp14:textId=”309A60BF”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>A Gentleman, Courtier</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”53493710″ wp14:textId=”48B3D2A5″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>A Priest</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”611C5F94″ wp14:textId=”22FB27D4″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Two Clowns, Grave-diggers</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”577DC4BA” wp14:textId=”2FD3CAA0″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>A Captain</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”0BAF6209″ wp14:textId=”35658011″>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>English Ambassadors.</w:t>
</w:r>
</w:p>
<w:p xmlns:wp14=”http://schemas.microsoft.com/office/word/2010/wordml” w:rsidP=”03F02A92″ wp14:paraId=”260F5D8D” wp14:textId=”0FC10ABC”>
<w:pPr>
<w:pStyle w:val=”Normal”/>
</w:pPr>
<w:r w:rsidR=”0C2508E9″>
<w:rPr/>
<w:t>Lords, Ladies, Officers, Soldiers, Sailors, Messengers, and Attendants</w:t>
</w:r>
</w:p>

This XML file contains a lot of repetition. Is it really necessary to include the same information about the schema and style for every line of content, including empty ones? I doubt it personally, but since I am not a technician, I am willing to listen to reasons from those who argue that this content is essential and not artificial complexity.

Let’s see if the same thing happens with Oscar Wilde’s ‘The Importance of Being Earnest’. Here is the PDF:

earnest

 

In this case, the artificial complexity of the Word document is less apparent, as the content.xml file has 3,974 lines compared to a text document of 3,885 lines, and the document.xml file has 8,610 lines. Therefore, we have gone from a file that is almost ten times longer in terms of the number of lines to a file that is just over twice as long. This difference can be explained by comparing the first lines of the two files’ XML schemas (only those with content).

CONTENT.XML

<text:p text:style-name=”P1″>The Importance of Being Earnest</text:p>
<text:p text:style-name=”P1″>A Trivial Comedy for Serious People</text:p>
<text:p text:style-name=”P1″>THE PERSONS IN THE PLAY</text:p>
<text:p text:style-name=”P1″>John Worthing, J.P.</text:p>
<text:p text:style-name=”P1″>Algernon Moncrieff</text:p>
<text:p text:style-name=”P1″>Rev. Canon Chasuble, D.D.</text:p>
<text:p text:style-name=”P1″>Merriman, Butler</text:p>
<text:p text:style-name=”P1″>Lane, Manservant</text:p>
<text:p text:style-name=”P1″>Lady Bracknell</text:p>
<text:p text:style-name=”P1″>Hon. Gwendolen Fairfax</text:p>
<text:p text:style-name=”P1″>Cecily Cardew</text:p>
<text:p text:style-name=”P1″>Miss Prism, Governess</text:p>
<text:p text:style-name=”P1″>THE SCENES OF THE PLAY</text:p>
<text:p text:style-name=”P1″>ACT I. Algernon Moncrieff’s Flat in Half-Moon Street, W.</text:p>
<text:p text:style-name=”P1″>ACT II. The Garden at the Manor House, Woolton.</text:p>
<text:p text:style-name=”P1″>ACT III. Drawing-Room at the Manor House, Woolton.</text:p>
<text:p text:style-name=”P1″>TIME: The Present.</text:p>
<text:p text:style-name=”P1″>LONDON: ST. JAMES’S THEATRE</text:p>
<text:p text:style-name=”P1″>Lessee and Manager: Mr. George Alexander</text:p>
<text:p text:style-name=”P1″>February 14th, 1895</text:p>
<text:p text:style-name=”P1″>John Worthing, J.P.: Mr. George Alexander.</text:p>
<text:p text:style-name=”P1″>Algernon Moncrieff: Mr. Allen Aynesworth.</text:p>
<text:p text:style-name=”P1″>Rev. Canon Chasuble, D.D.: Mr. H. H. Vincent.</text:p>
<text:p text:style-name=”P1″>Merriman: Mr. Frank Dyall.</text:p>
<text:p text:style-name=”P1″>Lane: Mr. F. Kinsey Peile.</text:p>
<text:p text:style-name=”P1″>Lady Bracknell: Miss Rose Leclercq.</text:p>
<text:p text:style-name=”P1″>Hon. Gwendolen Fairfax: Miss Irene Vanbrugh.</text:p>
<text:p text:style-name=”P1″>Cecily Cardew: Miss Evelyn Millard.</text:p>
<text:p text:style-name=”P1″>Miss Prism: Mrs. George Canninge.</text:p>
<text:p text:style-name=”P1″>FIRST ACT</text:p>
<text:p text:style-name=”P1″>SCENE</text:p>
<text:p text:style-name=”P1″>Morning-room in Algernon’s flat in Half-Moon Street. The room is</text:p>
<text:p text:style-name=”P1″>luxuriously and artistically furnished. The sound of a piano is heard</text:p>
<text:p text:style-name=”P1″>in the adjoining room.</text:p>
<text:p text:style-name=”P1″>[Lane is arranging afternoon tea on the table, and after the music has</text:p>
<text:p text:style-name=”P1″>ceased, Algernon enters.]</text:p>
<text:p text:style-name=”P1″>ALGERNON.</text:p>
<text:p text:style-name=”P1″>Did you hear what I was playing, Lane?</text:p>
<text:p text:style-name=”P1″>LANE.</text:p>
<text:p text:style-name=”P1″>I didn’t think it polite to listen, sir.</text:p>
<text:p text:style-name=”P1″><text:soft-page-break/>ALGERNON.</text:p>
<text:p text:style-name=”P1″>I’m sorry for that, for your sake. I don’t play accurately—any one can</text:p>
<text:p text:style-name=”P1″>play accurately—but I play with wonderful expression. As far as the</text:p>
<text:p text:style-name=”P1″>piano is concerned, sentiment is my forte. I keep science for Life.</text:p>
<text:p text:style-name=”P1″>LANE.</text:p>
<text:p text:style-name=”P1″>Yes, sir.</text:p>
<text:p text:style-name=”P1″>ALGERNON.</text:p>
<text:p text:style-name=”P1″>And, speaking of the science of Life, have you got the cucumber</text:p>
<text:p text:style-name=”P1″>sandwiches cut for Lady Bracknell?</text:p>
<text:p text:style-name=”P1″>LANE.</text:p>
<text:p text:style-name=”P1″>Yes, sir. [Hands them on a salver.]</text:p>
<text:p text:style-name=”P1″>ALGERNON.</text:p>
<text:p text:style-name=”P1″>[Inspects them, takes two, and sits down on the sofa.] Oh! . . . by the</text:p>
<text:p text:style-name=”P1″>way, Lane, I see from your book that on Thursday night, when Lord</text:p>
<text:p text:style-name=”P1″>Shoreman and Mr. Worthing were dining with me, eight bottles of</text:p>
<text:p text:style-name=”P1″>champagne are entered as having been consumed.</text:p>
<text:p text:style-name=”P1″>LANE.</text:p>
<text:p text:style-name=”P1″>Yes, sir; eight bottles and a pint.</text:p>
<text:p text:style-name=”P1″>ALGERNON.</text:p>
<text:p text:style-name=”P1″>Why is it that at a bachelor’s establishment the servants invariably</text:p>
<text:p text:style-name=”P1″>drink the champagne? I ask merely for information.</text:p>
<text:p text:style-name=”P1″>LANE.</text:p>
<text:p text:style-name=”P1″>I attribute it to the superior quality of the wine, sir. I have often</text:p>
<text:p text:style-name=”P1″>observed that in married households the champagne is rarely of a</text:p>
<text:p text:style-name=”P1″>first-rate brand.</text:p>
<text:p text:style-name=”P1″><text:soft-page-break/>ALGERNON.</text:p>
<text:p text:style-name=”P1″>Good heavens! Is marriage so demoralising as that?</text:p>

DOCUMENT.XML

<w:t>The Importance of Being Earnest</w:t>
<w:t>A Trivial Comedy for Serious People</w:t>
<w:t>THE PERSONS IN THE PLAY</w:t>
<w:t>John Worthing, J.P. Algernon Moncrieff Rev. Canon Chasuble, D.D. Merriman, Butler Lane, Manservant Lady Bracknell Hon. Gwendolen Fairfax Cecily Cardew Miss Prism, Governess</w:t>
<w:t>THE SCENES OF THE PLAY</w:t>
<w:t>ACT I. Algernon Moncrieff’s Flat in Half-Moon Street, W.</w:t>
<w:t>ACT II. The Garden at the Manor House, Woolton.</w:t>
<w:t>ACT III. Drawing-Room at the Manor House, Woolton.</w:t>
<w:t>TIME: The Present.</w:t>
<w:t>LONDON: ST. JAMES’S THEATRE</w:t>
<w:t>Lessee and Manager: Mr. George Alexander</w:t>
<w:t>February 14th, 1895</w:t>
<w:t>John Worthing, J.P.: Mr. George Alexander. Algernon Moncrieff: Mr. Allen Aynesworth. Rev. Canon Chasuble, D.D.: Mr. H. H. Vincent. Merriman: Mr. Frank Dyall. Lane: Mr. F. Kinsey Peile. Lady Bracknell: Miss Rose Leclercq. Hon. Gwendolen Fairfax: Miss Irene Vanbrugh. Cecily Cardew: Miss Evelyn Millard. Miss Prism: Mrs. George Canninge.</w:t>
<w:t>FIRST ACT</w:t>
<w:t>SCENE</w:t>
<w:t>Morning-room in Algernon’s flat in Half-Moon Street. The room is luxuriously and artistically furnished. The sound of a piano is heard in the adjoining room.</w:t>
<w:t>[Lane is arranging afternoon tea on the table, and after the music has ceased, Algernon enters.]</w:t>
<w:t>ALGERNON. Did you hear what I was playing, Lane?</w:t>
<w:t>LANE. I didn’t think it polite to listen, sir.</w:t>
<w:t>ALGERNON. I’m sorry for that, for your sake. I don’t play accurately—any one can play accurately—but I play with wonderful expression. As far as the piano is concerned, sentiment is my forte. I keep science for Life.</w:t>
<w:t>LANE. Yes, sir.</w:t>
<w:t>ALGERNON. And, speaking of the science of Life, have you got the cucumber sandwiches cut for Lady Bracknell?</w:t>
<w:t>LANE. Yes, sir. [Hands them on a salver.]</w:t>
<w:t>ALGERNON. [Inspects them, takes two, and sits down on the sofa.] Oh! . . . by the way, Lane, I see from your book that on Thursday night, when Lord Shoreman and Mr. Worthing were dining with me, eight bottles of champagne are entered as having been consumed.</w:t>
<w:t>LANE. Yes, sir; eight bottles and a pint.</w:t>
<w:t>ALGERNON. Why is it that at a bachelor’s establishment the servants invariably drink the champagne? I ask merely for information.</w:t>
<w:t>LANE. I attribute it to the superior quality of the wine, sir. I have often observed that in married households the champagne is rarely of a first-rate brand.</w:t>
<w:t>ALGERNON. Good heavens! Is marriage so demoralising as that?</w:t>

While the content.xml file retains all the line breaks (hard returns) of the text document, the document.xml file “reinterprets” the text, reconstructing all the paragraphs even when this makes no sense, as with lists of characters and the actors who play them. It also adds punctuation that does not exist in the text file, such as commas to replace hard returns. This is why the file is shorter than the “Hamlet” file, but it introduces an arbitrary “simplification” that does not respect the original document.

Until today, I was convinced that the XML schema of OOXML files was unnecessarily complex for the reasons I have explained at length on several occasions. However, it is not only unnecessarily complex, but also unnecessarily “creative” (always complicating the lives of developers and users).

Conclusions

Unfortunately, the reality is what I have explained several times, without going into technical detail. This has been confirmed by more technical analyses of XLSX and DOCX files, and I believe it will also be confirmed by next week’s PPTX file analysis. Microsoft has created an unnecessarily complex and incomprehensibly creative file format, which complicates the lives of developers and users more than I thought.

Indeed, while it is challenging to manage artificial complexity, it is arguably impossible to manage “creativity” that reinterprets the contents of a document by inventing paragraphs where it might make sense — albeit with a faithful format — and where it makes no sense, as with lists.

Perhaps, in my personal opinion, “creativity” was introduced to make it difficult for companies based in countries where reverse engineering is not illegal to emulate the OOXML format, as I don’t believe “creative” reverse engineering is possible, even with the help of AI.

Users should protect their rights by choosing an open standard format, such as ODF, which gives them control over their content and everything that this entails, including privacy protection, proper management of sensitive data and the ability to decide what to share and with whom.

This is a format whose development process, characteristics, and version are known; whose description corresponds to what happens on the user’s PC; and which faithfully reproduces the contents of the displayed document. It is a format that enables even less experienced users to identify and, in many cases, solve problems.

In short, it is the only open and standard document format that we would all like to have, but which only a minority use due to a lack of knowledge about the reality of the OOXML format, and the messianic trust that too many users place in Microsoft. This leads them to believe that there cannot be a commercial strategy behind a document format that is hostile to users’ interests.

by Italo Vignoli at October 03, 2025 02:10 PM

September 18, 2025

LibreOffice Dev Blog

Debugging tips for LibreOffice

If you are working with LibreOffice code, trying to understand the code, fix bugs, or implement new features, you will need to debug the code at some point. Here are some general tips for a good debugging experience. Let’s start from the platform

Choose the Right Debug Platform

Choosing a platform to debug usually depends on the nature of the problem. If the problem is Windows-only, you need a Windows environment to build and debug the problem. But, if the problems can be reproduced everywhere, then you can choose the platform of your choice with the debugging tools that you prefer to debug the problem.

On Linux, it matters if you are running X11 or Wayland. Also, as there are multiple graphical back-ends available for LibreOffice, it matters if you are using X11, GTK3/4, or Qt5/6 back-end for your debugging. Some bugs are specific to GTK, then you should use GTK3 UI for testing. In 2025, GTK4 UI of LibreOffice is still experimental, so it is better to work with GTK3. For making the debugging easier, many developers work on X11 (gen) UI for debugging.

Debugging Tools

Various debugging tools can be used to debug the soffice.bin/soffice.exe LibreOffice binary that you have built. For the common debuggers, you can use GDB on Linux, lldb on macOS, and WinDbg or Visual Studio on Windows.

For using the above debuggers, you can use the IDE or front-end that support them. Various IDEs are usable with LibreOffice code. For a detailed explanation, refer to this Wiki article:

Make sure that you can build and debug a simple program before trying to build and debug LibreOffice.

Environment Variables

To have a better debugging experience, or to avoid problems you may have to customize the debugging session with environment variables. A complete article of the TDF Wiki is dedicated to discuss the environment variables that can be used with LibreOffice:

Here is some of the most important ones:

1) Using the X11 user interface:

If you want to use the X11 back-end that is simpler, and usually easier to work with on debug sessions, you have to set SAL_USE_VCLPLUGIN environment variable:

export SAL_USE_VCLPLUGIN=gen
That is specially useful when you are debugging graphical problems. But in some cases, you may need to avoid it or at least customize it. For example, while debugging mouse-related problems you may need to tell LibreOffice to avoid mouse grabbing this way:

export SAL_NO_MOUSEGRABS=1

2) Using GTK user interface

If you are using GTK user interface, then you may use GTK inspector to interactively debug LibreOffice GUI. You can use it this way:

export GTK_DEBUG=interactive

Pretty Printers

In solenv/gdb/ inside LibreOffice source code, you may find pretty printers for GDB. This is helpful when debugging LibreOffice with GDB, to be able to see data in a more readable way.

Dumping Data

Sometimes when you debug a LibreOffice application, it is easier to dump data into file for easier diagnosis. There are key combinations that are enabled in debug mode for this purpose. To use them, you need to build LibreOffice with the configuration option --enable-dbgutil.

These are some of them related to text boxes, rendered with editeng module:

  • Ctrl+Alt+F11 – toggles dumping the edit engine state to the
    editenginedump.log on Draw
  • Ctrl+Alt+F12 – dumps the current edit engine state to editenginedump.log

There are other key combinations for using in Writer and Draw:

  • SW_DEBUG=1 enables F12 for dumping layout.xml, and Shift+F12 for nodes.xml which are Writer document dumps
  • SD_DEBUG=1 enable F12 for model.xml which contains Draw graphic object dump

These key combinations can be used with Calc:

  • Ctrl+Shift+F12: Dump the column width of the first 20 columns
  • Ctrl+Shift+F11: Dump the graphic objects and their position and size in pixels
  • Ctrl+Shift+F6: Dump the cell properties’ of the current selection as dump.xml

These key combinations help to debug some useful details about the application for diagnosis. They are only active in debug mode, as described.

Further Information

We have a complete TDF Wiki article dedicated to debugging. So, make sure that you take a look at the relevant parts:

Debugging needs patience, but can be the best way to find the root cause of some bugs.

by Hossein Nourikhah at September 18, 2025 02:11 PM

September 16, 2025

LibreOffice QA Blog

QA/Dev Report: August 2025

General Activities

  1. LibreOffice 25.8.0 and LibreOffice 25.8.1 were announced on August 20 and August 29 respectively
  2. Olivier Hallot (TDF) updated help for the option to load printer settings with document, sorting blocks of cells in Calc, hyphenation, statistical functions, number of lines in charts, exponentiation operator in Calc, remote files, Edit menu in Calc, object rotation, Math options and MATCH function in Calc
  3. Celia Palacios added help for the new Intersect() method in ScriptForge
  4. Gábor Kelemen (Collabora) did many code cleanups
  5. Tomaž Vajngerl (Collabora) did many code cleanups and added OOXML test documents for text fitting / scaling
  6. Pranam Lashkari and Marco Cecchetti (Collabora) worked on LOKit used by Collabora Online. Marco also made it so hovering with the mouse over Chart data range colour palette entries in the Sidebar shows a live preview in the active chart
  7. Miklós Vajna (Collabora) added list and inline code block support for Markdown export and continued improving the handling of tracked changes that depend on each other
  8. Xisco Faulí (TDF) fixed crashes, added over a dozen new automated tests, upgraded many dependencies and did many code cleanups and optimisations
  9. Michael Stahl (Collabora) made it so pasted anchored objects are no longer selected by default while adding an expert configuration option for the behaviour, added overline support to XHTML export and worked around a dbus bug affecting the build process on some Linux systems
  10. Mike Kaganski (Collabora) fixed an issue with embedded fonts getting dropped from opened files in certain scenarios on Windows, made it so the user can choose to either discard license-restricted embedded fonts in an opened document or switch to read-only mode, improved PPTX compatibility with trailing empty lines in automatically shrinking text boxes, fixed long links getting truncated when exporting to XLSX, fixed issues with inserting hyperlinks in Calc via the API, made Calc text insertion API methods more robust, fixed inserting PDFs into spreadsheets, fixed a string handling issue in Basic’s Format function, fixed a VBA macro issue with dates and fixed processing of escaped backslashes in RTF files. He also did many code cleanups and optimisations
  11. Caolán McNamara (Collabora) fixed many issues found by static analysers and did code cleanups and optimisations
  12. Stephan Bergmann (Collabora) worked on the WASM build. He also adapted the code to compiler changes and did code cleanups
  13. Noel Grandin (Collabora) improved the scrolling speed in Writer documents with lots of comments. He also did many code cleanups and optimisations, especially in the area of transparency handling
  14. Justin Luth (Collabora) improved DOCX compatibility with margins of aligned floating objects, fixed right/left only page breaks going missing with DOC/DOCX export, fixed a DOCX indentation issue, fixed column breaks going missing in certain DOCX files, fixed an issue with numbered lists created by AutoCorrect, made it so justified text with section breaks in saved DOC files no longer triggers an MS Word bug and fixed numbering or bullets getting lost when applying a paragraph style
  15. Michael Weghorn (TDF) continued cleaning up and reorganising accessibility-related code, improved the accessibility of Spelling dialog, fixed an (unreleased) issue with Borders tab in formatting dialogs, improved the handling of programmatic accessibility selections and made the GTK4 Sidebar more robust. He also worked on using native widgets in Qt UIs
  16. Balázs Varga (Collabora) continued polishing support for Microsoft Media Foundation APIs on Windows, fixed an issue with the display of customised placeholder text set in the master slides of PPTX documents, fixed an issue with PPTX placeholder text becoming small after focusing into and out of it, fixed unwanted copying of elements when inserting rows before pivot table in row 1 in Calc and made it so empty Calc cells are never rotated
  17. Patrick Luby fixed not being able to access or create an ODB file based on the macOS system addressbook and made the addressbook handling code more robust. He also adjusted UI widget code after changes in macOS Tahoe
  18. Christian Lohmaier (TDF) fixed the MSI installer for Windows Arm64 and improved the winget-based Windows build setup
  19. Jonathan Clark (TDF) improved the performance of certain poorly structured DOC files, added handling of vertical text in DOCX files adhering to OOXML strict format and improved Microsoft Word compatibility regarding the laying out of text using CJK fonts
  20. Andreas Heinisch fixed some issues with tooltips and the display of URLs
  21. Julien Nabet did some code cleanups
  22. Bayram Çiçek (Collabora) implemented support for xmlMaps in XLSX files
  23. Heiko Tietze (TDF) applied vertical tabs to many dialogs and fixed an issue with column headers overlapping in Calc when the columns are very narrow
  24. Sahil Gautam (Collabora) added a UNO command to select a comment in the Navigator and did some code cleanups
  25. Armin Le Grand (Collabora) worked on EditEngine rendering revamp and other rendering-related reworks
  26. Arnaud Versini did some code cleanups
  27. Regina Henschel fixed unwanted duplication of “mouse as pen” objects in slideshows and implemented API support for Natural Sort in Calc data ranges
  28. David Gilbert implemented support for importing PDFs with transparency groups
  29. Ujjawal Kumar worked on the Markdown import GSoC project
  30. Pierre Vacher fixed an issue with creating tables in Base using the wizard, made the Base ResultSet code more robust and fixed a Base issue with redisplaying the authentication dialog after a failed connection
  31. Kohei Yoshida (Collabora) implemented automatic mapping of generic JSON and XML documents to Calc using the orcus library
  32. Markus Mohrhard fixed column labels not updating after inserting rows below title in Calc, fixed cell comments not getting exported to FODS in some cases, fixed range names getting dropped in XLSB export, fixed incorrect sizing of charts in XLS import and fixed a crash during colorscale calculation
  33. Jean-Pierre Ledure worked on the ScriptForge library
  34. Adam Seskunas worked on the C++ Report Builder GSoC project
  35. Chris Sherlock did code cleanups and refactoring in VCL toolkit
  36. Rico Tzschichholz (Ubuntu) fixed a test failure on armhf platform
  37. László Németh added DTP feature maximum letter spacing to Writer
  38. René Engelhard (Debian) improved the build system options
  39. Bartosz Kosiorek improved EMF graphics support
  40. Darshan Upadhyay added UNO commands for setting page orientation and size and sheet margins in Calc
  41. Amin Irgaliev added connector support for Calc
  42. Neil Roberts made it so comments are not scrolled into view after a keypress that does not do anything

Kudos to Ilmari Lauhakangas for helping to elaborate this list.

Reported Bugs

459 bugs, 48 of which are enhancements, have been reported by 295 people.

Top 10 Reporters

  1. Mike Kaganski ( 14 )
  2. Regina Henschel ( 14 )
  3. Eyal Rozenberg ( 13 )
  4. Gabor Kelemen (allotropia) ( 12 )
  5. prrvchr ( 12 )
  6. Telesto ( 9 )
  7. nobu ( 8 )
  8. Heiko Tietze ( 8 )
  9. Xisco Faulí ( 8 )
  10. Gerald Pfeifer ( 7 )

Triaged Bugs

376 bugs have been triaged by 63 people.

Top 10 Triagers

  1. m_a_riosv ( 59 )
  2. Xisco Faulí ( 39 )
  3. BogdanB ( 31 )
  4. Mike Kaganski ( 27 )
  5. Heiko Tietze ( 22 )
  6. raal ( 17 )
  7. Olivier Hallot ( 15 )
  8. Saburo ( 13 )
  9. nobu ( 12 )
  10. V Stuart Foote ( 11 )

Resolution of resolved bugs

302 bugs have been set to RESOLVED.

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

Fixed Bugs

122 bugs have been fixed by 28 people.

Top 10 Fixers

  1. Mike Kaganski ( 15 )
  2. Noel Grandin ( 12 )
  3. Heiko Tietze ( 8 )
  4. Justin Luth ( 7 )
  5. Olivier Hallot ( 6 )
  6. Michael Weghorn ( 5 )
  7. Markus Mohrhard ( 4 )
  8. Caolán McNamara ( 4 )
  9. Miklos Vajna ( 4 )
  10. Xisco Fauli ( 4 )

List of critical bugs fixed

  1. tdf#167859 Creating or editing secondary x-axis in a chart crashes program. ( Thanks to Xisco Fauli )
  2. tdf#167875 Writer crashes if you right click in latest table in the big document ( Thanks to Xisco Fauli )
  3. tdf#167956 CRASH: opening a second document with tabbed notebookbar ( WORKAROUND: Change UI to Standard Toolbar from View – User Interface) ( Thanks to Noel Grandin )
  4. tdf#167988 Deleting an existing “Mean value line” or a “Trend line” in a chart crashes program. ( Thanks to Mike Kaganski )
  5. tdf#168017 CRASH: importing certain documents ( Thanks to Caolán McNamara )

List of high severity bugs fixed

  1. tdf#167812 Dark mode: font dropdown shows white rectangles (GTK3) ( Thanks to Noel Grandin )
  2. tdf#167893 Presentation mode adds “random” visual artefacts to box shapes/groups ( Thanks to Noel Grandin )

List of crashes fixed

  1. tdf#167859 Creating or editing secondary x-axis in a chart crashes program. ( Thanks to Xisco Fauli )
  2. tdf#167875 Writer crashes if you right click in latest table in the big document ( Thanks to Xisco Fauli )
  3. tdf#167901 In 2nd sheet, copy (and close), Crash ( Thanks to Xisco Fauli )
  4. tdf#167936 LibreOffice crash (segmentation fault) when opening document from UNO pipe ( Thanks to Noel Grandin )
  5. tdf#167956 CRASH: opening a second document with tabbed notebookbar ( WORKAROUND: Change UI to Standard Toolbar from View – User Interface) ( Thanks to Noel Grandin )
  6. tdf#167988 Deleting an existing “Mean value line” or a “Trend line” in a chart crashes program. ( Thanks to Mike Kaganski )
  7. tdf#168017 CRASH: importing certain documents ( Thanks to Caolán McNamara )
  8. tdf#168139 LibreOffice crash asserts with Skia/Vulkan on X11 (gen) VCL backend ( Thanks to Hossein )

List of performance issues fixed

  1. tdf#156297 In Calc, scrolling becomes very slow when hiding (many) columns ( Thanks to Caolán McNamara )

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

  1. tdf#104827 FILESAVE DOC: Justified Text with Section Breaks Incorrectly Exported ( Thanks to Justin Luth )
  2. tdf#108244 Cell Comments lost if not displayed before Saving in FODS Format (steps in comment 22) ( Thanks to Markus Mohrhard )
  3. tdf#111634 Multiple memory leaks in libmacabdrv1 ( Thanks to Patrick Luby )
  4. tdf#129808 FILEOPEN DOC/X: Line spacing narrower than Word due to special handling of font code page range bits ( Thanks to Jonathan Clark )
  5. tdf#140027 EDITING inserting rows before pivot table in row 1 copies format and images from headings ( Thanks to Balazs Varga )
  6. tdf#141033 Usability : Base Form Control Property dialog window width is too narrow by default ( Thanks to Caolán McNamara )
  7. tdf#143182 Format Basic function converts string to number irrespective of format string ( Thanks to Mike Kaganski )
  8. tdf#44729 PDF import from Inkscape PDF export with opacity shows black background for each opaque object ( Thanks to Dr. David Alan Gilbert )
  9. tdf#67797 FORMATTING: Creating Manual Numbered List Fails, parses C. as Roman numeral “C” (Comment 11) ( Thanks to Justin Luth )
  10. tdf#81003 BASIC runtime error. ‘380’ Incorrect property value ( Thanks to Mike Kaganski )
  11. tdf#84949 Placing mouse Cursor over Left tab, Center tab, Right tab, Decimal tab icon doesn’t show a tooltip ( Thanks to Andreas Heinisch )
  12. tdf#87058 column label functions do not update after inserting rows below title – needs save and reload including a hard recalc ( Thanks to Markus Mohrhard )
  13. tdf#94259 FILEOPEN XLS Charts are vertically squashed ( Thanks to Markus Mohrhard )
  14. tdf#94627 FILEOPEN: CALC do not recognise cell names on .xlsb files ( Thanks to Markus Mohrhard )

WORKSFORME bugs

42 bugs have been retested by 22 people.

Top 10 testers

  1. Buovjaga ( 8 )
  2. BogdanB ( 7 )
  3. Michael ( 4 )
  4. m_a_riosv ( 4 )
  5. Dieter ( 2 )
  6. xordevoreaux ( 2 )
  7. Heiko Tietze ( 2 )
  8. V Stuart Foote ( 2 )
  9. Mauro Calzavara ( 1 )
  10. Regina Henschel ( 1 )

DUPLICATED bugs

98 bugs have been duplicated by 29 people.

Top 10 testers

  1. Xisco Faulí ( 18 )
  2. BogdanB ( 11 )
  3. nobu ( 10 )
  4. Mike Kaganski ( 8 )
  5. Buovjaga ( 6 )
  6. m_a_riosv ( 6 )
  7. Alex Thurgood ( 5 )
  8. Saburo ( 5 )
  9. Jonathan Clark ( 3 )
  10. Heiko Tietze ( 2 )

Verified bug fixes

13 bugs have been verified by 8 people.

Top 10 Verifiers

  1. BogdanB ( 3 )
  2. Gerald Pfeifer ( 3

by x1sc0 at September 16, 2025 09:42 AM

September 15, 2025

Mike Kaganski

A fairy tale about poor UX enforcing vendor lock-in

Once upon a time, there was a girl, who used WhatsApp in her iPhone. She was rather active there, and collected quite some important data in the app over time. But some things in her iPhone were inconvenient; and the phone was slowly aging. So she wanted to change her phone some day.

For her birthday, a fairy, who learned somehow about the girl’s wish, presented her a new Android phone. That was a nice new phone, and the girl was so happy! She decided to move everything from the old phone to the new one immediately.

She was worrying about how to move the precious data between the devices; but she felt a huge relief, when the phone spoke: “The fairy told me how important your data is to you; and I have magic powers to handle it all. Just connect the old phone to me with a cord”. So she did.

The new phone started its work; and the girl could see how the progress bar was gradually moving to completion; but suddenly it stopped; minutes passed, but the bar was motionless. The girl was impatient to start using her new shiny device, but she knew that she needs to wait. And she waited; and waited; but after an hour passed, she noticed something horrible: the old phone was sucking the life out of the new device through the cable!

The scared girl could only hope that the process would resume, and finish before the new phone is out of power. She searched and learned, that iPhones are known for their insatiable hunger, and whenever they are connected to anything with energy, they start sucking it. She couldn’t even ask the new phone to shine less brightly to save the energy – because it wasn’t ready for such things yet. She used her wireless charger, but its powers were fewer than the hunger of iPhone, combined with the hard work done by Android. The energy level still decreased too fast.

In the end, when the hope almost vanished, the progress resumed moving! But immediately, the new phone said: “When I collected your data from your old phone, something bad happened, and I failed to collect something. I will continue, but please check later, what’s missing!”.

Only a couple of energy drops were remaining in the new phone, when it finished its task, and could be disconnected from the vampire. But the girl was terrified, when she opened WhatsApp, connected to it (using a magic SMS confirmation), only to see that all her data is lost! She tried to open WhatsApp on the old phone to check if something is still there, and saw that the app had disconnected her. So she used the SMS magic again, and – to her great relief – everything was there!

She askes WhatsApp, how to move the data; and it answered, that if she moved from iPhone to iPhone, or from Android to Android, she could use a backup; but from iPhone to Android, only the Transfer Wizard was supported. So she decided to try again.

Long story short, but this time, everything repeated exactly the same. The energy was sucked from the new phone; the wireless charger couldn’t fully compensate that; the progress stopped, and then a failure happened; the data wasn’t there. This time, when she spelled the SMS magic, she needed to wait some minutes before it worked. It was because the wise powers out there were caring and guarded her from possible villains trying to steal her data, so demanded a delay.

The girl was desperate. She was almost ready to throw the new phone away. But after some time, she decided to talk to WhatsApp again. She asked it, what to do, and got the same advice. She explained her problem, but the app was adamant. And only after a long persuasion, and even some threats, the app told her a secret, that there are third-party paid apps, that can also move her data from phone to phone!

Poor girl had no choice, and bought one such app. She launched it, and asked to transfer her data. And the helper app said: “Connect your phone to your old iPhone with a cable!”

You can imagine how sad was the girl hearing that. But she did what the app asked; and as she feared, the iPhone started to do what it always did. The progress was painfully slow, as you already guessed. Everything was almost exactly as before. But something changed this time: there was no error! The task took even longer; and when it finished, the new phone almost died; but it finished!!!

The heart of the girl was full of happiness. She wanted to open WhatsApp immediately, to know if everything is there! But first, she had to do the SMS magic. She casted the spell … and the powers replied her, that she has to wait eight hours!

I lack the ability to describe her anger, when she heard that. She came through pains, she lost her money, lots of time and nerves – and now she couldn’t do the last step just now. The time lasted incredibly slow … but eventually, she overcame that last obstacle, and was glad to learn, that this time, everything was there.

But I hear the demonic laughter of someone, who designed a process, where one insanity was piled upon another: where you can’t move the data using normal means; where you use a vampire cables; where error messages don’t allow you to fix anything by telling where the problem is; where you have to pay to have your data back (oh no, WhatsApp is not like that ransomware, just the end result is the same); where the security measures aggravate the grief, because they don’t account for problems of their own software; and overall, where the app makes its transfer so complicated, that people would rather stay with old vendor, just to not experience that again.

by mikekaganski at September 15, 2025 08:25 AM

September 11, 2025

LibreOffice Dev Blog

Using C++ STL functions instead of loops – EasyHack

C++ Standard library, which resides in std:: namespace provides common classes and functions which can be used by developers. Among them, Standard Template Library (STL) provides classes and functions to better manage data through data structures named containers. Here I discuss how to use STL functions for better processing of data, and avoid loops.

Checking Conditions

To iterate over a container to see if some specific condition is valid for all, any, or none of the elements in that container, C/C++ developers traditionally used loops.

On the other hand, since C++11, there are functions that can handle such cases: all_of, any_of and none_of. These functions process STL containers, and can replace loops. If you want to know if a function returns true for all, any, or none of the items of the container, then you can simply use these functions. This is the EasyHack dedicated to such a change:

Here is an example patch which uses any_of instead of a loop:

-    bool bFound = false;
     // convert ASCII apostrophe to the typographic one
     const OUString aText( rOrig.indexOf( '\'' ) > -1 ? rOrig.replace('\'', u'’') : rOrig );
-    size_t nCnt = aVec.size();
-    for (size_t i = 0;  !bFound && i < nCnt;  ++i)
-    {
-        if (aVec[i] == aText)
-            bFound = true;
-    }
+    const bool bFound = std::any_of(aVec.begin(), aVec.end(),
+        [&aText](const OUString& n){ return n == aText; });

As you can see, the new code is more concise, and avoids using loops.

Conditional Copying, Removing and Finding

If you want to copy, remove or simply find a value in a container which conforms to a specific functions, you may use copy_if, remove_if or find_if.

Again, this is an example patch:

-  for ( size_t i = 0; i < SAL_N_ELEMENTS( arrOEMCP ); ++i )
-        if ( arrOEMCP[i] == codepage )
-            return true;
-
-    return false;
+    return std::find(std::begin(arrOEMCP), std::end(arrOEMCP), codepage) != std::end(arrOEMCP);

Final Words

Refactoring code is a good way to improve knowledge on LibreOffice development. The above EasyHacks are among EasyHacks that everyone can try.

More information about EasyHacks, and how to start working on them can be found on TDF Wiki:

by Hossein Nourikhah at September 11, 2025 02:24 PM

September 09, 2025

Miklos Vajna

Interdependent tracked changes improvements in Writer, part 3

Writer has some support for interdependent (or hierarchical) tracked changes: e.g. the case when you have a delete on top of an insert. See the second post for background.

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

Motivation

With the already mentioned improvements in place, the area of format redlines with character style or direct formatting changes were still lacking: Writer's original model here was just marking a text range as "formatted" and then either accept the format redline as-is, or reject reverting back to the paragraph style (default formatting), losing the old character style or old direct formatting.

Results so far

Here is a sample case of a document where the old character style is Strong (~bold) and the font size is 24pt, while the new character style is Quote (~italic) and the font size is 36pt. The rest of the document uses no specific character styles and has the font size of 12pt:

Interdependent tracked change: improved format, after document load

Rejecting that format redline resulted in just the defaults, i.e. no character style and 12pt font size:

Interdependent tracked change: old reject, lost character style / direct format

But now we track the old character style & direct format:

Interdependent tracked change: new reject, handled character style / direct format

This required changes in the DOCX import, ODF import and ODF export, too.

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:

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

by Miklos Vajna at September 09, 2025 06:23 AM

August 28, 2025

LibreOffice Dev Blog

Unit conversion in LibreOffice code – EasyHack

LibreOffice handles different input and output formats, and also displays text and graphics alongside inside the GUI on computer displays. This requires LibreOffice to understand various different measurement units, and convert values from one to another.

Unit selection

Unit selection

The unit conversion can be done by writing extra code, where one should know the units, and calculate factor to convert them to each other.

For example, consider that we want to convert width from points into 1/100 mm, which is used in page setup.

We know that:

1 point = 1/72 inch
1 inch = 25.4 mm = 25400 microns
factor = 25400/(72*10) ≈ 35.27777778

Then, it is possible to write the conversion as:

static int PtTo10Mu( int nPoints )
{
return static_cast<int>((static_cast<double>(nPoints)*35.27777778)+0.5);
}

A separate function that casts integer nPoints to double, then multiplies it by the factor which has 8 decimal points, and then rounds the result by adding 0.5 and then truncates it and stores it in an integer. This approach is not always desirable. It is error-prone, and lacks enough accuracy. For big values, it can calculates values off by one.

Another approach is to use o3tl (OpenOffice.org template library) convert function. It is as simple as writing:

int nResult = o3tl::convert(nPoint, o3tl::Length::pt, o3tl::Length::mm100)

As you can see, it is much cleaner, and gives the output, properly rounded as an integer!

You need a double? No problem! You can use appropriate template to achieve that:

double fResult = o3tl::convert<double>(nPoint, o3tl::Length::pt, o3tl::Length::mm100)

These are the supported units, defined in the header include/o3tl/unit_conversion.hxx:

mm100 – 1/100th mm = 1 micron

mm10 – 1/10 mm

mm – millimeter

cm – centimeter

m – meter

km – kilometer

emu – English Metric Unit (1/360000 cm)

twip – Twentieth of a point (1/20 pt)

pt – Point (1/72 in)

pc – Pica (1/6 in)

in1000 – 1/1000 in

in100 – 1/100 in

in10 – 1/10 in

in – inch

ft – foot

mi – mile

master – PPT Master Unit (1/576 in)

px – Pixel unit (15 twip, 96 ppi)

ch – Char unit (210 twip, 14 px)

line – Line unit (312 twip)

Handling Overflows

If you are doing a conversion, it is possible that the result overflows. With o3tl::convert() you can handle it this way:

sal_Int64 width = o3tl::convert(nPoint, o3tl::Length::pt, o3tl::Length::mm100, overflow, 0);
if (overflow)
{
...
}

Code Pointers

To to find instances to change, one can try finding some magic numbers listed here. For example, consider measuring a line based on twips:

line – Line unit (312 twip)

If you search for 312, you may find some examples:

$ git grep -w 312 *.cxx

Final Words

The task described here is filed as tdf#168226:

EasyHacks are well-defined small tasks that are designed to help newcomers begin LibreOffice programming. If you like it, you can start working on it!

Using o3tl::convert() not only simplifies the unit conversion, but it also improves the accuracy. There is a possibility to handle overflow, which is not easily possible if you do the conversion manually. Therefore, unit conversion using this function is usually the best option in LibreOffice.

If you need help starting LibreOffice coding, make sure that you see this tutorial first:

Getting Started (Video Tutorial)

by Hossein Nourikhah at August 28, 2025 02:06 PM

August 15, 2025

Miklos Vajna

Multi-page floating tables in Writer: keep together or not

This post is part of a series to describe how Writer now gets a feature to handle tables that are both floating and span over multiple pages.

This work is primarily for Collabora Online, but is useful on the desktop as well. See the 11th post for the previous part.

Motivation

Previous posts described the hardest part of multi-page floating tables: making sure that text can wrap around them and they can split across pages. In this part, we'll look at a conflicting requirement. On one hand, headings want their text to not split across pages (and shapes anchored into paragraphs are considered part of the paragraph, too). On the other hand, it should be OK to have a floating table at the bottom of a page and the following heading to go to the next page.

It turns out, Writer gave "keep together" a priority, while Word gave "floating tables are OK to split to a previous page" a priority.

Note that if you have a shape (e.g. a triangle) and not a floating table, then both Word and Writer prevents the move of that shape to a previous page (if the shape is anchored in a heading); this difference was there just for floating tables.

Results so far

Here is how the tdf#167222 bugdoc looks like now in Writer:

Floating table, followed by heading: new Writer render

And here is how it used to look like:

Floating table, followed by heading: old Writer render

And here is the reference rendering:

Floating table, followed by heading: reference render

This means that we leave layout for shapes unchanged in general: shapes anchored in headings are still considered to be part of headings and don't split. But for floating tables, we now allow them to split and use space at a previous page if they fit there.

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

by Miklos Vajna at August 15, 2025 06:14 AM

August 11, 2025

LibreOffice QA Blog

QA/Dev Report: July 2025

General Activities

  1. LibreOffice 25.2.5 was announced on July 17
  2. Olivier Hallot (TDF) updated help for CSV import, explained Property Mapping in help for Charts and improved help for Calc’s FILTERXML function and AutoFilter
  3. Gábor Kelemen (Collabora) did many code cleanups
  4. Tomaž Vajngerl (Collabora) made internal hyperlinks in a table of contents accessible when exported to PDF/UA
  5. Pranam Lashkari, Szymon Kłos and Hubert Figuière (Collabora) worked on LOKit used by Collabora Online
  6. Parth Raiyani (Collabora) did reorganisations in some dialogs
  7. Miklós Vajna (Collabora) polished the support for floating tables in Writer, fixed some crashes and continued improving the handling of tracked changes that depend on each other
  8. Xisco Faulí (TDF) added Albanian and Moldovan locale, fixed short weekdays in Romanian locale, improved the translation checker script, added some new automated tests, upgraded many dependencies and did many code cleanups and optimisations
  9. Michael Stahl (Collabora) fixed an issue with expansion of list level numbering formats with repeated levels and fixed a column width issue in RTF tables
  10. Mike Kaganski (Collabora) implemented Markdown export, fixed not being able to apply colour to Chart walls via Sidebar, fixed an issue with paragraph numbering in RTF files, helped Miklós with floating table polishing, fixed an issue with date conversion in Base, made URL handling more robust in Extension updating code, fixed and issue with spacing in lists in RTF files, fixed RTF export issues causing loss of bullet fonts and “No character border” explicit formatting and fixed some crashes. He also did many code cleanups and optimisations
  11. Caolán McNamara (Collabora) fixed many issues found by static analysers and did code cleanups and optimisations
  12. Stephan Bergmann (Collabora) worked on the WASM build. He also adapted the code to compiler changes and did code cleanups
  13. Noel Grandin (Collabora) made Skia rendering backend mandatory on Windows and greatly improved the import time of CSV data with trailing newline characters. He also did many code cleanups and optimisations, especially in the area of transparency handling
  14. Justin Luth (Collabora) made it so failed command line operations return exit status 1, allowing for automated bisecting of command line issues among other things, fixed an issue with spellchecking and the option “Check uppercase words” and fixed a style continuity issue with page breaks in DOCX files
  15. Michael Weghorn (TDF) continued cleaning up and reorganising accessibility-related code, made the orientation radio buttons in Envelope dialog accessible, fixed an issue with unwanted focus accessibility events being fired in Borders tab page of Writer’s Paragraph dialog, made the border preset selection be clearly indicated when focused, implemented support for native colour pickers in GTK and Qt UIs and did cleanups and reorganisations in Android, vcl and report design code. He also worked on using native widgets in Qt UIs
  16. Balázs Varga (Collabora) implemented support for Microsoft Media Foundation APIs on Windows for playback of common codecs, fixed Calc’s MATCH function returning an incorrect result with inline arrays and fixed an issue with missing graphic bullets upon copying & pasting
  17. Patrick Luby reduced memory consumption related to font handling on macOS, fixed an issue preventing moving animated GIFs with arrow keys on macOS and fixed unwanted slowdown of GIF animation
  18. Christian Lohmaier (TDF) did some build fixes
  19. Jonathan Clark (TDF) improved font rendering on Windows, reorganised icon themes to support “right-to-left, top-to-bottom” writing direction variant, greatly improved the opening time of certain long RTL DOC files and added support for DOC/DOCX script type hinting
  20. Andreas Heinisch made it so expanded text is included in the tooltip of index fields
  21. Julien Nabet did some code cleanups and fixed issues found by static analysers
  22. Bayram Çiçek (Collabora) made field shadings adjust according to line spacing in order to prevent letters from being cut off
  23. Heiko Tietze (TDF) improved dark mode support and added an option for using horizontal tabs instead of vertical ones
  24. Kurt Nordback (Collabora) implemented exporting of chart style index to OOXML documents and continued working on support for recent MSO chart types
  25. Sahil Gautam (Collabora) continued polishing the Libreoffice Theme rework
  26. Armin Le Grand (Collabora) worked on EditEngine rendering revamp
  27. Arnaud Versini did some code cleanups and optimisations
  28. Khaled Hosny (Alif Type) optimised the performance of calculating text bounds
  29. Regina Henschel fixed an issue with Calc’s LOOKUP function when using an inline array as result vector
  30. David Gilbert fixed PDF import issues with stroke opacity and clipping and opacity during axial fills
  31. Ujjawal Kumar worked on the Markdown import GSoC project
  32. Ilmari Lauhakangas (TDF) added an “unpublished” decoration to the SDK documentation to help API users avoid methods marked as such and improved the placement of other decorations
  33. Gülşah Köse (Collabora) fixed styles going missing in change-tracked DOCX files
  34. Marc Mondesir did improvements in PDF export automated tests
  35. Pierre Vacher improved the robustness of Base and its table creation wizard
  36. Kohei Yoshida (Collabora) added an alternative CSV filter based on Orcus library
  37. Manish Mahapatra fixed indentation of headings when pasted as unformatted text
  38. Markus Mohrhard fixed issues with charts, Calc’s AutoFilter and made handling of OOXML files with invalid cell references more robust
  39. Hossein Nourikhah (TDF) fix the display of JDK version number and path in RTL UI
  40. Jean-Pierre Ledure worked on the ScriptForge library
  41. Bojidar Marinov unified the options for switching to form design mode
  42. Floris Bos added an option to disable external links in PDF export
  43. Samuel Mehrbrodt (Collabora) made it so Insert Hyperlink is shown in context menu when text is selected
  44. Buo-ren Lin (OSSII) fixed source fontwork object not being removed after being cut
  45. Adam Seskunas worked on the C++ Report Builder GSoC project
  46. Áron Budea (Collabora) made it possible to hide tracked changes in PDF export from the command line
  47. Chris Sherlock did code cleanups and refactoring in VCL toolkit

Kudos to Ilmari Lauhakangas for helping to elaborate this list.

Reported Bugs

429 bugs, 56 of which are enhancements, have been reported by 287 people.

Top 10 Reporters

  1. Mike Kaganski ( 15 )
  2. Gabor Kelemen (allotropia) ( 15 )
  3. Telesto ( 14 )
  4. nobu ( 12 )
  5. Eyal Rozenberg ( 12 )
  6. Justin L ( 9 )
  7. Michael Weghorn ( 7 )
  8. Timur ( 7 )
  9. wodsfort ( 5 )
  10. Pierre Fortin ( 4 )

Triaged Bugs

314 bugs have been triaged by 70 people.

Top 10 Triagers

  1. m_a_riosv ( 48 )
  2. Buovjaga ( 24 )
  3. V Stuart Foote ( 24 )
  4. Mike Kaganski ( 22 )
  5. Heiko Tietze ( 20 )
  6. nobu ( 13 )
  7. raal ( 13 )
  8. Saburo ( 13 )
  9. Michael Weghorn ( 10 )
  10. Xisco Faulí ( 9 )

Resolution of resolved bugs

268 bugs have been set to RESOLVED.

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

Fixed Bugs

142 bugs have been fixed by 35 people.

Top 10 Fixers

  1. Mike Kaganski ( 18 )
  2. Noel Grandin ( 9 )
  3. Jonathan Clark ( 8 )
  4. Markus Mohrhard ( 7 )
  5. Xisco Fauli ( 6 )
  6. Balazs Varga ( 5 )
  7. Heiko Tietze ( 4 )
  8. Olivier Hallot ( 3 )
  9. Justin Luth ( 3 )
  10. Patrick Luby ( 3 )

List of high severity bugs fixed

  1. tdf#148117 FILESAVE: PPTX: date in chart changes in MSO ( Thanks to Markus Mohrhard )
  2. tdf#159529 Excessive memory consumption in v24.2 ( Thanks to Patrick Luby )
  3. tdf#166813 installation crashing when using georgian text ( Thanks to Xisco Fauli )
  4. tdf#167466 Entering anything into the search box under Tools / Options causes LibreOffice 25.8.0.1 to instantly crash. ( Thanks to Xisco Fauli )

List of crashes fixed

  1. tdf#166813 installation crashing when using georgian text ( Thanks to Xisco Fauli )
  2. tdf#167466 Entering anything into the search box under Tools / Options causes LibreOffice 25.8.0.1 to instantly crash. ( Thanks to Xisco Fauli )
  3. tdf#167599 Crash in Object Inspector when switching from Properties to Services for ContentControls ( Thanks to Mike Kaganski )
  4. tdf#167633 LibreOffice debug build crashed on launch when a Java installation with a non-ASCII path is set during configure(rtl_uString_newFromAscii(rtl_uString**, const char*): Assertion `static_cast(*pCharStr) < 0x80' failed.) ( Thanks to Buo-ren Lin (OSSII) )

List of performance issues fixed

  1. tdf#117636 Multi-page block of Chinese glyphs slows down file opening and navigation ( Thanks to Jonathan Clark )
  2. tdf#64991 Opening a long RTL DOC file is extremely slow, while ok if resaved as DOCX in MS-Word ( Thanks to Jonathan Clark )

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

  1. tdf#117636 Multi-page block of Chinese glyphs slows down file opening and navigation ( Thanks to Jonathan Clark )
  2. tdf#118619 WEBSERVICE(URI) / FILTERXML Xpath not well explained ( Thanks to Olivier Hallot )
  3. tdf#118666 Headings are indented when pasting as unformatted text ( Thanks to Manish )
  4. tdf#118668 FILEOPEN: Librecalc doesn’t show all sheets in XLSX modified with exceljs ( Thanks to Markus Mohrhard )
  5. tdf#122336 Probably generated XLSX without DocProps folder opens empty (If resaved in MS Office, opens fine in LO) ( Thanks to Markus Mohrhard )
  6. tdf#136753 Use MDL (Moldovan Lei) along with other currencies ( Thanks to Xisco Fauli )
  7. tdf#136754 FILEOPEN: CHART: incorrect background ( Thanks to Markus Mohrhard )
  8. tdf#139834 [UI] String breaks translation gender ( Thanks to Olivier Hallot )
  9. tdf#143157 Alphabetical index field: on mouse-over include keys in tooltips ( Thanks to Andreas Heinisch )
  10. tdf#58511 EDITING: Cut fontwork object does not work ( Thanks to Buo-ren Lin (OSSII) )
  11. tdf#62408 MP4 videos aren’t handled in Windows (without additional codecs) ( Thanks to Balazs Varga )
  12. tdf#64991 Opening a long RTL DOC file is extremely slow, while ok if resaved as DOCX in MS-Word ( Thanks to Jonathan Clark )
  13. tdf#70102 RTL: Flipped toolbar button icons dont always look suitable ( Thanks to Jonathan Clark )
  14. tdf#80662 RTL: The update number of the java version number in Options dialog is on the wrong side ( Thanks to Hossein )
  15. tdf#96151 Please add Albania’s Currency, Locale Setting, and Albanian Language ( Thanks to Xisco Fauli )

WORKSFORME bugs

32 bugs have been retested by 21 people.

Top 10 testers

  1. Buovjaga ( 5 )
  2. Regina Henschel ( 3 )
  3. Dieter ( 2 )
  4. BogdanB ( 2 )
  5. alecrkerr ( 2 )
  6. Julien Nabet ( 2 )
  7. V Stuart Foote ( 2 )
  8. Justin L ( 2 )
  9. Wolfgang Jäger ( 1 )
  10. xordevoreaux ( 1 )

DUPLICATED bugs

40 bugs have been duplicated by 19 people.

Top 10 testers

  1. nobu ( 7 )
  2. Buovjaga ( 5 )
  3. m_a_riosv ( 4 )
  4. V Stuart Foote ( 4 )
  5. Mike Kaganski ( 3 )
  6. Xisco Faulí ( 3 )
  7. Heiko Tietze ( 2 )
  8. Robert Großkopf ( 2 )
  9. Markus Mohrhard ( 1 )
  10. Timur ( 1 )

Verified bug fixes

14 bugs have been verified by 10 people.

Top 10 Verifiers

  1. Eyal Rozenberg ( 2 )
  2. Telesto ( 2 )
  3. m_a_riosv ( 2 )
  4. Michael Weghorn ( 2 )
  5. BogdanB ( 1 )
  6. lol ( 1 )
  7. Patrick (volunteer) ( 1 )
  8. Hossein ( 1 )
  9. Tekstryder ( 1 )
  10. 林博仁 Buo-ren Lin ( 1 )

Categorized Bugs

193 bugs have been categorized with a metabug by 24 people.

Top 10 Categorizers

  1. BogdanB ( 31 )
  2. Roman Kuznetsov ( 30 )
  3. Eyal Rozenberg ( 21 )
  4. V Stuart Foote ( 19 )
  5. Michael Weghorn ( 11 )
  6. Heiko Tietze ( 11 )
  7. Jeff Fortin Tam ( 10 )
  8. Telesto ( 10 )
  9. Timur ( 7 )
  10. Saburo ( 7 )

Regression Bugs

43 bugs have been set as regressions by 18 people.

Top 10

  1. Buovjaga ( 6 )
  2. nobu ( 6 )
  3. Saburo ( 4 )
  4. Michael Weghorn ( 4 )
  5. raal ( 3 )
  6. Xisco Faulí ( 3 )
  7. Telesto ( 3 )
  8. Robert Großkopf ( 2 )
  9. m_a_riosv ( 2 )
  10. Timur ( 2 )

Bisected Bugs

52 bugs have been bisected by 10 people.

Top 10 Bisecters

  1. Saburo ( 26 )
  2. Xisco Faulí ( 6 )
  3. Michael Weghorn ( 4 )
  4. Buovjaga ( 3 )
  5. raal ( 3 )
  6. Gabor Kelemen (allotropia) ( 2 )
  7. Telesto ( 2 )
  8. Aron Budea ( 2 )
  9. jussuom ( 2 )
  10. Timur (

by x1sc0 at August 11, 2025 05:04 PM

July 29, 2025

LibreOffice QA Blog

LibreOffice 25.8 RC2 is available for testing

LibreOffice 25.8 will be released as final on August, 20, 2025 (check the Release Plan). LibreOffice 25.8 Release Candidate 2 (RC2) brings us closer to the final version, which will be preceded by Release Candidate 3 (RC3). Since the previous release, LibreOffice 25.8 RC1, 70 commits have been submitted to the code repository and 34 issues got fixed. Check the release notes to find the new features included in this version of LibreOffice.

LibreOffice 25.8 RC2 can be downloaded for Linux, macOS and Windows, and it will replace the standard installation.

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 your contribution! Happy testing!!!

Download it now!

by Italo Vignoli at July 29, 2025 11:55 AM

July 25, 2025

Mike Kaganski

Microsoft, anybody home?

You know what: Microsoft became miserably incompetent in IT.

I develop open-source code. But that never made me one of the “I hate proprietary software or IT giant corporations” types. I always saw the nice things that Microsoft offered to its users; I saw not only downsides in its products. And I also used (and continue to use) things created by it: Windows to start with (and I develop there, being able to debug and address issues specific to the platform that most of our users use); but also its email service for personal mail.

This Monday, I decided to send something to LibreOffice dev mailing list. Something I do from time to time, you know. Not too fascinating, right?

Well, this time, it turned out, Microsoft decided to teach me to fear them. Thunderbird shown me a message, that the mail couldn’t be sent (well, not a problem: will re-try again…), but then I found myself logged off, with “Your account has been blocked” message. They decided, that I violated their service agreement!

FTR: here is the mail. I was able to send it using another tech giant’s mail service. You may see that it’s full of links. Yes, that’s true; I prefer to provide references to my words. But tell me where was it violating anything in MS agreement?

OK, they have a stupid AI that is worse than good old filters. OK, they made it react immediately, as an undoubted authority. But that’s not a big problem, right? They provide a way to appeal! Let me do that.

And of course, they ask for the phone, and I provide it, just to get a nice reply:

And guess what: there is no other method!

OK! Let’s ask their support. (I am approaching to the point that fascinated me most.) I found a link to “Contact Microsoft Support” on the “Troubleshooting verification code issues” page; and after some automatic answers there, which didn’t answer my problem, I finally got a button telling me … tada …

Yes, you got it right. “Here is a page where we discuss problems signing in. You attempted our FAQ suggestions? You still can’t sign in? No problem! Contact our Support team, and we will solve your problem is a minute! But first, please sign in to continue.”

Heh. I used my wife’s account to contact support. And then I was given a very secret link to an appeal form, where I could file a support ticket. And the next morning, I got a message! Yay! It told me to do something! Let me try! What is that they tell me to do? Reading… hmm… go to sign-in page, and when they tell me that my account is blocked, provide a phone number? Wasn’t it exactly the thing I attempted and failed, and told them about that? But hey, they obviously fixed that problem overnight, they couldn’t just send me the useless instructions, right? Or could they?

They could.

They just ignored my description. They repeated the useless instructions, without taking care to check what the problem was. And they closed the ticket automatically. It has been resolved, you know.

I still am in the process. I filed another ticket, which they didn’t care to answer. I am still hopeful.

But this, once an IT tech leader, became utterly incompetent in IT. And for me, it’s a pity.

by mikekaganski at July 25, 2025 06:39 AM

July 10, 2025

LibreOffice QA Blog

LibreOffice 25.8 RC1 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 Release Candidate 1 (RC1) the third pre-release since the development of version 25.8 started at the beginning of December, 2024. Since the previous release, LibreOffice 25.8 Beta1, 178 commits have been submitted to the code repository and 101 issues got fixed. Check the release notes to find the new features included in this version of LibreOffice.

LibreOffice 25.8 RC1 can be downloaded for Linux, macOS and Windows, and it will replace the standard installation.

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 July 10, 2025 11:00 AM

July 08, 2025

Miklos Vajna

Interdependent tracked changes improvements in Writer, part 2

Writer has some support for interdependent (or hierarchical) tracked changes: e.g. the case when you have a delete on top of an insert. See the first post for background.

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

Motivation

With the already mentioned improvements in place, a few areas were still lacking: we didn't have UI for all cases where the DOCX import was possible already; combining tracked changes (redlines) were not complete (so you don't have to reject all parts of a logical redline one by one) and some of the undo/redo code didn't work as expected.

Results so far

Here is a sample case where the UI was missing to create something that was possible to import from DOCX: a format redline on top of an insert redline.

If you had a document with an insert:

Interdependent tracked change: just insert

And you selected BBB to mark those characters as bold, we just updated the existing insert redline to be bold:

Interdependent tracked change: old, format is not tracked separately

But now we track a format change on top of the insert separately:

Interdependent tracked change: new, format is tracked separately

This is also visible if you open the track changes dialog, which explains that now you have part of the insert redline covered by a format redline:

Interdependent tracked change: UI dialog now showing multiple redlines

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:

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 July 08, 2025 06:43 AM

July 07, 2025

LibreOffice QA Blog

QA/Dev Report: June 2025

General Activities

  1. LibreOffice 25.2.4 was announced on June 6
  2. Olivier Hallot (TDF) added help for compact layout Pivot Tables, Writer table formula MOD and improved the help for Writer’s Send menu commands, font colour, text attributes for drawing objects, Calc shortcut keys, Calc’s LOOKUP function, Of-Pie charts and file conversion filters
  3. Pierre F. added help for Writer table formula INT
  4. Gábor Kelemen (Collabora) simplified code for VCL settings and did many other code cleanups
  5. Tomaž Vajngerl (Collabora) continued polishing support for embedded fonts in PowerPoint files
  6. Marco Cecchetti (Collabora) worked on LOKit used by Collabora Online
  7. Jaume Pujantell (Collabora) improved the import of ref fields in DOCX files
  8. Parth Raiyani (Collabora) makde it so the Layouts panel in Impress Sidebar now uses a native IconView widget instead of the ValueSet widget
  9. Miklós Vajna (Collabora) fixed a Writer list indent removal issue, implemented RTF export of section breaks right sections, fixed an issue with images inside shapes being sized incorrectly in RTF files and continued improving the handling of tracked changes that depend on each other
  10. Xisco Faulí (TDF) implemented Writer table formula MOD, added support for transparent fill colour in SVGs, removed the Euro converter wizard, added several new automated tests, upgraded many dependencies and did many code cleanups and optimisations
  11. Michael Stahl (Collabora) continued working on multi-user editing based on a conflict-free replicated data type (CRDT) and improved the stability of handling Writer comments within the Navigator
  12. Mike Kaganski (Collabora) fixed invisible tree view expansion triangles in Python script organizer, fixed an issue with storing selected encodings in the Text Import dialog, fixed a document read error, fixed an issue with accessing VBScript objects in macros, made menu command code more robust, fixed display of Cyrillic text in RTF files, fixed issues with pasting shapes between LibreOffice applications, fixed Manage Changes dialog not enabling Accept / Reject buttons initially, improved the display of Calc’s Number format dialog in the case of a selection containing different number locales, fixed an RTF table width issue, made bracketing of selected text more robust, fixed a Skia/Vulkan rendering issue affecting line numbers in Basic IDE, fixed an issue with Basic IIf function when used with array indexes, reduced console message noise when running LibreOffice from the command line and fixed several crashes. He also did many code cleanups and optimisations
  13. Caolán McNamara (Collabora) helped Heiko with vertical tabs, fixed crashes and many issues found by static analysers and did code cleanups and optimisations
  14. Stephan Bergmann (Collabora) worked on the WASM build
  15. László Németh added an indicator for justified lines with overly large word spacing
  16. Noel Grandin (Collabora) improved rendering speed of transparent shape fills dramatically, fixed a Windows GDI backend resource use issue seen in documents with lots of styles when the style preview is visible, made Skia rendering backend mandatory on macOS and improved the performance of style handling in Calc. He also did many code cleanups and optimisations
  17. Justin Luth (Collabora) fixed a DOCX export issue with mirrored page margins and fixed unwanted spacing in paragraph styles in certain imported DOCX files
  18. Michael Weghorn (TDF) continued cleaning up and reorganising accessibility-related code, fixed UI-related crashes and made Impress Slide pane accessible. He also worked on using native widgets in Qt UIs
  19. Balázs Varga (Collabora) fixed an issue with overly small line spacing in Impress placeholder boxes that shrink text upon overflow and did several improvements to the accessibility checker
  20. Patrick Luby implemented handling of macOS “Reverse Conversion” menu item, which helps users with Japanese keyboards and helped Heiko with vertical tabs
  21. Christian Lohmaier (TDF) fixed many build issues, improved the Windows WSL build setup and expanded Vim and VS Code integration features
  22. Jonathan Clark (TDF) implemented the ODF 1.0 style:script-type text property and made it so manually specifying a language for selected text sets this script-type hint, helping LibreOffice format the text in the expected way, fixed an issue with text pasted from Impress to Writer using a font from the wrong script and fixed mixed-direction text in Calc cells and Writer sometimes becoming overlapped (due to separate issues)
  23. Andreas Heinisch fixed an issue with Calc AutoFilter not showing updated settings after a reset
  24. Julien Nabet fixed a crash with embedded fonts in PPTX files and fixed some smaller errors, including swapped arguments in the help for Fourier function
  25. Bayram Çiçek (Collabora) fixed unwanted display of changes in paragraph numbering when showing tracked changes
  26. Heiko Tietze (TDF) applied vertical tabs to many dialogs while fixing issues, made the preview of line styles use an appropriate colour, fixed incorrect fill displayed in the preview image of Page Style dialog and rearranged Appearance options
  27. Kurt Nordback (Collabora) continued working on support for recent MSO chart types
  28. Sahil Gautam (Collabora) continued polishing the Libreoffice Theme rework
  29. Armin Le Grand (Collabora) did preparatory work for EditEngine rendering revamp
  30. Deepanshu Sharma made it so form properties are disabled when they are not available for changing
  31. Mihai Vasiliu did improvements in icon themes
  32. Asif Mohaideen made it so the default choice in the Image Compression dialog is set per the last used format
  33. Bogdan Buzea fixed issues found by static analysers
  34. Arnaud Versini did some code cleanups and optimisations
  35. Khaled Hosny (Alif Type) fixed saving font weight to documents
  36. Sarper Akdemir (Collabora) fixed spellcheck dialog preventing replacement of the period character
  37. Regina Henschel fixed an issue with PPTX shapes referencing guide elements and fixed an issue preventing deletion of columns in chart data tables
  38. Jim Chen made it possible to sort scripts in the macro object catalog
  39. David Gilbert implemented support for inserting password-protected PDFs as images
  40. Ujjawal Kumar worked on the Markdown import GSoC project

Kudos to Ilmari Lauhakangas for helping to elaborate this list.

Reported Bugs

488 bugs, 80 of which are enhancements, have been reported by 278 people.

Top 10 Reporters

  1. Telesto ( 42 )
  2. Heiko Tietze ( 36 )
  3. Eyal Rozenberg ( 30 )
  4. Mike Kaganski ( 17 )
  5. Gabor Kelemen (allotropia) ( 11 )
  6. Timur ( 9 )
  7. Regina Henschel ( 9 )
  8. Mihai Vasiliu ( 8 )
  9. nobu ( 8 )
  10. Michael H ( 7 )

Triaged Bugs

379 bugs have been triaged by 72 people.

Top 10 Triagers

  1. m_a_riosv ( 55 )
  2. Heiko Tietze ( 54 )
  3. Mike Kaganski ( 39 )
  4. V Stuart Foote ( 34 )
  5. Buovjaga ( 23 )
  6. Telesto ( 15 )
  7. Xisco Faulí ( 14 )
  8. akopf ( 11 )
  9. Saburo ( 8 )
  10. Olivier Hallot ( 8 )

Resolution of resolved bugs

344 bugs have been set to RESOLVED.

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

Fixed Bugs

180 bugs have been fixed by 30 people.

Top 10 Fixers

  1. Heiko Tietze ( 37 )
  2. Mike Kaganski ( 33 )
  3. Noel Grandin ( 10 )
  4. Xisco Fauli ( 9 )
  5. Michael Weghorn ( 6 )
  6. Balazs Varga ( 6 )
  7. Jonathan Clark ( 5 )
  8. Caolán McNamara ( 5 )
  9. Olivier Hallot ( 4 )
  10. Regina Henschel ( 3 )

List of high severity bugs fixed

  1. tdf#164202 Every time I try to delete an object in a gallery folder that I inserted, LibreOffice crashes in vcl/source/bitmap/bitmap.cxx:212 ( Thanks to Oliver Specht )
  2. tdf#165481 multi GB memory leak caused by “Save AutoRecovery information” since LibreOffice Calc 24.2.7 ( Thanks to Noel Grandin )
  3. tdf#167019 Conditional formatting is not handled properly in 25.8 Beta ( Thanks to Noel Grandin )
  4. tdf#167112 MATH: Elements sidebar is empty ( Thanks to Noel Grandin )
  5. tdf#167114 GtkScrolledWindow not properly sized with vertical tabs ( Thanks to Caolán McNamara )
  6. tdf#167165 Writer crashes when cursor placed over a specific page number in TOC ( Thanks to Mike Kaganski )
  7. tdf#167254 LO crashes when opening a specific RTF file ( Thanks to Mike Kaganski )

List of crashes fixed

  1. tdf#164202 Every time I try to delete an object in a gallery folder that I inserted, LibreOffice crashes in vcl/source/bitmap/bitmap.cxx:212 ( Thanks to Oliver Specht )
  2. tdf#166837 Calc crashed after calculating descriptive statistics and then closing ( Thanks to Michael Weghorn )
  3. tdf#166932 Certain file crashes Writer with Skia off and Tabbed UI on, only on Windows platform ( Thanks to Noel Grandin )
  4. tdf#166939 Saving back a particular document (with a single-character autostyle name) crashes ( Thanks to Mike Kaganski )
  5. tdf#166943 EDITING: Crash on alt+X use on lone combining diacritical mark ( Thanks to Mike Kaganski )
  6. tdf#166996 Switching from tabbed to standard toolbar UI crashes in debug build ( Thanks to Mike Kaganski )
  7. tdf#167006 Trying to open an embedded object crashes ( Thanks to Mike Kaganski )
  8. tdf#167018 CRASH pasting a shape from Writer into draw ( Thanks to Mike Kaganski )
  9. tdf#167066 CRASH in SfxTabDialogController::ResetHdl(weld::Button &) (framedialog) ( Thanks to Heiko Tietze )
  10. tdf#167133 CRASH: Bracketing selected text deletes equation ( Thanks to Mike Kaganski )
  11. tdf#167165 Writer crashes when cursor placed over a specific page number in TOC ( Thanks to Mike Kaganski )
  12. tdf#167214 PPTX with failed embedded fonts crashes on save ( Thanks to Julien Nabet )
  13. tdf#167254 LO crashes when opening a specific RTF file ( Thanks to Mike Kaganski )
  14. tdf#167274 Crash opening Image Map dialog ( Thanks to Michael Weghorn )

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

  1. tdf#100876 Difficulty to discover the Slide Pane ( Thanks to Michael Weghorn )
  2. tdf#117346 color of Auto-FILTER-▼-Button does not switch back from blue to black after Filter RESET, still shows old filter settings ( Thanks to Andreas Heinisch )
  3. tdf#119192 Text pasted from Impress to Writer switches CTL font to Western font in its style (see comment 5) ( Thanks to Jonathan Clark )
  4. tdf#121493 RTF rendering of tables with different column width fails ( Thanks to Mike Kaganski )
  5. tdf#123384 FILEOPEN DOCX MOD table formula is not working in LO ( Thanks to Olivier Hallot )
  6. tdf#126111 Font fallback is applied to Private Use Area (PUA) characters ( Thanks to Khaled Hosny )
  7. tdf#132286 Preview image on Page Style dialog shows fill applied incorrectly ( Thanks to Heiko Tietze )
  8. tdf#135580 Remove Euro Converter Wizard from Wizard menu ( Thanks to Xisco Fauli )
  9. tdf#136943 TOOLBAR: Can’t see last font name due to font name toolbar combobox having wrong height (Win, Linux kf5/kf6 with X11) ( Thanks to Caolán McNamara )
  10. tdf#56676 EDITING: Tables in databases based on calc are unwriteable – Form Properties show them as writable ( Thanks to Deepanshu Sharma )
  11. tdf#97169 macro object catalog items should be sortable ( Thanks to Jim Chen )

WORKSFORME bugs

39 bugs have been retested by 28 people.

Top 10 testers

  1. Telesto ( 4 )
  2. Regina Henschel ( 4 )
  3. m_a_riosv ( 4 )
  4. Olivier Hallot ( 3 )
  5. Dieter ( 2 )
  6. Timur ( 2 )
  7. Buovjaga ( 2 )
  8. Benoît Thébaudeau ( 1 )
  9. Ari Latvala ( 1 )
  10. Mike ( 1 )

DUPLICATED bugs

75 bugs have been duplicated by 22 people.

Top 10 testers

  1. Mike Kaganski ( 16 )
  2. V Stuart Foote ( 14 )
  3. m_a_riosv ( 8 )
  4. Heiko Tietze ( 7 )
  5. Telesto ( 4 )
  6. Regina Henschel ( 3 )
  7. Julien Nabet ( 3 )
  8. Buovjaga ( 2 )
  9. fpy ( 2 )
  10. BogdanB ( 2 )

Verified bug fixes

16 bugs have been verified by 15 people.

Top 10 Verifiers

  1. Julien Nabet ( 2 )
  2. Jonathan Clark ( 1 )
  3. Eyal Rozenberg ( 1 )
  4. steve ( 1 )
  5. raal ( 1 )
  6. Buovjaga ( 1 )
  7. Patrick (volunteer) ( 1 )
  8. Ming Hua ( 1 )
  9. m_a_riosv ( 1 )
  10. Xisco Faulí ( 1 )

Categorized Bugs

178 bugs have been categorized with a metabug by 24 people.

Top 10 Categorizers

  1. V Stuart Foote ( 37 )
  2. Eyal Rozenberg ( 33 )
  3. BogdanB ( 18 )
  4. Mihai Vasiliu ( 17 )
  5. Heiko Tietze ( 16 )
  6. Roman Kuznetsov ( 9 )
  7. Jonathan Clark ( 8 )
  8. Regina Henschel ( 5 )
  9. Aron Budea ( 4 )
  10. Olivier Hallot ( 4 )

Regression Bugs

48 bugs have been set as regressions by …

by x1sc0 at July 07, 2025 11:33 AM

June 02, 2025

Miklos Vajna

Interdependent tracked changes improvements in Writer

Writer has some support for interdependent (or hierarchical) tracked changes: e.g. the case when you have a delete on top of an insert. While there were some working cases, handling of many combinations were missing. I started to make systematic improvements in this area in the recent past, this post gives you an overview what's done so far.

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

Motivation

DOCX files in Word can often have overlapping tracked changes: Writer tries to split these up to make sure there is only one tracked change under the cursor at the same time. Still, it's possible that you have a tracked change with multiple types: e.g. a delete on top of an insert.

The focus in on 3 combinations which appear in DOCX files a lot: "insert, then delete", "insert, then format" and "delete, then format".

This mostly affects the UI and import/export filters of ODT and DOCX.

Results so far

Given an insert, then delete:

Interdependent tracked change: insert, then delete

Most operations worked nicely here, but in case your cursor was in the middle of AAA and you did a reject, followed by an undo, proper handling of that was missing, now implemented.

But then given an insert, then a format:

Interdependent tracked change: insert, then format

Then a handling of more actions were missing:

  1. DOCX import is now implemented.
  2. ODT import is now implemented.
  3. Accepting when you're inside AAA is now implemented: the insert is accepted for BBB but the format stays unchanged.
  4. Rejecting when you're inside AAA is now implemented: the insert is rejected and BBB is also removed, together with the format on top of it.
  5. Accepting the BBB now correctly operates on the insert type, so the format type remains after accept.
  6. If you accept BBB, now the surrounding AAA and CCC also get accepted as well, as expected.
  7. Now if you reject BBB, then it gets removed from the document, since you rejected an insert.
  8. When you reject BBB, the surrounding AAA and CCC also get rejected.

The combined implementation of these should give you a smooth feeling in case you're used to how Word works: if there is a format redline combined with an insert, then the operations act on the insert type, and format is only accepted/rejected when there is no insert "under" the format.

Similarly: it's a bit of an implementation detail that Writer splits redlines on DOCX import: so if you e.g. accept AAA then we combine that with BBB and CCC when it makes sense, so you need to click a lot less.

Finally, given a delete, then a format:

Interdependent tracked change: delete, then format

Then again handling of some actions were missing:

  1. DOCX import is now implemented.
  2. ODT import is now implemented.
  3. ODT export is now implemented.
  4. Accepting AAA now correctly operates on the delete type of BBB.
  5. Rejecting AAA now correctly operates on the delete type of BBB.
  6. Accepting BBB now correctly works with the delete type.
  7. Accepting BBB now correctly tries to also accept AAA and CCC, too.

The current state is not yet complete, but it's a big improvement over what we had in the past, which was mostly focusing on just "insert, then delete".

You may wonder what about some other cases: if you insert some content with change tracking, that always creates a new tracked change, so "insert" is never on top of something else. Similarly, format is always on top of something. Finally the same type is never on top of itself.

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:

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 June 02, 2025 11:54 AM

May 28, 2025

allotropia

Collabora and allotropia merge

This deal unites the largest team of corporate Office engineers to deliver on Collabora Productivity’s mission to restore Digital Sovereignty to its users, while making Open Source Office Rock. It supercharges Collabora’s Online Office products and services portfolio with rich German language capability, deeper experience of vertical applications, new Web Assembly skills, and a wider unified partner ecosystem. Through improved product richness this sharpens the competitive edge of FLOSS Office productivity against mass-market proprietary alternatives.

CAMBRIDGE, UK – May 28th 12:00 CEST – 2025

Collabora Productivity, the world’s leading provider of collaborative Open Source Office editors have completed a merger with allotropia. Collabora has invested heavily in building Collabora Online (COOL) – a market leading, on-premise, secure, interoperable, open-source solution for document editing and collaboration deployed to any modern browser. This is complemented by desktop and mobile apps across Linux, Windows, Mac, Android, iOS and Chrome-OS. Collabora provides support subscriptions to enterprise customers worldwide via a network of hundreds of trusted partners. This is now augmented by allotropia’s partner and customer base. Together with our partners we deliver document and productivity excellence integrated with our partners product and service offerings.

allotropia’s expertise around Web Assembly combined with Collabora Online will we expect, in time, enable customer use-cases such as well as office-as-component embedding scenarios in vertical applications as well as off-line and end-to-end encrypted editing, and. This work builds on some visionary prototype funding from the Bundesministerium des Inneren (BMI) for a collaboration between the companies to enable the use of Collabora Online off-line in the browser.

Further details of product investment, and direction will be announced and decided in workshops with our key customers and partners at our annual COOL Days conference in Budapest next week where staff, community and our customer and partner-ecosystem meet, swap ideas, and hear about the latest work in our upcoming major release featuring improved performance, usability, interoperability and much more.

“Collabora is excited to welcome each member of the allotropia team today!” said Michael Meeks, CEO, Collabora Productivity, “We are excited to work together to accelerate our product development, enjoy our first COOL Days together, and plan the next features and possibilities to delight our customers.”

Collabora has invested in building a network of hundreds of partners and is approaching one hundred million docker image downloads of its document editing server software, with millions of paying users of its products, all of whom will start to benefit from this merger from today.We expect to bring the experience that allotropia has from it’s relationship with CIB around vertical desktop applications (Fachverfahren) to help partners and customers migrate their Windows & Microsoft Office based business process to easy to deploy multi-platform web applications.

“With our awesome team of engineers, and our WebAssembly know how, we can add significantly to Collabora’s powerhouse of Office engineering prowess & their product offerings”, says Thorsten Behrens, CEO of allotropia, “we’ve worked with them as partners for many years, and align perfectly in our goals to make Open Source office rock!”

allotropia’s skills in supporting and contributing to the LibreOffice code-base in Germany strengthens and unifies popular shared partner products such CIB Office and Nextcloud Office. A larger team will accelerate development and improvement of Collabora Office based products, while providing an even deeper pool of support resources to rapidly respond to customers’ needs.

Together we want to pay tribute to the vast legacy of those who have worked so hard to preserve and improve the source code that we depend on from Sun Microsystems, Oracle, SUSE, RedHat, IBM, TDF, Canonical, and many more, as well as the innumerable volunteer community contributors who make the Collabora Online and LibreOffice ecosystem so rich and interesting: thank you allowing us the privilege of working alongside you as we revolutionize the office productivity world together.All of our code is open source and available to the public on GitHub. Join the Collabora Online Community, take part in easy hacks and discussions in the forum.

Please also see our new parent company’s mirror announcement!

by allotropiasoft at May 28, 2025 10:20 AM

May 26, 2025

Mike Kaganski

How could QA catch this in advance?

Yesterday I merged a fix for Writer’s tdf#165094. Not that it was something exceptional; something that often happens when we change the huge code: a regression. Something that we try to do for them: a fix. Why mention it here?

It happens to show something, that people underestimate. The complexity of what they call “proper testing” – you know, that “I found a bug! Do you even try to test your software???” rant you often see in discussions. Let’s look at this case.

The problem was, that in some specific document, where there was a manually inserted page break, that page break, defined in a hidden paragraph, disappeared after an upgrade. Sounds easy? Should be caught immediately in the release testing? But other page breaks weren’t lost.

Debugging showed, that the bug would only occur when all of the following happened:

  • The page break was defined in a hidden paragraph (something already known from the reporter – thank you Gabor!), and
  • There were at least 26 paragraphs before that hidden paragraph, all on the same page, and
  • The page break defined a paragraph style, and
  • That page break defined a page number, and
  • That assigned new page number happened to be the same “oddity” as the current one (i.e., either the number of that page with 26+ paragraphs was odd, and the new page number was odd; or the number of that page with 26+ paragraphs was even, and the new page number was even), and
  • After the hidden paragraph (which defined the page break), a table immediately followed.

I suppose, that’s a combination of factors, that any QA engineer would naturally test first, don’t you agree? (Disclaimer: no I don’t think so.)

Note that the complexity of this constellation of causing factors is, again, not uncommon in our codebase. In fact, it only needed less than ten features to take their specific forms, from thousands of features and options that the suite offers.

But it is completely unsurprising, that the bug, that requires such a constellation of factors, actually appeared in our bug tracker. Given the tens of millions of users, who work with who knows how many documents, every low-probability event will happen, sooner or later. This is good; and we are thankful to everyone who files bugs.

And let me say, that we at Collabora Productivity are glad to do many good things to make the office suite better for everyone.

by mikekaganski at May 26, 2025 09:59 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 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

March 14, 2025

Ravi Dwivedi

Libreoffice Conference 2024 in Luxembourg

Last year, I attended the annual LibreOffice Conference in Luxembourg with the help of a generous travel grant by The Document Foundation (TDF). It was a three-day event from the 10th to the 12th of October 2024, with an additional day for community meetup on the 9th.

Luxembourg is a small country in Western Europe. It is insanely wealthy with high living standards. After going through an arduous visa process, I got to the country on the 8th of October. Upon arriving in Luxembourg, I took a bus to the city center, where my hotel — Park Inn — was located. I deboarded the bus at the Luxembourg Central station. Before walking towards my hotel, I stopped to click a few pictures of the beautiful station.

All the public transport in Luxembourg was free of cost. The experience of being in Luxembourg was as if I had stepped in another world. The roads had separate tracks for cycling and separate lanes for buses, along with wide footpaths. In addition, the streets were pretty neat and clean.

Luxembourg's Findel Airport. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.

Separate cycling tracks in Luxembourg. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.

A random road in Luxembourg with separate lane for buses. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.

The conference venue was in Belval, while I stayed in the city center. Even though my stay was 20 km from the conference venue, the commute was convenient thanks to free of cost train connections. The train rides were comfortable, smooth, and scenic, covering the distance in half an hour. Moreover, I never found the trains to be very crowded, which enabled me to always get a seat.

This is what trains look like in Luxembourg. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.

The train ride from my hotel to the conference venue had some scenic views like this one on the way. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.

A tram in Luxembourg with Luxembourg Central station in the background. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.

My breakfast was included in the hotel booking. The breakfast had many options. It had coffee and fruit juices, along with diverse food options. Some of the items I remember were croissant, pain au chocolat, brie (a type of cheese), scrambled eggs, boiled eggs, and various types of meat dishes. Other than this, there were fruits such as pears.

That circular pie in the center of the image is brie - a type of cheese - which I found delicious. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.

Pre-conference, a day was reserved for the community meetup on the 9th of October. On that day, the community members introduced themselves and their contributions to the LibreOffice project. It acted as a brainstorming session. All the attendees got a lovely conference bag, which contained a T-Shirt, a pen and a few stickers. I also met my long time collaborators Mike, Sophie and Italo from the TDF, whom I had interacted only remotely till then. Likewise, I also met TDF’s sysadmin Guilhem, who I interacted before regarding setting up my LibreOffice mirror.

Lovely swag bag. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.

The conference started on the 10th. There were 5 attendees from India, including me, while most of the attendees were from Europe. The talks were in English. One of the talks that stood out for me was about Luxchat — a chat service run by the Luxembourg government based on the Matrix protocol for the citizens of Luxembourg. I also liked Italo’s talk on why document formats must be freedom-respecting. On the first night, the conference took us to a nice dinner in a restaurant. It offered one more way to socialize with other attendees and explore food at the same time.

A slide from Italo's talk on document freedom. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.

Picture of the hall in which talks were held. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.

On the 11th of October, I went for a walk in the morning with Biswadeep for some sightseeing around our hotel area. As a consequence, I missed the group photo of the conference, which I wanted to be in. Anyway, we enjoyed roaming around the picturesque Luxembourg city. We also sampled a tram ride to return to our hotel.

We encountered such scenic views during our walk. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.

Another view of Luxembourg city area. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.

The conference ended on the 12th with a couple of talks. This conference gave me an opportunity to meet the global LibreOffice community, connect and share ideas. It also gave me a peek into the country of Luxembourg and its people, where I had good experience. English was widely known, and I had no issues getting by.

Thanks to all the organizers and sponsors of the conference!

March 14, 2025 04:18 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

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

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

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