Implements LibreOffice extension providing Rust language binding for UNO API
using opaque pointer FFI architecture with type-safe handles.
Extension Features:
- User-controlled execution via "Rust UNO → Example" menu
- Optional installation/removal through LibreOffice extension system
- Complete Writer document manipulation example
Technical Implementation:
- Generated Rust wrappers for all UNO types via rustmaker
- C++ extern "C" bridges with proper UNO integration
- Type-safe opaque handles (XTextDocumentHandle, etc.)
- Extension architecture following LibreOffice standards
- Menu integration via Addons.xcu and ProtocolHandler.xcu
Architecture:
- Rust RAII Wrappers ↔ C++ extern "C" Bridges ↔ LibreOffice UNO
- Extension packaging with rust_uno-example.oxt
- Integrated build system with CustomTarget and Library makefiles
Build Commands:
./configure --enable-rust-uno
Extension Structure:
- rust_uno/example/ - Extension source files
- workdir/Extension/rust_uno-example.oxt - Packaged extension
- Automatic installation during LibreOffice build
Runtime Validation:
Successfully demonstrates complete UNO integration:
- Desktop service creation and XComponentLoader interface
- Writer document loading via loadComponentFromURL
- Text manipulation through XTextDocument and XSimpleText
- Proper interface querying and method invocation
GSoC 2025: Rust UNO Language Binding
Change-Id: I5cecb8ebd05aab396f444488c0ee2a9d483a9f62
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/186425
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <stephan.bergmann@collabora.com>
The rustmaker provides comprehensive support for converting UNO type definitions into idiomatic Rust code with proper memory safety and type system integration.
Also adds the RustFile, RustOptions, and RustProducer classes to handle
Rust code generation, file management, and command line option parsing
for various UNO type kinds such as enums, structs, and interfaces.
Change-Id: Iaf87af13352c55e81c1745ef7a8f591c3e61e0a4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188088
Reviewed-by: Stephan Bergmann <stephan.bergmann@collabora.com>
Tested-by: Jenkins
This commit introduces the 'pythonmaker' executable, a new tool in the
codemaker module.
pythonmaker generates Python type stub files (.pyi) from UNO IDL type
libraries (.rdb files). This enables static type checking and modern
IDE features like auto-completion for developers writing Python scripts for LibreOffice.
This commit includes the complete, feature-complete tool capable of handling all major IDL entity types (enums, constants, typedefs,
structs, exceptions, interfaces, services, and singletons).
Change-Id: I52f783aa982e1de04a207a9a884aee207f99d193
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185498
Tested-by: Jenkins
Tested-by: Hossein <hossein@libreoffice.org>
Reviewed-by: Hossein <hossein@libreoffice.org>
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
...to enable "the UNO parts (types and servie implementation) of the embindtest
framework (which can also be used independently of the Emscripten build)." And
which e.g. both last year's Lua GSoC project and this year's Rust GSoC project
(<https://gerrit.libreoffice.org/c/core/+/186425> "Add core UNO types for Rust
language binding") enabled locally in their respective dev builds.
Change-Id: I8cf917fbcdaf73e244bd84689a1f29f3aa95f923
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189363
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <stephan.bergmann@collabora.com>
This will allow creating instances of the C++ classes
involved in XML export directly from rpt instead
of going via the UNO service constructors/abstraction
to do so (currently in OReportDefinition::WriteThroughComponent).
Writer also doesn't split the core model and XML export logic
in into separate libraries (see sw/Library_sw.mk).
rpt pch was updated using this command:
./bin/update_pch reportdesign rpt --cutoff=9 --exclude:system --include:module --include:local
Change-Id: I40a0fbe4bb3ef679b2255f891e8a6b67d442fd5b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/187910
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
those were from a time where there was 64bit Windows, but no 64bit
builds of LibreOffice/OpenOffice.org - now the only usecase for 32bit
LibreOffice is to use it on 32bit-only machines…
Change-Id: Icf1eacafd9e157788e8ec5a035716327492f5c2c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185565
Tested-by: Jenkins
Reviewed-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com>
makefile stuff anymore, there's still code that can be removed from the
actual code (partly reverting 8f6b5370be
that added support for using 64bit Internet Explorer with 32bit Office
Change-Id: Id0c59e2ef2f4c87a04f18ea54ed04f4337ea6c73
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185564
Reviewed-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com>
Tested-by: Jenkins
So the vclcanvas backend is in worse shape than I thought. It will
take too long to get it into shape to be sure of making the next
release, so revert this for now, and I will have to find another
approach.
This reverts the following commits
commit fbefe07e4c
Author: Michael Weghorn <m.weghorn@posteo.de>
Date: Thu Feb 20 09:42:14 2025 +0100
qt: Remove now unused vcl/inc/qt6/QtSvpSurface.hxx
commit 595354ab7e
Author: Julien Nabet <serval2412@yahoo.fr>
Date: Wed Feb 19 21:13:49 2025 +0100
Remove also canvas/cairo in gtk4, qt6 and gtk3_kde5
commit d539f6e99e
Author: Noel Grandin <noelgrandin@gmail.com>
Date: Wed Feb 19 18:15:30 2025 +0200
fix "local variable is unused" warning
commit 704f61b1bd
Author: Noel Grandin <noelgrandin@collabora.co.uk>
Date: Wed Jan 29 15:35:21 2025 +0200
remove canvas/cairo and canvas/gdi and canvas/directx backends
Change-Id: I0492dabf7da8c42a15720c868f161919e8dc7ae4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181984
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
These were originally created to better support alpha/transparency
in slideshows, but vcl can do that these days.
Mostly, removing these makes the path to better backends (e.g. GDI+)
in vcl considerably easier.
If regressions are detected, it would be better to improve vcl
to perform better, or render better, since that will both fix
the regression and improve other output from LibreOffice.
Also remove various bits of vcl backend that were only being
used by the canvas stuff.
Change-Id: Ic5276d57e696f3dcbeaed2cc149b8fc09c5816f6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181843
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
There is no point to bundle it, because
1) it is an old version
2) since LibreOffice 7.5 there are built-in number formats in
Calc with the same functionality (using libnumbertext FWIW)
Change-Id: I8cfb24f7e6f045bd51fea620aca6a61269dba77a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180996
Tested-by: Jenkins
Reviewed-by: Andras Timar <andras.timar@collabora.com>
Implement simple Quick Look plugins that generate a preview and/or
thumbnail image using Apple's latest Quick Look APIs. The approach
is to load and render any thumbnail images that may have been
embedded in .od* files when they were last saved.
Fortunately, LibreOffice, OpenOffice, and NeoOffice have been
saving thumbnail images by default in .od* files since at least
the mid-2000s so this approach should work with most unencrypted
.od* files.
Note: the plugins appear to work in unsigned builds using the
following steps to enable them:
1. Install LibreOfficeDev.app from an unsigned .dmg (e.g. nightly
master builds) but the plugins in instdir/LibreOfficeDev.app
in a local build are not usable.
2. Launch LibreOfficeDev.app to register the plugins.
3. Launch the System Preferences application, navigate to the
Login Items & Extensions panel, and in the Extensions section,
click on the icon next to the Quick Look entry to see a list of
installed extensions.
4. If macOS has successfully found and loaded the plugins, there
should be two extensions listed under LibreOfficeDev. If they
are disabled, enable both.
5. Press Command-Option-Escape, select the Finder in the dialog
that appears, and press the Relaunch button.
The Finder should now display the thumbnail images in .od* files.
Change-Id: I094afbc56b684cc85b12ed996e060818bfe8ad46
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178393
Reviewed-by: Patrick Luby <guibomacdev@gmail.com>
Tested-by: Jenkins
Reviewed-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com>
Now that the accessibility module no longer
depends on toolkit and svtools and there's
therefore no more cyclic dependency, merge it
into the vcl library, where the vcl widgets are located,
for which the classes in the accessibility
module (primarily) provide the a11y classes.
Initially, take over the existing UNO service
"com.sun.star.accessibility.comp.GetStandardAccessibleFactoryService"
to vcl as is. It used to be necessary to break the cyclic
dependency between the vcl, svtools, toolkit and
accessibility module. (vcl is the lowest and
accessibility used to be furthest up in the dependency
chain; yet vcl needed it to create the objects
providing the XAccessible/XAccessibleContext
for its widgets.)
Further simplification can happen in upcoming commits.
Change-Id: Ib46c87446dc9121d3b8e735e0e5a40594da73cc5
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178647
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
...not just --enable-dbgutil ones, which gives more flexibility in using that
infrastructure downstream. (The unotest/source/embindtest/embindtest.js code is
still only included in desktop/Executable_soffice_bin.mk for --enable-dbgutil
builds, though.)
Building unotest/source/embindtest/embindtest.cxx also outside of
--enable-dbgutil, and thus implicitly --enable-assert-always-abort, builds
required moving from assert() to some hand-crafted verify().
Change-Id: I3f0fa00feee25b4ea6e7866c22a5b4a4d40cb3d0
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178361
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <stephan.bergmann@allotropia.de>
There is no simple "Windows is 10 or newer" check in MSI, with the
Microsoft policy of "you don't need to know real Windows version".
See also https://developercommunity.visualstudio.com/t/detect-a-windows-version-from-msi/412198
The values that MSI sees (e.g. on my Win11) are:
Property(C): VersionNT = 603
Property(C): VersionNT64 = 603
Property(C): WindowsBuild = 9600
So those can't be used for the check. I use the WINMAJORVER that is
read from registry (Software\Microsoft\Windows NT\CurrentVersion).
There is no more need to check and install UCRT; it was dropped.
Change-Id: Ic02d6aeb965e9684bafd4357f969980f77000e73
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178049
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
The "minweld" is a minimal standalone vcl application that uses the
LibreOffice vcl weld framework to display the "tip of the day" dialog on
the screen. Upon clicking on the "Next Tip", a counter is incremented
and the text label containing its value is displayed/updated in the
center of the dialog box.
One can run the application by invoking:
./bin/run minweld
This example uses cui/ui/tipofthedaydialog.ui for the UI, but only uses
a few elements of it.
Change-Id: If304c60ddb262182cf23438ed1f83dba85e66391
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176610
Reviewed-by: Hossein <hossein@libreoffice.org>
Tested-by: Jenkins
Formats like Aportisdoc can be opened via
org.libreoffice.comp.Writer.EBookImportFilter instead.
It doesn't look like there will be any support implemented for Nokia
9210 Communicator PsiWord. No particular burning demand for that
anymore apparently.
Removal of the filters that used xmerge took place at:
commit a5783fe922
CommitDate: Sun Mar 3 19:19:26 2013 +0100
remove stale javafilters
Change-Id: I0a0087fb2ee015de42c1802b5e9bc6dc42a5efe1
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/174563
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Jenkins
This patch includes all marshalling and proxy handling code on the
.NET side as well as the native side needed for a fully functional
UNO bridge.
It also includes some changes and corrections to net_basetypes and
netmaker needed for the bridge to work properly.
It also includes the FirstUnoContact example in C# as demonstration.
Change-Id: I406932938a4415d24408fb41ddfa7d8eeb5d1f94
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170916
Tested-by: Jenkins
Reviewed-by: Hossein <hossein@libreoffice.org>
This patch includes:
1. CustomTarget to build and place the LibreOffice.Bindings NuGet
package in <sdk>/dotnet/
2. net_bridge (.NET library) to declare bootstrap() on the C# side,
and net_bootstrap (C++ library) to wrap bootstrap() on the native side
3. Changes to LO SDK scripts to find .NET SDK and DOTNET_ROOT on the
users machine
Change-Id: Ia29ae56a2ad0f808f1563ef6167a3bd7c476642e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170172
Tested-by: Jenkins
Reviewed-by: Hossein <hossein@libreoffice.org>
to enabling bundling or not bundling the docrepair fonts of
https://github.com/docrepair-fonts
(which provide replacments for: Agency FB, Baskerville Old Face,
Berlin Sans FB, Cooper Black, Lucida Calligraphy, Lucida Grande,
Lucida Handwriting)
Change-Id: I4ea442fa54d21f213ccbdccba9aea1b9c0675c90
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172337
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
...that had been added with f90c68316c "WASM: add
Emscripten demo application". Whatever the original intention, it has probably
served its purpose by now---and now only negatively impacts (re-)build times.
Change-Id: I2bda8d12b91e741c4d0f7d3f02597e0e9505a73a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172087
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <stephan.bergmann@allotropia.de>
This commit adds Package targets for the net_basetypes, net_uretypes
and net_oootypes libraries to install them into instdir/program/dotnet.
Also adds a LIBO_SHARE_DOTNET_FOLDER variable mirroring the
LIBO_SHARE_JAVA_FOLDER variable.
Change-Id: I28cdb2dac799bd72d11c3e550bba1a946db8b49c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170098
Tested-by: Jenkins
Reviewed-by: Hossein <hossein@libreoffice.org>
This commit adds an --enable-cli/--disable-cli switch to autoconf to
control generation of the old CLI bindings (Windows only). It is
enabled by default, to not be a breaking change to users just yet.
Over time, when the old bindings are deprecated in favor of the new
.NET bindings, it could be set to disabled by default.
Change-Id: Ib60b372459cb0c735275ed17d004d037279357eb
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168751
Tested-by: Jenkins
Reviewed-by: Hossein <hossein@libreoffice.org>
This commit adds the netmaker executable to the codemaker/ module, to
generate C# code from UNOIDL specifications.
Also adds some Makefiles in the net_ure/ directory to generate code for
udkapi and offapi, to build the net_uretypes and net_oootypes assemblies.
Change-Id: Ifb61fe6a0f8f594eaa6ff95b025ba57f247b0d4b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168710
Tested-by: Jenkins
Tested-by: Hossein <hossein@libreoffice.org>
Reviewed-by: Hossein <hossein@libreoffice.org>
Similar to the way that GTK 4's native facilities for
video playback are used for the gtk4 VCL plugin, initially
added in commit
commit d0a527ec09
Author: Caolán McNamara <caolanm@redhat.com>
Date: Thu Feb 10 12:55:18 2022 +0000
first cut at using Gtk4 built in video playback
, implement media playback using QtMultimedia for the
Qt 6 based VCL plugins (qt6/kf6) via a new service
"com.sun.star.comp.avmedia.Manager_Qt".
Video playback with the mechanism used for qt5 no
longer works with qt6, as "qwidget5videosink"
that gets used on Wayland for qt5 wasn't ported
to Qt 6 and is unmaintained, s. the commit message of
commit 88d57cf241
Author: Michael Weghorn <m.weghorn@posteo.de>
Date: Wed Sep 29 11:09:51 2021 +0200
qt6: Add a qt6 VCL plugin
for more details. Additionally, this also doesn't work
properly any more on X11/with the xcb Qt QPA platform, see
tdf#145735 comment 7.
Instead of using GStreamer directly, let Qt handle
the low-level stuff by using the QtMultimedia module [1]
instead.
This adds a new dependency on QtMultimedia.
For building, this requires installing the Qt 6 QtMultimedia
development headers (e.g. package `qt6-multimedia-dev`
on current Debian testing).
Except for WASM, the use of QtMultimedia is enabled by
default when building with autogen options `--enable-qt6`
or `--enable-kf6`, but can explicitly be disabled using
`--disable-qt6-multimedia`.
In tests with the qt6 VCL plugin on Debian testing, with a
sample presentation containing an embedded
video, attachment 145517 from tdf#120452, video playback
generally works for both, the xcb and the wayland
Qt QPA platforms:
* Video and audio are played as expected on the external
screen in presentation mode when using the presenter
console
* Video and audio playback work in non-presentation
mode by clicking on the video and using the controls
in the Impress sidebar (play, pause,...).
However, the following issues were observed with
the current implementation:
* There's an odd frame/margin around the video.
* In non-presentation mode, the placeholder
shown until the video gets started using the controls
in the sidebar is just an "audio icon", not a frame
from the actual video. (This might be related to the
fact that `QtPlayer::createFrameGrabber` currently
returns an empty reference.)
* At least on Wayland (issue not observed with
QT_QPA_PLATFORM=xcb so far), when using the presenter
console, video playback in the presenter console (i.e. on the
non-presentation screen) is unreliable: The video
sometimes shows, but sometimes doesn't. At least the
(more important) one on the presentation screen was
reliably shown in my tests, however.
Tested with git dev versions of qtbase
(as of commit 8d5e7d50d8dbf1ad79bd8ff9f6ef6028eba481c9),
qtwayland (as of commit 6f0ebd916f176f6fbe35af28caeb52b62768ac94)
and qtmultimedia (as of commit
264b7e8d7d5683252102b5e5149685c8b8a70c2d).
[1] https://doc.qt.io/qt-6/qtmultimedia-index.html
Change-Id: I29c3c7ded01c61b49b192fa5c313d8a92c942185
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167869
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
Tested-by: Jenkins
...by making the general UNO -> C++ function call case work (modulo handling
exceptions, which I'll look into later).
Wasm call_indirect unfortunately needs to statically know the call target's
signature, so we statically need to know all possible signatures. So introduce
wasmcallgen helper to scan the existing UNOIDL API upfront and generate the
relevant callvirtualfunction-wrapper.cxx and callvirtualfunction-inst.s code.
(The good thing is that the number of different signatures is somewhat limited,
each parameter can only be one of i32, i64, f32, or f64. So even if 3rd-party
extensions bring along new UNOIDL interface methods, chances are relatively high
that the signatures needed for them would already be covered by the existing
ones.)
Testing this can nicely be done in unotest/source/embindtest/embindtest.js via
css.script.Invocation (which internally exercises the relevant code). (Instead
of adding individual org.libreoffice.embindtest.StructLong/String etc., it would
be nicer to introduce some polymorphic StructOne<T>, but the Emind UNO binding
does not support polymorphic structs, so the embindtest.js code would not work.)
Change-Id: If829c9e3772bfd27561f3ad743d38a71d11545b6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167308
Reviewed-by: Stephan Bergmann <stephan.bergmann@allotropia.de>
Tested-by: Jenkins
Previously, the CJK BreakIterator used custom dictionaries for Chinese
and Japanese. This change removes these custom dictionaries in favor of
the upstream ICU implementation, which uses an externally-maintained
frequency dictionary for these languages.
This change also removes support code for dictionary-based break
iterators, as it is no longer used.
Change-Id: I55c4ce9c842d1751997309fd7446e0a6917915dc
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166136
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Jenkins
Tested-by: Caolán McNamara <caolan.mcnamara@collabora.com>
This patch adds a new Python helper script to generate Addons.xcu for
LibreOffice extensions. The script works like a wizard, and asks user
about the needed details. It provides these options for the application
module context:
1. Writer
2. Spreadsheet
3. Presentation
4. Draw
5. Formula
6. Chart
7. Bibliography
After selection of the module, appropriate Addons.xcu is generated, and
user is asked to choose between 'desktop' or a custom folder to save the
resulting file.
Change-Id: I22a878f0bde19a870674a357d7085ad3c12fc50c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163382
Tested-by: Jenkins
Reviewed-by: Hossein <hossein@libreoffice.org>