Rebased ref, commits from common ancestor:
commit 96bbedb1585f7cda6faab0aa8cba1ac2217be212
Author:     Kris van der Merwe <[email protected]>
AuthorDate: Wed Mar 27 14:29:08 2024 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:20 2024 +0100

    Update git submodules
    
    * Update dictionaries from branch 'distro/collabora/co-24.04'
      to a62f9b3e6b2de1366d826a5bacf19ae63e527ead
      - Updated Afrikaans dictionary
    
        Change-Id: Ief9cb53fdcbf794d1c54f4f5008f80b9975453d8
        Reviewed-on: https://gerrit.libreoffice.org/c/dictionaries/+/163265
        Tested-by: Andras Timar <[email protected]>
        Reviewed-by: Andras Timar <[email protected]>
        (cherry picked from commit 55f4731d574aeec252379ac66326bcea6df2f823)
        Reviewed-on: https://gerrit.libreoffice.org/c/dictionaries/+/163280
        Tested-by: Adolfo Jayme Barrientos <[email protected]>
        Reviewed-by: Adolfo Jayme Barrientos <[email protected]>

diff --git a/dictionaries b/dictionaries
index d7bb4585419c..a62f9b3e6b2d 160000
--- a/dictionaries
+++ b/dictionaries
@@ -1 +1 @@
-Subproject commit d7bb4585419ce4496498ae5291947a3bf06ea1ec
+Subproject commit a62f9b3e6b2de1366d826a5bacf19ae63e527ead
commit 0824e9406a6f8f61ebc25f52ad8fb9c83e15b560
Author:     Patrick Luby <[email protected]>
AuthorDate: Wed Mar 27 14:28:24 2024 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:20 2024 +0100

    Update git submodules
    
    * Update helpcontent2 from branch 'distro/collabora/co-24.04'
      to b43d32f0218caaeb880c06d490d0b99972a50614
      - tdf#159326 macOS uses Command+Option+F while other plafforms use Ctrl+H
    
        Change-Id: Iee37805afba1aa712a45c213d1f9eeae4d01d923
        Reviewed-on: https://gerrit.libreoffice.org/c/help/+/162452
        Tested-by: Jenkins
        Reviewed-by: Patrick Luby <[email protected]>
        (cherry picked from commit 509ec415db94a821da1c8f7bacf9e372d320e49d)
        Reviewed-on: https://gerrit.libreoffice.org/c/help/+/162534
        Reviewed-by: Patrick Luby <[email protected]>
        Reviewed-by: Olivier Hallot <[email protected]>
    
      - related tdf#160057: replace ref to obsolete Footer Header page
    
        Change-Id: Ie6df598c42149ecc527a1a2eef35a7aba469c216
        Reviewed-on: https://gerrit.libreoffice.org/c/help/+/164387
        Tested-by: Jenkins
        Reviewed-by: Adolfo Jayme Barrientos <[email protected]>
        (cherry picked from commit 04dcd1b951689689f9449408fd6f512a9c87aa0d)
        Reviewed-on: https://gerrit.libreoffice.org/c/help/+/164991
    
      - tdf#156156: add Animation sidebar deck help button's HID
    
        Change-Id: Ia0500321f9216aff4f249f9088694f6cd1fa1a80
        Reviewed-on: https://gerrit.libreoffice.org/c/help/+/161217
        Tested-by: Jenkins
        Reviewed-by: Adolfo Jayme Barrientos <[email protected]>
    
      - tdf#156156: add Manage Changes sidebar decks help button's HID
    
        Change-Id: Ibeab9e20ea4f8684b8d0a8a535b30c3122e4df70
        Reviewed-on: https://gerrit.libreoffice.org/c/help/+/161165
        Tested-by: Jenkins
        Reviewed-by: Adolfo Jayme Barrientos <[email protected]>
    
      - fix Helpex warnings: 'No string specified!'
    
        Change-Id: I70ad73b6859cd989e6046c3bd5a76c54c27f416d
        Reviewed-on: https://gerrit.libreoffice.org/c/help/+/164631
        Tested-by: Jenkins
        Reviewed-by: Olivier Hallot <[email protected]>
        (cherry picked from commit 99537726eca951a450182d7672458afeb2b65e66)
        Reviewed-on: https://gerrit.libreoffice.org/c/help/+/164615
        Reviewed-by: Adolfo Jayme Barrientos <[email protected]>

diff --git a/helpcontent2 b/helpcontent2
index e5d0bcb12bde..b43d32f0218c 160000
--- a/helpcontent2
+++ b/helpcontent2
@@ -1 +1 @@
-Subproject commit e5d0bcb12bde1a726205c3e21338a625fba625a5
+Subproject commit b43d32f0218caaeb880c06d490d0b99972a50614
commit a2d349bc9c545e5107c6dfaa37f66bd38026147c
Author:     Christian Lohmaier <[email protected]>
AuthorDate: Wed Mar 27 14:24:48 2024 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:19 2024 +0100

    Update git submodules
    
    * Update translations from branch 'distro/collabora/co-24.04'
      to a2ed0affdffd40b46b6f5af094173ad32779293b
      - update translations for 24.2.2 rc2
    
        and force-fix errors using pocheck
    
        Change-Id: I75a9cc68d9f9d7712b58dfc521173323c3775208
    
      - bump copyright year for sl translation
    
        Change-Id: I7211f904b9b3822e5c45bc4c3c7a3b0512853185
    
      - update translations for 24-2 and force-fix errors using pocheck
    
        Change-Id: I964bed068dfa7396512c1742c73c674caa96669c
    
      - update translations for 24.2.2 rc1
    
        and force-fix errors using pocheck
    
        Change-Id: I9719c836bf763473f9a85cfced566b4cba514c13
    
      - update translations for 24.2.1 rc2
    
        and force-fix errors using pocheck
    
        Change-Id: I529205bfbe25f3e4a843743d37ba26c23b626a84

diff --git a/translations b/translations
index ced8f5a17e47..a2ed0affdffd 160000
--- a/translations
+++ b/translations
@@ -1 +1 @@
-Subproject commit ced8f5a17e47cf094e7b82b6a84e46766e10621c
+Subproject commit a2ed0affdffd40b46b6f5af094173ad32779293b
commit 710295ad5299d69e37dec8d76bdde589a9b8986d
Author:     Andras Timar <[email protected]>
AuthorDate: Wed Mar 27 12:22:47 2024 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:19 2024 +0100

    [cp] Revert "tdf#159743: Revert all Shortcut modifications in German UI"
    
    This reverts commit 9703fddea1058cb6018a5e693f03909d2b37315c.
    We decided to revert the revert, because we wanted to have the
    German shortcuts like in German MS Office. It is to be decided
    what to do on the long run, because it is not possible to be
    compatible with MS Office and to keep the old shortcuts at the
    same time.
    
    Change-Id: Ib3e4df9c87803c5e10cb3c4cedad6274e7cddb4c

diff --git a/officecfg/registry/data/org/openoffice/Office/Accelerators.xcu 
b/officecfg/registry/data/org/openoffice/Office/Accelerators.xcu
index 7f8180d72a19..71dbd7c1c391 100644
--- a/officecfg/registry/data/org/openoffice/Office/Accelerators.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/Accelerators.xcu
@@ -687,6 +687,7 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="en-US">.uno:SpacePara15</value>
+            <value xml:lang="de">.uno:Strikeout</value>
           </prop>
         </node>
         <node oor:name="5_SHIFT_MOD1" oor:op="replace">
@@ -717,14 +718,26 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="sv">.uno:Shrink</value>
-            <value xml:lang="de">.uno:Shrink</value>
+            <value xml:lang="de">.uno:HideColumn</value>
           </prop>
         </node>
         <node oor:name="9_MOD1" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="sv">.uno:Grow</value>
-            <value xml:lang="de">.uno:Grow</value>
+            <value xml:lang="de">.uno:HideRow</value>
+          </prop>
+        </node>
+        <node oor:name="O_MOD1_MOD2" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">I10 SHORTCUTS - No 
TRANSLATE</value>
+            <value xml:lang="de">.uno:Zoom100Percent</value>
+          </prop>
+        </node>
+        <node oor:name="0_MOD2" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">.uno:FormatCellDialog</value>
           </prop>
         </node>
         <node oor:name="ADD_MOD1" oor:op="replace">
@@ -885,12 +898,38 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="en-US">.uno:Group</value>
+            <value xml:lang="de">.uno:SaveAs</value>
           </prop>
         </node>
         <node oor:name="F12_MOD1" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="en-US">.uno:Ungroup</value>
+            <value xml:lang="de">.uno:Group</value>
+          </prop>
+        </node>
+        <node oor:name="F12_SHIFT_MOD1" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">.uno:Ungroup</value>
+          </prop>
+        </node>
+        <node oor:name="LEFT_SHIFT_MOD2" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="en-US">.uno:Ungroup</value>
+          </prop>
+        </node>
+        <node oor:name="RIGHT_SHIFT_MOD2" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="en-US">.uno:Group</value>
+          </prop>
+        </node>
+        <node oor:name="M_MOD1_MOD2" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="en-US">.uno:InsertAnnotation</value>
           </prop>
         </node>
         <node oor:name="F2" oor:op="replace">
@@ -905,6 +944,12 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
             <value xml:lang="en-US">.uno:FunctionDialog</value>
           </prop>
         </node>
+        <node oor:name="F2_SHIFT" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">.uno:InsertAnnotation</value>
+          </prop>
+        </node>
         <node oor:name="F2_SHIFT_MOD1" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
@@ -921,6 +966,13 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="en-US">.uno:ChangeCaseRotateCase</value>
+            <value xml:lang="de">.uno:FunctionDialog</value>
+          </prop>
+        </node>
+        <node oor:name="F3_SHIFT_MOD1" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">.uno:ChangeCaseRotateCase</value>
           </prop>
         </node>
         <node oor:name="F4" oor:op="replace">
@@ -933,6 +985,7 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="en-US">.uno:Navigator</value>
+            <value xml:lang="de">.uno:FocusCellAddress</value>
           </prop>
         </node>
         <node oor:name="F5_MOD1" oor:op="replace">
@@ -957,6 +1010,7 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="en-US">.uno:InsertCurrentTime</value>
+            <value xml:lang="de">.uno:Shrink</value>
           </prop>
         </node>
         <node oor:name="F7_MOD1" oor:op="replace">
@@ -1008,6 +1062,18 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
             <value xml:lang="en-US" 
install:module="unxwnt">.uno:RepeatSearch</value>
           </prop>
         </node>
+        <node oor:name="F_MOD1" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">.uno:Navigator</value>
+          </prop>
+        </node>
+        <node oor:name="F_MOD2" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">vnd.sun.star.findbar:FocusToFindbar</value>
+          </prop>
+        </node>
         <node oor:name="F_MOD1_MOD2" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
@@ -1021,6 +1087,7 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
             <value xml:lang="en-US">.uno:RepeatSearch</value>
             <value xml:lang="es">.uno:Save</value>
             <value xml:lang="fr">.uno:Bold</value>
+            <value xml:lang="de">.uno:FocusCellAddress</value>
           </prop>
         </node>
         <node oor:name="HOME" oor:op="replace">
@@ -1275,12 +1342,14 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for 
some emoji thing
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="hu">.uno:InsertCurrentDate</value>
+            <value xml:lang="de">.uno:InsertCurrentDate</value>
           </prop>
         </node>
         <node oor:name="POINT_SHIFT_MOD1" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="hu">.uno:InsertCurrentTime</value>
+            <value xml:lang="de">.uno:InsertCurrentTime</value>
           </prop>
         </node>
         <node oor:name="COMMA_MOD1" oor:op="replace">
@@ -1288,7 +1357,6 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="bs">.uno:InsertCurrentDate</value>
             <value xml:lang="da">.uno:InsertCurrentDate</value>
-            <value xml:lang="de">.uno:InsertCurrentDate</value>
             <value xml:lang="es">.uno:InsertCurrentDate</value>
             <value xml:lang="et">.uno:InsertCurrentDate</value>
             <value xml:lang="fi">.uno:InsertCurrentDate</value>
@@ -1314,7 +1382,6 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="bs">.uno:InsertCurrentTime</value>
             <value xml:lang="da">.uno:InsertCurrentTime</value>
-            <value xml:lang="de">.uno:InsertCurrentTime</value>
             <value xml:lang="es">.uno:InsertCurrentTime</value>
             <value xml:lang="et">.uno:InsertCurrentTime</value>
             <value xml:lang="fi">.uno:InsertCurrentTime</value>
@@ -1459,6 +1526,7 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <!-- tdf#142257 Replace Ctrl-[ with Shift-Alt-U for Hungarian -->
             <value xml:lang="hu">.uno:MarkPrecedents</value>
+            <value xml:lang="de">.uno:Zoom100Percent</value>
           </prop>
         </node>
         <node oor:name="V_SHIFT_MOD1" oor:op="replace">
@@ -2998,6 +3066,13 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="en-US">.uno:Forward</value>
+            <value xml:lang="de">.uno:SubScript</value>
+          </prop>
+        </node>
+        <node oor:name="MULTIPLY_MOD1" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">.uno:SuperScript</value>
           </prop>
         </node>
         <node oor:name="ADD_SHIFT_MOD1" oor:op="replace">
@@ -3050,6 +3125,12 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
             <value xml:lang="de">.uno:Dismantle</value>
           </prop>
         </node>
+        <node oor:name="D_MOD1" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">.uno:CopyObjects</value>
+          </prop>
+        </node>
         <node oor:name="DELETE" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
@@ -3099,6 +3180,12 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
             <value xml:lang="en-US" 
install:module="unxwnt">.uno:DesignerDialog</value>
           </prop>
         </node>
+        <node oor:name="F12" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">.uno:SaveAs</value>
+          </prop>
+        </node>
         <node oor:name="F2" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
@@ -3121,6 +3208,7 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="en-US">.uno:CopyObjects</value>
+            <value xml:lang="de">.uno:ChangeCaseRotateCase</value>
           </prop>
         </node>
         <node oor:name="F4" oor:op="replace">
@@ -3189,6 +3277,18 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
             <value xml:lang="en-US">.uno:TextFitToSize</value>
           </prop>
         </node>
+        <node oor:name="F9_SHIFT" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">.uno:GridVisible</value>
+          </prop>
+        </node>
+        <node oor:name="F9_MOD1" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">.uno:ShowRuler</value>
+          </prop>
+        </node>
         <node oor:name="F_MOD1_MOD2" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
@@ -3227,6 +3327,12 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
             <value xml:lang="de" 
install:module="unxwnt">.uno:SuperScript</value>
           </prop>
         </node>
+        <node oor:name="H_SHIFT_MOD1" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">.uno:FormatUngroup</value>
+          </prop>
+        </node>
         <node oor:name="HOME_SHIFT_MOD2" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
@@ -3378,6 +3484,12 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
             <value xml:lang="en-US">.uno:ShowRuler</value>
           </prop>
         </node>
+        <node oor:name="SPACE_MOD1" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">.uno:RemoveDirectCharFormats</value>
+          </prop>
+        </node>
         <node oor:name="SPACE_SHIFT_MOD1" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
@@ -5976,12 +6088,14 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for 
some emoji thing
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="en-US">.uno:StyleApply?Style:string=Heading 
1&amp;FamilyName:string=ParagraphStyles</value>
+            <value xml:lang="de">.uno:SpacePara1</value>
           </prop>
         </node>
         <node oor:name="2_MOD1" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="en-US">.uno:StyleApply?Style:string=Heading 
2&amp;FamilyName:string=ParagraphStyles</value>
+            <value xml:lang="de">.uno:SpacePara2</value>
           </prop>
         </node>
         <node oor:name="3_MOD1" oor:op="replace">
@@ -6000,6 +6114,7 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="en-US">.uno:StyleApply?Style:string=Heading 
5&amp;FamilyName:string=ParagraphStyles</value>
+            <value xml:lang="de">.uno:SpacePara15</value>
           </prop>
         </node>
         <node oor:name="8_MOD1" oor:op="replace">
@@ -6044,6 +6159,12 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="en-US">.uno:CalculateSel</value>
+            <value xml:lang="de">.uno:SuperScript</value>
+          </prop>
+        </node>
+        <node oor:name="ADD_SHIFT_MOD1" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="de">.uno:CalculateSel</value>
           </prop>
         </node>
         <node oor:name="A_SHIFT_MOD1" oor:op="replace">
@@ -6130,6 +6251,12 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
             <value xml:lang="en-US">.uno:SubScript</value>
           </prop>
         </node>
+        <node oor:name="C_SHIFT_MOD1" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">.uno:FormatPaintbrush</value>
+          </prop>
+        </node>
         <node oor:name="DELETE_MOD1" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
@@ -6146,6 +6273,13 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="en-US">.uno:InsertZWSP</value>
+            <value xml:lang="de">.uno:DefaultNumbering</value>
+          </prop>
+        </node>
+        <node oor:name="POINT_MOD1" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">.uno:DefaultBullet</value>
           </prop>
         </node>
         <node oor:name="DOWN" oor:op="replace">
@@ -6188,12 +6322,14 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for 
some emoji thing
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="en-US">.uno:UnderlineDouble</value>
+            <value xml:lang="de">.uno:FontDialog</value>
           </prop>
         </node>
         <node oor:name="D_SHIFT_MOD1" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="en-US">.uno:ParaRightToLeft</value>
+            <value xml:lang="de">.uno:UnderlineDouble</value>
           </prop>
         </node>
         <node oor:name="END" oor:op="replace">
@@ -6273,6 +6409,7 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="en-US">.uno:DefaultNumbering</value>
+            <value xml:lang="de">.uno:SaveAs</value>
           </prop>
         </node>
         <node oor:name="F12_MOD1" oor:op="replace">
@@ -6339,6 +6476,7 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="en-US">.uno:Navigator</value>
+            <value xml:lang="de">.uno:GotoPage</value>
           </prop>
         </node>
         <node oor:name="F5_MOD1" oor:op="replace">
@@ -6431,6 +6569,12 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
             <value xml:lang="en-US">.uno:UpdateInputFields</value>
           </prop>
         </node>
+        <node oor:name="F_SHIFT_MOD2" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">vnd.sun.star.findbar:FocusToFindbar</value>
+          </prop>
+        </node>
         <node oor:name="F_MOD1_MOD2" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
@@ -6445,6 +6589,12 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
             <value xml:lang="en-US" 
install:module="unxwnt">.uno:RepeatSearch</value>
           </prop>
         </node>
+        <node oor:name="F_MOD1" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">.uno:Navigator</value>
+          </prop>
+        </node>
         <node oor:name="G_MOD1" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
@@ -6478,12 +6628,6 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
             <value xml:lang="en-US">.uno:StartOfDocumentSel</value>
           </prop>
         </node>
-        <node oor:name="H_MOD1" oor:op="replace">
-          <prop oor:name="Command">
-            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
-            <value xml:lang="de" 
install:module="unxwnt">.uno:SuperScript</value>
-          </prop>
-        </node>
         <node oor:name="INSERT" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
@@ -6524,12 +6668,14 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for 
some emoji thing
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="es">.uno:Italic</value>
+            <value xml:lang="de">.uno:HyperlinkDialog</value>
           </prop>
         </node>
         <node oor:name="K_MOD1_MOD2" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="es">.uno:HyperlinkDialog</value>
+            <value xml:lang="de">.uno:Italic</value>
           </prop>
         </node>
         <node oor:name="K_SHIFT_MOD1" oor:op="replace">
@@ -6569,16 +6715,35 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for 
some emoji thing
             <value xml:lang="en-US">.uno:LeftPara</value>
           </prop>
         </node>
+        <node oor:name="L_SHIFT_MOD1" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="en-US">.uno:DefaultBullet</value>
+          </prop>
+        </node>
         <node oor:name="MULTIPLY_MOD1" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="en-US">.uno:ExecuteMacroField</value>
+            <value xml:lang="de">.uno:ControlCodes</value>
+          </prop>
+        </node>
+        <node oor:name="MULTIPLY_MOD1_MOD2" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="de">.uno:ExecuteMacroField</value>
           </prop>
         </node>
         <node oor:name="M_MOD1" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
             <value xml:lang="en-US" 
install:module="unxwnt">.uno:ResetAttributes</value>
+            <value xml:lang="de">.uno:IncrementIndent</value>
+          </prop>
+        </node>
+        <node oor:name="M_SHIFT_MOD1" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">.uno:DecrementIndent</value>
           </prop>
         </node>
         <node oor:name="M_MOD3" oor:op="replace">
@@ -6659,6 +6824,12 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
             <value xml:lang="en-US">.uno:SuperScript</value>
           </prop>
         </node>
+        <node oor:name="Q_SHIFT_MOD1" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">.uno:SmallCaps</value>
+          </prop>
+        </node>
         <node oor:name="Y_SHIFT_MOD1" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
@@ -6725,6 +6896,12 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
             <value xml:lang="en-US">.uno:Ruler</value>
           </prop>
         </node>
+        <node oor:name="SPACE_MOD1" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">.uno:ResetAttributes</value>
+          </prop>
+        </node>
         <node oor:name="SPACE_SHIFT_MOD1" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
@@ -6758,7 +6935,7 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
         <node oor:name="T_MOD1" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
-            <value xml:lang="de" install:module="unxwnt">.uno:SubScript</value>
+            <value xml:lang="de">.uno:SubScript</value>
             <value xml:lang="es" 
install:module="unxwnt">.uno:CenterPara</value>
             <value xml:lang="en-US" 
install:module="macosx">.uno:DesignerDialog</value>
           </prop>
@@ -6830,6 +7007,12 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some 
emoji thing
             <value xml:lang="en-US">.uno:PasteSpecial</value>
           </prop>
         </node>
+        <node oor:name="V_MOD1_MOD2" oor:op="replace">
+          <prop oor:name="Command">
+            <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
+            <value xml:lang="de">.uno:PasteSpecial</value>
+          </prop>
+        </node>
         <node oor:name="X_SHIFT_MOD1" oor:op="replace">
           <prop oor:name="Command">
             <value xml:lang="x-no-translate">L10N SHORTCUTS - NO 
TRANSLATE</value>
commit 5524e31520c5c319105feb57080f724d4ec8ade3
Author:     Noel Grandin <[email protected]>
AuthorDate: Tue Mar 26 13:35:53 2024 +0200
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:19 2024 +0100

    tdf#159805 Printing line style dotted lines (horizontal) turns into dashes.
    
    I could not find a good place to distinguish between the dragging
    visualisation (where we could safely use approximation), and the
    non-dragging case, so just revert.
    
    Revert
        commit 9f4ccc63346b26d8d774b22124da0842ef18e0bc
        Author: Noel Grandin <[email protected]>
        Date:   Wed Sep 13 14:27:02 2023 +0200
        tdf#156995 speed up dragging complex group objects
    
    Change-Id: I2ba52f07ea7299643c0f145459038e368a17dea8
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165332
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <[email protected]>
    (cherry picked from commit fc5d84681d5d898b56171a9622294ecb23623bfd)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165320
    Reviewed-by: Xisco Fauli <[email protected]>

diff --git a/basegfx/source/polygon/b2dpolygontools.cxx 
b/basegfx/source/polygon/b2dpolygontools.cxx
index b3f43669ddf4..d33c752008b4 100644
--- a/basegfx/source/polygon/b2dpolygontools.cxx
+++ b/basegfx/source/polygon/b2dpolygontools.cxx
@@ -475,7 +475,7 @@ namespace basegfx::utils
             return fRetval;
         }
 
-        double getLength(const B2DPolygon& rCandidate, bool 
bApproximateBezierLength)
+        double getLength(const B2DPolygon& rCandidate)
         {
             double fRetval(0.0);
             const sal_uInt32 nPointCount(rCandidate.count());
@@ -486,45 +486,18 @@ namespace basegfx::utils
 
                 if(rCandidate.areControlPointsUsed())
                 {
-                    if (bApproximateBezierLength)
-                    {
-                        B2DPoint aStartPoint = rCandidate.getB2DPoint(0);
-
-                        for(sal_uInt32 a(0); a < nEdgeCount; a++)
-                        {
-                            // An approximate length of a cubic Bezier curve 
is the average
-                            // of its chord length and the sum of the lengths 
of its control net sides.
-                            const sal_uInt32 nNextIndex((a + 1) % nPointCount);
-                            const B2DPoint& aControlPoint1 = 
rCandidate.getNextControlPoint(a);
-                            const B2DPoint& aControlPoint2 = 
rCandidate.getPrevControlPoint(nNextIndex);
-                            const B2DPoint& aEndPoint = 
rCandidate.getB2DPoint(nNextIndex);
-
-                            double chord_length = B2DVector(aEndPoint - 
aStartPoint).getLength();
-                            double control_net_length = B2DVector(aStartPoint 
- aControlPoint1).getLength()
-                                + B2DVector(aControlPoint2 - 
aControlPoint1).getLength()
-                                + B2DVector(aEndPoint - 
aControlPoint2).getLength();
-                            double approximate_arc_length = 
(control_net_length + chord_length) / 2;
-
-                            fRetval += approximate_arc_length;
-                            aStartPoint = aEndPoint;
-                        }
+                    B2DCubicBezier aEdge;
+                    aEdge.setStartPoint(rCandidate.getB2DPoint(0));
 
-                    }
-                    else
+                    for(sal_uInt32 a(0); a < nEdgeCount; a++)
                     {
-                        B2DCubicBezier aEdge;
-                        aEdge.setStartPoint(rCandidate.getB2DPoint(0));
-
-                        for(sal_uInt32 a(0); a < nEdgeCount; a++)
-                        {
-                            const sal_uInt32 nNextIndex((a + 1) % nPointCount);
-                            
aEdge.setControlPointA(rCandidate.getNextControlPoint(a));
-                            
aEdge.setControlPointB(rCandidate.getPrevControlPoint(nNextIndex));
-                            
aEdge.setEndPoint(rCandidate.getB2DPoint(nNextIndex));
+                        const sal_uInt32 nNextIndex((a + 1) % nPointCount);
+                        
aEdge.setControlPointA(rCandidate.getNextControlPoint(a));
+                        
aEdge.setControlPointB(rCandidate.getPrevControlPoint(nNextIndex));
+                        aEdge.setEndPoint(rCandidate.getB2DPoint(nNextIndex));
 
-                            fRetval += aEdge.getLength();
-                            aEdge.setStartPoint(aEdge.getEndPoint());
-                        }
+                        fRetval += aEdge.getLength();
+                        aEdge.setStartPoint(aEdge.getEndPoint());
                     }
                 }
                 else
@@ -1259,9 +1232,9 @@ namespace basegfx::utils
             // precalculate maximal acceptable length of candidate polygon 
assuming
             // we want to create a maximum of fNumberOfAllowedSnippets. For
             // fNumberOfAllowedSnippets use ca. 65536, double due to line & 
gap.
-            static const double fNumberOfAllowedSnippets(100.0 * 2.0);
+            static const double fNumberOfAllowedSnippets(65535.0 * 2.0);
             const double fAllowedLength((fNumberOfAllowedSnippets * 
fDotDashLength) / double(rDotDashArray.size()));
-            const double 
fCandidateLength(basegfx::utils::getLength(rCandidate, 
/*bApproximateBezierLength*/true));
+            const double 
fCandidateLength(basegfx::utils::getLength(rCandidate));
             std::vector<double> aDotDashArray(rDotDashArray);
 
             if(fCandidateLength > fAllowedLength)
diff --git a/include/basegfx/polygon/b2dpolygontools.hxx 
b/include/basegfx/polygon/b2dpolygontools.hxx
index d21d0bb63bfe..a29d1fd06a52 100644
--- a/include/basegfx/polygon/b2dpolygontools.hxx
+++ b/include/basegfx/polygon/b2dpolygontools.hxx
@@ -113,7 +113,7 @@ namespace basegfx::utils
         BASEGFX_DLLPUBLIC double getEdgeLength(const B2DPolygon& rCandidate, 
sal_uInt32 nIndex);
 
         /** get length of polygon */
-        BASEGFX_DLLPUBLIC double getLength(const B2DPolygon& rCandidate, bool 
bApproximateBezierLength = false);
+        BASEGFX_DLLPUBLIC double getLength(const B2DPolygon& rCandidate);
 
         // get position on polygon for absolute given distance. If
         // length is given, it is assumed the correct polygon length, if 0.0 
it is calculated
commit 405e0519725a3edc8a75fc0a4aa05ed5f0dbc255
Author:     Xisco Fauli <[email protected]>
AuthorDate: Tue Mar 26 14:13:21 2024 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:19 2024 +0100

    tdf#160373: Iterate over all parents to check whether it's a clipPath 
content
    
    Change-Id: I383ec264e4c88ebcee2ae6a839b762bba8abfc12
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165347
    Tested-by: Jenkins
    Reviewed-by: Xisco Fauli <[email protected]>
    (cherry picked from commit 261985b6936ede212852e806c4b140ea634a5af3)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165317
    Reviewed-by: Stéphane Guillou <[email protected]>

diff --git a/svgio/inc/svgstyleattributes.hxx b/svgio/inc/svgstyleattributes.hxx
index bf921f8b1bb0..c5c095462f3d 100644
--- a/svgio/inc/svgstyleattributes.hxx
+++ b/svgio/inc/svgstyleattributes.hxx
@@ -243,10 +243,6 @@ namespace svgio::svgreader
 
             mutable std::vector<sal_uInt16> maResolvingParent;
 
-            // defines if this attributes are part of a ClipPath. If yes,
-            // rough geometry will be created on decomposition by patching
-            // values for fill, stroke, strokeWidth and others
-            bool                        mbIsClipPathContent : 1;
 
             // #121221# Defines if evtl. an empty array *is* set
             bool                        mbStrokeDasharraySet : 1;
@@ -318,6 +314,11 @@ namespace svgio::svgreader
             SvgStyleAttributes(SvgNode& rOwner);
             ~SvgStyleAttributes();
 
+            // Check if this attribute is part of a ClipPath.
+            // If so, rough geometry will be created on decomposition by 
patching
+            // values for fill, stroke, strokeWidth and others
+            bool isClipPathContent() const;
+
             /// fill content
             bool isFillSet() const; // #i125258# ask if fill is a direct hard 
attribute (no hierarchy)
             const basegfx::BColor* getFill() const;
diff --git a/svgio/qa/cppunit/SvgImportTest.cxx 
b/svgio/qa/cppunit/SvgImportTest.cxx
index 0c088baf2ab3..75d42adf4397 100644
--- a/svgio/qa/cppunit/SvgImportTest.cxx
+++ b/svgio/qa/cppunit/SvgImportTest.cxx
@@ -457,6 +457,20 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf156168)
     assertXPath(pDocument, 
"/primitive2D/transform/polypolygonstroke[4]/line"_ostr, "color"_ostr, 
"#00ff00");
 }
 
+CPPUNIT_TEST_FIXTURE(Test, testTdf160373)
+{
+    Primitive2DSequence aSequence = 
parseSvg(u"/svgio/qa/cppunit/data/tdf160373.svg");
+    CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(aSequence.getLength()));
+
+    drawinglayer::Primitive2dXmlDump dumper;
+    xmlDocUniquePtr pDocument = dumper.dumpAndParse(aSequence);
+
+    CPPUNIT_ASSERT (pDocument);
+
+    // Without the fix in place, nothing would be displayed
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor"_ostr, "color"_ostr, 
"#0000ff");
+}
+
 CPPUNIT_TEST_FIXTURE(Test, testTdf129356)
 {
     Primitive2DSequence aSequence = 
parseSvg(u"/svgio/qa/cppunit/data/tdf129356.svg");
diff --git a/svgio/qa/cppunit/data/tdf160373.svg 
b/svgio/qa/cppunit/data/tdf160373.svg
new file mode 100644
index 000000000000..73b18bb2ea61
--- /dev/null
+++ b/svgio/qa/cppunit/data/tdf160373.svg
@@ -0,0 +1,14 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' 
xmlns:xlink='http://www.w3.org/1999/xlink' width='503.75pt' height='503.25pt' 
viewBox='0 0 503.75 503.25'>
+<defs>
+  <style type='text/css'><![CDATA[
+     rect { fill: none; }
+  ]]></style>
+</defs>
+  <clipPath id='cpMC4wMHw1MDMuNzV8MC4wMHw1MDMuMjU='>
+    <rect x='0.00' y='0.00' width='503.75' height='503.25' />
+  </clipPath>
+<g clip-path='url(#cpMC4wMHw1MDMuNzV8MC4wMHw1MDMuMjU=)'>
+<rect class="r5" x="10" y="0" height="50" width="50" style="fill:blue"></rect>
+</g>
+</svg>
diff --git a/svgio/source/svgreader/svgstyleattributes.cxx 
b/svgio/source/svgreader/svgstyleattributes.cxx
index 19070989bb55..58bdb9add84b 100644
--- a/svgio/source/svgreader/svgstyleattributes.cxx
+++ b/svgio/source/svgreader/svgstyleattributes.cxx
@@ -1287,18 +1287,9 @@ namespace svgio::svgreader
             maBaselineShift(BaselineShift::Baseline),
             maBaselineShiftNumber(0),
             maDominantBaseline(DominantBaseline::Auto),
-            maResolvingParent(31, 0),
-            mbIsClipPathContent(SVGToken::ClipPathNode == mrOwner.getType()),
+            maResolvingParent(32, 0),
             mbStrokeDasharraySet(false)
         {
-            const SvgStyleAttributes* pParentStyle = getParentStyle();
-            if(!mbIsClipPathContent)
-            {
-                if(pParentStyle)
-                {
-                    mbIsClipPathContent = pParentStyle->mbIsClipPathContent;
-                }
-            }
         }
 
         SvgStyleAttributes::~SvgStyleAttributes()
@@ -2005,10 +1996,27 @@ namespace svgio::svgreader
             }
         }
 
+        bool SvgStyleAttributes::isClipPathContent() const
+        {
+            if (SVGToken::ClipPathNode == mrOwner.getType())
+                return true;
+
+            const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
+            if (pSvgStyleAttributes && maResolvingParent[31] < 
nStyleDepthLimit)
+            {
+                ++maResolvingParent[31];
+                bool ret = pSvgStyleAttributes->isClipPathContent();
+                --maResolvingParent[31];
+                return ret;
+            }
+
+            return false;
+        }
+
         // #i125258# ask if fill is a direct hard attribute (no hierarchy)
         bool SvgStyleAttributes::isFillSet() const
         {
-            if(mbIsClipPathContent)
+            if(isClipPathContent())
             {
                 return false;
             }
@@ -2042,7 +2050,7 @@ namespace svgio::svgreader
                 {
                     return &maFill.getBColor();
                 }
-                else if(mbIsClipPathContent)
+                else if(isClipPathContent())
                 {
                     const SvgStyleAttributes* pSvgStyleAttributes = 
getParentStyle();
 
@@ -2066,7 +2074,7 @@ namespace svgio::svgreader
                     const basegfx::BColor* pFill = 
pSvgStyleAttributes->getFill();
                     --maResolvingParent[0];
 
-                    if(mbIsClipPathContent)
+                    if(isClipPathContent())
                     {
                         if (pFill)
                         {
@@ -2269,7 +2277,7 @@ namespace svgio::svgreader
                 return ret;
             }
 
-            if(mbIsClipPathContent)
+            if(isClipPathContent())
             {
                 return SvgNumber(0.0);
             }
commit 260428759593c7023a0739f4f8979091e7d9d6f7
Author:     Justin Luth <[email protected]>
AuthorDate: Mon Mar 25 19:20:32 2024 -0400
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:19 2024 +0100

    tdf#129905 tdf#160365 sw: don't always draw text boundary on frames
    
    This fixes a 7.6 regression caused by
    commit 79811c27f34d3e752de1bc3959605c5d58ac2365
        tdf#129905 Create toggle for Section boundaries
    
    This fixes the toggle for View - Text boundaries,
    so now images can have their thin gray border removed.
    
    This also fixes the toggle for View - Table boundaries.
    
    Change-Id: Idb75debf173d64b14a6864c61b4524e46898975f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165297
    Reviewed-by: Justin Luth <[email protected]>
    Tested-by: Jenkins
    Reviewed-by: Rafael Lima <[email protected]>
    Reviewed-by: Miklos Vajna <[email protected]>
    (cherry picked from commit 47af9e64a573684eb42faa097e327e31777a2b58)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165311

diff --git a/sw/source/core/layout/paintfrm.cxx 
b/sw/source/core/layout/paintfrm.cxx
index e0e1f41f54ad..46c9189f0dfd 100644
--- a/sw/source/core/layout/paintfrm.cxx
+++ b/sw/source/core/layout/paintfrm.cxx
@@ -7012,7 +7012,8 @@ void SwPageFrame::RefreshSubsidiary( const SwRect &rRect 
) const
 void SwLayoutFrame::RefreshLaySubsidiary( const SwPageFrame *pPage,
                                         const SwRect &rRect ) const
 {
-    const bool bSubsOpt = isSubsidiaryLinesEnabled() || 
isSubsidiaryLinesForSectionsEnabled();
+    const bool bSubsOpt
+        = isSubsidiaryLinesEnabled() || (IsSctFrame() && 
isSubsidiaryLinesForSectionsEnabled());
     if ( bSubsOpt )
         PaintSubsidiaryLines( pPage, rRect );
 
commit 3b03f60f18216c6d002fc609c5b9b5410e3a2853
Author:     Julien Nabet <[email protected]>
AuthorDate: Mon Mar 25 13:59:06 2024 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:19 2024 +0100

    Related tdf#160351: the field name can be shorter than two symbols
    
    Change-Id: Ieb6b78b3f9802e66de642a9e708b11c55c0d9a11
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165285
    Tested-by: Jenkins
    Reviewed-by: Julien Nabet <[email protected]>
    (cherry picked from commit 02609da5ee8188cb00fc0b97052d2cc8d2576900)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165249
    Reviewed-by: Xisco Fauli <[email protected]>

diff --git a/sw/source/ui/index/cnttab.cxx b/sw/source/ui/index/cnttab.cxx
index f07cf8ab2883..535dc298dd5a 100644
--- a/sw/source/ui/index/cnttab.cxx
+++ b/sw/source/ui/index/cnttab.cxx
@@ -3140,7 +3140,7 @@ void SwTokenWindow::InsertAtSelection(const SwFormToken& 
rToken)
         //use the first two chars as symbol
         OUString sTmp(SwAuthorityFieldType::GetAuthFieldName(
                     
static_cast<ToxAuthorityField>(aToInsertToken.nAuthorityField)));
-        pButton->SetText(sTmp.copy(0, 2));
+        pButton->SetText(sTmp.copy(0, std::min(sTmp.getLength(), 
sal_Int32(2))));
     }
 
     pButton->Check();
commit 645eb3ecac324a9dddc3b47186a75d08ce0ea1a7
Author:     Mike Kaganski <[email protected]>
AuthorDate: Mon Mar 25 17:41:24 2024 +0500
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:19 2024 +0100

    tdf#160351: the field name can be shorter than two symbols
    
    Change-Id: Id834ae2919661752b921510f766c9e9ff7fc16fd
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165282
    Reviewed-by: Julien Nabet <[email protected]>
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <[email protected]>
    (cherry picked from commit 4a14bad7232ecf23d23c1997dc20922d0b4892cb)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165246
    Reviewed-by: Xisco Fauli <[email protected]>

diff --git a/sw/source/ui/index/cnttab.cxx b/sw/source/ui/index/cnttab.cxx
index a5d3bf92ddef..f07cf8ab2883 100644
--- a/sw/source/ui/index/cnttab.cxx
+++ b/sw/source/ui/index/cnttab.cxx
@@ -2933,7 +2933,7 @@ SwTOXWidget* SwTokenWindow::InsertItem(const OUString& 
rText, const SwFormToken&
             //use the first two chars as symbol
             OUString sTmp(SwAuthorityFieldType::GetAuthFieldName(
                         
static_cast<ToxAuthorityField>(rToken.nAuthorityField)));
-            pButton->SetText(sTmp.copy(0, 2));
+            pButton->SetText(sTmp.copy(0, std::min(sTmp.getLength(), 
sal_Int32(2))));
         }
 
         sal_uInt32 nIndex = GetControlIndex( rToken.eTokenType );
commit 14b579b580545631169e073540af4121f980a7af
Author:     Xisco Fauli <[email protected]>
AuthorDate: Mon Mar 25 12:14:07 2024 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:19 2024 +0100

    openldap: upgrade to release 2.6.7
    
    Change-Id: I7716a41114442ba7a57d81192b01cbeaaeca08b6
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165280
    Tested-by: Jenkins
    Reviewed-by: Xisco Fauli <[email protected]>
    (cherry picked from commit 9a0b37a5337faee5634cc9fce4955da204b95bf4)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165247
    Reviewed-by: Taichi Haradaguchi <[email protected]>

diff --git a/download.lst b/download.lst
index 0dd07605294e..d5654272cd2d 100644
--- a/download.lst
+++ b/download.lst
@@ -566,8 +566,8 @@ ONLINEUPDATE_TARBALL := 
onlineupdate-c003be8b9727672e7d30972983b375f4c200233f-2.
 # three static lines
 # so that git cherry-pick
 # will not run into conflicts
-OPENLDAP_SHA256SUM := 
082e998cf542984d43634442dbe11da860759e510907152ea579bdc42fe39ea0
-OPENLDAP_TARBALL := openldap-2.6.6.tgz
+OPENLDAP_SHA256SUM := 
cd775f625c944ed78a3da18a03b03b08eea73c8aabc97b41bb336e9a10954930
+OPENLDAP_TARBALL := openldap-2.6.7.tgz
 # three static lines
 # so that git cherry-pick
 # will not run into conflicts
commit 880076e806ead26ede716b48fd2502235dc41c08
Author:     Xisco Fauli <[email protected]>
AuthorDate: Wed Mar 20 10:26:11 2024 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:19 2024 +0100

    libxml2: upgrade to release 2.12.6
    
    Change-Id: I7372b276f74bc760c99580ffc509fde1031cb3a6
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165049
    Tested-by: Jenkins
    Reviewed-by: Xisco Fauli <[email protected]>
    (cherry picked from commit 832b98cedda2cd1631651f9397a871fb50d9cb1f)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165183
    Reviewed-by: Taichi Haradaguchi <[email protected]>

diff --git a/download.lst b/download.lst
index 659bdb33d52f..0dd07605294e 100644
--- a/download.lst
+++ b/download.lst
@@ -487,8 +487,8 @@ XMLSEC_TARBALL := xmlsec1-1.3.2.tar.gz
 # three static lines
 # so that git cherry-pick
 # will not run into conflicts
-LIBXML_SHA256SUM := 
a972796696afd38073e0f59c283c3a2f5a560b5268b4babc391b286166526b21
-LIBXML_VERSION_MICRO := 5
+LIBXML_SHA256SUM := 
889c593a881a3db5fdd96cc9318c87df34eb648edfc458272ad46fd607353fbb
+LIBXML_VERSION_MICRO := 6
 LIBXML_TARBALL := libxml2-2.12.$(LIBXML_VERSION_MICRO).tar.xz
 # three static lines
 # so that git cherry-pick
commit 5eaab9fa3d1b9b222ce94aaf2bcdd1c9facf52a9
Author:     Xisco Fauli <[email protected]>
AuthorDate: Wed Mar 20 10:49:53 2024 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:19 2024 +0100

    libpng: upgrade to 1.6.43
    
    Change-Id: Ia1ddc21dc521cf97b75a64d806417cbfe5dec623
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165050
    Tested-by: Xisco Fauli <[email protected]>
    Reviewed-by: Xisco Fauli <[email protected]>
    (cherry picked from commit f29222eaf385891620d4868827b27e734752018e)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165182
    Tested-by: Jenkins
    Reviewed-by: Taichi Haradaguchi <[email protected]>

diff --git a/download.lst b/download.lst
index ac5450d33473..659bdb33d52f 100644
--- a/download.lst
+++ b/download.lst
@@ -596,8 +596,8 @@ PIXMAN_TARBALL := pixman-0.42.2.tar.gz
 # three static lines
 # so that git cherry-pick
 # will not run into conflicts
-LIBPNG_SHA256SUM := 
c919dbc11f4c03b05aba3f8884d8eb7adfe3572ad228af972bb60057bdb48450
-LIBPNG_TARBALL := libpng-1.6.42.tar.xz
+LIBPNG_SHA256SUM := 
6a5ca0652392a2d7c9db2ae5b40210843c0bbc081cbd410825ab00cc59f14a6c
+LIBPNG_TARBALL := libpng-1.6.43.tar.xz
 # three static lines
 # so that git cherry-pick
 # will not run into conflicts
commit 50c61e93fbfeddccd0d50899a4c7770a0436794e
Author:     Michael Stahl <[email protected]>
AuthorDate: Thu Mar 14 12:14:28 2024 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:19 2024 +0100

    sw: fix ~SwIndexReg assert in testTdf149498
    
    The problem is that a SwNavigationMgr thingy has a cursor in one of the
    table cells, and the text node is moved to the undo nodes array in
    SwUndoTableCpyTable::AddBoxBefore() and deleted in
    SwUndoTableCpyTable::UndoImpl().
    
    SwUndoTableCpyTable needs to move the cursors out of the way because
    SwUndoDelete doesn't do it.
    
    Change-Id: I75e271c84a6624ffb0df151b171acb1e1f743928
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164807
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <[email protected]>
    (cherry picked from commit 873af30a36504751c6923d4235abd4de040e0001)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164820
    Reviewed-by: Xisco Fauli <[email protected]>

diff --git a/sw/qa/extras/uiwriter/uiwriter5.cxx 
b/sw/qa/extras/uiwriter/uiwriter5.cxx
index c6353f980d29..702f6d7dd30e 100644
--- a/sw/qa/extras/uiwriter/uiwriter5.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter5.cxx
@@ -3007,7 +3007,6 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest5, testTdf156487)
     assertXPath(pXmlDoc, "/metafile/push/push/push/textarray/text"_ostr, 1);
 }
 
-#ifndef DBG_UTIL
 CPPUNIT_TEST_FIXTURE(SwUiWriterTest5, testTdf149498)
 {
     // load a table, and delete the first column with enabled change tracking:
@@ -3023,7 +3022,6 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest5, testTdf149498)
     // this would crash due to bookmark over cell boundary
     dispatchCommand(mxComponent, ".uno:Undo", {});
 }
-#endif
 
 CPPUNIT_TEST_FIXTURE(SwUiWriterTest5, 
testTdf150673_RedlineTableColumnDeletionWithExport)
 {
diff --git a/sw/source/core/undo/untbl.cxx b/sw/source/core/undo/untbl.cxx
index 72f1c809e227..52157df0cae1 100644
--- a/sw/source/core/undo/untbl.cxx
+++ b/sw/source/core/undo/untbl.cxx
@@ -2599,11 +2599,17 @@ void SwUndoTableCpyTable::AddBoxBefore( const 
SwTableBox& rBox, bool bDelContent
     if( bDelContent )
     {
         SwNodeIndex aInsIdx( *rBox.GetSttNd(), 1 );
-        pDoc->GetNodes().MakeTextNode( aInsIdx.GetNode(), 
pDoc->GetDfltTextFormatColl() );
+        SwTextNode *const 
pNewNode(pDoc->GetNodes().MakeTextNode(aInsIdx.GetNode(), 
pDoc->GetDfltTextFormatColl()));
         SwPaM aPam( aInsIdx.GetNode(), *rBox.GetSttNd()->EndOfSectionNode() );
 
         if( !pDoc->getIDocumentRedlineAccess().IsRedlineOn() )
+        {
+            {   // move cursors to new node which precedes aPam
+                SwPosition const pos(*pNewNode, 0);
+                ::PaMCorrAbs(aPam, pos);
+            }
             pEntry->pUndo = std::make_unique<SwUndoDelete>(aPam, 
SwDeleteFlags::Default, true);
+        }
     }
 
     pEntry->pBoxNumAttr = std::make_unique<SfxItemSetFixed<
@@ -2627,6 +2633,13 @@ void SwUndoTableCpyTable::AddBoxAfter( const SwTableBox& 
rBox, const SwNodeIndex
         SwDoc* pDoc = rBox.GetFrameFormat()->GetDoc();
         DEBUG_REDLINE( pDoc )
 
+        {   // move cursors to first node which was inserted
+            SwPaM pam(SwNodeIndex(*rBox.GetSttNd(), 1));
+            assert(pam.GetPoint()->GetNode().IsTextNode());
+            pam.SetMark();
+            pam.Move(fnMoveForward, GoInContent);
+            ::PaMCorrAbs(pam, *pam.GetPoint());
+        }
         if( pDoc->getIDocumentRedlineAccess().IsRedlineOn() )
         {
             SwPosition aTmpPos( rIdx );
commit 83196d6bc8ca4b3d60ed2243224398c3ef04d690
Author:     Caolán McNamara <[email protected]>
AuthorDate: Tue Mar 19 08:46:45 2024 +0000
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:19 2024 +0100

    null deref in initial sc html fuzzing
    
    Change-Id: I368db8fec4cfd9409197d17f2892153aca2ba502
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165019
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <[email protected]>
    (cherry picked from commit 85c40af4e9d4c679f66e7f7e004c018dd28994ee)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165005
    Reviewed-by: Xisco Fauli <[email protected]>

diff --git a/sc/source/filter/html/htmlpars.cxx 
b/sc/source/filter/html/htmlpars.cxx
index 77511137258b..e5bcc4d2891b 100644
--- a/sc/source/filter/html/htmlpars.cxx
+++ b/sc/source/filter/html/htmlpars.cxx
@@ -914,7 +914,8 @@ void ScHTMLLayoutParser::CloseEntry( const HtmlImportInfo* 
pInfo )
     if ( bTabInTabCell )
     {   // From the stack in TableOff
         bTabInTabCell = false;
-        NewActEntry(maList.back().get()); // New free flying mxActEntry
+        SAL_WARN_IF(maList.empty(), "sc", "unexpected close entry without 
open");
+        NewActEntry(maList.empty() ? nullptr : maList.back().get()); // New 
free flying mxActEntry
         return ;
     }
     if (mxActEntry->nTab == 0)
commit bc77eea3cd66123d8cf93c651827017a670fd6d4
Author:     Patrick Luby <[email protected]>
AuthorDate: Fri Mar 22 09:44:51 2024 -0400
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:18 2024 +0100

    tdf#152524 fix crash by changing the macOS fork() and exec() process
    
    This fix backports commit 839cf255e2670fdf8e974af38432aacf63be4e90
    and commit 3c6c5ef5d1c4f555b465bf56cf9d99e4d67224cc.
    
    Change-Id: I5dd397a1ab624a048c8892c870b991b381a94f9c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165174
    Reviewed-by: Patrick Luby <[email protected]>
    Reviewed-by: Caolán McNamara <[email protected]>
    Tested-by: Jenkins
    Reviewed-by: Christian Lohmaier <[email protected]>

diff --git a/external/gpgmepp/UnpackedTarball_gpgmepp.mk 
b/external/gpgmepp/UnpackedTarball_gpgmepp.mk
index d7b7a8ab4dbe..dcbda38d591d 100644
--- a/external/gpgmepp/UnpackedTarball_gpgmepp.mk
+++ b/external/gpgmepp/UnpackedTarball_gpgmepp.mk
@@ -34,5 +34,6 @@ $(eval $(call gb_UnpackedTarball_add_patches,gpgmepp, \
     external/gpgmepp/w32-include.patch \
     external/gpgmepp/Wincompatible-function-pointer-types.patch \
     external/gpgmepp/macos-macports-path.patch \
+    external/gpgmepp/macos-tdf152524.patch \
 ))
 # vim: set noet sw=4 ts=4:
diff --git a/external/gpgmepp/macos-tdf152524.patch 
b/external/gpgmepp/macos-tdf152524.patch
new file mode 100644
index 000000000000..c1cdd047dba8
--- /dev/null
+++ b/external/gpgmepp/macos-tdf152524.patch
@@ -0,0 +1,102 @@
+--- src/posix-io.c     2023-02-01 11:50:48
++++ src/posix-io.c     2024-03-21 09:50:24
+@@ -67,6 +67,13 @@
+ #include "priv-io.h"
+ #include "sema.h"
+ #include "debug.h"
++
++#if HAVE_MACOS_SYSTEM
++#include <dispatch/dispatch.h>
++#include <spawn.h>
++
++extern char **environ;
++#endif
+ 
+ 
+ #ifdef USE_LINUX_GETDENTS
+@@ -515,6 +522,15 @@
+     }
+   return 0;
+ }
++
++
++#if HAVE_MACOS_SYSTEM
++static int
++_gpgme_io_spawn_macos (const char *path, char *const argv[], unsigned int 
flags,
++                     struct spawn_fd_item_s *fd_list,
++                     void (*atfork) (void *opaque, int reserved),
++                     void *atforkvalue, pid_t *r_pid);
++#endif /*HAVE_MACOS_SYSTEM*/
+ 
+ 
+ /* Returns 0 on success, -1 on error.  */
+@@ -523,6 +539,35 @@
+                struct spawn_fd_item_s *fd_list,
+                void (*atfork) (void *opaque, int reserved),
+                void *atforkvalue, pid_t *r_pid)
++#if HAVE_MACOS_SYSTEM
++{
++      /* tdf#152524 fork() and exec() in a separate libdispatch queue
++       * This is another attempt to stop the crashing in libdispatch by
++       * running fork() and exec() within a libdispatch task that will
++       * run in a sequential queue in a non-main thread.  */
++      static dispatch_queue_t queue = NULL;
++      if (!queue)
++              queue = dispatch_queue_create ("gpgmepp",
++                                             DISPATCH_QUEUE_CONCURRENT);
++      if (!queue)
++              return -1;
++
++      __block int ret = -1;
++      dispatch_sync(queue, ^{
++              ret = _gpgme_io_spawn_macos (path, argv, flags,
++                                           fd_list, atfork,
++                                           atforkvalue, r_pid);
++      });
++
++      return ret;
++}
++
++static int
++_gpgme_io_spawn_macos (const char *path, char *const argv[], unsigned int 
flags,
++                     struct spawn_fd_item_s *fd_list,
++                     void (*atfork) (void *opaque, int reserved),
++                     void *atforkvalue, pid_t *r_pid)
++#endif /*HAVE_MACOS_SYSTEM*/
+ {
+   pid_t pid;
+   int i;
+@@ -552,8 +597,15 @@
+   if (!pid)
+     {
+       /* Intermediate child to prevent zombie processes.  */
++#if HAVE_MACOS_SYSTEM
++      /* tdf#152524 fix crash by skipping second fork()
++       * Instead of calling a second fork() in the child process, replace
++       * execv() with posix_spawn(). posix_spawn() does not call any atfork
++       * handlers so the atfork handler that crashes will be skipped.  */
++#else /*HAVE_MACOS_SYSTEM*/
+       if ((pid = fork ()) == 0)
+       {
++#endif /*HAVE_MACOS_SYSTEM*/
+         /* Child.  */
+           int max_fds = -1;
+           int fd;
+@@ -664,6 +716,9 @@
+               close (fd);
+           }
+ 
++#if HAVE_MACOS_SYSTEM
++        _exit(posix_spawn(NULL, path, NULL, NULL, argv, environ));
++#else /*HAVE_MACOS_SYSTEM*/
+         execv (path, (char *const *) argv);
+         /* Hmm: in that case we could write a special status code to the
+            status-pipe.  */
+@@ -674,6 +729,7 @@
+       _exit (1);
+       else
+       _exit (0);
++#endif /*HAVE_MACOS_SYSTEM*/
+     }
+ 
+   TRACE_LOG  ("waiting for child process pid=%i", pid);
commit 078bd1a3d4075bd5d89928b1a55792002ab26de7
Author:     Michael Stahl <[email protected]>
AuthorDate: Fri Mar 22 12:28:43 2024 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:18 2024 +0100

    sw: GetSelectableFromAny() broken for SwXTextRange
    
    The function unnecessarily uses an intermediate XUnoTunnel variable to
    handle SwXTextRange, but the implementation of XUnoTunnel was removed.
    
    (regression from commit 635448a996714a81cb15b41ac4bb0c73cabfb74f)
    
    Change-Id: I90dd7acbd259e8ca562a534ad0bc9a5b85356553
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165162
    Reviewed-by: Noel Grandin <[email protected]>
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <[email protected]>
    (cherry picked from commit 8f2de92b3da99346f7282e623d47912f40f92b7b)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165170
    Reviewed-by: Christian Lohmaier <[email protected]>

diff --git a/sw/qa/core/unocore/unocore.cxx b/sw/qa/core/unocore/unocore.cxx
index 381fe0dab3e2..3e52b12a363c 100644
--- a/sw/qa/core/unocore/unocore.cxx
+++ b/sw/qa/core/unocore/unocore.cxx
@@ -78,6 +78,33 @@ CPPUNIT_TEST_FIXTURE(SwCoreUnocoreTest, testTdf119081)
     CPPUNIT_ASSERT_EQUAL(OUString("x"), 
pWrtShell->GetCurrentShellCursor().GetText());
 }
 
+CPPUNIT_TEST_FIXTURE(SwCoreUnocoreTest, selectTextRange)
+{
+    createSwDoc();
+    uno::Reference<text::XTextDocument> const xTD(mxComponent, 
uno::UNO_QUERY_THROW);
+    uno::Reference<text::XText> const xText(xTD->getText());
+    uno::Reference<text::XTextCursor> const xCursor(xText->createTextCursor());
+    xText->insertString(xCursor, "test", /*bAbsorb=*/false);
+    xCursor->gotoStart(false);
+    xCursor->gotoEnd(true);
+    CPPUNIT_ASSERT_EQUAL(OUString("test"), xCursor->getString());
+    uno::Reference<lang::XMultiServiceFactory> const xMSF(mxComponent, 
uno::UNO_QUERY_THROW);
+    uno::Reference<text::XTextSection> const xSection(
+        xMSF->createInstance("com.sun.star.text.TextSection"), 
uno::UNO_QUERY_THROW);
+    xText->insertTextContent(xCursor, xSection, true);
+    uno::Reference<text::XTextRange> const xAnchor(xSection->getAnchor());
+    uno::Reference<view::XSelectionSupplier> const 
xView(xTD->getCurrentController(),
+                                                         uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(OUString("test"), xAnchor->getString());
+    CPPUNIT_ASSERT(xView->select(uno::Any(xAnchor)));
+    uno::Reference<container::XIndexAccess> xSel;
+    CPPUNIT_ASSERT(xView->getSelection() >>= xSel);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSel->getCount());
+    uno::Reference<text::XTextRange> xSelRange;
+    CPPUNIT_ASSERT(xSel->getByIndex(0) >>= xSelRange);
+    CPPUNIT_ASSERT_EQUAL(OUString("test"), xSelRange->getString());
+}
+
 CPPUNIT_TEST_FIXTURE(SwCoreUnocoreTest, flyAtParaAnchor)
 {
     createSwDoc();
diff --git a/sw/source/core/unocore/unocrsrhelper.cxx 
b/sw/source/core/unocore/unocrsrhelper.cxx
index 70a724814cc6..30f6d6e6190e 100644
--- a/sw/source/core/unocore/unocrsrhelper.cxx
+++ b/sw/source/core/unocore/unocrsrhelper.cxx
@@ -225,7 +225,7 @@ void GetSelectableFromAny(uno::Reference<uno::XInterface> 
const& xIfc,
         return;
     }
 
-    uno::Reference<text::XTextRange> const xTextRange(xTunnel, UNO_QUERY);
+    uno::Reference<text::XTextRange> const xTextRange(xIfc, UNO_QUERY);
     if (xTextRange.is())
     {
         SwUnoInternalPaM aPam(rTargetDoc);
commit 7b87cfdd49701f51c5f7c8f041e6ebacad5737bc
Author:     Taichi Haradaguchi <[email protected]>
AuthorDate: Fri Mar 22 13:43:14 2024 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:18 2024 +0100

    Expat: upgrade to release 2.6.2
    
    Fixes CVE-2024-28757
    
    Change-Id: Id85044fa9d8eda922425e580e9d6979f6563e98a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165129
    Tested-by: Taichi Haradaguchi <[email protected]>
    Reviewed-by: Taichi Haradaguchi <[email protected]>
    (cherry picked from commit 370ca73a45b291e172918b4c8fcbc37ccaa434cf)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165175
    Tested-by: Jenkins
    Reviewed-by: Xisco Fauli <[email protected]>

diff --git a/download.lst b/download.lst
index 67e531e65b0b..ac5450d33473 100644
--- a/download.lst
+++ b/download.lst
@@ -111,8 +111,8 @@ ETONYEK_TARBALL := 
libetonyek-0.1.$(ETONYEK_VERSION_MICRO).tar.xz
 # three static lines
 # so that git cherry-pick
 # will not run into conflicts
-EXPAT_SHA256SUM := 
cb5f5a8ea211e1cabd59be0a933a52e3c02cc326e86a4d387d8d218e7ee47a3e
-EXPAT_TARBALL := expat-2.6.0.tar.xz
+EXPAT_SHA256SUM := 
ee14b4c5d8908b1bec37ad937607eab183d4d9806a08adee472c3c3121d27364
+EXPAT_TARBALL := expat-2.6.2.tar.xz
 # three static lines
 # so that git cherry-pick
 # will not run into conflicts
diff --git a/external/expat/0001-Fix-compiler-warnings.patch 
b/external/expat/0001-Fix-compiler-warnings.patch
deleted file mode 100644
index adec5ed0d9be..000000000000
--- a/external/expat/0001-Fix-compiler-warnings.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From 3f60a47cb5716bb810789a12ef6024c1dc448164 Mon Sep 17 00:00:00 2001
-From: Taichi Haradaguchi <[email protected]>
-Date: Fri, 9 Feb 2024 19:28:35 +0900
-Subject: [PATCH] Fix compiler warnings
-
-> In file included from ./../lib/internal.h:149,
->                  from codepage.c:38:
-> ./../lib/expat.h:1045:5: warning: "XML_GE" is not defined, evaluates to 0 
[-Wundef]
->  1045 | #if XML_GE == 1
->       |     ^~~~~~
-> ./../lib/internal.h:158:5: warning: "XML_GE" is not defined, evaluates to 0 
[-Wundef]
->   158 | #if XML_GE == 1
->       |     ^~~~~~
----
- expat/lib/expat.h    | 2 +-
- expat/lib/internal.h | 2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/expat/lib/expat.h b/expat/lib/expat.h
-index 95464b0d..79bbfb61 100644
---- a/expat/lib/expat.h
-+++ b/expat/lib/expat.h
-@@ -1042,7 +1042,7 @@ typedef struct {
- XMLPARSEAPI(const XML_Feature *)
- XML_GetFeatureList(void);
- 
--#if XML_GE == 1
-+#if defined(XML_GE) && XML_GE == 1
- /* Added in Expat 2.4.0 for XML_DTD defined and
-  * added in Expat 2.6.0 for XML_GE == 1. */
- XMLPARSEAPI(XML_Bool)
-diff --git a/expat/lib/internal.h b/expat/lib/internal.h
-index cce71e4c..208c6b67 100644
---- a/expat/lib/internal.h
-+++ b/expat/lib/internal.h
-@@ -155,7 +155,7 @@ extern "C" {
- void _INTERNAL_trim_to_complete_utf8_characters(const char *from,
-                                                 const char **fromLimRef);
- 
--#if XML_GE == 1
-+#if defined(XML_GE) && XML_GE == 1
- unsigned long long testingAccountingGetCountBytesDirect(XML_Parser parser);
- unsigned long long testingAccountingGetCountBytesIndirect(XML_Parser parser);
- const char *unsignedCharToPrintable(unsigned char c);
--- 
-2.43.1
-
diff --git a/external/expat/UnpackedTarball_expat.mk 
b/external/expat/UnpackedTarball_expat.mk
index 465105f2ca8c..5d4f41f6d147 100644
--- a/external/expat/UnpackedTarball_expat.mk
+++ b/external/expat/UnpackedTarball_expat.mk
@@ -13,10 +13,7 @@ $(eval $(call 
gb_UnpackedTarball_set_tarball,expat,$(EXPAT_TARBALL)))
 
 $(eval $(call gb_UnpackedTarball_update_autoconf_configs,expat,conftools))
 
-# * external/expat/0001-Fix-compiler-warnings.patch was sent to upstream as
-#   <https://github.com/libexpat/libexpat/pull/819> "Fix compiler warnings":
 $(eval $(call gb_UnpackedTarball_add_patches,expat,\
-       external/expat/0001-Fix-compiler-warnings.patch \
        external/expat/expat-winapi.patch \
 ))
 
commit 062b732af3cf8619838f34a3f46da7d06d7b9730
Author:     Michael Stahl <[email protected]>
AuthorDate: Fri Mar 22 14:27:01 2024 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:18 2024 +0100

    tdf#157241 sw: assert when importing ToX in table in rhbz589883-2.docx
    
    ndtbl.cxx:1417: SwNodes::TextToTable(): Assertion `!rNode.IsSectionNode()' 
failed.
    
    (regression from commit 62cb3b8b8d6106c6aeb073b12d84973a107182ef)
    
    Change-Id: Iec12282573cb914d1924f4da4a28e26e01b866df
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165164
    Tested-by: Michael Stahl <[email protected]>
    Reviewed-by: Michael Stahl <[email protected]>
    (cherry picked from commit df6fdb0041f8bfd251a4b03030b8bc47f0614c36)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165173
    Tested-by: Jenkins
    Reviewed-by: Xisco Fauli <[email protected]>

diff --git a/sw/source/core/docnode/ndtbl.cxx b/sw/source/core/docnode/ndtbl.cxx
index d052ed7eda4b..f3b3a07d63b5 100644
--- a/sw/source/core/docnode/ndtbl.cxx
+++ b/sw/source/core/docnode/ndtbl.cxx
@@ -1413,16 +1413,19 @@ SwTableNode* SwNodes::TextToTable( const 
SwNodes::TableRanges_t & rTableNodes,
     // delete frames of all contained content nodes
     for( nLines = 0; aNodeIndex <= rTableNodes.rbegin()->rbegin()->aEnd; 
++aNodeIndex,++nLines )
     {
-        SwNode& rNode = aNodeIndex.GetNode();
-        assert(!rNode.IsSectionNode()); // not possible in writerfilter import
-        if (rNode.IsTableNode())
+        SwNode* pNode(&aNodeIndex.GetNode());
+        while (pNode->IsSectionNode()) // could be ToX field in table
         {
-            lcl_RemoveBreaksTable(static_cast<SwTableNode&>(rNode),
+            pNode = pNode->GetNodes()[pNode->GetIndex()+1];
+        }
+        if (pNode->IsTableNode())
+        {
+            lcl_RemoveBreaksTable(static_cast<SwTableNode&>(*pNode),
                     (0 == nLines) ? pTableFormat : nullptr);
         }
-        else if (rNode.IsContentNode())
+        else if (pNode->IsContentNode())
         {
-            lcl_RemoveBreaks(static_cast<SwContentNode&>(rNode),
+            lcl_RemoveBreaks(static_cast<SwContentNode&>(*pNode),
                     (0 == nLines) ? pTableFormat : nullptr);
         }
     }
commit 91c2b51a7c728d8f287eba2927216689f07c29f0
Author:     Mike Kaganski <[email protected]>
AuthorDate: Thu Mar 21 22:46:26 2024 +0500
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:18 2024 +0100

    tdf#160306: make sure that SvNumberFormatter agrees with ROUND output
    
    After commit 9eb9083ff2fdaeb96399a0830a4394de4e29ef64 (Use Dragonbox
    to implement doubleTo*String*, 2022-02-18), the rounding that is used
    in SvNumberFormatter became strictly more correct; however, it now
    differed from what ROUND spreadsheet function returned, because the
    latter uses rtl_math_round, which calls rtl::math::approxFloor.
    
    To make the visual number representation consistent, this change uses
    rtl_math_round in SvNumberformat::ImpGetNumberOutput.
    
    Change-Id: I05b0bed7d3a6c73584a77adbae2835c95be249fa
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165142
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <[email protected]>
    (cherry picked from commit 805dd6bee49164d9a77de4ea9e0d53b416daca7a)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165124
    Reviewed-by: Xisco Fauli <[email protected]>

diff --git a/svl/qa/unit/svl.cxx b/svl/qa/unit/svl.cxx
index 4fa56f4bccd4..969dfa166bae 100644
--- a/svl/qa/unit/svl.cxx
+++ b/svl/qa/unit/svl.cxx
@@ -1993,6 +1993,26 @@ CPPUNIT_TEST_FIXTURE(Test, testLanguageNone)
     CPPUNIT_ASSERT_EQUAL(OUString("dd.mm.yyyy"), 
pFormat->GetMappedFormatstring(keywords, ldw));
 }
 
+CPPUNIT_TEST_FIXTURE(Test, testTdf160306)
+{
+    // Check some cases, where the output of ROUND and of number formatter 
differed
+    SvNumberFormatter aFormatter(m_xContext, LANGUAGE_ENGLISH_US);
+    sal_uInt32 format = aFormatter.GetEntryKey(u"0.00", LANGUAGE_ENGLISH_US);
+    CPPUNIT_ASSERT(format != NUMBERFORMAT_ENTRY_NOT_FOUND);
+    OUString output;
+    const Color* color;
+    aFormatter.GetOutputString(2697.0649999999996, format, output, &color);
+    // Without the fix in place, this would fail with
+    // - Expected: 2697.07
+    // - Actual  : 2697.06
+    CPPUNIT_ASSERT_EQUAL(u"2697.07"_ustr, output);
+    aFormatter.GetOutputString(57.374999999999993, format, output, &color);
+    // Without the fix in place, this would fail with
+    // - Expected: 57.38
+    // - Actual  : 57.37
+    CPPUNIT_ASSERT_EQUAL(u"57.38"_ustr, output);
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(Test);
 
 }
diff --git a/svl/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx
index b5c8757ef2e6..313a59827947 100644
--- a/svl/source/numbers/zformat.cxx
+++ b/svl/source/numbers/zformat.cxx
@@ -4407,6 +4407,8 @@ bool SvNumberformat::ImpGetNumberOutput(double fNumber,
         {
             nPrecExp = 0;
         }
+        // Make sure that Calc's ROUND and formatted output agree
+        fNumber = rtl_math_round(fNumber, rInfo.nCntPost, 
rtl_math_RoundingMode_Corrected);
         if (rInfo.nCntPost) // Decimal places
         {
             if ((rInfo.nCntPost + nPrecExp) > 15 && nPrecExp < 15)
commit ade399fa2f96c76843e676bc3664357b02893f89
Author:     Jean-Pierre Ledure <[email protected]>
AuthorDate: Thu Mar 21 15:54:55 2024 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:18 2024 +0100

    ScriptForge (session).RunApplication() crash fix tdf#160222
    
    Use
     com.sun.star.system.SystemShellExecuteFlags.DEFAULTS
    i.o.
     com.sun.star.system.SystemShellExecuteFlags.URIS_ONLY
    
    as argument of
     com.sun.star.system.SystemShellExecute.execute()
    
    Change-Id: I3919777cf9442387aec6ed694a2883519e4a7910
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165105
    Reviewed-by: Jean-Pierre Ledure <[email protected]>
    Tested-by: Jenkins
    (cherry picked from commit ec2d0fceedec8aa775940d496eb86c40f958a10c)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165127

diff --git a/wizards/source/scriptforge/SF_Session.xba 
b/wizards/source/scriptforge/SF_Session.xba
index aeca1133e346..307fb7a8f4bf 100644
--- a/wizards/source/scriptforge/SF_Session.xba
+++ b/wizards/source/scriptforge/SF_Session.xba
@@ -587,7 +587,7 @@ Check:
 Try:
        Set oShell = SF_Utils._GetUNOService(&quot;SystemShellExecute&quot;)
        sCommand = SF_FileSystem._ConvertToUrl(Command)
-       oShell.execute(sCommand, Parameters, 
com.sun.star.system.SystemShellExecuteFlags.URIS_ONLY)
+       oShell.execute(sCommand, Parameters, 
com.sun.star.system.SystemShellExecuteFlags.DEFAULTS)
        bReturn = True
 
 Finally:
commit 767bd70746e2c5149b18766df97acfc56ab4d978
Author:     Michael Stahl <[email protected]>
AuthorDate: Thu Mar 21 18:47:03 2024 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:18 2024 +0100

    configmgr: fix parse error if subelements of <info> used
    
    The unused but valid child elements of <info> such as <author> may be
    used by exentions. This fails with:
    
      warn:configmgr:15104:10916:configmgr/source/components.cxx:660: error 
reading 
"file:///instdir/program/../share/uno_packages/cache/uno_packages/....xcs" 
com.sun.star.uno.RuntimeException message: "bad member <component> in ....xcs 
at configmgr/source/xcsparser.cxx:289"
    
    Because ending the first such element sets bIsParsingInfo_ to false.
    
    This fix just concatenates all the characters in all the children,
    should work well enough for extensions.
    
    (regression from commit db3078bd8c8e3ce3a99fc3987bb6e93b609990c1)
    
    Change-Id: I17a3fb7014cd34c1d546701036550085365432a4
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165143
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <[email protected]>
    (cherry picked from commit 8350404ec1c02df8b4f6b4f48947ddbff53d91e5)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165126
    Reviewed-by: Stephan Bergmann <[email protected]>

diff --git a/configmgr/source/xcsparser.cxx b/configmgr/source/xcsparser.cxx
index e70ddac6a6c9..35f61fa1959e 100644
--- a/configmgr/source/xcsparser.cxx
+++ b/configmgr/source/xcsparser.cxx
@@ -129,7 +129,9 @@ bool XcsParser::startElement(
     // illegal content):
     if (ignoring_ > 0
         || (nsId == xmlreader::XmlReader::NAMESPACE_NONE
-            && (name == "import" || name == "uses" || name == "constraints" || 
name == "desc")))
+            && (name == "import" || name == "uses" || name == "constraints" || 
name == "desc"
+                // the following are unused by LO but valid
+                || name == "deprecated" || name == "author" || name == 
"label")))
     {
         assert(ignoring_ < LONG_MAX);
         ++ignoring_;
commit d199240e85a1e0f836757d1da061acdfadbb9493
Author:     Oliver Specht <[email protected]>
AuthorDate: Wed Mar 20 16:25:17 2024 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:18 2024 +0100

    Revert "tdf#159730 add compatibility option in RTF import"
    
    This reverts commit 3b04e74503ec6d07dc4befdb756e6abdc3de4e58.
    
    Reason for revert: The compatibility option is the wrong approach. This 
results in wrong line calculation as seen in tdf#159730#c6.
    The problem that really needs to be fixed is the 9pt attribute of the 
hidden line breaks in the first paragraph that are used to calculate the height 
of the first paragraph.
    Only the 1pt font attribute of the remaining visible space should define 
the line height.
    
    Change-Id: I6e0a1a499adaf2df9f68afbcfd6afcd6677e8f76
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165006
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <[email protected]>
    (cherry picked from commit 44e4ada23dfc8655ec7ddccfd027f02d22684d60)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165118
    Reviewed-by: Xisco Fauli <[email protected]>

diff --git a/writerfilter/source/dmapper/DomainMapper.cxx 
b/writerfilter/source/dmapper/DomainMapper.cxx
index 50f47439af27..2ee5d71d02a6 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -131,9 +131,6 @@ DomainMapper::DomainMapper( const uno::Reference< 
uno::XComponentContext >& xCon
         m_pImpl->SetDocumentSettingsProperty(
             getPropertyName(PROP_APPLY_PARAGRAPH_MARK_FORMAT_TO_NUMBERING),
             uno::Any(true));
-        m_pImpl->SetDocumentSettingsProperty(
-            getPropertyName(PROP_TABS_AND_BLANKS_FOR_LINE_CALCULATION),
-            uno::Any(true));
 
         // Don't load the default style definitions to avoid weird mix
         m_pImpl->SetDocumentSettingsProperty("StylesNoDefault", 
uno::Any(true));
diff --git a/writerfilter/source/dmapper/PropertyIds.cxx 
b/writerfilter/source/dmapper/PropertyIds.cxx
index 8a83ca0bb064..b8b4efc06222 100644
--- a/writerfilter/source/dmapper/PropertyIds.cxx
+++ b/writerfilter/source/dmapper/PropertyIds.cxx
@@ -384,7 +384,6 @@ namespace
         { PROP_PARA_CONNECT_BORDERS, u"ParaIsConnectBorder"},
         { PROP_DECORATIVE, u"Decorative"},
         { PROP_PAPER_TRAY, u"PrinterPaperTray"},
-        { PROP_TABS_AND_BLANKS_FOR_LINE_CALCULATION, 
u"IgnoreTabsAndBlanksForLineCalculation"},
     });
 } // end anonymous ns
 
diff --git a/writerfilter/source/dmapper/PropertyIds.hxx 
b/writerfilter/source/dmapper/PropertyIds.hxx
index bb2fb833516c..b39fcd24fa49 100644
--- a/writerfilter/source/dmapper/PropertyIds.hxx
+++ b/writerfilter/source/dmapper/PropertyIds.hxx
@@ -383,7 +383,6 @@ enum PropertyIds
         ,PROP_RTL_GUTTER
         ,PROP_CURSOR_NOT_IGNORE_TABLES_IN_HF
         ,PROP_PARA_CONNECT_BORDERS
-        ,PROP_TABS_AND_BLANKS_FOR_LINE_CALCULATION
     };
 
 //Returns the UNO string equivalent to eId.
commit 0e225a745bfe225a5645cbd61274ee51326bcb13
Author:     Mike Kaganski <[email protected]>
AuthorDate: Wed Mar 20 16:24:07 2024 +0500
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:18 2024 +0100

    tdf#160278: restore cursor bounds properly
    
    The passed string length is not a correct measure of how many steps
    should the selection expand in the resulting text: the cursor goes
    over glyphs, not over UTF-16 code units. Thus, it's easier to store
    the position prior to insertion, and restore it from the indexes.
    
    Change-Id: I1d592ff30199007ba3a99d7e1a6d2db2da35f1cb
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165056
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <[email protected]>
    Signed-off-by: Xisco Fauli <[email protected]>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165145

diff --git a/sw/qa/extras/unowriter/unowriter.cxx 
b/sw/qa/extras/unowriter/unowriter.cxx
index 8bcadbaf4227..80b9e556f73b 100644
--- a/sw/qa/extras/unowriter/unowriter.cxx
+++ b/sw/qa/extras/unowriter/unowriter.cxx
@@ -1201,6 +1201,27 @@ CPPUNIT_TEST_FIXTURE(SwUnoWriter, testTdf129841)
     CPPUNIT_ASSERT_EQUAL(aRefColor, aColor);
 }
 
+CPPUNIT_TEST_FIXTURE(SwUnoWriter, testTdf160278)
+{
+    createSwDoc();
+    auto xTextDocument(mxComponent.queryThrow<css::text::XTextDocument>());
+    auto xText(xTextDocument->getText());
+    xText->setString(u"123"_ustr);
+    CPPUNIT_ASSERT_EQUAL(u"123"_ustr, xText->getString());
+    auto xCursor = xText->createTextCursorByRange(xText->getEnd());
+    xCursor->goLeft(1, true);
+    CPPUNIT_ASSERT_EQUAL(u"3"_ustr, xCursor->getString());
+    // Insert an SMP character U+1f702 (so it's two UTF-16 code units, 0xd83d 
0xdf02):
+    xCursor->setString(u"🜂"_ustr);
+    // Without the fix, the replacement would expand the cursor one too many 
characters to the left,
+    // and the cursor text would become "2🜂", failing the next test:
+    CPPUNIT_ASSERT_EQUAL(u"🜂"_ustr, xCursor->getString());
+    xCursor->setString(u"test"_ustr);
+    CPPUNIT_ASSERT_EQUAL(u"test"_ustr, xCursor->getString());
+    // This test would fail, too; the text would be "1test":
+    CPPUNIT_ASSERT_EQUAL(u"12test"_ustr, xText->getString());
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/unocore/unoobj.cxx 
b/sw/source/core/unocore/unoobj.cxx
index 49562c1d0284..df02c4773a15 100644
--- a/sw/source/core/unocore/unoobj.cxx
+++ b/sw/source/core/unocore/unoobj.cxx
@@ -752,13 +752,19 @@ void SwXTextCursor::DeleteAndInsert(std::u16string_view 
aText,
         }
         if(nTextLen)
         {
+            // Store node and content indexes prior to insertion: to select 
the inserted text,
+            // we need to account for possible surrogate pairs, combining 
characters, etc.; it
+            // is easier to just restore the correct position from the indexes.
+            const auto start = pCurrent->Start();
+            const auto nodeIndex = start->GetNodeIndex();
+            const auto contentIndex = start->GetContentIndex();
             const bool bSuccess(
                 SwUnoCursorHelper::DocInsertStringSplitCR(
-                    rDoc, *pCurrent, aText, bool(eMode & 
::sw::DeleteAndInsertMode::ForceExpandHints)));
+                    rDoc, SwPaM(*start, pCurrent), aText, bool(eMode & 
::sw::DeleteAndInsertMode::ForceExpandHints)));
             OSL_ENSURE( bSuccess, "Doc->Insert(Str) failed." );
 
-            SwUnoCursorHelper::SelectPam(*pUnoCursor, true);
-            pCurrent->Left(aText.size());
+            pCurrent->SetMark();
+            pCurrent->GetPoint()->Assign(nodeIndex, contentIndex);
         }
         pCurrent = pCurrent->GetNext();
     } while (pCurrent != pUnoCursor);
commit c253cf4b44615170144a25d18df4b059cb43f4a3
Author:     Patrick Luby <[email protected]>
AuthorDate: Sun Mar 17 19:04:21 2024 -0400
Commit:     Andras Timar <[email protected]>
CommitDate: Wed Mar 27 14:33:18 2024 +0100

    tdf#93352 Fix horizontal swiping and scrolling when using an RTL UI
    
    Starting with commit bfa21ce5fa08f2c634ccb6162914be55aef9f3c2,
    horizontal swiping in Calc moved in the wrong direction scrollbars
    were drawn mirrored.
    
    So, revert parts of commit bfa21ce5fa08f2c634ccb6162914be55aef9f3c2
    so that we are using Calc's previous "negative scrollbar range"
    implementation for RTL UIs, but only for horizontal scrollbars since
    vertical scrollbars are the same in LTR and RTL UIs.
    
    Also, always disable RTL for scrollbars. Enabling RTL causes the
    following bugs when clicking or dragging the mouse in scrollbars in
    Calc's RTL UI:
    - Click or drag events get mirrored so you must click or drag in
      unexpected locations to move the scrollbar thumb in the desired
      direction
    - Repeatedly dragging the scrollbar thumb leftward can only move
      no highter than the R, S, or T columns
    
    Note: even though RTL is always disabled for Calc scrollbars, the arrows
    must still be swapped in vcl's ScrollBar class.
    
    Change-Id: I85aac94ffaf7df2eeb251a3ff150cc0363b5d770
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164959
    Reviewed-by: Stéphane Guillou <[email protected]>
    Tested-by: Jenkins
    Reviewed-by: Patrick Luby <[email protected]>
    (cherry picked from commit ac1024765d203496bc7d28cb3ed3a6d2215c53ad)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165116
    Reviewed-by: Adolfo Jayme Barrientos <[email protected]>

diff --git a/include/svtools/scrolladaptor.hxx 
b/include/svtools/scrolladaptor.hxx
index cdc507078cf8..1eba1dfdf844 100644
--- a/include/svtools/scrolladaptor.hxx
+++ b/include/svtools/scrolladaptor.hxx
@@ -71,6 +71,8 @@ public:
 
     void SetThickness(int nThickness);
 
+    void SetSwapArrows(bool bSwap = true);
+
     ScrollAdaptor(vcl::Window* pParent, bool bHori);
     virtual void dispose() override;
 };
diff --git a/include/vcl/toolkit/scrbar.hxx b/include/vcl/toolkit/scrbar.hxx
index 6981b64fa622..363755fc4168 100644
--- a/include/vcl/toolkit/scrbar.hxx
+++ b/include/vcl/toolkit/scrbar.hxx
@@ -57,6 +57,7 @@ private:
     ScrollType      meScrollType;
     bool            mbCalcSize;
     bool            mbFullDrag;
+    bool            mbSwapArrows;
     Link<ScrollBar*,void>       maScrollHdl;
     Link<ScrollBar*,void>       maEndScrollHdl;
 
@@ -132,6 +133,8 @@ public:
     void            SetEndScrollHdl( const Link<ScrollBar*,void>& rLink ) { 
maEndScrollHdl = rLink; }
 
     virtual Size    GetOptimalSize() const override;
+
+    void            SetSwapArrows( bool bSwap ) { mbSwapArrows = bSwap; }
 };
 
 
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index 2d8c4db085d6..fc585bdb1071 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -2576,6 +2576,7 @@ public:
 
     virtual int get_scroll_thickness() const = 0;
     virtual void set_scroll_thickness(int nThickness) = 0;
+    virtual void set_scroll_swap_arrows(bool bSwap) = 0;
 
     virtual ScrollType get_scroll_type() const = 0;
 
diff --git a/sc/source/ui/inc/tabview.hxx b/sc/source/ui/inc/tabview.hxx
index 2bf71e00eea1..1873a525e9dd 100644
--- a/sc/source/ui/inc/tabview.hxx
+++ b/sc/source/ui/inc/tabview.hxx
@@ -242,7 +242,7 @@ private:
     void            UpdateVarZoom();
 
     static void     SetScrollBar( ScrollAdaptor& rScroll, tools::Long 
nRangeMax, tools::Long nVisible, tools::Long nPos, bool bLayoutRTL );
-    static tools::Long     GetScrollBarPos( const ScrollAdaptor& rScroll );
+    static tools::Long     GetScrollBarPos( const ScrollAdaptor& rScroll, bool 
bLayoutRTL );
 
     void            GetAreaMoveEndPosition(SCCOL nMovX, SCROW nMovY, 
ScFollowMode eMode,
                                            SCCOL& rAreaX, SCROW& rAreaY, 
ScFollowMode& rMode,
diff --git a/sc/source/ui/view/tabview.cxx b/sc/source/ui/view/tabview.cxx
index 6c6f174278bf..75bdd7ed5042 100644
--- a/sc/source/ui/view/tabview.cxx
+++ b/sc/source/ui/view/tabview.cxx
@@ -1097,7 +1097,7 @@ void ScTabView::ScrollHdl(ScrollAdaptor* pScroll)
         nViewPos = aViewData.GetPosY( (pScroll == aVScrollTop.get()) ?
                                         SC_SPLIT_TOP : SC_SPLIT_BOTTOM );
 
-    bool bLayoutRTL = aViewData.GetDocument().IsLayoutRTL( 
aViewData.GetTabNo() );
+    bool bLayoutRTL = bHoriz && aViewData.GetDocument().IsLayoutRTL( 
aViewData.GetTabNo() );
 
     ScrollType eType = pScroll->GetScrollType();
     if ( eType == ScrollType::Drag )
@@ -1135,7 +1135,7 @@ void ScTabView::ScrollHdl(ScrollAdaptor* pScroll)
                 nScrollMin = aViewData.GetFixPosX();
             if ( aViewData.GetVSplitMode()==SC_SPLIT_FIX && pScroll == 
aVScrollBottom.get() )
                 nScrollMin = aViewData.GetFixPosY();
-            tools::Long nScrollPos = GetScrollBarPos( *pScroll ) + nScrollMin;
+            tools::Long nScrollPos = GetScrollBarPos( *pScroll, bLayoutRTL ) + 
nScrollMin;
 
             OUString aHelpStr;
             tools::Rectangle aRect;
@@ -1168,6 +1168,22 @@ void ScTabView::ScrollHdl(ScrollAdaptor* pScroll)
     else
         bDragging = false;
 
+    if ( bHoriz && bLayoutRTL )
+    {
+        // change scroll type so visible/previous cells calculation below 
remains the same
+        switch ( eType )
+        {
+            case ScrollType::LineUp:   eType = ScrollType::LineDown; break;
+            case ScrollType::LineDown: eType = ScrollType::LineUp;   break;
+            case ScrollType::PageUp:   eType = ScrollType::PageDown; break;
+            case ScrollType::PageDown: eType = ScrollType::PageUp;   break;
+            default:
+            {
+                // added to avoid warnings
+            }
+        }
+    }
+
     tools::Long nDelta(0);
     switch ( eType )
     {
@@ -1200,7 +1216,7 @@ void ScTabView::ScrollHdl(ScrollAdaptor* pScroll)
                 if ( aViewData.GetVSplitMode()==SC_SPLIT_FIX && pScroll == 
aVScrollBottom.get() )
                     nScrollMin = aViewData.GetFixPosY();
 
-                tools::Long nScrollPos = GetScrollBarPos( *pScroll ) + 
nScrollMin;
+                tools::Long nScrollPos = GetScrollBarPos( *pScroll, bLayoutRTL 
) + nScrollMin;
                 nDelta = nScrollPos - nViewPos;
 
                 // tdf#152406 Disable anti-jitter code for scroll wheel events
diff --git a/sc/source/ui/view/tabview4.cxx b/sc/source/ui/view/tabview4.cxx
index a7de6bdf67d2..5c19b6cf0794 100644
--- a/sc/source/ui/view/tabview4.cxx
+++ b/sc/source/ui/view/tabview4.cxx
@@ -352,16 +352,45 @@ void ScTabView::SetScrollBar( ScrollAdaptor& rScroll, 
tools::Long nRangeMax, too
     if ( nVisible == 0 )
         nVisible = 1;       // #i59893# don't use visible size 0
 
-    rScroll.SetRange( Range( 0, nRangeMax ) );
-    rScroll.SetVisibleSize( nVisible );
-    rScroll.SetThumbPos( nPos );
+    //  RTL layout uses a negative range to simulate a mirrored scroll bar.
+    //  SetScrollBar/GetScrollBarPos hide this so outside of these functions 
normal cell
+    //  addresses can be used.
+    if ( bLayoutRTL )
+    {
+        rScroll.SetRange( Range( -nRangeMax, 0 ) );
+        rScroll.SetVisibleSize( nVisible );
+        rScroll.SetThumbPos( -nPos - nVisible );
+    }
+    else
+    {
+        rScroll.SetRange( Range( 0, nRangeMax ) );
+        rScroll.SetVisibleSize( nVisible );
+        rScroll.SetThumbPos( nPos );
+    }
 
-    rScroll.EnableRTL( bLayoutRTL );
+    // Related: tdf#93352 always disable RTL for scrollbars
+    // Enabling RTL causes the following bugs when clicking or
+    // dragging the mouse in scrollbars in Calc's RTL UI:
+    // - Click or drag events get mirrored so you must click or
+    //   drag in unexpected locations to move the scrollbar thumb
+    //   in the desired direction
+    // - Repeatedly dragging the scrollbar thumb leftward can only
+    //   move no highter than the R, S, or T columns
+    rScroll.EnableRTL( false );
+
+    // Related: tdf#93352 swap arrows if layout is RTL
+    // We cannot use EnableRTL(true) to signal that the arrows
+    // should be swapped (see comment above) so explicitly enable
+    // or disable arrow swapping.
+    rScroll.SetSwapArrows( bLayoutRTL );
 }
 
-tools::Long ScTabView::GetScrollBarPos( const ScrollAdaptor& rScroll )
+tools::Long ScTabView::GetScrollBarPos( const ScrollAdaptor& rScroll, bool 
bLayoutRTL )
 {
-    return rScroll.GetThumbPos();
+    if ( bLayoutRTL )
+        return -rScroll.GetThumbPos() - rScroll.GetVisibleSize();
+    else
+        return rScroll.GetThumbPos();
 }
 
 //  UpdateScrollBars - set visible area and scroll width of scroll bars
@@ -425,7 +454,7 @@ void ScTabView::UpdateScrollBars( HeaderType eHeaderType )
 
     nVisYB = aViewData.VisibleCellsY( SC_SPLIT_BOTTOM );
     tools::Long nMaxYB = lcl_GetScrollRange( nUsedY, 
aViewData.GetPosY(SC_SPLIT_BOTTOM), nVisYB, rDoc.MaxRow(), nStartY );
-    SetScrollBar( *aVScrollBottom, nMaxYB, nVisYB, aViewData.GetPosY( 
SC_SPLIT_BOTTOM ) - nStartY, bLayoutRTL );
+    SetScrollBar( *aVScrollBottom, nMaxYB, nVisYB, aViewData.GetPosY( 
SC_SPLIT_BOTTOM ) - nStartY, false );
 
     if (bRight)
     {
@@ -438,7 +467,7 @@ void ScTabView::UpdateScrollBars( HeaderType eHeaderType )
     {
         nVisYT = aViewData.VisibleCellsY( SC_SPLIT_TOP );
         tools::Long nMaxYT = lcl_GetScrollRange( nUsedY, 
aViewData.GetPosY(SC_SPLIT_TOP), nVisYT, rDoc.MaxRow(), 0 );
-        SetScrollBar( *aVScrollTop, nMaxYT, nVisYT, aViewData.GetPosY( 
SC_SPLIT_TOP ), bLayoutRTL );
+        SetScrollBar( *aVScrollTop, nMaxYT, nVisYT, aViewData.GetPosY( 
SC_SPLIT_TOP ), false );
     }
 
     //      test the range
diff --git a/svtools/source/control/scrolladaptor.cxx 
b/svtools/source/control/scrolladaptor.cxx
index 6d01e9d414d7..8c2725c1715d 100644
--- a/svtools/source/control/scrolladaptor.cxx
+++ b/svtools/source/control/scrolladaptor.cxx
@@ -122,4 +122,6 @@ tools::Long ScrollAdaptor::DoScroll(tools::Long nNewPos)
 
 void ScrollAdaptor::SetThickness(int nThickness) { 
m_xScrollBar->set_scroll_thickness(nThickness); }
 
+void ScrollAdaptor::SetSwapArrows(bool bSwap) { 
m_xScrollBar->set_scroll_swap_arrows(bSwap); }
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 9ed790a2b6ec..46dbcd72f9d3 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -2591,6 +2591,8 @@ public:
         else
             m_xScrollBar->set_width_request(nThickness);
     }
+
+    virtual void set_scroll_swap_arrows(bool bSwap) override { 
m_xScrollBar->SetSwapArrows(bSwap); }
 };
 }
 
diff --git a/vcl/source/control/scrbar.cxx b/vcl/source/control/scrbar.cxx
index b652360139c4..7218b1485bbb 100644
--- a/vcl/source/control/scrbar.cxx
+++ b/vcl/source/control/scrbar.cxx
@@ -85,6 +85,7 @@ void ScrollBar::ImplInit( vcl::Window* pParent, WinBits 
nStyle )
     meScrollType        = ScrollType::DontKnow;
     mbCalcSize          = true;
     mbFullDrag          = false;
+    mbSwapArrows        = false;
 
     ImplInitStyle( nStyle );
     Control::ImplInit( pParent, nStyle, nullptr );
@@ -240,6 +241,7 @@ void ScrollBar::ImplCalc( bool bUpdate )
 
         const tools::Rectangle aControlRegion( Point(0,0), aSize );
         tools::Rectangle aBtn1Region, aBtn2Region, aTrackRegion, 
aBoundingRegion;
+        const bool bSwapArrows = mbSwapArrows || IsRTLEnabled();
 
         // reset rectangles to empty *and* (0,0) position
         maThumbRect = tools::Rectangle();
@@ -248,9 +250,9 @@ void ScrollBar::ImplCalc( bool bUpdate )
 
         if ( GetStyle() & WB_HORZ )
         {
-            if ( GetNativeControlRegion( ControlType::Scrollbar, 
IsRTLEnabled()? ControlPart::ButtonRight: ControlPart::ButtonLeft,
+            if ( GetNativeControlRegion( ControlType::Scrollbar, bSwapArrows? 
ControlPart::ButtonRight: ControlPart::ButtonLeft,
                         aControlRegion, ControlState::NONE, 
ImplControlValue(), aBoundingRegion, aBtn1Region ) &&
-                 GetNativeControlRegion( ControlType::Scrollbar, 
IsRTLEnabled()? ControlPart::ButtonLeft: ControlPart::ButtonRight,
+                 GetNativeControlRegion( ControlType::Scrollbar, bSwapArrows? 
ControlPart::ButtonLeft: ControlPart::ButtonRight,
                         aControlRegion, ControlState::NONE, 
ImplControlValue(), aBoundingRegion, aBtn2Region ) )
             {
                 maBtn1Rect = aBtn1Region;
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index b8da4f7b7a27..036493239217 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
-e 
... etc. - the rest is truncated

Reply via email to