The Document Foundation Planet

 

May 16, 2024

Official TDF Blog

Coming up: LibreOffice Technology Budapest 2024 Hackfest

Budapest

Calling all developers! The LibreOffice Technology Hackfest will take place in the City of Budapest on June 4th and 5th, 2024.

Click here to find out more

by Mike Saunders at May 16, 2024 10:53 AM

May 15, 2024

Official TDF Blog

Half-way point in the Month of LibreOffice, May 2024!

Month of LibreOffice banner

Love LibreOffice? Help the community that makes it, learn new things, and get a sticker pack for your contributions! (Plus the chance to win some bonus extra merchandise, including mugs, T-shirts and hoodies…)

We’re two weeks into the Month of LibreOffice, May 2024. And so far, 178 people have already taken part and can claim their sticker packs at the end of the month. If you don’t see your name/username on that page yet, and haven’t taken part, here are some ways to join in:

How to take part – be a…

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

Keep an eye on this blog and our Mastodon, Bluesky and X (Twitter) accounts during the rest of May for more updates! 😊

by Mike Saunders at May 15, 2024 12:45 PM

May 14, 2024

Official TDF Blog

LibreOffice Conference 2024

LibreOffice Conference 2024 will take place in Luxembourg, at the Digital Learning Hub and the local campus of 42 Luxembourg in Belval, Esch-sur-Alzette, from 10 to 12 October 2024. As usual, the conference will be preceded by an open day for community member meetings on 9 October 2024.

The photo clearly shows the Terres Rouges building, the large red building in the centre of the Belval University campus, which used to be the largest steelworks in Luxembourg and is home to the Digital Learning Hub, an initiative of the Ministry of National Education, Childhood and Youth of the Grand Duchy of Luxembourg.

The Call for Papers is already open, and can be accessed at the following address: https://events.documentfoundation.org/libreoffice-conference-2024/cfp. The deadline for proposals is 15 August 2024. Approved speakers will be notified by 20 August 2024, while the conference schedule will be published during the first week of September.

The conference website will be ready soon, with additional logistic details for people attending the conference. A big thanks to Paolo Vecchi, who is organizing the conference with the help of local government bodies and volunteers.

by Italo Vignoli at May 14, 2024 01:24 PM

LibreOffice Dev Blog

Crash fixes, part 4: assertion failure

In the previous parts of the blog posts series on fixing software crashes, I have written about some crash fixes in LibreOffice around segfaults, aborts, and I discussed how test them. Here I write about fixing assertion failure.

What is Assertion Failure?

Assertion is a mechanism provided to the developers to make sure that things are good in runtime, conforming to what they were assuming. For example, making sure that some pointer is valid, some data elements match expectation, or some similar assumptions that need to be valid in order to get the correct results.

As an example, consider the C++ function basegfx::utils::createAreaGeometryForLineStartEnd(), which creates a geometric representation of an arrow. The code resides here:

basegfx/source/polygon/b2dlinegeometry.cxx:84

This is the line of code which contains assertion:

assert((rCandidate.count() > 1) && "createAreaGeometryForLineStartEnd: Line polygon has too few points");

On top of the actual function implementation, the C++ code asserts many conditions to make sure that they are met. In the above assertion, it checks to make sure that the number of points in the given data structure is more than 1. Otherwise, it leads to an assertion failure.

For various reasons, sometimes these sort of assumption may not be valid. To avoid reaching to incorrect results, it is important to have such assertions in place, to find such issues as soon as possible. If you are developing LibreOffice, you may have already built the code from sources in debug mode. Therefore, you may see software stops working, or simply crashes.

This crash may not happen for the end users, which use the release version of software. Therefore, these type of crashes have lower impact for the end users, and they are usually considered of lower importance compared to the crashes that happen for the end users.

Backtrace

One of the things that can help diagnose the problem is the stack trace, or simply backtrace. The way to obtain a backtrace depends on the platform and/or IDE that you use. If you use an IDE like Qt Creator, Visual Studio, etc., getting a backtrace would be as easy as debugging LibreOffice, making the assert fail, and then copy the backtrace from the UI. To learn more about IDEs, see this Wiki page:

If you want to use gdb on Linux, you may run LibreOffice with this command line:

$ instdir/program/soffice –backtrace

and then make the assert fail, and you will have the backtrace in gdbtrace.log file. You can learn more int this QA Wiki article:

TDF Wiki: QA/BugReport/Debug_Information

One thing to mention is that if you work on a reported bug regarding to assertion failure, then the actual way to reproduce the issue and make the assertion fail is usually described in the relevant TDF Bugzilla issue. In the meta bug related to assertion failure, you may find some of these issues in the last part of this blog post.

Fixing the Problem

To fix the problem, first you should gain understanding of the assumption, and why it fails. You should be able to answer these questions by reading the code and debugging it:

  • What does some assumption mean?
  • Why it fails?
  • How to fix that, so that it does not fail?

To gain this understanding, you have to look into the places where backtrace points. Backtrace can be complex, containing the whole stack of the function calls across the software, linking to places in the code, but let’s discuss a simplified form.

Consider this bug fix:

tdf#152012 Fix assert fail on opening date picker

The problem was that an assertion failure was happening when opening date picker field in a DOCX file. This is the simplified form of the stack trace:

1  __pthread_kill_implementation           pthread_kill.c:44
2  __pthread_kill_internal                 pthread_kill.c:78
3  __GI___pthread_kill                     pthread_kill.c:89
4  __GI_raise                              raise.c:26
5  __GI_abort                              abort.c:79
6  __assert_fail_base                      assert.c:92
7  __GI___assert_fail                      assert.c:101
8  o3tl::span::operator[]                  span.hxx:83
9  OutputDevice::ImplLayout                text.cxx:1396
10 OutputDevice::DrawTextArray             text.cxx:948
11 Calendar::ImplDraw                      calendar.cxx:71
12 Calendar::Paint                         calendar.cxx:1133

The problem was caused by an out of bound access to a vector of integers, and to fix that, you had to see why this happens, and fix that.

This is the description from the commit title:

Previously, for the 7 days of the week, a 7 letter string smtwtfs (depending on the week start day this can be different, but length is always 7) was sent to this method without providing the length, thus the string length: 7 was used. In this case, positions of the letters were calculated and used from other array named mnDayOfWeekAry[7]. mnDayOfWeekAry[k+1] was used as the position of letter k (k=0..5). In this case, there was 7 letters for 7 days, and only 6 positions provided by the array. This caused assertion failure in span.hxx:83 when trying to access mnDayOfWeekAry[7] via o3tl::span<T>::operator[].

As you can see, a false assumption was creating assertion failure, and the fix was essentially changing the code based on the corrected assumption.

Sometimes, the fix can be easier. As an example, by only checking a pointer to make sure that it is valid, the assertion failure does not happen. Therefore, to fix the problem, you have to carefully study the code and its behavior.

Final Notes

Many of the assertion failure bugs are fixed in daily works of the developers, before causing problems for the end users, which use the “release” version of the software, that do not crash because of the assertion failure. But there are some of these issues remaining.

Do you want to help fix some of the remaining issues? Then, please refer to the list here, read some bug report, and pick one:

by Hossein Nourikhah at May 14, 2024 11:46 AM

May 10, 2024

Michael Meeks

2024-05-10 Friday

  • Plugged away at another set of bgsave issues - leftover tile renders getting called in the wrong process,
  • Picked up E. from Soham - 1st GCSE exam done - nice, high spirits; a bit of lunch.
  • Wrote slides for a Tea Time Training on logging, realized quite how verbose we are, and spent a while cleaning up the logging code to make it friendlier; now if you do nothing, nothing spews out in the log. Gave the talk.
  • Small fixes to truncate super-long JSON debug dumps, and to stop the frenzy of 'fsync'ing that we do (NSS's sqlite for certificate management) - as well as many files we write to; sync 'fsync' is for us a successful up-load to the remote storage, none of that is needed (and it is at least visible on latency profiles).

May 10, 2024 09:00 PM

Official TDF Blog

LibreOffice 7.6.7 for productivity environments

Berlin, May 10, 2024 – LibreOffice 7.6.7 Community, the last minor release of the 7.6 line, is available from https://www.libreoffice.org/download for Windows, macOS, and Linux. This is the most thoroughly tested version, for deployments by individuals, small and medium businesses, and other organizations in productivity environments. This new minor release fixes bugs and regressions which can be looked up in the changelog [1].

For enterprise-class deployments, TDF strongly recommends the LibreOffice Enterprise family of applications from ecosystem partners – for desktop, mobile and cloud – with many dedicated value-added features and other benefits such as SLA (Service Level Agreements): https://www.libreoffice.org/download/libreoffice-in-business/

Users can download LibreOffice 7.6.7 Community from the office suite website: https://www.libreoffice.org/download/. Minimum requirements are Microsoft Windows 7 SP1 and Apple macOS 10.14. LibreOffice Technology-based products for Android and iOS are listed here: https://www.libreoffice.org/download/android-and-ios/

The Document Foundation does not provide technical support for users, although they can be helped by volunteers on user mailing lists and on the Ask LibreOffice website: https://ask.libreoffice.org

LibreOffice users, free software advocates and community members can support The Document Foundation with a donation at https://www.libreoffice.org/donate

[1] Change log pages: https://wiki.documentfoundation.org/Releases/7.6.7/RC1 and https://wiki.documentfoundation.org/Releases/7.6.7/RC2

by Italo Vignoli at May 10, 2024 11:37 AM

May 09, 2024

Michael Meeks

2024-05-09 Thursday

  • Up early, took E. to school; tech. planning, COOL community call, CODE 24.04 release retrospective.
  • Split callback processing and queueing out from incoming message processing, collapsed classes, made the message queueing code far cleaner and more efficient. Avoided lots of message re-parsing / tokenizing.
  • Put hooks on external doors to hold them open against the wind; more wire for J's roses put up in the garden.

May 09, 2024 09:00 PM

LibreOffice QA Blog

QA/Dev Report: April 2024

General Activities

  1. Olivier Hallot (TDF) added Help content for user interface selection dialog, Calc row recalculation at load time, automatic labeled ranges in Calc and font embedding. He also updated menu item paths in Help
  2. Rafael Lima added support for hidden named expressions in Calc, added Reload command to Notebookbar UIs and made named ranges created by the Solver in Calc hidden by default
  3. Stéphane Guillou (TDF) updated Help content for Navigator’s Navigate By
  4. Alain Romedenne continued improving the officehelper Python script for connecting to LibreOffice processes
  5. Dione Maddern improved Help content for inserting objects from the Gallery and did cleanups in Help
  6. Colton Garrett improved Help content for OpenCL and added a Help page for digital signing of paragraphs
  7. Laurent Balland did style cleanups in Impress templates
  8. Miklós Vajna (Collabora) fixed an issue with shape positioning in DOCX import and did many code cleanups
  9. Áron Budea (Collabora) fixed an issue with unwanted spacing in printed text
  10. Marco Cecchetti, Gökay Şatır, Pranam Lashkari, Szymon Kłos and Michael Meeks (Collabora) worked on LOKit used by Collabora Online
  11. Attila Szűcs (Collabora) continued improving the performance of handling transparent animated GIFs
  12. Tomaž Vajngerl (Collabora) improved the text scaling in Impress text boxes, implemented support for custom cell format of pivot table output found in OOXML and did many code cleanups and restructurings
  13. Julien Nabet added gssapi authentication support for the MariaDB/MySQL connector, fixed UI issues in Writer’s Paragraph dialog related to the “Allow to split paragraph” option, fixed crashes and did code cleanups
  14. Xisco Faulí (TDF) continued the implementation of SVG filters
  15. Michael Stahl (allotropia) changed the handling of paragraph and text attributes in empty lines at the end of paragraphs to match the behaviour seen in Microsoft Word
  16. Mike Kaganski (Collabora) fixed issues with rotated text being partially cut off, made it possible to create DDE links to files with special characters in their names on Windows, made the Basic LIKE operator more robust, fixed an issue preventing Windows users with special characters in their names from importing PDF files into Draw, made the position shifting behaviour more robust for objects anchored As Character in Writer, fixed an issue with chapter titles in headers/footers getting mixed up due to headings in endnote content, fixed handling of em and ex units in the properties of imported SVG files, improved the stability of text part positioning in SVG files, fixed handling of whitespace in SVG text, fixed a Draw issue causing font colour to not be retained in certain situations and restored HTML map export for text hyperlinks in frames. He also did many code cleanups and optimisations
  17. Caolán McNamara (Collabora) continued improving performance of threaded calculation in Calc. He also fixed crashes and many issues found by static analysers and fuzzers
  18. Stephan Bergmann (allotropia) worked on WASM build, added a new Expert Configuration setting to not offer Safe Mode in the UI, fixed the msvc_win32_arm64 UNO bridge and worked on Windows Subsystem for Linux support. He also did many code cleanups and adapted the code to compiler changes
  19. Noel Grandin (Collabora) did a big restructuring allowing optimisations to writerfilter which is responsible for RTF and OOXML file support, continued improving the speed of print preview with large merged rows in spreadsheets, improved the speed of loading conditional formatting rules in XLS files and changed to a faster algorithm for generating selection overlays. He also did many code cleanups and optimisations
  20. Justin Luth (Collabora) fixed an issue with paragraph style overrides in imported DOCX files, fixed an issue with protected cell ranges not exporting to XLSX correctly, made parsing of cell addresses in XLSX import more robust, fixed a UI glitch in Groupedbar Compact related to pivot tables and made the z-index of VML GroupShapes import correctly from DOCX files
  21. Michael Weghorn (TDF) worked on the accessibility features of Windows, GTK3 and GTK4 UIs in areas such as toolbar button toggles and Navigator, made IME cursor position reporting more reliable and fixed an issue with form control help texts showing up where they shouldn’t with kf5 UI
  22. Balázs Varga (allotropia) made it possible to do character formatting in chart text elements and included OOXML support for the formatting, continued polishing XLOOKUP and SORT function implementations and added Excel2021 array function SEQUENCE to Calc
  23. Patrick Luby fixed a macOS hang caused by JDBC driver extension, fixed PDF export of presentations containing PDF images, fixed an issue with cursor leftovers being displayed when using Skia/Metal UI rendering on macOS and made SVG icon rendering respect Retina resolution on macOS
  24. Jim Raykowski made fixes and optimisations to Navigator in Impress/Draw context, including fixing an update glitch after saving and reloading and made it possible to delete footnotes and endnotes using the Navigator in Writer
  25. Sarper Akdemir (allotropia) reworked Presenter Notes in Impress, so they are now available as a collapsible pane under the slide in Normal view and made it so mouse scrolling fully visible slides/pages in Impress/Draw switches between the previous/next one
  26. Samuel Mehrbrodt (allotropia) worked on Impress Presenter Notes pane together with Sarper, made it so text formatting toolbar gets enabled when focusing into a text box and ensured text is properly aligned when tabstop is outside of textbox
  27. Armin Le Grand (allotropia) continued polishing support for editing Impress slides during presentation and continued the rework of handling attributes and properties
  28. Oliver Specht (CIB) improved the dialog for managing user fields, made it so Cycle Case will be applied to the sentence if the cursor is at the sentence end and implemented support for DOCVARIABLE fields in imported DOC files
  29. Arnaud Versini did cleanups in locale handling code
  30. Heiko Tietze (TDF) did improvements to several dialogs and made it so the cell focus rectangle in Calc appears outside the active cell
  31. Taichi Haradaguchi updated Help content after UI changes, updated external library versions and did many UI string fixes and cleanups
  32. Vasily Melenchuk (CIB) fixed a crash in Writer Navigator
  33. Vivek Javiya extended the easy conditional formatting dialog in Calc
  34. László Németh added DOCX import support for hyphenate-keep, added a Hyphenation Across option into Paragraph dialog’s Text Flow tab in Writer, made it possible to resize table rows even if cursor is outside the table in Writer and made Writer table cell selection and resizing more robust when dealing with images in cells
  35. Ilmari Lauhakangas (TDF) removed obsolete reserved shortcuts and improved documentation for the related code
  36. Gábor Kelemen (allotropia) fixed some dialog settings not being remembered across sessions and did code cleanups in the area of code simplification and includes
  37. Ritobroto Mukherjee added sinusoidal and coil-like shapes and ported Java TerminationTest ODK example to C++
  38. Christian Lohmaier (TDF) worked on build support under Windows Subsystem for Linux
  39. Moritz Duge (allotropia) optimised the loading of GPG key data
  40. AntonyDas Nadar (Collabora) enabled accessibility for comboboxes in Sidebar
  41. Thorsten Behrens (allotropia) made editing Impress slides during presentation non-experimental
  42. Khushi Gautam implemented the Sidebar Quick Find deck in Writer as part of an Outreachy project
  43. Gabriel Masei (1&1) improved CSV field separator detection when several separators are selected on import
  44. Mohit Marathe added UI to set document properties TabsRelativeToIndent and TabOverMargin
  45. Sujatro Bhadra replaced AutoFormat button with table style listbox in Writer’s Convert Text to Table dialog
  46. Eike Rathke (Red Hat) added [Multiple] and [Undetermined] to language list
  47. Leonid Ryzhov made LanguageTool use correct default URL when username/API key are set
  48. Jonathan Clark (TDF) worked on making BreakIterator (for breaking words or lines) use ICU
  49. Juan C. Sanz made it possible to connect to MS Access .mdb files by using Microsoft.ACE.OLEDB.12.0 provider
  50. Kira Tubo added several automated tests for Writer
  51. Zeph Chai ported ChartInDraw and ChartInWriter ODK examples to Python
  52. Sahil Gautam extended Insert Cells Dialog to allow adding a set of rows/columns and made the cell background change when entering edit mode in Calc
  53. Ahmed Hamed improved the conditional formatting dialog by replacing the static “>=” with a dropdown of different operators
  54. Luv Sharma made the handling of “#” characters more robust in Basic
  55. Jakub Kościelak did fixes to the Windows installer and improved the presentation of the Windows version string in Help – About dialog (based on earlier work by Joel Dowdy and Achintya Sharma)
  56. Alex Henrie added missing file types to Linux desktop files
  57. Todor Balabanov improved the accuracy of the comparison code in NLP Solver

Kudos to Ilmari Lauhakangas for helping to elaborate this list.

Reported Bugs

410 bugs, 67 of which are enhancements, have been reported by 260 people.

Top 10 Reporters

  1. Gabor Kelemen (allotropia) ( 16 )
  2. Telesto ( 14 )
  3. Mike Kaganski ( 12 )
  4. Heiko Tietze ( 10 )
  5. Stéphane Guillou (stragu) ( 10 )
  6. Eyal Rozenberg ( 9 )
  7. Xisco Faulí ( 8 )
  8. Tyler ( 7 )
  9. peter josvai ( 7 )
  10. Cor Nouws ( 5 )

Triaged Bugs

398 bugs have been triaged by 66 people.

Top 10 Triagers

  1. Stéphane Guillou (stragu) ( 61 )
  2. m_a_riosv ( 48 )
  3. Heiko Tietze ( 47 )
  4. Buovjaga ( 27 )
  5. Dieter ( 21 )
  6. V Stuart Foote ( 21 )
  7. Mike Kaganski ( 20 )
  8. raal ( 14 )
  9. Xisco Faulí ( 14 )
  10. ady ( 12 )

Resolution of resolved bugs

430 bugs have been set to RESOLVED.

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

Fixed Bugs

149 bugs have been fixed by 37 people.

Top 10 Fixers

  1. Mike Kaganski ( 19 )
  2. Michael Stahl ( 7 )
  3. Noel Grandin ( 7 )
  4. Heiko Tietze ( 6 )
  5. Patrick Luby ( 6 )
  6. Jim Raykowski ( 5 )
  7. Xisco Fauli ( 5 )
  8. Balazs Varga ( 5 )
  9. László Németh ( 4 )
  10. Michael Weghorn ( 4 )

List of high severity bugs fixed

  1. tdf#154581 Paragraph language and character formatting (bold, italic) lost when pasting HTML ( Thanks to Michael Stahl )
  2. tdf#160016 Inserted GIF flipped vertically; previews in Gallery and Fontwork dialog flipped or mangled ( Thanks to Tomaž Vajngerl )
  3. tdf#160444 Crash on closing the 3D-Effects Window ( Thanks to Patrick Luby )
  4. tdf#160632 TABLE: Crash when using column width dialog ( Thanks to Noel Grandin )
  5. tdf#160698 Crash after opening Print dialog ( Thanks to Tibor Nagy )
  6. tdf#58434 Show formatting marks when displaying non-printing characters +F10, rather than field shading +F8 (for formatting marks as in comment 18) ( Thanks to Heiko Tietze )

List of crashes fixed

  1. tdf#159379 Writer crashes when multiple images are drag-and-dropped “As Character” (steps in comment 8) ( Thanks to Miklos Vajna )
  2. tdf#159683 Crash on closing LibreOffice with certain content on the clipboard ( Thanks to Miklos Vajna )
  3. tdf#159719 SfxItemPool::IsInRange crash: save and reload in Impress or Draw ( Thanks to Armin Le Grand (allotropia) )
  4. tdf#160444 Crash on closing the 3D-Effects Window ( Thanks to Patrick Luby )
  5. tdf#160590 Impress crashes with skia Metal enabled, skia raster software rendering works (MacOS Monterey (12.7.4) w/Intel HD Graphics 6000) ( Thanks to Patrick Luby )
  6. tdf#160632 TABLE: Crash when using column width dialog ( Thanks to Noel Grandin )
  7. tdf#160698 Crash after opening Print dialog ( Thanks to Tibor Nagy )
  8. tdf#160765 EDITING: Insert comment – Copy – Paste Comments – Undo – Show comment -> LO crash ( Thanks to Andreas Heinisch )
  9. tdf#160768 Changing value in a text box control with a link cell set up, Crash ( Thanks to Noel Grandin )
  10. tdf#160827 Crash on opening certain .docx files ( Thanks to Julien Nabet )

List of performance issues fixed

  1. tdf#160399 Print Preview freezes with whole row merged in large spreadsheet ( Thanks to Noel Grandin )
  2. tdf#160706 speed up loading conditional formatting rule in XLS ( Thanks to Noel Grandin )

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

  1. tdf#107081 LOCALHELP: Index: backgrounds;inserting form Gallery ( Thanks to Dione Maddern )
  2. tdf#108057 Primary key should default to AutoValue=Yes when type is integer ( Thanks to Mike Kaganski )
  3. tdf#132253 CHARACTER DIALOG: Drop hyperlink from character attributes ( Thanks to Olivier Hallot )
  4. tdf#132599 Option to stop words hyphenating across pages (

by x1sc0 at May 09, 2024 08:19 AM

May 08, 2024

Michael Meeks

2024-05-08 Wednesday

  • Up early, out for a run with J. To work - booked Eurostar for OS Founders conf in Paris; chewed away at unit tests, got them stable & pushed.
  • Plugged away at re-factoring callback emission; removing over-abstraction and un-necessary code in Kit message handling.
  • Helped E. with English Poetry revision in the evening.

May 08, 2024 09:00 PM

May 07, 2024

Michael Meeks

2024-05-07 Tuesday

  • Dropped E. to school; Planning call, M's driving test - a pass! encouraging - less Taxi-ing needed for a bit. Calls, E-mail backlog chewed.
  • Design review with Caolan; finally made progress on my unit test problem: being too quick: if we clear modification & then re-modify a document before we had time to get notified - we don't get notified; hmm.

May 07, 2024 09:00 PM

Official TDF Blog

Projects selected for LibreOffice in the Google Summer of Code 2024

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

  • Adam Seskunas – More and better tests: the project aims to add automated tests for fixes related to document export as well as converting tests written in Java to C++.
  • Ahmed Hamed – Improvement to the Functions Deck in LibreOffice Calc: the functions deck in the Sidebar will get a better search, an editor area with syntax highlighting and debugging capabilities among other enhancements.
  • Aung Khant – Improving user experience around windows: remembering the size and position of windows will be made consistent and Start Center will be enhanced.
  • Devansh Varshney – Adding native support for histogram chart and its variations: this project will bring support for multiple chart types introduced in Microsoft Office 2016.
  • Mohit Marathe – Comments in Sidebar: after this project is completed, comments can be viewed and edited in the Sidebar in addition to the document margin.
  • Printf Debugging – LibreOffice Theme: the goal of this project is to increase flexibility in colouring the LibreOffice interface.
  • Ritobroto Mukherjee – Cross platform .NET bindings for UNO API: LibreOffice will get support for .NET 8 and an additional API that will feel more natural to .NET developers.
  • Venetia Furtado – LUA UNO Language Binding in Libreoffice: after this project is completed, you will be able to control LibreOffice using the LUA programming language.
  • Bonus project under Linux Foundation: Biswadeep Purkayastha – Desktop integration: CPDB support for the LibreOffice print dialog: Common Print Dialog Backends allow the separation of the user interface from printing technologies. The idea in this project is to bring CPDB support up to date.

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

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

by Ilmari Lauhakangas at May 07, 2024 01:00 PM

May 06, 2024

Michael Meeks

2024-05-06 Monday

  • Up lateish; breakfast at 'the cafe' - our front patio in the sun. Adjusted camera with J. and M. & checked with Sue & Russel.
  • Ordered various necessaries & fittings on-line - attempting to seal poorly sealed Dot & Dab.
  • Plugged away at adding more unit tests; interesting behaviors. Out for a run with J. and movie in the evening.

May 06, 2024 09:00 PM

April 30, 2024

allotropia

LibreOffice, JavaScript’ed

LOWA is LibreOffice built with Emscripten as a Wasm executable that runs in the browser. Controlling that LibreOffice through UNO with JavaScript looks like a natural fit. Enter Embind, a mechanism to generate the binding glue between JavaScript and Wasm/C++.

As we will see, the Embind vs. UNO match is not perfect, but it kind-of gets the job done, at least for a first iteration.

Mappings

To dive straight into technical matters, the UNO type system is mapped to JavaScript as follows. (If you would like to see some example code first, jump ahead to the Starting Points and come back here later for reference.)

  • UNO BOOLEAN, depending on context and somewhat inconsistently maps to JavaScript Boolean and to JavaScript Number values 0 and 1. (The C/C++ representation of UNO BOOLEAN is sal_Bool, which is an alias for unsigned char, which Embind maps to JavaScript Number. So in places where we directly rely on Embind, like for the return value of a UNO interface method invocation, we get the Embind mapping to Number. But in places where we have more control, like for the JavaScript get method for a UNO ANY, we can be a bit more fancy and use a mapping to Boolean.)
  • UNO BYTE, SHORT, UNSIGNED SHORT, LONG, UNSIGNED LONG, FLOAT, and DOUBLE all map to JavaScript Number (with restricted value ranges for everything but UNO DOUBLE).
  • UNO HYPER and UNSIGNED HYPER both map to JavaScript BigInt (with restricted value ranges).
  • UNO CHAR and STRING both map to JavaScript String (with single UTF-16 code unit strings for UNO CHAR).
  • UNO TYPE maps to JavaScript Module.uno_Type objects. There are construction functions Module.uno_Type.Void, Module.uno_Type.Boolean, Module.uno_Type.Byte, Module.uno_Type.Short, Module.uno_Type.UnsignedShort, Module.uno_Type.Long, Module.uno_Type.UnsignedLong, Module.uno_Type.Hyper, Module.uno_Type.UnsignedHyper, Module.uno_Type.Float, Module.uno_Type.Double, Module.uno_Type.Char, Module.uno_Type.String, Module.uno_Type.Type, Module.uno_Type.Any, Module.uno_Type.Sequence, Module.uno_Type.Enum, Module.uno_Type.Struct, Module.uno_Type.Exception, and Module.uno_Type.Interface for representations of all the UNO TYPE values. The Module.uno_Type.Sequence construction function recursively takes a UNO TYPE argument for the component type, while the Module.uno_Type.Enum, Module.uno_Type.Struct, Module.uno_Type.Exception, and Module.uno_Type.Interface construction functions each take a string argument denoting the given type’s name in dotted notation (e.g., Module.uno_Type.Interface('com.sun.star.uno.XInterface')). Those JavaScript objects implement toString, which is also used for equality checks (e.g., type === 'com.sun.star.uno.XInterface').
  • UNO ANY maps to JavaScript Module.uno_Any objects. There is a constructor taking a UNO TYPE argument and a corresponding value (using an undefined value for UNO type VOID). Those JavaScript objects implement a method get that returns the JavaScript representation of the contained UNO value.
  • UNO sequence types map to a pre-canned variety of JavaScript Module.uno_Sequence_... objects. The problem is that Embind does not let us have a generic mapping to the C++ com::sun::star::uno::Sequence<T> class template; we can only have individual Embind mappings to specific class template instantiations. As a hack, for every UNO sequence type that appears somewhere in the LibreOffice UNO API, we generate a specific JavaScript Module.uno_Sequence_.... The naming is Module.uno_Sequence_boolean, Module.uno_Sequence_byte, Module.uno_Sequence_short, Module.uno_Sequence_unsigned_short, Module.uno_Sequence_long, Module.uno_Sequence_unsigned_long, Module.uno_Sequence_hyper, Module.uno_Sequence_unsigned_hyper, Module.uno_Sequence_float, Module.uno_Sequence_double, Module.uno_Sequence_char, Module.uno_Sequence_string, Module.uno_Sequence_type, and Module.uno_Sequence_any for the simple UNO component types; Module.uno_Sequence_... followed by the UNO type name in dollar-separated notation (e.g., Module.uno_Sequence_com$sun$star$uno$XInterface) for enum, struct, and interface component types; and Module.uno_SequenceN_..., with N greater than 1, for sequence component types (e.g., Module.uno_Sequence2_long for the UNO type “sequence of sequence of LONG“). That means that there currently is just no way to come up with e.g. a JavaScript representation of the UNO type “sequence of interface com.sun.star.frame.XDesktop“, as that sequence type happens to not be mentioned anywhere in the LibreOffice UNO API. (But for those sequence types that are used as interface method parameter or return types, corresponding JavaScript representations are provided. That should hopefully cover all relevant use cases for now; a future overhaul of this part of the mapping is likely.) These JavaScript sequence objects have two constructors, one taking a JavaScript array of member values (e.g., new Module.uno_Sequence_long([1, 2, 3])) and one taking a size and a Module.FromSize marker (as Emind does not allow to have multiple constructors with the same number of arguments) whose members will have default values (e.g., new Module.uno_Sequence_long(3, Module.FromSize)). Additional methods are resize (taking the new length as argument), size (returning the current length), get (taking an index as argument and returning the member at that index), and set (taking an index and a new member value as arguments). (The naming of those resize, size, get, and set methods is modelled after Embind’s emscripten::register_vector.)
  • UNO enum types are mapped to Embind-provided enums named Module.uno_Type_... followed by the UNO type name in dollar-separated notation (e.g., Module.uno_Type_com$sun$star$uno$TypeClass).
  • Plain UNO struct types and UNO exception types are mapped to Embind-provided value objects named Module.uno_Type_... followed by the UNO type name in dollar-separated notation (e.g., Module.uno_Type_com$sun$star$beans$NamedValue, Module.uno_Type_com$sun$star$uno$Exception). Polymorphic UNO struct types face a similar issue to sequence types, in that Embind does not allow to directly map their corresponding C++ class templates. It would be possible to do a similar hack and add specific mappings for all instantiated polymorphic struct types that are mentioned anywhere in the LibreOffice UNO API, but that has not been implemented so far. (And, similar to sequence types, a future overhaul of this part of the mapping is likely.)
  • UNO interface types are mapped to Embind-provided classes named Module.uno_Type_... followed by the UNO type name in dollar-separated notation (e.g., Module.uno_Type_com$sun$star$uno$XInterface). Null references are mapped to JavaScript null. The special com.sun.star.uno.XInterface UNO interface methods queryInterface, acquire, and release are not exposed to JavaScript client code.
  • UNOIDL single-interface–based service constructors are mapped to JavaScript functions named Module.uno_Function_...$$... followed by the service’s name in dollar-separated notation, followed by the constructor’s name set of by two dollar signs (e.g., Module.uno_Function_com$sun$star$beans$Introspection$$create). Like with other UNO language bindings, those functions take the com.sun.star.uno.XComponentContext as an additional first argument.
  • UNOIDL service-based singletons are mapped to JavaScript functions named Module.uno_Function_... followed by the singleton’s name in dollar-separated notation (e.g., Module.uno_Function_com$sun$star$frame$theDesktop). Like with other UNO language bindings, those functions take the com.sun.star.uno.XComponentContext as their (sole) argument.

Starting Points

To make all this work, the Embind mapping of the LibreOffice UNO API needs to be set up first. This is done by a call to

const uno = init_unoembind_uno(Module);

which also returns a wrapper object uno that allows for more natural access to all the UNOIDL entities whose mappings use that dollar-separated notation: Instead of Module.uno_Type_com$sun$star$uno$XInterface one can write uno.com.sun.star.uno.XInterface, and a call to uno_Function_com$sun$star$beans$Introspection$$create(context) can be written as uno.com.sun.star.beans.Introspection.create(context). If you want to cut down on the common uno.com.sun.star prefix even further,

const css = uno.com.sun.star;

lets you reduce that to just css.uno.XInterface and css.beans.Introspection.create(context).

The starting points to access the LibreOffice UNO API from JavaScript are Module.getUnoComponentContext() (returning the central css.uno.XComponentContext, through which all the services and singletons are reachable) and a Module.getCurrentModelFromViewSh() convenience function (returning the css.frame.XModel of the currently showing document). The gitlab.com/allotropia/lowa-demos repository is a growing site of example code showing all of this in action.

Summing this up, here is some example code that iterates over all the paragraphs of a Writer document and gives each of them a random foreground text color:

const uno = init_unoembind_uno(Module);
const css = uno.com.sun.star;
const model = Module.getCurrentModelFromViewSh();
const document = css.text.XTextDocument.query(model);
const text = document.getText();
const access = css.container.XEnumerationAccess.query(text);
const paragraphs = access.createEnumeration();
while (paragraphs.hasMoreElements()) {
  const paragraph = css.text.XTextRange.query(
    paragraphs.nextElement().get());
  const props = css.beans.XPropertySet.query(paragraph);
  const color = new Module.uno_Any(
    Module.uno_Type.Long(),
    Math.floor(Math.random() * 0xFFFFFF));
  props.setPropertyValue("CharColor", color);
  color.delete();
}

Cleanup

Embind is built on the concept that whatever C++ objects you reference from JavaScript, you manually and explicitly need to declare those references as no longer needed once you are done, by calling delete() methods on the corresponding JavaScript objects. (Or else, you risk memory leaks.) This can be quite cumbersome and would pollute the code with tons of such delete() calls. Luckily, JavaScript grew a FinalizationRegistry mechanism that allows code to be executed when the JavaScript garbage collector finds an objet to be unused and reclaims it. (And that code can thus transparently do the delete() call for us.) Embind implements such FinalizationRegistry-support for some types (those that are modelled based on some “smart poiner”) but not for others.

That means that (besides all the primitive types) JavaScript mappings of UNO string, type, enums, sequences, exceptions, and interfaces all do not need explicit delete() calls, while the mappings of UNO any and UNO sequences, and the various Module.uno_InOutParam_... all need explicit delete() calls.

Even though we expect that the JavaScript engines that we target do support the FinalizationRegistry mechanism, Embind is prepared to work with older engines that do not support it. Therefore, whenever an object is transparently cleaned up, Embind logs a somewhat unhelpful warning to the JavaScript console, stating that it “found a leaked C++ instance” (and that it will “free it automatically”).

Interfaces

For each UNO interface type there is a JavaScript class method query taking any JavaScript UNO object reference (in the form of the common com.sun.star.uno.XInterface base interface) as argument (and internally using UNO’s queryInterface to obtain either a correspondingly-typed reference to that object, or a null reference). There is also a JavaScript helper function Module.sameUnoObject, taking two interface references as arguments and returning whether both are references to the same UNO object.

UNO interface methods taking out or in-out parameters need special treatment. There are Module.uno_InOutParam_... wrappers (with a val property carrying the actual value) that need to be set up and passed into the UNO method. Such wrappers have a constructor taking no arguments (creating a dummy object, suitable for pure out parameters) and another constructor taking one argument of the wrapped type (suitable for in-out parameters). For example, to read data from a com.sun.star.io.XInputStream:

const stream = ...;
const input = css.io.XInputStream.query(stream);
if (input) {
  const data = new Module.uno_InOutParam_sequence_byte;
  input.readBytes(data, 100);
  for (let i = 0; i != data.val.size(); ++i) {
    console.log('read byte ' + data.val.get(i));
  }
  data.delete();
}

Exception Handling

Support for throwing and catching exceptions between JavaScript and C++ is rather rough: JavaScript code can use try ... catch (e) ... to catch a UNO exception thrown from C++, but all the information it can get about that exception is e.name stating the exception’s type. Also, for technical reasons, the catch block needs some increment– and decrementExceptionRefcount boilerplate,

try {
  ...
} catch (e) {
  incrementExceptionRefcount(e);
    //TODO, needed when building with JS-based -fexceptions,
    // see
    // <https://github.com/emscripten-core/emscripten/issues/17115>
    // "[EH] Fix inconsistency of refcounting in Emscripten
    // EH vs. Wasm EH"
  if (e.name === 'com::sun::star::uno::RuntimeException') {
    ...
  }
  decrementExceptionRefcount(e);
}

To throw UNO exceptions from JavaScript code, there is a helper function Module.throwUnoException that takes a UNO (exception) type and an instance of that type:

Module.throwUnoException(
  Module.uno_Type.Exception(
    'com.sun.star.lang.IllegalArgumentException'),
  {Message: 'bad argument', Context: null,
   ArgumentPosition: 0});

UNO Objects

The JavaSript-to-UNO binding is a full mapping, so you can even implement new UNO objects in JavaScript. This requires quite some boilerplate, though. For example, the below obj implements com.sun.star.lang.XTypeProvider and com.sun.star.task.XJob:

const obj = {
  // Implementation details:
  implRefcount: 0,
  implTypes: new Module.uno_Sequence_type([
    Module.uno_Type.Interface(
      'com.sun.star.lang.XTypeProvider'),
    Module.uno_Type.Interface(
      'com.sun.star.task.XJob')]),
  implImplementationId: new Module.uno_Sequence_byte([]),

  // The methods of XInterface:
  queryInterface(type) {
    if (type == 'com.sun.star.uno.XInterface') {
      return new Module.uno_Any(
        type,
        css.uno.XInterface.reference(
          this.implXTypeProvider));
    } else if (type == 'com.sun.star.lang.XTypeProvider') {
      return new Module.uno_Any(
        type,
        css.lang.XTypeProvider.reference(
          this.implXTypeProvider));
    } else if (type == 'com.sun.star.task.XJob') {
      return new Module.uno_Any(
        type,
        css.task.XJob.reference(
          this.implXJob));
    } else {
      return new Module.uno_Any(
        Module.uno_Type.Void(), undefined);
    }
  },
  acquire() { ++this.implRefcount; },
  release() {
    if (--this.implRefcount === 0) {
      this.implXTypeProvider.delete();
      this.implXJob.delete();
      this.implTypes.delete();
      this.implImplementationId.delete();
    }
  },

  // The methods of XTypeProvider:
  getTypes() { return this.implTypes; },
  getImplementationId() {
    return this.implImplementationId;
  },

  // The methods of XJob:
  execute(args) {
    if (args.size() !== 1 || args.get(0).Name !== 'name') {
      Module.throwUnoException(
        Module.uno_Type.Exception(
          'com.sun.star.lang.IllegalArgumentException'),
        {Message: 'bad args', Context: null,
         ArgumentPosition: 0});
    }
    console.log(
      'Hello, my name is ' + args.get(0).Value.get());
    return new Module.uno_Any(
      Module.uno_Type.Void(), undefined);
  },
};
obj.implXTypeProvider
  = css.lang.XTypeProvider.implement(obj);
obj.implXJob
  = css.task.XJob.implement(obj);

obj.acquire();
// ... pass obj to UNO here ...
obj.release();

by stbergmann at April 30, 2024 11:32 AM

April 18, 2024

LibreOffice Dev Blog

Crash fixes part 3 – Testing crashes

I have previously discussed fixing crashes in 2 parts (segfaults, aborts). Here I discuss testing crashes to avoid creating re-creating regressions.

Why testing crashes?

When you fix a crash, you have to make sure that it does not happen again in the future. The key to achieve such a goal is to write a suitable test. The test should do the exact steps to reproduce the problem on the program in order to detect the known crash before the new code is merged.

This can be done using either UITests, or CppUnitTests. UITests are written in Python. They are easier to write, but they do not run on each and every platform, and they are usually slower. CppUnitTests, on the other hand, are written in C++. They are much faster, and they run on every platform that CI runs to make sure that everything is built and can be run correctly.

An Example Crash Testing

Consider the below issue around footnotes:

This problem was happening when someone created a footnote, deleted the reference, and then hovered the mouse on the removed footnote reference. To reproduce that, one could use keyboard to generate a key sequence that repeats the required steps:

Write something, add footnote, select all the footnotes and remove them, then go back to the text, and hover the footnote reference.

Using keyboard-only is not always enough, but here it was possible. To implement the UITest, you should first find the appropriate place to put the test file, and then write a Python script for that. Here, the test was written in sw/qa/uitest/writer_tests2/deleteFootnotes.py. The UITest test can be found alongside the bug fix, in the class class tdf150457(UITestCase):

If you look into the code, the test_delete_footnotes() function consists of many invocations of postKeyEvent calls, that emulate key input events:

pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'a', 0);

To insert footnotes, UNO commands are used.

dispatchCommand(mxComponent, ".uno:InsertFootnote", {});

Just doing the same steps would be enough, as if the crash happens with the fix in place, or in a bad commit in the future, the test would fail. This test failure will prevent the same problem in the future.

The nice thing is that it turned out the same test could have been written using C++ and CppUnitTest, which is considered superior.

The new CppUnitTest can be found in the below change:

The new test resides in sw/qa/extras/uiwriter/uiwriter3.cxx, and essentially uses postKeyEvent and dispatchCommand as similar functions.

If you look at the current version of the test, you can see that it was simplified in later commits, but the idea is the same: “repeat the same steps that lead to crash in the code”.

Final Words

It is expected that every bug fix is accompanied with a test, to avoid seeing the same problem in the future. If you want to know more about UITests and CppUnitTests, please take a look at this TDF Wiki pages:

Also, keep in mind that looking into the existing tests is the best way to understand how to write a new test. Therefore, make sure that you look into qa/ folders of the modules when you want to add a new test.

by Hossein Nourikhah at April 18, 2024 01:40 PM

April 11, 2024

LibreOffice QA Blog

QA/Dev Report: March 2024

General Activities

  1. LibreOffice 7.6.6 and LibreOffice 24.2.2 were released on March 28
  2. Olivier Hallot (TDF) renamed Fontwork to Text along Path in the UI while updating Help, added Help content for ExportAsFixedFormat VBA method and new Calc functions FILTER, SORT and SORTBY and did several cleanups and fixes in Help
  3. Rafael Lima made several improvements to Calc’s Solver dialog, improved the visual consistency of the Tabbed UI and added a warning about the need to reload file after changing macro security level
  4. Stéphane Guillou (TDF) updated Help content after UI changes and improved the Help page for macro security
  5. Alain Romedenne made many improvements to the officehelper Python script for connecting to LibreOffice processes
  6. Dione Maddern rewrote the Help page for Calc’s SUMIF function, updated Help for Writer’s View options and did cleanups in Help
  7. Gábor Kelemen (allotropia) did many cleanups in the area of includes while improving the script for finding unneeded includes. He also made some Help fixes
  8. Pierre F. made many improvements and fixes to Help pages, for example in the areas of regular expressions and Basic
  9. Andras Timar (Collabora) made Help build more robust on Windows and made some cleanups in Help regarding translatable strings
  10. Laurent Balland updated Grey Elegant Impress template
  11. Miklós Vajna (Collabora) improved copying and pasting between Google Sheets and Calc and did many code cleanups and improvements to automated tests
  12. Áron Budea, Marco Cecchetti, Gökay Şatır, Pranam Lashkari, Jaume Pujantell and Michael Meeks (Collabora) worked on LOKit used by Collabora Online
  13. Gülşah Köse (Collabora) made it so pressing Enter in an empty list item ends the list in Impress
  14. Attila Szűcs (Collabora) improved the performance of handling transparent animated GIFs and made it so image placeholders imported from PPTX files do not display text
  15. Tomaž Vajngerl (Collabora) did many code cleanups in graphics code
  16. Julien Nabet fixed incorrect display of custom page numbers in Sidebar, fixed an issue with duplicating a sheet in Calc causing unwanted axis label to appear in charts and fixed some crashes
  17. Andreas Heinisch fixed an issue with saving print ranges to XLS files
  18. Xisco Faulí (TDF) made a dozen additions and changes to automated tests and added a script to replace missing fonts in test documents. He also improved SVG support by implementing overflow:visible, switch element and the filters feMerge, feMergeNode, feBlend and feComposite.
  19. Michael Stahl (allotropia) made the Curl-based WebDAV content provider more robust
  20. Mike Kaganski (Collabora) fixed issues with copying and pasting charts in Calc, fixed an issue causing incorrect closing tags in Writer HTML export, fixed an issue affecting conditional formatting in overlapping cell ranges, made canceling out of Insert Chart dialog more robust in case of multiple views, fixed an issue with picking a connection type in Database Wizard, fixed an issue in the UNO API implementation for text ranges, harmonised the rounding in Calc’s number formatter and ROUND function and made it so index field names can be single characters which is good news for Japanese users
  21. Caolán McNamara (Collabora) improved the performance of threaded calculation in Calc, fixed an issue with Calc’s currency selection dropdown in GTK UIs, improved dark mode support and made “Always autocorrect to” more robust. He also fixed crashes and many issues found by static analysers and fuzzers
  22. Stephan Bergmann (allotropia) worked on WASM build. He also did many code cleanups and adapted the code to compiler changes
  23. Noel Grandin (Collabora) improved loading time for PPTX files with lots of unused master slides, improved loading time for DOCX files with lots of headers and footers, optimised the handling of columns in Calc, improved the speed of print preview with large merged rows in spreadsheets. He also did many code cleanups
  24. Justin Luth (Collabora) made the new global config option RecalcOptimalRowHeightMode also work for XLSX files, fixed a crash when trying to overwrite file in read-only directory when its lock file exists, fixed an issue with z-ordering of objects in DOCX files, fixed image placement issues in DOC/DOCX files, made searching backwards for end of paragraph regex work in Writer, fixed an issue causing unwanted toggling of Ordered List button and made it so frame text boundary line in Writer is only shown if display of formatting marks is active
  25. Michael Weghorn (TDF) fixed HiDPI scaling with KF6/Qt6 UIs under Wayland and worked on the accessibility features of GTK4 UI
  26. Balázs Varga (allotropia) added Excel2021 array functions FILTER, SORT and SORTBY to Calc, fixed issues with chart rendering in XLSX files, improved the performance of Calc’s SUMPRODUCT function and fixed an issue with objects not shown in slideshow in a PPTX file if they have fillstyle or linestyle
  27. Patrick Luby (NeoOffice) fixed issues related to the transparency-to-alpha rework, fixed a Skia issue related to a changed default, fixed horizontal swiping and scrolling when using an RTL UI, made it possible to encrypt files with using public GPG keys with unknown Ownertrust on macOS and fixed macOS crashes
  28. Jim Raykowski fixed an issue preventing use of keyboard shortcuts when focused into a tab bar element in the Sidebar, fixed an issue with text selection over pages for multi column tables with repeated headings, improved the name display of custom shapes in the Navigator in Impress/Draw and added a UNO API command to set layer of objects in Draw
  29. Sarper Akdemir (allotropia) made it so a reload is not required for embedded objects to be disabled
  30. Regina Henschel worked on extruded/3D shape support in PPTX files
  31. Samuel Mehrbrodt (allotropia) improved the accessibility checker
  32. Armin Le Grand (allotropia) continued polishing support for editing Impress slides during presentation and continued the rework of handling attributes and properties
  33. Oliver Specht (CIB) made it possible to insert an empty paragraph before an index that is the first element in a Writer document, made Clone Formatting more robust in Impress, added a search field to Gallery and made Cycle Case also work at the end of words
  34. Arnaud Versini did some code cleanups and optimisations
  35. Heiko Tietze (TDF) made Infobar close buttons easier to hit, made Bullets and Numbering dialog cleaner, improved dark mode support and added a “What’s new?” dialog to be shown on first run of a major version
  36. Hossein Nourikhah (TDF) worked on Developers Guide examples and fixed updating hyperlinks in Draw
  37. Tibor Nagy (allotropia) fixed an issue with disappearing text in merged Calc cells and fixed a placeholder box being too tall in PPTX files
  38. Kurt Nordback finished adding a chart type for “pie-with-remainder-as-another-pie” and fixed an issue where stacked column charts did not show connection lines
  39. Taichi Haradaguchi did some cleanups in dialog definition files
  40. Vasily Melenchuk (CIB) improved the code for WinAPI FlashWindow() function that alerts the user about an event in an application
  41. Hubert Figuière (Collabora) worked on jsdialog used by Collabora Online
  42. David Gilbert did code cleanups in PDF import code
  43. Jean-Pierre Ledure worked on the ScriptForge library
  44. Leonard Sasse did many cleanups in Python files
  45. Fridrich Štrba fixed building with Java 8 and autoconf 2.72
  46. Vivek Javiya made heading colours dynamic in Calc, allowing for automatic adjustment
  47. László Németh fixed hyphenation at stem boundary by adding a new hyphenation option “Compound characters at line end” and implemented hyphenate-keep paragraph property to keep both parts of a hyphenated word within a single page
  48. Adlair Cerecedo-Mendez added LibreOffice minor version and CPU architecture to PDF metadata
  49. Skyler Grey (Collabora) improved animating of bullets in presentations exported as SVG
  50. René Engelhard (Debian) did build fixes
  51. Sahil Gautam made hyperlinks accessible via keyboard

Kudos to Ilmari Lauhakangas for helping to elaborate this list.

Reported Bugs

468 bugs, 82 of which are enhancements, have been reported by 297 people.

Top 10 Reporters

  1. peter josvai ( 20 )
  2. Stéphane Guillou (stragu) ( 17 )
  3. Rafael Lima ( 12 )
  4. Telesto ( 11 )
  5. Jeff Fortin Tam ( 10 )
  6. Gabor Kelemen (allotropia) ( 9 )
  7. prrvchr ( 8 )
  8. Michael Otto ( 7 )
  9. Kevin Suo ( 6 )
  10. Mike Kaganski ( 6 )

Triaged Bugs

469 bugs have been triaged by 73 people.

Top 10 Triagers

  1. Stéphane Guillou (stragu) ( 149 )
  2. V Stuart Foote ( 29 )
  3. m_a_riosv ( 28 )
  4. Heiko Tietze ( 22 )
  5. Buovjaga ( 20 )
  6. Julien Nabet ( 15 )
  7. Mike Kaganski ( 15 )
  8. Rafael Lima ( 15 )
  9. dunguyen ( 14 )
  10. ady ( 14 )

Resolution of resolved bugs

429 bugs have been set to RESOLVED.

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

Fixed Bugs

143 bugs have been fixed by 35 people.

Top 10 Fixers

  1. Mike Kaganski ( 12 )
  2. Caolán McNamara ( 12 )
  3. Julien Nabet ( 8 )
  4. Justin Luth ( 7 )
  5. Pierre F ( 6 )
  6. Xisco Fauli ( 6 )
  7. Patrick Luby ( 6 )
  8. Rafael Lima ( 6 )
  9. Balazs Varga ( 5 )
  10. Noel Grandin ( 5 )

List of critical bugs fixed

  1. tdf#160036 Selection invisible in a11y High Contrast modes with SKIA/Raster, Skia/Vulkan unaffected ( Thanks to Patrick Luby )
  2. tdf#160095 CRASH: using ALT+RETURN twice ( Thanks to Julien Nabet )

List of high severity bugs fixed

  1. tdf#142133 Hyperlinks cannot be clicked / interacted with in PDF export of RTF or DOCX files (comment 9) ( Thanks to Xisco Fauli )
  2. tdf#152524 macOS: LibreOffice crashes (gpgme / gpgmeio) on macOS 13 Ventura ( Thanks to Patrick Luby )
  3. tdf#154863 Crash when moving images around in a multipage table ( Thanks to Matt K )
  4. tdf#157258 “Always autocorrect to” deletes the word instead of replacing (affects extensions like Grammalecte, LanguageTool, Antidote) ( Thanks to Caolán McNamara )
  5. tdf#159094 FILESAVE PDF Tagged PDF export of media file fails to create PDF ( Thanks to Tibor Nagy )
  6. tdf#159373 Crash in: ScTable::HasAttrib(short,long,short,long,HasAttrFlags) ( Thanks to Julien Nabet )
  7. tdf#159931 Exported pptx cannot be opened in PowerPoint because a referenced part does not exist ( Thanks to Sarper Akdemir )
  8. tdf#160149 CRASH: undoing conditional format ( Thanks to Mike Kaganski )
  9. tdf#160184 allow to “Encrypt with GPG key” on save using public keys with unknown Ownertrust ( Thanks to Patrick Luby )
  10. tdf#160365 Writer: unable to turn off “text boundaries” for frames / tables ( Thanks to Justin Luth )
  11. tdf#83720 PIVOTTABLE: Wrong date format in column field ( Thanks to Tomaž Vajngerl )
  12. tdf#93352 UI. RTL: Horizontal scrolling for right-to-left Sheet moves in opposite direction (macOS and Linux) ( Thanks to Patrick Luby )

List of crashes fixed

  1. tdf#152524 macOS: LibreOffice crashes (gpgme / gpgmeio) on macOS 13 Ventura ( Thanks to Patrick Luby )
  2. tdf#154072 crash / no effect when clicking some dropdown buttons when toolbar overflows ( Thanks to Caolán McNamara )
  3. tdf#154863 Crash when moving images around in a multipage table ( Thanks to Matt K )
  4. tdf#158344 FILEOPEN DOCX Crash on opening file ( Thanks to Miklos Vajna )
  5. tdf#158945 Calc: crash when entering text in a cell ( Thanks to Julien Nabet )
  6. tdf#159373 Crash in: ScTable::HasAttrib(short,long,short,long,HasAttrFlags) ( Thanks to Julien Nabet )
  7. tdf#159879 Crash when closing “3D View” dialog ( Thanks to Xisco Fauli )
  8. tdf#159933 crash when applying Solarize filter to raster image ( Thanks to Noel Grandin )
  9. tdf#160095 CRASH: using ALT+RETURN twice ( Thanks to Julien Nabet )
  10. tdf#160149 CRASH: undoing conditional format ( Thanks to Mike Kaganski )
  11. tdf#160192 CRASH when trying to overwrite file in read-only directory when its lock file exists ( Thanks to Justin Luth )
  12. tdf#160222 LibreOffice 7.6.5 – SF_Session RunApplication crash for unknown reason ( Thanks to Jean-Pierre Ledure )
  13. tdf#160368 Crash on save after deleting sheet ( Thanks to Caolán McNamara )

List of performance issues fixed

  1. tdf#159687 Cutting rows from specific file with whole column references in formula is slow ( Thanks to Balazs Varga )

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

  1. tdf#103068 New Database Wizard gets confused between ODBC and JDBC connection if you backup twice to step 1. ( Thanks to Mike Kaganski )
  2. tdf#116156 Python // officehelper.py misbehaves since 5.3.7 ( Thanks to Alain Romedenne )
  3. tdf#126464 Remove “Numbering on/off” UNO command

by x1sc0 at April 11, 2024 10:04 AM

April 04, 2024

Miklos Vajna

Improve copy&paste in Calc and elsewhere

Calc now supports much better copy&paste when you transfer data between Google Sheets and Calc.

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

Motivation

First, Collabora Online was using the deprecated document.execCommand() API to paste text, which is problematic, as the "paste" button on the toolbar can't behave the same way as pressing Ctrl-V on the keyboard.

Second, it turns out Google Sheets came up with some additional HTML attributes to represent spreadsheet data in HTML in a much better way, and Calc HTML import/export had no support for this, while this is all fixable.

Results so far

In short, Collabora Online now uses the Clipboard API to read from the system clipboard -- this has to be supported by the integration, and Calc's HTML filter now support the subset of the Google Sheets markup I figured out so far. This subset is also documented.

Note that the default behavior is that the new Clipboard API is available in Chrome/Safari, but not in Firefox.

For the longer version, here are some screenshots:

We used to show a popup when you clicked on the paste button on the notebookbar

The new paste code in action, handling an image

Import from Google Sheets to Calc: text is auto-converted to a number, bad

Import from Google Sheets to Calc: text is no longer auto-converted to a number, good

HTML import into an active cell edit, only RTF was working there previously

Paste from Google Sheets to Calc: text is no longer auto-converted to a number, good

Paste from Google Sheets to Calc: booleans are now also preserved

Paste from Google Sheets to Calc: number formats are now also preserved

Paste from Google Sheets to Calc: formulas are now also preserved

Paste from Google Sheets to Calc: also handling a single cell

Copy from Calc to Google Sheets: text is now handled, no longer auto-converted to a number

Copy from Calc to Google Sheets: booleans are now handled

Cross-origin iframes also block clipboard access, now fixed

Copy from Calc to Google Sheets: number formats are now also preserved

Copy from Calc to Google Sheets: formulas are now also preserved

Copy from COOL Writer to a text editor: much better result, new one on the right hand side

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:

The tracking issue on the Online side was cool#8023.

Want to start using this?

You can get a snapshot / demo of Collabora Office 24.04 and try it out yourself right now: try the unstable snapshot. Collabora intends to continue supporting and contributing to LibreOffice, the code is merged so we expect all of this work will be available in TDF's next release too (24.8).

by Miklos Vajna at April 04, 2024 07:50 AM

March 18, 2024

LibreOffice Dev Blog

Test improvement – More and better tests for LibreOffice

One of the areas that can help LibreOffice, but may not directly be visible to the users even though it has a big impact is the quality assurance, is automated testing.  Here, I discuss some areas and notes around improving tests for LibreOffice. First, I start with regressions and bug fixes without a test.

Missing Unit Tests

This is the description from the GSoC ideas page:

While there are some automated tests for LibreOffice, there are not nearly enough. Adding more and better tests helps developers who work on the code to be more productive by allowing them to find regressions as early as possible.

To elaborate more, I should say there are many regressions and bugs in general that are fixed, but lack testing. It is important to have tests for those bug fixes, to avoid such problems in the future. You can see a list of those fixed issues that lack tests here:

If you want to add some new tests for the bug fixes, first you should read the bug report very carefully to understand what is it about, and try to test the fix yourself. You can either use git revert command to revert the fix, and see the problem in action, or try changing back the fix in the code, if it is not too big.

That is important, because you have to see that the test fails without the fix in place, but succeeds when it is applied. This is an essential step when writing the test.

To know more about unit tests, you may look into these Wiki pages:

Porting Existing Test to C++ or Python

Some tests are written in the past, but now have issues because of the way they are written. In this case, porting them can provide improvement.

Tests can be written in multiple languages. At least, C++, Python, Java and BASIC are currently in use for different tests across the LibreOffice code base. Again in the GSoC ideas page, you can read:

There is some support in LibreOffice for automated tests, both at the level of unit tests, and at the level of system tests that drive a full LibreOffice instance. Currently tests can be written in C++, Java, or Python. Various new automated tests should be developed to improve the test coverage.

Tests written exclusively for Java (e.g. the JUnit framework) should be ported to C++ so that they can execute much more rapidly. Similarly, tests that do remote control of an existing LibreOffice instance, should be re-factored to run inside that instance to make debugging much easier.

Almost all JUnitTests and UITests, and also some smoke tests, run as an outside process. To verify, the trick is to remove the soffice(.exe) binary, or to remove its execute permission (on Linux). In this way, out-of-process tests should fail, as they need to run the soffice binary. After a successful build, you can see if this works. For example, try this:

make -d JunitTest_framework_complex

As an example, we have this issue around complex tests that should be ported to Python:

You may find many examples of the previously ported test in the issue page. Keep in mind that usually old Java tests should be removed in the same patch that provides the CppUnitTest port.

Also, you may find examples of UITests ported to C++ from Python. For example, see this patch:

It ports a previously implemented UITest from Python to C++. The result is a faster test, which is more robust.

Focusing on a Specific Area

If you want to add or port some tests, please focus on a specific area of the code. The LibreOffice code base is huge, and consists of more than 200 modules. It is not easy, and in fact not suggested, to work across different applications and modules. It is much better that you pick a specific application, and even inside that application, like Writer, Calc, Impress, etc., focus on a specific module. In this way, it would be much easier to understand the ideas and the way tests are implemented.

How Hard is it to Write / Port a Test?

One important question is around the complexity of writing or porting tests. The answer is not straightforward, as it depends on the area that the test is written. But one can take a look at what others did in the past. By looking into Gerrit or git log, you can find what other people, including GSoC applicants, were able to achieve during their work.

After writing a few tests, or porting a few tests, it may become easier for you to write more tests. Another thing is that you don’t have to write tests from scratch. There are many tests available in the LibreOffice code base, and you can create your new test based on existing tests and customize it to match the purpose of the issue you are working on.

by Hossein Nourikhah at March 18, 2024 06:45 AM

March 11, 2024

LibreOffice QA Blog

QA/Dev Report: February 2024

General Activities

  1. LibreOffice 7.6.5 was released on February 22
  2. LibreOffice 24.2.1 was released on February 29
  3. Olivier Hallot (TDF) added help content for Calc’s XLOOKUP and XMATCH functions, Navigate By in Find toolbar, Draw’s Shrink text on overflow and did many fixed and cleanups in Help
  4. Rafael Lima made it so selected text in the BASIC editor is automatically inserted into the search bar, added a command for toggling code block commenting in BASIC IDE and fixed an issue where Duplicate Sheet command might create the sheet in the wrong file, if having two open files with the same name
  5. Stanislav Horacek updated command paths in Help
  6. Stéphane Guillou (TDF) updated command paths in Help
  7. Alain Romedenne updated ScriptForge Help pages, updated Python shell script Help for macOS and improved Python example in SDK
  8. Dione Maddern did many fixes and updates to Help pages, mostly fixing links
  9. Gábor Kelemen (allotropia) made some cleanups in Help and in UI and UNO bridges code
  10. Laurent Balland fixed an issue with skip empty cells option not working for the last column in Calc Text Import dialog, made it so custom number formats using the ? character replace trailing zeroes with figure spaces which have a width approximating a digit and removed unneeded thumbnail.png images from Wizard templates
  11. Miklós Vajna (Collabora) added legal numbering support for DOC and RTF files, made Calc HTML import support data-sheets attributes, made Calc’s cell editing accept pasted HTML fragments, made DOCX content control handling more robust and continued polishing floating table support
  12. Szymon Kłos, Gülşah Köse, Marco Cecchetti, Gökay Şatır, Pranam Lashkari, Michael Meeks and Méven Car (Collabora) worked on LOKit used by Collabora Online
  13. Attila Szűcs (Collabora) fixed PPTX issues with multiline field wrapping and stacked text
  14. Henry Castro (Collabora) tweaked Calc’s background colour filter to not extend transparent colours to empty cells and fixed an issue with Sidebar not displaying the full localised currency string for cell properties
  15. Tomaž Vajngerl (Collabora) made it so the currencies used in a spreadsheet are put at the top of the currency pop-up list, made pivot table data cache handling smarter and improved the handling of XLS documents with unknown DRM encryption (mainly due to some Excel addons)
  16. Julien Nabet fixed an issue where Data validation without error check allowed entering incorrect data, fixed LOWER not being supported in Base’s Query-GUI if condition was LIKE and fixed an issue with Calc Macro setting SearchWildcard to False changing SearchRegularExpression value. He also fixed some crashes
  17. Andreas Heinisch made Calc’s Autofilter sorting and removing duplicates more robust and made it so a single click is enough to access options through Calc’s status bar
  18. Xisco Faulí (TDF) made over a dozen additions and changes to automated tests, improved dark mode support of Writer comment UI, fixed an issue with Autofilter empty option, made SVG text baseline handling more intuitive, added support for in and result SVG filter attributes and fixed a crash
  19. Michael Stahl (allotropia) added support for cropped images in RTF import, fixed an issue with unwanted formatting in DOCX numbered lists, fixed page style for even/odd section breaks in RTF/DOCX import and fixed a memory leak related to copying Writer content
  20. Mike Kaganski (Collabora) made many improvements to repairing broken documents, implemented auto-accelerator feature on Windows, fixed an issue with PDF compliance, fixed an issue with vertical alignment of math formulas, fixed an issue preventing Select All in Writer from working when section at the start of document body was hidden, made the handling of temporary directories more robust, fixed an issue with unwanted wrapping in Calc and fixed crashes. He also restored a Boost library patch related to Windows locales, which was found to work around a Windows bug causing a hang after opening file dialogs
  21. Caolán McNamara (Collabora) improved dark mode support for charts and optimised Calc’s performance. He also fixed crashes and many issues found by static analysers and fuzzers
  22. Stephan Bergmann (allotropia) worked on WASM build. He also did many code cleanups and adapted the code to compiler changes
  23. Noel Grandin (Collabora) dramatically improved the memory use when exporting a PDF with lots of small graphics and expanded mergedlibs build support. He also did many code cleanups
  24. Justin Luth (Collabora) made many improvements to VML and DML graphics support and gradient support in Microsoft document formats, fixed an issue with unwanted optimal row height in XLSX import and made it so applied date/time language is detected in Impress’s insert header/footer dialog
  25. Michael Weghorn (TDF) worked on bringing native Qt widgets to Qt/KDE UI, fixed clipboard issues affecting Qt-based UIs under Wayland on Linux, added support for module-specific window icons on Wayland and fixed accessibility issues in areas such as the Navigator and Calc’s rows and columns
  26. Balázs Varga (allotropia) made the recently-added Calc XLOOKUP function implementation more robust, added Excel2021 function XMATCH to Calc and added a global config setting RecalcOptimalRowHeightMode for optimal row height recalculation when loading spreadsheets
  27. Patrick Luby (NeoOffice) made many improvements to certificate management on macOS, worked around a nasty bug in Apple’s toolchain hampering debugging, fixed a performance issue related to font handling on macOS and fixed many macOS crashes
  28. Jim Raykowski made Draw less jumpy when deleting pages, made “New style from selection” work in Impress and Draw, revamped Writer Navigator’s go to page spin control, made keyboard shortcuts work when focus is in toolbar in all UIs and improved the layout of the top toolbox of the Navigator
  29. Sarper Akdemir (allotropia) added a panel that shows presenter notes in editing view in Impress
  30. Regina Henschel fixed an issue with snap guides disappearing in Impress and Draw and took the first step in implementing 3D element support for PPTX import
  31. Sahil Gautam added a selection locking feature to Calc’s Autofilter
  32. Samuel Mehrbrodt (allotropia) tweaked highlighting in Navigator, so headings get highlighted instead of bookmarks residing in them, added an option to not write temporary file next to local file to provide a better experience with Samba network shares and made it possible to modify default bullet selection in Writer
  33. Armin Le Grand (allotropia) implemented support for editing Impress slides during presentation and continued the rework of handling attributes and properties
  34. Oliver Specht (CIB) fixed an issue where the paragraph end Pilcrow character changed to a different one, if a symbol font was used, fixed importing checkboxes from RTF files, fixed selection in Writer tables with split/merged cells, made special character dialog respect the recently used font, added Writer table sidebar controls to change table alignment and left/right spacing, made it possible to use Cycle Case when cursor is at the beginning or end of a word and not only inside it, improved compatibility with RTF tables, added support for paper tray settings in RTF and DOCX files, made it so Clone Formatting in Impress only applies paragraph attributes from and to fully selected paragraphs and made it so dash replacement autocorrection also works between sentences
  35. Matt K fixed a couple of Writer crashes
  36. Arnaud Versini did some code cleanups
  37. Jaume Pujantell (Collabora) fixed an issue causing text in shapes to be lost when exporting Impress presentations to SVG and implemented reading simple solid fills from the fill styles list in a Visio file theme
  38. Heiko Tietze (TDF) improved the look of Writer comments, made the Keep Ratio setting more intuitive in the Position and Size dialog and made infobar appearances uncluttered
  39. Hossein Nourikhah (TDF) made the build configure error out, if a buggy Windows SDK version is found
  40. Omkar Acharekar worked on bringing native Qt widgets to Qt/KDE UI as part of an Outreachy project
  41. Tibor Nagy (allotropia) fixed an issue where the layout of content to be printed from Calc was not refreshed when changing the orientation
  42. Kurt Nordback worked on adding a chart type for “pie-with-remainder-as-another-pie”
  43. Taichi Haradaguchi updated some dependencies and fixed a link in Help
  44. Juan C. Sanz made it so Firebird embedded databases get their data saved automatically regardless of whether or not the save button is pressed
  45. Ashod Nakashian (Collabora) fixed corner-case issues with DOCX content controls and change tracking
  46. Yiğit Akçay added a feature for enclosing selected text in parentheses/brackets or quotation marks in Writer
  47. Vladislav Tarakanov fixed an issue with slideshow navigation bar, where double-clicking would advance three slides
  48. Vasily Melenchuk (CIB) fixed an issue with field styles in RTF import
  49. Áron Budea (Collabora) did some code cleanups
  50. Hubert Figuière and Vivek Javiya (Collabora) worked on jsdialog used in Collabora Online
  51. Akshay Warrier added a goto page/slide dialog for Impress and Draw
  52. Kevin Ottens fixed backup copy creation for files on mounted Samba shares
  53. David Gilbert fixed a PDF import performance issue involving tiling pattern fills
  54. Po-Yen Huang fixed an issue with Calc’s ROUND function producing inconsistent results in some cases (co-authored with Franklin Weng and Firefly
  55. Kohei Yoshida optimised Calc’s performance
  56. Zeph Chai translated an ODK example from Java to Python

Kudos to Ilmari Lauhakangas for helping to elaborate this list.

Reported Bugs

477 bugs, 55 of which are enhancements, have been reported by 313 people.

Top 10 Reporters

  1. Gabor Kelemen (allotropia) ( 23 )
  2. Mike Kaganski ( 11 )
  3. lvm ( 11 )
  4. Telesto ( 10 )
  5. Rafael Lima ( 9 )
  6. Xisco Faulí ( 9 )
  7. Regina Henschel ( 8 )
  8. Stéphane Guillou (stragu) ( 7 )
  9. Adalbert Hanßen ( 7 )
  10. Olivier Hallot ( 7 )

Triaged Bugs

458 bugs have been triaged by 79 people.

Top 10 Triagers

  1. Stéphane Guillou (stragu) ( 86 )
  2. Buovjaga ( 45 )
  3. Heiko Tietze ( 29 )
  4. Julien Nabet ( 29 )
  5. V Stuart Foote ( 22 )
  6. Mike Kaganski ( 21 )
  7. ady ( 21 )
  8. m_a_riosv ( 21 )
  9. Xisco Faulí ( 21 )
  10. Dieter ( 16 )

Resolution of resolved bugs

419 bugs have been set to RESOLVED.

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

Fixed Bugs

147 bugs have been fixed by 40 people.

Top 10 Fixers

  1. Mike Kaganski ( 15 )
  2. Xisco Fauli ( 9 )
  3. Michael Stahl ( 8 )
  4. Miklos Vajna ( 8 )
  5. Oliver Specht ( 7 )
  6. Noel Grandin ( 6 )
  7. Olivier Hallot ( 6 )
  8. Justin Luth ( 5 )
  9. Patrick Luby ( 5 )
  10. Heiko Tietze ( 5 )

List of critical bugs fixed

  1. tdf#157135 LibreOffice 7.6 stalls/crashes under Windows 11 with Norwegian (Bokmål) locale when opening file dialog ( Thanks to Mike Kaganski )
  2. tdf#159707 CRASH: Changing to edit mode ( Thanks to Julien Nabet )

List of high severity bugs fixed

  1. tdf#126638 macOS: Can’t paste, copy, cut or ⌘A (select all) using keyboard shortcuts in Save-As field (workaround: comment 38) ( Thanks to Patrick Luby )
  2. tdf#127293 Add XLOOKUP function in Calc ( Thanks to Balazs Varga )
  3. tdf#149499 CRASH: inserting page break and undoing ( Thanks to Matt K )
  4. tdf#156352 macOS: Save as > Encrypt with GPG key results in hang / crash ( Thanks to Caolán McNamara )
  5. tdf#159302 Formula OLE in a line of text or its full height frame is now misaligned vertically, due to change of sm map units ( Thanks to Mike Kaganski )
  6. tdf#159519 LibreOffice 24.2.0.3 (Windows 7) ODF files saved with passwords can be opened without any password ( Thanks to Michael Stahl )
  7. tdf#159529 Excessive memory consumption in v24.2 ( Thanks to Patrick Luby )
  8. tdf#159581 FILEOPEN XLSX 24.2: optimal row height from previous sheet may be applied to all future sheets ( Thanks to Justin Luth )
  9. tdf#159743 German UI: Many not plausible Keyboard Shortcut Changes ( Thanks to Xisco Fauli )
  10. tdf#54169 LibO doesn’t obey Windows OS setting “only show the accelerator underline when the Alt key is being pressed” ( Thanks to Mike Kaganski )
  11. tdf#55004 backup copy fails when using share / samba (if nobrl cifs mount option not used) ( Thanks to Kevin Ottens )

List of crashes fixed

  1. tdf#147731 Crash in SwFrameFormat::~SwFrameFormat() ( Thanks to Michael Stahl )
  2. tdf#149499 CRASH: inserting page break and undoing ( Thanks to Matt K )
  3. tdf#155710 Calc crashes

by x1sc0 at March 11, 2024 12:21 PM

March 01, 2024

Miklos Vajna

February 29, 2024

LibreOffice Dev Blog

Writer tables converted to plain text – difficultyInteresting EasyHack

If you copy contents from LibreOffice Writer to a plain text editor like gedit or Notepad, you will see that it does a straightforward thing: It copies the text and some basic formatting like converting bullets to ‘•’. For the Writer tables, the conversion is very simple right now: every cell is written in a separate line.

For example, if you have a table like this:

A | B
--|--
C | D

When you copy the table from LibreOffice Writer and paste it into a plain text editor, it will become something like this, which is not always desirable.

A
B
C
D

It is requested that like LibreOffice Calc, or Microsoft Word, and many other programs, the copy/paste mechanism should create a text like this:

A	B
C	D

The columns are separated by <tab>.

This feature request is filed in Bugzilla as tdf#144576:

Code pointers for Handling Writer tables

There are many steps in copy/pasting, including the data/format conversion and clipboard format handling. Here, you have to know that the document is converted to plain text via “text” filter.

The plaintext (ASCII) filter is located here in the LibreOffice core source code:

Therefore, to change the copy/paste output, you have to fix the ASCII filter. That would also provide the benefit that plain text export will be also fixed as requested here.

In this folder, there are a few files:

$ ls sw/source/filter/ascii/
ascatr.cxx parasc.cxx wrtasc.cxx wrtasc.hxx

To change the output, you have to edit this file:

In this file, there is a loop dedicated to create the output.

// Output all areas of the pam into the ASC file
do {
    bool bTstFly = true;
    ...
}

Inside this loop, the code iterates over the nodes inside the document structure, and extracts text from them. To check for yourself, add the one line below to the code, build LibreOffice, and then test. You will see that a * is appended before each node.

SwTextNode* pNd = m_pCurrentPam->GetPoint()->GetNode().GetTextNode();
if( pNd )
{
+   Strm().WriteUChar('*');
    ...
}

For example, having this table, with 1 blank paragraph up and down:

A | B
--|--
C | D

You will get this after copy/paste into a plain text editor:

*
*a
*b
*c
*d
*

To fix the bug, you have to differentiate between table cells and other nodes. Then, you should take care of the table columns and print tab between them.

To go further, you can only add star before table cells:

if( pNd )
{
    SwTableNode *pTableNd = pNd->FindTableNode();
+   if (pTableNd)
+   {
+       Strm().WriteUChar('*');
+    }
    ...
}

You can look into how other filters handled tables. For example, inside sw/source/filter/html/htmltab.cxx you will see how table is managed, first cell is tracked and appropriate functions to handle HTML table are called.

For the merged cells, the EasyHacker should first checks the behavior in other software, then design and implement the appropriate behavior.

Final Words

To gain a better understanding of the Writer document model / layout, please see this document:

This presentation is also very helpful to gain a good understanding of Writer development:

Introduction to Writer Development – LibreOffice 2023 Conference Workshop, Miklos Vajna

Please accept YouTube cookies to play this 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.

by Hossein Nourikhah at February 29, 2024 03:01 PM

February 22, 2024

LibreOffice Dev Blog

Make Impress master slides copyable – difficulty interesting EasyHack

When working with LibreOffice Impress, “Slide Master” is the place where you can change the templates used for different types of the slides used in your presentation. Here we discuss a possible improvement for the “Slide Master” by making the copy from master slides possible.

Copying the Master Page in Impress

To see the problem and the room for enhancement, open LibreOffice Impress, then choose “View->Master->Slide Master” from the menus. Then, try to copy the master page on the left in the slide sorter. Unfortunately, it is not possible.

Impress slide master

Impress slide master

Having this feature is helpful, because different page types have many things in common, and being able to copy/paste helps creating templates much faster.

Impress Code Pointers

Looking into sd/source/core/drawdoc3.cxx, you can see a huge function SdDrawDocument::InsertBookmarkAsPage, which is relevant here. It contains ~600 lines of code. This huge function is in itself a problem. Therefore, to implement the enhancement, on should try to first refactor the function, then add a unit test in sd/qa/unit, find and then separate all the ~6 use cases, and fix the style/name merging.

After the cleanup, the main fix should be implemented. The suggested path to implement this comes from Jean-Francois. He suggest to improve the duplicate() method, which is described in the documentation:

As described in the above documentation, its role is to duplicate a page:

Creates a duplicate of a DrawPage or MasterPage, including the Shapes on that page and inserts it into the same model.

However, the implementation does not work for master slides, as the macros in the attachment file implies. The solution should add the needed implementation for master slides.

The implementation is inside sd/source/ui/unoidl/unomodel.cxx inside duplicate function:

// XDrawPageDuplicator
uno::Reference< drawing::XDrawPage > SAL_CALL SdXImpressDocument::duplicate( const uno::Reference< drawing::XDrawPage >& xPage )
{

...

}

Final Words

The above issue is filed as tdf#45617. If you like to work on it, just follow the Bugzilla link to see more information.

To implement this feature, first you have to build LibreOffice from the sources. If you have not done that yet, please refer to this guide first:

Getting Started (Video Tutorial)

by Hossein Nourikhah at February 22, 2024 02:57 PM

February 13, 2024

LibreOffice QA Blog

QA/Dev Report: January 2024

General Activities

  1. LibreOffice 24.2 was released on January, 31
  2. Olivier Hallot (TDF) fixed a duplicate Covariance command in Notebookbar UIs, updated menu item paths in Help pages and updated Help pages for conversion filters and style Spotlight
  3. Rafael Lima added a Color Scheme switcher to Basic IDE, added a “Delete Comment” command to the Navigator context menu, fixed drawing comment triangles in Calc at all zoom levels, made it so the visibility of UI components in the Basic IDE is remembered, made Basic IDE highlight the line where the cursor is positioned, made it possible to open the “Go to Line” dialog from the statusbar in Basic IDE, fixed Calc AutoFilter arrow color in dark mode, made it so line numbering and breakpoint in Basic IDE are on the left even in right-to-left UI and fixed a crash in Dialog Editor. He also improved the ScriptForge Help pages
  4. Stanislav Horacek updated menu paths in Help alongside other cleanups and fixes
  5. Ilmari Lauhakangas (TDF) removed unnecessary images from SVG icon themes, saving nearly 5 MB of space. He also changed the Help CSS to account for a quirk in Safari
  6. Stéphane Guillou (TDF) continued linking Sidebar decks to Help
  7. Alain Romedenne updated ScriptForge Help pages
  8. Dione Maddern did many fixes and updates to Draw dialog Help pages
  9. Gábor Kelemen (allotropia) added accessible descriptions to new Dublin Core metadata boxes, updated Help after removal of FTP protocol support and did code cleanups in the area of code simplification and includes
  10. Laurent Balland did cleanups in the metadata of Impress templates
  11. Miklós Vajna (Collabora) fixed the layout handling of empty paragraphs formatted as superscript in Writer, added support for HTML paste to Writer shape text or Calc cell text edit and continued polishing support for multi-page floating tables in Writer
  12. Jean-Pierre Ledure worked on the ScriptForge library
  13. Gabriel Masei (1&1), Paris Oplopoios, Szymon Kłos, Méven Car, Andras Timar, Attila Szűcs and Áron Budea (Collabora) worked on LOKit used by Collabora Online. Andras also fixed some FreeBSD build issues while Attila fixed hyperlink colouring in certain PPTX files and a textbox vertical alignment inversion issue when saving PPTX files
  14. Henry Castro (Collabora) made the status bar in Calc work as expected with language selection
  15. Eike Rathke (Red Hat) made it so the maximum number of hours that can be entered into a Calc cell with time formatting is now a 32-bit integer instead of 65535
  16. Tomaž Vajngerl (Collabora) continued refactoring the EditEngine text editing code
  17. Julien Nabet fixed an issue preventing some position parameters to go beyond 17 mm in Writer, fixed an issue that made ReportBuilder wizards show two different data sources, fixed several crashes and did code cleanups
  18. Andreas Heinisch made it so font, highlight and background colour in toolbar buttons is remembered between sessions, fixed canceling Text Import in Calc locking the document and made it so question mark can be used in autotext shortcuts
  19. László Németh continued polishing support for smart justify found in DOCX files and implemented ODF attribute fo:hyphenate to exclude a portion of text from hyphenation
  20. Xisco Faulí (TDF) fixed a regression with multiline text exported to PDF as one line, added support for viewBox in symbol elements in SVG import and made nearly 20 additions and improvements to automated tests
  21. Michael Stahl (allotropia) continued polishing revamped ODF encryption, fixed a regression preventing editing of index entries in Writer, worked on WASM build, fixed a Writer issue causing objects to disappear after undo followed by Enter due to invisible anchor selection and fixed slowness if Style Inspector visible during PDF export
  22. Mike Kaganski (Collabora) made font substitution more robust, implemented support for inserting Unicode decimal codes via Alt+NumPad on Windows, fixed storing URLs in DOCX files, fixed a Writer formatting error in paragraphs with justified text, fixed PPTX import of graphic placeholder with a custom prompt, made it so Delete and Backspace move the cursor correctly in change tracking mode, fixed floating content controls importing from DOCX as separate paragraphs, improved the debugging experience in Visual Studio, fixed autotext / word completion tooltips not showing up, fixed an issue with saving word completion options, improved the IDE integration build code, got rid of unwanted space between footnote number and following text, when paragraph has hanging indent in imported DOCX files, fixed passing Integer-sized Long argument via script.invoke in BASIC, fixed unwanted interleaving of bookmark starts and ends and fixed updating path to library when it is renamed using Basic Macro Organizer. He also fixed crashes and did code cleanups
  23. Caolán McNamara (Collabora) fixed an issue causing Similarities dialog to not appear in Base, made optimal column width in Calc more robust, fixed an issue with checkboxes under GTK3 not being disabled when settings are locked down from config, fixed an issue with Hyperlink dialog width growing too large with long text in clipboard, improved Calc performance by reducing window content invalidations and enabled Small Caps toolbar button in Impress. He also fixed crashes and many issues found by static analysers and fuzzers
  24. Stephan Bergmann (allotropia) worked on the online update feature and WASM build and fixed an issue preventing certificate manager use. He also did many code cleanups and adapted the code to compiler changes
  25. Noel Grandin (Collabora) optimised opening files on Unixes, fixed an issue causing Paste as RTF to lose character color and paragraph alignment from styles, improved scrolling performance in Calc and made cryptographic signing more robust. He also did many code cleanups
  26. Justin Luth (Collabora) fixed a problem with tracked changes showing in Start Center thumbnail, fixed various cases of context menu not appearing in Writer when right-clicking the last half character, fixed an object z-order issue in DOCX files, fixed loss of number formatting in charts in DOCX import, fixed DOCX export issues causing unwanted overlapping of objects, fixed unwanted offset added to shapes in headers in DOCX import and fixed issues with pie chart import in OOXML files
  27. Michael Weghorn (TDF) worked on bringing native Qt widgets to Qt/KDE UI and fixed accessibility issues in areas such as shortcuts. He also did many updates and cleanups to the LibreOffice Android Viewer code
  28. Balázs Varga (allotropia) fixed an issue with copying master slide style in PPTX documents, made it so the user is taken straight to the Security Options and Warnings dialog after clicking the relevant button in an infobar notification and made accessibility warnings about simulated numbering smarter
  29. Patrick Luby (NeoOffice) fixed many macOS crashes and a hang on iOS during export
  30. Jim Raykowski made Spotlight more elegant by only showing it for styles that are used in the document, fixed a hyperlink editing crash while having Navigator open and made it possible to insert cross references from Navigator by dragging and dropping
  31. Sarper Akdemir (allotropia) continued working on the feature for disabling active content, fixed an issue with background image shifting down in presentation mode in PPTX files and made it so Dublin Core meta data attribute dc:date is added to exported PDF files
  32. Christian Lohmaier (TDF) fixed packaging of Noto fonts on macOS, fixed an issue with Windows build signing, added Armenian language pack and fixed Windows aarch64 cross-build
  33. Regina Henschel fixed an issue with line break missing from RTF clipboard data after copying shape text
  34. Sahil Gautam added a UI label for page preview zoom slider and made Calc cell cursor more accessible for colour blind users
  35. Samuel Mehrbrodt (allotropia) made the removal of meta data more extensive when the option to remove it when saving is active, implemented resizing of Writer comment section, made it so only documents from the current module are shown by default in Recent Documents and fixed an issue with an empty chart title getting unwanted text in imported PPTX files
  36. Thorsten Behrens (allotropia) fixed build issues related to certain libraries, fixed an xpdfimport crash with missing fonts, made MAR-based LibreOffice updater non-experimental and wholesome ODF package encryption the default
  37. Armin Le Grand (allotropia) continued the rework of handling attributes and properties
  38. Oliver Specht (CIB) made it so that upon entering a legacy text fieldmark in Writer, placeholder text gets pre-selected, made sure paper tray settings are respected when importing RTF and DOCX files and made clone formatting switch off lists
  39. Matt K fixed an issue with conditional formatting getting lost when moving Calc sheets around and fixed many crashes
  40. Adam Seskunas added an automated test for moving focus to inserted image in Writer
  41. Arnaud Versini did some code cleanups
  42. Darshan Upadhyay, Jaume Pujantell and Vivek Javiya (Collabora) worked on jsdialog used by Collabora Online. Jaume also made font embedding in DOCX files more robust
  43. Heiko Tietze (TDF) made Template Manager cleaner by hiding useless buttons, made the options in Image compression dialog behave more logically and improved the look of Calc comment indicator
  44. Hossein Nourikhah (TDF) added a minimal Python extension as an example, fixed a JUnit test not running and decreased the maximum number of columns in Calc’s data entry form to prevent performance issues
  45. Skyler Grey (Collabora) added a Calc option to keep edit mode on Enter/Tab, particularly useful for devices with an onscreen keyboard
  46. Gökay Şatır (Collabora) fixed Ignore All not working with LanguageTool spellchecking errors
  47. Omkar Acharekar worked on bringing native Qt widgets to Qt/KDE UI as part of an Outreachy project
  48. Tibor Nagy (allotropia) made Calc support creation of accessible PDFs, fixed many other accessible PDF issues and fixed an issue with table styles in PPTX import
  49. Kurt Nordback fixed an issue with combo chart render order
  50. Marco Cecchetti (Collabora) fixed Calc view invalidation issues
  51. Dennis Francis (Collabora) improved the performance of conditional formatting in Calc
  52. Matthew Kogan fixed an issue with an unwanted space appearing at start of line when field wraps
  53. Kevin Suo made it so Empty and Error entries are shown as non-selected and inactive when hidden by autofilter
  54. Eli Schwartz (Arch Linux) improved the portability of shell scripts
  55. Bayram Çiçek (Collabora) made inactive Calc sheets movable and copyable
  56. Xuan Chen fixed a Java UNO bridge test failure on riscv64 CPU architecture
  57. Winfried Donkers added Excel2021 function XLOOKUP to Calc

Kudos to Ilmari Lauhakangas for helping to elaborate this list.

Reported Bugs

515 bugs, 76 of which are enhancements, have been reported by 297 people.

Top 10 Reporters

  1. Gabor Kelemen (allotropia) ( 40 )
  2. Xisco Faulí ( 19 )
  3. Telesto ( 16 )
  4. Mike Kaganski ( 12 )
  5. Tracey ( 10 )
  6. Rafael Lima ( 10 )
  7. Robert Großkopf ( 9 )
  8. Stéphane Guillou (stragu) ( 9 )
  9. Regina Henschel ( 8 )
  10. Justin L ( 8 )

Triaged Bugs

523 bugs have been triaged by 67 people.

Top 10 Triagers

  1. Stéphane Guillou (stragu) ( 109 )
  2. Buovjaga ( 80 )
  3. m_a_riosv ( 56 )
  4. Heiko Tietze ( 41 )
  5. Xisco Faulí ( 29 )
  6. Mike Kaganski ( 23 )
  7. Julien Nabet ( 17 )
  8. Rafael Lima ( 14 )
  9. Telesto ( 13 )
  10. V Stuart Foote ( 12 )

Resolution of resolved bugs

456 bugs have been set to RESOLVED.

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

Fixed Bugs

181 bugs have been fixed by 39 people.

Top 10 Fixers

  1. Mike Kaganski ( 21 )
  2. Rafael Lima ( 13 )
  3. Caolán McNamara ( 9 )
  4. Justin Luth ( 8 )
  5. Michael Stahl ( 8 )
  6. László Németh ( 6 )
  7. Tibor Nagy ( 6 )
  8. Heiko Tietze ( 6 )
  9. Samuel Mehrbrodt ( 5 )
  10. Matt K ( 5 )

List of high severity bugs fixed

  1. tdf#155917 Writer crashes when inserting ODT file containing PDF into table in another ODT doc ( Thanks to Michael Stahl )
  2. tdf#158965 Find Record: Similarities dialog won’t appear ( Thanks to Caolán McNamara )
  3. tdf#159243 Armenian characters displaying incorrectly (as boxes) on macOS (fonts not packaged properly) ( Thanks to Christian Lohmaier )
  4. tdf#159386 Selecting all in a certain table causes assert in SfxPoolItem::SetWhich with a debug build ( Thanks to Caolán McNamara )
  5. tdf#73678 FORMATTING: Conditional Formatting lost when Click-drag Sheet2 tab to position 1 or adding, then

by x1sc0 at February 13, 2024 09:17 AM

February 11, 2024

Caolán McNamara

coverity 2022.6.0 and LibreOffice


After a long slog since November when the previous version of coverity was EOLed and we had to start using 2022.6.0 with its new suggestions for std::move etc, LibreOffice is now finally back to a 0 warnings coverity state

by caolan (noreply@blogger.com) at February 11, 2024 06:02 PM

February 06, 2024

Miklos Vajna

Fixing multi-view programming challenges in Calc and elsewhere

This post describes some challenges around having multiple views of one opened document in LibreOffice core, when those views belong to LOK views, representing different users, with their own language, locale and other view settings.

This work is primarily for Collabora Online, but is useful for all clients of the LOK API.

Motivation

LOK views are meant to represent separate users, so we need to make sure that when a user sets their preferences and trigger an action, then the response to that action goes to the correct view, with the correct view settings.

This is different from the desktop LibreOffice use-case, where multiple windows are still meant to share the same user name, language, undo stack and so on.

Results so far

In this post, I would like to present 4 small improvements that recently happened to the LOK API to provide this wanted separation of views.

The first was an issue where two users were editing the same document, one busily typing and the other clicked on a link in Calc. What could happen sometimes is the link popup appeared for the user who typed, not for the user who clicked on the link:

Link popup is actually on the left, should be on the right, now fixed

This specific problem can be fixed by making sure that link click callbacks are invoked synchronously (while the clicking view is still active) and not later, when the current view may or may not be the correct one.

It turns out the same problem (async command dispatch) affects not only hyperlinks, but many other cases as well, where we want to stay async, for example, when one dialog would invoke another dialog, like the Calc conditional format -> add dialog:

Calc conditional format add dialog appearing on the left, should be on the right, now fixed

There you don't want to change async commands into sync commands, because that may mean spinning the main loop inside a dialog, resulting in nested main loops. This can be fixed by making sure that async commands to be dispatched (sfx2 hints in general) are processed in a way that the current view at dispatch & processing is the same, which is now the case.

The third problem was around wrong language & locale in the status bar:

Unexpected English strings in localized statubar UI, now fixed

This is not simply a problem of missing translation, the trouble was that the status bar update is also async and by the time the update happened, the locale of the view on the left was used, for a string that appears on the right.

The way to fix this is to perform the update of toolbars/statusbar/etc (in general: SfxBindings) in a way that the language at job schedule time and at UI string creation time is the same.

The last problem was quite similar, still about bad language on the UI, but this time on the sidebar:

Unexpected English strings in localized sidebar UI, now fixed

This is similar to the statusbar case, but the sidebar has its own executor for its async jobs, so that needed a fix similar to what the statusbar already had, now done.

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 the latest Collabora Online Development Edition 23.05 and try it out yourself right now: try the development edition. Collabora intends to continue supporting and contributing to LibreOffice, the code is merged so we expect all of this work will be available in TDF's next release too (24.8).

by Miklos Vajna at February 06, 2024 08:49 AM

January 25, 2024

Marius Popa Adrian

Firebird 5.0 Is Released

Firebird Project is happy to announce general availability of Firebird 5.0 — the latest major release of the Firebird relational database for Windows, Linux, MacOS and Android platforms.This release introduces improvements in areas of performance, multithreaded processing (including backup, restore, sweep), SQL queries profiling, with better scalability and numerous enhancements in SQL

by Popa Adrian Marius (noreply@blogger.com) at January 25, 2024 10:29 AM

January 16, 2024

LibreOffice QA Blog

LibreOffice 24.2 RC2 is available for testing

LibreOffice 24.2 – with a new year.month versioning scheme – will be released as final at the beginning of February, 2024 ( Check the Release Plan ) being LibreOffice 24.2 Release Candidate 2 (RC2) the forth pre-release since the development of version 24.2 started in mid June, 2023. Since the previous release, LibreOffice 24.2 RC1, 113 commits have been submitted to the code repository and 61 issues got fixed. Check the release notes to find the new features included in this version of LibreOffice.

LibreOffice 24.2 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 it!

Happy testing!!

Download it now!

by x1sc0 at January 16, 2024 03:59 PM

January 12, 2024

LibreOffice Design Blog

Comments in Sidebar

Using comments is a key feature in text processing. A typical workflow might be to review a document where notes are made by different colleagues. LibreOffice Writer currently shows these comments in the document margin, which is limited to the page height, ending up in the need to scroll long text (even while editing [1]) and eventually in paging-like interactions if the number of comments exceed the total size.…

by Heiko Tietze at January 12, 2024 01:22 PM

January 03, 2024

Miklos Vajna

Multi-page floating tables in Writer: tables wrapping tables

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 10th 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 case where that content is not just text, but the wrapping content itself is also a table.

Results so far

Regarding testing of the floating table feature in general, the core.git repository has 92 files now which are focusing on correct handling of floating tables (filenames matching floattable-|floating-table-). This doesn't count cases where the document model is built using C++ code in the memory and then we assert the result of some operation.

Here are some screenshots from the improvements this month:

Improved click handling near the first page of a floating table

The first screenshot shows a situation where the mouse cursor is near the right edge of the first page of a floating table. What used to happen is we found this position close to the invisible anchor of the floating table on that page, then corrected this position to be at the real anchor on the last page. In short, the user clicked on one page and we jumped to the last page. This is now fixed, we notice that part of the floating table is close to the click position and we correct the cursor to be at the closest position inside the table's content.

A floating table, wrapped by an inline table: old, new and reference rendering

The next screenshot shows a floating table where the content wrapping around the table happens to be an inline table. You can see how such wrapping didn't happen in the past, and the new rendering is close to the reference now.

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 snapshot / demo of Collabora Office 23.05 and try it out yourself right now: try the unstable snapshot. Collabora intends to continue supporting and contributing to LibreOffice, the code is merged so we expect all of this work will be available in TDF's next release too (24.8).

by Miklos Vajna at January 03, 2024 02:15 PM

December 18, 2023

Marius Popa Adrian

Call For Testing Firebird ODBC Driver for Firebird 3.x

The new version of Firebird ODBC driver is in Beta stage now. Version 3.0.0 Beta is available for testing on Windows. It works only with Firebird 3+ , and requires fbclient.dll from Firebird 3 or above.https://github.com/FirebirdSQL/firebird-odbc-driver/wikiPlease download, test, and report any issues!Issues can be reported here: https://github.com/FirebirdSQL/firebird-odbc-driver/issuesOriginal

by Popa Adrian Marius (noreply@blogger.com) at December 18, 2023 07:20 PM

December 04, 2023

Miklos Vajna

Multi-page floating tables in Writer: UI improvements

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 9th post for the previous part.

Motivation

Previous posts described the hardest part of multi-page floating tables: reading them from documents, so we layout and render them. In this part, you can read about UI improvements when it comes to creating, updating and deleting them in Writer.

Results so far

Regarding testing of the floating table feature in general, the core.git repository has 89 files now which are focusing on correct handling of floating tables (filenames matching floattable-|floating-table-). This doesn't count cases where the document model is built using C++ code in the memory and then we assert the result of some operation.

Here are some screenshots from the improvements this month:

Improved insertion of floating tables

The first screenshot shows that the underlying LibreOffice Insert Frame dialog is now async (compatible with collaborative editing) and is now exposed in the Collabora Online notebookbar.

There were other improvements as well, so in case you select a whole table and insert a new frame, the result is close to what the DOCX import creates to floating tables. This includes a default frame width that matches the table width, and also disabling frame borders, since the table can already have one.

Unfloating a floating table

The next screenshot shows an inserted floating table, where the context menu allows updating the properties of an already inserted floating table, and also allows to delete ("unfloat") it.

Several of these changes are shared improvements between LibreOffice and Collabora Online, so everyone benefits. For example, inserting a frame when a whole table was selected also cleared the undo stack, which is now fixed. Or unfloating table was only possible if some part of the table was clipped, but now this is always possible to do.

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 snapshot / demo of Collabora Office 23.05 and try it out yourself right now: try the unstable snapshot. Collabora intends to continue supporting and contributing to LibreOffice, the code is merged so we expect all of this work will be available in TDF's next release too (24.2).

by Miklos Vajna at December 04, 2023 03:26 PM

November 19, 2023

Stephan Bergmann

I like it here. Can I stay?

(And do you have a vacancy for a back-scrubber?)

Thank you, Red Hat, for generously letting me work for so long on stuff that is near and dear to my heart. At the intersection of theory and practice, of compiler technology and the LibreOffice code base. But, to keep doing what I love, I need to move on.

So, thank you, allotropia, for having me. I’m excited.

And, above all, thank you, LibreOffice, family of friends. Lets make sure to keep this a happy family, one that Tolstoy would have nothing to write home about. With quarrels and arguments, for sure; feud even. But happy at heart. I wish to keep meeting you all for years to come, virtually, and for a feast at FOSDEM or LOCon. And booze.

To paraphrase Hamburger Tafel (donations needed, btw), “Wir haben LibreOffice noch lange nicht satt.”

Have fun, stay safe, peace,
sberg

by stbergmann at November 19, 2023 10:58 AM

November 12, 2023

Robert Riemann

Is developing word processing software hard?

Hello LibreOffice Planet!

This is my first blog post on the topic of LibreOffice. Let me quickly explain my link to LibreOffice. I work for a data protection authority in the EU and help navigate the digital transformation of our office with about 100 staff members. While many of our partner organisations adopt Microsoft 365, our office decided to pilot Nextcloud with Collabora Office Online.

In the future, I want to blog (in my personal capacity) about my thoughts related to the use of alternative word processing software in the public sector in general and in our specific case.

As there are no dedicated resources for training, preparation of templates etc., during the pilot of LibreOffice, the experience so far covers a large spectrum of user satisfaction. Generally, our staff has been spent years of their life using Microsoft Office and has the expectation that any other software works the same way. If it does not, they send an email to me (best case) or switch back to Microsoft Office.

During the week, I discussed again some smaller LibreOffice bugs. Then, I showed this weekend some FOSS Blender animated short videos to family members. It seems that Blender is more successful in its domain than LibreOffice. Is that possible? Or are animated short videos just more capturing due to their special effects? 😅

You can watch the 1min Blender animated short movie “CREST� on Youtube or the making-off. The latter you find here below.

I find it very inspiring to see what talented artists can do with Blender. For my part, I have once installed Blender and deinstalled it. Back then it was not easy to use for people not familiar with video animation software. Blender competes with proprietary software such as Maya or Cinema 4D. The latter is about 60 USD per month in the annual subscription plan. Not exactly cheap.

Then, I read in the fediverse about people working with LibreOffice:

I just tried to use #LibreOffice #Draw to draw some arrows and boxes onto JPEG images for emphasizing stuff.

The UX is really bad for somebody not working with Draw all the time.

Whatever I do, instead of drawing onto the image, the image gets selected instead.

Could not find any layer-sidebar.

Could not scale text without starting the “Character …� menu, modifying font size blindly + confirming > just to see its effect and then start all over.

Dear #FOSS, we really should do better.

— Author Karl Voit (12 November 2023 at 14:51)

In my past, I have worked on online voting systems. They are not very good yet despite years of efforts. xkcd dedicated a comic to voting software

Elections seem simple—aren’t they just counting? But they have a unique, challenging combination of security and privacy requirements. The stakes are high; the context is adversarial; the electorate needs to be convinced that the results are correct; and the secrecy of the ballot must be ensured. And they have practical constraints: time is of the essence, and voting systems need to be affordable and maintainable, and usable by voters, election officials, and pollworkers.

— Author Matthew Bernhard et al. in their paper Public Evidence from Secret Ballots from 2017

What is the unique challenge of developing word processing software? Happy to hear back from you in the blog comments or on the companion fediverse post!

by Robert Riemann (robert@riemann.cc) at November 12, 2023 10:20 PM

November 01, 2023

Marius Popa Adrian

Valgrind 3.22 is available

News via reddit : "We are pleased to announce a new release of Valgrind, version 3.22.0,available from https://valgrind.org/downloads/current.html.See the release notes below for details of changes.Our thanks to all those who contribute to Valgrind's development. Thisrelease represents a great deal of time, energy and effort on the partof many people.Happy and productive debugging and

by Popa Adrian Marius (noreply@blogger.com) at November 01, 2023 02:01 PM

October 27, 2023

Naruhiko Ogasawara

LOUCA23 (LibreOffice Conference Asia x UbuCon Asia 2023)

Long time no see, readers!  Very sorry for my laziness.


I attended LibreOffice Conference Asia x UbuCon Asia 2023 (LOUCA23) in Surakarta, Indonesia, on October 7~8.

This was the second time LibreOffice Conference Asia has been held in Tokyo in 2019, as it could not occur due to the COVID-19 pandemic.  UbuCon Asia was first held online in 2021, and the first in-person event was held in Seoul, Korea in 2022, and this still was the second in-person event.

I was burnt out by the pandemic and had stopped most of my OSS activities, but I still had many friends in the OSS world, so I went to Indonesia to meet with them.  

Therefore, I had initially intended to be a general participant.  Still, a friend of the speaker was suddenly unable to attend due to illness, so I gave a presentation in his place.  Here is my slide:

As mentioned, I am halfway out of OSS activities, but I know what my friends are doing, so it was not so difficult to talk about this subject.

Although I cannot say that the presentation itself was a great success (due to my English language skills), I was pleased because the audience was very responsive and easy to talk to, and many people approached me after the presentation was over.

Other than my presentation, I was naturally interested in the two keynote speeches by The Document Foundation and was surprised and grateful when Franklin Weng mentioned my name as an "Asian activist to be featured at the LibreOffice Latin America Conference. "

I listened to Muhammad Syazwan Md Khusaini's "Hands-On on Translating in Ubuntu" with great interest; however, I was a bit surprised to hear from a friend that many Indonesians use English for desktop environments and applications like LibreOffice.  I recognized that this was quite different from Japan.

The event itself was just as enthusiastic. Unlike OSS events in Japan (laugh), the participants were young, and there were many women. I was also surprised to see junior high school students among the speakers.

Both lunch and dinner were complimentary, and the one-day Surakaruta city tour the day after the event was delightful.  I appreciated the hospitality of the local staff.

This was my first time in Indonesia, and although short, I enjoyed many things, including the train trip. In Yogyakarta, I visited a museum and learned a lot about the history of Indonesia. However, I was overcharged by the tuk-tuk in Yogya.



I know it was a lot of work for the organizers, but as I have many friends in LibreOffice and am also an Ubuntu user, I was very grateful that the two events were co-hosted. Thanks to all the sponsors, global/local organizers, and everyone who talked to me there.  See you soon!


by Naruhiko Ogasawara (noreply@blogger.com) at October 27, 2023 01:13 PM

October 11, 2023

Marius Popa Adrian

Firebird 5.0 Release Candidate 1 is available for testing

Firebird Project announces the first Release Candidate of Firebird 5.0, the next major version of the Firebird relational database, which is now available for testing on all supported platforms (Windows, Linux, MacOS, Android).This Release Candidate demonstrates the complete set of features and improvements developed for the new release. Release Candidates are generally considered stable enough

by Popa Adrian Marius (noreply@blogger.com) at October 11, 2023 02:47 PM

Flamerobin 0.9.9 Snapshot released with a few fixes

Flamerobin 0.9.9 Snapshot released with a few fixesWhat’s Changed :Fix Mac OS compilation by @rlakis in #328Fix saving style error and code scanning alert by @arvanus in #330Improve SQL statistics by @arvanus in #331New Contributors :@rlakis made their first contribution in #328

by Popa Adrian Marius (noreply@blogger.com) at October 11, 2023 02:46 PM

August 26, 2023

Bayram Çiçek

Final Report - Google Summer of Code 2023 - Search Field in Options

About project

LibreOffice is a complex application with a large and growing number of options. It is not easy to find the right needle in the haystack. Like most other complex applications, it will be valuable and useful enhancement to add a search field to the “Tools > Options” dialog that iterates over the various tabs and filters where the search text is found. The Search Field in Options project aims to provide this search functionality in “Tools > Options” page.

Tasks

  •   Add search field to Options dialog - UI
  •   Implement search function
  •   Include Options TreeView’s parent and child node names into searching
  •   Add GetAllStrings() method to fetch strings from 69 dialogs step by step
  •   Include following element strings into searching:
    •   labels
    •   check buttons
    •   radio buttons
    •   toggle buttons
    •   link buttons
    •   buttons
  •   Include accessibility elements into searching:
    •   accessible-names
    •   accessible-descriptions
    •   tooltip-texts
  •   Include option pages from extensions into searching
  •   Initialize all dialogs at background if it’s possible (salhelper::Thread - asynchronously)
  •   Initialize all dialogs to get strings properly (not in background - synchronously)
    •   initialize ~half of them after opening the options
    •   and initialize remaining ones after doing a search
  •   Update Options TreeView properly after the searching done
  •   Expand the first node and select first child-node after search by default
  •   Remove Hyphen (_) and Tilde (~) symbols from fetched strings to make the search function work correctly

My Work during GSoC

During 13 weeks GSoC program, I added a search field in Options dialog and included the node names and their .ui strings into searching. Since sub-dialogs under the Options are not initialized at startup of Options dialog, it was not possible to access their .ui strings. To overcome this issue we had two options:

  • Option A: Extract .ui strings at build-time and fetch them at run-time
    This option requires working on file operations, LibreOffice’s build system, makefiles, localization etc. I worked on this option for ~5 weeks but this approach caused a lot of issues that took the project out of its scope. For example, how to deal with localization issue while extracting strings at build-time? This was another big problem…
  • Option B: Initialize all dialogs in some way and get their strings
    This option is more understandable and simple. Instructions are clear. No need to worry about localization. No need to work on file operations, extracting and fetching data, working with makefiles etc…

When I felt that Option A is just wasting my time (~5 weeks); I switched to Option B where I can -at least- make some progress. The main issue in Option B was initializing all dialogs which takes about 4-8 secs. I tried to initialize them at background but there was some errors on Win10 that I don’t reproduce the issue on my linux machine. Then I tried to see the errors on Win10 with a virtual machine, but it was too slow to test. Therefore I uninstalled Manjaro/Linux (which I’ve been using it more than 1.5 years) from my computer and had to install Win10 (which I last used 6 years ago) on my machine to see the problems in there. There was some visual inconsistencies while initializing sub-dialogs using salhelper::Thread at background.

After working long hours for weeks meanwhile the time was running out, I decided to initialize almost half of them at Options dialog startup and the remaining ones at the time of searching. In that way, time of initializing process is divided by ~2 which can be acceptable time in some degree in terms of user experience.

There is a single patch on Gerrit for this project: https://gerrit.libreoffice.org/c/core/+/152519. The patch has more than 30 patchsets and includes “+2255 -47” changes.

The most challenging part was implementing GetAllStrings() function for every ~69 dialogs step by step. Current implementation may not be the best solution for user experience, but at least searching through the numerous options is now possible.

options-dialog-on-Win10.png

Whats left to do or can be done?

Following tasks are left and can be implemented after GSoC:

  •   Include accessibility elements into searching:
    •   accessible-names
    •   accessible-descriptions
    •   tooltip-texts
  •   Include option pages from extensions into searching
  •   Initialize all dialogs at background if it’s possible (salhelper::Thread - asynchronously)

Additional hacks

  • Show modified options with some special indicator (as in KDE settings). (better to discuss this idea in a separate ticket)
  • Implement highlighting feature

Tasks I’ll be working on after GSoC

  • improvement on the initialization of the dialogs, maybe it can be possible to initialize them at background without encountering any visual inconsistencies - especially on Windows.
  • Implementing the remaining tasks:
    • Include accessibility elements into searching
    • Include option pages from extensions into searching
  • If everything works fine I’d like to work on the highlighting feature
  • Also it would be prettier if Options dialog have a modified options indicator (as in KDE settings)

Thanks

I’m very happy that we all reached the end of GSoC. During that time, I know that I had a responsibility for doing everything that I can. Therefore I worked hard and tried to complete as much tasks as I can.

I learned a lot of things during the GSoC. Although GSoC is finished, I will definitely continue to contribute to LibreOffice. I am really happy to be a part of the LibreOffice community and Google Summer of Code. I’m really thankful to LibreOffice and Google for providing us this such a great opportunity which helped me gain this amazing experience!

I always tried to be active on IRC #libreoffice-dev channel, and I want to thank for everybody who helped me about my questions.

And most importantly, greatly thankful to Andreas Heinisch and Heiko Tietze who were my mentors throughout the GSoC period. They always guided me everything about my questions. Thank you endlessly for your time and effort. I appreciate that you always motivating and encouraging me in all that I attempt and do. I can never truly express how grateful I am. Your guidance, reviews, help and shared experiences have been invaluable. Thank you very much for everything.

I’d like to express my gratitude to everyone in the LibreOffice community for their help and kindness. They always tried to answer my questions on IRC. I fell very lucky to work with this amazing community. I have learned a lot from you and I will never forget this wonderful experience.

Regards,
Bayram Çiçek

All weekly GSoC reports:

Useful links:

# free as in freedom

by Bayram Çiçek at August 26, 2023 09:00 AM

August 25, 2023

Ahmed Gamal Eltokhy

Final Report

The past four months working on LibreOffice for Google Summer of Code 2023 have been an amazing learning experience. With the help of mentors Thorsten, Heiko, and Hossein, I implemented features to improve the user experience around digital signing and encryption like remembering recipients, better recipient selection UI, fast searching/filtering of keys, and documentation. My 12 patches were merged and it was incredible contributing to open source with the friendly LibreOffice community. I look forward to more FOSS contributions in the future!

August 25, 2023 12:25 PM

August 23, 2023

Caolán McNamara

Small Caps in Impress

Writer supports Small Caps, but Impress and drawing shapes in general never fully supported Small Caps. The option was available, and the character dialog provided a preview, but Small Caps was rendered the same as All Caps, as seen here.

 This has lingered for years and it's not easy as a user to try and manually workaround with varying font sizes because underline/overline/strike-through decorations won't link up, as seen in this example:


 but finally for Collabora Hack Week I was able to carve out some time to fix this. So in today's LibreOffice trunk we finally have this implemented as:

In addition a buggy case seen in the preview of double overlines for mixed upper/lower case was also fixed, from:

to:


Also noticed during all of this was the wrong width scaling used for the red wave line underneath incorrect spelling in impress when the text is superscript or subscript so the line didn't stretch over the whole text, as seen here: 

Now corrected as:

and finally added was a missing implementation in the RTF export of shape text to allow the small caps format to be copy and pasted into other applications from impress.

by caolan (noreply@blogger.com) at August 23, 2023 04:01 PM

August 21, 2023

Björn Michaelsen

How to survive being bought by Oracle

How to survive being bought by Oracle?

When I wrote Quo vadis with The Document Foundation? a month ago, that was mostly a side product of sorting out my thoughts on open source governance in general, and on LibreOffice in particular. And while that sparked some discussion on the identity of the LibreOffice project, mostly here on Board Discuss, it ultimately was preparation for a talk Thorsten and me had submitted for a vacation on Chaos Communication Camp 2023. Our preparation was somewhat chaotic -- because both Thorsten and me decided to get very creative about the "dont come by car" suggestion by the organizers and our talk being scheduled on the first day of the event -- so we ended up honouring the LibreOffice tradition of finishing slides only hours before the scheduled slot.

The session itself did not seem to have suffered too much by this -- it was more free form, which might actually have been a bonus. We ended up even being allowed to use some extra time for Q&A as there was quite some interest for that in the audience.

The video recording can be found on media.ccc.de and describes both bits of the history of the LibreOffice fork a decade ago and lessons learned that are still relevant for open source communities forking (or otherwise reorganizing themselves) today.

A huge thank you to all the volunteers that made #CCCamp23 (and therefore this talk) happen, especially c3voc for the recording and c3cert who did a great job in checking a minor injury I suffered due to my own stupidity during the event.

Comments? Feedback? Additions? Most welcome here on the fediverse !

August 21, 2023 06:00 AM