# Understanding Transitional VCL Lifecycle ## How it used to look All VCL classes were explicitly lifecycle managed; so you would do: ``` Dialog aDialog(...); // old - on stack allocation aDialog.Execute(...); ``` or: ``` Dialog *pDialog = new Dialog(...); // old - manual heap allocation pDialog->Execute(...); delete pDialog; ``` or: ``` std::shared_ptr<Dialog> xDialog(new pDialog()); // old xDialog->Execute(...); // depending who shared the ptr this would be freed sometime ``` In several cases this lead to rather unpleasant code, when various `shared_ptr` wrappers were used, the lifecycle was far less than obvious. Where controls were wrapped by other ref-counted classes - such as UNO interfaces, which were also used by native Window pointers, the lifecycle became extremely opaque. In addition VCL had significant issues with re-enterancy and event emission - adding various means such as DogTags to try to detect destruction of a window between calls: ``` ImplDelData aDogTag( this ); // 'orrible old code Show( true, ShowFlags::NoActivate ); if( !aDogTag.IsDead() ) // did 'this' go invalid yet ? Update(); ``` Unfortunately use of such protection is/was ad-hoc, and far from uniform, despite the prevalence of such potential problems. When a lifecycle problem was hit, typically it would take the form of accessing memory that had been freed, and contained garbage due to lingering pointers to freed objects. ## Where we are now To fix this situation we now have a `VclPtr` - which is a smart reference-counting pointer (`include/vcl/vclptr.hxx`) which is designed to look and behave -very- much like a normal pointer to reduce code-thrash. `VclPtr` is used to wrap all `OutputDevice` derived classes thus: ``` VclPtr<Dialog> pDialog( new Dialog( ... ), SAL_NO_ACQUIRE ); ... pDialog.disposeAndClear(); ``` However - while the `VclPtr` reference count controls the lifecycle of the Dialog object, it is necessary to be able to break reference count cycles. These are extremely common in widget hierarchies as each widget holds (smart) pointers to its parents and also its children. Thus - all previous `delete` calls are replaced with `dispose` method calls: ## What is dispose ? Dispose is defined to be a method that releases all references that an object holds - thus allowing their underlying resources to be released. However - in this specific case it also releases all backing graphical resources. In practical terms, all destructor functionality has been moved into `dispose` methods, in order to provide a minimal initial behavioral change. As such a `VclPtr` can have three states: ``` VclPtr<PushButton> pButton; ... assert (pButton == nullptr || !pButton); // null assert (pButton && !pButton->isDisposed()); // alive assert (pButton && pButton->isDisposed()); // disposed ``` ## `ScopedVclPtr` - making disposes easier While replacing existing code with new, it can be a bit tiresome to have to manually add `disposeAndClear()` calls to `VclPtr<>` instances. Luckily it is easy to avoid that with a `ScopedVclPtr` which does this for you when it goes out of scope. ## One extra gotcha - an initial reference-count of 1 In the normal world of love and sanity, eg. creating UNO objects, the objects start with a ref-count of zero. Thus the first reference is always taken after construction by the surrounding smart pointer. Unfortunately, the existing VCL code is somewhat tortured, and does a lot of reference and de-reference action on the class -during- construction. This forces us to construct with a reference of 1 - and to hand that into the initial smart pointer with a `SAL_NO_ACQUIRE`. To make this easier, we have `Instance` template wrappers that make this apparently easier, by constructing the pointer for you. ### How does my familiar code change ? Lets tweak the exemplary code above to fit the new model: ``` - Dialog aDialog(... dialog params ... ); - aDialog.Execute(...); + ScopedVclPtrInstance<Dialog> pDialog(... dialog params ... ); + pDialog->Execute(...); // VclPtr behaves much like a pointer ``` or: ``` - Dialog *pDialog = new Dialog(... dialog params ...); + VclPtrInstance<Dialog> pDialog(... dialog params ...); pDialog->Execute(...); - delete pDialog; + pDialog.disposeAndClear(); // done manually - replaces a delete ``` or: ``` - std::shared_ptr<Dialog> xDialog(new Dialog(...)); + ScopedVclPtrInstance<Dialog> xDialog(...); xDialog->Execute(...); + // depending how shared_ptr was shared perhaps + // someone else gets a VclPtr to xDialog ``` or: ``` - VirtualDevice aDev; + ScopedVclPtrInstance<VirtualDevice> pDev; ``` Other things that are changed are these: ``` - pButton = new PushButton(NULL); + pButton = VclPtr<PushButton>::Create(nullptr); ... - vcl::Window *pWindow = new PushButton(NULL); + VclPtr<vcl::Window> pWindow; + pWindow.reset(VclPtr<PushButton>::Create(nullptr)); ``` ### Why are these `disposeOnce` calls in destructors? This is an interim measure while we are migrating, such that it is possible to delete an object conventionally and ensure that its dispose method gets called. In the 'end' we would instead assert that a Window has been disposed in its destructor, and elide these calls. As the object's vtable is altered as we go down the destruction process, and we want to call the correct dispose methods we need this `disposeOnce();` call for the interim in every destructor. This is enforced by a clang plugin. The plus side of disposeOnce is that the mechanics behind it ensure that a `dispose()` method is only called a single time, simplifying their implementation. ### Who owns & disposes what? Window sub-classes tend to create their widgets in one of two ways and often both. 1. Derive from `VclBuilderContainer`. The `VclBuilder` then owns many of the sub-windows, which are fetched by a `get` method into local variables often in constructors eg. ``` VclPtr<PushButton> mpButton; // in the class , get(mpButton, "buttonName") // in the constructor mpButton.clear(); // in dispose. ``` We only clear, not `disposeAndClear()` in our dispose method for this case, since the `VclBuilder` / Container truly owns this Window, and needs to dispose its hierarchy in the right order - first children then parents. 2. Explicitly allocated Windows. These are often created and managed by custom widgets: ``` VclPtr<ComplexWidget> mpComplex; // in the class , mpComplex( VclPtr<ComplexWidget>::Create( this ) ) // constructor mpComplex.disposeAndClear(); // in dispose ``` ie. an owner has to dispose things they explicitly allocate. In order to ensure that the VclBuilderConstructor sub-classes have their Windows disposed at the correct time there is a `disposeBuilder();` method - that should be added -only- to the class immediately deriving from `VclBuilderContainer`'s dispose. ### What remains to be done? * Expand the `VclPtr` pattern to many other less than safe VCL types. * create factory functions for `VclPtr<>` types and privatize their constructors. * Pass `const VclPtr<> &` instead of pointers everywhere + add `explicit` keywords to VclPtr constructors to accelerate compilation etc. * Cleanup common existing methods such that they continue to work post-dispose. * Dispose functions should be audited to: + not leave dangling pointsr + shrink them - some work should incrementally migrate back to destructors. * `VclBuilder` + ideally should keep a reference to pointers assigned in `get()` calls - to avoid needing explicit `clear` code in destructors. ## FAQ / debugging hints ### Compile with dbgutil This is by far the best way to turn on debugging and assertions that help you find problems. In particular there are a few that are really helpful: ``` vcl/source/window/window.cxx (Window::dispose) "Window ( N4sfx27sidebar20SidebarDockingWindowE (Properties)) ^^^ class name window title ^^^ with live children destroyed: N4sfx27sidebar6TabBarE () N4sfx27sidebar4DeckE () 10FixedImage ()" ``` You can de-mangle these names if you can't read them thus: ``` $ c++filt -t N4sfx27sidebar20SidebarDockingWindowE sfx2::sidebar::SidebarDockingWindow ``` In the above case - it is clear that the children have not been disposed before their parents. As an aside, having a dispose chain separate from destructors allows us to emit real type names for parents here. To fix this, we will need to get the dispose ordering right, occasionally in the conversion we re-ordered destruction, or omitted a `disposeAndClear()` in a `::dispose()` method. - If you see this, check the order of `disposeAndClear()` in the `sfx2::Sidebar::SidebarDockingWindow::dispose()` method - also worth `git grep`ing for `new sfx::sidebar::TabBar` to see where those children were added. ### Check what it used to do While a ton of effort has been put into ensuring that the new lifecycle code is the functional equivalent of the old code, the code was created by humans. If you identify an area where something asserts or crashes here are a few helpful heuristics: * Read the `git log -u -- path/to/file.cxx` ### Is the order of destruction different? In the past many things were destructed (in reverse order of declaration in the class) without explicit code. Some of these may be important to do explicitly at the end of the destructor. eg. having a `Idle` or `Timer` as a member, may now need an explicit `.Stop()` and/or protection from running on a disposed Window in its callback. ### Is it `clear` not `disposeAndClear`? sometimes we get this wrong. If the code previously used to use `delete pFoo;` it should now read `pFoo->disposeAndClear();`. Conversely if it didn't delete it, it should be `clear()` it is by far the best to leave disposing to the `VclBuilder` where possible. In simple cases, if we allocate the widget with `VclPtrInstance` or `VclPtr<Foo>::Create` - then we need to `disposeAndClear` it too. ### Event / focus / notification ordering In the old world, a large amount of work was done in the `~Window` destructor that is now done in `Window::dispose`. Since those Windows were in the process of being destroyed themselves, their vtables were adjusted to only invoke Window methods. In the new world, sub-classed methods such as `PreNotify`, `GetFocus`, `LoseFocus` and others are invoked all down the inheritance chain from children to parent, during dispose. The easiest way to fix these is to just ensure that these cleanup methods, especially LoseFocus, continue to work even on disposed Window sub-class instances. ### It crashes with some invalid memory... Assuming that the invalid memory is a Window sub-class itself, then almost certainly there is some cockup in the reference-counting; eg. if you hit an `OutputDevice::release` assert on `mnRefCount` - then almost certainly you have a Window that has already been destroyed. This can easily happen via this sort of pattern: ``` Dialog *pDlg = VclPtr<Dialog>(nullptr /* parent */); // by here the pDlg quite probably points to free'd memory... ``` It is necessary in these cases to ensure that the `*pDlg` is a `VclPtr<Dialog>` instead. ### It crashes with some invalid memory #2... Often a `::dispose` method will free some `pImpl` member, but not `NULL` it; and (cf. above) we can now get various `virtual` methods called post-dispose; so: a) `delete pImpl; pImpl = NULL; // in the destructor` b) `if (pImpl && ...) // in the subsequently called method` /calctiledrendering2'>feature/calctiledrendering2</option> <option value='feature/calctiledrendering3'>feature/calctiledrendering3</option> <option value='feature/calctiledrendering4'>feature/calctiledrendering4</option> <option value='feature/calctiledrendering5'>feature/calctiledrendering5</option> <option value='feature/calctiledrendering_alt'>feature/calctiledrendering_alt</option> <option value='feature/calctiledrendering_attempt3'>feature/calctiledrendering_attempt3</option> <option value='feature/calctiledrendering_attempt3_2'>feature/calctiledrendering_attempt3_2</option> <option value='feature/calczoom'>feature/calczoom</option> <option value='feature/chained-text-boxes'>feature/chained-text-boxes</option> <option value='feature/change-tracking'>feature/change-tracking</option> <option value='feature/chart-style-experiment-markus'>feature/chart-style-experiment-markus</option> <option value='feature/chartdatatable'>feature/chartdatatable</option> <option value='feature/cib_contract101'>feature/cib_contract101</option> <option value='feature/cib_contract116'>feature/cib_contract116</option> <option value='feature/cib_contract136'>feature/cib_contract136</option> <option value='feature/cib_contract138'>feature/cib_contract138</option> <option value='feature/cib_contract138b'>feature/cib_contract138b</option> <option value='feature/cib_contract138c'>feature/cib_contract138c</option> <option value='feature/cib_contract138d'>feature/cib_contract138d</option> <option value='feature/cib_contract138e'>feature/cib_contract138e</option> <option value='feature/cib_contract139'>feature/cib_contract139</option> <option value='feature/cib_contract152'>feature/cib_contract152</option> <option value='feature/cib_contract152b'>feature/cib_contract152b</option> <option value='feature/cib_contract3197'>feature/cib_contract3197</option> <option value='feature/cib_contract3753'>feature/cib_contract3753</option> <option value='feature/cib_contract3756'>feature/cib_contract3756</option> <option value='feature/cib_contract3756b'>feature/cib_contract3756b</option> <option value='feature/cib_contract4236'>feature/cib_contract4236</option> <option value='feature/cib_contract4236b'>feature/cib_contract4236b</option> <option value='feature/cib_contract49'>feature/cib_contract49</option> <option value='feature/cib_contract49b'>feature/cib_contract49b</option> <option value='feature/cib_contract49c'>feature/cib_contract49c</option> <option value='feature/cib_contract49d'>feature/cib_contract49d</option> <option value='feature/cib_contract561'>feature/cib_contract561</option> <option value='feature/cib_contract57'>feature/cib_contract57</option> <option value='feature/cib_contract57b'>feature/cib_contract57b</option> <option value='feature/cib_contract57c'>feature/cib_contract57c</option> <option value='feature/cib_contract57d'>feature/cib_contract57d</option> <option value='feature/cib_contract57d+hotfix'>feature/cib_contract57d+hotfix</option> <option value='feature/cib_contract57d_p1'>feature/cib_contract57d_p1</option> <option value='feature/cib_contract57e'>feature/cib_contract57e</option> <option value='feature/cib_contract57l'>feature/cib_contract57l</option> <option value='feature/cib_contract6721b'>feature/cib_contract6721b</option> <option value='feature/cib_contract6721c'>feature/cib_contract6721c</option> <option value='feature/cib_contract7409'>feature/cib_contract7409</option> <option value='feature/cib_contract8161'>feature/cib_contract8161</option> <option value='feature/cib_contract891'>feature/cib_contract891</option> <option value='feature/cib_contract891b'>feature/cib_contract891b</option> <option value='feature/cib_contract891c'>feature/cib_contract891c</option> <option value='feature/cib_contract891d'>feature/cib_contract891d</option> <option value='feature/cib_contract935'>feature/cib_contract935</option> <option value='feature/cib_contract935b'>feature/cib_contract935b</option> <option value='feature/clipboard'>feature/clipboard</option> <option value='feature/cmis'>feature/cmis</option> <option value='feature/components'>feature/components</option> <option value='feature/controlstate'>feature/controlstate</option> <option value='feature/coretext'>feature/coretext</option> <option value='feature/coverrest-featuretests'>feature/coverrest-featuretests</option> <option value='feature/cp-5.0-cairo-svp'>feature/cp-5.0-cairo-svp</option> <option value='feature/cpu_intrinsics_support'>feature/cpu_intrinsics_support</option> <option value='feature/custom-widgets'>feature/custom-widgets</option> <option value='feature/dataprovider'>feature/dataprovider</option> <option value='feature/debugevent'>feature/debugevent</option> <option value='feature/dematurize01'>feature/dematurize01</option> <option value='feature/dialog-screenshots'>feature/dialog-screenshots</option> <option value='feature/docking_windows'>feature/docking_windows</option> <option value='feature/docx-commentsex'>feature/docx-commentsex</option> <option value='feature/drawinglayercore'>feature/drawinglayercore</option> <option value='feature/drawinglayercore2'>feature/drawinglayercore2</option> <option value='feature/droid_calcimpress3'>feature/droid_calcimpress3</option> <option value='feature/droid_calimpress4'>feature/droid_calimpress4</option> <option value='feature/drop-findcmap'>feature/drop-findcmap</option> <option value='feature/editviewoverlay'>feature/editviewoverlay</option> <option value='feature/eszka'>feature/eszka</option> <option value='feature/extended-tooltips'>feature/extended-tooltips</option> <option value='feature/external-data-ui'>feature/external-data-ui</option> <option value='feature/fastparser'>feature/fastparser</option> <option value='feature/firebird-sdbc'>feature/firebird-sdbc</option> <option value='feature/firebird-sdbc2'>feature/firebird-sdbc2</option> <option value='feature/firebird-sdbc3'>feature/firebird-sdbc3</option> <option value='feature/fixstyles3'>feature/fixstyles3</option> <option value='feature/fontsubtitutions'>feature/fontsubtitutions</option> <option value='feature/foo'>feature/foo</option> <option value='feature/gbuild_cli'>feature/gbuild_cli</option> <option value='feature/gccwrapper'>feature/gccwrapper</option> <option value='feature/glyphy'>feature/glyphy</option> <option value='feature/go2'>feature/go2</option> <option value='feature/gpg4libre'>feature/gpg4libre</option> <option value='feature/gpg4libre-5-4'>feature/gpg4libre-5-4</option> <option value='feature/gpg4libre-6-0'>feature/gpg4libre-6-0</option> <option value='feature/gpg4libre2'>feature/gpg4libre2</option> <option value='feature/graphicobject'>feature/graphicobject</option> <option value='feature/gsoc-basic-ide-completion-and-other-bits'>feature/gsoc-basic-ide-completion-and-other-bits</option> <option value='feature/gsoc-calc-enhanced-db-range'>feature/gsoc-calc-enhanced-db-range</option> <option value='feature/gsoc-svm-writer'>feature/gsoc-svm-writer</option> <option value='feature/gsoc-uitest-2019'>feature/gsoc-uitest-2019</option> <option value='feature/gsoc14-colors'>feature/gsoc14-colors</option> <option value='feature/gsoc14-draw-chained-text-boxes'>feature/gsoc14-draw-chained-text-boxes</option> <option value='feature/gsoc14-draw-text-background-color'>feature/gsoc14-draw-text-background-color</option> <option value='feature/gsoc14-libcmis'>feature/gsoc14-libcmis</option> <option value='feature/gsoc14-libcmis2'>feature/gsoc14-libcmis2</option> <option value='feature/gsoc14-personas'>feature/gsoc14-personas</option> <option value='feature/gsoc14-personas2'>feature/gsoc14-personas2</option> <option value='feature/gsoc15-online-update'>feature/gsoc15-online-update</option> <option value='feature/gsoc15-open-remote-files-dialog'>feature/gsoc15-open-remote-files-dialog</option> <option value='feature/gsoc17-revamp-customize-dialog'>feature/gsoc17-revamp-customize-dialog</option> <option value='feature/gsoc19-chart-style'>feature/gsoc19-chart-style</option> <option value='feature/gsoc2011_wizards'>feature/gsoc2011_wizards</option> <option value='feature/gsoc24-lua'>feature/gsoc24-lua</option> <option value='feature/gtk3_kde5'>feature/gtk3_kde5</option> <option value='feature/gtk3nativedialogs'>feature/gtk3nativedialogs</option> <option value='feature/gtktiledviewer'>feature/gtktiledviewer</option> <option value='feature/ia2'>feature/ia2</option> <option value='feature/ia2.2'>feature/ia2.2</option> <option value='feature/ia2.3'>feature/ia2.3</option> <option value='feature/ia2.4'>feature/ia2.4</option> <option value='feature/ia2.5'>feature/ia2.5</option> <option value='feature/improvexlsximport'>feature/improvexlsximport</option> <option value='feature/instdirlinktargets'>feature/instdirlinktargets</option> <option value='feature/item_refactor2'>feature/item_refactor2</option> <option value='feature/jsdialogs'>feature/jsdialogs</option> <option value='feature/jssidebar'>feature/jssidebar</option> <option value='feature/lfrb-vcl-opengl'>feature/lfrb-vcl-opengl</option> <option value='feature/libffi'>feature/libffi</option> <option value='feature/lok-calc-rtl'>feature/lok-calc-rtl</option> <option value='feature/lok-clipboard'>feature/lok-clipboard</option> <option value='feature/lok_cellcursor'>feature/lok_cellcursor</option> <option value='feature/lok_dialog'>feature/lok_dialog</option> <option value='feature/lok_dialog-backport'>feature/lok_dialog-backport</option> <option value='feature/lok_dialog2'>feature/lok_dialog2</option> <option value='feature/lok_sofficemain'>feature/lok_sofficemain</option> <option value='feature/lok_sofficemain2'>feature/lok_sofficemain2</option> <option value='feature/mac-opengl-fixes'>feature/mac-opengl-fixes</option> <option value='feature/macOS-weld'>feature/macOS-weld</option> <option value='feature/mailmerge-toolbar'>feature/mailmerge-toolbar</option> <option value='feature/mar-updater'>feature/mar-updater</option> <option value='feature/mariadb'>feature/mariadb</option> <option value='feature/misc-vba-rework'>feature/misc-vba-rework</option> <option value='feature/mork'>feature/mork</option> <option value='feature/nativealpha'>feature/nativealpha</option> <option value='feature/notebookbar'>feature/notebookbar</option> <option value='feature/notes-refactoring'>feature/notes-refactoring</option> <option value='feature/ooxml-analyze'>feature/ooxml-analyze</option> <option value='feature/opengl-canvas-rework'>feature/opengl-canvas-rework</option> <option value='feature/opengl-transitions-rework'>feature/opengl-transitions-rework</option> <option value='feature/opengl-vcl-text'>feature/opengl-vcl-text</option> <option value='feature/orcus-continuous-integration'>feature/orcus-continuous-integration</option> <option value='feature/orcus-odf'>feature/orcus-odf</option> <option value='feature/orcus-odf-rebased'>feature/orcus-odf-rebased</option> <option value='feature/orcus-odf-rebased2'>feature/orcus-odf-rebased2</option> <option value='feature/orcus-rebased'>feature/orcus-rebased</option> <option value='feature/owncloud-provider-for-android'>feature/owncloud-provider-for-android</option> <option value='feature/pdfium-master'>feature/pdfium-master</option> <option value='feature/perfwork4'>feature/perfwork4</option> <option value='feature/perfwork5'>feature/perfwork5</option> <option value='feature/pivotcharts'>feature/pivotcharts</option> <option value='feature/print_revamp'>feature/print_revamp</option> <option value='feature/priorities'>feature/priorities</option> <option value='feature/profilesafemode'>feature/profilesafemode</option> <option value='feature/propose-master-cib'>feature/propose-master-cib</option> <option value='feature/pytable'>feature/pytable</option> <option value='feature/pyweb-wizard'>feature/pyweb-wizard</option> <option value='feature/qt5-win+mac'>feature/qt5-win+mac</option> <option value='feature/refactor-god-objects'>feature/refactor-god-objects</option> <option value='feature/rendercontext'>feature/rendercontext</option> <option value='feature/resolve-comments'>feature/resolve-comments</option> <option value='feature/scaling-geometry-provider'>feature/scaling-geometry-provider</option> <option value='feature/screenshotannotation'>feature/screenshotannotation</option> <option value='feature/sgexperiment'>feature/sgexperiment</option> <option value='feature/skia'>feature/skia</option> <option value='feature/slidehack'>feature/slidehack</option> <option value='feature/slidehack2'>feature/slidehack2</option> <option value='feature/slideshow_onlySprites'>feature/slideshow_onlySprites</option> <option value='feature/slideshowprimitives'>feature/slideshowprimitives</option> <option value='feature/sparklines'>feature/sparklines</option> <option value='feature/spellig_popup_SID'>feature/spellig_popup_SID</option> <option value='feature/stub_writer'>feature/stub_writer</option> <option value='feature/svg-export'>feature/svg-export</option> <option value='feature/svg-optimisations'>feature/svg-optimisations</option> <option value='feature/svg-optimisations-5-0'>feature/svg-optimisations-5-0</option> <option value='feature/sw-delete-undo-rework'>feature/sw-delete-undo-rework</option> <option value='feature/sw_redlinehide_4a_for_libreoffice-6-2'>feature/sw_redlinehide_4a_for_libreoffice-6-2</option> <option value='feature/sw_redlinehide_4b_for_libreoffice-6-2'>feature/sw_redlinehide_4b_for_libreoffice-6-2</option> <option value='feature/table-style'>feature/table-style</option> <option value='feature/table-style-rebased'>feature/table-style-rebased</option> <option value='feature/table_panel'>feature/table_panel</option> <option value='feature/table_rotated_text'>feature/table_rotated_text</option> <option value='feature/taggedPDF'>feature/taggedPDF</option> <option value='feature/template_manager_improvements'>feature/template_manager_improvements</option> <option value='feature/template_manager_improvements2'>feature/template_manager_improvements2</option> <option value='feature/themesupport'>feature/themesupport</option> <option value='feature/themesupport2'>feature/themesupport2</option> <option value='feature/tiled-editing'>feature/tiled-editing</option> <option value='feature/tscp3'>feature/tscp3</option> <option value='feature/unitver'>feature/unitver</option> <option value='feature/unocrsrptr'>feature/unocrsrptr</option> <option value='feature/unostyles'>feature/unostyles</option> <option value='feature/unostyles2'>feature/unostyles2</option> <option value='feature/unostyles3'>feature/unostyles3</option> <option value='feature/use-ogl-context-in-canvas'>feature/use-ogl-context-in-canvas</option> <option value='feature/vcl-opengl'>feature/vcl-opengl</option> <option value='feature/vcl-opengl-integration'>feature/vcl-opengl-integration</option> <option value='feature/vcl-opengl2'>feature/vcl-opengl2</option> <option value='feature/vclptr'>feature/vclptr</option> <option value='feature/vlc'>feature/vlc</option> <option value='feature/vlc-rb'>feature/vlc-rb</option> <option value='feature/vs2012'>feature/vs2012</option> <option value='feature/wasm'>feature/wasm</option> <option value='feature/window-iter'>feature/window-iter</option> <option value='feature/windows-cross-build'>feature/windows-cross-build</option> <option value='feature/windowsupdater'>feature/windowsupdater</option> <option value='feature/xtiledrenderable'>feature/xtiledrenderable</option> <option value='feature/yrs-demo'>feature/yrs-demo</option> <option value='libreoffice-24-2'>libreoffice-24-2</option> <option value='libreoffice-24-2-0'>libreoffice-24-2-0</option> <option value='libreoffice-24-2-1'>libreoffice-24-2-1</option> <option value='libreoffice-24-2-2'>libreoffice-24-2-2</option> <option value='libreoffice-24-2-3'>libreoffice-24-2-3</option> <option value='libreoffice-24-2-4'>libreoffice-24-2-4</option> <option value='libreoffice-24-2-5'>libreoffice-24-2-5</option> <option value='libreoffice-24-2-6'>libreoffice-24-2-6</option> <option value='libreoffice-24-2-7'>libreoffice-24-2-7</option> <option value='libreoffice-24-8'>libreoffice-24-8</option> <option value='libreoffice-24-8-0'>libreoffice-24-8-0</option> <option value='libreoffice-24-8-1'>libreoffice-24-8-1</option> <option value='libreoffice-24-8-2'>libreoffice-24-8-2</option> <option value='libreoffice-24-8-3'>libreoffice-24-8-3</option> <option value='libreoffice-24-8-4'>libreoffice-24-8-4</option> <option value='libreoffice-24-8-5'>libreoffice-24-8-5</option> <option value='libreoffice-25-2' selected='selected'>libreoffice-25-2</option> <option value='libreoffice-25-2-0'>libreoffice-25-2-0</option> <option value='libreoffice-25-2-1'>libreoffice-25-2-1</option> <option value='libreoffice-3-5'>libreoffice-3-5</option> <option value='libreoffice-3-5-0'>libreoffice-3-5-0</option> <option value='libreoffice-3-5-1'>libreoffice-3-5-1</option> <option value='libreoffice-3-5-2'>libreoffice-3-5-2</option> <option value='libreoffice-3-5-3'>libreoffice-3-5-3</option> <option value='libreoffice-3-5-4'>libreoffice-3-5-4</option> <option value='libreoffice-3-5-5'>libreoffice-3-5-5</option> <option value='libreoffice-3-5-6'>libreoffice-3-5-6</option> <option value='libreoffice-3-5-7'>libreoffice-3-5-7</option> <option value='libreoffice-3-6'>libreoffice-3-6</option> <option value='libreoffice-3-6-0'>libreoffice-3-6-0</option> <option value='libreoffice-3-6-1'>libreoffice-3-6-1</option> <option value='libreoffice-3-6-2'>libreoffice-3-6-2</option> <option value='libreoffice-3-6-3'>libreoffice-3-6-3</option> <option value='libreoffice-3-6-4'>libreoffice-3-6-4</option> <option value='libreoffice-3-6-5'>libreoffice-3-6-5</option> <option value='libreoffice-3-6-6'>libreoffice-3-6-6</option> <option value='libreoffice-3-6-7'>libreoffice-3-6-7</option> <option value='libreoffice-4-0'>libreoffice-4-0</option> <option value='libreoffice-4-0-0'>libreoffice-4-0-0</option> <option value='libreoffice-4-0-1'>libreoffice-4-0-1</option> <option value='libreoffice-4-0-2'>libreoffice-4-0-2</option> <option value='libreoffice-4-0-3'>libreoffice-4-0-3</option> <option value='libreoffice-4-0-4'>libreoffice-4-0-4</option> <option value='libreoffice-4-0-5'>libreoffice-4-0-5</option> <option value='libreoffice-4-0-6'>libreoffice-4-0-6</option> <option value='libreoffice-4-1'>libreoffice-4-1</option> <option value='libreoffice-4-1-0'>libreoffice-4-1-0</option> <option value='libreoffice-4-1-1'>libreoffice-4-1-1</option> <option value='libreoffice-4-1-2'>libreoffice-4-1-2</option> <option value='libreoffice-4-1-3'>libreoffice-4-1-3</option> <option value='libreoffice-4-1-4'>libreoffice-4-1-4</option> <option value='libreoffice-4-1-5'>libreoffice-4-1-5</option> <option value='libreoffice-4-1-6'>libreoffice-4-1-6</option> <option value='libreoffice-4-2'>libreoffice-4-2</option> <option value='libreoffice-4-2-0'>libreoffice-4-2-0</option> <option value='libreoffice-4-2-1'>libreoffice-4-2-1</option> <option value='libreoffice-4-2-2'>libreoffice-4-2-2</option> <option value='libreoffice-4-2-3'>libreoffice-4-2-3</option> <option value='libreoffice-4-2-4'>libreoffice-4-2-4</option> <option value='libreoffice-4-2-5'>libreoffice-4-2-5</option> <option value='libreoffice-4-2-6'>libreoffice-4-2-6</option> <option value='libreoffice-4-2-7'>libreoffice-4-2-7</option> <option value='libreoffice-4-2-8'>libreoffice-4-2-8</option> <option value='libreoffice-4-3'>libreoffice-4-3</option> <option value='libreoffice-4-3-0'>libreoffice-4-3-0</option> <option value='libreoffice-4-3-1'>libreoffice-4-3-1</option> <option value='libreoffice-4-3-2'>libreoffice-4-3-2</option> <option value='libreoffice-4-3-3'>libreoffice-4-3-3</option> <option value='libreoffice-4-3-4'>libreoffice-4-3-4</option> <option value='libreoffice-4-3-5'>libreoffice-4-3-5</option> <option value='libreoffice-4-3-6'>libreoffice-4-3-6</option> <option value='libreoffice-4-3-7'>libreoffice-4-3-7</option> <option value='libreoffice-4-4'>libreoffice-4-4</option> <option value='libreoffice-4-4-0'>libreoffice-4-4-0</option> <option value='libreoffice-4-4-1'>libreoffice-4-4-1</option> <option value='libreoffice-4-4-2'>libreoffice-4-4-2</option> <option value='libreoffice-4-4-3'>libreoffice-4-4-3</option> <option value='libreoffice-4-4-4'>libreoffice-4-4-4</option> <option value='libreoffice-4-4-5'>libreoffice-4-4-5</option> <option value='libreoffice-4-4-6'>libreoffice-4-4-6</option> <option value='libreoffice-4-4-7'>libreoffice-4-4-7</option> <option value='libreoffice-5-0'>libreoffice-5-0</option> <option value='libreoffice-5-0-0'>libreoffice-5-0-0</option> <option value='libreoffice-5-0-1'>libreoffice-5-0-1</option> <option value='libreoffice-5-0-2'>libreoffice-5-0-2</option> <option value='libreoffice-5-0-3'>libreoffice-5-0-3</option> <option value='libreoffice-5-0-4'>libreoffice-5-0-4</option> <option value='libreoffice-5-0-5'>libreoffice-5-0-5</option> <option value='libreoffice-5-0-6'>libreoffice-5-0-6</option> <option value='libreoffice-5-1'>libreoffice-5-1</option> <option value='libreoffice-5-1-0'>libreoffice-5-1-0</option> <option value='libreoffice-5-1-1'>libreoffice-5-1-1</option> <option value='libreoffice-5-1-2'>libreoffice-5-1-2</option> <option value='libreoffice-5-1-3'>libreoffice-5-1-3</option> <option value='libreoffice-5-1-4'>libreoffice-5-1-4</option> <option value='libreoffice-5-1-5'>libreoffice-5-1-5</option> <option value='libreoffice-5-1-6'>libreoffice-5-1-6</option> <option value='libreoffice-5-2'>libreoffice-5-2</option> <option value='libreoffice-5-2-0'>libreoffice-5-2-0</option> <option value='libreoffice-5-2-1'>libreoffice-5-2-1</option> <option value='libreoffice-5-2-2'>libreoffice-5-2-2</option> <option value='libreoffice-5-2-3'>libreoffice-5-2-3</option> <option value='libreoffice-5-2-4'>libreoffice-5-2-4</option> <option value='libreoffice-5-2-5'>libreoffice-5-2-5</option> <option value='libreoffice-5-2-6'>libreoffice-5-2-6</option> <option value='libreoffice-5-2-7'>libreoffice-5-2-7</option> <option value='libreoffice-5-3'>libreoffice-5-3</option> <option value='libreoffice-5-3-0'>libreoffice-5-3-0</option> <option value='libreoffice-5-3-1'>libreoffice-5-3-1</option> <option value='libreoffice-5-3-2'>libreoffice-5-3-2</option> <option value='libreoffice-5-3-3'>libreoffice-5-3-3</option> <option value='libreoffice-5-3-4'>libreoffice-5-3-4</option> <option value='libreoffice-5-3-5'>libreoffice-5-3-5</option> <option value='libreoffice-5-3-6'>libreoffice-5-3-6</option> <option value='libreoffice-5-3-7'>libreoffice-5-3-7</option> <option value='libreoffice-5-4'>libreoffice-5-4</option> <option value='libreoffice-5-4-0'>libreoffice-5-4-0</option> <option value='libreoffice-5-4-1'>libreoffice-5-4-1</option> <option value='libreoffice-5-4-2'>libreoffice-5-4-2</option> <option value='libreoffice-5-4-3'>libreoffice-5-4-3</option> <option value='libreoffice-5-4-4'>libreoffice-5-4-4</option> <option value='libreoffice-5-4-5'>libreoffice-5-4-5</option> <option value='libreoffice-5-4-6'>libreoffice-5-4-6</option> <option value='libreoffice-5-4-7'>libreoffice-5-4-7</option> <option value='libreoffice-6-0'>libreoffice-6-0</option> <option value='libreoffice-6-0-0'>libreoffice-6-0-0</option> <option value='libreoffice-6-0-1'>libreoffice-6-0-1</option> <option value='libreoffice-6-0-2'>libreoffice-6-0-2</option> <option value='libreoffice-6-0-3'>libreoffice-6-0-3</option> <option value='libreoffice-6-0-4'>libreoffice-6-0-4</option> <option value='libreoffice-6-0-5'>libreoffice-6-0-5</option> <option value='libreoffice-6-0-6'>libreoffice-6-0-6</option> <option value='libreoffice-6-0-7'>libreoffice-6-0-7</option> <option value='libreoffice-6-1'>libreoffice-6-1</option> <option value='libreoffice-6-1-0'>libreoffice-6-1-0</option> <option value='libreoffice-6-1-1'>libreoffice-6-1-1</option> <option value='libreoffice-6-1-2'>libreoffice-6-1-2</option> <option value='libreoffice-6-1-3'>libreoffice-6-1-3</option> <option value='libreoffice-6-1-4'>libreoffice-6-1-4</option> <option value='libreoffice-6-1-5'>libreoffice-6-1-5</option> <option value='libreoffice-6-1-6'>libreoffice-6-1-6</option> <option value='libreoffice-6-2'>libreoffice-6-2</option> <option value='libreoffice-6-2-0'>libreoffice-6-2-0</option> <option value='libreoffice-6-2-1'>libreoffice-6-2-1</option> <option value='libreoffice-6-2-2'>libreoffice-6-2-2</option> <option value='libreoffice-6-2-3'>libreoffice-6-2-3</option> <option value='libreoffice-6-2-4'>libreoffice-6-2-4</option> <option value='libreoffice-6-2-5'>libreoffice-6-2-5</option> <option value='libreoffice-6-2-6'>libreoffice-6-2-6</option> <option value='libreoffice-6-2-7'>libreoffice-6-2-7</option> <option value='libreoffice-6-2-8'>libreoffice-6-2-8</option> <option value='libreoffice-6-3'>libreoffice-6-3</option> <option value='libreoffice-6-3-0'>libreoffice-6-3-0</option> <option value='libreoffice-6-3-1'>libreoffice-6-3-1</option> <option value='libreoffice-6-3-2'>libreoffice-6-3-2</option> <option value='libreoffice-6-3-3'>libreoffice-6-3-3</option> <option value='libreoffice-6-3-4'>libreoffice-6-3-4</option> <option value='libreoffice-6-3-5'>libreoffice-6-3-5</option> <option value='libreoffice-6-3-6'>libreoffice-6-3-6</option> <option value='libreoffice-6-4'>libreoffice-6-4</option> <option value='libreoffice-6-4-0'>libreoffice-6-4-0</option> <option value='libreoffice-6-4-1'>libreoffice-6-4-1</option> <option value='libreoffice-6-4-2'>libreoffice-6-4-2</option> <option value='libreoffice-6-4-3'>libreoffice-6-4-3</option> <option value='libreoffice-6-4-4'>libreoffice-6-4-4</option> <option value='libreoffice-6-4-5'>libreoffice-6-4-5</option> <option value='libreoffice-6-4-6'>libreoffice-6-4-6</option> <option value='libreoffice-6-4-7'>libreoffice-6-4-7</option> <option value='libreoffice-7-0'>libreoffice-7-0</option> <option value='libreoffice-7-0-0'>libreoffice-7-0-0</option> <option value='libreoffice-7-0-1'>libreoffice-7-0-1</option> <option value='libreoffice-7-0-2'>libreoffice-7-0-2</option> <option value='libreoffice-7-0-3'>libreoffice-7-0-3</option> <option value='libreoffice-7-0-4'>libreoffice-7-0-4</option> <option value='libreoffice-7-0-5'>libreoffice-7-0-5</option> <option value='libreoffice-7-0-6'>libreoffice-7-0-6</option> <option value='libreoffice-7-1'>libreoffice-7-1</option> <option value='libreoffice-7-1-0'>libreoffice-7-1-0</option> <option value='libreoffice-7-1-1'>libreoffice-7-1-1</option> <option value='libreoffice-7-1-2'>libreoffice-7-1-2</option> <option value='libreoffice-7-1-3'>libreoffice-7-1-3</option> <option value='libreoffice-7-1-4'>libreoffice-7-1-4</option> <option value='libreoffice-7-1-5'>libreoffice-7-1-5</option> <option value='libreoffice-7-1-6'>libreoffice-7-1-6</option> <option value='libreoffice-7-1-7'>libreoffice-7-1-7</option> <option value='libreoffice-7-2'>libreoffice-7-2</option> <option value='libreoffice-7-2-0'>libreoffice-7-2-0</option> <option value='libreoffice-7-2-1'>libreoffice-7-2-1</option> <option value='libreoffice-7-2-2'>libreoffice-7-2-2</option> <option value='libreoffice-7-2-3'>libreoffice-7-2-3</option> <option value='libreoffice-7-2-5'>libreoffice-7-2-5</option> <option value='libreoffice-7-2-6'>libreoffice-7-2-6</option> <option value='libreoffice-7-2-7'>libreoffice-7-2-7</option> <option value='libreoffice-7-3'>libreoffice-7-3</option> <option value='libreoffice-7-3-0'>libreoffice-7-3-0</option> <option value='libreoffice-7-3-1'>libreoffice-7-3-1</option> <option value='libreoffice-7-3-2'>libreoffice-7-3-2</option> <option value='libreoffice-7-3-3'>libreoffice-7-3-3</option> <option value='libreoffice-7-3-4'>libreoffice-7-3-4</option> <option value='libreoffice-7-3-5'>libreoffice-7-3-5</option> <option value='libreoffice-7-3-6'>libreoffice-7-3-6</option> <option value='libreoffice-7-3-7'>libreoffice-7-3-7</option> <option value='libreoffice-7-4'>libreoffice-7-4</option> <option value='libreoffice-7-4-0'>libreoffice-7-4-0</option> <option value='libreoffice-7-4-1'>libreoffice-7-4-1</option> <option value='libreoffice-7-4-2'>libreoffice-7-4-2</option> <option value='libreoffice-7-4-3'>libreoffice-7-4-3</option> <option value='libreoffice-7-4-4'>libreoffice-7-4-4</option> <option value='libreoffice-7-4-6'>libreoffice-7-4-6</option> <option value='libreoffice-7-4-7'>libreoffice-7-4-7</option> <option value='libreoffice-7-5'>libreoffice-7-5</option> <option value='libreoffice-7-5-0'>libreoffice-7-5-0</option> <option value='libreoffice-7-5-1'>libreoffice-7-5-1</option> <option value='libreoffice-7-5-2'>libreoffice-7-5-2</option> <option value='libreoffice-7-5-3'>libreoffice-7-5-3</option> <option value='libreoffice-7-5-4'>libreoffice-7-5-4</option> <option value='libreoffice-7-5-5'>libreoffice-7-5-5</option> <option value='libreoffice-7-5-6'>libreoffice-7-5-6</option> <option value='libreoffice-7-5-7'>libreoffice-7-5-7</option> <option value='libreoffice-7-5-8'>libreoffice-7-5-8</option> <option value='libreoffice-7-5-9'>libreoffice-7-5-9</option> <option value='libreoffice-7-6'>libreoffice-7-6</option> <option value='libreoffice-7-6-0'>libreoffice-7-6-0</option> <option value='libreoffice-7-6-1'>libreoffice-7-6-1</option> <option value='libreoffice-7-6-2'>libreoffice-7-6-2</option> <option value='libreoffice-7-6-3'>libreoffice-7-6-3</option> <option value='libreoffice-7-6-4'>libreoffice-7-6-4</option> <option value='libreoffice-7-6-5'>libreoffice-7-6-5</option> <option value='libreoffice-7-6-6'>libreoffice-7-6-6</option> <option value='libreoffice-7-6-7'>libreoffice-7-6-7</option> <option value='master'>master</option> <option value='ports/macosx10.5/master'>ports/macosx10.5/master</option> <option value='private/Ashod/cd-5.3-3.2_import_unloaded'>private/Ashod/cd-5.3-3.2_import_unloaded</option> <option value='private/Ashod/cd-5.3-3.2_import_unloaded_share_GfxLink'>private/Ashod/cd-5.3-3.2_import_unloaded_share_GfxLink</option> <option value='private/Ashod/cd-5.3.3.2'>private/Ashod/cd-5.3.3.2</option> <option value='private/Ashod/cp-5.0-preinit'>private/Ashod/cp-5.0-preinit</option> <option value='private/Ashod/fast-calc-rendering'>private/Ashod/fast-calc-rendering</option> <option value='private/Ashod/pdfium'>private/Ashod/pdfium</option> <option value='private/Ashod/pdfium_on_master'>private/Ashod/pdfium_on_master</option> <option value='private/Ashod/pdfium_on_master_fixed'>private/Ashod/pdfium_on_master_fixed</option> <option value='private/EL-SHREIF/ui_logger'>private/EL-SHREIF/ui_logger</option> <option value='private/Minion3665/swf-export'>private/Minion3665/swf-export</option> <option value='private/Rosemary/change-tracking'>private/Rosemary/change-tracking</option> <option value='private/Sweetshark/killswclient'>private/Sweetshark/killswclient</option> <option value='private/Sweetshark/lessdepend'>private/Sweetshark/lessdepend</option> <option value='private/Sweetshark/multilistenerfix'>private/Sweetshark/multilistenerfix</option> <option value='private/ajrhunt/c4'>private/ajrhunt/c4</option> <option value='private/ajrhunt/cunit'>private/ajrhunt/cunit</option> <option value='private/ajrhunt/cunitdemo'>private/ajrhunt/cunitdemo</option> <option value='private/ajrhunt/firebird-improvement'>private/ajrhunt/firebird-improvement</option> <option value='private/bansan/chardraw'>private/bansan/chardraw</option> <option value='private/bubli/textboxchaining'>private/bubli/textboxchaining</option> <option value='private/hcvcastro/preinit'>private/hcvcastro/preinit</option> <option value='private/hcvcastro/undo-row-comment'>private/hcvcastro/undo-row-comment</option> <option value='private/jmux/armin-strip-before-squash'>private/jmux/armin-strip-before-squash</option> <option value='private/jmux/broken-static-win'>private/jmux/broken-static-win</option> <option value='private/jmux/current-reorga'>private/jmux/current-reorga</option> <option value='private/jmux/meson'>private/jmux/meson</option> <option value='private/jmux/meson-gsoc-2021'>private/jmux/meson-gsoc-2021</option> <option value='private/jmux/oss-fuzz'>private/jmux/oss-fuzz</option> <option value='private/jmux/oss-fuzz-wip'>private/jmux/oss-fuzz-wip</option> <option value='private/jmux/scheduler-fixes'>private/jmux/scheduler-fixes</option> <option value='private/jmux/shape.odt'>private/jmux/shape.odt</option> <option value='private/jmux/wasm-for-master'>private/jmux/wasm-for-master</option> <option value='private/jmux/wasm-tmp'>private/jmux/wasm-tmp</option> <option value='private/jmux/wasm_for_master_catchall'>private/jmux/wasm_for_master_catchall</option> <option value='private/jmux/win-arm64'>private/jmux/win-arm64</option> <option value='private/jmux/win-test-nohang'>private/jmux/win-test-nohang</option> <option value='private/juergen/Tests'>private/juergen/Tests</option> <option value='private/juergen/check-cjk'>private/juergen/check-cjk</option> <option value='private/kendy/condformat-api'>private/kendy/condformat-api</option> <option value='private/kendy/condformat-fdo82014'>private/kendy/condformat-fdo82014</option> <option value='private/kendy/mailmerge-04'>private/kendy/mailmerge-04</option> <option value='private/kendy/mailmerge-05'>private/kendy/mailmerge-05</option> <option value='private/kendy/swinterpreter'>private/kendy/swinterpreter</option> <option value='private/kendy/testcl'>private/kendy/testcl</option> <option value='private/khaledhosny/color-fonts'>private/khaledhosny/color-fonts</option> <option value='private/khaledhosny/vcl-cleanup-font'>private/khaledhosny/vcl-cleanup-font</option> <option value='private/kohei/chart-bugs'>private/kohei/chart-bugs</option> <option value='private/kohei/find-replace-all-perf'>private/kohei/find-replace-all-perf</option> <option value='private/kohei/headless-perf'>private/kohei/headless-perf</option> <option value='private/kohei/if-or-not-if-jump'>private/kohei/if-or-not-if-jump</option> <option value='private/kohei/sort-ref-update'>private/kohei/sort-ref-update</option> <option value='private/lfrb/opengl-vcl'>private/lfrb/opengl-vcl</option> <option value='private/lgodard/calc_notes_import_export'>private/lgodard/calc_notes_import_export</option> <option value='private/lgodard/tdf#117202'>private/lgodard/tdf#117202</option> <option value='private/llunak/mailmerge'>private/llunak/mailmerge</option> <option value='private/llunak/mailmerge_01'>private/llunak/mailmerge_01</option> <option value='private/llunak/mailmerge_02'>private/llunak/mailmerge_02</option> <option value='private/llunak/mailmerge_03'>private/llunak/mailmerge_03</option> <option value='private/llunak/munich_12587'>private/llunak/munich_12587</option> <option value='private/llunak/skia'>private/llunak/skia</option> <option value='private/lmamane/basetest'>private/lmamane/basetest</option> <option value='private/lmamane/for-julien2412'>private/lmamane/for-julien2412</option> <option value='private/lmamane/for-julien2412-master'>private/lmamane/for-julien2412-master</option> <option value='private/lmamane/tdf110997'>private/lmamane/tdf110997</option> <option value='private/lmamane/timedate-controls-nanosecond'>private/lmamane/timedate-controls-nanosecond</option> <option value='private/lmamane/validation'>private/lmamane/validation</option> <option value='private/mcecchetti/23H1/a11y/paragraph'>private/mcecchetti/23H1/a11y/paragraph</option> <option value='private/mcecchetti/accessibility/paragraph'>private/mcecchetti/accessibility/paragraph</option> <option value='private/mcecchetti/amd/pdf-export-jpeg'>private/mcecchetti/amd/pdf-export-jpeg</option> <option value='private/mcecchetti/bitmapcrc64'>private/mcecchetti/bitmapcrc64</option> <option value='private/mcecchetti/bitmapcrc64-5-0'>private/mcecchetti/bitmapcrc64-5-0</option> <option value='private/mcecchetti/calc-perf-unit-test'>private/mcecchetti/calc-perf-unit-test</option> <option value='private/mcecchetti/calc-unit-test'>private/mcecchetti/calc-unit-test</option> <option value='private/mcecchetti/gl-program-binary'>private/mcecchetti/gl-program-binary</option> <option value='private/mert/wip_deepl'>private/mert/wip_deepl</option> <option value='private/mikekaganski/multicolumn'>private/mikekaganski/multicolumn</option> <option value='private/mmeeks/aafixes44'>private/mmeeks/aafixes44</option> <option value='private/mmeeks/backports'>private/mmeeks/backports</option> <option value='private/mmeeks/binarydatacache'>private/mmeeks/binarydatacache</option> <option value='private/mmeeks/bitmapcrc64'>private/mmeeks/bitmapcrc64</option> <option value='private/mmeeks/copy-paste'>private/mmeeks/copy-paste</option> <option value='private/mmeeks/copypaste'>private/mmeeks/copypaste</option> <option value='private/mmeeks/cp-6.2-bits'>private/mmeeks/cp-6.2-bits</option> <option value='private/mmeeks/cp64merge'>private/mmeeks/cp64merge</option> <option value='private/mmeeks/currency-dropdown'>private/mmeeks/currency-dropdown</option> <option value='private/mmeeks/foo'>private/mmeeks/foo</option> <option value='private/mmeeks/formula-iterator'>private/mmeeks/formula-iterator</option> <option value='private/mmeeks/gldebug'>private/mmeeks/gldebug</option> <option value='private/mmeeks/hidpi-bits'>private/mmeeks/hidpi-bits</option> <option value='private/mmeeks/icontest'>private/mmeeks/icontest</option> <option value='private/mmeeks/opengl-backbuffer'>private/mmeeks/opengl-backbuffer</option> <option value='private/mmeeks/opengl-backbuffer2'>private/mmeeks/opengl-backbuffer2</option> <option value='private/mmeeks/sandbox'>private/mmeeks/sandbox</option> <option value='private/mmeeks/swapdatacontainer'>private/mmeeks/swapdatacontainer</option> <option value='private/mmeeks/vcl-opengl3'>private/mmeeks/vcl-opengl3</option> <option value='private/moggi/fix-opengl-context-problems'>private/moggi/fix-opengl-context-problems</option> <option value='private/moggi/improved-dxf-xls-export'>private/moggi/improved-dxf-xls-export</option> <option value='private/moggi/opengl-4-4-build-test'>private/moggi/opengl-4-4-build-test</option> <option value='private/moggi/opengl-preparation'>private/moggi/opengl-preparation</option> <option value='private/moggi/opengl-vcl-win'>private/moggi/opengl-vcl-win</option> <option value='private/moggi/orcus-improvements'>private/moggi/orcus-improvements</option> <option value='private/moggi/track-win-dc'>private/moggi/track-win-dc</option> <option value='private/moggi/ui-test'>private/moggi/ui-test</option> <option value='private/moggi/vcl-opengl3'>private/moggi/vcl-opengl3</option> <option value='private/mst/sw_fieldmarkhide'>private/mst/sw_fieldmarkhide</option> <option value='private/mst/sw_redlinehide'>private/mst/sw_redlinehide</option> <option value='private/mst/sw_redlinehide_2'>private/mst/sw_redlinehide_2</option> <option value='private/mst/sw_redlinehide_3'>private/mst/sw_redlinehide_3</option> <option value='private/mst/sw_redlinehide_4a'>private/mst/sw_redlinehide_4a</option> <option value='private/mst/sw_redlinehide_4b'>private/mst/sw_redlinehide_4b</option> <option value='private/pranavk/modernize_gtktiledviewer'>private/pranavk/modernize_gtktiledviewer</option> <option value='private/quwex/gsoc-box2d-experimental'>private/quwex/gsoc-box2d-experimental</option> <option value='private/quwex/notespane-search'>private/quwex/notespane-search</option> <option value='private/quwex/notespaneflat'>private/quwex/notespaneflat</option> <option value='private/quwex/notespanesquashed'>private/quwex/notespanesquashed</option> <option value='private/quwex/tdf59323'>private/quwex/tdf59323</option> <option value='private/s.mehrbrodt/colorpicker-backport'>private/s.mehrbrodt/colorpicker-backport</option> <option value='private/sweetshark/swdepend'>private/sweetshark/swdepend</option> <option value='private/tbsdy/clipping'>private/tbsdy/clipping</option> <option value='private/tbsdy/drawserverfontlayout'>private/tbsdy/drawserverfontlayout</option> <option value='private/tbsdy/emf'>private/tbsdy/emf</option> <option value='private/tbsdy/osl_getAllEnvironment'>private/tbsdy/osl_getAllEnvironment</option> <option value='private/tbsdy/outdev'>private/tbsdy/outdev</option> <option value='private/tbsdy/printinfomgr'>private/tbsdy/printinfomgr</option> <option value='private/tbsdy/workbench'>private/tbsdy/workbench</option> <option value='private/thb/libo-6-1+backports'>private/thb/libo-6-1+backports</option> <option value='private/thb/libreoffice-5-2+backports'>private/thb/libreoffice-5-2+backports</option> <option value='private/thb/sw_redlinehide-6-1'>private/thb/sw_redlinehide-6-1</option> <option value='private/thb/tdf149754'>private/thb/tdf149754</option> <option value='private/thb/wasm-upstreaming'>private/thb/wasm-upstreaming</option> <option value='private/timar/cp-6.2-centos7'>private/timar/cp-6.2-centos7</option> <option value='private/timar/fontconfigcrash'>private/timar/fontconfigcrash</option> <option value='private/timar/pythonupgrademsp'>private/timar/pythonupgrademsp</option> <option value='private/tml/Use-the-iOS-French-and-Italian-dictionaries-for-othe'>private/tml/Use-the-iOS-French-and-Italian-dictionaries-for-othe</option> <option value='private/tml/android-use-bionic-linker-copy'>private/tml/android-use-bionic-linker-copy</option> <option value='private/tml/android-use-faulty.lib'>private/tml/android-use-faulty.lib</option> <option value='private/tml/cp-6-4-28-1'>private/tml/cp-6-4-28-1</option> <option value='private/tml/fixwintext'>private/tml/fixwintext</option> <option value='private/tml/iculess'>private/tml/iculess</option> <option value='private/tml/lov-6.1.5.2'>private/tml/lov-6.1.5.2</option> <option value='private/tml/lov-6.2.1'>private/tml/lov-6.2.1</option> <option value='private/tml/lov-7.0.3.3'>private/tml/lov-7.0.3.3</option> <option value='private/tml/lov-7.0.4'>private/tml/lov-7.0.4</option> <option value='private/tml/lov-7.1.2'>private/tml/lov-7.1.2</option> <option value='private/tml/opencl-default-1'>private/tml/opencl-default-1</option> <option value='private/tvajngerl/staging'>private/tvajngerl/staging</option> <option value='ref/for/distro/collabora/cp-6.2'>ref/for/distro/collabora/cp-6.2</option> </select> <input type='submit' value='switch'/></form></td></tr> <tr><td class='sub'>LibreOffice 核心代码仓库</td><td class='sub right'>文档基金会</td></tr></table> <table class='tabs'><tr><td> <a href='/cgit/lo/core/?h=libreoffice-25-2'>summary</a><a href='/cgit/lo/core/refs/?h=libreoffice-25-2&id=87f9d7da00857c649784a7d9eca046bf6e71ae3c'>refs</a><a class='active' href='/cgit/lo/core/log/ure?h=libreoffice-25-2'>log</a><a href='/cgit/lo/core/tree/ure?h=libreoffice-25-2&id=87f9d7da00857c649784a7d9eca046bf6e71ae3c'>tree</a><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=87f9d7da00857c649784a7d9eca046bf6e71ae3c'>commit</a><a href='/cgit/lo/core/diff/ure?h=libreoffice-25-2&id=87f9d7da00857c649784a7d9eca046bf6e71ae3c'>diff</a></td><td class='form'><form class='right' method='get' action='/cgit/lo/core/log/ure'> <input type='hidden' name='h' value='libreoffice-25-2'/><input type='hidden' name='id' value='87f9d7da00857c649784a7d9eca046bf6e71ae3c'/><select name='qt'> <option value='grep'>log msg</option> <option value='author'>author</option> <option value='committer'>committer</option> <option value='range'>range</option> </select> <input class='txt' type='search' size='10' name='q' value=''/> <input type='submit' value='search'/> </form> </td></tr></table> <div class='path'>path: <a href='/cgit/lo/core/log/?h=libreoffice-25-2&id=87f9d7da00857c649784a7d9eca046bf6e71ae3c'>root</a>/<a href='/cgit/lo/core/log/ure?h=libreoffice-25-2&id=87f9d7da00857c649784a7d9eca046bf6e71ae3c'>ure</a></div><div class='content'><table class='list nowrap'><tr class='nohover'><th class='left'>Age</th><th class='left'>Commit message (<a href='/cgit/lo/core/log/ure?h=libreoffice-25-2&id=87f9d7da00857c649784a7d9eca046bf6e71ae3c&showmsg=1'>Expand</a>)</th><th class='left'>Author</th></tr> <tr><td><span title='2012-12-19 09:55:30 +0100'>2012-12-19</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=0c1dc375b4bf0c8ff01fe51921767faa703b1295'>Make ure/source/uretest/ use defaultBootstrap_InitialComponentContext</a></td><td>Stephan Bergmann</td></tr> <tr><td><span title='2012-12-18 16:23:24 +0100'>2012-12-18</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=b7215602c00f392e30e0e23e21f32dd37fba07dd'>API CHANGE: Remove obsolete regcomp from URE</a></td><td>Stephan Bergmann</td></tr> <tr><td><span title='2012-12-18 16:23:23 +0100'>2012-12-18</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=b980eca67edd8e3dd43d8717dbd90a2104450f85'>Adapt ure/source/uretest/ to passive component registration</a></td><td>Stephan Bergmann</td></tr> <tr><td><span title='2012-12-18 16:23:23 +0100'>2012-12-18</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=7068cad92490e45c75214ba33a9102df24b6653d'>-fvisibility=hidden requires HAVE_GCC_VISIBILITY_FEATURE</a></td><td>Stephan Bergmann</td></tr> <tr><td><span title='2012-12-18 12:47:39 +0100'>2012-12-18</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=39da5cf13337d2945b802587f5b0d9d4ef0512dd'>SDK's include/stl is long gone</a></td><td>Stephan Bergmann</td></tr> <tr><td><span title='2012-12-17 16:34:23 +0100'>2012-12-17</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=77d3777c8934171a9557a96872d020cf12443fb9'>Remove --with-stlport from LO 4.0</a></td><td>Stephan Bergmann</td></tr> <tr><td><span title='2012-11-30 14:36:36 +0100'>2012-11-30</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=66a175834c39ccde9475eac3adb72a843110d01f'>c++ API: use css alias in generated headers, adds global css decl</a></td><td>Thorsten Behrens</td></tr> <tr><td><span title='2012-11-15 12:46:19 +0100'>2012-11-15</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=b69951996967a1c79e3a55dd13dd5609b19db6a1'>Drop support for /etc/opt/ure and ~/.ure from LibreOffice 4</a></td><td>Stephan Bergmann</td></tr> <tr><td><span title='2012-10-22 18:43:44 -0400'>2012-10-22</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=bd1c6446d3fec046c8cd6d275412036f19198d3d'>remove nonexistant file from Zip_uretest</a></td><td>Peter Foley</td></tr> <tr><td><span title='2012-10-01 16:05:06 -0500'>2012-10-01</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=d11d45e798b0dedd1e39fb6441fdd182e21a58f3'>remove dead link</a></td><td>Norbert Thiebaud</td></tr> <tr><td><span title='2012-09-17 16:59:53 +0200'>2012-09-17</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=543158edba6678d3d76eee983a9d4edd2a422fee'>Require XComponentContext.getServiceManager to throw instead of returning null</a></td><td>Stephan Bergmann</td></tr> <tr><td><span title='2012-08-08 18:36:39 +0200'>2012-08-08</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=f98379816411f932ccdafede5f9b25c260c17361'>Make ure/source/uretest work again</a></td><td>Stephan Bergmann</td></tr> <tr><td><span title='2012-07-30 20:49:09 +0200'>2012-07-30</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=753e9b3d45f5970ee77505ecf8a816e4e4c5389d'>udkapi, offapi: do not use #include "foo":</a></td><td>Michael Stahl</td></tr> <tr><td><span title='2012-06-27 19:30:33 +0100'>2012-06-27</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=e18655e47530f1e399cb546a6001fa0aa0f1873c'>re-base on ALv2 code.</a></td><td>Michael Meeks</td></tr> <tr><td><span title='2012-06-21 13:11:06 +0100'>2012-06-21</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=b6db3e3acc6ba349d845ec58e3242d025352ef2f'>re-base on ALv2 code.</a></td><td>Michael Meeks</td></tr> <tr><td><span title='2012-06-11 09:54:15 +0200'>2012-06-11</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=fa414fcf975b8eb572ce3679a0b91e2e16ca7f2e'>Fix typo in /ure/bin/startup.sh</a></td><td>Olivier Hallot</td></tr> <tr><td><span title='2012-05-26 16:15:07 +0200'>2012-05-26</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=e726638eb8bd9e8fab3268259ddee9de88c56a39'>gbuildize remotebridges</a></td><td>David Tardon</td></tr> <tr><td><span title='2012-04-29 03:50:46 +0200'>2012-04-29</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=b1c3e8ae28fcd84c7182f4898c3250e18ed92f1a'>make gbuild the default assumption of build.pl</a></td><td>Bjoern Michaelsen</td></tr> <tr><td><span title='2012-04-01 12:21:00 +0200'>2012-04-01</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=59c0f8f452a538308a9d4098cdc8319b884c3c81'>merge origin/master</a></td><td>David Tardon</td></tr> <tr><td><span title='2012-03-30 08:37:12 +0300'>2012-03-30</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=677defb67bd3bfc861ea31620fadbb4bff65a06e'>Don't build and deliver .component files with empty URIs (for iOS)</a></td><td>Tor Lillqvist</td></tr> <tr><td><span title='2012-03-23 11:45:18 +0100'>2012-03-23</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=fb067f9bb25c49ee50b8fd62c844812d6a875805'>replace OpenOffice.org to LibreOffice in registry keys</a></td><td>Andras Timar</td></tr> <tr><td><span title='2012-03-12 19:51:20 +0100'>2012-03-12</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=59162c85c269e247dc0c07fabb8b67d361d6392c'>gbuildize io</a></td><td>David Tardon</td></tr> <tr><td><span title='2012-03-12 11:42:50 +0100'>2012-03-12</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=d2097ad456b4626dd6972e015489ce3d22eb1872'>gbuildize stoc</a></td><td>David Tardon</td></tr> <tr><td><span title='2012-02-17 08:57:54 +0100'>2012-02-17</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=42e8410538995a28274a4d4a8936e75ad4dedcd8'>component file moved</a></td><td>David Tardon</td></tr> <tr><td><span title='2012-02-17 08:34:22 +0100'>2012-02-17</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=096f2b849c08dc6890b548621b9a19dd78661e6a'>merge feature/gbuild_java</a></td><td>David Tardon</td></tr> <tr><td><span title='2012-02-06 05:28:46 +0100'>2012-02-06</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=fb78dbcdc5a76997856285af3b041ffd087c40a5'>Added READMEs for modules related to URE, with content from the wiki</a></td><td>Josh Heidenreich</td></tr> <tr><td><span title='2012-02-05 19:34:05 -0600'>2012-02-05</span></td><td><a href='/cgit/lo/core/commit/ure?h=libreoffice-25-2&id=c857dff7fc4b180c1d405ea5584e06c0581427ae'>switch to include-based build rather than sourced-based build</a></td><td>Norbert Thiebaud</td></tr>