[Libreoffice-commits] core.git: Branch 'libreoffice-5-1' - vcl/inc vcl/unx

Caolán McNamara caolanm at redhat.com
Sun Mar 13 19:49:46 UTC 2016


 vcl/inc/unx/gtk/gtksalmenu.hxx |    2 -
 vcl/unx/gtk/gtksalmenu.cxx     |   42 ++++++++++++++++++++++++++++++++++-------
 2 files changed, 36 insertions(+), 8 deletions(-)

New commits:
commit f9b729dba5d1dd9a87241284a67ee4dfc91bee2f
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Sat Mar 12 21:03:04 2016 +0000

    Resolves: tdf#92067 with duplicate menu entries track which to activate
    
    rather than just stick 2/3/4 at the end embed that this is a dup as the
    prefix and strip that off at dispatch time and pass the dup index around
    as a counter to how many dup candidates to dismiss to find the desired
    one.
    
    (cherry picked from commit e22618a355c0e506b8cfac9c52e9564db26949d2)
    
    Change-Id: I81d97090a7e9b8c2995a3b27934f3ee5636d05fe
    Reviewed-on: https://gerrit.libreoffice.org/23183
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Maxim Monastirsky <momonasmon at gmail.com>
    Tested-by: Maxim Monastirsky <momonasmon at gmail.com>

diff --git a/vcl/inc/unx/gtk/gtksalmenu.hxx b/vcl/inc/unx/gtk/gtksalmenu.hxx
index 5d9c262..011c3e4 100644
--- a/vcl/inc/unx/gtk/gtksalmenu.hxx
+++ b/vcl/inc/unx/gtk/gtksalmenu.hxx
@@ -51,7 +51,7 @@ private:
     GMenuModel*                     mpMenuModel;
     GActionGroup*                   mpActionGroup;
 
-    GtkSalMenu*                 GetMenuForItemCommand( gchar* aCommand, gboolean bGetSubmenu );
+    GtkSalMenu*                 GetMenuForItemCommand( gchar* aCommand, int& rDupsToSkip, gboolean bGetSubmenu );
     void                        ImplUpdate( gboolean bRecurse );
     void                        ActivateAllSubmenus(MenuBar* pMenuBar);
 
diff --git a/vcl/unx/gtk/gtksalmenu.cxx b/vcl/unx/gtk/gtksalmenu.cxx
index 6b977fe..b6295fa 100644
--- a/vcl/unx/gtk/gtksalmenu.cxx
+++ b/vcl/unx/gtk/gtksalmenu.cxx
@@ -57,14 +57,14 @@ static gchar* GetCommandForItem( GtkSalMenuItem* pSalMenuItem, gchar* aCurrentCo
         aCommand = g_strdup( aCommandStr );
 
         // Some items could have duplicated commands. A new one should be generated.
-        for ( sal_uInt16 i = 2; ; i++ )
+        for ( sal_uInt16 i = 1; ; i++ )
         {
             if ( !g_action_group_has_action( pActionGroup, aCommand )
                     || ( aCurrentCommand && g_strcmp0( aCurrentCommand, aCommand ) == 0 ) )
                 break;
 
             g_free( aCommand );
-            aCommand = g_strdup_printf("%s%d", aCommandStr, i);
+            aCommand = g_strdup_printf("dup:%d:%s", i, aCommandStr);
         }
 
         g_free( aCommandStr );
@@ -630,7 +630,7 @@ void GtkSalMenu::NativeSetItemCommand( unsigned nSection,
         g_variant_unref(pTarget);
 }
 
-GtkSalMenu* GtkSalMenu::GetMenuForItemCommand( gchar* aCommand, gboolean bGetSubmenu )
+GtkSalMenu* GtkSalMenu::GetMenuForItemCommand(gchar* aCommand, int& rDupsToSkip, gboolean bGetSubmenu)
 {
     SolarMutexGuard aGuard;
     GtkSalMenu* pMenu = nullptr;
@@ -645,7 +645,13 @@ GtkSalMenu* GtkSalMenu::GetMenuForItemCommand( gchar* aCommand, gboolean bGetSub
         OString aItemCommandOStr = OUStringToOString( aItemCommand, RTL_TEXTENCODING_UTF8 );
         gchar* aItemCommandStr = const_cast<gchar*>(aItemCommandOStr.getStr());
 
-        if ( g_strcmp0( aItemCommandStr, aCommand ) == 0 )
+        bool bFound = g_strcmp0( aItemCommandStr, aCommand ) == 0;
+        if (bFound && rDupsToSkip)
+        {
+            --rDupsToSkip;
+            bFound = false;
+        }
+        if (bFound)
         {
             pMenu = bGetSubmenu ? pSalItem->mpSubMenu : this;
             break;
@@ -653,7 +659,7 @@ GtkSalMenu* GtkSalMenu::GetMenuForItemCommand( gchar* aCommand, gboolean bGetSub
         else
         {
             if ( pSalItem->mpSubMenu != nullptr )
-                pMenu = pSalItem->mpSubMenu->GetMenuForItemCommand( aCommand, bGetSubmenu );
+                pMenu = pSalItem->mpSubMenu->GetMenuForItemCommand(aCommand, rDupsToSkip, bGetSubmenu);
 
             if ( pMenu != nullptr )
                break;
@@ -663,6 +669,24 @@ GtkSalMenu* GtkSalMenu::GetMenuForItemCommand( gchar* aCommand, gboolean bGetSub
     return pMenu;
 }
 
+namespace
+{
+    const gchar* DetermineDupIndex(const gchar *aCommand, int& rDupsToSkip)
+    {
+        if (g_str_has_prefix(aCommand, "dup:"))
+        {
+            aCommand = aCommand + strlen("dup:");
+            gchar *endptr;
+            rDupsToSkip = g_ascii_strtoll(aCommand, &endptr, 10);
+            aCommand = endptr+1;
+        }
+        else
+            rDupsToSkip = 0;
+
+        return aCommand;
+    }
+}
+
 void GtkSalMenu::DispatchCommand( gint itemId, const gchar *aCommand )
 {
     SolarMutexGuard aGuard;
@@ -670,7 +694,9 @@ void GtkSalMenu::DispatchCommand( gint itemId, const gchar *aCommand )
     if ( !mbMenuBar )
         return;
 
-    GtkSalMenu* pSalSubMenu = GetMenuForItemCommand( const_cast<gchar*>(aCommand), FALSE );
+    int nDupsToSkip;
+    aCommand = DetermineDupIndex(aCommand, nDupsToSkip);
+    GtkSalMenu* pSalSubMenu = GetMenuForItemCommand( const_cast<gchar*>(aCommand), nDupsToSkip, FALSE );
     Menu* pSubMenu = ( pSalSubMenu != nullptr ) ? pSalSubMenu->GetMenu() : nullptr;
 
     MenuBar* pMenuBar = static_cast< MenuBar* >( mpVCLMenu );
@@ -703,7 +729,9 @@ void GtkSalMenu::Deactivate( const gchar* aMenuCommand )
     if ( !mbMenuBar )
         return;
 
-    GtkSalMenu* pSalSubMenu = GetMenuForItemCommand( const_cast<gchar*>(aMenuCommand), TRUE );
+    int nDupsToSkip;
+    aMenuCommand = DetermineDupIndex(aMenuCommand, nDupsToSkip);
+    GtkSalMenu* pSalSubMenu = GetMenuForItemCommand( const_cast<gchar*>(aMenuCommand), nDupsToSkip, TRUE );
 
     if ( pSalSubMenu != nullptr ) {
         MenuBar* pMenuBar = static_cast< MenuBar* >( mpVCLMenu );


More information about the Libreoffice-commits mailing list